FastMCP 客戶端服務器通信示例:從入門到實戰(STDIO 傳輸)

引言

在現代分布式系統和AI應用中,模型上下文協議(MCP)扮演著重要角色,它負責協調客戶端與服務器之間的通信,尤其是在需要頻繁交互的場景中。本文將介紹如何使用FastMCP庫快速實現客戶端與服務器之間的通信,并通過實戰案例展示其核心用法。

項目概述

本項目使用FastMCP庫實現了一個簡單的客戶端-服務器通信示例,包含基本的工具注冊與調用功能。通過本示例,你將了解FastMCP的核心概念、使用方法以及常見問題的解決方案。

項目結構

├── .venv/         # Python虛擬環境
├── client.py      # 客戶端代碼
├── server.py      # 服務器代碼
└── README.md      # 項目說明文檔

實現步驟

步驟1: 創建虛擬環境并安裝依賴

首先,我們需要創建一個獨立的Python虛擬環境并安裝必要的依賴:

  1. 創建Python虛擬環境:

    python -m venv .venv
    
  2. 激活虛擬環境:

    # Linux/Mac系統
    source .venv/bin/activate# Windows系統
    .venv\Scripts\activate
    
  3. 安裝FastMCP庫:

    pip install fastmcp
    

步驟2: 編寫服務器代碼

創建server.py文件,實現一個簡單的MCP服務器,該服務器將提供一個hello工具供客戶端調用:

# 導入FastMCP類,用于創建MCP服務器
from fastmcp import FastMCP# 創建FastMCP服務器實例,命名為"Demo"
mcp = FastMCP("Demo")# 使用裝飾器注冊一個名為"hello"的工具函數
@mcp.tool
def hello(name: str) -> str:"""向指定名稱的用戶發送問候參數:name: 字符串,要問候的用戶名稱返回:字符串,包含問候語的響應"""return f"Hello, {name}!"# 當腳本作為主程序運行時
if __name__ == "__main__":# 啟動MCP服務器# 默認使用STDIO傳輸方式,通過標準輸入輸出與客戶端通信mcp.run()

代碼解析

  • 我們通過FastMCP類創建了一個服務器實例,并命名為"Demo"
  • 使用@mcp.tool裝飾器注冊了一個名為hello的工具函數
  • 該工具函數接收一個name參數,并返回相應的問候語
  • 服務器默認使用STDIO(標準輸入輸出)作為傳輸方式
  • 最后通過mcp.run()啟動服務器

步驟3: 編寫客戶端代碼

創建client.py文件,實現一個連接到服務器的客戶端:

# 導入asyncio模塊,用于支持異步操作
import asyncio
# 導入Client類,用于創建MCP客戶端
from fastmcp import Client# 創建Client實例,連接到名為"server.py"的服務器腳本
# 客戶端會自動推斷使用STDIO傳輸方式與服務器通信
client = Client("server.py")# 定義異步函數call_tool,用于調用服務器上的工具
async def call_tool(name: str):"""異步調用服務器上的hello工具參數:name: 字符串,要傳遞給hello工具的名稱參數返回:無返回值,但會打印服務器的響應結果"""# 使用異步上下文管理器連接到服務器async with client:# 調用服務器上的hello工具,傳遞name參數result = await client.call_tool("hello", {"name": name})# 打印服務器返回的結果print(result)# 運行異步函數call_tool,傳入默認名稱"Ford"
asyncio.run(call_tool("Ford"))

代碼解析

  • 我們創建了一個Client實例,指定要連接的服務器腳本
  • 定義了異步函數call_tool用于調用服務器上的工具
  • 使用異步上下文管理器async with client來管理與服務器的連接
  • 通過await client.call_tool()方法調用服務器上的hello工具
  • 最后使用asyncio.run()運行異步函數,啟動客戶端

步驟4: 解決通信問題

