MCP Server 这个词,最近几个月在 AI 工程圈里出现的频率高得吓人。我自己的体感是:去年聊 AI 还在说怎么调 prompt,今年上半年已经开始聊怎么把 Agent 接上外部工具,到了现在,几乎每一个做 Agent 落地的团队,都在讨论要不要自己写一个 MCP Server。这篇文章就是我从零搭一个 Go 版 MCP Server 的全过程记录,包括协议设计到底在解决什么问题、SDK 怎么选、代码怎么写、跟客户端联调时有哪些坑,以及我踩过之后总结出来的一套比较稳的实践方式。如果你正好在评估"用 Go 构建 MCP Server"这件事,或者已经决定上手但想少走弯路,这篇应该能帮上忙。
1. MCP 到底解决了什么问题——先搞清楚协议在干什么
很多人上手 MCP 第一步就去看代码,结果被一堆术语搞懵:Tool、Resource、Prompt、Capability、Transport……其实这些东西背后就一个朴素诉求:让 AI 应用能稳定地调用外部能力和数据,而不是靠一顿提示词让模型"猜"出来。
在 MCP 出现之前,让 AI 模型连接外部系统基本是各自为战。你在应用 A 里写了一套函数调用逻辑,换到应用 B 就得重写;模型想读一个文件、查一个数据库、调一个 API,每个厂商给你一套完全不同的接入方式。MCP(Model Context Protocol)干脆把这件事标准化了:它定义了一套"AI 应用"跟"外部工具/数据源"之间的通信协议,大家按同一个规矩说话,接一次就能到处用。
打个比方,MCP 之于 AI Agent,就相当于 USB-C 之于各种外设。以前每个设备一个充电口,现在统一了接口,plug and play。MCP 就是这个"统一接口"的协议定义。
1.1 三个核心原语:工具、资源、提示词
MCP 暴露给 AI 应用的无非三种能力,理解这三种原语,整个协议就懂了一半。
工具(Tools):类似函数调用。你定义好函数名、参数 JSON Schema、执行逻辑,AI 根据用户请求决定"要不要调用、传什么参"。典型例子:天气查询、订单查询、发邮件、执行 SQL。
资源(Resources):给 AI 提供"可以读"的数据内容,比如配置文件内容、数据库 schema、文档正文。资源通常有 URI,支持按需读取,AI 需要上下文时主动去取。
提示词(Prompts):预置的 prompt 模板,客户端可以拉取并组合进对话上下文。比如"代码审查"、"日报生成"这种固定套路,可以做成提示词模板复用。
这三种能力通过 JSON-RPC 2.0 消息通信,主流传输层主要有两个,接着往下看。
1.2 传输层:stdio 与 Streamable HTTP 怎么选
MCP 目前最常见的两种传输方式是stdio(标准输入输出)和Streamable HTTP(前缀 SSE 的可流式 HTTP)。
stdio 模式下,MCP Server 是一个子进程,由客户端拉起,客户端把 JSON-RPC 请求写到子进程的标准输入,子进程把响应写到标准输出,两端通过标准输入输出对话。这个模式在本地开发体验极好,不用管端口、鉴权、跨域,而且进程生命周期跟客户端绑定,客户端退出子进程自动回收。
Streamable HTTP 则是走网络,Server 作为一个 HTTP 服务端,支持远程连接,适合部署在服务器上供多个客户端或远端访问。代价是你要额外处理鉴权、并发、网络超时这些问题。
选型逻辑其实很直接:本地工具、私有化部署,优先 stdio;多客户端共享、跨机器访问,走 HTTP。我用 Go 做的那个项目最终是 stdio 模式,本地跑、配合各种 AI 客户端工具用,集成成本最低。如果后面要发布成出去,再在同一个业务层外面套 HTTP transport 也不难,这正好是 Go 的优势所在——业务逻辑和传输层可以解耦,后面展开说。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 为什么偏偏用 Go 写 MCP Server
Go 语言做 MCP Server,在我看来是一个"越用越顺"的选择。不是说 Python 或 TypeScript 不行——Python 生态里的 MCP 示例最多,TypeScript 跟前端客户端集成方便——但 Go 在几个关键场景下的优势非常突出。
2.1 Go 做服务端的硬核优势
编译成单文件,分发部署零依赖。 这是我最看重的点。MCP Server 通常要配置进 AI 客户端的配置文件里,用户需要下载、安装、运行。Go 编译出来就是一个可执行文件,拷贝到哪都能跑,不需要装 Python 环境、不需要 npm install,对非技术用户非常友好。你可以直接给协作同事一个二进制,省掉一整套环境搭建的沟通成本。
并发能力是语言级天赋。 MCP Server 本质上是一个要同时服务多个 tool 调用的进程。AI Agent 的调用模式是"发起多个工具请求,等待结果",尤其是并行调用多个工具时,Server 需要高效处理并发请求。Go 的 goroutine 让你写并发逻辑就像写普通同步代码,不需要像 Node 那样纠结回调,也不像 Pytho
