MCP、SKILLS详解
参考文章:
MCP
MCP(模型上下文协议)是一个开源标准,用于连接 AI 应用程序到外部系统。使用 MCP,像 Claude 或 ChatGPT 这样的 AI 应用可以连接到数据源(例如本地文件、数据库)、工具(例如搜索引擎、计算器)和工作流程(例如专业提示),从而使其能够访问关键信息并执行任务。 将 MCP 想象成 AI 应用的 USB-C 接口。就像 USB-C 为电子设备提供了一种标准化的连接方式一样,MCP 也为 AI 应用连接外部系统提供了一种标准化的方式。
简单来说,MCP是一种协议,类似HTTP协议。它定义了大模型工具的通信标准,不再像function call时期,每个工具需要针对性地定制。它做到了通用性,这让我们可以接入其他开发者或者公司开发的MCP拓展智能体的能力。想让智能体规划旅游路线?我们可以接入小红书的MCP搜索攻略,再接入高德地图的MCP进行路线规划。这样一个可以做旅游攻略的智能体就做好了。这大大减少了开发的时间和工作量。
MCP的基础概念
MCP Host
AI应用程序,协调管理多个MCP客户端。常见的有Claude Code、Codex、Cursor、Cherry Studio等。
MCP Server
MCP服务端,拥有制作好的一系列工具,当客户端连接时,会发送服务端拥有的工具和描述,作为context提供给客户端。
MCP Client
MCP客户端,从MCP服务端获取context供MCP Host使用。
数据层和传输层
数据层
生命周期管理
管理客户端和服务端连接建立、能力协商、连接终止。 目的是协商客户端和服务器都支持的功能。 原语是定义服务端和客户端可以互相提供的内容。 服务器原语包含以下三种:
- Tools:AI 应用程序可调用的可执行函数,用于执行操作(例如,文件操作、API 调用、数据库查询)
- Resources:为 AI 应用程序提供上下文信息的数据源(例如,文件内容、数据库记录、API 响应)
- Prompts:可重用的模板,帮助构建与语言模型的交互(例如,系统提示、少量示例) 客户端原语:
- Sampling:可以使用sampling/complete要求客户端进行大模型的补全
- Elicitation:允许服务器从用户请求额外信息。当服务器作者希望从用户获取更多信息,或请求确认某个操作时,这很有用。他们可以使用 elicitation/request 方法从用户请求额外信息。
- Logging:使服务器能够向客户端发送日志消息,用于调试和监控目的。 还有更多的:
- Tasks (Experimental):持久执行包装器,支持延迟结果检索和 MCP 请求的状态跟踪(例如,高成本计算、工作流自动化、批量处理、多步操作) 每种原语都有相关的*/list、*/get、toos/call方法。
服务器功能
服务器能够提供的能力,如可以提供给ai执行的工具、提供的数据资源、交互的提示词模板
客户端功能
客户端功能:使服务器能够请求客户端从主机 LLM 中采样,从用户处获取输入,并将消息记录到客户端
附加功能
附加功能:支持通知实时更新和长时间运行操作的过程跟踪
传输层
支持两种传输形式: 1、stdio 传输:使用标准输入/输出流,在本地同一台机器上的本地进程之间进行直接进程通信,提供最佳性能且无网络开销。 2、流式 HTTP 传输:使用 HTTP POST 传输客户端到服务器的消息,并可选地使用 Server-Sent Events 实现流式传输功能。该传输方式支持远程服务器通信,并支持标准 HTTP 认证方法,包括授权令牌、API 密钥和自定义头信息。MCP 推荐使用 OAuth 获取认证令牌。 MCP 使用 JSON-RPC 2.0 作为其底层 RPC 协议。客户端和服务端相互发送请求并作出相应回应。当不需要响应时,可以使用通知。
创建一个专业的技术架构流程图,展示MCP(Model Context Protocol)的完整交互过程。图像要求如下: 整体布局:
采用从上到下的垂直流程图风格 左侧显示”MCP Client(客户端)“,右侧显示”MCP Server(服务器)” 使用清晰的箭头表示请求和响应的方向 背景为浅色(白色或浅灰色),便于阅读 采用现代扁平化设计风格
四个主要交互步骤(按顺序排列): 步骤1 - 初始化(Initialization):
从Client到Server的箭头,标注”1. initialize request” 在箭头旁边显示JSON代码框:
{ “jsonrpc”: “2.0”, “id”: 1, “method”: “initialize”, “params”: { “protocolVersion”: “2025-06-18”, “capabilities”: { “elicitation”: {} }, “clientInfo”: { “name”: “example-client”, “version”: “1.0.0” } } }
- 协议版本协商: protocolVersion 字段(例如,“2025-06-18”)确保客户端和服务器使用兼容的协议版本。这可以防止不同版本尝试交互时可能发生的通信错误。如果未能协商出相互兼容的版本,则应终止连接。
- 能力发现: capabilities 对象允许每一方声明他们支持的功能,包括他们能够处理的原语(工具、资源、提示)以及他们是否支持通知等特性。这通过避免不支持的操作来实现高效通信。
- 身份交换: clientInfo 和 serverInfo 对象提供用于调试和兼容性的识别和版本信息。
- “elicitation”: {} - 客户端声明它可以处理用户交互请求(可以接收 elicitation/create 方法调用) 从Server返回Client的箭头,标注”initialize response” 显示响应JSON:
{ “jsonrpc”: “2.0”, “id”: 1, “result”: { “protocolVersion”: “2025-06-18”, “capabilities”: { “tools”: { “listChanged”: true }, “resources”: {} }, “serverInfo”: { “name”: “example-server”, “version”: “1.0.0” } } } “tools”: {“listChanged”: true} - 服务器支持工具原语,并且当其工具列表发生变化时可以发送 tools/list_changed 通知 “resources”: {} - 服务器也支持资源原语(可以处理 resources/list 和 resources/read 方法)
初始化成功后,客户端发送通知表示已准备就绪: { “jsonrpc”: “2.0”, “method”: “notifications/initialized” } 步骤2 - 工具发现(Tool Discovery):
Client到Server箭头,标注”2. tools/list request” JSON代码框:
{ “jsonrpc”: “2.0”, “id”: 2, “method”: “tools/list” }
Server返回箭头,显示”tools/list response” 响应JSON:
{ “jsonrpc”: “2.0”, “id”: 2, “result”: { “tools”: [ { “name”: “calculator_arithmetic”, “title”: “Calculator”, “description”: “Perform mathematical calculations including basic arithmetic, trigonometric functions, and algebraic operations”, “inputSchema”: { “type”: “object”, “properties”: { “expression”: { “type”: “string”, “description”: “Mathematical expression to evaluate (e.g., ‘2 + 3 * 4’, ‘sin(30)’, ‘sqrt(16)’)” } }, “required”: [“expression”] } }, { “name”: “weather_current”, “title”: “Weather Information”, “description”: “Get current weather information for any location worldwide”, “inputSchema”: { “type”: “object”, “properties”: { “location”: { “type”: “string”, “description”: “City name, address, or coordinates (latitude,longitude)” }, “units”: { “type”: “string”, “enum”: [“metric”, “imperial”, “kelvin”], “description”: “Temperature units to use in response”, “default”: “metric” } }, “required”: [“location”] } } ] } }
name : 服务器命名空间内该工具的唯一标识符。它是工具执行的主键,应遵循清晰的命名模式(例如, calculator_arithmetic 而不是单纯的 calculate )。 title : 客户端向用户展示的工具的名称 description : 对工具功能进行详细说明以及何时使用该工具 inputSchema : 一个定义预期输入参数的 JSON Schema,支持类型验证并提供关于必需和可选参数的清晰文档
步骤3 - 工具执行(Tool Execution):
Client到Server箭头,标注”3. tools/call request” JSON代码框:
{ “jsonrpc”: “2.0”, “id”: 3, “method”: “tools/call”, “params”: { “name”: “weather_current”, “arguments”: { “location”: “San Francisco”, “units”: “imperial” } } } name : 必须与发现响应中的工具名称( weather_current )完全匹配。这确保服务器能够正确识别要执行的工具。 arguments : 包含工具的 inputSchema 定义输入参数。在此示例中: location : “旧金山”(必需参数) units : “imperial” (可选参数,若未指定则默认为 “metric”) Server返回箭头,显示响应 响应JSON:
{ “jsonrpc”: “2.0”, “id”: 3, “result”: { “content”: [ { “type”: “text”, “text”: “Current weather in San Francisco: 68°F, partly cloudy with light winds from the west at 8 mph. Humidity: 65%” } ] } } content 数组:工具响应返回一个内容对象数组,允许进行丰富、多格式的响应(文本、图片、资源等) type内容类型:每个内容对象都有一个 type 字段。在这个例子中, “type”: “text” 表示纯文本内容,但 MCP 支持多种内容类型以适应不同场景。
步骤4 - 通知(Notification):
Server主动向Client发送箭头(虚线表示),标注”4. notifications/tools/list_changed” JSON代码框:
{ “jsonrpc”: “2.0”, “method”: “notifications/tools/list_changed” } 特性: 无需响应:请注意通知中没有 id 字段。这遵循 JSON-RPC 2.0 通知语义,即不期望或发送响应。 基于能力的:此通知仅由在初始化期间(如步骤 1 所示)在其工具能力中声明了 “listChanged”: true 的服务器发送。 事件驱动:服务器根据内部状态变化决定何时发送通知,使 MCP 连接动态且响应迅速。
Client响应性地发送新的tools/list请求(循环回步骤2) { “jsonrpc”: “2.0”, “id”: 4, “method”: “tools/list” } 通知可以实现的特性: 动态环境:工具可能根据服务器状态、外部依赖或用户权限出现或消失 效率:客户端无需轮询以检查变化;当更新发生时,他们会收到通知 一致性:确保客户端始终拥有关于可用服务器能力的准确信息 实时协作:支持响应式 AI 应用,使其能够适应变化的上下文
设计要素:
所有JSON代码使用等宽字体,放在圆角矩形框内 请求箭头使用实线蓝色,响应箭头使用实线绿色 通知使用橙色虚线箭头强调其异步特性 每个步骤用大号数字标注(1、2、3、4) Client和Server用不同的背景色区分(Client浅蓝色,Server浅绿色) 在图的顶部添加标题”MCP Architecture - Client-Server Interaction Flow” 在底部添加图例说明:实线=请求/响应,虚线=通知
风格参考:
类似AWS架构图或系统设计图的专业风格 清晰、简洁、信息密度适中 适合技术文档和演示使用
文章分享
如果这篇文章对你有帮助,欢迎分享给更多人!
5426的技术分享基地