在實現過程中,我們遇到了幾個典型問題并成功解決:

  1. 傳輸方式識別問題

    • 問題:最初客戶端無法自動識別"stdio"傳輸方式
    • 解決:通過查看源碼了解到FastMCP使用PythonStdioTransport類處理標準輸入輸出通信,客戶端會根據服務器類型自動選擇合適的傳輸方式
  2. 連接管理問題

    • 問題:不清楚如何正確管理客戶端與服務器的連接狀態
    • 解決:FastMCP Client采用異步上下文管理器模式進行連接管理,替代了顯式的connect()disconnect()方法,使用async with client即可自動管理連接的建立和關閉
  3. 工具調用參數問題

    • 問題:工具調用時參數傳遞不正確
    • 解決:call_tool方法需要使用name參數指定工具名稱,第二個參數為工具所需的參數字典
  4. 工具名稱匹配問題

    • 問題:客戶端調用工具時提示找不到工具
    • 解決:確保客戶端調用的工具名稱與服務器注冊的工具名稱完全匹配,包括大小寫

步驟5: 運行和測試

完成代碼編寫后,我們可以按照以下步驟運行和測試:

  1. 首先啟動服務器,在終端中執行:
    python server.py
    

在這里插入圖片描述

  1. 打開另一個終端,激活相同的虛擬環境,運行客戶端:

    python client.py
    
  2. 客戶端將輸出服務器的響應結果:

    CallToolResult(content=[TextContent(type='text', text='Hello, Ford!', annotations=None, meta=None)], structured_content={'result': 'Hello, Ford!'}, data='Hello, Ford!', is_error=False)
    

步驟6: trae中集成MCP

  1. 在trae ide中點擊手動添加MCP
    在這里插入圖片描述
  2. 把這段json輸入進去
{"mcpServers": {"local-mcp-server": {"command": "bash","args": ["-c","source /mcp-test/.venv/bin/activate && python /mcp-test/server.py"],"cwd": "/mcp-test"}}
}

在這里插入圖片描述
3. 看到這個小綠對鉤就是成功了
在這里插入圖片描述
4. 在對話中輸入“張三”,可以看到正常調用我們自定義的MCP服務
在這里插入圖片描述

技術要點總結

  1. FastMCP庫核心概念

    • FastMCP提供了簡單易用的API,簡化了MCP客戶端-服務器通信的實現
    • 服務器通過裝飾器注冊工具,客戶端通過名稱調用這些工具
  2. STDIO傳輸方式

    • 默認使用標準輸入輸出進行進程間通信
    • 無需網絡配置,適合本地進程間的簡單通信場景
  3. 異步編程模型

    • 客戶端基于asyncio實現異步操作
    • 使用異步上下文管理器管理連接生命周期
    • 通過await關鍵字處理異步工具調用
  4. 工具注冊與調用

    • 服務器使用@mcp.tool裝飾器注冊工具函數
    • 客戶端使用call_tool方法調用服務器上的工具
    • 工具參數以字典形式傳遞,支持復雜數據結構

擴展與優化建議

  1. 對于生產環境,可以考慮:

    • 使用更可靠的傳輸方式(如TCP)
    • 添加身份驗證和數據加密
    • 實現錯誤重試機制
    • 添加日志記錄和監控
  2. 功能擴展:

    • 注冊多個工具函數,實現更復雜的業務邏輯
    • 添加工具調用的超時處理
    • 支持更復雜的參數類型和返回值
    • 實現批量工具調用功能

結論

通過本文的示例,我們展示了如何使用FastMCP庫快速實現客戶端與服務器之間的通信。FastMCP提供了簡潔的API和靈活的擴展能力,使開發者能夠專注于業務邏輯的實現,而無需過多關注底層通信細節。無論是在AI模型交互、分布式系統協調還是普通的進程間通信場景,FastMCP都是一個值得嘗試的優秀選擇。

