自己写一个 MCP Server:从一个能跑的工具,到别人敢装的服务
你大概已经这样用过 AI 编程工具:让它读代码、改文件、跑命令。也大概装过别人写的 MCP 服务器——数据库的、浏览器的、任务系统的,配置一贴,工具就出现在对话里。
但总有一类事情,装不到。比如公司内网那份只有跳板机能访问的运维手册,比如你自己攒了三年的笔记目录,比如那套没人会做成产品的内部工单接口。这些事你现在的做法多半是:把内容复制粘贴进对话,或者写个脚本然后每次手动运行、再把输出贴回去。
复制粘贴的问题不是麻烦,是过期。你贴进去的是那一刻的快照,模型下一轮就不知道数据变了。脚本的问题也不是麻烦,是模型不会主动用它——它不知道那个脚本存在,不知道该传什么参数,更不知道什么时候该调用。
MCP(Model Context Protocol)要解决的就是这一段:把「一件只有你能做的事」变成「任何支持 MCP 的 AI 应用都能发现、能调用、能拿到实时结果的能力」。写一个 MCP Server,本质上就是把你的函数交给模型,并且用一份契约告诉它:这个工具叫什么、什么时候该用、要传什么、会返回什么、有没有副作用。
这份教程要带你走完的,不是「五分钟跑通 hello world」。跑通很容易,官方最小示例只有十几行。真正难的是后面那一大段:为什么模型看得见你的工具却不调用它;参数传错了该返回什么模型才会自己改;数据库连接该在哪里建;它没反应的时候你从哪里看;怎么从本地进程变成能给同事用的远程服务;以及最后那个问题——别人凭什么敢把你的 server 装进他的开发环境。
读完你会有一个真正做完的产物:一个笔记库服务。它能搜索、能读取、能追加,有输入校验、有错误设计、有状态管理、有安全边界,能接进 Claude Code 和 Codex CLI,能部署成远程服务,能发给别人。这十二章就是把它一步步做出来的过程。
先说清楚三件事,它们会决定你后面少走多少弯路。
第一,MCP 在 2026 年 7 月 28 日发布的规范版本是一次破坏性重构。它移除了沿用一年多的 initialize 握手和 HTTP 会话,改成了无状态模型。你在网上搜到的绝大多数中文文章讲的是旧形态。
第二,官方 Python SDK 已经进入 2.x。最著名的那个类 FastMCP 被改名成了 MCPServer,旧的 import 语句现在会直接抛异常。这意味着你复制任何一篇 2026 年年中之前的教程代码,大概率跑不起来。
第三,本教程所有代码都在 mcp 2.1.1 上实际跑过,文中出现的每一段 JSON 往返都是真实抓下来的输出。但版本还会变——所有版本号、命令语法、配置字段,动手前请用官方文档核对一遍。教程教的是判断方法,不是可以永远照抄的常量。
技术栈:Python 3.12,依赖与命令统一用 uv。
章节目录
12 章 · 约 112 分钟- 01 先决定:这件事值不值得写成 MCP Server 复制粘贴、写脚本、写规则文件各自卡在哪;用两个问题判断这件事值不值得做成 MCP Server。 6 min
- 02 三十行跑起来:第一个 stdio server 三十行跑通第一个 stdio server,并搞清楚为什么网上抄来的 FastMCP 写法现在会直接报错。 12 min
- 03 掀开盖子:一次工具调用的完整往返 一次工具调用在协议层的真实往返:stdio 帧格式、2026-07-28 的无握手模型,以及读旧文档时的翻译表。 9 min
- 04 工具、资源、提示词:谁来决定调用 工具、资源、提示词的差别不在能力,在谁决定调用;附一张笔记库的能力清单。 8 min
- 05 描述就是 API:让模型准确地调用 模型为什么看得见你的工具却不调用:描述与参数 schema 的改写对照,以及工具数量的真实成本。 9 min
- 06 输入不可信,外部会挂:校验、错误与返回设计 参数校验、两种错误机制的分界、被 SDK 遮蔽的异常信息,以及返回体的截断与引导。 13 min
- 07 让 server 拥有状态:生命周期、密钥与并发 用 lifespan 管连接与索引,密钥从哪里来,以及协议取消会话之后跨调用状态该怎么传。 9 min
- 08 它没反应的时候:调试与故障定位 先缩短链路再排查:Inspector 三种形态、各标签页在看什么,加一张八行故障对照表。 10 min
- 09 接进真实客户端:Claude Code、Codex CLI、Claude Desktop 接进 Claude Code、Codex CLI 与 Claude Desktop 的真实配置,以及接入后必须做的三步验证。 11 min
- 10 从本地进程到远程服务:Streamable HTTP 先判断要不要做远程,再看 Streamable HTTP 的三条规则和上线前必须补齐的四道关口。 8 min
- 11 别人凭什么敢装:安全边界与发布 工具投毒、事后掉包、跨 server 影子、未调用即中招;服务端能建的防线与一份发布前自检清单。 11 min
- 12 实战:把笔记库服务做完并自评 四轮推进的完整任务卡、十项自评量表,以及三种「差一点」的典型症状。 6 min
常见问题
需要先读过 MCP 规范吗?
不需要。只假设你会用终端和 git、读得懂 Python 的函数与类型注解,装过别人写的 MCP 服务器。JSON-RPC 和协议细节在第 3 章从零讲起。
和《Claude Code 上手指南》第 9 章、《Codex CLI 上手指南》第 8 章什么关系?
那两章讲的是怎么把别人的 MCP 服务器接进来,这一篇讲怎么把它写出来。接入只作为第 9 章的验证环节出现。
为什么我照着别的教程写的代码跑不起来?
官方 Python SDK 已经进入 2.x,FastMCP 被改名为 MCPServer,旧的 import 会直接抛异常。第 2.4 节有一张八行的新旧写法对照表。
教程里的版本号可以直接用吗?
不建议写死。所有代码在 Python 3.12 与 mcp 2.1.1 上实际验证过,文中的协议往返是真实抓取的输出,但协议与 SDK 都在快速演进,动手前请用官方文档核对一遍。
可以跳着读吗?
第 1 到 3 章建议按顺序,它们建立判断力和协议心智模型。第 5、6 章是全篇最该慢读的两章。第 9、10 章可按需取用:只在本地用就不必读第 10 章。