读懂 MCP:能力、传输与多 Server 连接

第一次接触 MCP,很多人会把它理解成"给 AI 调工具的协议"。然后问题很快就来了:既然都有 Tool,为什么还需要 Resources 和 Prompts?本地程序为什么常用 stdio,线上服务又为什么推荐 Streamable HTTP?如果一个 Agent 同时连接 GitHub、数据库和内部知识库,它到底在连接谁,又怎么知道有哪些工具可以调用?

这些问题看似分散,其实都指向同一个核心:MCP 解决的不是某个工具怎么调用,而是 AI 应用如何用统一方式发现、连接和使用外部能力。

以下讨论以当前 MCP 2026-07-28 规范为基础。这个版本进一步强化了无状态 HTTP、能力发现和可缓存的列表结果。

Tools、Resources、Prompts,区别在"谁控制什么"

理解这三个概念,最简单的方法不是背定义,而是看控制权。

**Tool 是给模型"做事"的。**例如搜索订单、创建工单、查询天气、执行 SQL。模型看到 Tool 的名称、描述和输入 Schema 后,可以根据当前任务决定是否调用,因此它更接近"能力"或"函数"。

**Resource 是给应用"提供材料"的。**例如项目文件、数据库 Schema、Git 历史、内部文档。Resource 通常通过 URI 标识,Host 决定什么时候把这些内容加入模型上下文,因此它更像可读取的"资料"。官方也将 Resources 定义为 application-controlled。

**Prompt 是给用户复用工作方式的。**比如"代码审查""生成周报""分析事故原因"。它不是执行能力,而是一套预定义的消息或指令模板,通常由用户主动选择。

假设你做一个 GitHub MCP Server:create_issue 应该是 Tool;repo://README.md 可以是 Resource;"Review this PR"则适合做 Prompt。

判断时问三个问题就够了:这是让模型执行动作,还是给模型提供内容?还是提供一套可复用的交互模板?

stdio 适合"Agent 和 Server 在同一台机器"

stdio 可以理解成最直接的本地管道。

Agent 启动 MCP Server 子进程,然后通过标准输入发送请求,通过标准输出接收响应。例如一个桌面 AI 编程助手启动本地文件 MCP Server:

Agent → stdin → MCP Server → stdout → Agent

这种方式的优势是简单。不需要端口,不需要部署 HTTP 服务,也通常不需要额外考虑网络认证。官方 SDK 将 stdio 定位为本地、由进程启动的集成方式。

所以它特别适合 CLI、IDE、桌面应用、本地文件访问,以及开发和调试阶段。

但如果 Server 需要被多人访问、部署在云端、经过网关或独立扩缩容,stdio 就会变得别扭。它解决的是本地进程通信,并不是远程服务治理。

Streamable HTTP 适合真正的远程 MCP 服务

把 MCP Server 做成公司级服务时,Streamable HTTP 更自然。

例如企业内部部署一个 Salesforce MCP Server。几十个 Agent 都需要访问它,这时你希望有统一域名、鉴权、日志、限流、负载均衡和水平扩容。这些正是 HTTP 基础设施已经解决很多年的问题。

MCP 2026-07-28 又进一步把协议核心改为无状态模式:请求可以独立处理,不再依赖之前的协议级 Session;Streamable HTTP 请求还可以通过 Mcp-MethodMcp-Name 等 Header 被网关直接路由。

因此可以用一个简单经验判断:

Server 跟着 Agent 一起运行,优先考虑 stdio;Server 是独立网络服务,优先考虑 Streamable HTTP。

这也是为什么 MCP 官方目前把两者作为主要传输方向:stdio 面向本地部署,Streamable HTTP 面向远程部署。

一个 Agent 连接多个 Server,靠的是 Host 做编排

另一个常见误区,是想象 Agent 自己维护一条"万能 MCP 连接"。

更准确的结构是:

