大家想学习更多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 个实际问题:

  1. MCP 到底解决了什么问题?
  2. Host、Client、Server 三层分别干什么?
  3. 一次工具调用从发起到回流模型上下文,完整链路是什么?
  4. stdio、本地 MCP、远程 HTTP MCP 分别适合什么场景?
  5. 工具 schema 应该怎么设计,模型才不容易选错?
  6. 怎么做一个真正能上线的、安全的 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,标准传输主要包括 stdioStreamable HTTP。[3]

3. Server:能力暴露层

Server 负责把外部能力标准化暴露出来,例如:

  • search_documents
  • fetch_ticket_detail
  • run_sql_readonly
  • create_jira_issue

根据工具规范,Server 需要声明工具名称、描述、输入 schema,以及返回内容。[4]

4. 为什么说模型 API Key 不该给 Server?

MCP 的一个重要设计点是:模型访问权通常由客户端/宿主掌控,而不是交给 Server
在 sampling 规范中,Server 可以请求 Client 发起模型采样,但依然由 Client 控制模型、权限和密钥。[7]
这对于企业场景极其关键:工具服务不应该直接拥有模型平台的完全控制权。


一次 MCP 工具调用到底怎么走:从用户提问到结果回流

摘要:理解 MCP 最好的方式,不是看定义,而是走一遍完整调用链路。

假设用户问:
“帮我查一下最近 7 天支付失败率升高的原因,并给出相关工单链接。”

一条典型链路大致如下:

第一步:Host 收到用户请求

Host 把用户问题交给模型,并把可用 MCP 工具上下文提供给模型。

第二步:模型判断是否要调用工具

如果工具描述足够清晰,模型会选择类似:

  • search_incidents
  • fetch_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:工具名太抽象

比如叫:

  • data
  • query
  • service_call

这种名字模型很难判断用途。
更好的方式是动作导向,例如:

  • search_incidents
  • fetch_document
  • create_support_ticket

OpenAI Developer mode 文档建议用明确动作名,并在描述里说明 何时使用。[8]

错误 2:一次暴露几百个工具

理论上可行,工程上却可能很糟。
工具越多:

  • 模型选择难度越高
  • prompt/token 成本越高
  • 误调用概率上升

Cloudflare 提出的 Code Mode 很有启发:不是把全部 API schema 展开给模型,而是只暴露 search()execute() 两个工具,通过搜索 API 能力再执行具体操作,从而将 token 成本大幅降低。[11]

这说明一个工程原则:
工具设计要追求“最小充分能力集”,而不是“全量罗列能力”。

一个好工具至少满足 4 点

  1. 名称动作明确
  2. 描述包含使用时机
  3. 输入 schema 简洁稳定
  4. 返回结果对模型友好

根据 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 条规则:

  1. 先写目的,再写细节
    例如“定义最小 MCP Server”“演示远程接入方式”,让读者先知道这段代码解决什么问题。

  2. 只注释关键步骤,不逐行翻译代码
    比如“这里做召回”“这里做详情抓取”“这里切 stdio 调试”,而不是把每一行 Python 语法解释一遍。

  3. 显式标注真实生产替换点
    如“这里可替换为 ES / 向量库 / SQL / 内部 API”,这对工程读者最有价值。

  4. 说明输入输出边界
    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,我建议按这个顺序学:

  1. 先理解架构:Host / Client / Server 分层 [2]
  2. 再做最小 server:从 search + fetch 开始 [1]
  3. 再理解传输:先 stdio,本地跑通后切远程 HTTP [3]
  4. 优化工具设计:减少歧义,控制工具数量 [4][8][11]
  5. 最后补安全与治理:授权、注入防护、统一托管 [1][6][9][10]

一句话收尾:
MCP 不难,难的是把“模型接工具”从 Demo 做成可治理、可扩展、可上线的工程系统。
你真正要学会的,不只是“怎么调工具”,而是怎么定义边界、怎么控制风险、怎么让模型在真实系统里可靠工作


参考资料

  1. Building MCP servers for ChatGPT and API integrations
    https://platform.openai.com/docs/mcp/

  2. Architecture overview - Model Context Protocol
    https://modelcontextprotocol.io/docs/learn/architecture

  3. Transports - Model Context Protocol
    https://modelcontextprotocol.io/specification/2025-11-25/basic/transports

  4. Tools - Model Context Protocol
    https://modelcontextprotocol.io/specification/2025-11-25/server/tools

  5. MCP connector - Anthropic
    https://docs.anthropic.com/en/docs/agents-and-tools/mcp-connector

  6. Connectors and MCP servers - OpenAI API
    https://platform.openai.com/docs/guides/tools-remote-mcp?lang=python

  7. Sampling - Model Context Protocol
    https://modelcontextprotocol.io/specification/2025-11-25/client/sampling

  8. ChatGPT Developer mode - OpenAI API
    https://platform.openai.com/docs/developer-mode

  9. Scaling MCP adoption: Our reference architecture for simpler, safer and cheaper enterprise deployments of MCP
    https://blog.cloudflare.com/enterprise-mcp/

  10. Authorization - Model Context Protocol
    https://modelcontextprotocol.io/specification/2025-11-25/basic/authorization

  11. Code Mode: give agents an entire API in 1,000 tokens
    https://blog.cloudflare.com/code-mode-mcp

Logo

欢迎加入 MCP 技术社区!与志同道合者携手前行,一同解锁 MCP 技术的无限可能!

更多推荐