MCP Client 開發 -32000 報錯

在開發 MCP Client 的過程中,發生了 -32000 報錯,源碼如下:

import json
from typing import Optional
from contextlib import AsyncExitStackfrom openai import OpenAIfrom mcp import ClientSession, StdioServerParameters
from mcp.client.stdio import stdio_clientclass MCPClient:def __init__(self):""" 初始化 MCP 客戶端 """self.exit_stack = AsyncExitStack()self.openai_api_key = "sk-xxxxxxxxxxxxxxxxxxxxxxxxxxxx", # 替換成自己的 API_KEYself.base_url = "https://dashscope.aliyuncs.com/compatible-mode/v1"self.model = "qwen-turbo"self.client = OpenAI(api_key=self.openai_api_key, base_url=self.base_url) # 創建OpenAI clientself.session: Optional[ClientSession] = Noneself.exit_stack = AsyncExitStack()        async def connect_to_server(self, server_script_path: str):""" 連接到 MCP 服務器Args:服務腳本的文件路徑: Path to the server script (.py or .js)"""is_python = server_script_path.endswith('.py')is_js = server_script_path.endswith('.js')if not (is_python or is_js):raise ValueError("Server script must be a .py or .js file")command = "python" if is_python else "node"server_params = StdioServerParameters(command = command,args = [server_script_path],env = None)# 啟動 MCP 服務器并建立通信stdio_transport = await self.exit_stack.enter_async_context(stdio_client(server_params))self.stdio, self.write = stdio_transportself.session = await self.exit_stack.enter_async_context(ClientSession(self.stdio, self.write))await self.session.initialize()# 列出 MCP 服務器上的工具response = await self.session.list_tools()tools = response.toolsprint("\nConnected to server with tools:", [tool.name for tool in tools])     async def process_query(self, query: str) -> str:"""使用大模型處理查詢并調用可用的 MCP 工具 (Function Calling)"""messages = [{"role": "user", "content": query}]response = await self.session.list_tools()available_tools = [{"type": "function","function": {"name": tool.name,"description": tool.description,"parameters":  tool.inputSchema}} for tool in response.tools]# print(available_tools)response = self.client.chat.completions.create(model=self.model,            messages=messages,tools=available_tools     )content = response.choices[0]if content.finish_reason == "tool_calls":# 如何是需要使用工具,就解析工具tool_call = content.message.tool_calls[0]tool_name = tool_call.function.nametool_args = json.loads(tool_call.function.arguments)# 執行工具result = await self.session.call_tool(tool_name, tool_args)print(f"\n\n[Calling tool {tool_name} with args {tool_args}]\n\n")# 將模型返回的調用哪個工具數據和工具執行完成后的數據都存入messages中messages.append(content.message.model_dump())messages.append({"role": "tool","content": result.content[0].text,"tool_call_id": tool_call.id,})# 將上面的結果再返回給大模型用于生產最終的結果response = self.client.chat.completions.create(model=self.model,messages=messages,)return response.choices[0].message.contentreturn content.message.contentasync def chat_loop(self):"""運行交互式聊天循環"""print("\n🤖 MCP 客戶端已啟動!輸入 'quit' 退出")while True:try:query = input("\n你: ").strip()if query.lower() == 'quit':breakresponse = await self.process_query(query)  # 發送用戶輸入到 OpenAI APIprint(f"\n🤖 OpenAI: {response}")except Exception as e:print(f"\n?? 發生錯誤: {str(e)}")async def cleanup(self):"""清理資源"""await self.exit_stack.aclose()async def main():client = MCPClient()try:# 下面的路徑替換成自己的 mcp server 腳本的路徑await client.connect_to_server(r"C:\Users\User\Desktop\mcp\mcp_server.py")await client.chat_loop()finally:await client.cleanup()if __name__ == "__main__":import asyncioasyncio.run(main())

上面紅框出發生如下報錯:

