MCP協(xié)議是什么?解析Multi-Cloud Protocol通用操作系統(tǒng)層核心技術(shù)

MCP:意外誕生的通用操作系統(tǒng)層
MCP不是插件標(biāo)準(zhǔn)
MCP(Multi-Cloud Protocol)常被誤讀為“又一個(gè)插件協(xié)議”。它不是。
它沒有從插件需求出發(fā),也沒有圍繞IDE擴(kuò)展設(shè)計(jì)。它的核心是一套運(yùn)行時(shí)無關(guān)的通信協(xié)議——定義請(qǐng)求、響應(yīng)、流式傳輸、錯(cuò)誤語義和能力發(fā)現(xiàn)的最小集合。VS Code 插件、瀏覽器沙箱里的 JS 客戶端、本地運(yùn)行的 CLI Agent,都是這個(gè)協(xié)議的實(shí)現(xiàn)者,而非協(xié)議本身的目標(biāo)。
協(xié)議跑通了,運(yùn)行時(shí)才開始說話。
協(xié)議即層:輕量、跨平臺(tái)、無綁定
輕量是默認(rèn)值,不是優(yōu)化目標(biāo)
MCP 沒有中間代理、不強(qiáng)制序列化格式(支持 JSON、CBOR、甚至自定義二進(jìn)制幀)、不內(nèi)置服務(wù)發(fā)現(xiàn)或負(fù)載均衡。它只做三件事:建立連接、交換帶類型標(biāo)記的消息、保證順序交付。消息體完全由業(yè)務(wù)定義,協(xié)議層不解析、不校驗(yàn)、不重試。
這意味著:
- 在瀏覽器里,
fetch()或WebSocket直連 MCP Server,零依賴; - 在嵌入式設(shè)備上,用 2KB 的 C 實(shí)現(xiàn)就能完成完整協(xié)議棧;
- 在 VS Code 中,插件只需轉(zhuǎn)發(fā)
onRequest到后端,不處理任何協(xié)議細(xì)節(jié)。
運(yùn)行時(shí)兼容性來自協(xié)議,而非適配器
MCP 不靠“SDK 適配”兼容不同環(huán)境。它靠的是每個(gè)運(yùn)行時(shí)都提供原生能力來滿足協(xié)議基礎(chǔ)要求:
| 運(yùn)行時(shí) | 提供的能力 |
|---|---|
| VS Code | vscode.window.onDidReceiveMessage + postMessage |
| 瀏覽器 | WebSocket + fetch + SharedWorker(用于多標(biāo)簽同步) |
| 本地 Agent | Unix domain socket / TCP / stdin/stdout |
只要運(yùn)行時(shí)能收發(fā)字節(jié)流并區(qū)分消息邊界,就能跑 MCP。所謂“原生兼容”,其實(shí)是協(xié)議足夠薄,薄到不需要兼容層。
三個(gè)真實(shí)可用的開發(fā)切口
1. 協(xié)議解析:幾行代碼就跑通
MCP 客戶端庫只封裝連接管理和消息路由。協(xié)議本身就是結(jié)構(gòu)化的 JSON 對(duì)象。下面這段代碼在任何 Python 環(huán)境里都能直接運(yùn)行(無需額外 SDK):
import json
import websocket
ws = websocket.WebSocket()
ws.connect("ws://localhost:8080")
# 發(fā)送標(biāo)準(zhǔn) MCP 請(qǐng)求
req = {
"type": "request",
"id": "req-123",
"method": "get_user",
"params": {"user_id": 123}
}
ws.send(json.dumps(req))
# 接收響應(yīng)
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"])你不需要學(xué)新語法。你只需要理解 type、id、method、params、status、data 這六個(gè)字段。
2. Server 開發(fā):業(yè)務(wù)邏輯即協(xié)議實(shí)現(xiàn)
MCP Server 不要求你繼承框架類、不掃描裝飾器、不注冊(cè)路由表。它只等待一個(gè)函數(shù):給定 method 和 params,返回 status 和 data。
用 Flask 寫一個(gè) MCP 兼容端點(diǎn),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"]) # 你的業(yè)務(wù)函數(shù)
return jsonify({"type": "response", "id": payload["id"], "status": 200, "data": user})
return jsonify({"type": "response", "id": payload["id"], "status": 404, "message": "unknown method"})協(xié)議層退到 HTTP 之下,HTTP 成為傳輸載體之一。你用什么 Web 框架、是否用異步、是否接數(shù)據(jù)庫,MCP 都不關(guān)心。
3. Agent 接入:把已有模型包裝成網(wǎng)絡(luò)服務(wù)
Agent 不是新進(jìn)程,而是對(duì)已有能力的協(xié)議暴露。比如你已經(jīng)有一個(gè) RAG pipeline,只需加一層薄膠水:
# 假設(shè)這是你原來的 RAG 類
class MyRAG:
def query(self, q): ...
# MCP Agent 就是調(diào)用它
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 的價(jià)值不在“智能”,而在于“可尋址”。一旦它有了 http://localhost:9090/mcp 這個(gè)地址,VS Code 插件、客服網(wǎng)頁、手機(jī) App 就能以統(tǒng)一方式調(diào)用它。
真實(shí)場(chǎng)景里它怎么工作
電商客服側(cè)邊欄
客服人員在后臺(tái)系統(tǒng)里打開一個(gè)商品頁,側(cè)邊欄自動(dòng)加載 MCP Agent。
Agent 地址寫死在前端配置里:wss://agents.example.com/product-rag。
頁面發(fā)起 {"method": "get_related_questions", "params": {"sku": "ABC-123"}},300ms 內(nèi)返回 5 個(gè)高頻問題+答案摘要。
整個(gè)過程不經(jīng)過客服系統(tǒng)后端,不改任何現(xiàn)有 API,不引入新鑒權(quán)流程。
金融風(fēng)控流水線
交易系統(tǒng)生成一筆支付事件,通過 Kafka 發(fā)往風(fēng)控集群。
其中一個(gè)消費(fèi)者是 MCP Server,監(jiān)聽 kafka://topic/tx-events,收到消息后觸發(fā) {"method": "assess_risk", "params": {...}}。
響應(yīng)結(jié)果直接寫回 Kafka 另一個(gè) topic,下游清算服務(wù)訂閱該 topic —— 所有環(huán)節(jié)只認(rèn) MCP 消息結(jié)構(gòu),不耦合語言、部署方式或序列化格式。
跨云模型調(diào)度
公司同時(shí)用 AWS Bedrock、Azure AI Studio 和私有 Llama 3 集群。
統(tǒng)一 MCP Router 部署在邊緣節(jié)點(diǎn),根據(jù) model_family 參數(shù)把 {"method": "chat", "params": {...}} 路由到對(duì)應(yīng)后端。
VS Code 插件、內(nèi)部 BI 工具、客戶自助門戶,全部調(diào)用同一個(gè) wss://router.internal/mcp 地址。換云廠商?只改 Router 配置,客戶端零改動(dòng)。
下一步:從協(xié)議文檔開始
MCP 沒有“學(xué)習(xí)路徑”,只有兩個(gè)動(dòng)作:
- 讀協(xié)議規(guī)范:mcp-spec.org —— 12 頁 Markdown,含完整消息格式、錯(cuò)誤碼表、握手流程;
- 跑通最小閉環(huán):用
curl向 playground.mcp.dev 發(fā)一個(gè){"type":"request","method":"ping"},看返回;再用 Pythonwebsocket-client復(fù)現(xiàn)一遍。
之后的事,取決于你想暴露什么能力:
- 想讓模型可調(diào)用?寫個(gè)
method: chathandler; - 想讓數(shù)據(jù)庫可查詢?寫個(gè)
method: sql_exechandler; - 想讓硬件傳感器可讀?寫個(gè)
method: read_sensorhandler。
協(xié)議不變,能力生長(zhǎng)。