🧩 MCP生态

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

发布时间:2026-04-16 分类: MCP生态
摘要:MCP:意外诞生的通用操作系统层MCP不是插件标准MCP(Multi-Cloud Protocol)常被误读为“又一个插件协议”。它不是。 它没有从插件需求出发,也没有围绕IDE扩展设计。它的核心是一套运行时无关的通信协议——定义请求、响应、流式传输、错误语义和能力发现的最小集合。VS Code 插件、浏览器沙箱里的 JS 客户端、本地运行的 CLI Agent,都是这个协议的实现者,而非...

封面

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 Codevscode.window.onDidReceiveMessage + postMessage
浏览器WebSocket + fetch + SharedWorker(用于多标签同步)
本地 AgentUnix 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"])

你不需要学新语法。你只需要理解 typeidmethodparamsstatusdata 这六个字段。

2. Server 开发:业务逻辑即协议实现

MCP Server 不要求你继承框架类、不扫描装饰器、不注册路由表。它只等待一个函数:给定 methodparams,返回 statusdata

用 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 没有“学习路径”,只有两个动作:

  1. 读协议规范mcp-spec.org —— 12 页 Markdown,含完整消息格式、错误码表、握手流程;
  2. 跑通最小闭环:用 curlplayground.mcp.dev 发一个 {"type":"request","method":"ping"},看返回;再用 Python websocket-client 复现一遍。

之后的事,取决于你想暴露什么能力:

  • 想让模型可调用?写个 method: chat handler;
  • 想让数据库可查询?写个 method: sql_exec handler;
  • 想让硬件传感器可读?写个 method: read_sensor handler。

协议不变,能力生长。

返回首页