Traceback (most recent call last):
?line 46, in connect_to_server
? ? await self.session.initialize()
? File "C:\ProgramData\anaconda3\Lib\site-packages\mcp\client\session.py", line 123, in initialize
? ? result = await self.send_request(
? ? ? ? ? ? ?^^^^^^^^^^^^^^^^^^^^^^^^
? File "C:\ProgramData\anaconda3\Lib\site-packages\mcp\shared\session.py", line 286, in send_request
? ? raise McpError(response_or_error.error)
mcp.shared.exceptions.McpError: Connection closed

經過調試后打印出如下日志:

Received response for request 0: jsonrpc='2.0' id=0 error=ErrorData(code=-32000, message='Connection closed', data=None)

最后解決結果:

這個報錯一般是初始化 mcp server 出現了問題,首先?mcp_server.py 的腳本路徑一定要正確,然后 mcp_server.py? 腳本要能夠獨立運行,博主的報錯原因是 在?mcp_server.py 中引入本地自己開發的包,但是沒有在 sys.path 中加入該包的搜索路徑,使得 mcp_server.py 無法運行,最終導致上面圖中的報錯。

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

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

相關文章

使用zabbix監控Nginx服務的配置方法

準備 要監控Nginx的服務狀態,首先需要安裝nginx的status模塊:ngx_http_stub_status_module 首先 查看Nginx是否有安裝該模塊:--with-http_stub_status_module nginx -V 如果沒有安裝的話,安裝方法可以參照:Nginx新…

簡易服務器(TCP)

1.簡單介紹以及項目技術和開發環境 本文將通過epoll完成對客戶端請求的處理,通過多線程完成對客戶端發送數據的處理,并提交到遠端mysql 需要的使用到的一些技術有:socket網絡套接字編程、IO多路轉接的epoll、多線程(包括互斥鎖和條…

總結前端三年 理想滾燙與現實的冰冷碰撞

大家好,我是500佰,技術宅男 目前正在前往獨立開發路線,我會在這里分享關于編程技術、獨立開發、技術資訊以及編程感悟等內容 6月3日的一篇《一個普通人的30歲 他經歷了什么》介紹一篇自己的碎碎念、即回顧自己以前的成長經歷,那么…

微服務網關/nacos/feign總結

現在學習到的組件 1.nacos:注冊中心,用于微服務之間交流的第三方管家,與生產者建立心跳契約對其監聽,注冊中心維護一張生產者的活躍表,會將活躍表實時更新并推送給消費者。 2.feign:nacos只是對生產者進行…

WebSocket 協議詳解

WebSocket 協議詳解 1. WebSocket 協議的幀數據詳解 1.1 幀結構 0 1 2 30 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1--------------------------------------------------------|F|R|R|R| opco…

【辦公類-105-01】20250626 托小班報名表-條件格式-判斷雙胞胎EXCLE

背景需求: 今天招生主任電話問我,是否可以通過新生的EXCEL判斷幼兒是雙胞胎,便于分在一個班級里。 她試了EXCEL篩選升序,身份證號碼排序了,但是18個數字太多,看不出“雙胞胎” 于是把三個園區的名單發我來…

WPF Binding 的 Mode 屬性

前言 在 WPF 中,Binding 的 Mode 屬性決定了數據綁定的方向和行為。Mode 是 Binding 類的一個重要屬性,它指定了數據如何在源(Source)和目標(Target)之間流動。可用的 BindingMode 枚舉值有以下幾種&#…

C++新紀元:深入C++11/14/17/20核心特性與名企面試精粹(完整版)--8000字硬核解析 | 騰訊/阿里/字節真題實戰

一、右值引用與移動語義:性能革命的核心 面試真題(字節跳動) "如何實現高效字符串拼接?解釋std::move原理及適用場景" 1. 核心概念 左值:具名對象,可取地址(如變量、函數返回值&…

網絡安全之Linux提權由淺入深

前言 在滲透測試與內網攻防中,提權(Privilege Escalation)是至關重要的一環。尤其在 Linux 環境中,權限的嚴格劃分雖然提升了系統安全性,但一旦攻擊者獲得了初始訪問權限,他們往往會試圖通過各種方式實現權…

【streamlit 動態添加/刪除 輸入條目items】

如何動態添加添加條目呢?類似下邊的效果 pip install streamlit 代碼 app.py import streamlit as stdef rule_component(st_ph: st = st):## 添加解析規則, 動態添加元素if

量學云講堂王巖江宇龍2025年第58期視頻 主課正課系統課+收評

量學云講堂王巖江宇龍2025年第58期視頻 主課正課系統課收評資源簡介: 課程目錄: 江宇龍課程 31楓林陽-股票走勢中多空必爭的關鍵要地(1).mp4 32楓林陽-關鍵要地的直觀表現之畫線標準.mp4 33楓林陽-提綱舉領之量線學習的要點綱要.mp4 34楓林陽-主力攻…

Milvus【部署 03】Linux OpenEuler 環境在線+離線安裝及卸載

在線離線安裝及卸載 1. 在線安裝2. 離線安裝3. 卸載 1. 在線安裝 [roottcloud milvus]# yum install ./milvus-2.1.4-1.el7.x86_64.rpm安裝日志: OS …

< 自用文兒 在 Ubuntu 上安裝 Claude Code > 發現了“京東云 JDCloude” 有國內商業云中最低的網絡性能

Claude Code: 最近刷屏這個詞:Claude Code 以后叫 CC,它是 Anthropic 的一款智能編程工具,幾個特點: 在終端運行 像使用命令行工具一樣,無需圖形用戶界面 GUI深度理解整個代碼庫 使用自然語言 讓其修復 b…

Docker部署prometheus+grafana+...

Docker部署prometheusgrafana… prometheus官網 官網 https://prometheus.io/ 中文網址 https://prometheus.ac.cn/ Prometheus簡介 Prometheus(普羅米修斯)是一套開源的監控&報警&時間序列數據庫的組合,由SoundCloud公司開發。 Prometheus基…

Python爬蟲實戰:研究Spynner相關技術

1 引言 1.1 研究背景與意義 隨著互聯網的迅速發展,網頁內容呈現形式日益復雜。傳統的靜態網頁逐漸被動態網頁所取代,大量內容通過 JavaScript 動態生成或 AJAX 異步加載。這使得傳統爬蟲(如基于 Requests 庫的爬蟲)難以獲取完整的網頁信息,因為它們只能獲取頁面的初始 H…

人工智能訓練知識學習-TTS(智能語音合成)

人機對話——TTS(TextToSpeech) 概念: TTS技術,即文本轉語音技術,是一種將文字內容轉換為語音輸出的技術。它通過計算機程序和算法,將文本信息轉化為自然流暢的語音信號,讓用戶能夠聽到文字內…

【Java高頻面試問題】JVM篇

【Java高頻面試問題】JVM篇 類加載機制加載(Loading)連接(Linking)?初始化(Initialization)?使用(Using)與卸載(Unloading) 類加載器和雙親委派模型類加載器…

DBeaver的sql編輯器文本格式字體大小設置

DBeaver的sql編輯器文本格式字體大小設置。開始就沒有找到。早上比較清醒被我發現了。記錄下來

自學Java怎么入門

自學Java其實沒有想象中那么難,只要找對方法,循序漸進地學習,很快就能上手。下面我結合自己的經驗,給你整理一條清晰的學習路徑,咱們一步步來。 一、先了解Java能做什么 在開始之前,建議你先看看Java都能…

操作系統面試知識點(1):操作系統基礎

目錄 1.什么是操作系統: 2.操作系統有哪些功能? 3.常見的操作系統有哪些 4.用戶態和內核態 5.內核態權限這么高,為什么不還要用戶態? 6.用戶態和內核態是如何切換的? 7.系統調用 8,系統調用的過程 ???????1.什么是操作系統: (1)操作系統(OS)是管理計算機軟硬…