MCP协议是什么?解析Multi-Cloud Protocol通用操作系统层核心技术

MCP:意外诞生的通用操作系统层
MCP不是插件标准
MCP(Multi-Cloud Protocol)常被误读为“又一个插件协议”。它不是。
它没有从插件需求出发,也没有围绕IDE扩展设计。它的核心是一套运行时无关的通信协议——定义请求、响应、流式传输、错误语义和能力发现的最小集合。VS Code 插件、浏览器沙箱里的 JS 客户端、本地运行的 CLI Agent,都是这个协议的实现者,而非协议本身的目标。
协议跑通了,运行时才开始说话。
协议即层:轻量、跨平台、无绑定
轻量是默认值,不是优化目标
MCP 没有中间代理、不强制序列化格式(支持 JSON、CBOR、甚至自定义二进制帧)、不内置服务发现或负载均衡。它只做三件事:建立连接、交换带类型标记的消息、保证顺序交付。消息体完全由业务定义,协议层不解析、不校验、不重试。
这意味着:
- 在浏览器里,
fetch()或WebSocket直连 MCP Server,零依赖; - 在嵌入式设备上,用 2KB 的 C 实现就能完成完整协议栈;
- 在 VS Code 中,插件只需转发
onRequest到后端,不处理任何协议细节。
运行时兼容性来自协议,而非适配器
MCP 不靠“SDK 适配”兼容不同环境。它靠的是每个运行时都提供原生能力来满足协议基础要求:
| 运行时 | 提供的能力 |
|---|---|
| VS Code | vscode.window.onDidReceiveMessage + postMessage |
| 浏览器 | WebSocket + fetch + SharedWorker(用于多标签同步) |
| 本地 Agent | Unix domain socket / TCP / stdin/stdout |
只要运行时能收发字节流并区分消息边界,就能跑 MCP。所谓“原生兼容”,其实是协议足够薄,薄到不需要兼容层。
三个真实可用的开发切口
1. 协议解析:几行代码就跑通
MCP 客户端库只封装连接管理和消息路由。协议本身就是结构化的 JSON 对象。下面这段代码在任何 Python 环境里都能直接运行(无需额外 SDK):
import json
import websocket
ws = websocket.WebSocket()
ws.connect("ws://localhost:8080")
# 发送标准 MCP 请求
req = {
"type": "request",
"id": "req-123",
"method": "get_user",
"params": {"user_id": 123}
}
ws.send(json.dumps(req))
# 接收响应
resp = json.loads(ws.recv())
if resp.get("type") == "response" and resp.get("id") == "req-123":
if resp.get("status") == 200:
print("User:", resp["data"]["name"])你不需要学新语法。你只需要理解 type、id、method、params、status、data 这六个字段。
2. Server 开发:业务逻辑即协议实现
MCP Server 不要求你继承框架类、不扫描装饰器、不注册路由表。它只等待一个函数:给定 method 和 params,返回 status 和 data。
用 Flask 写一个 MCP 兼容端点,5 行搞定:
from flask import Flask, request, jsonify
app = Flask(__name__)
@app.post("/mcp")
def handle_mcp():
payload = request.get_json()
if payload.get("method") == "get_user":
user = fetch_user(payload["params"]["user_id"]) # 你的业务函数
return jsonify({"type": "response", "id": payload["id"], "status": 200, "data": user})
return jsonify({"type": "response", "id": payload["id"], "status": 404, "message": "unknown method"})协议层退到 HTTP 之下,HTTP 成为传输载体之一。你用什么 Web 框架、是否用异步、是否接数据库,MCP 都不关心。
3. Agent 接入:把已有模型包装成网络服务
Agent 不是新进程,而是对已有能力的协议暴露。比如你已经有一个 RAG pipeline,只需加一层薄胶水:
# 假设这是你原来的 RAG 类
class MyRAG:
def query(self, q): ...
# MCP Agent 就是调用它
from http.server import HTTPServer, BaseHTTPRequestHandler
class MCPHandler(BaseHTTPRequestHandler):
rag = MyRAG()
def do_POST(self):
data = json.loads(self.rfile.read(int(self.headers.get('Content-Length'))))
if data.get("method") == "rag_query":
result = self.rag.query(data["params"]["query"])
self.send_response(200)
self.end_headers()
self.wfile.write(json.dumps({
"type": "response",
"id": data["id"],
"status": 200,
"data": {"answer": result}
}).encode())
HTTPServer(("localhost", 9090), MCPHandler).serve_forever()Agent 的价值不在“智能”,而在于“可寻址”。一旦它有了 http://localhost:9090/mcp 这个地址,VS Code 插件、客服网页、手机 App 就能以统一方式调用它。
真实场景里它怎么工作
电商客服侧边栏
客服人员在后台系统里打开一个商品页,侧边栏自动加载 MCP Agent。
Agent 地址写死在前端配置里:wss://agents.example.com/product-rag。
页面发起 {"method": "get_related_questions", "params": {"sku": "ABC-123"}},300ms 内返回 5 个高频问题+答案摘要。
整个过程不经过客服系统后端,不改任何现有 API,不引入新鉴权流程。
金融风控流水线
交易系统生成一笔支付事件,通过 Kafka 发往风控集群。
其中一个消费者是 MCP Server,监听 kafka://topic/tx-events,收到消息后触发 {"method": "assess_risk", "params": {...}}。
响应结果直接写回 Kafka 另一个 topic,下游清算服务订阅该 topic —— 所有环节只认 MCP 消息结构,不耦合语言、部署方式或序列化格式。
跨云模型调度
公司同时用 AWS Bedrock、Azure AI Studio 和私有 Llama 3 集群。
统一 MCP Router 部署在边缘节点,根据 model_family 参数把 {"method": "chat", "params": {...}} 路由到对应后端。
VS Code 插件、内部 BI 工具、客户自助门户,全部调用同一个 wss://router.internal/mcp 地址。换云厂商?只改 Router 配置,客户端零改动。
下一步:从协议文档开始
MCP 没有“学习路径”,只有两个动作:
- 读协议规范:mcp-spec.org —— 12 页 Markdown,含完整消息格式、错误码表、握手流程;
- 跑通最小闭环:用
curl向 playground.mcp.dev 发一个{"type":"request","method":"ping"},看返回;再用 Pythonwebsocket-client复现一遍。
之后的事,取决于你想暴露什么能力:
- 想让模型可调用?写个
method: chathandler; - 想让数据库可查询?写个
method: sql_exechandler; - 想让硬件传感器可读?写个
method: read_sensorhandler。
协议不变,能力生长。