Appearance
MCP Go SDK v0.2.0
重大变更
此版本包含破坏性变更。 详细信息请参阅发布说明。
此仓库包含 Model Context Protocol (MCP) 官方 Go 软件开发工具包(SDK)的未发布实现。
[!警告] 该 SDK 尚未正式发布,目前处于不稳定状态,可能会发生破坏性更改。请进行测试并提交错误报告或 API 提案,但请勿在实际项目中使用。已知问题和缺失功能请参阅问题跟踪器。我们计划在 2025 年 8 月发布 SDK 的稳定版本。
设计
该 SDK 的设计文档位于 design.md,最初在 modelcontextprotocol/discussions/364 进行了评审。
进一步的设计讨论应在 issues(针对具体提案)或 discussions(针对开放性讨论)中进行。详细信息请参阅 CONTRIBUTING.md。
包文档
该 SDK 由三个可导入的包组成:
github.com/modelcontextprotocol/go-sdk/mcp包定义了用于构建和使用 MCP 客户端和服务器的主要 API。github.com/modelcontextprotocol/go-sdk/jsonschema包提供了 JSON Schema 的实现,用于 MCP 工具的输入和输出模式定义。github.com/modelcontextprotocol/go-sdk/jsonrpc包供需要实现自定义传输协议的用户使用。
示例
在此示例中,MCP 客户端与运行在 sidecar 进程中的 MCP 服务器通信:
go
package main
import (
"context"
"log"
"os/exec"
"github.com/modelcontextprotocol/go-sdk/mcp"
)
func main() {
ctx := context.Background()
// 创建一个没有任何功能的新客户端。
client := mcp.NewClient(&mcp.Implementation{Name: "mcp-client", Version: "v1.0.0"}, nil)
// 通过标准输入/输出连接到服务器。
transport := &mcp.CommandTransport{Command: exec.Command("myserver")}
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": "you"},
}
res, err := session.CallTool(ctx, params)
if err != nil {
log.Fatalf("调用工具失败: %v", err)
}
if res.IsError {
log.Fatal("工具调用失败")
}
for _, c := range res.Content {
log.Print(c.(*mcp.TextContent).Text)
}
}以下是相应的服务器组件示例,它通过 stdin/stdout 与客户端进行通信:
go
package main
import (
"context"
"log"
"github.com/modelcontextprotocol/go-sdk/mcp"
)
type HiParams struct {
Name string `json:"name" jsonschema:"the name of the person to greet"`
}
func SayHi(ctx context.Context, req *mcp.ServerRequest[*mcp.CallToolParamsFor[HiParams]]) (*mcp.CallToolResultFor[any], error) {
return &mcp.CallToolResultFor[any]{
Content: []mcp.Content{&mcp.TextContent{Text: "你好," + req.Params.Arguments.Name}},
}, nil
}
func main() {
// 创建一个包含单个工具的服务器。
server := mcp.NewServer(&mcp.Implementation{Name: "greeter", Version: "v1.0.0"}, nil)
mcp.AddTool(server, &mcp.Tool{Name: "greet", Description: "打招呼"}, SayHi)
// 通过标准输入/输出运行服务器,直到客户端断开连接
if err := server.Run(context.Background(), &mcp.StdioTransport{}); err != nil {
log.Fatal(err)
}
}examples/ 目录中包含更多示例客户端和服务端。
致谢
一些现有的 Go MCP SDK 对本官方 SDK 的开发和设计提供了启发,尤其是由 Ed Zynda 编写的 mcp-go。我们感谢 Ed 以及 mcp-go 的其他贡献者,同时也感谢 mcp-golang 和 go-mcp 等其他 SDK 的作者与贡献者。正是由于他们的努力,Go MCP 客户端和服务端才形成了繁荣的生态系统。
许可证
本项目采用 MIT 许可证进行授权 —— 详情请参阅 LICENSE 文件。
