大家想学习更多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

摘要:不同接入方式没有绝对优劣,关键是根据安全、成本、治理和接入生态做取舍。

Dimensionstdio 本地 MCPStreamable HTTP 远程 MCPOpenAI 远程接入Anthropic 远程接入企业统一托管
典型场景本地开发、桌面工具、IDESaaS 服务、跨网络接入Responses API、ChatGPT ConnectorsMessages 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

更多推荐