Skip to content

MCP Go SDK v0.2.0

在 GitHub Codespaces 中打开

重大变更

此版本包含破坏性变更。 详细信息请参阅发布说明

PkgGoDev

此仓库包含 Model Context Protocol (MCP) 官方 Go 软件开发工具包(SDK)的未发布实现。

[!警告] 该 SDK 尚未正式发布,目前处于不稳定状态,可能会发生破坏性更改。请进行测试并提交错误报告或 API 提案,但请勿在实际项目中使用。已知问题和缺失功能请参阅问题跟踪器。我们计划在 2025 年 8 月发布 SDK 的稳定版本。

设计

该 SDK 的设计文档位于 design.md,最初在 modelcontextprotocol/discussions/364 进行了评审。

进一步的设计讨论应在 issues(针对具体提案)或 discussions(针对开放性讨论)中进行。详细信息请参阅 CONTRIBUTING.md

包文档

该 SDK 由三个可导入的包组成:

示例

在此示例中,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-golanggo-mcp 等其他 SDK 的作者与贡献者。正是由于他们的努力,Go MCP 客户端和服务端才形成了繁荣的生态系统。

许可证

本项目采用 MIT 许可证进行授权 —— 详情请参阅 LICENSE 文件。