深入解析Model Context Protocol,小白也能懂的MCP實戰 原創
Model Context Protocol (MCP) 是一個專為大型語言模型設計的開放協議,旨在解決AI模型與外部工具、數據源交互的挑戰。本文將聚焦于Python MCP SDK,詳細講解如何使用Python構建MCP服務器和客戶端,實現大語言模型與外部工具的無縫連接。
Python作為AI和數據科學領域的主流語言,擁有豐富的生態系統和工具鏈。Python MCP SDK提供了一套簡潔、高效的API,使開發者能夠快速構建安全、可擴展的AI應用。本文將通過一個簡單的電燈開關服務示例,展示如何使用Python MCP SDK構建實用的AI應用。
MCP 與 Streamable HTTP
MCP 協議回顧
Model Context Protocol (MCP) 是一個為大型語言模型(LLMs)量身打造的開放協議,旨在搭建模型與外部世界之間的標準化橋梁。在AI應用日益復雜的今天,安全、高效的模型-工具交互成為關鍵挑戰,MCP正是應這一挑戰而生。
MCP協議的核心由三大功能支柱構成:
- 工具(Tools):模型可調用的功能性接口,使其能夠執行具體操作,如控制智能設備、查詢數據庫或發送郵件等。
- 資源(Resources):可被客戶端訪問的結構化數據,通過URI唯一標識,可以是靜態文件或動態生成的內容。
- 提示詞(Prompts):專為特定任務設計的指導模板,幫助模型生成更精準、更相關的輸出。
MCP協議的核心價值在于:
- 統一標準:提供一致的接口規范,簡化集成流程
- 安全可控:精細的權限管理與訪問控制
- 靈活擴展:支持多種傳輸協議和通信模式
- 跨平臺兼容:不同語言實現可無縫協作
Streamable HTTP 傳輸機制
Streamable HTTP是MCP生態系統中的核心傳輸機制,它巧妙地融合了HTTP協議的普遍兼容性與流式傳輸的實時交互能力。與傳統的“請求-等待-響應”模式不同,Streamable HTTP允許數據在生成的同時即時傳遞,打破了必須等待完整響應的限制。
這種傳輸機制在AI應用場景中具有獨特優勢:
- 實時響應:大型語言模型生成的內容可以流式傳遞,用戶無需等待完整結果
- 長連接支持:適用于需要持續通信的復雜交互場景
- 進度反饋:長時間運行的工具可實時報告執行狀態
- 資源效率:通過流式處理減少內存占用和響應延遲
Streamable HTTP在MCP中的實現充分考慮了現代Web應用的需求,為開發者提供了一種靈活、高效的方式來構建響應迅速、交互豐富的AI應用。
Streamable HTTP vs SSE
Streamable HTTP和Server-Sent Events (SSE)都是實現服務器向客戶端推送數據的技術,但它們有一些關鍵區別:
特性 | Streamable HTTP | SSE |
協議 | 基于標準HTTP | 基于HTTP的專用協議 |
內容類型 | 靈活,通常為? | 固定為? |
消息格式 | 自定義,通常為JSON | 特定格式(? |
雙向通信 | 支持(通過多個HTTP請求) | 僅服務器到客戶端 |
重連機制 | 需要自行實現 | 內置自動重連 |
瀏覽器支持 | 所有現代瀏覽器 | 大多數現代瀏覽器(IE除外) |
跨域支持 | 需要CORS配置 | 需要CORS配置 |
適用場景 | 復雜交互,需要自定義格式 | 簡單的服務器推送更新 |
Streamable HTTP在MCP中的優勢:
- 靈活性:可以自定義消息格式和協議細節
- 兼容性:幾乎所有HTTP客戶端都支持
- 雙向通信:可以實現更復雜的交互模式
- 狀態管理:支持有狀態和無狀態兩種模式
- 擴展性:易于擴展和定制化
MCP Python SDK提供了對Streamable HTTP的完整支持,使開發者能夠輕松構建基于此傳輸機制的應用。
Streamable HTTP 技術原理
Streamable HTTP在MCP協議中的實現采用了靈活的雙向通信架構,其核心工作原理如下:
- 通信協議層:
- 客戶端通過HTTP POST請求發送JSON-RPC格式的消息
- 服務器可根據需要返回單一JSON響應或啟動SSE流
- 雙向通信通過結合POST和GET請求實現
- 數據傳輸模式:
- 即時模式:單一JSON響應(?
?Content-Type: application/json??),適用于簡單、快速的交互 - 流式模式:SSE流(?
?Content-Type: text/event-stream??),適用于長時間、持續的數據傳輸
- 交互模式創新:
- 客戶端可以發起請求并接收流式響應
- 服務器可以主動發起通知和請求
- 支持復雜的多輪對話和并行交互
這種設計使得Streamable HTTP在以下場景中表現出色:
- 大模型流式生成:實時展示生成過程,提升用戶體驗
- 復雜工具調用:實時反饋執行狀態和中間結果
- 分布式系統集成:支持多終端、多服務的協同工作
- 高并發場景:高效處理大量并發連接和請求
會話管理與狀態維護
Streamable HTTP支持有狀態會話,以在多個請求之間維護上下文:
- 會話初始化:服務器可以在初始化期間通過在?
?Mcp-Session-Id??頭部中包含會話ID來分配會話 - 會話持久性:客戶端必須在所有后續請求中使用?
?Mcp-Session-Id??頭部包含會話ID - 會話終止:可以通過發送帶有會話ID的HTTP DELETE請求來顯式終止會話
會話管理在MCP中的重要性:
- 允許服務器在多個請求之間保持狀態
- 提供更連貫的用戶體驗
- 支持復雜的交互模式
- 減少重復初始化的開銷
- 提高安全性,通過會話ID驗證請求
可恢復性與重傳機制
Streamable HTTP傳輸支持連接中斷后的恢復和消息重傳,這對于不穩定網絡環境下的應用尤為重要:
- 消息序列號:每個消息都有唯一的序列號,用于跟蹤已接收的消息
- 斷點恢復:客戶端可以在重新連接時指定最后接收的消息序列號
- 消息緩存:服務器可以緩存已發送的消息,以便在客戶端請求時重新發送
可恢復性的關鍵優勢:
- 提高可靠性:即使在網絡不穩定的情況下也能保證消息傳遞
- 無縫體驗:用戶在連接中斷后可以繼續之前的會話
- 資源效率:避免重新處理已完成的請求
- 狀態一致性:確保客戶端和服務器狀態同步
Streamable HTTP 在 MCP 中的架構設計
Streamable HTTP在MCP中的架構設計遵循以下原則:
- 分層設計:
- 傳輸層:處理HTTP連接和消息傳遞
- 會話層:管理會話狀態和上下文
- 應用層:處理業務邏輯和工具調用
- 事件驅動模型:
- 服務器可以主動推送事件和通知
- 客戶端可以實時響應服務器事件
- 支持異步處理和并行操作
- 安全考慮:
- 會話認證和授權
- 消息加密和完整性驗證
- 防止跨站請求偽造(CSRF)攻擊
- 限速和資源保護
- 性能優化:
- 連接池管理
- 消息批處理
- 選擇性響應壓縮
- 緩存策略
通過這些機制,Streamable HTTP在MCP中提供了一種強大而靈活的傳輸方式,適用于各種復雜的AI應用場景。它結合了HTTP的普遍兼容性和流式傳輸的實時性,為大語言模型與外部工具的交互提供了理想的通信基礎。
MCP Python SDK 生態系統
MCP Python 實現概覽
Model Context Protocol 在 Python 生態中有兩種主要實現:官方的 Python SDK(??modelcontextprotocol/python-sdk??)和社區驅動的 FastMCP 2.0。這兩種實現為開發者提供了不同層次的抽象和靈活性,可以根據項目需求選擇合適的工具。
官方 Python SDK
官方 MCP Python SDK 提供了完整的協議實現,包含兩個主要 API 層次:
- Server API:低級服務器接口,提供對 MCP 協議的完全控制
- FastMCP API:高級服務器接口,通過裝飾器簡化工具和資源定義
這個 SDK 專注于協議的完整性和標準合規性,適合需要精確控制協議行為的場景。
FastMCP 2.0
FastMCP 2.0 是一個獨立的實現,專注于開發體驗和易用性:
"The fast, Pythonic way to build MCP servers and clients."
它提供了更符合 Python 風格的 API,簡化了 MCP 服務器和客戶端的構建過程,特別適合快速原型開發和生產部署。
核心組件與架構
MCP Python 實現采用模塊化設計,主要包含以下核心組件:
- 服務器組件
- FastMCP:高級服務器 API,提供簡潔的裝飾器接口
- Server:低級服務器 API,提供協議級別的完全控制
- 客戶端組件
- ClientSession:管理與服務器的會話和通信
- Transport:處理不同傳輸機制的連接
- 通用組件
- 類型系統:定義協議消息和數據結構
- 認證模塊:提供多種認證方法
- 工具與資源抽象:統一接口定義和管理
這種分層架構使開發者能夠根據需求選擇合適的抽象級別,從高級 API 的簡便性到低級 API 的完全控制。
安裝與環境配置
安裝 MCP Python SDK 非常簡單。推薦使用 uv 來管理 Python 項目,因為它提供了更快的包安裝和依賴管理。
如果還沒有創建 uv 管理的項目,可以按照以下步驟創建:
uv init mcp-project
cd mcp-project然后將 MCP 添加到項目依賴中:
uv add "mcp[cli]"如果使用 pip 進行依賴管理,可以使用:
pip install "mcp[cli]"安裝完成后,可以使用 ??mcp?? 命令行工具來運行和管理 MCP 服務器:
uv run mcp快速入門示例
下面是一個簡單的 MCP 服務器示例,它暴露了一個計算器工具和一些數據:
# server.py
from mcp.server.fastmcp import FastMCP
# 創建 MCP 服務器
mcp = FastMCP("Demo")
# 添加一個加法工具
@mcp.tool()
def add(a: int, b: int) -> int:
"""將兩個數字相加"""
return a + b
# 添加一個動態問候資源
@mcp.resource("greeting://{name}")
def get_greeting(name: str) -> str:
"""獲取個性化問候"""
returnf"Hello, {name}!"可以使用 MCP Inspector 進行測試:
mcp dev server.py使用 Transport Type: ??STDIO??? 方式,Command: ??UV??? ,Arguments: ??run --with mcp mcp run server.py??

MCP Inspector
這個簡單的示例展示了MCP Python SDK的核心功能,包括工具定義和資源暴露。
MCP SDK 與 FastMCP 2.0 對比
特性 | 官方 MCP Python SDK | FastMCP 2.0 |
定位 | 完整協議實現 | 開發者友好的實現 |
API 風格 | 提供高低兩級 API | 專注于簡潔的 Pythonic API |
裝飾器支持 | 基本裝飾器 | 增強的裝飾器和上下文管理 |
類型系統 | 嚴格遵循協議規范 | 增強的類型推斷和驗證 |
異步支持 | 基本異步功能 | 全面的異步優化 |
部署選項 | 標準部署 | 簡化的部署流程 |
文檔 | 協議為中心 | 用例為中心 |
兩種實現都提供了完整的 MCP 功能,選擇哪一種主要取決于項目需求和開發者偏好。對于快速開發和簡潔代碼,FastMCP 2.0 可能是更好的選擇;而對于需要精確控制協議行為的場景,官方 SDK 可能更為合適。
生態系統與工具鏈
MCP Python 生態系統不僅包括核心 SDK,還包括一系列配套工具:
- MCP CLI:命令行工具,用于管理和測試 MCP 服務器
- MCP Inspector:可視化調試工具,用于檢查和測試 MCP 服務
- MCP Playground:交互式環境,用于快速原型開發
- MCP Extensions:擴展庫,提供額外功能和集成
這些工具共同構成了一個完整的開發環境,使 MCP 應用的開發、測試和部署變得更加高效。
在下一章中,我們將深入探討如何使用 MCP Python SDK 構建功能完善的服務器應用。
MCP Python Server 實戰開發
我們將深入探討如何使用官方 MCP Python SDK 構建實用的服務器應用。我們將重點關注 Streamable HTTP 傳輸機制的實現,并通過一個功能完善的智能電燈控制服務示例,展示 MCP 服務器的實際應用場景。
基于 Streamable HTTP 的服務器架構
Streamable HTTP 作為 MCP 生態系統中的核心傳輸機制,為開發者提供了強大的實時數據交互能力。它通過 HTTP 協議實現流式傳輸,允許服務器在處理過程中持續向客戶端推送數據,特別適合需要實時反饋和長連接交互的應用場景。
官方 MCP Python SDK 提供了專業的 ??StreamableHTTPSessionManager?? 類來實現這一傳輸機制。該類設計為與現代 ASGI 服務器框架(如 Starlette 和 Uvicorn)無縫集成,確保高性能、可擴展的 HTTP 流式傳輸能力。
以下是一個基于Streamable HTTP的無狀態MCP服務器的基本結構:
import asyncio
import contextlib
from collections.abc import AsyncIterator
from mcp.server.lowlevel import Server
from mcp.server.streamable_http_manager import StreamableHTTPSessionManager
from starlette.applications import Starlette
from starlette.routing import Mount
from starlette.types import Receive, Scope, Send
# 創建MCP服務器
app = Server("my-mcp-server")
# 定義工具和資源
# 例如: @app.call_tool(), @app.read_resource() 等
# 創建無狀態會話管理器
session_manager = StreamableHTTPSessionManager(
app=app,
event_store=None, # 無狀態模式不需要事件存儲
json_respnotallow=False, # 使用SSE流而不JSON響應
stateless=True, # 啟用無狀態模式
)
# 處理Streamable HTTP請求
asyncdef handle_streamable_http(scope: Scope, receive: Receive, send: Send) -> None:
await session_manager.handle_request(scope, receive, send)
# 定義生命周期管理
@contextlib.asynccontextmanager
asyncdef lifespan(app: Starlette) -> AsyncIterator[None]:
asyncwith session_manager.run():
yield
# 創建ASGI應用
starlette_app = Starlette(
routes=[Mount("/mcp", app=handle_streamable_http)],
lifespan=lifespan,
)
# 啟動服務器
import uvicorn
uvicorn.run(starlette_app, host="127.0.0.1", port=3000)上述代碼展示了一個基于 Streamable HTTP 的無狀態 MCP 服務器的核心架構。這種設計采用了現代 ASGI 框架的異步編程模型,實現了高效的請求處理和資源管理。
無狀態模式(stateless=True)是該架構的一個重要特點,它意味著每個請求都會創建一個全新的臨時連接,不會在請求之間保存會話狀態。這種設計非常適合水平擴展的分布式部署環境,可以在多節點集群中實現負載均衡和高可用性。
智能電燈控制服務實現
為了展示 MCP 服務器的實際應用,我們將實現一個功能完善的智能電燈控制服務。這個示例將展示如何將 MCP 的核心概念——工具和資源——應用到實際場景中,允許用戶查詢電燈狀態、控制電燈開關,并獲取狀態變更的實時反饋。
首先,我們需要創建一個結構良好的項目目錄:
mkdir -p mcp-light-switch/mcp_light_switch
touch mcp-light-switch/pyproject.toml
touch mcp-light-switch/mcp_light_switch/__init__.py
touch mcp-light-switch/mcp_light_switch/server.py接下來,我們在 ??pyproject.toml?? 中定義項目元數據和依賴關系:
[build-system]
requires = ["hatchling"]
build-backend = "hatchling.build"
[project]
name = "mcp-light-switch"
version = "0.1.0"
description = "MCP Light Switch Server Example"
requires-python = ">=3.10"
dependencies = [
"mcp>=0.1.0",
"uvicorn>=0.24.0",
"starlette>=0.31.0",
]
[project.scripts]
mcp-light-switch = "mcp_light_switch.server:main"現在,我們在 ??mcp_light_switch/server.py?? 中實現智能電燈控制服務的核心功能:
import asyncio
import contextlib
import logging
from collections.abc import AsyncIterator
from dataclasses import dataclass, field
from typing import Any, Dict, List
import click
import mcp.types as types
from mcp.server.lowlevel import Server
from mcp.server.streamable_http_manager import StreamableHTTPSessionManager
from starlette.applications import Starlette
from starlette.routing import Mount
from starlette.types import Receive, Scope, Send
# 配置日志
logging.basicConfig(
level=logging.INFO,
format="%(asctime)s - %(name)s - %(levelname)s - %(message)s",
)
logger = logging.getLogger(__name__)
# 電燈狀態類
@dataclass
class LightState:
is_on: bool = False
last_changed: str = "Never"# 最后一次狀態變更時間
# 全局電燈狀態
light_state = LightState()
def create_mcp_server() -> Server:
"""創建并配置MCP服務器"""
app = Server("mcp-light-switch")
@app.call_tool()
asyncdef call_tool(name: str, arguments: Dict[str, Any]) -> List[types.TextContent]:
"""處理工具調用"""
ctx = app.request_context
result = ""
# 根據工具名稱執行相應操作
if name == "turn-on-light":
result = turn_on_light()
elif name == "turn-off-light":
result = turn_off_light()
else:
raise ValueError(f"Unknown tool: {name}")
# 發送日志消息
await ctx.session.send_log_message(
level="info",
data=f"執行工具: {name}, 結果: {result}",
logger="light_switch",
related_request_id=ctx.request_id,
)
# 返回結果
return [
types.TextContent(
type="text",
text=result,
)
]
@app.list_tools()
asyncdef list_tools() -> List[types.Tool]:
"""列出可用工具"""
return [
types.Tool(
name="turn-on-light",
descriptinotallow="打開電燈",
inputSchema={
"type": "object",
"properties": {},
},
),
types.Tool(
name="turn-off-light",
descriptinotallow="關閉電燈",
inputSchema={
"type": "object",
"properties": {},
},
),
]
@app.read_resource()
asyncdef get_resource(uri: str) -> types.ReadResourceResult:
"""獲取資源"""
# 打印接收到的URI以便調試
logger.info(f"Received resource URI request: {uri}")
# 使用標準URL格式
if uri == "https://light.example/status":
# 返回當前電燈狀態
return types.ReadResourceResult(
cnotallow=types.TextContent(
type="text",
text=get_light_status_text(),
),
metadata={
"content-type": "text/plain",
},
)
else:
logger.error(f"Unknown resource URI: {uri}")
raise ValueError(f"Unknown resource URI: {uri}")
@app.list_resources()
asyncdef list_resources() -> List[types.Resource]:
"""列出可用資源"""
return [
types.Resource(
uri="light://status",
descriptinotallow="當前電燈狀態",
name="light_status",
),
]
return app
def turn_on_light() -> str:
"""打開電燈"""
global light_state
if light_state.is_on:
return"電燈已經是打開狀態"
light_state.is_on = True
light_state.last_changed = asyncio.get_event_loop().time()
logger.info("電燈已打開")
return"電燈已打開"
def turn_off_light() -> str:
"""關閉電燈"""
global light_state
ifnot light_state.is_on:
return"電燈已經是關閉狀態"
light_state.is_on = False
light_state.last_changed = asyncio.get_event_loop().time()
logger.info("電燈已關閉")
return"電燈已關閉"
def get_light_status_text() -> str:
"""獲取電燈狀態文本描述"""
global light_state
status = "開啟"if light_state.is_on else"關閉"
returnf"電燈狀態: {status}\n最后變更: {light_state.last_changed}"
@click.command()
@click.option("--port", default=3000, help="服務器監聽端口")
@click.option("--host", default="127.0.0.1", help="服務器監聽地址")
@click.option("--json-response", is_flag=True, help="使用JSON響應而不是SSE流")
def main(port: int, host: str, json_response: bool) -> int:
"""啟動MCP電燈開關服務器"""
# 創建MCP服務器
app = create_mcp_server()
# 創建會話管理器
session_manager = StreamableHTTPSessionManager(
app=app,
event_store=None,
json_respnotallow=json_response,
stateless=True,
)
# 處理Streamable HTTP請求
asyncdef handle_streamable_http(scope: Scope, receive: Receive, send: Send) -> None:
await session_manager.handle_request(scope, receive, send)
# 定義生命周期管理
@contextlib.asynccontextmanager
asyncdef lifespan(app: Starlette) -> AsyncIterator[None]:
asyncwith session_manager.run():
logger.info(f"MCP電燈開關服務器已啟動! 訪問: http://{host}:{port}/mcp")
yield
logger.info("MCP電燈開關服務器已關閉")
# 創建ASGI應用
starlette_app = Starlette(
debug=True,
routes=[Mount("/mcp", app=handle_streamable_http)],
lifespan=lifespan,
)
# 啟動服務器
import uvicorn
uvicorn.run(starlette_app, host=host, port=port)
return0
if __name__ == "__main__":
main()這個完整示例實現了一個功能完善的智能電燈控制服務,它展示了 MCP 協議的核心功能:
- 工具集成(Tools):
- ?
?turn-on-light??:控制電燈開啟,并返回狀態反饋 - ?
?turn-off-light??:控制電燈關閉,并返回狀態反饋
- 資源暴露(Resources):
- ?
?https://light.example/status??:提供電燈當前狀態和變更歷史
- 日志與狀態反饋:
- 通過?
?send_log_message?? 實現實時操作日志 - 記錄狀態變更時間戳信息
部署與運行服務
當服務代碼實現完成后,我們可以使用現代 Python 包管理工具 uv 來部署和運行這個 MCP 服務器。uv 提供了更快的依賴解析和安裝速度,非常適合開發環境。
首先,確保已安裝 uv:
pip install uv然后,在項目目錄中安裝依賴并啟動服務器:
cd mcp-light-switch
uv pip install -e .
uv run mcp_light_switch/server.py服務成功啟動后,將在 http://127.0.0.1:3000/mcp 端點提供 MCP 服務。開發者可以使用 MCP 客戶端或 MCP Inspector 工具與服務進行交互測試。
這個完整的智能電燈控制服務示例展示了如何使用官方 MCP Python SDK 構建一個功能完善的服務器應用。它充分利用了 MCP 的工具調用和資源訪問能力,并通過 Streamable HTTP 傳輸機制實現了高效的實時交互。

電燈開關 MCP Server 運行效果
MCP Python Client 實戰開發
我們已經了解了如何使用MCP Python SDK構建服務器應用。在本章中,我們將探討如何與MCP服務器進行交互,首先介紹MCP Inspector調試工具,然后實現一個基于Streamable HTTP傳輸機制的客戶端應用。
MCP Inspector 工具
在開發MCP應用時,調試和測試是非常重要的環節。MCP提供了一個強大的調試工具——MCP Inspector,它可以幫助開發者連接、測試和調試MCP服務器。
MCP Inspector 概述
MCP Inspector是一個基于Web的工具,可以連接到任何MCP服務器,并提供以下功能:
- 瀏覽服務器提供的工具和資源
- 調用工具并查看結果
- 訪問資源并查看內容
- 監控服務器日志和事件
- 測試服務器的各種功能
Inspector是一個獨立的工具,不需要安裝在服務器或客戶端上,可以通過npm包使用。
安裝和啟動 Inspector
使用npm安裝MCP Inspector非常簡單:
npm install -g @modelcontextprotocol/inspector或者,你可以直接使用npx運行Inspector,無需全局安裝:
npx @modelcontextprotocol/inspector啟動后,Inspector將在瀏覽器中打開,默認地址為http://localhost:3001。
使用 Inspector 連接服務器
啟動Inspector后,你可以通過界面連接到MCP服務器。在連接頁面中,你需要提供以下信息:
- 服務器URL:MCP服務器的URL,例如?
?http://localhost:3000/mcp?? - 傳輸類型:選擇傳輸機制,例如“Streamable HTTP”
- 認證信息:如果服務器需要認證,提供相應的認證信息
連接成功后,Inspector將顯示服務器的信息,包括可用的工具和資源。
使用 Inspector 測試電燈開關服務器
現在,讓我們使用Inspector來測試我們的電燈開關服務器。首先,確保電燈開關服務器已經啟動。
然后,啟動Inspector:
npx @modelcontextprotocol/inspector在Inspector界面中,按照以下步驟連接到服務器:
- 在連接頁面中,輸入服務器URL:?
?http://localhost:3000/mcp?? - 選擇傳輸類型:“Streamable HTTP”
- 點擊“Connect”按鈕
連接成功后,你可以在Inspector界面中看到以下內容:
- Tools選項卡:顯示可用的工具,包括?
?turn-on-light???和??turn-off-light?? - Resources選項卡:顯示可用的資源,包括?
?light://status?? - Events選項卡:顯示服務器發送的事件和日志信息
你可以通過Inspector執行以下操作:
- 調用工具:
- 在Tools選項卡中,選擇要調用的工具
- 填寫工具參數(如果有)
- 點擊“Call Tool”按鈕
- 查看工具調用結果和日志
- 訪問資源:
- 在Resources選項卡中,選擇要訪問的資源
- 點擊“Get Resource”按鈕
- 查看資源內容
- 監控事件:
- 在Events選項卡中,查看服務器發送的事件和日志信息
- 過濾特定類型的事件
通過Inspector,你可以方便地測試和調試MCP服務器,確保其功能正常工作。
MCP Client 開發
除了使用Inspector進行調試外,我們還可以開發自己的MCP客戶端應用,以編程方式與MCP服務器交互。
MCP Client 概述
MCP Python SDK提供了一個靈活、強大的客戶端組件——??Client???類,它是應用程序與MCP服務器交互的核心橋梁。通過??Client??,應用程序可以無縫地連接到MCP服務器,調用各種工具、訪問資源并處理服務器發送的事件。
正如我們在代碼示例中看到的,創建一個MCP客戶端非常簡單:
from fastmcp import Client
# 創建客戶端,自動使用StreamableHttpTransport連接HTTP URL
client = Client("http://localhost:3000/mcp")??Client???類支持多種傳輸機制,包括stdio、SSE和Streamable HTTP,并會根據URL自動選擇最適合的傳輸方式。對于HTTP URL,它會自動使用??StreamableHttpTransport??,無需開發者進行額外配置。
MCP Client的核心功能包括:
- 連接管理:自動建立、維護和重連與MCP服務器的連接,處理各種網絡異常
- 工具調用:提供直觀的API來調用服務器的工具并處理返回結果,如代碼中的?
?await client.list_tools()?? - 資源訪問:簡化資源讀取操作,支持同步和異步訪問模式
- 事件處理:提供異步流式接口來接收和處理服務器發送的各類事件
- 會話管理:通過異步上下文管理器(?
?async with client:??)優雅地管理客戶端會話的生命周期
Streamable HTTP 傳輸
正如在第一章中介紹的,Streamable HTTP是一種結合了HTTP的普遍兼容性和流式傳輸實時性優勢的傳輸機制。MCP Python SDK提供了??StreamableHttpTransport??類,它實現了基于Streamable HTTP的客戶端傳輸。
??StreamableHttpTransport??的主要特點包括:
- 自動重連:在連接斷開時自動嘗試重新連接
- 流式處理:支持服務器的流式響應
- HTTP兼容性:可以與任何支持HTTP的服務器通信
- 代理支持:支持通過HTTP和SOCKS代理連接
- 自定義頭部:支持添加自定義HTTP頭部
對于HTTP URL,??Client???類會自動使用??StreamableHttpTransport??,無需顯式指定。這使得連接到基于HTTP的MCP服務器變得非常簡單。
安裝客戶端依賴
使用MCP客戶端需要安裝相應的依賴。推薦使用??uv??進行依賴管理:
uv add fastmcp如果需要使用HTTP代理功能,還需要安裝額外的依賴:
uv pip install "httpx[socks]"電燈開關客戶端示例
現在,讓我們創建一個客戶端來與我們在第三章中實現的電燈開關服務器進行交互。首先,創建一個新的Python文件??mcp_simple_client/client.py??:
from fastmcp import Client
import asyncio
asyncdef main():
# 創建客戶端并連接到電燈開關服務器
client = Client("http://localhost:3000/mcp")
asyncwith client:
# 列出可用的工具
tools = await client.list_tools()
print(f"\n可用的工具: {tools}")
# 列出可用的資源
resources = await client.list_resources()
print(f"\n可用的資源: {resources}")
# 讀取電燈狀態
status = await client.read_resource("light://status")
print(f"\n當前電燈狀態: {status}")
# 打開電燈
print("\n打開電燈...")
result = await client.call_tool("turn-on-light")
print(f"結果: {result}")
# 再次讀取電燈狀態
status = await client.read_resource("light://status")
print(f"\n電燈狀態現在是: {status}")
# 關閉電燈
print("\n關閉電燈...")
result = await client.call_tool("turn-off-light")
print(f"結果: {result}")
# 再次讀取電燈狀態
status = await client.read_resource("light://status")
print(f"\n電燈狀態現在是: {status}")
# 運行客戶端
asyncio.run(main())這個客戶端應用執行以下操作:
- 創建一個?
?Client??實例并連接到電燈開關服務器 - 列出服務器提供的工具和資源
- 讀取電燈的當前狀態
- 調用?
?turn-on-light??工具打開電燈 - 再次讀取電燈狀態以驗證變化
- 調用?
?turn-off-light??工具關閉電燈 - 再次讀取電燈狀態以驗證變化
運行客戶端
要運行客戶端,首先確保電燈開關服務器已經啟動。然后,使用以下命令運行客戶端:
uv run python mcp_simple_client/client.py運行結果將顯示如下:
可用的工具: ['turn-on-light', 'turn-off-light']
可用的資源: ['light://status']
當前電燈狀態: {'status': 'off'}
打開電燈...
結果: {'success': True}
電燈狀態現在是: {'status': 'on'}
關閉電燈...
結果: {'success': True}
電燈狀態現在是: {'status': 'off'}這個簡單的示例展示了MCP客戶端如何與服務器進行交互。客戶端可以列出工具和資源、調用工具和訪問資源,實現了與服務器的完整交互周期。
本文轉載自??AI 博物院?? 作者:longyunfeigu

















