精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

深入解析Model Context Protocol,小白也能懂的MCP實戰 原創

發布于 2025-9-29 07:03
瀏覽
0收藏

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協議的核心由三大功能支柱構成:

  1. 工具(Tools):模型可調用的功能性接口,使其能夠執行具體操作,如控制智能設備、查詢數據庫或發送郵件等。
  2. 資源(Resources):可被客戶端訪問的結構化數據,通過URI唯一標識,可以是靜態文件或動態生成的內容。
  3. 提示詞(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的專用協議

內容類型

靈活,通常為??application/json??

固定為??text/event-stream??

消息格式

自定義,通常為JSON

特定格式(??event:???、??data:??等)

雙向通信

支持(通過多個HTTP請求)

僅服務器到客戶端

重連機制

需要自行實現

內置自動重連

瀏覽器支持

所有現代瀏覽器

大多數現代瀏覽器(IE除外)

跨域支持

需要CORS配置

需要CORS配置

適用場景

復雜交互,需要自定義格式

簡單的服務器推送更新

Streamable HTTP在MCP中的優勢:

  1. 靈活性:可以自定義消息格式和協議細節
  2. 兼容性:幾乎所有HTTP客戶端都支持
  3. 雙向通信:可以實現更復雜的交互模式
  4. 狀態管理:支持有狀態和無狀態兩種模式
  5. 擴展性:易于擴展和定制化

MCP Python SDK提供了對Streamable HTTP的完整支持,使開發者能夠輕松構建基于此傳輸機制的應用。

Streamable HTTP 技術原理

Streamable HTTP在MCP協議中的實現采用了靈活的雙向通信架構,其核心工作原理如下:

  1. 通信協議層
  • 客戶端通過HTTP POST請求發送JSON-RPC格式的消息
  • 服務器可根據需要返回單一JSON響應或啟動SSE流
  • 雙向通信通過結合POST和GET請求實現
  1. 數據傳輸模式
  • 即時模式:單一JSON響應(??Content-Type: application/json??),適用于簡單、快速的交互
  • 流式模式:SSE流(??Content-Type: text/event-stream??),適用于長時間、持續的數據傳輸
  1. 交互模式創新
  • 客戶端可以發起請求并接收流式響應
  • 服務器可以主動發起通知和請求
  • 支持復雜的多輪對話和并行交互

這種設計使得Streamable HTTP在以下場景中表現出色:

  • 大模型流式生成:實時展示生成過程,提升用戶體驗
  • 復雜工具調用:實時反饋執行狀態和中間結果
  • 分布式系統集成:支持多終端、多服務的協同工作
  • 高并發場景:高效處理大量并發連接和請求

會話管理與狀態維護

Streamable HTTP支持有狀態會話,以在多個請求之間維護上下文:

  1. 會話初始化:服務器可以在初始化期間通過在??Mcp-Session-Id??頭部中包含會話ID來分配會話
  2. 會話持久性:客戶端必須在所有后續請求中使用??Mcp-Session-Id??頭部包含會話ID
  3. 會話終止:可以通過發送帶有會話ID的HTTP DELETE請求來顯式終止會話

會話管理在MCP中的重要性:

  • 允許服務器在多個請求之間保持狀態
  • 提供更連貫的用戶體驗
  • 支持復雜的交互模式
  • 減少重復初始化的開銷
  • 提高安全性,通過會話ID驗證請求

可恢復性與重傳機制

Streamable HTTP傳輸支持連接中斷后的恢復和消息重傳,這對于不穩定網絡環境下的應用尤為重要:

  1. 消息序列號:每個消息都有唯一的序列號,用于跟蹤已接收的消息
  2. 斷點恢復:客戶端可以在重新連接時指定最后接收的消息序列號
  3. 消息緩存:服務器可以緩存已發送的消息,以便在客戶端請求時重新發送

可恢復性的關鍵優勢:

  • 提高可靠性:即使在網絡不穩定的情況下也能保證消息傳遞
  • 無縫體驗:用戶在連接中斷后可以繼續之前的會話
  • 資源效率:避免重新處理已完成的請求
  • 狀態一致性:確保客戶端和服務器狀態同步

Streamable HTTP 在 MCP 中的架構設計

Streamable HTTP在MCP中的架構設計遵循以下原則:

  1. 分層設計
  • 傳輸層:處理HTTP連接和消息傳遞
  • 會話層:管理會話狀態和上下文
  • 應用層:處理業務邏輯和工具調用
  1. 事件驅動模型
  • 服務器可以主動推送事件和通知
  • 客戶端可以實時響應服務器事件
  • 支持異步處理和并行操作
  1. 安全考慮
  • 會話認證和授權
  • 消息加密和完整性驗證
  • 防止跨站請求偽造(CSRF)攻擊
  • 限速和資源保護
  1. 性能優化
  • 連接池管理
  • 消息批處理
  • 選擇性響應壓縮
  • 緩存策略

通過這些機制,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 實現采用模塊化設計,主要包含以下核心組件:

  1. 服務器組件
  • FastMCP:高級服務器 API,提供簡潔的裝飾器接口
  • Server:低級服務器 API,提供協議級別的完全控制
  1. 客戶端組件
  • ClientSession:管理與服務器的會話和通信
  • Transport:處理不同傳輸機制的連接
  1. 通用組件
  • 類型系統:定義協議消息和數據結構
  • 認證模塊:提供多種認證方法
  • 工具與資源抽象:統一接口定義和管理

這種分層架構使開發者能夠根據需求選擇合適的抽象級別,從高級 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??

深入解析Model Context Protocol,小白也能懂的MCP實戰-AI.x社區

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 協議的核心功能:

  1. 工具集成(Tools)
  • ??turn-on-light??:控制電燈開啟,并返回狀態反饋
  • ??turn-off-light??:控制電燈關閉,并返回狀態反饋
  1. 資源暴露(Resources)
  • ??https://light.example/status??:提供電燈當前狀態和變更歷史
  1. 日志與狀態反饋
  • 通過??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 傳輸機制實現了高效的實時交互。

深入解析Model Context Protocol,小白也能懂的MCP實戰-AI.x社區

電燈開關 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服務器。在連接頁面中,你需要提供以下信息:

  1. 服務器URL:MCP服務器的URL,例如??http://localhost:3000/mcp??
  2. 傳輸類型:選擇傳輸機制,例如“Streamable HTTP”
  3. 認證信息:如果服務器需要認證,提供相應的認證信息

連接成功后,Inspector將顯示服務器的信息,包括可用的工具和資源。

使用 Inspector 測試電燈開關服務器

現在,讓我們使用Inspector來測試我們的電燈開關服務器。首先,確保電燈開關服務器已經啟動。

然后,啟動Inspector:

npx @modelcontextprotocol/inspector

在Inspector界面中,按照以下步驟連接到服務器:

  1. 在連接頁面中,輸入服務器URL:??http://localhost:3000/mcp??
  2. 選擇傳輸類型:“Streamable HTTP”
  3. 點擊“Connect”按鈕

連接成功后,你可以在Inspector界面中看到以下內容:

  • Tools選項卡:顯示可用的工具,包括??turn-on-light???和??turn-off-light??
  • Resources選項卡:顯示可用的資源,包括??light://status??
  • Events選項卡:顯示服務器發送的事件和日志信息

你可以通過Inspector執行以下操作:

  1. 調用工具
  • 在Tools選項卡中,選擇要調用的工具
  • 填寫工具參數(如果有)
  • 點擊“Call Tool”按鈕
  • 查看工具調用結果和日志
  1. 訪問資源
  • 在Resources選項卡中,選擇要訪問的資源
  • 點擊“Get Resource”按鈕
  • 查看資源內容
  1. 監控事件
  • 在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的核心功能包括:

  1. 連接管理:自動建立、維護和重連與MCP服務器的連接,處理各種網絡異常
  2. 工具調用:提供直觀的API來調用服務器的工具并處理返回結果,如代碼中的??await client.list_tools()??
  3. 資源訪問:簡化資源讀取操作,支持同步和異步訪問模式
  4. 事件處理:提供異步流式接口來接收和處理服務器發送的各類事件
  5. 會話管理:通過異步上下文管理器(??async with client:??)優雅地管理客戶端會話的生命周期

Streamable HTTP 傳輸

正如在第一章中介紹的,Streamable HTTP是一種結合了HTTP的普遍兼容性和流式傳輸實時性優勢的傳輸機制。MCP Python SDK提供了??StreamableHttpTransport??類,它實現了基于Streamable HTTP的客戶端傳輸。

??StreamableHttpTransport??的主要特點包括:

  1. 自動重連:在連接斷開時自動嘗試重新連接
  2. 流式處理:支持服務器的流式響應
  3. HTTP兼容性:可以與任何支持HTTP的服務器通信
  4. 代理支持:支持通過HTTP和SOCKS代理連接
  5. 自定義頭部:支持添加自定義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())

