项目简介

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 服务器的基本步骤如下:

  1. 创建 Transport Provider: 选择或实现一个 'spec.McpServerTransportProvider',例如使用内置的 'stream.NewHTTPServerTransportProvider' 来创建基于 HTTP/SSE 的传输层。
  2. 使用 Builder 构建服务器: 使用 'server.NewSync' 或 'server.NewAsync' 创建服务器 Builder。
  3. 配置服务器: 使用 Builder 的方法配置服务器信息、能力声明、可用的工具、资源、Prompt 模板等。
  4. 注册处理器: 为 MCP 方法(如工具调用、资源读取、Prompt 获取、消息创建等)注册相应的处理函数 ('ToolHandler', 'ResourceHandler', 'PromptHandler', 'CreateMessageHandler' 等)。这些处理函数包含您服务器的具体业务逻辑。
  5. 启动服务器: 调用服务器对象的 'Start()' 方法启动服务,开始监听客户端连接和处理请求。
  6. 保持运行/优雅停止: 在一个协程中保持服务器运行,并根据需要实现信号处理,以便调用 '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模板

信息

分类

开发者工具