当我决定搭一个 MCP 服务器的时候,我原以为会碰上一大堆 Web 框架的样板代码。结果恰恰相反:这是一个很小的程序,读一行 JSON、写一行 JSON,就这么简单。这就是整个工作。下面分享一下我怎么从零到做出一个能用的 hello-world 工具,以及你不用翻烂文档也能照着做。

你其实在搭什么

MCP 服务器就是一个按协议说话的程序。在报文层面上,它读一条请求、干活、再写一条响应。如果你觉得听起来像个小的命令行程序,那你理解对了。这场对话的规则是固定的,只要你对得上,任何 AI 客户端都能来跟你说话。这些具体报文在 JSON-RPC 2.0 逐行讲解 里有。

两条你必须处理的消息

你其实不需要一个框架也能合法。你只要把两件事答对。第一,当客户端问 tools/list 的时候,你回一个工具列表,带着每个工具的输入格式。第二,当客户端发 tools/call 带上工具名和参数时,你执行它并返回结果。剩下都是可选的。只要脑子里装着这条契约,其余就是管道而已。

一个最小的骨架

这是我用的 JavaScript 启动代码的样子。不是生产级,但能看出代码量有多小:

function handle(line) {
  const req = JSON.parse(line);
  if (req.method === "tools/list") {
    return { id: req.id, result: {
      tools: [{ name: "hello", description: "Greets a name",
                inputSchema: { type: "object", properties: { name: { type: "string" } } } }]
    }};
  }
  if (req.method === "tools/call") {
    return { id: req.id, result: {
      content: [{ type: "text", text: "Hello, " + (req.params.arguments.name || "world") }] }};
  }
  return { id: req.id, error: { code: -32601, message: "method not found" } };
}

这段代码对上了 协议指南 里的 JSON-RPC 格式。注意我还没搭 Web 服务器。用本地传输方式,我可以把它当 stdio 进程跑起来,直接就能用。

本地跑起来

第一次测试,最简单的传输方式是 stdio:客户端启动你的程序,把消息从标准输入灌进去、从标准输出读回来。这也就是为什么配置文件里到处都有 npx -y your-server 这种命令。配置 JSON 指南 讲了你要粘进 Claude、ChatGPT 或 Cursor 的那个 command 和 args 块。把这块写对通常是最麻烦的一步。

加一个别人真会用的工具

hello-world 文件教你格式,但真正有用的服务器暴露的是别人会调的工具。IPIPAI 的服务器就是通过 lookup_ip、rate_ip_node 等来做这件事,全部列在 /mcp-tools.json。如果你想看一个在线的服务器怎么自我介绍,这个文件就是 tools/list 响应在客户端说完话之后的完美示例。

先测再信

最便宜的做法是自己写个小脚本把这两条消息发出去,读一读响应。大多数失败根本不是协议问题,而是服务器没起来、包名写错或者 API key 过期。这个 连接排查清单 就是照这些元凶写的,所以当你的第一个真实客户端连不上时,你知道该往哪儿看。

最容易犯迷糊的地方

有三点让我意外。第一,起步不需要数据库也不需要 HTTP 栈。第二,同一个工具能跑在不同传输方式上,第一天别过度设计。第三,这套东西不需要别人去适配某个插件格式。你发布协议,所有兼容的助手通过发现机制找到你的工具。想看这套机制为什么有用,建议先读这篇 MCP 服务器白话入门。

收个尾

搭 MCP 服务器,说白了就是读一条请求、用正确的 JSON 格式写一条响应。先用 stdio 做最小版本,暴露一个有用的工具,然后看着它被真助手发现。接下来就是迭代。这个站点的其余 文章 能帮你继续了解周边生态,但核心真的就这么点。

搭建 MCP 服务器MCP 服务器教程从零写 MCP 服务器创建 MCP 服务器MCP 服务器代码mcp server 实现