希望本文能幫助你快速入門FastMCP的使用,如果有任何問題或建議,歡迎在評論區留言討論!

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/94066.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/94066.shtml
英文地址,請注明出處:http://en.pswp.cn/web/94066.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

寶可夢肉鴿 PC/手機雙端 多種存檔 全閃光 無限金幣 全寶可夢解鎖 免安裝中文版

網盤鏈接: 寶可夢肉鴿 免安裝中文版 名稱:寶可夢肉鴿 PC/手機雙端 多種存檔 全閃光 無限金幣 全寶可夢解鎖 免安裝中文版 描述:寶可夢肉鴿修改版是一款非常受歡迎的口袋妖怪系列,游戲擁有許多獨特的妖怪和玩法。在游戲中&#…

Linux 下的網絡編程

1、目的實現不同主機上進程間的通信。2、問題主機與主機之間在物理層面必須互聯互通。進程與進程在軟件層面必須互聯互通。IP地址:計算機的軟件地址,用來標識計算機設備。MAC地址:計算機的硬件地址(固定)。網絡的端口號…

Go語言在邊緣計算中的網絡編程實踐:從入門到精通

一、引言 在數字化浪潮席卷全球的今天,邊緣計算如同一股清流,正在重新定義我們對網絡架構的理解。想象一下,當你在自動駕駛汽車中需要毫秒級響應,或者在偏遠工廠中需要實時處理傳感器數據時,傳統的云計算模式就像是&qu…

ASPICE過程能力確定——度量框架

🚗【汽車人必看】ASPICE能力評估核心:度量框架全解析|90%工程師都搞不懂的評分規則!🔍 為什么你的ASPICE評估總卡在L2?——揭秘6大能力等級背后的評分邏輯,附提升秘籍!🔥…

機器學習在量化中的應用

一、核心應用場景在因子研究中,scikit-learn 主要解決以下幾類問題:因子預處理與標準化:StandardScaler, RobustScaler因子有效性分析:LinearRegression (IC分析)降維與因子合成:PCA, FactorAnalysis機器學習預測模型&…

RabbitMQ:消息轉化器

目錄一、基本概述二、如何處理一、基本概述 在RabbitMQ中,一般情況下傳遞字符串會被正常解析,如果傳遞的是一個Object類型或者是一個對象類型的時候,RabbitMQ會將其自動轉化為字節碼發送,這不利于我們的讀取個解析。 二、如何處…

【Protues仿真】基于AT89C52單片機的LCD液晶顯示屏顯示控制

目錄 1 LM016L液晶顯示模塊 1.1 基本參數 1.2 引腳定義 1.3硬件連接示例(AT89C52) 1.4 常用指令集(HD44780 子集) 1.5 常見問題與注意事項 1.8 結論 2 LM016L液晶顯示模塊控制電路原理圖 3 LM016L液晶顯示模塊控制程序 …

孤獨傷感視頻素材哪里找?分享熱門傷感短視頻素材資源網站

你是不是也經常在抖音上刷到很火的傷感視頻,那么傷感視頻素材都在哪里可以下載呢?作為一名從業多年的視頻剪輯師,今天就跟大家聊聊那些可以下載傷感素材高清無水印的網站,如果你也在苦苦找尋傷感素材,快來看看吧&#…

筆記本怎么才能更快散熱?

一、“物理降溫法”??? 墊高高!別讓底部 “窒息”?筆記本底部全是進風口,放床上 / 沙發上會被堵住!墊點東西拉開底部空間,高度 1-2cm。??? 給風扇 “松綁”?按「CtrlShiftEsc」打開任務管理器,點 “進程”&…

電機驅動實現插補算法之脈沖和方向接收(以stm32主控為例)

一、方案 A(推薦):編碼器模式吃脈沖(TI1 STEP,TI2 DIR) 核心思路 把定時器設為 Encoder TI1 模式:每個 STEP 上升沿計一次,在那個沿的瞬間用 TI2(DIR)的電…

