精品欧美一区二区三区在线观看 _久久久久国色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修改
收藏
回復
舉報
回復
相關推薦
www.国产一区二区| 美脚丝袜脚交一区二区| 中文字幕一区二区人妻| 午夜精品久久久久99热蜜桃导演| 精品国精品国产| 国产黄色一级网站| 免费观看在线黄色网| 丁香五精品蜜臀久久久久99网站| 欧美中文在线视频| 999精品视频在线观看播放| 好吊妞国产欧美日韩免费观看网站 | 国产有码在线一区二区视频| 久久久久免费看| 欧美最新另类人妖| 亚洲成人网久久久| 鲁一鲁一鲁一鲁一av| 999av小视频在线| 国产精品二三区| 久久日韩精品| 亚洲AV无码乱码国产精品牛牛| 三级久久三级久久| 久久久久久久香蕉网| 加勒比婷婷色综合久久| 精品久久一区| 精品香蕉一区二区三区| 永久看看免费大片| 四虎国产精品永久在线国在线 | 国产亚洲黄色片| 成人在线观看免费网站| 国产午夜精品久久久久久免费视| 风间由美久久久| 国产精品热久久| 日本不卡的三区四区五区| 亚洲91精品在线观看| www.超碰在线观看| 97精品在线| 一区二区中文字幕| 自拍偷拍亚洲天堂| 日本欧美韩国国产| 亚洲成av人片在线观看香蕉| www.亚洲自拍| 91精品在线免费视频| 欧美午夜不卡在线观看免费| 日本三区在线观看| 成人欧美magnet| 欧美日韩国产一区二区三区| www.亚洲视频.com| 国产丝袜在线观看视频| 一区二区三区在线观看网站| 青青视频免费在线观看| 最新日本在线观看| 亚洲最色的网站| 欧美国产日韩激情| 国产一二在线播放| 福利微拍一区二区| 免费看一级大黄情大片| 亚洲天堂资源| 色综合激情五月| 久草精品在线播放| 国产精品亚洲成在人线| 欧美日韩一级片在线观看| 亚洲国产日韩欧美在线观看| 久久伊人国产| 日韩限制级电影在线观看| 少妇性l交大片7724com| 亚洲精品a区| 亚洲国产精彩中文乱码av在线播放| 免费观看黄网站| av一级亚洲| 亚洲片在线资源| 我想看黄色大片| 天堂美国久久| 久久露脸国产精品| 丰满少妇xoxoxo视频| 奇米影视在线99精品| 成人高清视频观看www| www.色亚洲| 久久综合成人精品亚洲另类欧美 | 色综合久久综合网欧美综合网| 国产视频一区二区三区在线播放| 人人玩人人添人人澡欧美| 精品国产乱子伦一区| 91网站免费视频| 91精品国产91久久久久久密臀| 欧美精品日韩三级| 日韩特级黄色片| 国产综合色视频| 久久久久久久久一区二区| yw193.com尤物在线| 亚洲另类在线一区| 欧美丰满熟妇bbbbbb百度| 99热播精品免费| 精品成人佐山爱一区二区| 国产成人av一区二区三区不卡| 国产精品国内免费一区二区三区| 国内成人精品一区| 在线观看黄色国产| 成人一级片在线观看| 四虎永久国产精品| 91av久久| 欧美精品黑人性xxxx| 李丽珍裸体午夜理伦片| 日韩理论电影大全| 91国产高清在线| 国产极品久久久| 国产三级一区二区| 九九爱精品视频| 粉嫩一区二区三区在线观看| 亚洲欧美激情一区| 久久久99精品| 久88久久88久久久| 欧美日韩国产一二| 第四色日韩影片| 欧美三级一区二区| 亚洲乱码国产乱码精品精大量| 久久久久久久久丰满| 日韩免费观看av| 男人天堂综合网| 中文字幕色av一区二区三区| 97av视频在线观看| 国产精品调教| 欧美乱妇高清无乱码| 亚洲影院一区二区三区| 久久久久9999亚洲精品| 无码中文字幕色专区| 精品中文字幕一区二区三区四区| 亚洲性线免费观看视频成熟| 1级黄色大片儿| 国产成人免费视频一区| 中文字幕制服丝袜在线| 精品肉辣文txt下载| 日韩成人在线电影网| 久久国产露脸精品国产| 狠狠色丁香久久婷婷综合丁香| 日本一区二区不卡高清更新| 在线中文字幕播放| 精品亚洲aⅴ在线观看| 免费一级肉体全黄毛片| 国产高清亚洲一区| 色综合久久久久久久久五月| 快播电影网址老女人久久| 日韩h在线观看| 成人毛片18女人毛片| 99re8在线精品视频免费播放| 久久久久99精品成人片| 999久久久久久久久6666| 欧美日韩成人在线播放| 精品国产亚洲av麻豆| 亚洲欧美电影院| 日韩精品在线播放视频| 最新国产精品| 99re在线视频上| а√在线天堂官网| 亚洲精品福利在线| 国产欧美一区二区三区在线看蜜臂| aaa国产一区| 欧美 国产 小说 另类| 一区二区小说| 国产精品久久久久久av福利| av中文天堂在线| 在线成人av网站| 91成人福利视频| 成人免费毛片a| 青青视频在线播放| 日韩欧美在线中字| 91免费高清视频| 丁香花电影在线观看完整版| 精品一区二区三区电影| 中国黄色一级视频| 亚洲精品美国一| 亚洲成av人片在线观看无| 久热国产精品| 中国一区二区三区| 国产调教精品| 国产精品青草久久久久福利99| 精品176二区| 精品91自产拍在线观看一区| 手机看片久久久| 中文字幕一区二区三区四区不卡| 免费观看黄网站| 久久国产高清| 91看片淫黄大片91| 亚洲人成网亚洲欧洲无码| 成人国产精品一区二区| 超清av在线| 尤物yw午夜国产精品视频明星| 国产日韩免费视频| 欧美视频在线视频| 午夜国产小视频| 99久久精品免费看国产| www.com操| 在线日本高清免费不卡| 先锋影音一区二区三区| 五月亚洲婷婷| 国产在线精品播放| 电影在线观看一区| 久久深夜福利免费观看| 青青色在线视频| 91精品国产aⅴ一区二区| 国产精品suv一区| 一区二区三区四区精品在线视频| 免费看污黄网站在线观看| 精品在线一区二区三区| 无码人妻精品一区二区三区在线| 91精品国产成人观看| 欧美下载看逼逼| 97青娱国产盛宴精品视频| 国产精品免费久久久| 国产在线精彩视频| 欧美成人精品在线视频| 国产精品免费播放| 亚洲精品99久久久久中文字幕| 91在线观看喷潮| 在线一区二区观看| 在线观看精品国产| 亚洲综合清纯丝袜自拍| 女同久久另类69精品国产| 久久久综合精品| 免费的av网站| 风流少妇一区二区| 手机在线免费毛片| 六月丁香综合在线视频| av五月天在线| 久久精品电影| 国内外成人激情视频| 亚洲免费成人| 成人黄色大片网站| 黄色成人精品网站| 欧美美女黄色网| 中文字幕一区二区三区欧美日韩| 亚洲成色最大综合在线| 国产亚洲一区二区三区啪| 久久国产精品99久久久久久丝袜 | 亚洲第一av网| 成人av手机在线| 日韩一区二区麻豆国产| 国产毛片毛片毛片毛片| 欧美精品在线观看播放| 一本色道久久综合熟妇| 欧美天堂一区二区三区| 天天天天天天天干| 欧美亚洲国产bt| 国产99久久久久久免费看| 在线视频国内一区二区| 欧美日韩 一区二区三区| 欧美伊人久久久久久午夜久久久久| 国产婷婷色一区二区在线观看| 日韩欧美综合在线视频| 青青视频在线免费观看| 色8久久人人97超碰香蕉987| 波多野结衣黄色网址| 欧美性受xxxx黑人xyx性爽| 亚洲av无码乱码国产精品fc2| 91国偷自产一区二区三区成为亚洲经典 | 日韩一级片在线观看| 国产精品无码久久av| 欧美一级电影网站| 亚洲爆乳无码一区二区三区| 精品成a人在线观看| 亚洲三级黄色片| 国产一区二区三区在线免费观看 | 亚洲免费黄色网| 韩国理伦片一区二区三区在线播放| 国产高清999| 丁香激情综合国产| 极品粉嫩小仙女高潮喷水久久| 久久丝袜美腿综合| 永久免费看片视频教学| 伊人性伊人情综合网| 中文字幕激情小说| 欧美日本视频在线| 亚洲精品人妻无码| 亚洲欧美日韩天堂| 九色porny丨首页在线| 久久久久久久久久久国产| 欧美成人资源| 成人h猎奇视频网站| 波多野结衣在线一区二区| 精品网站在线看| 欧美韩日高清| 国产婷婷一区二区三区| 日本不卡不码高清免费观看 | 久久婷婷国产综合精品青草| 欧美午夜激情影院| 一区二区三区鲁丝不卡| 国产成人精品777777| 欧美美女网站色| 亚洲色图欧美视频| 久久视频在线播放| 蜜桃av在线播放| 成人黄色生活片| 亚洲性视频大全| 日韩视频一二三| 日韩av在线播放中文字幕| 国产黑丝在线视频| 久久综合一区二区| 久久黄色免费视频| 欧美天天综合网| 天堂中文在线8| 久久久精品久久久| 日韩高清在线| 久久精品五月婷婷| 中文字幕免费精品| wwwwxxxx日韩| 91一区在线观看| 欧美日韩三级在线观看| 欧美丝袜第三区| 日韩av免费观影| 欧美精品久久久久| 国产精品久久久久久久久久久久久久久 | 天天综合日日夜夜精品| 国产精品毛片一区视频播| 亚洲女人天堂成人av在线| 美女精品视频| 91色在线视频| 成人在线亚洲| 久久精品网站视频| av成人免费在线观看| 欧美久久久久久久久久久久| 欧美少妇xxx| 国产区高清在线| 97成人超碰免| 国产无遮挡裸体免费久久| 成人国产在线看| 国产在线播放一区| 亚洲少妇xxx| 欧美日韩另类一区| 国产免费av在线| 日本亚洲欧洲色α| 日韩av午夜| 黄页网站在线观看视频| 国产成人精品免费网站| 国产高潮流白浆| 91精品国产综合久久久久久漫画| 一区二区三区视频在线观看视频| 国产成人短视频| 国产午夜一区| 香蕉视频网站入口| 国产精品视频一二| 无码久久精品国产亚洲av影片| 亚洲欧美精品在线| 日韩大尺度黄色| 日本一区二区精品| 蜜臀av一区二区在线免费观看 | 欧美影院精品一区| 爱爱爱免费视频在线观看| 国产精品视频最多的网站| 超碰成人久久| 超碰人人草人人| 一区二区三区久久久| 狠狠综合久久av一区二区| 91高清视频在线免费观看| 妖精一区二区三区精品视频 | 国产99久久久国产精品免费看| 精品97人妻无码中文永久在线| 欧美成人在线直播| japanese色国产在线看视频| 国产一区喷水| 日韩高清不卡一区二区三区| 日本猛少妇色xxxxx免费网站| 欧美精品一卡二卡| 国产盗摄精品一区二区酒店| 精品欧美一区二区精品久久| 久久精品官网| 国产视频精品免费| 精品嫩草影院久久| 亚洲天堂电影| 亚洲一区二区三区涩| 国产揄拍国内精品对白| 久久精品欧美一区二区| 亚洲精品有码在线| 亚洲男男av| 青青青免费在线| 国产欧美精品区一区二区三区 | 综合在线观看色| 麻豆映画在线观看| 岛国av免费在线观看| 色av成人天堂桃色av| 亚欧精品在线视频| 久操国产精品| 久久国产精品久久久久久| 欧美videossex极品| 美女在线视频一区| 99久久精品免费看国产一区二区三区 | 欧洲杯半决赛直播| 一级做a爱视频| 丰满岳妇乱一区二区三区| 你懂的视频在线观看| 成人欧美一区二区三区黑人孕妇| 亚洲黄色在线| 国产在视频线精品视频| 精品日韩在线一区| 99久久er| 免费国产a级片| 最新中文字幕一区二区三区| 欧美日韩在线中文字幕| 91免费福利视频| 日韩极品在线观看| 国产精品第二十页| 日韩视频亚洲视频|