【Ai】MCP實戰:手寫 client 和 server [Python版本]

什么是mcp

MCP 是一個開放協議,它為應用程序向 LLM 提供上下文的方式進行了標準化。你可以將 MCP 想象成 AI 應用程序的 USB-C 接口。就像 USB-C 為設備連接各種外設和配件提供了標準化的方式一樣,MCP 為 AI 模型連接各種數據源和工具提供了標準化的接口。

MCP 核心采用客戶端-服務器架構,主機應用可以連接多個服務器:
在這里插入圖片描述

  • MCP Hosts: 如 Claude Desktop、IDE 或 AI 工具,希望通過 MCP 訪問數據的程序
  • MCP Clients: 維護與服務器一對一連接的協議客戶端
  • MCP Servers: 輕量級程序,通過標準的 Model Context Protocol 提供特定能力
  • 本地數據源: MCP 服務器可安全訪問的計算機文件、數據庫和服務
  • 遠程服務: MCP 服務器可連接的互聯網上的外部系統(如通過 APIs)

初始化環境

Python 需要是 3.11+ 版本

安裝uv

mcp默認使用uv作為第三方庫管理工具,如果還沒有安裝,執行如下命令安裝即可

pip install uv

執行命令 uv version 查看是否成功安裝

在這里插入圖片描述

使用 uv 創建項目

uv init mcp-server-demo
cd mcp-server-demo

在這里插入圖片描述

執行 uv add "mcp[cli]" 添加mcp依賴到項目中

在這里插入圖片描述

創建 MCP server

編寫server端代碼

from pathlib import Path
from mcp.server import FastMCPmcp = FastMCP(name="demo1", log_level='ERROR')# 添加一個工具
@mcp.tool()
def list_file(path: str):"""列出指定目錄的所有文件和子目錄參數:path:  根目錄返回:文件列表"""try:path = Path(path)if not path.exists():print(f"錯誤:目錄 '{path}' 不存在")return []contents = []for item in path.iterdir():contents.append({'name': item.name,'type': 'file' if item.is_file() else 'directory','size': item.stat().st_size if item.is_file() else 0,'modified': item.stat().st_mtime})return contentsexcept PermissionError:print(f"錯誤:沒有權限訪問目錄 '{path}'")return []if __name__ == '__main__':mcp.run(transport='stdio')

創建 MCP client

編寫client代碼

import asynciofrom dotenv import load_dotenv
from mcp import StdioServerParameters, ClientSession, stdio_clientload_dotenv()  # 從.env加載環境變量# Client 會使用這里的配置來啟動本地MCP Serverserver_params = StdioServerParameters(command='python',args=["./server_demo.py"],env=None
)async def main():async with stdio_client(server_params) as (read, write):async with ClientSession(read, write, sampling_callback=None) as session:await session.initialize()print('\n 正在調用工具...')result = await session.call_tool("list_file", {"path": "D:/pic"})print(result.content)asyncio.run(main())

測試使用

1、直接運行client_demo.py代碼

正在調用工具...
[TextContent(type='text', text='{"name": "01.jpg", "type": "file", "size": 192323, "modified": 1697902736.3849685}', annotations=None), TextContent(type='text', text='{"name": "05.jpg", "type": "file", "size": 379369, "modified": 1697819759.6860936}', annotations=None), TextContent(type='text', text='{"name": "22.jpg", "type": "file", "size": 249651, "modified": 1698055119.5418005}', annotations=None), TextContent(type='text', text='{"name": "cheetah.jpg", "type": "file", "size": 20552, "modified": 1717745181.0207932}', annotations=None), TextContent(type='text', text='{"name": "dog", "type": "directory", "size": 0, "modified": 1718097770.096676}', annotations=None), TextContent(type='text', text='{"name": "dog.jpg", "type": "file", "size": 44733, "modified": 1711027923.611414}', annotations=None), TextContent(type='text', text='{"name": "dog.png", "type": "file", "size": 351610, "modified": 1711027861.5564046}', annotations=None), TextContent(type='text', text='{"name": "\\u5b81\\u6ce2\\u56db\\u660e\\u5c71", "type": "directory", "size": 0, "modified": 1696489530.0600708}', annotations=None)]

2、啟動 mcp server 在瀏覽器端使用

uv run mcp dev server_demo.py

出現如下日志,代表正常啟動

Starting MCP inspector...
?? Proxy server listening on port 6277
🔍 MCP Inspector is up and running at http://127.0.0.1:6274 🚀

瀏覽器中打開 http://127.0.0.1:6274,可以看見如下頁面:

在這里插入圖片描述

然后點擊 “Connect” 按鈕,點擊“Tools - List Tools”,可以看見后臺MCP Server提供的服務,在右邊輸入參數后,點擊“Run Tool”可以看見正常調用的后端接口

