这是一个用于在 Internet Computer (IC) 区块链网络上开发 Model Context Protocol (MCP) 服务器的 Rust 开发工具包(SDK)。它帮助你构建可以部署为 IC Canister 的 MCP 服务器应用。

主要功能点

  • 构建 MCP 服务器: 提供核心结构和特性,让你轻松实现 MCP 服务器逻辑。
  • 处理 MCP 通信: 自动处理 MCP 客户端通过 HTTP POST 发送的 JSON-RPC 请求(如初始化、心跳、工具列表、工具调用)。
  • 工具能力支持: 允许你定义和注册 LLM 可以调用的工具(Tools),并实现工具的执行逻辑。
  • HTTP 传输: 支持通过 HTTP POST 方式接收 MCP 请求和发送响应。
  • 身份验证: 提供简单的基于请求头的身份验证机制。
  • 批处理支持: 能够处理包含多个 MCP 消息的批量请求。

安装步骤

将以下依赖添加到你的 Internet Computer Canister 项目的 'Cargo.toml' 文件中:

[dependencies]
ic_rmcp = { git = "https://github.com/ByteSmithLabs/ic-rmcp", branch = "main" }
# 其他必要的IC依赖,如 ic-cdk, ic-cdk-macros 等

然后使用 Cargo 构建你的项目:

cargo build --target wasm32-unknown-unknown

服务器配置 (供 MCP 客户端参考)

使用此 SDK 构建的 MCP 服务器是部署在 Internet Computer 上的 Canister,通过 HTTP 进行通信。MCP 客户端连接到这类服务器时,通常需要配置服务器的网络地址(Canister ID 或 URL)而非启动本地进程的命令和参数。

基于此仓库信息,MCP 客户端需要知道:

  • 服务器地址: 部署后的 Canister 的 HTTP 端点。通常是 Canister ID 对应的 URL。
  • MCP 路径: 服务器监听 MCP 请求的路径,此 SDK 默认使用 '/mcp'。
  • 传输协议: HTTP POST。
  • 身份验证: 如果服务器启用了基于请求头的验证(如示例中的 'x-api-key'),客户端需要在请求头中包含相应的认证信息。

一个 MCP 客户端可能的配置(非严格 JSON 格式,仅为说明):

服务器名称: [你为服务器定义的名字,例如 "Adder MCP"]
连接方式: HTTP
端点 URL: https://[你的Canister ID].icp0.io/mcp  (示例URL)
认证方式: 可选,例如 API Key (在请求头中添加 "x-api-key": "123456")

注意: MCP 客户端的实际配置格式取决于客户端本身的设计,可能使用 'url' 字段或其他方式指定网络地址,而非 'command' 和 'args'。此处的说明是根据本仓库的实现方式给出的连接指引。

基本使用方法

  1. 在你的 IC Canister 项目中,定义一个 struct 来表示你的 MCP 服务器。
  2. 为该 struct 实现 'ic_rmcp::Handler' trait。
  3. 在 'Handler' 的实现中,提供 'get_info' 方法声明服务器能力(如 'tools')。
  4. 如果支持工具,实现 'list_tools' 方法返回工具列表,并实现 'call_tool' 方法处理工具调用请求。
  5. 在 Canister 的 HTTP 请求处理函数(通常是 '#[update] fn http_request_update(...)')中,创建你的服务器 struct 实例,并调用其 'handle' 或 'handle_with_auth' 方法,将 HttpRequest 作为参数传入,然后返回 HttpResponse。
use ic_cdk_macros::update;
use ic_http_certification::HttpRequest;
use ic_rmcp::{Handler, Server};
use rmcp::model::{ServerInfo, ServerCapabilities, Implementation};
// ... 其他必要的 use 语句和你的 struct 定义(实现了 Handler)

#[update]
async fn http_request_update(req: HttpRequest<'_>) -> HttpResponse<'_> {
    YourServerStruct { /* ... */ }
        .handle(req) // 或 handle_with_auth(req, |headers| { /* 你的认证逻辑 */ })
        .await
}

// ic_cdk::export_candid!();

信息

分类

开发者工具