项目简介

'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 服务器:

  1. 定义能力接口: 实现 'mcp.PromptServer', 'mcp.ResourceServer', 'mcp.ToolServer' 等接口来提供您的业务逻辑(例如,访问数据库、调用外部API等)。
  2. 选择传输: 创建一个实现了 'mcp.ServerTransport' 接口的实例,例如 'mcp.NewStdIO' 或 'mcp.NewSSEServer'。
  3. 创建 MCP Server: 使用 'mcp.NewServer' 创建服务器实例,传入服务器信息、选择的传输以及通过 'mcp.With...Server' 选项注入您的能力接口实现。
  4. 启动服务: 调用服务器实例的 '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 客户端:

  1. 选择传输: 创建一个实现了 'mcp.ClientTransport' 接口的实例,例如 'mcp.NewStdIO' 或 'mcp.NewSSEClient'。
  2. 创建 MCP Client: 使用 'mcp.NewClient' 创建客户端实例,传入客户端信息和选择的传输。您也可以通过选项注入客户端能力接口实现(例如 'mcp.WithSamplingHandler')。
  3. 连接服务器: 调用客户端实例的 'Connect()' 方法与服务器建立连接。
  4. 调用服务器能力: 调用客户端实例的方法,如 'cli.ListPrompts()', 'cli.CallTool()', 'cli.ReadResource()' 等来与服务器交互。
  5. 处理通知: 如果您注入了客户端能力接口(如 'mcp.WithResourceSubscribedWatcher'),相应的回调方法会在收到服务器通知时被调用。

请参考 'example/everything/' 和 'example/filesystem/' 目录中的完整示例,了解如何构建和运行基于 'go-mcp' 的 MCP 服务器和客户端应用程序。

信息

分类

开发者工具