返回市场
锈文档MCP服务器

锈文档MCP服务器

作者:Govcraft217 星标更新:2025-06-23

项目介绍

Rust Docs MCP Server

License: MIT

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

动机

现代AI驱动的编码助手(如Cursor、Cline、Roo Code等)擅长理解代码结构和语法,但在处理快速演进的库和框架的具体细节时往往遇到困难,尤其是在像Rust这样的生态系统中,其中crates频繁更新。它们的训练数据截止日期意味着它们可能缺乏最新的API知识,导致生成的代码建议不正确或过时。

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

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

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

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

特点

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

预备条件

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

安装

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

  1. 前往发布页面
  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的重要注意事项:

首次使用服务器与某个crates(或新版本/特性集)时,它需要下载文档并生成嵌入。此过程可能耗时较长,特别是对于文档详尽的crates,并且需要活跃的互联网连接和OpenAI API密钥。

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

运行服务器

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

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

# 设置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

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

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

  1. 使用cargo doc(带指定特性)下载crates文档。
  2. 解析HTML文档。
  3. 使用OpenAI API为文档内容生成嵌入(这可能耗时较长并产生费用,但通常仅为几分美分;即使是包含超过5000页文档的大crates如async-stripe,在测试中生成嵌入的成本也仅为$0.18美元)。
  4. 缓存文档内容和嵌入,以便不再产生费用。
  5. 启动MCP服务器。

对于相同的crates版本和特性集的后续运行,将从缓存加载数据,使启动速度大大加快。

MCP交互

服务器通过模型上下文协议(Model Context Protocol)在标准输入输出(stdio)上进行通信。它公开以下内容:

  • 工具:query_rust_docs

    • 描述: 查询特定Rust crate的文档,使用语义搜索和LLM总结。
    • 输入模式:
      {
        "type": "object",
        "properties": {
          "question": {
            "type": "string",
            "description": "关于crates的API或用法的具体问题。"
          }
        },
        "required": ["question"]
      }
      
    • 输出: 由LLM基于相关文档上下文生成的回答文本,前缀为来自<crate_name>文档:
    • 示例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
    • 内容: 包含crates名称的纯文本。
  • 日志记录: 服务器通过logging/message通知将信息日志(启动消息、查询处理步骤)返回给MCP客户端。

示例客户端配置(Roo Code)

您可以配置MCP客户端如Roo Code以运行多个此服务器实例,每个实例针对不同的crates。以下是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)是您选择用于标识服务器实例的任意名称。
  • 记住要设置OPENAI_API_KEY环境变量,让Claude Desktop能够访问它(这可能是系统范围的,或者通过您启动Claude Desktop的方式)。Claude Desktop的MCP配置可能不像Roo Code那样直接支持按服务器设置环境变量。
  • 示例展示了如何为async-stripe等需要特定特性的crates添加-F参数。

缓存

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

工作原理

  1. 初始化: 使用clap从命令行解析crates规范和可选特性。
  2. 缓存检查: 查找特定crates、版本要求和特性集的预存缓存文件。
  3. 文档生成(如果缓存未命中):
    • 创建仅依赖于目标crates的临时Rust项目,在其Cargo.toml中启用指定特性。
    • 使用cargo库API在临时目录中生成HTML文档。
    • target/doc内动态定位正确的输出目录,通过查找包含index.html的子目录。
  4. 内容提取(如果缓存未命中):
    • 遍历位于定位文档目录内的生成HTML文件。
    • 使用scraper库解析每个HTML文件并从主要内容区域(<section id="main-content">)提取文本内容。
  5. 嵌入生成(如果缓存未命中):
    • 使用async-openai库和tiktoken-rs为每个提取的文档块使用text-embedding-3-small模型生成嵌入。
    • 根据处理的令牌数量计算估计成本。
  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

赞助

如果您发现这个项目有用,请考虑赞助开发!

GitHub 赞助