为什么选择MCP
MCP 是一个帮助开发者构建基于 LLM (大语言模型) 的智能代理和复杂工作流的框架。旨在解决目前大模型的信息孤岛问题。
-
预构建集成能力
-
MCP 提供了大量现成的集成组件
-
这些组件可以直接被 LLM 调用和使用
-
这意味着开发者不需要从零开始构建各种集成,可以快速实现功能
-
-
LLM 供应商的灵活性
-
可以在不同的 LLM 提供商之间自由切换
-
比如可以从 OpenAI 切换到 Anthropic 或其他提供商
-
这种灵活性让开发者能够根据需求选择最适合的 LLM 服务
-
-
数据安全最佳实践
-
提供了在基础设施中保护数据安全的最佳实践方案
-
确保敏感数据得到妥善保护
-
帮助开发者在构建应用时遵循安全标准
-
总的来说,MCP 是一个旨在简化 LLM 应用开发的框架,它通过提供现成的组件、灵活的供应商选择以及安全实践,帮助开发者更高效地构建基于 LLM 的应用。这对于需要将 LLM 与各种数据源和工具集成的项目特别有用。
MCP架构
MCP 采用客户端-服务器(Client-Server)架构
这里有个误区,图中MCP server都在本地电脑中,实际中的Server可以是非本地部署的。
关键组件:
- MCP Hosts(主机)
- 使用 MCP 协议的程序或应用,也就是发起请求的 LLM 应用程序(例如 Claude Desktop、IDE 或 AI 工具)。
- 例如:
- Claude Desktop 客户端
- 集成 AI 功能的 IDE
- 其他需要访问数据的 AI 工具
- 这些主机程序通过 MCP 协议来获取所需的数据和服务
- MCP Clients(客户端)
- 是协议的具体实现者
- 每个客户端与服务器之间保持一对一的连接(我的理解是建立连接的过程是一对一)
- 负责处理与服务器的通信
- 确保数据传输的可靠性和安全性
- MCP Servers(服务器)
- 轻量级的程序组件
- 每个服务器都通过标准化的
Model Context Protocol暴露特定的功能 - 可以理解为各种能力的提供者
- 负责实际的数据访问和处理
- Local Data Sources(本地数据源)
- 位于用户计算机上的数据资源
- 包括:
- 本地文件系统
- 本地数据库
- 本地运行的服务
- MCP 服务器可以安全地访问这些本地资源
- Remote Services(远程服务)
- 通过互联网访问的外部系统
- 例如:
- 各种 API 服务
- 云服务
- 远程数据库
- MCP 服务器可以连接到这些远程服务
这种架构设计的优势:
- 模块化:每个组件都有明确的职责
- 安全性:通过标准化的协议确保数据访问的安全
- 灵活性:可以方便地添加新的数据源和服务
- 可扩展性:支持本地和远程资源的统一访问
这种设计使得 AI 应用能够安全(因为可以使用本地数据源)、高效地访问各种数据源,同时保持了系统的扩展性和可维护性。
MCP Protocal核心组件
协议层 Protocol layer
协议层负责处理消息的封装、请求/响应关联,以及高级通信模式
Typescript定义
class Protocol<Request, Notification, Result> {
// Handle incoming requests
setRequestHandler<T>(schema: T, handler: (request: T, extra: RequestHandlerExtra) => Promise<Result>): void
// Handle incoming notifications
setNotificationHandler<T>(schema: T, handler: (notification: T) => Promise<void>): void
// Send requests and await responses
request<T>(request: Request, schema: T, options?: RequestOptions): Promise<T>
// Send one-way notifications
notification(notification: Notification): Promise<void>
}
传输层 Transport layer
传输层是整个MCP最重要的组件,传输层负责在客户端(Mcp client)和服务器(Mcp server)之间进行实际的数据通信。
传输层的三种方式:
- 通过 stdio 传输数据,适用于在同一台机器上运行的客户端和服务器之间的通信。例如以下通过npx直接启动,代码端也需要做适配
{
"mcpServers": {
"mcp-server-chart": {
"command": "npx",
"args": [
"-y",
"@antv/mcp-server-chart"
]
}
}
}
- stream http的形式
Streamable HTTP 是 MCP 协议的一次重要升级,改进解决了原有 HTTP + SSE 传输方式的多个关键问题:
- 统一端点:移除了专门建立连接的 /sse 端点,将所有通信整合到统一的端点。
- 按需流式传输:服务器可以灵活选择返回标准 HTTP 响应或通过 SSE 流式返回。
- 状态管理:引入session机制
所有传输都使用 JSON-RPC 2.0 来交换消息。详细的 Model Context Protocol 消息格式请参阅规范。
JSON-RPC是一个无状态且轻量级的远程过程调用(RPC)协议。 本规范主要定义了一些数据结构及其相关的处理规则。它允许运行在基于socket,http等诸多不同消息传输环境的同一进程中。其使用JSON(RFC 4627)作为数据格式。
我的理解就是约定了一种数据结构,通过http、socket等去传输,实现两端的通信。
MCP client工作流程
建立连接
- 客户端通过
<font style="color:rgb(25, 27, 31);background-color:rgb(248, 248, 250);">initialize</font>请求发送协议版本和功能列表 - 服务器返回协议版本和功能列表
- 客户端通过
<font style="color:rgb(25, 27, 31);background-color:rgb(248, 248, 250);">initialized</font>通知进行确认 - 可以开始正常消息交换
开始交互
- MCP client 首先从 MCP server 获取可用的工具列表(tools)
- 将用户的查询连同工具描述(tools description)通过 function calling 一起发送给 LLM
- LLM 决定是否需要使用工具以及使用哪些工具
- 如果需要使用工具,MCP client 会通过 MCP server 执行相应的工具调用
- 工具调用的结果会被发送回 LLM
- LLM 基于返回信息做整理和归纳
- 返回处理后的信息给用户
消息交换模式
- Request-Response(请求-响应):客户端或服务器发起请求,对方返回响应
- Notifications(通知):任意一方可以发送单向消息
消息类型
消息类型基于 JSON RPC 2.0
- 请求
interface Request {
method: string;
params?: { ... };
}
- 结果
interface Result {
[key: string]: unknown;
}
- 错误返回
interface Error {
code: number;
message: string;
data?: unknown;
}
- 建立通信的Notification
interface Notification {
method: string;
params?: { ... };
}
终止(Terminate)会话
- 通过 close() 进行正常关闭
- 传输层断开连接
- 遇到错误导致关闭(错误返回值遵循
<font style="color:rgb(25, 27, 31);">JSON RPC 2.0</font>的规定)
官方文档定义
enum ErrorCode {
// Standard JSON-RPC error codes
ParseError = -32700,
InvalidRequest = -32600,
MethodNotFound = -32601,
InvalidParams = -32602,
InternalError = -32603
}
JSON PRC定义
| code | message | meaning |
|---|---|---|
| -32700 | Parse error语法解析错误 | 服务端接收到无效的json。该错误发送于服务器尝试解析json文本 |
| -32600 | Invalid Request无效请求 | 发送的json不是一个有效的请求对象。 |
| -32601 | Method not found找不到方法 | 该方法不存在或无效 |
| -32602 | Invalid params无效的参数 | 无效的方法参数。 |
| -32603 | Internal error内部错误 | JSON-RPC内部错误。 |
| -32000 to -32099 | Server error服务端错误 | 预留用于自定义的服务器错误。 |
总结
MCP(Model Context Protocol)是一个旨在简化基于LLM的智能代理和复杂工作流开发的框架,致力于解决大模型信息孤岛问题。它通过提供预构建集成、LLM供应商灵活性和数据安全实践,提升开发效率。大模型离开了MCP就是一座信息的孤岛,MCP给大模型带来了各种天马行空的可能性。希望我们每个身处这个AI时代的coder永不失业。其实,为什么选择MCP我也不懂,还得再学一学哈。🐕