在開發 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 無法運行,最終導致上面圖中的報錯。