這個客戶端應用執行以下操作:

  1. 創建一個??Client??實例并連接到電燈開關服務器
  2. 列出服務器提供的工具和資源
  3. 讀取電燈的當前狀態
  4. 調用??turn-on-light??工具打開電燈
  5. 再次讀取電燈狀態以驗證變化
  6. 調用??turn-off-light??工具關閉電燈
  7. 再次讀取電燈狀態以驗證變化

運行客戶端

要運行客戶端,首先確保電燈開關服務器已經啟動。然后,使用以下命令運行客戶端:

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

?著作權歸作者所有,如需轉載,請注明出處,否則將追究法律責任
已于2025-9-29 07:03:06修改
收藏
回復
舉報
回復
相關推薦
日韩午夜av一区| 久久久久久夜精品精品免费| 久久久久久成人| 91丨porny丨对白| 黑人巨大亚洲一区二区久| 国产精品久久久久久久第一福利| 成人性生交大片免费看视频直播| 久久一二三四区| 美女少妇全过程你懂的久久| 欧美日韩国产首页| 福利视频一区二区三区四区| 毛片免费在线| 国产精品1区二区.| 日本精品久久久久久久| 丰满少妇被猛烈进入一区二区| 黑人久久a级毛片免费观看| 色哟哟精品一区| 久久天天东北熟女毛茸茸| 欧美性受xxxx狂喷水| 日本伊人精品一区二区三区观看方式| 欧美成人在线免费| 韩国三级hd中文字幕| theporn国产在线精品| 欧美中文一区二区三区| 草草视频在线免费观看| av在线女优影院| 99久久精品一区二区| 91久久久久久久久久| 激情视频网站在线观看| 欧美极品一区二区三区| 一区二区三区精品99久久| 中文字幕视频观看| 亚洲一区有码| 欧美三级日韩三级| 毛片av免费在线观看| 99re6在线精品视频免费播放| 国产精品久久久久9999吃药| 蜜桃精品久久久久久久免费影院| 国内老熟妇对白hdxxxx| 美腿丝袜亚洲三区| 国产91露脸中文字幕在线| 国产一级做a爱免费视频| 国产精品久久久久蜜臀| 国产一区二区三区视频| 亚洲第一成人网站| 欧美大奶一区二区| 亚洲成人av在线| 少妇高潮一69aⅹ| 国产精品一区免费在线| 欧美日韩色一区| 日本爱爱免费视频| 日韩影片中文字幕| 一本一道波多野结衣一区二区| 97视频在线免费| 在线免费观看a视频| 亚洲丝袜另类动漫二区| 中文字幕中文字幕一区三区| 99中文字幕一区| 中文一区在线播放| 亚洲人成网站在线播放2019| 福利成人在线观看| 国产精品美女久久久久久| 少妇特黄a一区二区三区| 国产区视频在线| 国产精品网站导航| 一区二区免费在线观看| 久久bbxx| 亚洲最新视频在线观看| 免费一级特黄毛片| 日韩伦理福利| 欧美主播一区二区三区| 色戒在线免费观看| 国产精品一站二站| 亚洲国产精久久久久久| 菠萝菠萝蜜网站| 九九综合九九| 最近中文字幕日韩精品| 精品国产视频一区二区三区| 欧美+亚洲+精品+三区| 欧美激情视频三区| 西西44rtwww国产精品| 母乳一区在线观看| 国产精品香蕉在线观看| 99精品在线视频观看| 成人免费福利片| 蜜桃av久久久亚洲精品| 在线视频二区| 一区二区国产盗摄色噜噜| 久色视频在线播放| 日本肉肉一区| 日韩精品最新网址| 性久久久久久久久久| 日本a级不卡| 欧美日韩国产123| 4438国产精品一区二区| 免费在线成人网| 91嫩草在线视频| 午夜视频1000| 中文字幕精品—区二区四季| 国产又粗又爽又黄的视频| √8天堂资源地址中文在线| 在线观看日韩国产| 性生交大片免费看l| 免费观看久久av| 欧美日韩第一视频| 中文字幕在线2018| aa级大片欧美| 伊人av成人| 国产激情在线播放| 欧美精品在欧美一区二区少妇| 国产精品久久久久久亚洲色| 成人在线免费观看网站| 国产做受高潮69| 一级片免费观看视频| 972aa.com艺术欧美| 天天干天天操天天干天天操| 成人免费看视频网站| 日韩免费一区二区| jizz日本在线播放| 亚洲欧美日韩国产综合精品二区| 91一区二区三区| 第一页在线观看| 狠狠躁夜夜躁人人躁婷婷91 | 高清全集视频免费在线| 欧美午夜片欧美片在线观看| 99久久综合网| 亚洲成av人片乱码色午夜| 国产激情视频一区| 五月天激情婷婷| 一区二区三区日韩| 中文字幕成人免费视频| 九色精品91| 97在线看福利| 三级小视频在线观看| 一区二区三区在线视频免费| 日韩精品视频一二三| 色综合综合网| 奇门遁甲1982国语版免费观看高清| 成人1区2区3区| 亚洲欧美日韩国产中文在线| 国产三级三级看三级| 视频一区欧美| 5566成人精品视频免费| 天堂中文在线官网| 亚洲sss视频在线视频| 国产精品熟妇一区二区三区四区 | 一级黄色在线观看| 久久综合色婷婷| 777精品久无码人妻蜜桃| 粉嫩的18在线观看极品精品| 欧美日韩成人精品| www.狠狠干| 亚洲一区二区在线观看视频 | 一区在线不卡| 久久精品国产视频| 国产农村老头老太视频| 亚洲精品国久久99热| 国产传媒在线播放| 久久看人人爽人人| 92看片淫黄大片一级| 欧美调教网站| 青青草99啪国产免费| 你懂的视频在线播放| 欧美性xxxx18| 国产又黄又粗视频| 美女www一区二区| 日韩视频在线免费播放| 自拍偷拍亚洲| 欧美黑人狂野猛交老妇| 亚洲精品福利网站| 午夜av区久久| av中文字幕免费观看| 日本午夜精品一区二区三区电影| 午夜精品一区二区三区四区| 亚洲aⅴ网站| 欧美激情一区二区久久久| 日韩中文字幕观看| 一本久久综合亚洲鲁鲁五月天| 在线观看免费小视频| 激情五月激情综合网| av一区二区三区免费观看| 欧美三级午夜理伦三级在线观看 | 超碰超碰人人人人精品| 中文字幕亚洲欧美| 国产成人精品免费看视频| 亚洲成人av一区| 先锋影音av在线| 国产精品一卡二卡在线观看| 2022亚洲天堂| 99re66热这里只有精品8| 国产经品一区二区| 人人视频精品| 欧美肥臀大乳一区二区免费视频| 五月天激情婷婷| 欧美福利电影网| 国产情侣自拍av| 亚洲人成人一区二区在线观看| 四虎成人免费视频| 日本欧美在线看| 国产va亚洲va在线va| 欧美少妇性xxxx| 国产精品视频在线免费观看 | 91成人理论电影| 色偷偷偷在线视频播放| 久久精品国产99国产精品澳门 | 国产福利精品视频| 久久久久久不卡| 日韩美女视频19| 日本黄色特级片| 国产凹凸在线观看一区二区| 99热手机在线| 亚洲区第一页| 色哺乳xxxxhd奶水米仓惠香| 欧美精美视频| 国产精品一区视频| а天堂中文最新一区二区三区| 欧美一级黑人aaaaaaa做受| 成人福利网站| 一本色道久久综合狠狠躁篇的优点 | 午夜精品福利在线| 极品久久久久久| 中文在线免费一区三区高中清不卡| 亚洲一级av无码毛片精品| 国产麻豆一精品一av一免费| 91网址在线播放| 欧美综合二区| 欧美深夜福利视频| 欧美国产精品| 日韩第一页在线观看| 精品国产成人| 日本一区二区在线视频| 卡通动漫精品一区二区三区| 91视频免费进入| 国产美女亚洲精品7777| 国产日韩精品综合网站| 欧洲精品一区二区三区| 欧美又大粗又爽又黄大片视频| 精品精品导航| 欧美精品成人91久久久久久久| 国产成人午夜| 美日韩在线视频| 含羞草www国产在线视频| 日韩资源在线观看| 在线观看av黄网站永久| 亚洲天堂网站在线观看视频| 日本v片在线免费观看| 精品在线小视频| 四虎精品成人影院观看地址| 日韩经典一区二区三区| 青青草免费观看免费视频在线| 日韩精品在线观看视频| 无码精品人妻一区二区| 日韩成人小视频| 麻豆国产在线播放| 国产午夜精品视频免费不卡69堂| 久久米奇亚洲| 在线播放国产精品| 欧美人xxx| 欧美成人精品h版在线观看| av黄在线观看| 久久久久久久亚洲精品| 欧美freesex黑人又粗又大| 日韩av电影中文字幕| 国产精品毛片久久久久久久久久99999999| 国产精品电影观看| 热久久久久久| 91精品免费| 精品国产一区二区三区不卡蜜臂| 精品欧美日韩在线| 精品国产91乱码一区二区三区四区 | 国产免费观看久久黄| 中文成人在线| 国产欧美韩日| 国产欧美日韩影院| 亚洲一区二区精品在线| 欧美一区在线看| 少妇人妻在线视频| 奇米色一区二区| 国产老头和老头xxxx×| 91年精品国产| 国产乱子轮xxx农村| 一区二区三区**美女毛片| 国产成人精品一区二三区| 91久久久免费一区二区| 国产精品无码白浆高潮| 亚洲成色777777在线观看影院| 青青青草原在线| 日韩在线国产精品| eeuss鲁一区二区三区| 国产精品成人观看视频国产奇米| 国产剧情一区二区在线观看| 韩国一区二区三区美女美女秀| 国产综合久久久| 日韩精品一区二区三区四| 久久久噜噜噜| 一级全黄裸体片| 欧美高清在线一区| 国产无码精品视频| 欧美三级韩国三级日本三斤| 风流老熟女一区二区三区| 中文字幕av一区二区三区谷原希美| 怡红院在线播放| 国产精品海角社区在线观看| 中文字幕久久精品一区二区| 欧洲亚洲一区二区三区四区五区| 午夜久久影院| 网站一区二区三区| 成人午夜激情片| 国产精品精品软件男同| 日韩欧美国产黄色| 不卡视频免费在线观看| 永久免费毛片在线播放不卡| jizzjizz中国精品麻豆| 91精品久久久久久| 少妇一区二区视频| 国产二区视频在线| 国产在线麻豆精品观看| 永久免费毛片在线观看| 狠狠综合久久av一区二区小说 | 亚洲成人一区在线观看| 国产亚洲欧美一区二区| 91精品99| 亚洲综合婷婷久久| 欧美激情综合网| 一区二区三区在线观看av| 精品福利一区二区三区| 超碰在线免费播放| 欧美一区二区视频在线观看2022 | 国产在线精品一区二区不卡了 | 亚洲欧美另类图片小说| 国产情侣免费视频| 精品一区二区电影| 波多野结衣乳巨码无在线观看| 成人性生交大片免费观看嘿嘿视频| 国产精品亚洲片在线播放| av高清在线免费观看| 国产精品亚洲一区二区三区在线 | 亚洲大片在线观看| 成人av无码一区二区三区| 久久亚洲精品一区二区| crdy在线观看欧美| 亚洲资源视频| 久久 天天综合| 久久久精品少妇| 4438亚洲最大| av中文字幕在线观看| 91中文字幕在线观看| 91精品91| 国产乱国产乱老熟300部视频| 一级特黄大欧美久久久| 亚洲第一黄色片| 久久久久久有精品国产| 国产精品对白| 91传媒久久久| 欧美韩日一区二区三区四区| 国产精品sm调教免费专区| 在线日韩欧美视频| 精品国产三级| 亚洲色成人www永久在线观看| 成人免费观看av| 久久久久女人精品毛片九一| 国产一区二区三区免费视频| 精品176极品一区| 99亚洲国产精品| 99热99精品| 国产精品成人久久久| 久久精品久久久久电影| 香蕉大人久久国产成人av| 男女啪啪免费视频网站| 久久久午夜电影| 91中文字幕在线视频| 欧美高清在线视频观看不卡| 欧美电影在线观看免费| 黑森林精品导航| 有码一区二区三区| 五月天婷婷在线播放| 国产精品网红福利| 欧美视频二区| 97伦伦午夜电影理伦片| 欧美日韩一级片在线观看| 肉肉视频在线观看| 青青草原亚洲| 国产精品一卡二卡在线观看| 黑人一级大毛片| 日日噜噜噜夜夜爽亚洲精品| 98视频精品全部国产| 777久久久精品一区二区三区| 国产成人av福利| 久久亚洲成人av| 日韩精品在线观看网站| www久久久| 成年人午夜视频在线观看 | 欧美性极品少妇精品网站| 国产免费永久在线观看| 国产成人精品av| 一区免费在线| 成人在线手机视频| 亚洲国产91精品在线观看| 成人免费毛片嘿嘿连载视频…| 成年在线观看视频|