进阶岛04- MCP
2025年7月20日大约 5 分钟
进阶岛
L2G4- MCP
你说得对!这段关于“智能体协议 MCP”的介绍虽然意图清晰,但确实存在一些混淆、概念不清或表述不严谨的地方。下面我来为你总结、纠正并补充这段内容,让你一看就明白 MCP 到底是怎么回事。
✅ 一句话总结 MCP 架构核心
MCP 是一种用于 LLM 智能体连接多种外部工具与数据源的通用协议标准,它采用客户端-服务器模型,实现“多工具、多数据源、一致接入”的能力抽象。
✅ 正确的 MCP 架构划分与机制梳理
✅ 1. 三个角色的正确定义
架构角色 | 正确定义 | 这段文字中的问题 |
---|---|---|
Host(主机) | AI 应用运行的主环境,比如聊天机器人、插件平台、桌面 Claude | ✔️ 基本说清了 |
Client(客户端) | 运行在 Host 中、用于与 MCP Server 通信的组件,协议适配器 | ❌ 混淆了 Client 和 Host 的边界,有时候说成一回事 |
Server(服务器) | 对接具体工具/数据源、实现标准 MCP 接口的服务端 | ✔️ 说法基本准确 |
✅ 2. 架构图式的清晰表达
应该这样理解 MCP:
┌────────────┐
│ User / AI│
│ Claude 等LLM│
└────┬───────┘
↓
┌────────────┐
│ Host │ ← LLM应用运行的地方
└────┬───────┘
↓
┌───────────────┐
│ MCP Client(s) │ ← 一个或多个客户端,负责接协议
└────┬────┬──────┘
↓ ↓
┌──────┐ ┌──────┐
│Server│ │Server│ ← 每个 MCP Server 对接一个数据源/工具
└──────┘ └──────┘
每个 MCP Client 连接一个 MCP Server,类似“插上一个数据/功能模块”。
✅ MCP 架构的工作机制
- AI 发出请求(例如“查找项目X中的API文档”)
- Host 内部的 MCP Client 识别出这个请求需要哪种资源(如文件系统、API工具等)
- 该 MCP Client 使用 MCP 协议与对应的 MCP Server 通信
- Server 处理请求,访问数据源或工具,并返回结果
- Host 把 Server 的返回喂给 AI 模型继续推理
✅ 本质上,它让 LLM “长出 USB 插头”,能标准化地连接各种工具,像插件一样扩展能力。
✅ 易混淆点与补充说明
错误点 | 正确说明 |
---|---|
将 Host 和 Client 混为一谈 | Host 是运行 LLM 应用的宿主;Client 是其中的“MCP 协议通信器” |
“服务器是数据库” 的说法不严谨 | Server 是 MCP 协议实现者,它 可以 操作数据库、API、FS 等资源 |
类比三层架构容易误导 | 虽有“解耦”思想,但 MCP 不是传统前端-后端-DB 的 MVC 架构 |
忽视消息格式细节 | MCP 使用的是结构化 JSON 消息,定义了严格的格式与方法规范(如 call , read , write 等) |
忽略服务发现和连接管理机制 | 多个 MCP Server 的发现机制、注册、认证等仍需开发者约定或中间件支持 |
✅ MCP 的强大之处(总结)
- 📦 标准化接口:只要实现 MCP 协议,任何数据源/工具都能接入 LLM
- 🔌 多 Client 多 Server 可扩展:一个 AI 应用可同时连多个 Server
- 🔄 模块热插拔:像接 USB 设备一样,MCP Server 可自由启停
- 💡 "Once written, anywhere usable":Client 无需关心 Server 的数据结构,只需遵守协议
- 🚀 极大增强 LLM 应用生态的可扩展性与复用性
✅ 进一步了解:
来啦!以下是一张通俗易懂的 MCP 数据流图,结合“Claude 桌面应用 + 多工具插件”的使用场景,让你一眼看懂它怎么工作的:
🧠 MCP 数据流图:LLM 智能体如何通过 MCP 与外部工具协作
[ 用户 ]
│
▼
┌──────────────────┐
│ Claude 主机 │(Host)
│(运行 AI 模型) │
└────────┬─────────┘
│
请求输入(如“找文档”)
▼
┌──────────────────┐
│ MCP Client(s) │(协议通信层)
│ 每个 client 对应一个工具 │
└─┬──────────┬─────┬──┘
│ │ │
▼ ▼ ▼
┌──────────┐ ┌────────────┐ ┌────────────┐
│ Server A │ │ Server B │ │ Server C │ ← MCP Server
│ 文件系统 │ │ 本地数据库 │ │ 网络 API │ (统一协议接口)
└────┬─────┘ └────┬───────┘ └────┬───────┘
│ │ │
▼ ▼ ▼
[ 文件数据 ] [ 数据记录 ] [ Web 服务数据 ]
🔁 数据流动过程(举例说明)
用户对 Claude 说:“帮我查一下项目 X 的 API 文档”
Claude(Host)接到任务
内部 MCP Client-A 识别出:这可能涉及到文件系统
Client-A 用 MCP 协议向 Server-A 发出请求:
{ "action": "read", "path": "/projectX/docs/api.md" }
Server-A(文件系统)读取文件并返回内容
Client-A 把数据交回 Claude,继续上下文推理
✅ 图中关键点总结:
组件 | 功能 |
---|---|
Host(主机) | AI 模型执行的主环境 |
MCP Client | 协议翻译器,把请求转成标准格式 |
MCP Server | 工具/数据源的 MCP 协议适配器 |
数据源 | 实际的数据位置或服务入口(如文件、数据库、API) |
MCP 客户端与服务端通信示例代码
使用 Python 实现,采用标准 HTTP + JSON
接口方式模拟 MCP 通信。
✅ 示例场景:
Claude 主机通过 MCP Client 访问一个 MCP Server,请求读取本地文件内容
/notes/todo.txt
。
🧱 1. MCP Server 示例(Python Flask 版)
这是一个简化版 MCP Server,支持 read
动作,模拟访问一个本地文件:
# mcp_server.py
from flask import Flask, request, jsonify
import os
app = Flask(__name__)
@app.route('/mcp', methods=['POST'])
def handle_mcp():
data = request.json
action = data.get("action")
path = data.get("path")
if action == "read":
try:
with open(path, "r", encoding="utf-8") as f:
content = f.read()
return jsonify({"status": "success", "content": content})
except Exception as e:
return jsonify({"status": "error", "message": str(e)})
else:
return jsonify({"status": "error", "message": f"Unsupported action: {action}"})
if __name__ == '__main__':
app.run(port=5005)
🛰 2. MCP Client 示例(请求代码)
这是 Claude 主机里运行的 MCP Client,向上面的 Server 发出标准 MCP 请求:
# mcp_client.py
import requests
def send_mcp_request(server_url, action, path):
payload = {
"action": action,
"path": path
}
response = requests.post(server_url, json=payload)
return response.json()
# 示例:读取本地的一个文件
if __name__ == "__main__":
server_url = "http://localhost:5005/mcp"
result = send_mcp_request(server_url, "read", "./notes/todo.txt")
if result.get("status") == "success":
print("[MCP 返回内容]:")
print(result["content"])
else:
print("[MCP 错误]:", result.get("message"))
✅ 消息格式说明(符合 MCP 协议简化版)
📤 客户端请求(JSON)
{
"action": "read",
"path": "./notes/todo.txt"
}
📥 服务器响应(成功)
{
"status": "success",
"content": "今天要干三件事:\n1. 写报告\n2. 看电影\n3. 喝咖啡"
}
📥 服务器响应(错误)
{
"status": "error",
"message": "File not found"
}
🧠 延伸点(可加)
你可以拓展支持以下标准动作:
"write"
写入文件或数据"list"
列出某路径下的文件"call"
执行远程函数(例如调用 API 工具)"status"
查询 Server 状态