定义
模型上下文协议(MCP) 是一种开放标准接口,使大型语言模型(LLM)能够安全、一致地访问外部数据源、工具和能力。它在 AI 应用与多种上下文提供者之间建立了标准化的通信层,相当于 AI 系统的“USB-C”。
关键组成部分
架构
MCP 遵循客户端-服务器架构:
- MCP 主机:用户或 AI 系统进行交互的应用(如 Claude Desktop、IDE 插件)
- MCP 客户端:主机应用中的组件,负责与服务器通信
- MCP 服务器:通过标准化 MCP 接口,暴露特定功能(如文件访问、数据库连接、API 访问)的轻量级程序
- 数据源:MCP 服务器可以安全访问的本地或远程信息仓库
核心原语
MCP 定义了三种构建协议的基础原语:
1. 资源
资源 代表 MCP 服务器向 LLM 提供的数据与内容。
- 特性:由应用控制,通过唯一 URI 标识
- 数据类型:文本(UTF-8 编码)或二进制(Base64 编码)
- 发现方式:直接列举或通过模板动态请求资源
- 操作:读取内容、接收更新
用例示例:MCP 服务器将日志文件以 file:///logs/app.log 作为资源对外暴露
2. 提示
提示 是服务器提供的预定义模板或工作流,用于引导 LLM 交互。
- 特性:由用户触发,常以斜杠命令形式出现
- 结构:唯一名称、描述、可选参数
- 能力:可接收自定义参数、引入资源上下文、定义多步交互
- 操作:通过列举发现,通过请求执行
用例示例:一个 git 提交信息生成器提示,接受代码变更作为输入
3. 工具
工具 暴露可由 LLM 调用(通常需用户批准)的可执行函数,用于执行操作。
- 特性:由模型控制,需明确定义输入模式
- 注解:标明行为提示(只读、破坏性、幂等、开放世界)
- 安全特性:输入校验、访问控制、清晰的用户警告
- 操作:通过列举发现,通过带参数调用执行
用例示例:一个计算器工具,对模型提供的输入执行数学运算
重要性与优势
对开发者
- 标准化集成:无需为每个数据源单独编写代码即可连接 AI 应用
- 安全最佳实践:内置安全暴露敏感信息的指导
- 简化架构:清晰区分 AI 模型与其上下文来源
对用户与组织
- 灵活性:更容易在不同 LLM 提供商或主机应用间切换
- 互操作性:通过标准化接口减少厂商锁定
- 增强能力:AI 系统可访问更丰富的信息与操作能力
实现示例
文件资源服务器
// 服务器将单个日志文件作为资源暴露
const server = new Server({ /* config */ }, { capabilities: { resources: {} } });
// 列出可用资源
server.setRequestHandler(ListResourcesRequestSchema, async () => {
return {
resources: [
{
uri: "file:///logs/app.log",
name: "Application Logs",
mimeType: "text/plain"
}
]
};
});
// 提供资源内容
server.setRequestHandler(ReadResourceRequestSchema, async (request) => {
if (request.params.uri === "file:///logs/app.log") {
const logContents = await readLogFile();
return {
contents: [{
uri: request.params.uri,
mimeType: "text/plain",
text: logContents
}]
};
}
throw new Error("Resource not found");
});
计算器工具服务器
const server = new Server({ /* config */ }, { capabilities: { tools: {} } });
// 列出可用工具
server.setRequestHandler(ListToolsRequestSchema, async () => {
return {
tools: [{
name: "calculate_sum",
description: "Add two numbers together",
inputSchema: {
type: "object",
properties: {
a: { type: "number", description: "First number" },
b: { type: "number", description: "Second number" }
},
required: ["a", "b"]
},
annotations: {
title: "Calculate Sum",
readOnlyHint: true,
openWorldHint: false
}
}]
};
});
// 处理工具调用
server.setRequestHandler(CallToolRequestSchema, async (request) => {
if (request.params.name === "calculate_sum") {
try {
const { a, b } = request.params.arguments;
if (typeof a !== 'number' || typeof b !== 'number') {
throw new Error("Invalid input: 'a' and 'b' must be numbers.");
}
const sum = a + b;
return {
content: [{ type: "text", text: String(sum) }]
};
} catch (error: any) {
return {
isError: true,
content: [{ type: "text", text: `Error calculating sum: ${error.message}` }]
};
}
}
throw new Error("Tool not found");
});
相关概念
- LLM 函数调用:模型上下文协议为 LLM 调用函数提供了标准化方案
- AI 智能体:MCP 为基于智能体的 AI 系统访问工具和信息提供结构化方式
- AI 插件:类似浏览器扩展,MCP 服务器可视作扩展 AI 能力的“插件”
未来方向
- 企业级 AI 集成:连接企业知识库、工具和工作流
- 多模态 AI:标准化访问文本以外的多样数据类型
- 协作式 AI 系统:使多个 AI 助手通过共享协议协同工作