在這里插入圖片描述

3、在VS code插件“Cline”中使用

打開插件 Cline ,點擊頂部的 “MCP Servers” 按鈕,

打開配置文件 “cline_mcp_settings.json”,輸入如下配置,出現綠燈代表配置成功

{"mcpServers": {"myMcpDemo1": {"disabled": false,"timeout": 60,"command": "cmd","args": ["/c","python","C:/workspace/py/mcp-demo/demo2/server_demo.py"],"env": {},"transportType": "stdio"}}
}

在這里插入圖片描述

注意:如果出現錯誤“Processing request of type server.py:534 ListToolsRequest 534 ListResourcesRequest ListResourceTemplatesRequest”,則需要調整日志輸出級別 log_level='ERROR'

mcp = FastMCP(name="demo1", log_level='ERROR')

接下來就可以在對話框中直接對話使用了,列入我輸入“列出目錄 C:\workspace\py 的所有文件和子目錄”,效果如下:

在這里插入圖片描述

參考

  • https://mcpservers.org/
  • https://docs.anthropic.com/en/home
  • https://modelcontextprotocol.io/introduction
  • https://mcp-docs.cn/introduction
  • https://github.com/modelcontextprotocol/python-sdk

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

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

相關文章

ESP8266/32作為AVR編程器(ISP programmer)的使用介紹

ESP8266作為AVR編程器( ISP programmer)的使用介紹 🌿ESP8266自帶庫例程:https://github.com/esp8266/Arduino/tree/master/libraries/ESP8266AVRISP📍支持ESP8266/32的ESP_AVRISP其它開源工程(個人沒有再去驗證)&…

08-JVM 面試題-mk

文章目錄 1.JVM 的各部分組成2.運行時數據區2.1.什么是程序計數器?2.2.你能給我詳細的介紹Java堆嗎?2.3.能不能解釋一下方法區?2.3.1常量池2.3.2.運行時常量池2.4.什么是虛擬機棧?2.4.1.垃圾回收是否涉及棧內存?2.4.2.棧內存分配越大越好嗎?2.4.3.方法內的局部變量是否線…

Vue3 nextTick

nextTick 是 Vue 中非常重要的一個 API&#xff0c;它允許你在 DOM 更新周期后執行延遲回調。 核心源碼位置 Vue3 的 nextTick 實現主要在 packages/runtime-core/src/scheduler.ts 文件中。 基本實現 const resolvedPromise Promise.resolve() as Promise<any> let …

DISCO:利用大型語言模型提取反事實

DISCO: Distilling Counterfactuals with Large Language Models - ACL Anthologyhttps://aclanthology.org/2023.acl-long.302/ 1. 概述 盡管在自然語言處理(NLP)領域針對各種推理任務取得了巨大進展(Wang 等, 2018, 2019a;Xu 等, 2020),但數據集偏差仍然是構建魯棒模型…

【Django】框架-路由系統核心概念解析

1. 最基本路由關系 路由是URL地址與處理邏輯&#xff08;視圖函數&#xff09;的對應關系。 本質&#xff1a;將用戶請求的URL路徑映射到具體的處理程序&#xff08;如Django視圖函數&#xff09;。 示例&#xff1a; # urls.py urlpatterns [ path(home/, views.home_…

理解 results = model(source, stream=True) 的工作原理和優勢

1. 核心概念解析 (1) streamTrue 的作用 生成器模式&#xff1a;當處理視頻或圖像序列時&#xff0c;streamTrue 會將結果包裝成一個 生成器&#xff08;Generator&#xff09;&#xff0c;逐幀生成 Results 對象&#xff0c;而不是一次性返回所有結果。內存優化&#xff1a;…

重新定義“邊緣”:邊緣計算如何重塑人類與數據的關系

在數字化浪潮中&#xff0c;云計算曾是科技界的寵兒&#xff0c;但如今&#xff0c;邊緣計算正在悄然改變游戲規則。它不僅是一種技術進步&#xff0c;更是對人類與數據關系的一次深刻反思。本文將探討邊緣計算如何從“中心化”走向“分布式”&#xff0c;以及它如何在效率、隱…

MCP 協議知識分享

MCP 協議知識分享 一、MCP 協議概述1.1 定義與背景1.2 核心價值1.3 與傳統 API 的對比 二、技術架構與工作原理2.1 核心組件2.2 通信機制2.3 典型工作流程 三、關鍵技術與應用場景3.1 核心技術3.2 典型應用場景 四、與微軟技術的集成4.1 Azure OpenAI 服務4.2 Playwright MCP 服…

策略模式實現 Bean 注入時怎么知道具體注入的是哪個 Bean?

