这是一个用于在 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'。此处的说明是根据本仓库的实现方式给出的连接指引。
基本使用方法
- 在你的 IC Canister 项目中,定义一个 struct 来表示你的 MCP 服务器。
- 为该 struct 实现 'ic_rmcp::Handler' trait。
- 在 'Handler' 的实现中,提供 'get_info' 方法声明服务器能力(如 'tools')。
- 如果支持工具,实现 'list_tools' 方法返回工具列表,并实现 'call_tool' 方法处理工具调用请求。
- 在 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!();
信息
分类
开发者工具