你之所以来到这里,是因为你已经见识过 Claude、GPT、Gemini 等大型语言模型(LLM)的非凡威力。你或许用它们做出过很棒的东西,见过它们生成有创意的文本,甚至写出出乎意料的好代码。
但你八成也撞过墙。
你让一个 LLM 做件很简单的事------大一计算机系学生闭着眼都能搞定的那种------结果却眼睁睁看着它惨败。你既惊叹又沮丧:这些强大的模型在某种意义上就像被关在一间没有窗、没有工具的数字小黑屋里。
本书要做的,就是把那扇门踹开。我们要给你的 AI 配齐与真实世界交互的工具,而这一切的钥匙,是一个开创性的全新规范:模型上下文协议(Model Context Protocol,MCP) 。
在本章,你将从全局把握要点,了解:
- 问题:为何即便最先进的 LLM 也有根本性局限。
- 解决之道:MCP 是什么,以及它如何把 AI 与外部世界的通信标准化。
- 生态:Anthropic、Microsoft、Google 等巨头如何押注 MCP。
- Python 版图 :你将在整本书里使用的关键库 mcp 与 fastmcp。
让我们开始吧!
LLM 的致命弱点
想象你正使用最新最强的 LLM。你给它一个看起来很简单的任务。
你: 这个字符串里有多少个字符:
'Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Hello World. I am not supposed to be here.'
?
如果你在 2025 年 7 月 把这个问题问 Claude Sonnet 4,你可能会得到这样的回答:
LLM: 我来帮你数一下这个字符串的字符数。该字符串包含 553 个字符(包括空格、标点和所有其他字符)。这包括经典的 Lorem ipsum 文本以及末尾附加的 "Hello World. I am not supposed to be here."。
差一点,但还不对。作为 Python 开发者,你知道精确答案只需一行代码:
图 1:用 Python 统计字符数
vbnet
text = 'Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Hello World. I am not supposed to be here.'
print(len(text))
# 输出:488
LLM 是语言与模式的大师,但它并不像计算机那样"计数"。它是在预测最可能的 标记序列,很多时候它的"答案"只是一种猜测。
这不只是数数的问题。LLM 常见的挣扎包括:
- 精确算术:让一个 LLM 计算两个 10 位数的乘积,它可能会非常自信、但非常错误。
- 实时信息:LLM 的知识在训练时就被冻结了。它不知道今天的天气、当前股价或最新新闻。
- 访问私有数据:它不能读取你的本地文件、查询你公司的数据库、或查看你的日程。
LLM 的世界是纯文本的世界,与我们的应用所处的实时、数据驱动、计算精确的世界隔绝开来。
"胶带式"方案:函数调用(Function Calling)
那么,如何弥合这道鸿沟?当前的主流做法常被称为函数调用 或工具使用。
思路很简单:你写一个包裹 LLM 的程序,这个程序作为"编排器"(orchestrator):
- 接收用户的提问。
- 把提问和一组可用"工具"(比如你的
len
函数)一起传给 LLM。 - LLM 不直接回答,而是返回一条特殊消息说:"我需要对这个字符串使用
character_counter
工具。" - 你的编排器看到后,用提供的字符串去调用真正的 Python
len()
。 - 得到结果(488)并把它发回给 LLM。
- LLM 现在拿到了正确信息,最后生成给人看的回答:"这个字符串一共 488 个字符。"
在 OpenAI 的接口里,你可以在聊天补全方法中提供 tools 参数,甚至不必自己写完整的编排程序。
MCP 登场:AI 的 USB-C 接口
Anthropic(Claude 背后的公司)在 2024 年 发布了 Model Context Protocol(MCP) 规范。
把 MCP 想象成 AI 世界的 USB-C。
在 USB-C 之前,你的抽屉里塞满了各种不同的线:手机一根、相机一根、移动硬盘又一根,乱成一团。USB-C 把这一切统一成了一个标准接口。你不再关心电或数据是怎么传的------插上就能用。
MCP 对 AI 工具 做了同样的事。它是一个开放协议 ,把 AI 模型如何发现 并通信 外部工具与数据源进行了标准化。
不管工具是一个简单的 Python 函数、一个复杂的 API,还是一次数据库查询------只要它"会讲" MCP,任何兼容 MCP 的 AI 都能连上它。
官方架构
从本质上说,MCP 定义的是一个客户端---服务器架构:
- MCP Host(宿主) :想要使用工具的应用,比如 AI 聊天机器人、IDE(如 VS Code),或者你自建的智能体。
- MCP Server(服务器) :暴露特定能力的轻量程序。你可以有一个用于文件系统操作,另一个用于日历,再一个用于访问 Spotify API。
- MCP Client(客户端) :运行在 Host 里,负责管理与一个或多个 MCP Server 的连接。
这种关注点分离 非常强大:你可以独立地构建、更新和部署工具(服务器),而无需改动使用它们的应用(宿主)。
这绝非纸上谈兵。各大科技公司已经上车:Microsoft 在 Build 2025 上宣布把 MCP 作为 Windows 11 中安全 AI 智能体 的基础层;Google 则在发布在云端部署 MCP 服务器的官方教程。整个行业正在围绕 MCP 汇聚,视其为构建可互操作 AI 世界的标准。
想象有人为自家智能灯光系统做了一个 MCP 服务器,能控制亮度和颜色;与此同时,你做了一个 Python 冥想应用,帮助用户放松。你们互不知道对方的产品。
但因为你的应用会"说" MCP,它能自动发现并连接 那个灯光服务器。你无需写一行 灯光相关的代码,你的应用就能在冥想时自动调暗灯光、设置舒缓的色调。做灯光服务器的人也不必预见到你的应用,但他们的服务器就这样无缝增强了 你的功能。
这就是 MCP 生态的力量:一个偶然却通用的插件世界。
双库记:mcp 与 fastmcp
作为 Python 开发者,你已经跃跃欲试:从哪儿开始?
在 Python 世界里,MCP 生态主要由两个关键库构成,而它们的故事也很有意思。
官方库:mcp
由定义该协议的团队 Anthropic 维护,具有以下特点:
- 严谨:严格遵循 MCP 规范。
- 权威:协议的参考实现。
- 活跃:由制定协议的团队持续维护。
当你需要稳定、合规的实现时,它就是你的首选。
强力选手:fastmcp
fastmcp
的故事是开源世界的经典。开发者 Jeremiah Lowin 构建了一个高层库,让开发 MCP 服务器变得异常简单、Pythonic。它好到什么程度?------第一版 直接被合入了官方的 mcp
库。
但 Jeremiah 并未止步。他希望以快于官方规范 的速度继续创新、加功能,并打造一个用于托管 MCP 服务器的 SaaS 平台。于是,一个全新、独立的库诞生了:也叫 fastmcp (有时称 fastmcp v2 以示区分)。
它的特点:
- 更自由 :包含许多官方规范里尚未收录的实用特性。
- 更高层:优雅、干净的 API,常常只需一个装饰器就能把 Python 函数变成工具。
- 更受欢迎 :文档优秀、易上手,深得社区青睐。甚至 Google 的官方 Cloud Run 教程也采用它来示范部署 MCP。
该选哪个?
下面用一个"调用某处 API 的简单工具"为例,看看两者的哲学差异。
mcp
(官方范式)
图 2:mcp
代码示例
csharp
async def run():
async with streamablehttp_client(MCP_SERVER_URL) as (read, write, _):
async with ClientSession(
read,
write,
logging_callback=log_handler
) as session:
await session.initialize()
await session.call_tool("call_api_somewhere",
progress_callback=progress_handler)
fastmcp v2
(极速范式)
图 3:fastmcp v2
代码示例
csharp
client = Client(transport=StreamableHttpTransport(MCP_SERVER_URL),
log_handler=log_handler)
async def main():
async with client:
await client.call_tool("call_api_somewhere",
progress_handler=progress_handler)
那么,哪个更好?
答案是:现在下结论还早 。MCP 生态正以惊人的速度演进。mcp
提供稳固的地基 ,而 fastmcp
则在可用性与速度上不断突破边界。
因为两者对理解当下 MCP 的实务版图 同样重要,本书将两条线都覆盖 :既讲解使用 mcp
掌握官方协议 ,也教你用 fastmcp
高效生产、快速构建。
关键要点
你刚刚迈出了通往更大世界的第一步。在动手写代码之前,先回顾本章的核心思想:
- LLM 强大但有根本性限制:它们无法独立进行精确计算,也不能自行获取实时数据。
- 传统的函数调用 只是为解决这些问题而出现的定制化、非标准方案。
- MCP(模型上下文协议)是一个开放标准,就像 USB-C 一样:任何会"说"该协议的工具都能与任意 AI 连接。
- MCP 正在催生一个偶然形成的通用插件生态:为某一目的构建的工具可以被任何人复用。
- 对 Python 开发者 而言,两个关键库是官方的 mcp 与高层、流行的 fastmcp。
你已对版图有了基本把握。下一章我们将撸起袖子,搭建开发环境,构建第一个简单的 MCP 服务器。让我们开始实干吧!