AI Agents with MCP(一份让 AI 和外部工具对话的共同规矩)— 全书拆解
30 秒导读: 一个只会写字的模型(那台读进一段文字、再一个字一个字往下续写的机器), 想真的动手改变外面的东西,必须有人替它去跑; 跑完还得把结果送回去,让它接着想下一步。这本书教你从零写出那个「替它跑」的程序。
它有两个特别之处,决定了该怎么读它: 第一,它是半成品——九章里只有两章写出来了,而且那两章里还有四节只有标题; 第二,它教的写法刚被改掉——书稿封笔一年后,那份共同规矩自己变了形, 打招呼、连接状态、断点续传一起被删。
所以本组拆解的做法是:把使用方那一侧从头讲通一遍(第 01–10 章), 再拿最后两章去认出哪几块地基已经被换掉了(第 11、12 章)。 书里缺的地方我们照官方规范补上,并且每一处都标明「这不是书里的」。
1. 先交代清楚:这是谁在什么时候写的
| 作者 | Kyle Stratis——一家数据咨询公司的创始人兼首席顾问,做过十来年软件工程师1 |
| 出版 | O'Reilly 早期试读版(Early Release):作者边写边放出来,内容未经编辑2 |
| 时间 | 第一次放出是 2025 年 7 月,正式版预告在 2026 年 5 月2 |
| 完成度 | 目录列了九章,标着「可用」的只有两章3 |
三件事必须先说,否则会误读这本书。
第一,它真的只写了两章。 第 1 章讲什么是智能体(一个能自己决定下一步做什么的模型),第 3 章讲怎么写使用方那一侧; 中间那一章——本该专门讲那份共同规矩本身的——目录里明明白白标着「不可用」3。 本组拆解里凡是讲规矩本身的部分,都是我们照官方文档补的,每一处都单独标了出处。
第二,书里的代码是草稿,不是能跑的东西。 名字拼错、括号多一个、 作者自己留的待办事项(「☒ 逐行讲一遍 ✅ 2025-05-07」这种)原样印在正文里。 我们照它讲机制,但不照它抄代码。
第三,作者是实践者不是规范作者。 他讲的是「用官方的 Python 工具包怎么把这件事做出来」, 不是「规矩为什么这么定」。这也是为什么第 11、12 章那些改动他一个字都没提到—— 书稿封笔的时候,那些改动还不存在。
2. 全书一条主线(读完这一节,你就懂了这本书)
下面这条链从头贯到尾,每一步都是被上一步逼出来的。 只读这一节、不看任何拆解章,你也能把这本书讲给别人听。 细节全部留给对应的章节,这里只讲「发生了什么、为 什么只能这样」。
① 你想让它动手,可它只会写字
现在的聊天机器人背后是一台大语言模型(读进一段文字、再一个字一个字往下续写的机器)。 它的输出只有文字——没有手,没有网线,碰不到你的任何一个文件。
所以「帮我把这个文件的测试补上」这句话,它自己完不成。 要么有人替它去跑,要么它只能告诉你该怎么做。
② 于是外面配一段程序,替它跑
替它跑的那段程序,行话叫工具。模型不去执行工具—— 它只是在回复里写下一句「我要用 X、参数(要交给它的那几个值)是 Y」,然后停住。 真正去跑的是外面那个程序,跑完把结果原样递回去。
③ 递回去之后,它接着想——这一来一回转成了一个圈
拿到结果,它可以说「够了,答案是这个」,也可以说「 不对,再来一次」。 于是同一个动作重复几圈,直到它自己说停。
关键在最后半句:是它自己说停,不是代码规定转几圈。 这个圈就是智能体(一个能自己决定下一步做什么的模型)和普通聊天机器人的全部区别。 (为什么「用了工具」还不算智能体,第 01 章讲。)
④ 但这条来回的路,过去每换一个模型都要重铺一遍
问题出在:每家模型厂商收工具的格式都不一样。 3 个模型 × 10 个工具 = 30 段几乎一模一样的接线代码; 换成一份大家都认的写法,只要 3 + 10 = 13 段。
省下的 17 段不是省了打字的功夫,是省了 17 个各自会坏的地方。 (这道乘法题怎么算、为什么重复的那部分最容易出 bug,第 03 章讲。)
⑤ 那份共同的规矩,是照着代码编辑器那边现成的思路做的
2024 年底,Anthropic 放出了模型上下文协议(Model Context Protocol,缩写 MCP)。 它的形状是:提供方按一份规矩把自己能干的事摆出来,使用方按 同一份规矩去问、去调, 双方谁也不必知道对方是谁做的。
这个点子不是凭空来的——代码编辑器那边早就用同一招解决过形状一样的一道题。 (抄的是哪一招、三个角色各叫什么,第 03 章讲。)
⑥ 这本书站在使用方这一侧,从零把那个程序写出来
① 把提供方启动起来,或者连上去 → 第 04 章
② 问它「你都能干什么」,拿回一张清单 → 第 05 章
③ 把清单摊给模型,让它挑一件 → 第 05 章
④ 替它跑掉,把结果送回去,再问第二遍 → 第 05 章
⑤ 除了「能干的事」,还能要数据、要话术 → 第 06 章
⑥ 反过来:把自己的模型借给对方用 → 第 07 章
图说:①到④是一条主干,⑤⑥是从主干上分出来的两根岔。
每一根岔都复用①到④那套「先要清单、再挑一个用」的动作。
这里有一件事值得先记住:提供方能给的三类东西——能干的事、只读的数据、写好的话术—— 调法完全一样,都是「先要清单,再挑一个用」。 学会第一类,另外两类只是换个方法名。
⑦ 写到一半会撞上两堵墙
第一堵:提供方一多,清单就长到模型看不完。 连五台提供方、一百多个工具是很平常的事,而光是这些工具的说明书, 就可能比用户那句话长七千多倍——而用户那句话还一个字没被读到。 (这个倍数怎么算出来的、按什么口径量、怎么把它压下去,第 09 章讲。)
第二堵:提供方一搬到别人的机器上,手里的凭证该给谁就成了一道会出事的题。 最直觉的做法——把你的凭证交给提供方、让它替你去调第三方——被规范明令禁止。 (为什么禁、正确的形状长什么样,第 10 章讲。)
⑧ 而这本书刚写完不久,那份规矩自己改了一次形
改动的起因不在设计,在部署:远程提供方必须同时开好几份副本来扛量, 而这几份之间不共享内存——你这条请求落到哪一份是随机的。
于是「提供方记着你上次说过什么」这件事根本没法保证。 它被整个取消之后,一连串东西跟着塌: 打招呼没地方存结果、断线没法续传、提供方也不能再主动朝你发问。
这不是一堆零散的修订,是同一条理由推出来的一串后果。 (前四级怎么推出来的,第 11 章讲;后两级和全书的结账单,第 12 章讲。)
⑨ 所以这本书真正的读法
照着它把使用方那一侧从头写通一遍,再拿最后两章去认出哪几块地基已经被换掉了。
被换掉的是连接怎么建立那一层;仍然成立的是三类东西、先要清单再挑一个用、 以及宿主/使用方/提供方的分工——而这三样,恰恰是这本书讲得最细的地方。
3. 十二章地图
这张表不用记任何术语——每一章后面写的是「读完你能回答什么问题」。
| 章 | 读完你就能回答 |
|---|---|
| 01 什么是「智能体」 | 它和聊天机器人到底差在哪?为什么「用了工具」还不够? |
| 02 智能体,还是写死的流程? | 同一个需求两种做法,分叉点在哪?为什么线上跑着的多半是写死的那种 |
| 03 MCP 要解决的那件事 | 30 变 13 是怎么算出来的?那份共同的规矩到底规定了什么? |
| 04 接上一台提供方 | 连一台提供方,从敲命令到「连上了」中间发生了什么?这一章是全书的地基 |
| 05 工具 | 模型怎么表示「我要用这个」?结果怎么送回去?这一章是全书的主干 |
| 06 另外两类:数据与话术 | 除了「能干的事」,还能从提供方要到什么?怎么塞给模型? |
| 07 反过来:把模型借出去 | 方向反过来会发生什么?为什么这一章讲的东西最容易让你破财 |
| 08 连接不是干净的管子 | 一次跑三分钟的调用,中间你能看到什么?线断了怎么办? |
| 09 五台提供方、一百八十个工 具 | 工具多到模型读不完时怎么办?还有:这活值不值得你自己干 |
| 10 三种被坑法 | 哪三件事做错会真的出事?正确的形状分别长什么样? |
| 11 那份规矩自己变了形 | 最新规范拆掉了哪三样地基件?为什么理由只有一条? |
| 12 塌下来的其余部分 | 全书落点: 这本书哪几部分作废了、哪几部分仍然成立? |
推荐顺序: 01 → 02 → 03 → 04 → 05,这五章是连贯的一条链,别跳。 06 到 10 可以按需要挑着读。11 和 12 一定要读,否则你会照着一套已经换代的写法去动手。
只想拿结论的话:本页第 2 节 + 第 12 章。
4. 这本书覆盖什么、不覆盖什么
覆盖(而且是别处不容易看到的角度):
- 使用方那一侧的完整实现路径:连接、列清单、调用、把结果送回模型;
- 三类东西(能干的事 / 只读数据 / 写好的话术)各自的取法与用法,以及它们在设计上各归谁挑;
- 反向能力:把自己的模型借给提供方,以及那道必须拦在付钱之前的人工确认;
- 官方 Python 工具包的实际手感——包括哪些地方它当时还没做好,作者写得很坦白;
- 连多 台提供方时的连接管理、工具重名、以及换模型要补的那层翻译。
不覆盖(别指望在这本里找):
| 缺什么 | 说明 |
|---|---|
| 规矩本身 | 专门讲那份规矩本身的那一章,目录里标着「不可用」3;本组拆解的这部分全部取自官方规范 |
| 提供方怎么写 | 整本书只站在使用方这一侧;提供方那三章一个字没有 |
| 两种线路的内部构造 | 书里反复说「第 5 章会讲」,而第 5 章不存在 |
| 授权 | 书里只出现了一个 auth 参数和一句「后面会讲」,那一节没写出来 |
| 智能体的应用与案例 | 第 1 章的「怎么用 / 能带来什么 / 真实案例 / 别的同类规矩」四节只有标题 |
| 2026 年之后的规范 | 书稿封笔早于那次改动,第 11、12 两章全部是我们补的 |
查官方文档时的说法对照
这不是术语表,是一张跳转用的对照表。 我们在正文里尽量用大白话,但你去查官方文档时看到的是另一套词:
| 我们的说法 | 官方文档里的词 |
|---|---|
| 两条线路 | transport(中文常译「传 输层」) |
| 打招呼 | initialize / initialization |
| 要一张清单 | tools/list、resources/list、prompts/list |
| 挑一个用 | tools/call、resources/read、prompts/get |
| 三类东西 | primitives |
| 一份东西的地址 | URI(网址那一类的地址写法) |
| 借用你的模型 | sampling |
| 反过来问用户一句 | elicitation |
| 只准在这几个目录里动 | roots |
| 一张有期限的通行凭据 | access token |
| 按需查找(先搜再取,别一次全塞) | progressive tool discovery |
| 让模型写脚本去调工具 | programmatic tool calling(也叫 code mode) |
| 问一句「你都支持什么」 | server/discover |
5. 我们的判断
判断(我们的,不是书里的): 这本书今天的价值排序是三档,从高到低—— ① 使用方的实现路径(仍然成立);② 官方工具包的实际手感与坦白(有时效但有用); ③ 连接怎么建立那一层的具体写法(已被换代)。 引用它的时候引 ① 和 ②,别引 ③ 里的报文顺序。 如果错,会错在: 如果绝大多数实现在未来几年仍然停在旧写法上(而规范只是纸面上换了代), 那么 ③ 就不该被降级——它会是实际工程里最常用的那一套。判据是: 主流工具包默认发的是哪一代请求。
判断(我们的,不是书里的): 这本书最值得带走的一条,不在 MCP 上, 而在第 02 章那条分界线:「这条路你事先知不知道」—— 知道就写死,不知道才交给模型。 一个系统里绝大多数环节属于前者。 把这条用对,比学会任何一条规矩的细节都省钱。 如果错,会错在: 如果模型的可靠性提高到「交给它挑也几乎不会错」的程度, 那么写死路线换来的那份「每次都走同一条路」就不再值那个开发成本,这条判断会反过来。
判断(我们的,不是书里的): 早期试读版这种半成品,只适合当实现指南读,不适合当参考手册用。 它有四节只有标题、一章整章缺失、代码里有拼写错误—— 这些不是瑕疵,是它的形态。拿它入门可以,拿它核事实不行。 如果错,会错在: 如果正式版把缺的章补全并修掉代码错误,这条判断只适用于早期试读版, 不适用于 2026 年 5 月之后的正式版。
6. 许诺兑现表
正文里每一处往后指的话都记在这里,全书写完逐行核过—— 核两件事:那一节真的讲了吗?讲的是不是许诺的那件事,而不是同名的另一件事。
左栏是许诺的意思,不是逐字原文:本页一律用「提供方 / 使用方」这套说法, 而章节里用的是它们的行话名字,照抄过来会让这一页凭空多出一堆没解释的词。 引号里带「…」的,表示只摘了那句话里指路的那半截。
| 许诺在哪 | 应兑现在哪 | 核过了 |
|---|---|---|
index.md §2 ③ 「为什么『用了工具』还不算智能体」 | 01 §4「判定标准:下一步由谁挑」 | ✅ |
index.md §2 ④ 「这道乘法题怎么算、为什么重复的那部分最容易出 bug」 | 03 §2「30 和 13:这两个数怎么算出来的」 | ✅ |
index.md §2 ⑤ 「抄的是哪一招、三个角色各叫什么」 | 03 §4「从代码编辑器那边抄来的」、03 §5「三个角色」 | ✅ |
index.md §2 ⑦ 「这个倍数怎么算出来的、按什么口径量、怎么把它压下去」 | 09 §5「上下文预算」(口径与七千多倍怎么来的)、09 §6「按需查找」 | ✅ |
index.md §2 ⑦ 「为什么禁、正确的形状长什么样」 | 10 §5「借凭证那一刀」、10 §6「要验哪几样」 | ✅ |
index.md §2 ⑧ 「前四级怎么推出来的」 | 11 §3–§6(第一级到第四级) | ✅ |
index.md §2 ⑧ 「后两级和全书的结账单」 | 12 §2、12 §3(第五、六级)、12 §6(结账单) | ✅ |
01 §2 「工具清单具体是怎么送到模型手里的」 | 05 §3「模型怎么表示『我要用这个工具』」——清单是在这一节被摊给模型的;05 §2 讲的是一条工具描述长什么样,不是同一件事 | ✅ |
01 §6 「后面凡是补上的内容都会当场标明不是书里的」 | 各章末的「边界」节 + 全部 ② 类脚注 | ✅ |
03 §3 「这一格填的是什么,第 05 章还会细讲一遍」 | 05 §2「列清单:一个工具在使用方手里长什么样」 | ✅ |
03 §5 「它可能跟你跑在同一台机器上(第 04 章讲这种)」 | 04 §2「本机线路」 | ✅ |
03 §5 图说「模型和提供方之间隔着宿主,第 05 章会反复用到」 | 05 §3「模型怎么表示要用工具」、05 §5「把结果送回模型」 | ✅ |
03 §5 「一对一那条硬规矩会在第 09 章变成麻烦」 | 09 §1「连五台怎么办」 | ✅ |
04 §1 表「远程线路安全上要注意(第 10 章讲)」 | 10 §4「先问一句这条请求是谁发来的」 | ✅ |
04 §2 「为什么这句话比它看起来严重得多」 | 10 §3「一股脑全传过去等于把家底给了它」 | ✅ |
04 §3 「第 08 章讲的进度都要靠它送回来」 | 08 §3「进度:每一步报一个数」、08 §4「让它把话说到你这边来」 | ✅ |
04 §3 「这条长连接后来被整个换掉了」 | 12 §3(第六级:改成由使用方登记一条长回话) | ✅ |
04 §7 「取消打招呼的理由,整条推导在第 11 章」 | 11 §3「第一级」、11 §4「第二级」 | ✅ |
05 §2 「说明含糊就挑错,这一点会在第 09 章变成真正的麻烦」 | 09 §5「上下文预算」 | ✅ |
05 §4 「另两种块等讲完第 06 章再回头认」 | 06 §6「回头认领第 05 章欠的两种块」 | ✅ |
05 §6 「这句话在第 09 章会变成一整节」 | 09 §3「换模型:还差一层翻译」 | ✅ |
05 §7 「这正是第 09 章最后那条路的前提」 | 09 §7「让模型写代码去调工具」 | ✅ |
05 §8 「两条治法都在第 09 章」 | 09 §5、09 §6 | ✅ |
06 §1 「第 8 节会把三类东西各归谁挑列成一张表」 | 06 §8「三类东西各归谁管」(章内) | ✅ |
06 §9 「省下的篇幅要花钱,这笔账第 09 章算」 | 09 §5「上下文预算」 | ✅ |
06 §9 表「清单中途变了…(第 08 章讲)」 | 08 §6「另起一处走查」后半段 + 08 §7「边界」(工具包当时没做好) | ✅ |
06 §9 表「那两个登记方法已被换掉(第 12 章)」 | 12 §3(第六级) | ✅ |
07 §2 「它的真面目要到第 4 节才露出来」 | 07 §4「主走查续:再读一个文件」(章内) | ✅ |
07 §4 「防坏提供方的那些手段在第 10 章」 | 10 §4–§7(校验来源、不转手、验收件人、一次同意被用第二遍) | ✅ |
07 §5 「这条规矩在第 10 章会以另一个形式再出现一次」 | 10 §5「你手里那张不能转出去」 | ✅ |
07 §6 图说「第 08 章…也用同一个套路」 | 08 §4「让它把话说到你这边来」(挂一个函数接住) | ✅ |
07 §6 「这个套路会在第 09 章撞上一堵墙」 | 09 §1「替你管五份连接的那个东西挂不上函数」 | ✅ |
07 §7 「为什么要这么改,整条推导在第 11 章」 | 11 §6(第四级:改成先回一句「我还缺东西」) | ✅ |
08 §5 「第 12 章会告诉你,正是这个要求让它被删掉了」 | 12 §2(第五级:断了只能整条重发) | ✅ |
08 §7 末「这条路后来被列进移除队列(第 12 章那张表里有它)」 | 12 §6 那张表里对应的那一行 | ✅ |
08 §7 「那条『提供方主动往长连接上推』的路被整个换掉了(第 12 章)」 | 12 §3(第六级) | ✅ |
09 §4 表里那句「(第 10 章讲那些风险)」 | 10 §4「先问一句这条请求是谁发来的」、10 §7「一次同意被用了第二遍」 | ✅ |
11 §4 表「(第 6 节讲它干什么)」 | 11 §6(章内) | ✅ |
11 §5 表「能存多久(第 12 章 §4)」 | 12 §4「顺手加上的:保鲜期」 | ✅ |
11 §6 末「第 12 章把它们推完」 | 12 §2、12 §3 | ✅ |
12 §2 「但那已经不是核心的一部分了(见第 5 节)」 | 12 §5「核心之外的东西搬去了扩展」(章内) | ✅ |
逐行核过之后改掉的四处:
- 原先有一行写「
02§3 →05§2」,但第 02 章 §3 并没有往后指过任何东西,那一行是虚记的,已删; - 另有一行把第 09 章回看第 07 章的回指错记成了许诺,也已删;
- 「
01§2 工具清单怎么送到模型手里」原先记的兑现处是05§2,那一节讲的是另一 件事 (一条工具描述长什么样),已改记到真正回答它的05§3; - 第 08 章原先还许诺过「它被列进移除队列的理由和另外两样是同一个」—— 规范只登记了改用什么,从头到尾没有给理由,补不出来, 所以那半句已经删掉,只留「后来被列进移除队列」;第 12 章 §6 也把这件事照实写了出来。
拆解写于 2026-08-25,依据 O'Reilly 早期试读版(2025-07-07 第一次放出)。原始书籍文件不入库,
本组文档是我们自己的重写;每条书内引用都可用
node scripts/book-verify.mjs ai-agents-with-mcp 回核。
凡标「补充(不在书里)」的说法,来源写在该处脚注里。