北辰遴选
175.09M · 2026-03-22
在人工智能快速发展的今天,大型语言模型(LLM)需要更丰富、更动态的上下文信息来完成任务。Model Context Protocol (MCP) 应运而生,它定义了一套标准协议,允许模型与外部工具、数据源和服务进行安全、高效的交互,极大地扩展了大模型的能力边界。
但是,MCP 官方 Go SDK 却姗姗来迟,在 Python SDK 已经满世界运行时,Go SDK 项目才刚刚启动,这也导致官方 Go SDK 稍显落后。不过,经过数月的社区测试、迭代和打磨,modelcontextprotocol/go-sdk 项目终于迎来了具有里程碑意义的 v1.0.0 正式版本。这标志着 Go 语言版本的 MCP 官方开发套件结束了“不稳定”的预览阶段,进入了生产可用的稳定时代。
版本号从 v0.x.x 跃升至 v1.0.0,绝不仅仅是数字的变化,它背后代表着项目维护者向所有开发者作出的一项庄严承诺:API 稳定性。
根据官方发布说明,核心团队明确表示:“Going forward we won’t make breaking API changes.”(未来我们将不会进行破坏性的 API 更改)。这意味着:
modelcontextprotocol/go-sdk 提供了构建 MCP 客户端(Client)和服务器(Server)所需的所有核心功能,设计清晰直观,非常易于使用。
$ go get github.com/modelcontextprotocol/go-sdk/mcp@v1.0.0
下面的代码示例展示如何创建一个简单的“问候”服务器,它提供了一个名为 greet 的工具。
package main
import (
"context"
"log"
"github.com/modelcontextprotocol/go-sdk/mcp" // 导入 MCP Go SDK
)
// Input 结构体定义了工具调用时的输入参数格式
type Input struct {
// json 标签用于序列化/反序列化,jsonschema 标签提供元数据描述(用于文档或验证)
Name string `json:"name" jsonschema:"the name of the person to greet"`
}
// Output 结构体定义了工具调用后的输出结果格式
type Output struct {
Greeting string `json:"greeting" jsonschema:"the greeting to tell to the user"`
}
// SayHi 是工具的实际处理函数
// 它接收 context、MCP 工具调用请求对象和解析后的 Input 参数。
// 返回三个值:*mcp.CallToolResult(可选的额外结果元数据)、Output(业务输出)和 error(错误)。
func SayHi(ctx context.Context, req *mcp.CallToolRequest, input Input) (
*mcp.CallToolResult,
Output,
error,
) {
return nil, Output{Greeting: "Hi " + input.Name}, nil
}
func main() {
// 创建一个新的 MCP 服务器实例
server := mcp.NewServer(&mcp.Implementation{Name: "greeter", Version: "v1.0.0"}, nil)
// 向服务器注册一个工具
mcp.AddTool(server, &mcp.Tool{Name: "greet", Description: "say hi"}, SayHi)
// 启动服务器,使用标准输入输出(stdio)作为传输层
// Run 方法会阻塞,直到客户端断开连接或发生错误
if err := server.Run(context.Background(), &mcp.StdioTransport{}); err != nil {
log.Fatal(err)
}
}
客户端可以连接到上述服务器并调用其工具。
package main
import (
"context"
"log"
"os/exec" // 用于执行外部命令(这里用于启动服务器进程)
"github.com/modelcontextprotocol/go-sdk/mcp" // 导入 MCP Go SDK
)
func main() {
ctx := context.Background()
// 创建一个新的 MCP 客户端实例
client := mcp.NewClient(&mcp.Implementation{Name: "mcp-client", Version: "v1.0.0"}, nil)
// 设置传输层:通过执行外部命令 "myserver" 来启动服务器进程,并使用其 stdin/stdout 进行通信
transport := &mcp.CommandTransport{Command: exec.Command("./greeting")}
// 连接到服务器,建立会话(session)
session, err := client.Connect(ctx, transport, nil)
if err != nil {
log.Fatal(err)
}
defer session.Close() // 确保在函数退出前关闭会话,释放资源
// 准备工具调用参数
params := &mcp.CallToolParams{
Name: "greet", // 工具名称
Arguments: map[string]any{"name": "江湖十年"}, // 工具参数
}
// 调用服务器的工具
res, err := session.CallTool(ctx, params)
if err != nil {
log.Fatalf("CallTool failed: %v", err)
}
if res.IsError {
log.Fatal("tool failed")
}
// 处理响应内容
for _, c := range res.Content {
log.Print(c.(*mcp.TextContent).Text) // 类型断言为 TextContent 并获取文本
}
}
根据以下命令执行 MCP 程序。
# 编译 MCP 服务器程序
$ go build -o client/greeting server/greeting.go
# 当前目录结构
$ tree
.
├── client
│ ├── client.go
│ └── greeting
└── server
└── greeting.go
3 directories, 3 files
# 进入到 MCP 客户端目录
$ cd client
# 执行客户端程序
$ go run client.go
2025/10/08 22:59:01 {"greeting":"Hi 江湖十年"}
至此,一个基于 stdio 的 MCP 使用示例就完成了。
你可以在 github.com/modelcontex… 探索更多使用示例。
MCP Go SDK 的设计遵循了 Model Context Protocol (MCP) 规范,旨在提供一种标准化、类型安全的方式,让客户端(如 AI Agent)与服务器(提供工具、数据源或服务)进行通信。以下是其核心设计理念:
Transport 接口(如 StdioTransport、CommandTransport、SSEServerTransport),允许通信通过不同渠道(stdio、HTTP)进行。这使得 SDK 能适应各种部署场景(本地、远程、云端)。Session 对象管理连接状态,支持多次交互。会话生命周期包括连接、工具调用、资源访问和断开。json 和 jsonschema 标签进行序列化和验证。这确保了数据契约的明确性,减少了运行时错误。mcp.AddTool)和资源,处理请求。服务器可以同时支持多个工具,每个工具独立实现。session.CallTool)和资源请求。客户端可以连接到多个服务器,实现聚合功能。error 机制返回,调用方需显式处理。工具响应中的 IsError字段表示业务逻辑错误。Go 语言的高效与 MCP 协议的强大相结合,必将为 AI 应用开发开启新的可能。
MCP Go SDK v1.0.0 的发布是 Go 开发者与 AI 应用交叉领域的一个重大事件。它提供了一个:
对于开发者而言,现在是开始使用 Go 构建 MCP 服务器(如连接数据库、内部 API、专属工具链)和客户端的绝佳时机。
本文示例源码我都放在了 GitHub 中,欢迎点击查看。
希望此文能对你有所启发。
延伸阅读