MCP(模型上下文协议)是由 Anthropic 推出的开放标准化协议,核心解决 AI 应用于外部工具、数据源的无缝集成问题,通过统一的接口让 AI 应用可动态获取上下文、调用外部能力,被称为AI 界的 USB-C,实现工具 / 数据的 “即插即用”。本文基于 MCP 官方文档提炼核心概念、架构、交互流程,助你快速上手 MCP 开发与使用。让我们快速开始吧!

一、MCP 核心定位与价值
1. 核心定义
MCP 是专注于AI 应用与外部系统的上下文交换协议,仅定义交互标准,不限制 AI 应用对大模型(LLM)的使用和上下文管理方式,是连接 AI 应用与外部工具 / 数据的标准化桥梁。
2. 核心价值
- 标准化集成:将 AI 应用与工具的集成复杂度从M×N(每个工具适配每个应用)简化为M+N(各自独立开发,遵循协议即可对接);
- 本地 / 远程灵活支持:支持本地私有数据 / 工具调用(数据不离境,满足隐私合规)和远程服务对接,兼顾安全性与扩展性;
- 动态适配:通过实时通知机制实现工具 / 资源的动态更新,AI 应用可实时感知外部能力变化;
- 生态兼容:微软、阿里云、Anthropic 等厂商均支持 MCP,多语言 SDK 覆盖,可跨平台复用。
3. 适用场景
- AI 应用调用本地文件系统、数据库、私有 API;
- 智能 IDE(如 VS Code、Claude Code)对接代码分析、调试工具;
- AI Agent(智能体)获取实时数据(如天气、业务报表)并执行操作;
- 企业级 AI 应用对接内部 ERP、CRM 等业务系统。
二、MCP 核心架构
MCP 采用客户端 – 服务器(C/S)架构,分为三层核心要素:参与角色、协议分层、核心原语,所有交互基于JSON-RPC 2.0实现。
1. 三大参与角色
MCP 的交互由三个核心角色完成,角色间一对一 / 一对多关联,本地 / 远程部署均可。
表格
|
角色 |
核心职责 |
示例 |
|
MCP Host(主机) |
协调管理多个 MCP 客户端,是发起请求的 AI 应用主体,聚合所有 MCP 服务器的上下文 / 能力 |
Claude Code、Claude Desktop、VS Code、GitHub Copilot |
|
MCP Client(客户端) |
与 MCP 服务器建立专属连接,转发 Host 的请求,接收并回传服务器的响应 / 上下文 |
AI 应用内的 MCP 客户端组件(由 SDK 封装) |
|
MCP Server(服务器) |
提供上下文数据、可执行工具、交互模板,响应客户端的请求 |
本地文件系统服务器、Sentry 远程服务器、天气 API 服务器 |
部署说明:
- 本地服务器:基于Stdio 传输,仅服务单个 MCP 客户端(如 Claude Desktop 启动的文件系统服务器);
- 远程服务器:基于Streamable HTTP 传输,可服务多个 MCP 客户端(如 Sentry 官方 MCP 服务器)。
2. 两层协议架构
MCP 的协议分为数据层和传输层,底层解耦,数据层定义交互规则,传输层定义通信方式,保证同一交互规则可跨传输方式复用。
(1)数据层(核心)
基于JSON-RPC 2.0实现,定义客户端与服务器的消息结构、语义、交互逻辑,是开发者最需要关注的层,包含四大能力:
- 生命周期管理:连接初始化、能力协商、连接终止;
- 服务器能力:提供工具、资源、提示词三大核心原语;
- 客户端能力:支持服务器调用 LLM、向用户获取输入、日志上报;
- 通用能力:实时通知、长任务进度跟踪。
(2)传输层
定义客户端与服务器的通信机制、认证方式,屏蔽底层通信细节,支持两种传输方式:
表格
|
传输方式 |
通信方式 |
特点 |
适用场景 |
|
Stdio |
标准输入 / 输出流 |
无网络开销、性能最优,仅本地进程通信 |
本地 MCP 服务器(如文件系统、本地数据库) |
|
Streamable HTTP |
HTTP POST + 可选 Server-Sent Events(SSE) |
支持远程通信,兼容标准 HTTP 认证(Bearer Token/API Key/OAuth) |
远程 MCP 服务器(如公共 API、云端服务) |
三、MCP 核心原语(Primitives)
原语是 MCP 定义的最小交互单元,规定了服务器和客户端可相互提供的能力,是 MCP 的核心设计,分为服务器原语、客户端原语、通用工具原语三类。
1. 服务器核心原语(对外提供的能力)
服务器向客户端暴露三大核心原语,均支持*/list(发现)、*/get(获取)方法,工具还支持tools/call(执行)方法,实现动态发现和调用。
表格
|
原语 |
核心作用 |
示例 |
关键方法 |
|
Tools(工具) |
可执行的函数,AI 应用调用后完成特定操作 |
文件读写、数据库查询、API 调用、计算器 |
tools/list/tools/call |
|
Resources(资源) |
提供上下文数据的数据源,为 AI 应用补充信息 |
文件内容、数据库表结构、API 响应结果 |
resources/list/resources/read |
|
Prompts(提示词) |
可复用的交互模板,规范 AI 与 LLM 的交互 |
系统提示词、少样本示例、工具调用模板 |
prompts/list/prompts/get |
示例:一个数据库 MCP 服务器可暴露:
- 工具:数据库查询 / 插入函数;
- 资源:数据库表结构、字段说明;
- 提示词:数据库查询的少样本示例。
2. 客户端核心原语(向服务器开放的能力)
客户端向服务器暴露能力,让服务器可借助 MCP Host 的能力实现更丰富的交互,无需自己集成 LLM 或用户交互模块:
- Sampling(采样):服务器调用 Host 的 LLM 生成内容,通过sampling/complete实现,适用于模型无关的服务器开发;
- Elicitation(启发):服务器向用户请求额外信息 / 确认操作,通过elicitation/request实现;
- Logging(日志):服务器向客户端发送日志,用于调试和监控。
3. 通用工具原语(实验性)
Tasks(任务):为长时请求提供持久化执行封装,支持延迟结果获取、状态跟踪,适用于大计算量、批处理、多步骤操作(如数据批量分析、工作流自动化)。
四、MCP 核心交互流程
MCP 的客户端与服务器交互基于JSON-RPC 2.0,核心流程分为四步:初始化协商→原语发现→原语执行→实时通知,所有步骤均为状态化交互,保证能力匹配和实时同步。
步骤 1:初始化协商(Lifecycle Management)
建立连接的第一步,核心完成协议版本兼容校验、能力协商、身份交换,确保客户端与服务器可正常交互。
(1)客户端发起初始化请求
json
{
"jsonrpc": "2.0",
"id": 1,
"method": "initialize",
"params": {
"protocolVersion": "2025-06-18",
"capabilities": { "elicitation": {} }, // 客户端支持的能力
"clientInfo": { "name": "example-client", "version": "1.0.0" }
}
}
(2)服务器响应(能力协商)
服务器返回自身支持的原语和能力(如是否支持工具实时通知),若协议版本不兼容则终止连接。
(3)客户端发送就绪通知
连接建立成功后,客户端发送notifications/initialized通知,确认连接就绪。
核心作用:避免不兼容操作,为后续交互确定能力边界(如服务器是否支持工具、客户端是否支持用户输入)。
步骤 2:原语发现(Discovery)
客户端通过*/list方法发现服务器暴露的所有原语,是执行原语的前提,以工具发现为例:
(1)客户端发起工具发现请求
json
{
"jsonrpc": "2.0",
"id": 2,
"method": "tools/list"
}
(2)服务器返回工具元数据
返回的工具数组包含唯一名称、人类可读标题、描述、入参 Schema,保证客户端可正确理解和调用工具:
json
{
"jsonrpc": "2.0",
"id": 2,
"result": {
"tools": [
{
"name": "weather_current",
"title": "实时天气查询",
"description": "查询指定城市的实时天气",
"inputSchema": {
"type": "object",
"properties": {
"location": { "type": "string" },
"units": { "type": "string", "default": "metric" }
},
"required": ["location"]
}
}
]
}
}
AI 应用侧处理:聚合所有连接的 MCP 服务器的原语,形成统一的 “能力注册表”,供 LLM 调用。
步骤 3:原语执行(Execution)
客户端调用服务器的原语(以工具执行为例,资源 / 提示词为*/get方法),核心是tools/call,严格匹配发现阶段的工具名称和入参 Schema。
(1)客户端发起工具执行请求
json
{
"jsonrpc": "2.0",
"id": 3,
"method": "tools/call",
"params": {
"name": "weather_current", // 与发现阶段的name完全一致
"arguments": { "location": "San Francisco", "units": "imperial" }
}
}
(2)服务器返回执行结果
结果为content数组,支持多格式(文本、图片、资源等),结构化返回供 AI 应用作为 LLM 的上下文:
json
{
"jsonrpc": "2.0",
"id": 3,
"result": {
"content": [
{
"type": "text",
"text": "San Francisco: 72°F, Sunny, Humidity 45%"
}
]
}
}
AI 应用侧处理:将执行结果回传给 LLM,LLM 基于结果继续生成响应或发起新的工具调用。
步骤 4:实时通知(Notifications)
服务器主动向客户端推送原语变化、状态更新,基于 JSON-RPC 2.0 的通知语义(无id,无需客户端响应),核心解决 “客户端无需轮询即可感知服务器能力变化” 的问题。
(1)服务器发送工具变化通知
当服务器的工具新增 / 修改 / 删除时,推送
notifications/tools/list_changed:
json
{
"jsonrpc": "2.0",
"method": "notifications/tools/list_changed"
}
(2)客户端响应
客户端收到通知后,主动调用tools/list重新获取工具列表,更新本地 “能力注册表”,并同步给 LLM。
通知的核心特点:
- 能力驱动:仅服务器在初始化阶段声明支持listChanged时,才会发送通知;
- 事件驱动:基于服务器内部状态变化触发,无需客户端请求;
- 全原语支持:除工具外,资源、提示词均支持类似的通知机制。
五、MCP 开发基础
1. 开发资源体系
MCP 官方提供完整的开发资源,开发者无需从零实现协议,直接基于 SDK 开发即可:
- MCP Specification:协议规范,定义客户端 / 服务器的实现要求;
- MCP SDKs:多语言 SDK(Python、C#、Java/Spring AI 等),封装协议细节,提供开箱即用的 API;
- MCP Development Tools:开发工具(如 MCP Inspector),用于调试、监控 MCP 交互;
- Reference Server Implementations:服务器参考实现,快速搭建自定义 MCP 服务器。
2. 快速上手(以主流 SDK 为例)
(1)C# SDK(.NET)
bash
运行
# 安装MCP C# SDK(预发布版)
dotnet add package ModelContextProtocol --prerelease
基于Microsoft.Extensions.AI集成,快速实现 MCP 客户端 / 服务器,对接 Azure、GitHub Copilot 等生态。
(2)Java SDK(Spring AI)
Maven 依赖配置(Spring Boot 3.x + Spring AI 1.0.0-M7+):
xml
<dependency>
<groupId>org.springframework.ai</groupId>
<artifactId>spring-ai-starter-mcp-client-webflux</artifactId>
</dependency>
通过注解快速实现 MCP 工具(如@Tool注解标记工具方法),无缝集成 Spring 生态。
3. 开发关键原则
- 原语命名唯一性:工具 / 资源 / 提示词的name在服务器命名空间内唯一,提议采用业务_功能格式(如calculator_arithmetic);
- 入参 Schema 标准化:严格定义 JSON Schema,包含必选 / 可选参数、默认值,保证客户端类型校验;
- 传输方式适配:本地服务用 Stdio(高性能),远程服务用 HTTP(支持认证、跨网络);
- 通知能力显式声明:服务器需在初始化阶段声明支持的通知类型(如”tools”: {“listChanged”: true}),否则无法发送通知。
六、MCP 与 AI 应用的集成逻辑
AI 应用(MCP Host)集成 MCP 的核心逻辑为多服务器连接管理+能力聚合+LLM 工具调用联动,伪代码抽象如下:
python
运行
# 1. 初始化所有MCP服务器连接
for server_config in app.mcp_servers:
session = await create_mcp_session(server_config) # 基于SDK创建会话
init_response = await session.initialize()
app.register_mcp_session(session, init_response.capabilities)
# 2. 发现所有服务器的原语并聚合
all_tools = []
all_resources = []
for session in app.mcp_sessions:
all_tools.extend(await session.list_tools())
all_resources.extend(await session.list_resources())
app.llm.register_capabilities(all_tools, all_resources) # 同步给LLM
# 3. 处理LLM的工具调用请求
async def handle_llm_tool_call(tool_name, arguments):
session = app.find_session_by_tool(tool_name) # 找到对应服务器
result = await session.call_tool(tool_name, arguments)
app.llm.add_context(result.content) # 结果作为LLM上下文
return await app.llm.generate_response()
# 4. 处理服务器的实时通知
async def handle_notification(session, notification_type):
if notification_type == "tools/list_changed":
updated_tools = await session.list_tools()
app.llm.update_capabilities(updated_tools) # 更新LLM能力
七、核心总结
- MCP 的核心是标准化 AI 应用与外部系统的上下文交换,实现工具 / 数据的 “即插即用”,降低集成成本;
- 架构上分为Host/Client/Server三大角色、数据层 / 传输层两层协议,基于JSON-RPC 2.0实现交互;
- 核心能力通过原语定义,服务器暴露工具 / 资源 / 提示词,客户端暴露LLM 调用 / 用户输入 / 日志;
- 交互流程为初始化→发现→执行→通知,状态化交互保证能力匹配和实时同步;
- 开发基于多语言 SDK,无需关注协议细节,重点实现业务侧的原语(工具 / 资源 / 提示词)。