当 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 SDKgithub.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 服务的一条稳妥路径。