深度剖析 MCP 三大核心通信模式 STDIO、SSE 與 Streamable HTTP

MCP(Model Context Protocol)模型上下文協議提供三種核心的通信模式:STDIO、SSE 和 Streamable HTTP,在不同的場景中爲開發者提供了靈活且高效的數據傳輸方式。今天,我們將一起深入分析這三種模式,探討它們的應用場景與差異。

STDIO 模式

STDIO(Standard Input and Output) 是最基本的輸入輸出方式,廣泛應用於命令行工具、腳本編程以及本地調試過程中。它通過標準輸入、輸出和錯誤流來進行數據的傳輸。

適用場景:面向傳統命令行式交互,強調順序性與確定性,通常用於命令行工具、自動化腳本等短期交互場景。它是最基礎的數據傳輸方式,適合單次的、低延遲的交互任務,適合本地開發與調試。

from mcp.server.fastmcp import FastMCP
# 初始化FastMCP server,創建一個MCP服務器實例
mcp = FastMCP("mcpserver")
# @MCP.tool()裝飾器將這個函數註冊爲MCP工具
@mcp.tool()
def add(x: int, y: int) -> int:
    return x * y
if __name__ == "__main__":
    mcp.run(transport="stdio")

SSE 模式

SSE(Server-Sent Events) 是一種基於 HTTP 協議的單向數據流傳輸方式。它允許服務器主動向客戶端推送實時數據。SSE 通過保持一個持久的 HTTP 連接,將數據流式傳輸到客戶端,特別適合需要持續更新的實時場景。

適用場景: SSE 非常適合實時推送應用,如新聞更新、社交媒體通知、股票行情等。它適用於服務器向多個客戶端實時推送數據的場景。

from flask import Flask, Response, request
app = Flask(__name__)
# SSE事件流端點 (核心功能)
@app.route('/sse')
def sse_endpoint():
    def event_stream():
        # 1. 發送POST端點地址 (MCP規範要求)
        yield "event: endpoint\ndata: /post\n\n"
        # 2. 發送示例消息
        for i in range(3):
            yield f"data: 消息 {i+1}\n\n"
            time.sleep(1)
    return Response(event_stream(), mimetype='text/event-stream')
# 消息接收端點 (核心功能)
@app.route('/messages', methods=['POST'])
def receive_message():
    print(f"收到客戶端消息: {request.data.decode()}")
    return "OK"
if __name__ == '__main__':
    # 綁定本地地址 (安全要求)
    app.run(host='127.0.0.1', port=5000)

Streamable HTTP 模式

Streamable HTTP(是一種基於 HTTP 協議的流式傳輸技術,專門用於大文件(如視頻、音頻)的分段傳輸。與 SSE 不同,Streamable HTTP 允許文件在傳輸的同時被處理,使客戶端可以邊接收數據邊處理,避免等待整個文件加載完成。

適用場景: Streamable HTTP 非常適合大文件的流式傳輸,尤其在在線視頻、音頻流和其他大數據量內容的傳輸中,能極大地提高用戶體驗。

from flask import Flask, request, Response
import json
app = Flask(__name__)
@app.route('/add', methods=['POST'])
def stream_add():
    # 流式處理函數
    def generate():
        # 1. 逐行讀取流式輸入
        for line in request.stream:
            try:
                # 2. 解析JSON數據
                data = json.loads(line)
                a = data['a']
                b = data['b']
                # 3. 計算並返回結果(流式輸出)
                result = a + b
                yield f"data: {json.dumps({'result': result})}\n\n"
            except:
                yield "data: {\"error\": \"無效輸入\"}\n\n"
    # 4. 返回SSE流響應
    return Response(generate(), mimetype='text/event-stream')
if __name__ == '__main__':
    app.run(host='127.0.0.1', port=5000)

三大通信模式差異

本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源https://mp.weixin.qq.com/s/QUg4RXMZBlaRQYR03sNeJw