Autowire Resource 的區別 1.來源不同&#xff1a;其中 Autowire 是 Spring2.5 定義的注解&#xff0c;而 Resource 是 Java 定義的注解 2.依賴查找的順序不同&#xff1a; 依賴注入的功能&#xff0c;是通過先在 Spring IoC 容器中查找對象&#xff0c;再將對象注入引入到當…

Linux》》bash 、sh 執行腳本

通常使用shell去運行腳本&#xff0c;兩種方法 》bash xxx.sh 或 bash “xxx.sh” 、sh xxx.sh 或 sh “xxx.sh” 》bash -c “cmd string” 引號不能省略 我們知道 -c 的意思是 command&#xff0c;所以 bash -c 或 sh -c 后面應該跟一個 command。

【解析】ReentrantLock鎖、Syschronized鎖面試點解析

面試官提問 ● 公平鎖與非公平鎖的區別是什么&#xff1f; ● 什么是可重入鎖&#xff1f; ● 什么是死鎖&#xff0c;怎樣避免死鎖&#xff1f; ● ReentrantLock與Syschronized實現原理是什么&#xff1f;兩者有什么區別&#xff1f; ● 請說明ReentrantLock獲取鎖與釋放…

04.Python代碼NumPy-通過索引或切片來訪問和修改

04.Python代碼NumPy-通過索引或切片來訪問和修改 提示&#xff1a;幫幫志會陸續更新非常多的IT技術知識&#xff0c;希望分享的內容對您有用。本章分享的是Python基礎語法。前后每一小節的內容是存在的有&#xff1a;學習and理解的關聯性&#xff0c;希望對您有用~ python語法…

跨平臺數據采集如何解決不同平臺之間的數據兼容性問題?

在數字化時代&#xff0c;企業越來越依賴多個信息系統來管理業務&#xff0c;例如ERP&#xff08;企業資源計劃&#xff09;、CRM&#xff08;客戶關系管理&#xff09;、財務管理系統、電商平臺等。然而&#xff0c;在進行跨平臺數據采集時&#xff0c;不同系統之間的數據格式…

解決 vite.config.ts 引入scss 預處理報錯

目錄 報錯1&#xff1a;[plugin:vite:css] [SASS] Error&#xff1a;Cant find stylesheet to import 報錯2&#xff1a;[plugin:vite:css] [sass] Error: Undefined variable 版本號&#xff1a; "sass": "^1.86.3","sass-loader": "^1…

C++筆記,數學函數

參考鏈接&#xff1a;C中數學函數的使用方法_cpp里指數函數-CSDN博客 頭文件 <cmath> 1. 基本的算數運算函數 1.1 sqrt() - 計算平方根 功能&#xff1a;計算一個非負實數的平方根。原型&#xff1a;double sqrt(double x);示例代碼&#xff1a; #include <iostr…

不關“貓”如何改變外網IP?3種免重啟切換IP方案

每次更換外網IP都要重啟路由器&#xff1f;太麻煩了&#xff01;那么&#xff0c;不關貓怎么改變外網IP&#xff1f;無論是為了網絡調試、爬蟲需求&#xff0c;還是解決IP限制問題&#xff0c;頻繁重啟設備既耗時又影響效率。其實&#xff0c;更換外網IP并不一定要依賴“重啟大…

道路運輸安全員企業負責人考試內容與范圍

道路運輸企業主要負責人&#xff08;安全員&#xff09;考證要求 的詳細說明&#xff0c;適用于企業法定代表人、分管安全負責人等需取得的 《道路運輸企業主要負責人和安全生產管理人員安全考核合格證明》&#xff08;交通運輸部要求&#xff09;。 考試內容與范圍 1. 法律法…

深入剖析 WiFi 定位解析功能:原理、技術優勢與應用場景

WiFi 定位解析功能的原理? 信號強度與距離的關系? WiFi 定位的核心原理基于無線信號傳播過程中的一個基本特性&#xff1a;信號強度與信號發射源&#xff08;即 WiFi 接入點&#xff0c;Access Point&#xff0c;簡稱 AP&#xff09;和接收設備之間距離的關聯。一般來說&am…

NVIDIA RTX? GPU 低成本啟動零售 AI 場景開發

零售行業正在探索應用 AI 升級客戶體驗&#xff0c;同時優化內部流程。面對多重應用場景以及成本優化壓力&#xff0c;團隊可采用成本相對可控的方案&#xff0c;來應對多重場景的前期項目預演和落地&#xff0c;避免短期內大規模投入造成的資源浪費。 客戶體驗 AI 場景的研究…

首次打藍橋杯總結(c/c++B組)

目錄 一、對每個題進行總結 1.填空題 2.第一個大題---可分解的正整數&#xff08;10--3&#xff09; 3.第二道大題---產值調整&#xff08;10--3&#xff09; 4.第三道大題---畫展部署&#xff08;15--7&#xff09; 5.第四道大題---水質檢測&#xff08;15--3&#x…