Rust Docs MCP Server

Rust Docs MCP Server

🦀 防止 AI 助手提供过时的 Rust 代码建议。这个 MCP 服务器获取最新的 crate 文档,使用嵌入/LLM,并通过工具调用提供准确的上下文。

Govcraft

开发者工具
访问服务器

README

Rust Docs MCP 服务器

License: MIT

喜欢这个项目吗?请在 GitHub 上 给仓库点个 Star 以示支持并保持更新!

动机

现代 AI 驱动的编码助手(如 Cursor、Cline、Roo Code 等)擅长理解代码结构和语法,但通常难以掌握快速发展的库和框架的具体细节,尤其是在像 Rust 这样的生态系统中,crate 会频繁更新。它们的训练数据截止日期意味着它们可能缺乏对最新 API 的了解,从而导致不正确或过时的代码建议。

这个 MCP 服务器通过为特定的 Rust crate 提供一个集中的、最新的知识来源来解决这个问题。通过为 crate(例如 serdetokioreqwest)运行此服务器的实例,您可以为您的 LLM 编码助手提供一个工具 (query_rust_docs),它可以在编写与该 crate 相关的代码_之前_使用。

当指示使用此工具时,LLM 可以提出关于 crate 的 API 或用法的具体问题,并接收直接从_当前_文档中获得的答案。这显著提高了生成代码的准确性和相关性,减少了手动更正的需要,并加快了开发速度。

可以并发运行此服务器的多个实例,允许 LLM 助手在编码会话期间访问多个不同 crate 的文档。

此服务器获取指定 Rust crate 的文档,为内容生成嵌入,并提供一个 MCP 工具来根据文档上下文回答有关 crate 的问题。

特性

  • 目标文档: 每个服务器实例专注于单个 Rust crate。
  • 特性支持: 允许指定生成文档所需的 crate 特性。
  • 语义搜索: 使用 OpenAI 的 text-embedding-3-small 模型来查找给定问题的最相关的文档部分。
  • LLM 摘要: 利用 OpenAI 的 gpt-4o-mini-2024-07-18 模型,_仅_基于检索到的文档上下文生成简洁的答案。
  • 缓存: 基于 crate、版本和请求的特性,将生成的文档内容和嵌入缓存在用户的 XDG 数据目录(~/.local/share/rustdocs-mcp-server/ 或类似位置)中,以加快后续启动速度。
  • MCP 集成: 作为标准 MCP 服务器通过 stdio 运行,公开工具和资源。

前提条件

  • OpenAI API 密钥: 生成嵌入和总结答案需要此密钥。服务器期望此密钥在 OPENAI_API_KEY 环境变量中可用。(服务器还需要网络访问权限才能下载 crate 依赖项并与 OpenAI API 交互)。

安装

推荐的安装方式是从 GitHub Releases 页面 下载适用于您操作系统的预编译二进制文件。

  1. 转到 Releases 页面
  2. 下载适用于您系统的适当存档(Windows 为 .zip,Linux/macOS 为 .tar.gz)。
  3. 解压 rustdocs_mcp_server(或 rustdocs_mcp_server.exe)二进制文件。
  4. 将二进制文件放置在系统 PATH 环境变量中包含的目录中(例如,/usr/local/bin~/bin)。

从源代码构建(替代方法)

如果您更喜欢从源代码构建,则需要安装 Rust 工具链

  1. 克隆仓库:
    git clone https://github.com/Govcraft/rust-docs-mcp-server.git
    cd rust-docs-mcp-server
    
  2. 构建服务器:
    cargo build --release
    

用法

新 Crates 的重要提示:

首次将服务器与 crate 一起使用(或使用新的版本/特性集)时,它需要下载文档并生成嵌入。此过程可能需要一些时间,特别是对于具有大量文档的 crate,并且需要有效的互联网连接和 OpenAI API 密钥。

