Jean's Blog

一个专注软件测试开发技术的个人博客

0%

MCP 模型上下文协议介绍:架构、能力与适用边界

什么是 MCP

MCP(Model Context Protocol,模型上下文协议)是一套连接 AI 应用与外部系统的开放协议。它通过统一的消息格式、能力协商和传输方式,让 AI 应用可以发现并使用外部服务器提供的工具、资源与提示模板。

本文依据 MCP 2026-07-28 规范MCP Python SDK v2 整理。MCP 仍在持续演进,运行旧项目时应先确认协议版本和 SDK 主版本。

官方资料:

可以把 MCP 类比为 AI 应用的“USB-C 接口”:它统一的是连接方式和交互协议,而不是替代模型、Agent、业务 API 或权限系统。

MCP 连接 AI 应用与外部系统

MCP 不是什么

理解 MCP 时,要避免几个常见误区:

误区 更准确的理解
MCP 是一种模型 MCP 与模型无关,不提供推理能力。
MCP 就是工具调用 工具只是 MCP 服务端能力之一,MCP 还定义资源和提示模板等能力。
MCP 可以替代 API MCP Server 通常仍需调用数据库、HTTP API、文件系统或其他底层接口。
接入 MCP 后 Agent 就安全了 MCP 统一通信,但权限、认证、参数校验、审计和人工确认仍需应用负责。
模型直接连接 MCP Server 通常是 AI 应用中的 MCP Client 与 Server 通信,模型只看到宿主应用选择后提供的能力。

MCP 的核心架构

MCP 核心架构

MCP 采用 Host—Client—Server 架构:

角色 职责 示例
Host 面向用户的 AI 应用,负责模型调用、权限策略、上下文管理和用户交互。 IDE、桌面助手、Agent 应用
Client Host 内部与某个 MCP Server 建立会话的协议组件。通常一个 Client 对应一个 Server 连接。 MCP SDK Client、LangChain MCP Adapter
Server 对外暴露工具、资源、提示模板等能力。 文件系统服务、数据库服务、地图服务
外部系统 MCP Server 实际访问的数据源或业务系统。 数据库、HTTP API、文件系统、浏览器
graph LR
    U[用户] --> H[MCP Host / AI 应用]
    H --> L[LLM]
    H --> C1[MCP Client A]
    H --> C2[MCP Client B]
    C1 <-->|MCP| S1[MCP Server A]
    C2 <-->|MCP| S2[MCP Server B]
    S1 --> D1[文件系统 / 数据库]
    S2 --> D2[地图 / 搜索 / 业务 API]

需要特别注意:MCP Host 才是安全与控制边界。Host 决定连接哪些 Server、向模型展示哪些能力、是否执行调用,以及是否需要用户确认。


MCP Server 提供的核心能力

MCP Server 应用场景

MCP Server 最常见的三类能力是 Tools、Resources 和 Prompts。

能力 控制方 用途 例子
Tools 通常由模型选择、Host 批准并执行 执行计算或产生外部操作 查询天气、写文件、创建工单
Resources 通常由应用选择并读取 向上下文提供可寻址的数据 文档、配置、数据库 Schema
Prompts 通常由用户或应用显式选择 提供可复用的消息模板和工作流入口 代码审查模板、周报模板

此外,协议还包含日志、进度通知、能力协商等机制;Client 侧还可选择支持采样(Sampling)、用户信息征询(Elicitation)等能力。是否支持某项能力,应以初始化阶段协商出的 capabilities 为准,不能默认对端全部支持。


MCP 与 Function Calling、API、Agent 的关系

graph TD
    A[Agent / AI 应用] --> B[大模型 LLM]
    A --> C[运行时与权限控制]
    C --> D[本地函数 / LangChain Tool]
    C --> E[MCP Client]
    E --> F[MCP Server]
    F --> G[数据库 / API / 文件系统]

四者处于不同层级:

  • Function Calling / Tool Calling:模型输出“调用哪个工具及参数”的结构化决策;
  • MCP:Host 与外部能力提供方之间的标准协议;
  • API:真实业务系统提供的底层接口;
  • Agent:把模型、上下文、工具、状态和执行循环组织起来的完整系统。

一次典型调用过程是:

1
2
3
4
5
6
7
8
用户提出目标
→ Host 获取 MCP Server 的工具定义
→ Host 将允许使用的工具提供给模型
→ 模型生成工具调用请求
→ Host 校验权限和参数
→ MCP Client 请求 MCP Server 执行工具
→ Server 调用外部系统并返回结果
→ Host 将结果交给模型继续推理

