開發環境
本機系統:macOS 26 26.0.1 (25A362)
UV
- Homebrew 安裝
brew install uv; - 電腦上已有或者可通過uv安裝的全部版本 python 環境
uv python list;
2.1 這條命令用於列出你係統上所有可通過 uv 安裝和管理的 Python 版本。列表中標記為<download available>的版本表示 uv 識別到該版本,但尚未下載到本地。標記為具體路徑(如/opt/homebrew/bin/python3.11)的版本表示該版本已經安裝在你的系統上。 - uv 安裝指定版本
uv install 3.13;我這裏本地超時了,或者使用指定鏡像均可; 清華源單次生效安裝UV_PYTHON_DOWNLOAD_BASE=https://mirrors.tuna.tsinghua.edu.cn/astral-sh/python-build-standalone/releases UV_HTTP_TIMEOUT=1200 uv python install 3.13安裝完成以後根據提示進行環境變量的加載
Installed Python 3.13.9 in 2m 42s
+ cpython-3.13.9-macos-aarch64-none (python3.13)
warning: `/Users/xxx/.local/bin` is not on your PATH. To use installed Python executables, run `export PATH="/Users/xxx/.local/bin:$PATH"` or `uv python update-shell`.
zhangyun@zhangyundeMacBook-Air ~ % uv python update-shell
Created configuration file: /Users/xxx/.zshenv
- 初始化文件夾 ,新建並進入文件夾進行初始化
cd ../User/xxx/pyworkspace/newsMCPServer
uv init . -p 3.13
// 結果如下
Initialized project `newsmcpserver` at `/Users/xxx/pyworkspace/newsMCPServer`
- 安裝 MCP SDK(開發工具包)
uv add "mcp[cli]" - 使用 VScode 打開上述文件夾;VScode 開發 python 需要安裝如下兩個插件
- UV 初始化完成的文件夾目錄如下
MCPServerDemo
- 測試環境是否正常;如下正常輸出即可
- 打開 https://github.com/modelcontextprotocol/python-sdk 並複製 demo 代碼
"""
FastMCP quickstart example.
cd to the `examples/snippets/clients` directory and run:
uv run server fastmcp_quickstart stdio
"""
# 固定寫法
from mcp.server.fastmcp import FastMCP
# 固定寫法
# Create an MCP server
mcp = FastMCP("Demo")
# Add an addition tool
@mcp.tool() # 聲明是一個mcp 的工具
def add(a: int, b: int) -> int: # 類型,告訴大模型傳入傳入的類型是什麼
# 註釋必須寫,使用自然語言告訴大模型這個函數是做什麼的
"""Add two numbers"""
return a + b
# Add a dynamic greeting resource
# 僅提供類似於 GET 接口,獲取數據
@mcp.resource("greeting://{name}")
def get_greeting(name: str) -> str:
"""Get a personalized greeting"""
return f"Hello, {name}!"
# Add a prompt
@mcp.prompt()
def greet_user(name: str, style: str = "friendly") -> str:
"""Generate a greeting prompt"""
styles = {
"friendly": "Please write a warm, friendly greeting",
"formal": "Please write a formal, professional greeting",
"casual": "Please write a casual, relaxed greeting",
}
return f"{styles.get(style, styles['friendly'])} for someone named {name}."
# 最後加入這段本地啓動
if __name__ == "__main__":
mcp.run(transport='stdio')
CherryStudio
下載地址 10 .使用 cherrystudio 接入本地 MCP 服務
第一次安裝,打開首頁以後點擊設置
點擊 MCP
和本人圖片中不一致則如下
使用 cherrystudio 調試;安裝內置設置的 UV 環境
配置本地 MCP 服務
其中參數行詳細命令:
–directory (文件路徑)
/Users/xxx/pyworkspace/newsMCPServer 項目路徑
run 固定
main.py 寫 demo 的文件
--directory
/Users/xxx/pyworkspace/newsMCPServer
run
main.py
配置完成以後點擊 cherrystudio 首頁;配置🔨,添加本地 MCP 服務,然後詢問測試;
MCPServer-SSE 模式
最後 main 方法切換成 sse 即可;
"""
FastMCP quickstart example.
cd to the `examples/snippets/clients` directory and run:
uv run server fastmcp_quickstart stdio
"""
# 固定寫法
from mcp.server.fastmcp import FastMCP
# 固定寫法
# Create an MCP server
mcp = FastMCP("Demo")
# Add an addition tool
@mcp.tool() # 聲明是一個mcp 的工具
def add(a: int, b: int) -> int: # 類型,告訴大模型傳入傳入的類型是什麼
# 註釋必須寫,使用自然語言告訴大模型這個函數是做什麼的
"""Add two numbers"""
return a + b
# Add a dynamic greeting resource
# 僅提供類似於 GET 接口,獲取數據
@mcp.resource("greeting://{name}")
def get_greeting(name: str) -> str:
"""Get a personalized greeting"""
return f"Hello, {name}!"
# Add a prompt
@mcp.prompt()
def greet_user(name: str, style: str = "friendly") -> str:
"""Generate a greeting prompt"""
styles = {
"friendly": "Please write a warm, friendly greeting",
"formal": "Please write a formal, professional greeting",
"casual": "Please write a casual, relaxed greeting",
}
return f"{styles.get(style, styles['friendly'])} for someone named {name}."
if __name__ == "__main__":
mcp.run(transport='sse')
重新啓動項目 ,啓動成功如下
source /Users/xxx/pyworkspace/newsMCPServer/.venv/bin/activate
xxx@xxx-Air newsMCPServer % source /Users/xxxx/pyworkspace/newsMCPServer/.venv/bin/activate
(newsmcpserver) xxx@xxx-Air newsMCPServer % /Users/xxx/pyworkspace/newsMCPServer/.venv/bin/python /Users/xxx/pyworkspace/newsMCPServer/main.py
INFO: Started server process [71566]
INFO: Waiting for application startup.
INFO: Application startup complete.
INFO: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit)
配置一個 SSE 服務的地址,選擇 SSE 模式,配置地址;
切換 MCP 服務
啓動後服務輸出日誌
MCP streamable-http 模式
與 SSE 修改一致
if __name__ == "__main__":
mcp.run(transport='streamable-http')
charrystudio配置如下,url 後綴換成 mcp
測試步驟與原先一致,不贅述;
vscode 輸出如下
[11/14/25 11:14:14] INFO Created new transport with session ID: a916b1805d0b4ab092625e0b4dc267a6 streamable_http_manager.py:233
INFO: 127.0.0.1:58478 - "POST /mcp HTTP/1.1" 200 OK
INFO: 127.0.0.1:58478 - "POST /mcp HTTP/1.1" 202 Accepted
INFO: 127.0.0.1:58478 - "GET /mcp HTTP/1.1" 200 OK
INFO: 127.0.0.1:58479 - "POST /mcp HTTP/1.1" 200 OK
INFO Processing request of type ListToolsRequest server.py:674
INFO: 127.0.0.1:58479 - "POST /mcp HTTP/1.1" 200 OK
INFO Processing request of type PingRequest server.py:674
INFO: 127.0.0.1:58479 - "POST /mcp HTTP/1.1" 200 OK
INFO Processing request of type ListPromptsRequest server.py:674
INFO: 127.0.0.1:58479 - "POST /mcp HTTP/1.1" 200 OK
INFO Processing request of type PingRequest server.py:674
INFO: 127.0.0.1:58479 - "POST /mcp HTTP/1.1" 200 OK
INFO Processing request of type ListResourcesRequest server.py:674
INFO: 127.0.0.1:58479 - "POST /mcp HTTP/1.1" 200 OK
INFO Processing request of type PingRequest server.py:674
INFO: 127.0.0.1:58479 - "POST /mcp HTTP/1.1" 200 OK
INFO Processing request of type PingRequest server.py:674
INFO: 127.0.0.1:58479 - "POST /mcp HTTP/1.1" 200 OK
[11/14/25 11:14:16] INFO Processing request of type PingRequest server.py:674
INFO: 127.0.0.1:58594 - "POST /mcp HTTP/1.1" 200 OK
[11/14/25 11:14:57] INFO Processing request of type PingRequest server.py:674
INFO: 127.0.0.1:58594 - "POST /mcp HTTP/1.1" 200 OK
INFO Processing request of type CallToolRequest server.py:674
INFO: 127.0.0.1:59024 - "POST /mcp HTTP/1.1" 200 OK
[11/14/25 11:16:46] INFO Processing request of type PingRequest server.py:674
INFO: 127.0.0.1:59024 - "POST /mcp HTTP/1.1" 200 OK
[11/14/25 11:16:48] INFO Processing request of type PingRequest server.py:674
三種傳輸機制之間的區別
|
特性維度 |
Stdio (標準輸入/輸出) |
HTTP + SSE (已棄用) |
Streamable HTTP (推薦) |
|
通信方式 |
雙向管道通信
|
客户端POST + 服務端SSE推送(雙通道)
|
統一端點,支持POST/GET,可按需升級為SSE流 |
|
連接模式 |
本地進程間通信
|
長連接(服務器需維持) |
靈活連接,支持短連接與按需長連接 |
|
適用場景 |
本地腳本、CLI工具、容器內調試
|
舊版遠程MCP服務器(已被棄用)
|
遠程服務、雲原生、Serverless、多客户端併發 |
|
核心優勢 |
簡單、安全、低延遲
|
實現服務端主動推送
|
無狀態設計、高兼容性、支持斷線重連、資源消耗低 |
|
主要侷限 |
無法跨網絡通信
|
連接不可恢復、服務器資源壓力大、基礎設施兼容性挑戰
|
作為最新標準,部分客户端庫的支持可能仍在完善中
|
💡 如何選擇傳輸機制
瞭解了基本區別後,你可以根據以下決策思路來選擇最適合你項目的傳輸機制。
- 🔧 開發本地工具或進行調試
如果你的MCP客户端和服務器運行在同一台機器上,例如在本地開發環境或一個Docker容器中,stdio - 🌐 構建遠程服務或雲原生應用
對於所有需要跨網絡通信的場景,你都應該選擇Streamable HTTP。
- 新項目:務必直接採用
Streamable HTTP,這是官方當前和未來的發展方向。 - 現有項目:如果你還在使用舊的
HTTP+SSE,建議制定計劃遷移到Streamable HTTP,以享受其在性能、資源消耗和兼容性方面帶來的好處。
- ⚠️ 關於SSE的特別説明
需要注意的是,SSE不再作為獨立的傳輸機制使用。在最新的MCP規範中,它已經被標記為“已棄用”,並由Streamable HTTP取代。不過,SSE的技術本身並未消失,而是作為一項可選能力被整合到了Streamable HTTP內部,用於處理需要流式推送的場景。
🚀 拓展與提醒
- 關注協議演進:MCP是一個快速發展的協議。從最初的
stdio到HTTP+SSE,再到統一的Streamable HTTP,其演進方向清晰地指向更簡化、更靈活、與雲基礎設施更兼容的設計。保持對官方文檔的關注是很重要的。