建议在将任何新的 crate 配置添加到您的 AI 编码助手(如 Roo Code、Cursor 等)之前,先从命令行直接运行一次服务器。这允许完成初始嵌入生成和缓存。一旦您看到服务器启动消息指示它已准备好(例如,“MCP Server listening on stdio”),您可以关闭它(Ctrl+C)。后续启动,包括由您的编码助手启动的启动,将使用缓存的数据并启动得更快。

运行服务器

服务器从命令行启动,并且需要目标 crate 的 Package ID Specification。此规范遵循 Cargo 使用的格式(例如,crate_namecrate_name@version_req)。有关完整的规范详细信息,请参阅 man cargo-pkgidCargo 文档

可选地,您可以使用 -F--features 标志指定所需的 crate 特性,后跟一个逗号分隔的特性列表。对于需要启用特定特性才能使 cargo doc 成功的 crate 来说,这是必要的(例如,需要运行时特性的 crate,如 async-stripe)。

# 设置 API 密钥(替换为您实际的密钥)
export OPENAI_API_KEY="sk-..."

# 示例:为 serde 的最新 1.x 版本运行服务器
rustdocs_mcp_server "serde@^1.0"

# 示例:为 reqwest 的特定版本运行服务器
rustdocs_mcp_server "reqwest@0.12.0"

# 示例:为 tokio 的最新版本运行服务器
rustdocs_mcp_server tokio

# 示例:为 async-stripe 运行服务器,启用所需的运行时特性
rustdocs_mcp_server "async-stripe@0.40" -F runtime-tokio-hyper-rustls

# 示例:为另一个具有多个特性的 crate 运行服务器
rustdocs_mcp_server "some-crate@1.2" --features feat1,feat2

对于特定 crate 版本_和特性集_的首次运行,服务器将:

  1. 使用 cargo doc(使用指定的特性)下载 crate 文档。
  2. 解析 HTML 文档。
  3. 使用 OpenAI API 为文档内容生成嵌入(这可能需要一些时间并产生费用,但对于大多数 crate 来说,通常只有几美分;即使像 async-stripe 这样的大型 crate,拥有超过 5000 个文档页面,在测试期间生成嵌入的成本也只有 0.18 美元)。
  4. 缓存文档内容和嵌入,以便不再产生费用。
  5. 启动 MCP 服务器。

后续对同一 crate 版本_和特性集_的运行将从缓存加载数据,从而使启动速度更快。

MCP 交互

服务器使用 Model Context Protocol 通过标准输入/输出 (stdio) 进行通信。它公开以下内容:

  • 工具:query_rust_docs

    • 描述: 使用语义搜索和 LLM 摘要查询服务器启动时针对的特定 Rust crate 的文档。
    • 输入模式:
      {
        "type": "object",
        "properties": {
          "question": {
            "type": "string",
            "description": "关于 crate 的 API 或用法的具体问题。"
          }
        },
        "required": ["question"]
      }
      
    • 输出: 包含 LLM 基于相关文档上下文生成的答案的文本响应,前缀为 From <crate_name> docs:
    • 示例 MCP 调用:
      {
        "jsonrpc": "2.0",
        "method": "callTool",
        "params": {
          "tool_name": "query_rust_docs",
          "arguments": {
            "question": "如何使用 reqwest 发出简单的 GET 请求?"
          }
        },
        "id": 1
      }
      
  • 资源:crate://<crate_name>

    • 描述: 提供此服务器实例配置的 Rust crate 的名称。
    • URI: crate://<crate_name>(例如,crate://serdecrate://reqwest
    • 内容: 包含 crate 名称的纯文本。
  • 日志记录: 服务器通过 logging/message 通知将信息日志(启动消息、查询处理步骤)发送回 MCP 客户端。

示例客户端配置 (Roo Code)

