第 08 篇 · MCP:让 Agent 跟外部生态对接
Tools: read_file、write_file、list_files这种可以真正执行动作的函数Skills: SKILL.md这种方法论,让 Agent 知道某类任务应该怎么做
这两种能力都在我们的项目内部实现的,工具写在 backend/app/tools/,技能写在 skills/,Agent 启动时自己扫描、自己注入、自己执行。
今天我们要接入第三类能力:MCP
MCP = Model Context Protocol,Anthropic 在 2024 年 11 月开源的一个协议,它关注的不是某一个具体工具,而是如何以统一、标准的方式,把外部系统的能力、数据和上下文暴露给模型使用。
MCP 是一套标准,让 Agent 不只会调用自己项目里的 Python 函数,还能连接一个外部工具服务,发现它有哪些工具,并按统一格式调用它们。
我们先来看看我们之前在系统中是如何使用工具的
工具函数和Agent在同一个python进程里面,可用工具通过registry 注册到模型中, 模型推理后需要调用工具比如 read_file 的时候,Agent就在本地的 registry 找到 execute() 方法就直接执行了。
如果我们使用了MCP,它们最大的区别是中间多了一个独立的Server:
在 MCP 体系中,Agent不会直接调用工具,而是通过协议连接到一个 MCP Server。这个 Server 可以对外提供多种能力,例如工具调用、资源读取、上下文查询等,Agent通过 MCP Client 与之通信。
这里有一点需要注意。模型仍然只能看到工具,它不知道也不关心这个工具是本地Python函数,还是MCP Server。
变化的是Agent runtime,之前是Agent直接调用本地函数,有了MCP,Agent通过MCP Client发送JSON-RPC消息,让MCP Server 执行工具。
这就是 MCP 和 Tools 的关系:Tools 是模型可调用能力的形态,MCP 是把这些能力跨进程、跨项目、跨生态暴露出来的协议。
为什么需要MCP
如果我们的Agent功能比较单一,工具也比较少,没有接入外部能力的需要,不用MCP也是可以的,在我们的Agent中 自己实现需要的工具即可。
大多数的时候,我们要开发一个比较通用一点的Agent,基本都会遇到和外部系统打交道,都需要一些外部业务系统的能力。
当然 这个时候,我们也可以直接开发一套工具,用来接入外部系统,这样也是可以的。 但是你开发的这些工具就不能给其他Agent复用了。
比如 公司要开发销售Agent,订单Agent,它们都需要接入用户系统,查询用户信息,这个时候,如果没有MCP,那么2个Agent都要自己去开发一些工具去查询用户信息,如果我们使用MCP 就只需要开发一次,后面所有需要查询用户信息的Agent,只需要接入这个用户MCP就行。
还有一个问题,就是维护,比如查询用户增加一个新的查询函数返回用户明细,如果是MCP 那么我们只需要改一下MCP Server,就行了,Agent端是无感的,什么都不需要去改。如果你自己开发的工具 就要去改Agent的代码,新增一个工具才行。
MCP 解决是:外部生态能力的复用和标准化。
MCP 里最重要的三个概念
1. Server 暴露能力
一个 MCP server 可以暴露三类能力:
tools:可以调用的动作,比如 read_file、search_issuesresources:可以读取的上下文,比如某个文档、某张表、某个 URI prompts:预定义提示词模板
真实项目里最常用的是 tools,其他resources和prompts 基本不会在这里使用。
2. Client 负责连接和调用
Agent 不直接跟 server 的内部函数打交道,而是通过 MCP client 发请求:
initialize 建立会话
tools/list 列出 server 暴露了哪些工具
tools/call 调用某个工具
这些请求底层走 JSON-RPC。我们不需要手写 JSON-RPC 包,Python SDK 已经封装好了。
3. Transport 决定消息怎么传
MCP 常见传输方式有三种:
stdio:把 MCP server 当子进程启动,通过 stdin/stdout 通信。本地 server 最常用。 streamable HTTP:通过 HTTP 连接远程 server,适合公司内部统一部署。
这一篇的动手案例用 stdio。