项目简介
Go MCP SDK 是 Model Context Protocol (MCP) 的 Go 语言实现。它提供了一套全面的框架,帮助开发者轻松构建符合 MCP 标准的服务器和客户端应用。MCP 协议旨在标准化 AI 模型(客户端)与外部环境(服务器)之间的通信,使其能够通过统一的方式访问上下文信息、调用外部工具和使用 Prompt 模板。
该 SDK 包含完整的客户端和服务器实现,支持同步和异步通信模式,具备灵活的架构,可集成多种传输协议(如 HTTP, SSE, WebSocket, Stdio)。
主要功能点
- 核心协议支持: 实现 MCP 协议的 JSON-RPC 消息结构、错误码、方法名称等核心规范。
- 服务器框架: 提供构建 MCP 服务器的基础框架,处理客户端连接、请求解析和路由。
- 客户端框架: 提供构建 MCP 客户端的基础框架,处理与服务器的连接、请求发送和响应处理。
- 功能处理: 定义接口和机制,用于服务器实现对以下 MCP 核心功能的支持:
- 工具 (Tools): 声明服务器可提供的工具,并处理客户端的工具调用请求。
- 资源 (Resources): 声明服务器可管理的数据资源,并处理客户端的资源读写、订阅等请求。
- Prompt 模板 (Prompts): 声明服务器可提供的 Prompt 模板,并处理客户端的 Prompt 获取请求。
- 采样 (Sampling): 支持处理 LLM 消息创建请求(非核心功能,但 SDK 提供框架)。
- 根目录 (Roots): 管理文件系统或其他资源集合的根目录。
- 日志 (Logging): 允许客户端设置服务器日志级别和接收日志消息。
- 传输层抽象: 提供 'McpTransport' 接口,允许开发者实现自定义的底层通信协议。SDK 内置了基于 HTTP/SSE 的传输层实现示例。
- 会话管理: 管理客户端与服务器之间的会话状态。
- 能力声明: 支持客户端和服务器在初始化时声明各自支持的能力。
安装步骤
使用 Go Module 进行安装:
go get github.com/modelcontextprotocol-ce/go-sdk
服务器配置(供MCP客户端参考)
MCP 服务器通常由开发者使用此 SDK 构建成一个独立的可执行程序。MCP 客户端(如 VS Code MCP 扩展)需要知道如何启动或连接到这个服务器程序。以下是 MCP 客户端可能需要配置的服务器信息示例(JSON 格式),请根据您实际使用此 SDK 构建的服务器程序进行调整:
{ // 服务器的友好名称,将显示在客户端界面中 "name": "我的Go MCP服务器", // 启动服务器进程的可执行命令 // 如果您将使用SDK构建的应用打包成单个二进制文件,这里填写二进制文件路径(例如:"./my-mcp-server") // 如果您直接使用 "go run",这里可能填写 "go" "command": "go", // 启动命令所需的命令行参数列表 // 例如,如果您的服务器需要监听某个地址和端口,可以在这里指定参数 // 如果 command 是 "go",通常第一个参数是您的主文件路径,例如:["run", "./main.go", "--addr", "localhost:8080"] "args": [ "run", // 如果command是"go",这是运行参数 "/path/to/your/server/main.go", // 替换为您实际服务器代码的主文件路径 "--addr", "localhost:8080" // 示例参数:指定服务器监听的网络地址,请根据您的服务器实现调整 // 添加其他您的服务器程序需要的参数 ], // 如果您的MCP服务器启用了API Token认证,在这里填写客户端需要提供的Token值 // 请注意,这个Token需要在服务器端配置并校验 "token": "YOUR_OPTIONAL_API_TOKEN" }
请务必将上述配置中的 'command', 'args' 路径和参数替换为您实际使用此 SDK 构建并启动的服务器程序的命令和参数。'token' 字段仅在您的服务器启用了 API Token 认证时需要填写。
基本使用方法
使用该 SDK 构建 MCP 服务器的基本步骤如下:
- 创建 Transport Provider: 选择或实现一个 'spec.McpServerTransportProvider',例如使用内置的 'stream.NewHTTPServerTransportProvider' 来创建基于 HTTP/SSE 的传输层。
- 使用 Builder 构建服务器: 使用 'server.NewSync' 或 'server.NewAsync' 创建服务器 Builder。
- 配置服务器: 使用 Builder 的方法配置服务器信息、能力声明、可用的工具、资源、Prompt 模板等。
- 注册处理器: 为 MCP 方法(如工具调用、资源读取、Prompt 获取、消息创建等)注册相应的处理函数 ('ToolHandler', 'ResourceHandler', 'PromptHandler', 'CreateMessageHandler' 等)。这些处理函数包含您服务器的具体业务逻辑。
- 启动服务器: 调用服务器对象的 'Start()' 方法启动服务,开始监听客户端连接和处理请求。
- 保持运行/优雅停止: 在一个协程中保持服务器运行,并根据需要实现信号处理,以便调用 'StopGracefully()' 进行优雅停止。
示例代码结构 (简化):
package main import ( "context" "fmt" "log" "time" "github.com/modelcontextprotocol-ce/go-sdk/server" "github.com/modelcontextprotocol-ce/go-sdk/server/stream" // 例如使用HTTP传输 "github.com/modelcontextprotocol-ce/go-sdk/spec" ) // 示例:一个简单的工具处理器 func MyToolHandler(ctx context.Context, params []byte) (interface{}, error) { // ... 工具逻辑 ... return "Tool executed successfully", nil } // 示例:一个简单的消息创建处理器 func MyCreateMessageHandler(ctx context.Context, request spec.CreateMessageRequest) (*spec.CreateMessageResponse, error) { // ... 消息创建逻辑 ... return &spec.CreateMessageResponse{ Result: &spec.CreateMessageResult{ Role: "assistant", Content: "这是我的回复。", }, }, nil } func main() { // 1. 创建 Transport Provider (例如 HTTP) addr := "localhost:8080" transportProvider := stream.NewHTTPServerTransportProvider(addr) // 2. 使用 Builder 构建服务器 s := server.NewSync(transportProvider). WithServerInfo(spec.Implementation{Name: "My MCP Server", Version: "1.0"}). WithCapabilities(spec.NewServerCapabilitiesBuilder().Tools(true, false).Sampling(true).Build()). // 声明能力 WithTools(spec.Tool{Name: "my-tool", Description: "一个示例工具"}). // 声明工具 (server.SyncBuilder). // 类型断言以便调用同步特有方法 WithToolHandler("my-tool", MyToolHandler). // 3. 注册工具处理器 WithCreateMessageHandler(MyCreateMessageHandler). // 3. 注册消息处理器 Build() // 4. 启动服务器 fmt.Printf("Starting MCP server on %s...\n", addr) if err := s.Start(); err != nil { log.Fatalf("Failed to start server: %v", err) } fmt.Println("Server started.") // 5. 保持运行 (生产环境中通常是一个阻塞调用,例如监听信号) // 这里仅为示例,实际应用需要更完善的生命周期管理 select { case <-time.After(60 * time.Second): // 示例:运行60秒后自动停止 fmt.Println("Simulating server shutdown...") } // 6. 优雅停止 ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second) defer cancel() if err := s.StopGracefully(ctx); err != nil { log.Fatalf("Failed to stop server gracefully: %v", err) } fmt.Println("Server stopped.") }
该 SDK 提供了构建 MCP 服务器所需的基础框架和组件,开发者可以在此基础上实现具体的工具、资源和 Prompt 逻辑,从而构建完整的 MCP 服务器应用。
关键词
Go语言, LLM后端, 工具注册, 资源管理, Prompt模板
信息
分类
开发者工具