您可以配置像 Roo Code 这样的 MCP 客户端来运行此服务器的多个实例,每个实例针对不同的 crate。以下是 Roo Code 的 mcp_settings.json 文件的示例片段,配置了 reqwestasync-stripe 的服务器(请注意为 async-stripe 添加的特性参数):

{
  "mcpServers": {
    "rust-docs-reqwest": {
      "command": "/path/to/your/rustdocs_mcp_server",
      "args": [
        "reqwest@0.12"
      ],
      "env": {
        "OPENAI_API_KEY": "YOUR_OPENAI_API_KEY_HERE"
      },
      "disabled": false,
      "alwaysAllow": []
    },
    "rust-docs-async-stripe": {
      "command": "rustdocs_mcp_server",
      "args": [
        "async-stripe@0.40",
        "-F",
        " runtime-tokio-hyper-rustls"
      ],
      "env": {
        "OPENAI_API_KEY": "YOUR_OPENAI_API_KEY_HERE"
      },
      "disabled": false,
      "alwaysAllow": []
    }
  }
}

注意:

  • 如果 /path/to/your/rustdocs_mcp_server 不在您的 PATH 中,请将其替换为系统上已编译二进制文件的实际路径。
  • YOUR_OPENAI_API_KEY_HERE 替换为您实际的 OpenAI API 密钥。
  • 键(rust-docs-reqwestrust-docs-async-stripe)是您选择的任意名称,用于标识 Roo Code 中的服务器实例。

示例客户端配置 (Claude Desktop)

对于 Claude Desktop 用户,您可以在 MCP 设置中配置服务器。以下是配置 serdeasync-stripe 服务器的示例:

{
  "mcpServers": {
    "rust-docs-serde": {
      "command": "/path/to/your/rustdocs_mcp_server",
      "args": [
        "serde@^1.0"
      ]
    },
    "rust-docs-async-stripe-rt": {
      "command": "rustdocs_mcp_server",
      "args": [
        "async-stripe@0.40",
        "-F",
        "runtime-tokio-hyper-rustls"
      ]
    }
  }
}

注意:

  • 确保 rustdocs_mcp_server 在您的系统 PATH 中,或者提供完整路径(例如,/path/to/your/rustdocs_mcp_server)。
  • 键(rust-docs-serderust-docs-async-stripe-rt)是您选择的任意名称,用于标识服务器实例。
  • 请记住设置 Claude Desktop 可以访问的 OPENAI_API_KEY 环境变量(这可能是系统范围的,或者通过您启动 Claude Desktop 的方式)。Claude Desktop 的 MCP 配置可能不支持像 Roo Code 那样为每个服务器直接设置环境变量。
  • 该示例展示了如何为像 async-stripe 这样需要特定特性的 crate 添加 -F 参数。

缓存

  • 位置: 缓存的文档和嵌入存储在 XDG 数据目录中,通常位于 ~/.local/share/rustdocs-mcp-server/<crate_name>/<sanitized_version_req>/<features_hash>/embeddings.bin 下。sanitized_version_req 派生自版本要求,features_hash 是表示启动时请求的特定特性组合的哈希值。这确保了不同的特性集被单独缓存。
  • 格式: 数据使用 bincode 序列化进行缓存。
  • 重新生成: 如果缓存文件丢失、损坏或无法解码,服务器将自动重新生成文档和嵌入。

