MCP(Model Context Protocol,模型上下文协议)协议
MCP(Model Context Protocol,模型上下文协议)是由 Anthropic 在 2024 年提出的开放标准协议,旨在为大型语言模型(LLM)与外部工具、数据源和服务建立统一的通信框架。MCP 是 AI 生态的通用接口协议,类比为 “AI 时代的 USB 接口”。它通过标准化交互方式,解决传统 API 集成中的碎片化问题,实现工具与模型的即插即用连接。五、与其他技术的协同与区别。
MCP是什么?技术原理是是什么?
参考链接:https://www.bilibili.com/video/BV1AnQNYxEsy
Modal Context Protocol 模型上下文协议,由Claude的母公司Anthorpic于24年底开源发布。旨在为大型语言模型(LLM)与外部工具(浏览器、文件系统、数据库、GitHub等)建立统一的通信框架,获取信息并完成具体任务。MCP服务作为AI与外部工具的中间层,代替人类访问并且操作外部工具。
每个MCP服务或者叫做MCP Server都专精于一类工作,比如有的负责读写浏览器,有的负责读写本地文件。
MCP Server通常就是运行在本地的一段Node或者Python程序,大模型通过操作标准输入通道调用某个MCP Server
MCP Server接到这些请求以后,访问外部工具,完成任务。
MCP 的最大优点在于整合了各家大模型不同的function call标准,整合成了一个统一的标准协议。
MCP是如何对接大模型的?
抓取AI提示词,拆解MCP的底层原理
学习链接:https://www.bilibili.com/video/BV1P3XTYPEJm
方案1
通过function call
方案2
通过prompt 提示词
MCP server list
1、https://github.com/modelcontextprotocol
2、https://github.com/punkpeye/awesome-mcp-servers
3、https://smithery.ai/
实战
1、支持MCP的客户端
- Cursor
- Cline
- Claude App
2、常用的MCP Server
3、开发一个自己的MCP
参考链接:https://www.bilibili.com/video/BV1RNTtzMENj
MCP(Model Context Protocol,模型上下文协议)是由 Anthropic 在 2024 年提出的开放标准协议,旨在为大型语言模型(LLM)与外部数据源或工具之间建立标准化连接。比如:
- 数据源:文件系统、数据库、API 等
- 工具:可以执行特定操作的功能
- 提示词模板:预定义的提示词

核心定义与定位
-
技术本质
MCP 是 AI 生态的通用接口协议,类比为 “AI 时代的 USB 接口”。它通过标准化交互方式,解决传统 API 集成中的碎片化问题,实现工具与模型的即插即用连接。- 核心目标:消除 LLM 与外部系统(如数据库、云服务、本地文件)对接的定制化开发成本,降低集成门槛。
-
与传统 API 的区别
- 功能扩展性:MCP 不仅支持 API 工具调用,还提供上下文管理、文件读取、内置提示词等 AI 专用功能 [2]。
- 交互模式:API 需开发者手动调用,而 MCP 允许模型根据用户指令主动触发工具调用,实现自动化决策。
技术架构与核心组件
MCP 采用 Client-Host-Server 三层架构:
- 主机(Host)
- 客户端(Client)
- 作为 Host 与 Server 的通信代理,封装请求/响应数据为 JSON-RPC 格式 [7]。
- 服务器(Server)
核心价值与优势
- 开发效率革命
- 生态网络效应
- 构建双边市场:AI 开发者(需求方)与工具提供商(供给方)形成规模化生态(如阿里云百炼集成 110+ 服务)[1]。
- 安全与灵活性
典型应用场景
| 领域 | 案例 |
|---|---|
| 企业自动化 | 订单处理、库存管理通过 MCP 调用 ERP 系统,减少人工干预 [2][6]。 |
| 开发者工具 | IDE 插件调用编译器/调试器辅助代码生成,实时分析日志 [6][9]。 |
| 消费服务 | 旅行助手联动航班 API、日历应用,自动预订行程 [4][11]。 |
| 数据分析 | AI 通过 MCP 访问数据库生成可视化报告,同步邮件发送 [6]。 |
与其他技术的协同与区别
- vs. Function Calling
- 互补关系:Function Calling 是模型内部能力(输出结构化参数),MCP 是外部协议层(执行具体操作),两者需配合使用。
- vs. A2A 协议
- 定位差异:MCP 专注工具调用,A2A(Agent-to-Agent)解决智能体间协作问题
MCP 调用机制详解
调用流程:
- 用户输入 → 2. AI分析意图 → 3. 选择合适的MCP工具 → 4. 调用MCP → 5. 处理结果 → 6. 返回给用户
谁调用 MCP?
调用方(MCP 客户端):
- AI 应用(如 Claude Desktop、Cursor、Windsurf 等)
- 支持 MCP 协议的聊天工具
- 自定义的 AI 应用程序
被调用方(MCP 服务器):
- 你创建的 MCP 服务器(如之前的
mcp-simple.js) - 官方或第三方 MCP 服务器
什么情况下调用?
自动调用场景:
- 用户提问时 - AI 判断需要外部工具/数据
用户: "帮我计算 23 * 45"
AI: 发现有 calculate 工具 → 调用 MCP 服务器
- 需要访问资源时
用户: "读取 data.json 文件"
AI: 调用文件系统 MCP 服务器
- 执行操作时
用户: "创建一个新文件"
AI: 调用 MCP 服务器的文件操作工具
如何调用?
完整调用流程:
1. 启动阶段(配置)
┌─────────────┐
│ AI 客户端 │ 读取 mcp.json
└──────┬──────┘
│ 启动子进程
↓
┌─────────────┐
│ MCP 服务器 │ node mcp-simple.js
└─────────────┘
2. 初始化
AI 客户端 → MCP 服务器: "你有哪些工具?"
MCP 服务器 → AI 客户端: "我有 hello 工具"
3. 运行时调用
用户 → AI: "say hello to Alice"
AI → MCP 服务器: CallTool(name: "hello", args: {name: "Alice"})
MCP 服务器 → AI: {text: "你好, Alice!"}
AI → 用户: "执行结果:你好, Alice!"
-
启动时:
- Cursor读取配置
- 启动所有配置的 MCP 服务器(作为子进程)
- 询问每个服务器有哪些工具和资源

