构建

第一个 MCP 服务端 — 我的代码在聊天窗里跑起来

作者: makemind · 2026年7月2日

我的代码在聊天窗里被执行

在 Claude Desktop 的聊天里写「把刚才说的存到笔记里」。模型不去编答案,而是调用一个叫 noteadd 的工具,过一会儿「已保存」的结果就被引用进回复里。下一次对话里问「我有哪些笔记?」,notelist 就会跑,刚才存的东西原样出来。

执行 noteaddnotelist 的,是我笔记本上跑着的几十行服务端。既没有上传到插件商店,也没有部署到任何地方。只是用 dart run 起了一个本地文件,并在 Claude Desktop 的配置里登记了一行路径。

这篇文章从零把那个服务端做出来。走到最后,上面那张截图会在你的屏幕上复现。


为什么是服务端 —— 是适配器,不是演示

一说「用 LLM 做点什么」,通常想到的是提示词。可一旦模型需要读 我的数据 或执行 我的功能,光靠提示词就够不着了。每碰上一次,我们就贴一段各家客户端各不相同的对接代码。

MCP(Model Context Protocol)把这层连接统一成一份契约。服务端把自己拥有的功能作为 有名字的工具 暴露出来,模型用标准方式调用这些工具。做好一次的服务端,接 Claude Desktop 也好、接别的 MCP 客户端也好,都是同一份契约。

所以这篇文章做的服务端,本质不是「一个报温度的演示」,而是 把我的功能与数据按标准接到 LLM 上的一行适配器。作为例子挑的功能是 持久笔记本:对话结束也留得下的备忘,用四个工具来管。

工具做什么
note_add保存一条笔记(对话结束也留着)。
note_list按时间倒序列出已存的笔记(可按标签筛选)。
note_search找正文里含某个字符串的笔记(不区分大小写)。
note_delete按 id 删除笔记。

模型会根据对话的上下文,自己决定调这四个里的哪一个。我们要做的,只是定义这四个的 含义


这个服务端坐在哪儿

先把要做的东西放进全景里,正在写的代码负责到哪一层就清楚了。

[ LLM ]
   │
[ MCP 客户端 ]   ← Claude Desktop(以及下一篇的 mcp_client)
   │  JSON-RPC over stdio
   ▼
[ MCP 服务端 ]  ← 这篇文章要做的
   │            · 启动服务端(stdio)
   │            · 注册 4 个工具(名字·输入模式·处理器)
   ▼
[ notes.json ]  ← 持久保存

这篇文章的范围是虚线框,也就是 服务端+工具定义+保存。客户端那侧(Claude Desktop)用的是已有的东西,登记一下就用。自己动手做客户端,是下一篇的活。


此内容需要开发者或更高等级

登录并升级您的方案即可继续阅读。

查看方案
Twitter