因此,MCP 标准化的是能力发现与调用链路,并不让模型绕过 Host 直接操作外部系统。


MCP 的价值与边界

主要价值

  • 统一接入方式:不同 Host 可以使用同一种协议连接不同 Server;
  • 动态能力发现:Client 可查询 Server 当前提供的工具、资源和提示模板;
  • 关注点分离:Agent 负责决策,Server 负责对接具体外部系统;
  • 跨语言与跨进程:协议不绑定单一编程语言,可用于本地进程或远程服务;
  • 生态复用:同一个 Server 可以被多个兼容 MCP 的 Host 使用。

常见的“M×N 降为 M+N”是一种帮助理解的理想化比喻。实际项目仍可能需要处理认证、数据模型、版本兼容、错误语义和厂商扩展,因此不能把 MCP 理解成完全零适配的“即插即用”。

不适合强行使用 MCP 的情况

  • 应用只调用一两个稳定的内部函数;
  • Client 与能力实现位于同一进程,并且没有复用需求;
  • 现有 REST / gRPC API 已能很好地满足确定性系统调用;
  • 业务要求极低延迟,而额外的协议层没有带来足够收益。

MCP 的优势主要体现在:需要让多个 AI Host 以统一方式发现和调用可复用能力时


本地 Server 与远程 Server

类型 常用传输 适用场景 注意事项
本地 MCP Server stdio 访问本机文件、命令行、IDE 或本地数据库 Host 通常负责启动子进程;stdout 只能传协议消息
远程 MCP Server Streamable HTTP 云服务、团队共享能力、远程数据源 必须使用 HTTPS,并做好认证、授权和 Origin 校验

“访问本地资源只能运行本地 Server”并不是绝对规则:远程 Server 也可以访问它所在机器或网络中的资源。真正的区别是资源位于哪里、Server 运行在哪里,以及 Host 是否允许访问


Python 快速开始

安装依赖

1
2
pip install "mcp[cli]"
pip install langchain-mcp-adapters

MCP Python SDK v2 与 v1 的部分导入路径和 API 不兼容。旧项目升级前应阅读官方迁移指南,不要只修改版本号。

创建一个最小 MCP Server

1
2
3
4
5
6
7
8
9
10
11
12
13
from mcp.server import MCPServer

mcp = MCPServer("Math Server")


@mcp.tool()
def add(a: int, b: int) -> int:
"""计算两个整数之和。"""
return a + b


if __name__ == "__main__":
mcp.run("stdio")

在 stdio 模式下,通常不需要手动提前启动 Server。Host / Client 会根据 commandargs 创建子进程。

在 LangChain Agent 中加载 MCP 工具

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
import asyncio

from langchain.agents import create_agent
from langchain_mcp_adapters.client import MultiServerMCPClient

from src.core.llms import model_client


async def main() -> None:
client = MultiServerMCPClient(
{
"math": {
"transport": "stdio",
"command": "python",
"args": ["/absolute/path/to/math_server.py"],
}
}
)

tools = await client.get_tools()
agent = create_agent(
model=model_client,
tools=tools,
system_prompt="你是计算助手,必要时调用工具完成计算。",
)

result = await agent.ainvoke(
{"messages": [{"role": "user", "content": "计算 (3 + 5) × 12"}]}
)
print(result["messages"][-1].content)


if __name__ == "__main__":
asyncio.run(main())

langchain-mcp-adapters 的主要作用是把 MCP Server 暴露的工具转换为 LangChain Tool,并提供连接多个 Server 的客户端封装。它不是 MCP 协议本身。


安全建议

连接 MCP Server 相当于为 AI 应用增加外部能力,至少应做到:

  1. 只连接可信 Server,不直接运行来源不明的本地命令;
  2. 对文件、网络、数据库和命令执行采用最小权限;
  3. 在删除、付款、发布、发送等不可逆操作前要求人工确认;
  4. 不要把密钥写进提示词、日志或工具描述;
  5. 验证工具参数和返回值,不把工具输出自动视为可信内容;
  6. 远程 Server 使用 HTTPS、认证、授权和审计;
  7. 对工具调用设置超时、费用预算和最大重试次数。

小结

MCP 的核心不是“让模型拥有更多工具”,而是为 AI 应用与外部能力之间建立一个标准化、可协商的连接层:

Host 负责用户体验与安全控制,Client 负责协议通信,Server 负责暴露能力,模型负责推理与决策。

下一篇将介绍 MCP 的消息基础以及 stdio、Streamable HTTP 两种标准传输方式。