Rust文档MCP服务器

Rust文档MCP服务器是一个专注于为特定Rust库提供最新文档和语义搜索的工具,通过MCP协议与AI编码助手集成,提高代码生成的准确性和效率。

  • by Govcraft
  • Rust
  • 本地部署
  • 299 星标
  • 更新于
在 GitHub 查看 Govcraft/rust-docs-mcp-server

使用说明

Rust Docs MCP服务器

⭐ 像这个项目?请 将存储库星化 上 GitHub显示您的支持并保持更新! ⭐

动机

现代人工智能驱动的编码助手(如Cursor、Cline、Roo Code等)表现出色 理解代码结构和语法,但经常难以理解细节 快速发展的库和框架,特别是在Rust这样的生态系统中 板条箱经常更新。他们的训练数据中断意味着他们可能 缺乏对最新API的了解,导致代码不正确或过时 建议。

此MCP服务器通过提供集中、最新的 特定Rust机箱的知识源。通过运行此的实例 用于板条箱的服务器(例如。, serde, tokio, reqwest),你给你的LLM编码 辅助工具(query_rust_docs)它可以使用 之前 编写与以下内容相关的代码 那个箱子。

当被指示使用此工具时,LLM可以询问有关 板条箱的API或用法,并接收直接从 当前的 文档。这大大提高了 生成代码,减少手动更正的需要并加快速度 发展。

此服务器的多个实例可以同时运行,从而允许LLM 在编码过程中访问多个不同板条箱的文档的助手 会议。

此服务器获取指定Rust crate的文档,生成 嵌入内容,并提供MCP工具来回答以下问题 基于文档上下文的crate。

特性

  • 目标文档: 专注于每台服务器一个Rust机箱 例子
  • 功能支持: 允许指定所需的机箱功能 文档生成。
  • 语义搜索: 使用OpenAI text-embedding-3-small 模型来寻找 给定问题的最相关文档部分。
  • LLM总结: 利用OpenAI gpt-4o-mini-2024-07-18 模型到 基于生成简洁的答案 仅 在检索到的文档上下文中。
  • 缓存: 缓存生成的文档内容和嵌入 用户的XDG数据目录(~/.local/share/rustdocs-mcp-server/ 或类似) 基于板条箱、版本、, 和 请求的功能可加快后续 发射。
  • MCP集成: 作为标准MCP服务器在stdio上运行,公开工具 以及资源。

先决条件

  • OpenAI API密钥: 需要用于生成嵌入和总结答案。 服务器希望此密钥在 OPENAI_API_KEY 环境变量。(服务器还需要网络访问才能下载 板条箱依赖性并与OpenAI API交互)。

安装

建议的安装方式是下载预编译的二进制文件 操作系统从 GitHub发布页面.

  1. 去 发布页面.
  2. 下载相应的存档(.zip 对于Windows, .tar.gz 为了 Linux/macOS)。
  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
    

用法

新板条箱的重要注意事项:

当服务器首次与机箱一起使用(或与新版本/功能集一起使用)时,它需要下载文档并生成嵌入。这个过程可能需要一些时间,尤其是对于有大量文档的板条箱,并且需要活跃的互联网连接和OpenAI API密钥。

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

运行服务器

服务器从命令行启动,需要 包裹编号 规格说明 用于目标板条箱。本规范遵循所使用的格式 通过货物(例如。, crate_name, crate_name@version_req).对于完整 规格详细信息,请参见 man cargo-pkgid 或 货物文件.

您可以选择使用以下命令指定所需的机箱功能 -F 或 --features 标志,后面是逗号分隔的功能列表。这是 对于需要启用特定功能的板条箱来说是必要的 cargo doc 成功(例如,需要运行时功能的板条箱,如 async-stripe).

# Set the API key (replace with your actual key)
export OPENAI_API_KEY="sk-..."

# Example: Run server for the latest 1.x version of serde
rustdocs_mcp_server "serde@^1.0"

# Example: Run server for a specific version of reqwest
rustdocs_mcp_server "reqwest@0.12.0"

# Example: Run server for the latest version of tokio
rustdocs_mcp_server tokio

# Example: Run server for async-stripe, enabling a required runtime feature
rustdocs_mcp_server "async-stripe@0.40" -F runtime-tokio-hyper-rustls

# Example: Run server for another crate with multiple features
rustdocs_mcp_server "some-crate@1.2" --features feat1,feat2

在特定机箱版本的第一次运行中 和功能集,服务器 将:

  1. 使用下载crate文档 cargo doc (具有指定功能)。
  2. 解析HTML文档。
  3. 使用OpenAI API为文档内容生成嵌入(此 可能需要一些时间并产生成本,尽管通常只有美国的一小部分 大多数板条箱都是便士;即使是一个大箱子 async-stripe 超过5000 文档页面的嵌入生成成本仅为0.18美元 测试)。
  4. 缓存文档内容和嵌入,这样成本就不会增加 再次发生。
  5. 启动MCP服务器。

同一机箱版本的后续运行 和功能集 将加载数据 从缓存中提取数据,使启动速度更快。

MCP交互

服务器使用标准之上的模型上下文协议进行通信 输入/输出(stdio)。它揭示了以下内容:

  • 工具: query_rust_docs

    • 说明: 查询服务器上特定Rust机箱的文档 开始使用语义搜索和LLM摘要。
    • 输入架构:
      {
        "type": "object",
        "properties": {
          "question": {
            "type": "string",
            "description": "The specific question about the crate's API or usage."
          }
        },
        "required": ["question"]
      }
      
    • 输出: 包含基于LLM生成的答案的文本响应 在相关文档上下文中,前缀为 From <crate_name> docs:.
    • MCP呼叫示例:
      {
        "jsonrpc": "2.0",
        "method": "callTool",
        "params": {
          "tool_name": "query_rust_docs",
          "arguments": {
            "question": "How do I make a simple GET request with reqwest?"
          }
        },
        "id": 1
      }
      
  • 资源: crate://<crate_name>

    • 说明: 提供此服务器实例的Rust crate的名称 配置为。
    • URI: crate://<crate_name> (例如。, crate://serde, crate://reqwest)
    • 内容: 包含板条箱名称的纯文本。
  • 登录中: 服务器发送信息日志(启动消息、查询 处理步骤)通过以下方式返回MCP客户端 logging/message 通知。

客户端配置示例(Roo代码)

您可以配置MCP客户端,如Roo Code,以运行多个实例 服务器,每个都针对不同的机箱。以下是Roo的示例代码片段 代码 mcp_settings.json 文件,配置服务器 reqwest 和 async-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-reqwest, rust-docs-async-stripe)是任意名称 您可以选择在Roo Code中标识服务器实例。

客户端配置示例(Claude桌面)

对于Claude Desktop用户,您可以在MCP设置中配置服务器。 以下是一个配置服务器的示例 serde 和 async-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-serde, rust-docs-async-stripe-rt)是任意名称 您可以选择标识服务器实例。
  • 记得设置 OPENAI_API_KEY Claude Desktop所在的环境变量 可以访问它(这可能是系统范围内的,也可能是通过您启动Claude的方式 桌面)。Claude Desktop的MCP配置可能不直接支持 为每台服务器设置环境变量,如Roo Code。
  • 该示例显示了如何添加 -F 像这样的板条箱的论点 async-stripe 这需要特定的功能。

缓存

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

它是如何工作的

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

许可证

该项目根据MIT许可证获得许可。

版权所有(c)2025 Govcraft

赞助商

Govcraft是一个人的商店——没有企业支持,没有投资者,只有我在构建有用的工具。如果这个项目对你有帮助, 赞助 继续工作。