# MCP · 从协议规范到 Server 实现 · Agent 实战 · 从零构建完备智能体

**作者** Aklman · **章节** 06 / 19 · **首发** 2026.07 · **语言** 中文为主, 中英双语
**原文** https://library.aklman.com/books/build-agent/06-mcp
**全书 markdown** https://library.aklman.com/books/build-agent/llms.md
**上一章** https://library.aklman.com/books/build-agent/05-reasoning/llms.md
**下一章** https://library.aklman.com/books/build-agent/07-code-execution/llms.md

> 本章来自 Aklman · Library, 完整免费阅读。允许 AI 摘读、引用、问答; 转载请保留作者署名与原文链接 (CC BY-NC-ND 4.0, https://library.aklman.com/license)。

---

> Model Context Protocol 是工具调用的标准化层 —— 一次实现，所有客户端都能用。

你给研究助手焊了 web_search、fetch_page —— 但只有它能用，换个客户端就得重写一遍。MCP（Model Context Protocol）是中间那一层标准：把工具从你的代码里解耦出来，实现一次，任何 MCP 客户端都能接。这一章讲它解决什么、怎么把研究助手的工具做成 server，以及接别人的 server 有什么风险。

### I · MCP 解决的是「N 个工具 × M 个客户端」的重复劳动

工具焊进一个 agent，只有它能用；做成一个 MCP server，任何客户端都能接。

没有 MCP，每个工具要为每个客户端（你的 agent、Claude、ChatGPT、VS Code、Cursor）各写一遍适配 ——N 个工具乘 M 个客户端的重复劳动。MCP 是中间的标准层，官方比喻是「AI 应用的 USB-C」：一次实现，到处接。[^1]

但 MCP 不是免费的抽象。如果你的工具只服务你自己一个 agent、永远不外接，直接 function calling（第三章）更简单。MCP 的价值，只在「同一个工具要被多个客户端用」或「你想接别人已经写好的 server」时才兑现。

---

### II · 一个 MCP server 暴露三种东西

MCP server 给客户端的不只是工具，是三类原语：tools（可执行动作）、resources（可读数据）、prompts（预制模板）。

tools 是模型可调用的动作（和第三章的 function 一一对应），resources 是客户端按 URI 取的可读数据，prompts 是可复用的提示模板。规范里最吃重的区分是「谁来控制」：tools 由模型控制、resources 由应用控制、prompts 由用户控制 —— 三者面向不同的发起方。传输有两种：stdio（本地子进程）和 streamable HTTP（远程，已取代旧的 HTTP+SSE）。[^2]用官方 Python SDK，实现一个 server 就是注册这几样：

_一个最小 MCP server（Python SDK，stdio）_
```text

```python
from mcp.server.fastmcp import FastMCP

mcp = FastMCP("research-tools")

@mcp.tool()
def web_search(query: str) -> str:
 """按查询搜索网页，返回结果列表。""" # docstring 就是给模型看的 description
 return search_web(query)

if __name__ == "__main__":
 mcp.run() # 默认 stdio 传输
```

```

别把所有东西都做成 tools。三类原语各有用途 —— 动作是 tools，数据是 resources，模板是 prompts。[^3]混着用，客户端就不知道该怎么把它们呈现给用户。

---

### III · 接别人的 server，风险和接第三方代码一样

MCP 最大的红利是生态 —— 一堆现成 server 可接；但接一个 server，等于让它进入你的信任边界。

一个第三方 MCP server 能读你给它的 resources、能执行它声明的 tools。接之前看清楚：它要什么权限、跑在哪（本地 stdio 子进程 vs 远程 HTTP）。远程 server 还多两件事 —— 鉴权和数据出境。[^1]这和「装一个第三方 skill」是同一类风险：你在把执行权交给别人的代码。

判断很简单：自己的数据和动作 → 自己写 server，跑本地 stdio；成熟的公共服务（GitHub、Notion 的官方 server）→ 接官方的；来历不明的 server → 当第三方代码审，或者别接。这条信任线，第 9 章会再系统地画一次。

动手 · 把一个工具变成 server，再审一个别人的 server：

- **把研究助手的一个工具包成 MCP server**:
 用 stdio 起一个最小 server，从一个 MCP 客户端（Claude Desktop 或你的 agent）连上它，跑通一次调用。

- **审一个你想用的第三方 server**:
 找一个你真想接的公共 server，列清楚：它声明了哪些 tools / resources、跑在本地还是远程、要不要交出数据。

- **给它一个信任判断**:
 据上面的审计写一句话结论:自己写、接官方、还是不接 —— 并说清你为什么信它。

> 焊进一个 agent，只你能用；
> 做成一个 server，谁都能接。

## 引用与参考

01 · Model Context Protocol · 官方文档 —— 连接 AI 应用与外部系统的开放标准，官方比喻为「AI 应用的 USB-C」；一次实现，任何 MCP 客户端（Claude、ChatGPT、VS Code、Cursor 等）都能接（build once, integrate everywhere）。截至 2026-05。  (modelcontextprotocol.io · Intro)
02 · MCP 规范 · 架构 —— server 暴露三种原语，按「谁控制」区分：tools（模型控制的可执行动作）、resources（应用控制的可读数据）、prompts（用户控制的预制模板）；基于 JSON-RPC 2.0；传输用 stdio（本地）与 streamable HTTP（远程，已取代旧 HTTP+SSE）。spec 按日期版本化，最新修订 2025-11-25。截至 2026-06。  (MCP · Specification)
03 · MCP Python SDK（modelcontextprotocol/python-sdk）—— 官方 SDK，FastMCP 用 @mcp.tool() 注册工具、mcp.run() 起服务。引用发布版本而非 main。  (GitHub · MCP Python SDK (releases))

---

*MCP · 从协议规范到 Server 实现 · Agent 实战 · 从零构建完备智能体 · Aklman 著 · CC BY-NC-ND 4.0 · https://library.aklman.com/books/build-agent/06-mcp*