工作原理

  1. 初始化: 使用 clap 从命令行解析 crate 规范和可选特性。
  2. 缓存检查: 查找特定 crate、版本要求和特性集的预先存在的缓存文件。
  3. 文档生成(如果缓存未命中):
    • 创建一个仅依赖于目标 crate 的临时 Rust 项目,并在其 Cargo.toml 中启用指定的特性。
    • 使用 cargo 库 API 运行 cargo doc,以在临时目录中生成 HTML 文档。
    • 通过搜索包含 index.html 的子目录,动态定位 target/doc 中的正确输出目录。
  4. 内容提取(如果缓存未命中):
    • 遍历位于已定位的文档目录中的生成的 HTML 文件。
    • 使用 scraper crate 解析每个 HTML 文件,并从主要内容区域(<section id="main-content">)提取文本内容。
  5. 嵌入生成(如果缓存未命中):
    • 使用 async-openai crate 和 tiktoken-rs 为每个提取的文档块生成嵌入,使用 text-embedding-3-small 模型。
    • 根据处理的 token 数量计算估计成本。
  6. 缓存(如果缓存未命中): 使用 bincode 将提取的文档内容及其相应的嵌入保存到缓存文件(路径包括特性哈希)。
  7. 服务器启动: 使用加载/生成的文档和嵌入初始化 RustDocsServer
  8. MCP 服务: 使用 rmcp 通过 stdio 启动 MCP 服务器。
  9. 查询处理(query_rust_docs 工具):
    • 为用户的问题生成嵌入。
    • 计算问题嵌入和所有缓存的文档嵌入之间的余弦相似度。
    • 识别具有最高相似度的文档块。
    • 通过 OpenAI API 将用户的问题和最佳匹配文档块的内容发送到 gpt-4o-mini-2024-07-18 模型。
    • 提示 LLM _仅_根据提供的上下文回答问题。
    • 将 LLM 的响应返回给 MCP 客户端。

许可证

本项目采用 MIT 许可证。

版权所有 (c) 2025 Govcraft

赞助

如果您觉得这个项目有帮助,请考虑赞助开发!

Sponsor on GitHub

推荐服务器

Playwright MCP Server

Playwright MCP Server

一个模型上下文协议服务器,它使大型语言模型能够通过结构化的可访问性快照与网页进行交互,而无需视觉模型或屏幕截图。

官方
精选
TypeScript
Magic Component Platform (MCP)

Magic Component Platform (MCP)

一个由人工智能驱动的工具,可以从自然语言描述生成现代化的用户界面组件,并与流行的集成开发环境(IDE)集成,从而简化用户界面开发流程。

官方
精选
本地
TypeScript
MCP Package Docs Server

MCP Package Docs Server

促进大型语言模型高效访问和获取 Go、Python 和 NPM 包的结构化文档,通过多语言支持和性能优化来增强软件开发。

精选
本地
TypeScript
Claude Code MCP

Claude Code MCP

一个实现了 Claude Code 作为模型上下文协议(Model Context Protocol, MCP)服务器的方案,它可以通过标准化的 MCP 接口来使用 Claude 的软件工程能力(代码生成、编辑、审查和文件操作)。

精选
本地
JavaScript
@kazuph/mcp-taskmanager

@kazuph/mcp-taskmanager

用于任务管理的模型上下文协议服务器。它允许 Claude Desktop(或任何 MCP 客户端)在基于队列的系统中管理和执行任务。

精选
本地
JavaScript
mermaid-mcp-server

mermaid-mcp-server

一个模型上下文协议 (MCP) 服务器,用于将 Mermaid 图表转换为 PNG 图像。

精选
JavaScript
Jira-Context-MCP

Jira-Context-MCP

MCP 服务器向 AI 编码助手(如 Cursor)提供 Jira 工单信息。

精选
TypeScript
Linear MCP Server

Linear MCP Server

一个模型上下文协议(Model Context Protocol)服务器,它与 Linear 的问题跟踪系统集成,允许大型语言模型(LLM)通过自然语言交互来创建、更新、搜索和评论 Linear 问题。

精选
JavaScript
Sequential Thinking MCP Server

Sequential Thinking MCP Server

这个服务器通过将复杂问题分解为顺序步骤来促进结构化的问题解决,支持修订,并通过完整的 MCP 集成来实现多条解决方案路径。

精选
Python
Curri MCP Server

Curri MCP Server

通过管理文本笔记、提供笔记创建工具以及使用结构化提示生成摘要,从而实现与 Curri API 的交互。

官方
本地
JavaScript