项目简介
'go-mcp' 是一个 Go 语言库,提供了 Model Context Protocol (MCP) 的实现。MCP 是一种开放协议,旨在使大型语言模型(LLM)应用程序能够与外部数据源和功能无缝集成。该库既包含构建 MCP 服务器的框架,也包含用于连接和与 MCP 服务器通信的客户端实现。它支持 JSON-RPC 2.0 消息格式,并通过标准 I/O (StdIO) 和 Server-Sent Events (SSE) 等多种传输方式进行通信。
主要功能点
- 完整的 MCP 协议实现: 支持基于 JSON-RPC 2.0 的消息传递。
- 插拔式传输层: 内置支持 Standard IO 和 SSE 协议,并可扩展其他协议。
- 会话管理: 支持基于会话的客户端-服务器通信。
- 服务器能力声明与支持: 服务器可以声明支持的能力(如 Prompts、Resources、Tools、Logging),客户端按需交互。
- 客户端能力声明与支持: 客户端可以声明支持的能力(如 Roots、Sampling),服务器可按需调用客户端能力。
- 资源管理: 允许 LLM 应用列出、读取资源,并订阅资源更新通知。
- 工具注册与执行: 允许 LLM 调用服务器端注册的工具来执行特定任务。
- Prompt 模板: 支持定义和获取可带参数的 Prompt 模板。
- 进度追踪与取消: 支持长时操作的进度通知和请求取消。
- 日志集成: 支持服务器向客户端流式传输日志。
- 连接健康监控: 通过心跳(Ping/Pong)机制维护连接健康。
- 模块化设计: 易于通过实现接口来添加自定义的 Prompts、Resources 或 Tools 逻辑。
安装步骤
使用 Go Modules 进行安装:
go get github.com/intrepidreven/go-mcp
服务器配置
MCP 客户端需要通过 MCP 服务器的启动命令与其建立连接。使用 'go-mcp' 构建的服务器通常是一个独立的二进制文件。客户端需要一个 JSON 格式的配置来启动并连接到这个服务器进程。
典型的 MCP 客户端配置(JSON 格式)可能包含以下信息,具体取决于您构建的服务器以及使用的传输协议:
{ "serverName": "您的服务器名称", "command": "/path/to/your/server/executable", "args": ["--some-flag", "some-value"], "transport": { "type": "stdio" } }
或对于 SSE 传输:
{ "serverName": "您的服务器名称", "command": "/path/to/your/http/server/executable", "args": ["--port", "8080"], "transport": { "type": "sse", "connectUrl": "http://localhost:8080/sse-endpoint" } }
- 'serverName': 您的 MCP 服务器的标识名称(字符串)。
- 'command': 启动您的 MCP 服务器可执行文件的完整路径(字符串)。
- 'args': 传递给您的 MCP 服务器可执行文件的命令行参数列表(字符串数组)。例如,如果您基于 'example/filesystem' 构建服务器,可能需要传递 '--path' 参数。如果您基于 'example/everything' 构建服务器并使用 SSE,可能需要指定端口。
- 'transport': 配置客户端与服务器连接的传输协议。
- 'type': 传输协议类型,可以是 '"stdio"' 或 '"sse"'。
- 'connectUrl': 仅当 'type' 为 '"sse"' 时需要,指定 SSE 连接的 URL(字符串)。
请根据您使用 'go-mcp' 库构建的实际服务器程序,确定其启动命令、所需的参数以及监听的地址(对于 SSE)。
基本使用方法
'go-mcp' 库本身是一个框架,您需要编写代码来使用它构建服务器或客户端。
构建 MCP 服务器:
- 定义能力接口: 实现 'mcp.PromptServer', 'mcp.ResourceServer', 'mcp.ToolServer' 等接口来提供您的业务逻辑(例如,访问数据库、调用外部API等)。
- 选择传输: 创建一个实现了 'mcp.ServerTransport' 接口的实例,例如 'mcp.NewStdIO' 或 'mcp.NewSSEServer'。
- 创建 MCP Server: 使用 'mcp.NewServer' 创建服务器实例,传入服务器信息、选择的传输以及通过 'mcp.With...Server' 选项注入您的能力接口实现。
- 启动服务: 调用服务器实例的 'Serve()' 方法(通常放在一个 goroutine 中)开始监听连接和处理请求。
示例代码片段 (更多细节请参考 'example/' 目录):
import "github.com/intrepidreven/go-mcp" // ... 实现您的 ToolServer 接口 ... type MyToolServer struct{} // ... 实现 ListTools, CallTool 等方法 ... func main() { // 1. 选择传输 (例如 StdIO) srvIO := mcp.NewStdIO(os.Stdin, os.Stdout) // 2. 创建 MCP Server, 注入您的 ToolServer toolServerImpl := &MyToolServer{} srv := mcp.NewServer(mcp.Info{ Name: "my-custom-mcp-server", Version: "1.0", }, srvIO, mcp.WithToolServer(toolServerImpl), // ... 添加其他能力 ... ) // 3. 启动服务 srv.Serve() // 或者 go srv.Serve() }
构建 MCP 客户端:
- 选择传输: 创建一个实现了 'mcp.ClientTransport' 接口的实例,例如 'mcp.NewStdIO' 或 'mcp.NewSSEClient'。
- 创建 MCP Client: 使用 'mcp.NewClient' 创建客户端实例,传入客户端信息和选择的传输。您也可以通过选项注入客户端能力接口实现(例如 'mcp.WithSamplingHandler')。
- 连接服务器: 调用客户端实例的 'Connect()' 方法与服务器建立连接。
- 调用服务器能力: 调用客户端实例的方法,如 'cli.ListPrompts()', 'cli.CallTool()', 'cli.ReadResource()' 等来与服务器交互。
- 处理通知: 如果您注入了客户端能力接口(如 'mcp.WithResourceSubscribedWatcher'),相应的回调方法会在收到服务器通知时被调用。
请参考 'example/everything/' 和 'example/filesystem/' 目录中的完整示例,了解如何构建和运行基于 'go-mcp' 的 MCP 服务器和客户端应用程序。
信息
分类
开发者工具