MCP 基础:AI Agent 如何连接世界
Model Context Protocol 是一项开放标准,让 AI 模型能够以一致的方式调用工具、读取实时数据并复用提示词模板——适用于任何提供商、任何运行时。
每个 AI Agent 最终都需要做超越生成文本的事情。它需要搜索网页、读取文件、调用 API、查询数据库。问题是:怎么做?
在 MCP 出现之前,每个团队都用不同的方式解决这个问题。一个 Agent 框架有自己的插件格式,另一个有自己的工具调用规范。更换模型或运行时往往意味着重写所有集成代码。
MCP 就是解决方案。它是一个开放协议——由 Anthropic 维护,被 OpenAI、Google 以及数十家工具厂商采用——为 AI 模型连接外部能力定义了单一标准。
三种角色:Host、Client、Server
MCP 有三个参与者:
流程始终是:Host → Client → Server → Client → Host → Model。模型从不直接与服务器通信,Client 是中间人。
这种分离非常重要。Host 可以执行安全策略(允许哪些服务器),Client 可以处理身份验证,而 Server 则专注于暴露能力。
三种原语:Tools、Resources、Prompts
每个 MCP 服务器恰好通过三种原语来暴露其能力:
模型可以调用的函数。每个工具都有一个名称、一段描述(供模型用来决定何时调用它),以及一个用于输入的 JSON Schema。例如:
search_web
,
run_sql_query
,
create_github_issue
.
Tools 是最常用的原语。当模型决定调用某个工具时,Client 会执行它,并将结果作为上下文返回给模型的下一步。
Host 可以附加到上下文中的静态或实时数据。Resources 通过 URI 标识(例如,
file:///path/to/file.txt
,
postgres://db/schema
)。与 Tools 不同,Resources 是被读取的——它们不执行代码。
由 Host(而非模型)决定包含哪些 Resources。这对安全性很重要:模型可以请求 Resources,但读取操作由 Host 批准。
可以接受参数并生成结构化消息的预构建提示词模板。用户可以显式调用它们(就像 Claude Desktop 中的斜杠命令)。例如:一个
/summarize-pr
提示词,接受一个 PR URL 并生成一个评审模板。
Tools(模型控制)、Resources(应用控制)和 Prompts(用户控制)之间的划分是有意为之的。它清晰地对应了每一项决策应该由谁来做——并使权限和信任的推理更加容易。
协议:JSON-RPC 2.0
在底层,MCP 使用 JSON-RPC 2.0——一种简单的请求/响应格式,每条消息都包含 method、params 和 id:
// Client asks server what tools are available
{ "jsonrpc": "2.0", "id": 1, "method": "tools/list", "params": {} }
// Server responds
{
"jsonrpc": "2.0", "id": 1,
"result": {
"tools": [
{
"name": "search_web",
"description": "Search the web for current information",
"inputSchema": {
"type": "object",
"properties": { "query": { "type": "string" } },
"required": ["query"]
}
}
]
}
}
// Client calls the tool
{
"jsonrpc": "2.0", "id": 2,
"method": "tools/call",
"params": { "name": "search_web", "arguments": { "query": "MCP protocol 2025" } }
}JSON-RPC 2.0 还支持 notifications——一种没有 id 的单向消息,不需要响应。服务器在长时间运行的操作中使用它们来推送进度更新(例如,在搜索完成时流式传输部分结果)。
两种传输方式:本地与远程
MCP 通过两种传输机制工作:
客户端启动一个本地进程(例如 Python 或 Node.js 脚本),并通过 stdin/stdout 进行通信。所有消息都是按换行符分隔的 JSON。用于本地工具:文件系统访问、运行 shell 命令、读取本地数据库。无需网络。
客户端向远程服务器发送 HTTP POST 请求。响应可以是纯 JSON,也可以是用于流式传输的服务器发送事件(SSE)。用于远程服务器:SaaS 工具、共享团队服务器、云 API。支持无状态和有状态模式。
实践中:本地开发工具使用 STDIO,因为它更简单且不需要网络配置。生产级 Agent 系统使用 Streamable HTTP,以便多个客户端可以共享一个服务器。
发现机制是如何工作的
当客户端连接到服务器时,它做的第一件事是 初始化 —— 交换协议版本和能力:
- 客户端发送 initialize,附带其支持的协议版本
- 服务器响应其版本和能力标志(是否支持资源?提示词?流式传输?)
- 客户端发送 initialized 通知以完成握手
- 客户端调用 tools/list、resources/list、prompts/list 来发现服务器暴露了什么
- 宿主将工具列表注入到模型的系统提示词中,使其知道自己可以调用什么
从这里开始,模型可以在对话的任何时刻调用任何工具。客户端负责执行,并将结果作为新的上下文返回。模型看到工具结果后决定下一步做什么。
这对 FDE 为什么重要
作为前沿部署工程师,你会被要求在客户系统之上构建 AI 驱动的工作流。MCP 直接影响你处理这些工作的方式:
- 工具设计 —— 当你把客户的 API 暴露为 MCP 工具时,工具描述的写法决定了模型能否正确使用它们。模糊的描述会导致错误的调用。
- 安全边界 —— 工具可能有副作用(写入数据库、发送邮件)。你需要考虑暴露哪些工具、添加什么样的审批流程,以及如何防止模型执行破坏性操作。
- 传输方式选择 —— 本地 STDIO 服务器更简单,但无法共享。远程 Streamable HTTP 服务器可以扩展到团队使用,但需要考虑认证和可靠性。
- 调试 —— 当一个 Agent 失败时,往往是因为某个工具返回了意外的 schema,或者模型选择了错误的工具。理解 JSON-RPC 跟踪信息对调试至关重要。
MCP 也越来越多地被要求作为客户项目中的标准交付物。当客户要求你“与他们的内部工具集成”时,构建一个 MCP 服务器往往是最干净的答案 —— 它可以与 Claude、Cursor 以及任何其他兼容 MCP 的宿主配合使用,且不受供应商锁定。
核心要点
主机 / 客户端 / 服务器——三种角色,界限清晰。模型从不直接调用服务器。
工具 / 资源 / 提示——用于操作、数据和模板的三种原语。
JSON-RPC 2.0——简单、可检查的传输格式。用任何 HTTP/日志工具都易于调试。
本地用 STDIO,远程用 Streamable HTTP——根据谁需要连接来选择。
发现发生在连接时——客户端列出所有内容,主机将其注入上下文。