[特殊字符] 潛入深淵:探索 Linux 內核源碼的奇幻之旅與生存指南

文章目錄 朋友們,敲黑板!!!(超級重要)我們今天聊點硬核的——不是普通的代碼,而是驅動了整個數字世界心跳的Linux內核源代碼!它藏在哪?就在那個傳奇倉庫:torv…

如何監控和管理微服務之間的調用關系

監控和管理微服務之間的調用關系需要結合分布式追蹤、服務依賴分析、實時監控和可視化工具,以實現對調用鏈路的可見性、問題定位和性能優化。以下是具體的實現方案和工具鏈:一、核心監控目標調用鏈路可視化:展示服務間的調用關系、方向和頻率…

3.4 縮略詞抽取

概述 縮略詞指的是一個詞或者短語的縮略形式,其通常由原詞中的一些組成部分構成,同時保持原詞的含義。縮略詞的檢測與抽取在方法上與同義詞的檢測與抽取類似,但是相比同義詞,縮略詞在文本中出現的規則往往更簡單。 不同語言縮略詞…

Lua腳本如何執行主程序的C函數

Lua Call C function Lua腳本可以和C函數靈活的結合,Lua腳本作為控制語言,使用C函數來做性能計算部分。 Lua腳本的執行器有Lua 和 Luajit。 使用Lua執行器,可以通過C語言注冊C函數到Lua State, 然后Lua腳本可以調用該C函數。 使用Luajit&…

農業-學習記錄

1-git上傳(簡易版)首先,記得vscode打開的項目路徑是/home/Agribrain。不然會提示上傳很多項目無關的文件。① 暫存所有更改②使用vscode終端注意:終端打開路徑:/home/Agribrain/agribrain【git項目的所在目錄】&#x…

什么是數據集成?數據集成對數據治理有什么影響

在大數據與人工智能驅動的時代,數據已經成為企業的“新型生產力”。然而,企業內部數據往往分散在不同系統、不同格式、甚至不同地域中。如果缺乏有效管理與整合,數據價值就無法真正釋放。這時,“數據集成”應運而生,它…

技術成長戰略是什么?

文章目錄技術成長戰略是什么?1. 前言2. 跟技術大牛學成長戰略2.1 系統性能專家案例2.2 從開源到企業案例2.3 技術媒體大V案例2.4 案例小結3. 學習金字塔和刻意訓練4. 戰略思維的誕生5. 建議技術成長戰略是什么? 1. 前言 在波波的微信技術交流群里頭&am…

從0到1打造一臺機器人走起來

聚焦仿人雙足機器人,著重解決其下肢魯棒行走中仿真到實機間隔(SimToReal gap)的誤差問題 總述 硬件:采用傅利葉智能科技一體化關節模組: 1)胯部和膝關節選用 FSA80 - 29E 電機,以承受較大扭矩; 2)大腿部分采用 FSA60 - 43E 電機,兼顧扭矩和轉速需求; 3)小腿選用 …

【Cmake】Cmake概覽

目錄 一.環境準備 1.1.Cmake安裝 1.2. VSCodeCMake插件安裝 1.3 快速樣例-helloworld?程 二. cmake的基礎命令?使用示例 2.1.文件準備 2.2.?成構建系統 2.3.編譯連接 2.4.測試Ctest模塊 2.5.測試安裝模塊 2.6.測試打包模塊 2.7 查看幫助 CMake語法簡潔清晰&…

概率核心概念學習筆記:隨機事件與樣本空間、古典概率與條件概率、全概率公式與貝葉斯公式

目錄 一、 隨機事件與樣本空間 1. 原理講解 2. 類型與關系 3. 案例計算 4. 應用場景 二、 古典概率與條件概率 1. 古典概率 (Classical Probability) 2. 條件概率 (Conditional Probability) 三、 全概率公式與貝葉斯公式 1. 全概率公式 (Law of Total Probability) …