-
对话时:
你: "帮我用 hello 工具问候 Bob"
Cursor (AI):
1. 分析请求 → 发现需要 hello 工具
2. 发送 JSON-RPC 请求到 MCP 服务器
3. 接收响应
4. 把结果返回给你
具体决策示例
场景1:数学计算
用户:"5加3等于多少?"
决策过程:
1. 识别关键词:"加"、数字"5"、"3"
2. 匹配工具:add(描述包含"计算"、"和")
3. 提取参数:a=5, b=3
4. 验证参数:类型正确,必需参数齐全
5. 调用工具:add(5, 3)
场景2:问候功能
用户:"跟张三打个招呼"
决策过程:
1. 识别关键词:"打招呼"、"张三"
2. 匹配工具:hello(描述包含"问候")
3. 提取参数:name="张三"
4. 验证参数:可选参数,类型正确
5. 调用工具:hello("张三")
总结:
大模型调用工具的决策是一个多层次的智能推理过程:
1、理解用户真实需求
2、匹配最合适的工具
3、提取必要的参数
4、验证调用的可行性
5、执行工具调用
6、整合结果并回答
技术细节:
1. 配置文件(告诉 AI 如何启动 MCP 服务器)
{
"mcpServers": {
"simple": {
"command": "node", // 启动命令
"args": ["mcp-simple.js"] // 参数
}
}
}
2. 通信方式(通过 stdio)
// MCP 服务器通过标准输入输出通信
stdin ← AI 发送 JSON-RPC 请求
stdout → MCP 返回 JSON-RPC 响应
3. JSON-RPC 协议
JSON-RPC(JavaScript Object Notation Remote Procedure Call)是一种轻量级、无状态的远程过程调用(RPC)传送协议,它主要使用 JSON 格式来传输数据和定义通信规范。JSON-RPC 可以使用多种底层协议,但在实际应用中,主要有HTTP/HTTPS、WebSocket、TCP/IP 套接字 (Sockets)等。
工作原理
JSON-RPC 遵循简单的请求-响应模型:
1、客户端请求:客户端向服务器发送一个包含特定成员(jsonrpc版本号、method名称、params参数、以及可选的id标识符)的 JSON 对象。
2、服务器处理:服务器解析请求,执行相应的远程方法。
3、服务器响应:服务器返回一个响应对象,包含请求的 id、执行结果 (result) 或错误信息 (error)。
// AI 调用工具
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "hello",
"arguments": { "name": "Alice" }
}
}
// MCP 服务器响应
{
"jsonrpc": "2.0",
"id": 1,
"result": {
"content": [
{ "type": "text", "text": "你好, Alice!" }
]
}
}
demo测试

