当 AI 应用需要查数据库、调 API、读文件时,总不能把整套系统都塞进提示词里。Model Context Protocol(MCP) 就是为解决这个问题而生:它让大模型通过统一协议安全、可控地连接外部数据源和工具。如果你在用 Go 做后端或 CLI,用 Go 写 MCP 服务再合适不过——编译成单二进制、并发友好、部署简单。这篇文章就聊聊 Go 里如何快速实现一个 MCP 服务,以及目前主流的 Go MCP 框架 该怎么选。
MCP 是什么?为什么用 Go 写?
MCP(Model Context Protocol)是一套开放标准,用来在 AI 应用和外部系统之间建立安全、可控的连接。大模型通过 MCP 可以:
- 调用工具(Tools):执行计算、查库、发请求等
- 访问资源(Resources):读文件、读 API 数据等
- 使用提示模板(Prompts):复用结构化提示
用 Go 实现 MCP 服务有几个明显优势:编译成单二进制,无需带着 Python/Node 环境跑;goroutine 天然适合高并发请求;启动快、占用小,适合常驻进程和 CLI 形态。下面从「快速实现一个服务」和「框架选型」两方面说。
用官方 SDK 搭一个 MCP 服务
目前最主流、最稳妥的选择是 Model Context Protocol 官方维护的 Go SDK:github.com/modelcontextprotocol/go-sdk(与 Google 等合作维护)。用它搭一个「打招呼」的 MCP 服务只需要几十行代码。
2.1 安装依赖
go get github.com/modelcontextprotocol/go-sdk/mcp
2.2 定义工具入参和出参
工具的参数和返回值用结构体 + jsonschema 标签描述,客户端(如 Cursor、Claude Desktop)能据此理解如何调用:
package main
import (
"context"
"log"
"github.com/modelcontextprotocol/go-sdk/mcp"
)
type Input struct {
Name string `json:"name" jsonschema:"the name of the person to greet"`
}
type Output struct {
Greeting string `json:"greeting" jsonschema:"the greeting to tell to the user"`
}
2.3 实现工具处理函数并启动服务
处理函数签名为:func (ctx, *CallToolRequest, Input) (*CallToolResult, Output, error)。这里我们只返回一句问候语,不返回错误结果,所以第一个返回值用 nil:
func SayHi(ctx context.Context, req *mcp.CallToolRequest, input Input) (
*mcp.CallToolResult,
Output,
error,
) {
return nil, Output{Greeting: "Hi " + input.Name}, nil
}
func main() {
// 创建服务并注册一个工具
server := mcp.NewServer(&mcp.Implementation{Name: "greeter", Version: "v1.0.0"}, nil)
mcp.AddTool(server, &mcp.Tool{Name: "greet", Description: "say hi"}, SayHi)
// 使用标准输入/输出与客户端通信(Cursor、Claude 等常用方式)
if err := server.Run(context.Background(), &mcp.StdioTransport{}); err != nil {
log.Fatal(err)
}
}
把上述代码保存为 main.go,执行 go run .,就得到一个通过 stdio 对外提供 greet 工具的 MCP 服务。在 Cursor 等客户端里配置该可执行文件路径,即可在对话中调用「打招呼」能力。
小结:官方 SDK 的用法可以概括为——NewServer → AddTool(或 AddResource、AddPrompt)→ Run(transport)。传输层除了 StdioTransport,还可以自己基于 jsonrpc 包实现 HTTP、WebSocket 等。
Go 里有哪些流行的 MCP 框架?
除了官方 SDK,社区还有多个 Go 实现的 MCP 库,适合不同口味和场景。
3.1 官方 Go SDK(首选)
- 仓库:
github.com/modelcontextprotocol/go-sdk - 特点:与 MCP 规范同步快,支持多版规范(如 2025-06-18、2025-11-25 等);API 清晰,文档和示例齐全;维护方为 MCP 官方 + Google,长期支持有保障。
- 包结构:
mcp(核心服务/客户端)、jsonrpc(自定义传输)、auth(OAuth 等)等。 - 适用:生产环境、需要紧跟规范、希望「官方一条龙」的团队。
3.2 MCP-Go(mark3labs/mcp-go)
- 仓库:
github.com/mark3labs/mcp-go,文档站:mcp-go.dev - 特点:强调少样板、高抽象,把 Tools/Resources/Prompts 都封装成链式 API;支持多种传输:Stdio、StreamableHTTP、SSE、In-Process;类型安全,写业务逻辑即可。
- 示例:用
server.NewMCPServer创建服务,用mcp.NewTool定义参数(如mcp.WithString("name", mcp.Required(), ...)),再s.AddTool(tool, handler)即可。 - 适用:想快速上线、少写协议细节、或需要 HTTP/SSE 等传输的 Go 开发者。
3.3 其他社区实现
- mcp-golang(metoro-io/mcp-golang)、go-mcp(ThinkInAIXYZ/go-mcp)等也在官方 SDK 的致谢中被提及,可作为备选或参考实现。选型时建议优先看是否跟最新 MCP 规范兼容以及近期是否还有维护。
| 维度 | 官方 go-sdk | MCP-Go |
|---|---|---|
| 维护方 | MCP 官方 + Google | 社区(mark3labs) |
| API 风格 | 显式 Server/Tool | 链式、偏高层 |
| 传输方式 | Stdio + 自实现 | Stdio/HTTP/SSE/InProcess |
| 规范跟进 | 非常及时 | 完整支持 |
| 学习成本 | 中等 | 偏低 |
实现时要注意什么?
- 传输方式:本地 CLI/IDE 集成常用 stdio;需要远程调用时再考虑 HTTP、SSE 或 Streamable HTTP,并在客户端配置好 URL 或命令。
- 参数校验:工具参数用结构体 +
jsonschema或 MCP-Go 的Required()/Enum()等写清楚,减少调用方传错。 - 错误与安全:工具内部做好错误处理,避免把内部细节当作文本内容返回给模型;对敏感数据要做好鉴权与脱敏。
- 版本:官方 go-sdk 的 v1.2.0+ 支持更新的 MCP 规范,新项目建议直接用最新稳定版。
写在最后
- MCP 让大模型通过统一协议安全地使用外部工具与数据;用 Go 写 MCP 服务可以做到单二进制、高并发、易部署。
- 快速实现:用官方
github.com/modelcontextprotocol/go-sdk/mcp,按「NewServer → AddTool → Run(StdioTransport)」即可跑起一个 stdio 版 MCP 服务。 - 框架选型:生产或跟规范优先选官方 Go SDK;喜欢少样板、多传输方式可选 MCP-Go;其他库可作补充或参考。
- 先把一个「打招呼」工具跑通,再按业务需求加更多 Tools/Resources/Prompts,是上手 MCP 服务的一条稳妥路径。