Agent / Host → MCP Client A → GitHub Server

       → MCP Client B → Database Server

       → MCP Client C → Files Server

Host 可以管理多个 MCP Client,而每个 Client 对应一个 Server。这样每个 Server 保持独立,Host 再把可用能力汇总给模型。MCP 的架构设计本来就强调多个 Server 的组合与隔离。

真正需要设计的是工具目录。

假设 GitHub Server 和 Jira Server 都暴露一个 search Tool,只把两个 search 塞给模型,很容易混淆。Host 往往需要保留来源信息,甚至映射成类似 github.searchjira.search 的命名,然后在模型发起调用时,把请求路由回原来的 Server。

所以"连接多个 MCP Server"的难点并不在连接数量,而在能力聚合、命名冲突、权限控制和调用路由

Tool Discovery,不等于让模型猜工具

MCP Server 不需要在 Prompt 里告诉模型:"我有五个工具,你记一下。"

它有正式的发现机制。

Client 可以调用 tools/list,Server 返回当前可用 Tool 的名称、描述和输入 Schema;如果数量很多,还可以分页。模型随后根据这些描述决定调用哪个 Tool。

这里还要区分两个容易混淆的概念。

server/discover 是发现这个 Server 支持什么协议版本和能力tools/list 才是发现它具体提供哪些 Tools。在新版 MCP 中,前者是可选的能力预发现,后者才直接对应 Tool Discovery。

同理,Prompts 有 prompts/list,Resources 有 resources/list。新版规范还让这些列表带缓存信息,避免客户端每次请求都重新拉取整个能力目录。

真正需要理解的,是 MCP 的分层

如果只记住 Tool、stdio、HTTP 这些名词,很快还是会乱。

更实用的方式,是把 MCP 看成三层。

最上面是能力层:Tools 负责行动,Resources 提供上下文,Prompts 提供可复用交互模板。

中间是协议层:负责发现能力、描述参数、调用方法和返回结果。

最下面是传输层:stdio 解决本地进程通信,Streamable HTTP 解决远程服务通信。

一个 Agent 可以连接多个 Server,是因为 Host 在这些层之上完成连接管理、能力聚合和路由。

因此,设计 MCP 系统时不要先问"我要写几个 Tool"。先画一张图:哪些能力属于哪个 Server,它运行在哪里,谁应该看到它,谁有权调用它,Agent 又如何发现它。

这张图画清楚之后,Tools、Resources、Prompts、stdio、Streamable HTTP 和 Tool Discovery,往往都会自然找到自己的位置。

相关推荐
SamChan9011 分钟前
Python+ReportLab自动生成PDF翻译质量审计报告:从数据到可视化的完整方案
开发语言·python·ai·pdf·wpf
深念Y11 分钟前
Makefile vs go run:Go 项目构建方式对比
java·开发语言·golang·k8s·编译·流水线·cicd
whcyhhh12 分钟前
头歌实践教学平台:数据科学与大数据技术导论(十八2)
大数据·开发语言·python
智圣新创0118 分钟前
存量数字化校园升级破局:从基础数据集成到校务服务全域提效的通用落地路径
大数据·人工智能·物联网
AI的探索之旅19 分钟前
97 个 OpenCV 实例(十二):仪表自动读数,从图像处理到落地项目
人工智能·opencv·计算机视觉·ai
我命由我1234522 分钟前
Android Camera - 获取当前设备屏幕的旋转角度、保存帧到外部存储的私有空间
android·java·开发语言·java-ee·android jetpack·android-studio·android runtime
新知图书29 分钟前
9.2 客户支持聊天机器人-项目架构设计
人工智能·agent·ai agent·智能体
SamChan9030 分钟前
用Prometheus+Grafana搭建PDF翻译服务监控看板:指标采集与告警实战
python·ai·pdf·grafana·prometheus·机器翻译
niuniudengdeng36 分钟前
从小程序到 WebView:一个理发店管理系统的全栈架构设计与落地实践
java·python