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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈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)是管理计算机软硬…