MCP到底怎么学?一篇讲透大模型调用工具的原理、流程与实战
大家想学习更多AI知识,可以收藏下面两个网站:
GPTBUYS、ZeoAPI
很多工程师最近都在问同一个问题:MCP 到底是什么,它和 Function Calling、Agent、插件、Connector 有什么关系?
如果你已经在做 AI 应用,尤其是做企业知识库、自动化流程、AI IDE、内部系统接入,那么 MCP 几乎绕不过去。它不是一个“新名词包装旧能力”,而是在工程上把“模型如何稳定、安全、标准化地调用外部能力”这件事,真正协议化了。
这篇文章我尽量不讲玄学,只讲工程落地:MCP 的角色分层、调用流程、传输方式、工具设计、安全边界,以及如何快速写一个能接 OpenAI/Claude 生态的 MCP Server。
摘要
摘要:MCP(Model Context Protocol)本质是给大模型接工具、资源与提示能力的一套标准协议,核心价值是统一宿主、客户端、服务器之间的交互边界。
你可以把 MCP 理解为“大模型世界里的 USB-C 接口”。
它不是模型本身,也不是某一家厂商私有的插件机制,而是一套标准,让不同宿主应用、不同模型、不同工具服务,能够通过一致方式互联。
本文重点回答 6 个实际问题:
- MCP 到底解决了什么问题?
- Host、Client、Server 三层分别干什么?
- 一次工具调用从发起到回流模型上下文,完整链路是什么?
- stdio、本地 MCP、远程 HTTP MCP 分别适合什么场景?
- 工具 schema 应该怎么设计,模型才不容易选错?
- 怎么做一个真正能上线的、安全的 MCP Server?
MCP 先别神化:它解决的是“工具接入标准化”问题
摘要:MCP 的核心不是替代 function calling,而是把工具、资源、提示词和模型交互能力统一成标准协议,降低多系统集成成本。
根据 MCP 官方架构文档,MCP 里至少有三个核心角色:Host、Client、Server。[2]
- Host(宿主):真正承载用户体验的应用,比如 ChatGPT、Claude Desktop、IDE、企业内部 AI 门户。
- Client(客户端):负责与 MCP Server 通信的协议实现层。
- Server(服务器):把能力暴露出来,比如数据库查询、搜索、知识抓取、工单系统、代码执行、内部 API。
一个 Host 可以连接多个 MCP Server。[2]
这意味着你的 AI 应用不需要为每个外部系统单独写一套集成逻辑,而是统一通过 MCP 接入。
这和传统 function calling 的区别在于:
- function calling 往往是模型平台内部定义工具 schema
- MCP 是把工具能力外部标准化、协议化、可复用化
- 除了工具,MCP 还覆盖 resources、prompts、sampling 等机制 [2][4][7]
所以,MCP 不是“再来一套工具调用”,而是“把工具调用从单点实现升级为通用协议”。
MCP 架构怎么理解:Host、Client、Server 各自的边界
摘要:真正学会 MCP,关键不是记概念,而是搞清权限、状态、模型访问权分别掌握在哪一层。
从工程角度看,这三个角色的边界非常重要。
1. Host:用户入口与权限总控
Host 面向用户,也通常持有最终的交互上下文。
比如 ChatGPT、Claude 或一个企业 Copilot 页面,负责:
- 接收用户请求
- 决定是否允许某个 MCP Server 接入
- 控制工具是否可调用
- 决定最终哪些结果回显给用户
2. Client:协议适配层
Client 是 Host 内部的 MCP 实现。它做的事包括:
- 与 MCP Server 建连
- 发现工具列表
- 发送 JSON-RPC 请求
- 接收工具执行结果
- 处理多轮调用流程
MCP 官方传输规范明确说明,协议基于 JSON-RPC,标准传输主要包括 stdio 和 Streamable HTTP。[3]
3. Server:能力暴露层
Server 负责把外部能力标准化暴露出来,例如:
search_documentsfetch_ticket_detailrun_sql_readonlycreate_jira_issue
根据工具规范,Server 需要声明工具名称、描述、输入 schema,以及返回内容。[4]
4. 为什么说模型 API Key 不该给 Server?
MCP 的一个重要设计点是:模型访问权通常由客户端/宿主掌控,而不是交给 Server。
在 sampling 规范中,Server 可以请求 Client 发起模型采样,但依然由 Client 控制模型、权限和密钥。[7]
这对于企业场景极其关键:工具服务不应该直接拥有模型平台的完全控制权。
一次 MCP 工具调用到底怎么走:从用户提问到结果回流
摘要:理解 MCP 最好的方式,不是看定义,而是走一遍完整调用链路。
假设用户问:
“帮我查一下最近 7 天支付失败率升高的原因,并给出相关工单链接。”
一条典型链路大致如下:
第一步:Host 收到用户请求
Host 把用户问题交给模型,并把可用 MCP 工具上下文提供给模型。
第二步:模型判断是否要调用工具
如果工具描述足够清晰,模型会选择类似:
search_incidentsfetch_incident_detail
这里工具描述非常关键。OpenAI 在 Developer mode 文档里特别建议:
工具名要动作化,描述里明确写出 “Use this when…”,以提升模型选工具准确率。[8]
第三步:Client 向 MCP Server 发起调用
调用通过 JSON-RPC 发送,底层可能是:
- 本地
stdio - 远程
Streamable HTTP[3]
第四步:Server 执行真实逻辑
比如查询内部搜索引擎、工单系统、日志索引,返回结构化结果。
第五步:工具结果回流给模型
工具结果不是给用户直接看完就结束,而是会继续进入模型上下文,让模型基于结果总结、分析、生成答案。[4]
第六步:必要时进入多轮工具循环
如果模型发现需要补充上下文,还会继续调用更多工具。
而在更复杂场景下,Server 甚至可以通过 sampling 反过来请求 Client 帮它进行一次模型推理,形成代理式协作流程。[7]
这说明 MCP 不只是“一次函数调用”,而是可以支持多步工具链 + 受控推理循环。
传输与部署怎么选:stdio、本地 MCP、远程 HTTP 的工程取舍
摘要:MCP 好不好用,很多时候取决于你选了什么传输方式以及如何部署安全边界。
MCP 规范中,当前标准传输主要有两类:[3]
- stdio
- Streamable HTTP
其中 Streamable HTTP 已替代旧版 HTTP+SSE 作为规范重点。[3]
1. stdio:本地开发最快
适合:
- 本地桌面工具
- IDE 插件
- 单机调试
- 可信环境中的命令式工具
特点:
- 启动快
- 无需额外网络层
- 适合本地进程间通信
限制:
- 不适合公网接入
- 不方便集中治理
- 权限往往来自本地环境变量 [10]
2. Streamable HTTP:远程服务标准形态
适合:
- SaaS 化 MCP Server
- 企业统一托管
- 跨网络、多用户、多模型接入
规范要求服务端在同一路径支持 POST/GET,并关注 Origin 校验、DNS rebinding 防护、本地绑定 localhost、鉴权等安全要求。[3]
3. Claude / OpenAI 生态差异
Anthropic 文档说明,其 Messages API 可直接连接远程 MCP Server,但当前重点支持 tool calls,且要求服务器通过 HTTP 暴露,本地 stdio 不能直接连。[5]
OpenAI 侧则同时支持 ChatGPT Connectors、Developer mode、Responses API 中的远程 MCP 接入。[1][6][8]
4. 企业为什么更倾向远程托管?
Cloudflare 的企业架构文章提到,本地 MCP Server 会带来供应链风险、工具注入风险和治理困难,因此建议由中心化团队统一托管部署。[9]
工程上可以这样理解:
- 个人开发调试:先用 stdio
- 团队共享:转远程 HTTP
- 企业落地:统一托管、统一认证、统一审计
Key Comparison Table
摘要:不同接入方式没有绝对优劣,关键是根据安全、成本、治理和接入生态做取舍。
| Dimension | stdio 本地 MCP | Streamable HTTP 远程 MCP | OpenAI 远程接入 | Anthropic 远程接入 | 企业统一托管 |
|---|---|---|---|---|---|
| 典型场景 | 本地开发、桌面工具、IDE | SaaS 服务、跨网络接入 | Responses API、ChatGPT Connectors | Messages API 连接远程 MCP | 内部平台统一能力层 |
| 部署复杂度 | 低 | 中 | 中 | 中 | 高 |
| 安全边界 | 依赖本机环境与进程信任 | 可做认证、审计、网关治理 | 平台侧集成较强 | 支持 Bearer Token | 最利于统一管控 |
| 扩展性 | 一般 | 强 | 强 | 强 | 最强 |
| 适合多用户 | 弱 | 强 | 强 | 强 | 强 |
| 本地调试体验 | 最好 | 一般 | 一般 | 一般 | 较弱 |
| 凭据管理 | 常从环境读取 [10] | 推荐走 HTTP 授权规范 [10] | 平台+服务端双边控制 | 支持远程 HTTP 授权 [5] | 通常集中式密钥管理 |
| 风险重点 | 本地供应链、恶意 server | 暴露面、鉴权、Origin 校验 | 恶意 MCP 风险 [6] | 远程 server 信任 | 治理成本与平台建设 |
工具怎么设计才好用:不是越多越好,而是越准越好
摘要:MCP 工具设计的核心不是“把所有 API 都暴露出来”,而是让模型低歧义地选择正确能力。
很多团队第一次做 MCP,容易犯两个错误:
错误 1:工具名太抽象
比如叫:
dataqueryservice_call
这种名字模型很难判断用途。
更好的方式是动作导向,例如:
search_incidentsfetch_documentcreate_support_ticket
OpenAI Developer mode 文档建议用明确动作名,并在描述里说明 何时使用。[8]
错误 2:一次暴露几百个工具
理论上可行,工程上却可能很糟。
工具越多:
- 模型选择难度越高
- prompt/token 成本越高
- 误调用概率上升
Cloudflare 提出的 Code Mode 很有启发:不是把全部 API schema 展开给模型,而是只暴露 search() 与 execute() 两个工具,通过搜索 API 能力再执行具体操作,从而将 token 成本大幅降低。[11]
这说明一个工程原则:
工具设计要追求“最小充分能力集”,而不是“全量罗列能力”。
一个好工具至少满足 4 点
- 名称动作明确
- 描述包含使用时机
- 输入 schema 简洁稳定
- 返回结果对模型友好
根据 MCP Tools 规范,工具返回内容可以包含资源链接,这意味着工具和资源系统可以联动。[4]
比如搜索工具先返回文档 ID/URI,再由 fetch 去获取详细内容,这也是 OpenAI 官方构建远程 MCP Server 时建议实现的最小组合:search + fetch。[1]
实战代码示例
摘要:学 MCP 最快的方法,是先写一个最小可用 server,再让它接入实际模型平台。
下面给一个“知识搜索 + 文档抓取”的最小示例思路。
这类模式也是 OpenAI 官方文档强调的远程 MCP 基本能力组合。[1]
示例 1:定义一个最小 MCP Server 工具集
# 目的:定义一个最小 MCP Server,暴露 search / fetch 两个工具
# 关键点:工具名清晰、输入参数简单、返回结构可被模型二次消费
from fastmcp import FastMCP
mcp = FastMCP("knowledge-base")
DOCS = {
"doc-1": {"title": "支付失败排查手册", "content": "常见原因包括风控、库存锁定、下游超时。"},
"doc-2": {"title": "工单升级流程", "content": "P1 故障需 10 分钟内升级到值班负责人。"},
}
@mcp.tool()
def search(query: str) -> list[dict]:
# 根据查询词做简单匹配;真实场景可替换为 ES / 向量检索 / SQL
results = []
for doc_id, doc in DOCS.items():
if query in doc["title"] or query in doc["content"]:
results.append({
"id": doc_id,
"title": doc["title"],
"text": doc["content"][:80]
})
return results
@mcp.tool()
def fetch(id: str) -> dict:
# 按文档 ID 返回详情;这是 search 之后常见的第二跳能力
doc = DOCS.get(id)
if not doc:
return {"error": "document not found"}
return {
"id": id,
"title": doc["title"],
"content": doc["content"]
}
if __name__ == "__main__":
# 本地调试可先跑 stdio;后续再切到远程 HTTP 部署
mcp.run()
这个例子虽然简化,但思路很重要:
- search 负责低成本发现候选内容
- fetch 负责精确获取详情
- 不要一开始就把全文都塞给模型
- 先召回,再抓取,是更稳的工程模式
示例 2:通过 OpenAI API 接远程 MCP Server 的思路
# 目的:演示应用侧如何把远程 MCP 能力接给模型
# 关键点:模型侧只看到“可调用工具”,真实能力由远程 MCP Server 提供
from openai import OpenAI
client = OpenAI()
response = client.responses.create(
model="gpt-4.1",
input="请查找最近与支付失败率升高相关的内部文档,并总结主要原因。",
tools=[
{
"type": "mcp",
"server_label": "kb",
"server_url": "https://mcp.example.com/mcp",
# 如有鉴权,可按平台要求附加认证信息
}
]
)
print(response.output_text)
上面代码表达的是一个核心事实:
应用不一定自己手写完整 MCP Client 逻辑,平台侧已经在帮你把远程能力统一成模型可调用工具。
这也是 OpenAI 官方文档中 connectors 与 remote MCP 的重要落地方向。[6]
代码块注释规范
摘要:技术博客里的代码注释不要写成教程废话,要服务于“读者快速抓住关键点”。
我建议代码块注释遵守 4 条规则:
-
先写目的,再写细节
例如“定义最小 MCP Server”“演示远程接入方式”,让读者先知道这段代码解决什么问题。 -
只注释关键步骤,不逐行翻译代码
比如“这里做召回”“这里做详情抓取”“这里切 stdio 调试”,而不是把每一行 Python 语法解释一遍。 -
显式标注真实生产替换点
如“这里可替换为 ES / 向量库 / SQL / 内部 API”,这对工程读者最有价值。 -
说明输入输出边界
MCP 代码尤其要说明:工具输入 schema 是什么、返回结果给谁消费、是否会回流模型上下文。
安全与治理:MCP 真正难的不是写通,而是上线
摘要:MCP 的最大工程挑战不是开发,而是信任边界、授权模型、提示注入和统一治理。
OpenAI 官方文档明确提醒,MCP Server 可能带来 prompt injection、敏感数据暴露、第三方 server 信任 等风险。[1][6]
1. 第三方 Server 不要默认可信
如果你把一个不受控的 MCP Server 接给模型,相当于给模型开放了一条外部能力通道。
这条通道可能返回恶意内容,也可能诱导模型执行错误决策。
2. 注意 Prompt Injection
尤其是 search / fetch 类工具,返回的文本中可能夹带恶意指令。
工程上要做:
- 工具结果隔离
- 明确区分“工具输出”与“系统指令”
- 对高风险操作要求二次确认
3. HTTP 传输要做认证与来源校验
MCP 官方规范建议在 HTTP 场景中考虑授权规范,并注意:
- 认证
- Origin 校验
- DNS rebinding 防护
- 本地服务仅绑定 localhost(如适用)[3][10]
4. 企业要做统一托管与审计
Cloudflare 的企业实践很值得参考:
不要让每个团队各自拉一堆本地 MCP Server,而应由平台团队集中托管、集中授权、集中审计。[9]
一句话总结安全原则:
MCP Server 不是普通 SDK,而是“模型可操作现实世界”的能力出口。
常见问题与排错
摘要:MCP 接不通、模型不会调、工具老选错,通常都是边界定义和描述设计问题。
1. 模型明明有工具,却不调用
优先检查工具名和描述。
是否清楚写了用途、输入参数和 “Use this when…” 之类的使用时机提示。[8]
2. 工具总被选错
通常是工具过多、语义重叠、描述模糊。
收敛成更小的工具集合,或者采用 search + fetch / search + execute 模式更稳。[1][11]
3. 本地能跑,远程 HTTP 接不通
检查是否按规范支持对应传输方式,尤其是 Streamable HTTP 的路径、GET/POST 支持与认证配置。[3]
4. 远程服务存在鉴权问题
HTTP MCP 推荐遵循授权机制;本地 stdio 常从环境变量读凭据,远程则应使用明确的授权方案。[10]
5. 模型结果被工具返回内容“带偏”
重点排查 prompt injection。
不要把工具文本原样视为系统可信指令,尤其是第三方内容源。[1][6]
结语:MCP 的正确学习路径
摘要:MCP 最有效的学习方式不是背协议,而是按“最小工具集—传输方式—安全治理”三步走。
如果你准备真正掌握 MCP,我建议按这个顺序学:
- 先理解架构:Host / Client / Server 分层 [2]
- 再做最小 server:从
search+fetch开始 [1] - 再理解传输:先 stdio,本地跑通后切远程 HTTP [3]
- 优化工具设计:减少歧义,控制工具数量 [4][8][11]
- 最后补安全与治理:授权、注入防护、统一托管 [1][6][9][10]
一句话收尾:
MCP 不难,难的是把“模型接工具”从 Demo 做成可治理、可扩展、可上线的工程系统。
你真正要学会的,不只是“怎么调工具”,而是怎么定义边界、怎么控制风险、怎么让模型在真实系统里可靠工作。
参考资料
-
Building MCP servers for ChatGPT and API integrations
https://platform.openai.com/docs/mcp/ -
Architecture overview - Model Context Protocol
https://modelcontextprotocol.io/docs/learn/architecture -
Transports - Model Context Protocol
https://modelcontextprotocol.io/specification/2025-11-25/basic/transports -
Tools - Model Context Protocol
https://modelcontextprotocol.io/specification/2025-11-25/server/tools -
MCP connector - Anthropic
https://docs.anthropic.com/en/docs/agents-and-tools/mcp-connector -
Connectors and MCP servers - OpenAI API
https://platform.openai.com/docs/guides/tools-remote-mcp?lang=python -
Sampling - Model Context Protocol
https://modelcontextprotocol.io/specification/2025-11-25/client/sampling -
ChatGPT Developer mode - OpenAI API
https://platform.openai.com/docs/developer-mode -
Scaling MCP adoption: Our reference architecture for simpler, safer and cheaper enterprise deployments of MCP
https://blog.cloudflare.com/enterprise-mcp/ -
Authorization - Model Context Protocol
https://modelcontextprotocol.io/specification/2025-11-25/basic/authorization -
Code Mode: give agents an entire API in 1,000 tokens
https://blog.cloudflare.com/code-mode-mcp
更多推荐


所有评论(0)