#!/usr/bin/env node
// 导入 MCP SDK 的核心组件
const { Server } = require('@modelcontextprotocol/sdk/server/index.js');
const { StdioServerTransport } = require('@modelcontextprotocol/sdk/server/stdio.js');
const {
CallToolRequestSchema, // 工具调用请求的 Schema 定义
ErrorCode, // MCP 标准错误码
ListToolsRequestSchema, // 工具列表请求的 Schema 定义
McpError // MCP 标准错误类
} = require('@modelcontextprotocol/sdk/types.js');
/**
* Hello MCP 服务器类
* 提供简单的问候和数学计算工具给大模型使用
*/
class HelloMcpServer {
constructor() {
// 创建 MCP 服务器实例
console.error('init server');
this.server = new Server(
{
name: 'hello-mcp-server', // 服务器名称(必须字段)
version: '0.1.0' // 服务器版本(必须字段)
},
{
capabilities: { // 声明服务器支持的能力(必须字段)
tools: {} // 声明支持工具功能
}
}
);
// 初始化工具处理器和错误处理
this.setupToolHandlers();
this.setupErrorHandling();
}
/**
* 设置工具处理器
* 定义大模型可以调用的工具及其处理逻辑
*/
setupToolHandlers() {
// 处理工具列表请求 - 当大模型询问"有哪些工具可用"时调用
this.server.setRequestHandler(ListToolsRequestSchema, async () => {
console.error('MCP服务启动,在询问有哪些工具可调用');
return {
tools: [
{
name: 'hello', // 工具名称(唯一标识符)
description: '返回一个简单的问候语', // 工具功能描述
inputSchema: { // 输入参数的 JSON Schema 定义
type: 'object',
properties: {
name: {
type: 'string',
description: '要问候的名字'
}
}
// 注意:name 参数是可选的,所以没有 required 字段
}
},
{
name: 'add', // 数学加法工具
description: '计算两个数字的和',
inputSchema: {
type: 'object',
properties: {
a: {
type: 'number',
description: '第一个数字'
},
b: {
type: 'number',
description: '第二个数字'
}
},
required: ['a', 'b'] // 这两个参数是必须的
}
}
]
};
});
// 处理工具调用请求 - 当大模型实际调用工具时执行
this.server.setRequestHandler(CallToolRequestSchema, async request => {
// 从请求中提取工具名称和参数
const { name, arguments: args } = request.params;
try {
// 根据工具名称路由到对应的处理逻辑
switch (name) {
case 'hello':
// 处理问候工具调用
return {
content: [ // MCP 协议要求的响应格式
{
type: 'text', // 内容类型(必须字段)
text: `你好,${args.name || '世界'}!` // 实际返回的文本内容
}
]
};
case 'add':
// 参数类型验证 - 确保传入的是数字
if (typeof args.a !== 'number' || typeof args.b !== 'number') {
throw new McpError(ErrorCode.InvalidParams, '参数必须是数字');
}
// 执行加法计算并返回结果
return {
content: [
{
type: 'text',
text: `${args.a} + ${args.b} = ${args.a + args.b}`
}
]
};
default:
// 处理未知工具调用
throw new McpError(ErrorCode.MethodNotFound, `未知工具: ${name}`);
}
} catch (error) {
// 错误处理:如果是 MCP 错误直接抛出,否则包装为内部错误
if (error instanceof McpError) {
throw error;
}
throw new McpError(ErrorCode.InternalError, `工具执行错误: ${error.message}`);
}
});
}
/**
* 设置错误处理和优雅关闭
*/
setupErrorHandling() {
// 设置服务器错误处理器
this.server.onerror = error => {
console.error('[MCP Error]', error);
};
// 处理 Ctrl+C 信号,优雅关闭服务器
process.on('SIGINT', async () => {
await this.server.close();
process.exit(0);
});
}
/**
* 启动 MCP 服务器
* 建立与大模型的通信连接
*/
async run() {
// 创建标准输入输出传输层 - 用于与大模型进行 JSON-RPC 通信
const transport = new StdioServerTransport();
// 连接服务器到传输层
await this.server.connect(transport);
// 输出到 stderr 避免干扰与大模型的 stdio 通信
console.error('Hello MCP Server 运行中...');
}
}
// 如果这个文件被直接执行(而不是被 require),则启动服务器
if (require.main === module) {
const server = new HelloMcpServer();
server.run().catch(error => {
console.error('启动失败:', error);
process.exit(1);
});
}
// 导出类以供其他模块使用
module.exports = HelloMcpServer;
MCP Inspector 调试工具
安装和使用
# 安装 MCP Inspector
npm install -g @modelcontextprotocol/inspector
# 启动 Inspector 调试你的服务器
npx @modelcontextprotocol/inspector node nodeServer/helloMcp.js
Inspector 功能
- 实时通信监控:查看所有 JSON-RPC 消息
- 工具测试:直接测试工具调用
- 错误诊断:详细的错误信息和堆栈跟踪
- 性能分析:请求响应时间统计
好用的mcp
AI工程化流搭建
-
Figma mcp
- 获取token:点击头像,设置,security,Generate new token
-
Supabase mcp
-
Sequential Thinking + Software Planning Tool
Sequential Thinking:结构化思考过程,将复杂的问题分解为客管理的步骤,项目经历
Software Planning Tool:软件规划工具,技术经理 -
Magic mcp:为cursor定制的
-

chrome-devtools
https://blog.csdn.net/yexudengzhidao/article/details/155499096
火山引擎开发者社区是火山引擎打造的AI技术生态平台,聚焦Agent与大模型开发,提供豆包系列模型(图像/视频/视觉)、智能分析与会话工具,并配套评测集、动手实验室及行业案例库。社区通过技术沙龙、挑战赛等活动促进开发者成长,新用户可领50万Tokens权益,助力构建智能应用。
更多推荐
所有评论(0)