MCP client支持同时连接多个MCP server-使用Python开发

快速上手:实现你的第一个 MCP Client 本文介绍了如何使用 MCP Python SDK 编写一个 MCP 客户端,并集成 LLM 来实现灵活的工具调用和数据处理。通过简单的示例和进阶示例,展示了如何通过标准输入输出(stdio)方式与 MCP 服务器建立连接,并集成 LLM(如通义千问)来实现更复杂的应用场景。 阅读详情
AI摘要

博客介绍使用Python开发MCP client支持同时连接多个MCP server的实现方式。给出代码示例链接,说明实现时用数组保存可用工具,用类似Map结构保存会话对象,建立连接后记录工具信息,调用API时使用可用工具,根据大模型选择执行对应工具。

1. 相关总结

总结内容链接
MCP之大模型Function Calling开发与原理https://blog.youkuaiyun.com/a82514921/article/details/147860120
MCP概念与server开发及调试-使用Python+SSE传输机制https://blog.youkuaiyun.com/a82514921/article/details/147860221
MCP client开发与日志分析-使用Python+SSE传输机制https://blog.youkuaiyun.com/a82514921/article/details/147860518
MCP细节与原理分析-使用Python+SSE传输机制https://blog.youkuaiyun.com/a82514921/article/details/147860541
MCP server支持在不同Python脚本中实现工具方法https://blog.youkuaiyun.com/a82514921/article/details/147860559
MCP client支持同时连接多个MCP server-使用Python开发https://blog.youkuaiyun.com/a82514921/article/details/147860587

2. 前言

假如使用 Python 开发 MCP client,需要支持同时连接到多个 MCP server,可以参考以下方式

3. 实现方式

3.1. 代码示例

以下示例代码可参考 https://github.com/Adrninistrator/MCP-DEMO

async def query_mcp_server(question: str, parallel: bool):
    available_tools = []
    tool_session_map: Dict[str, ClientSession] = {}
    async with AsyncExitStack() as stack:
        for server_url in server_url_array:
            read, write = await stack.enter_async_context(sse_client(url=server_url))
            session: ClientSession = await stack.enter_async_context(ClientSession(read, write))
            # Initialize the connection
            await session.initialize()
            # List available tools
            tools = await session.list_tools()
            logger.info(f"MCP Server Tools {server_url} {tools}")
            for tool in tools.tools:
                if tool.name in tool_session_map:
                    logger.error(f"重复名称的工具 {tool.name}")
                    raise ValueError(f"重复名称的工具 {tool.name}")
                tool_session_map[tool.name] = session
                tool_param: ChatCompletionToolParam = {
                    "type": "function",
                    "function": {
                        "name": tool.name,
                        "description": tool.description,
                        "parameters": tool.inputSchema
                    }
                }
                available_tools.append(tool_param)

        messages = [{
            "role": "system",
            "content": "仅使用 role=tool 相关数据进行分析,不使用模型中的数据"
        }, {
            "role": "user",
            "content": f"要求:每次返回选择工具时,在 choices.message.content 返回选择工具的原因、n 任务:{question}"
        }]

        seq = 0
        while True:
            seq += 1
            response = MCPClientBase.client.chat.completions.create(
                model=MCPClientBase.model,
                messages=messages,
                tools=available_tools,
                parallel_tool_calls=parallel
            )

            assistant_output = response.choices[0].message
            if assistant_output.content is None:
                assistant_output.content = ""

            if response.choices[0].finish_reason != "tool_calls" \
                    or assistant_output.tool_calls is None \
                    or len(assistant_output.tool_calls) == 0:
                logger.info(f"获得结果:{assistant_output.content}")
                return assistant_output.content

            messages.append(assistant_output)

            tool_seq = 0
            for tool_call in assistant_output.tool_calls:
                tool_seq += 1
                function = tool_call.function
                tool_name = function.name
                session = tool_session_map[tool_name]
                if session is None:
                    logger.error(f"模型返回的工具不存在 {tool_name}")
                    raise ValueError(f"模型返回的工具不存在 {tool_name}")
                mcp_server_result: CallToolResult = await session.call_tool(tool_name, json.loads(
                    function.arguments))
                if mcp_server_result.isError:
                    raise ValueError(f"调用 MCP server tool {tool_name} 返回失败")

                messages.append({
                    "role": "tool",
                    "tool_call_id": tool_call.id,
                    "content": mcp_server_result.content
                })
                if not parallel:
                    break

3.2. 实现说明

使用数组 available_tools 保存可用的 MCP server 工具

使用类似 Map 结构的 tool_session_map 保存会话对象,key 为 MCP 工具名称,value 为 mcp.client.session.ClientSession 类型的会话对象

遍历需要处理的 MCP server SSE url,对应“for server_url in server_url_array:”

创建 contextlib.AsyncExitStack 类型的对象 stack,用于记录和集中清理需要关闭的异步资源

调用 mcp.client.sse.sse_client() 方法创建的数量为 2 的元组,需要调用 stack 对象对应的 contextlib.AsyncExitStack.enter_async_context() 方法进行记录,以在后续关闭

创建的 mcp.client.session.ClientSession 类型的会话对象,也需要调用以上方法进行记录

在与每个 MCP server 建立连接后,获取到的当前 MCP server 支持的工具信息,记录工具名称及对应的会话对象到 tool_session_map,并记录工具到 available_tools 中

在调用 OpenAI 格式的 Chat Completions API 时,tools 使用以上 available_tools;获取到大模型返回后,遍历大模型选择的需要执行的工具,对于每个工具,根据工具名称从 tool_session_map 中获取对应的会话对象,使用会话对象执行 MCP server 对应的工具

Python 实现 MCP 客户端全指南:从基础调用到高级功能 扩展支持非标准 MCP 服务:python# 调用旧系统API# 注册为MCP资源# 通过MCP客户端调用Python MCP 客户端为构建智能应用提供了强大而灵活的工具,从简单的工具调用到复杂的多智能体协作,都能通过简洁的 API 实现。本文详细介绍了客户端开发的各个方面,包括基础功能、高级特性、性能优化和实战案例,希望能帮助开发者快速掌握 MCP 客户端开发技能。随着 MCP 协议的不断发展,Python SDK 也将持续更新以支持新特性。 阅读详情

相关推荐

深入探索MCP通信:构建高效的MCP Client

本文探讨了MCP(Model-Controller-Proxy)架构在现代软件开发中的应用,特别是其支持的两种通信方式:标准输入输出(stdio)和服务器发送事件(SSE)。Stdio方式适用于本地快速集成,通过启动服务器子进程实现双向通信;而SSE方式则基于HTTP协议,允许服务器向客户端单向、实时推送数据,适用于实时监控和消息推送等场景。文章通过Python代码示例,详细展示了如何使用MCP Python SDK构建MCP Client,并实现与MCP Server的通信。通过这些内容,读者可以更好地理

无声旅者的博客 1308

【LangGraph】MCP Adapters(模型上下文协议 适配器):连接多个 MCP 服务器并加载 LangChain 兼容工具、提示和资源的类和函数

LangChain 的 MCP 适配器模块提供了连接多个 MCP 服务器并加载工具、提示和资源的客户端,支持与 LangChain 生态系统的无缝集成。关键类:MultiServerMCPClient:客户端类,用于管理多个 MCP 服务器连接并加载资源。关键函数:load_mcp_tools:加载 MCP 工具并转换为 LangChain 工具。load_mcp_prompt:加载 MCP 提示并转换为 LangChain 消息。load_mcp_resources:加载 MCP 资源并转换为 LangC

彬彬侠的博客 3818

【MCP】从0到1实现一个MCP Client

MCP Client(Model Context Protocol Client)是模型上下文协议(MCP)架构中的核心组件,负责连接AI模型(如Claude、GPT等)与外部数据源或工具服务

Jeffray1991的博客 1616

MCP 纯python代码实现client客户端代码案例

摘要: 该代码实现了一个基于阿里云DashScope API的智能助手客户端SimpleMCPClient,支持多轮对话和工具调用。助手通过分析用户问题,动态选择调用搜索、计算或天气查询工具,整合结果后生成最终回复。核心功能包括工具初始化(_init_tools)、工具执行(_execute_tool)和异步对话处理(chat),通过最多5轮迭代实现逐步推理。示例中展示了如何通过系统提示定义工作流程,并模拟工具调用(如web_search返回固定结果)。该设计适用于需要结合外部工具增强回复准确性的场景。 (

weixin_42357472的博客 1277

MCP Client+Ollama天气客户端搭建

本文探讨了如何通过改造MCP社区官方的Weather Client(Python)来支持Ollama架构,以实现本地化的开发调试工作。MCP(Model Context Protocol)是一种开放协议,旨在标准化AI应用程序与LLM(大型语言模型)之间的上下文提供方式,类似于USB-C在设备连接中的标准化作用。MCP采用客户端-服务器架构,其中客户端与服务器保持1:1连接,服务器提供上下文、工具和提示。 在开发过程中,本文详细介绍了如何将MCPClient类中原有的LLM Anthropic客户端替换为O

Mars.Bighead的专栏 1478

深度解析:AI Agent 实战之 MCP 开发指南

MCP(Model Context Protocol,模型上下文协议)是 Anthropic 于 2024 年 11 月推出的开放标准,旨在为大语言模型(LLM)提供统一、标准化的方式与外部数据源和工具通信,解决传统 AI 集成架构碎片化、扩展困难的问题。

沐雪架构师 1553

Python 从0到1构建MCP Server & Client

MCP Server 是实现模型上下文协议(MCP)的服务器,旨在为 AI 模型提供一个标准化接口,连接外部数据源和工具,例如文件系统、数据库或 API。

GOBinCC的博客 1万+

Python开发MCP Client

全部例子只是MCP Client访问MCP Server的过程,那么这样其实就失去了MCP协议的创建的初衷,和大模型集成后才能发挥MCP最大的作用。

Criss@陈磊 2973

【LLM】MCP(Python):实现 stdio 通信的Client与Server

本文将详细介绍如何使用 Model Context Protocol (MCP) 在 Python 中实现基于 STDIO 通信的 Client 与 Server。MCP 是一个开放协议,它使 LLM 应用与外部数据源和工具之间的无缝集成成为可能。无论你是构建 AI 驱动的 IDE、改善 chat 交互,还是构建自定义的 AI 工作流,MCP 提供了一种标准化的方式,将 LLM 与它们所需的上下文连接起来。

2303_80346267的博客 4638

基于python实现mcp client和server端,client利用langgraph实现,server基于sse以及streamable-http通信方式.zip

### 步骤 1. 确定client MultiServerMCPClient需要连接的mcp server(单个或者多个) 2. 然后执行server文件,产生url,再执行client.py文件,连接server获取工具。当前client.py链接server_sse.py,则需要先运行server_sse.py文件 ### 使用方法 #### 服务端: 1.mcp实例化 ```commandline mcp = FastMCP("Weather") # "Weather"可修改 ``` 2.利用@mcp.tool装饰函数,可以将函数注册为mcp工具,函数需要添加注释(函数解释,Args以及返回值) ```commandline # 利用mcp.tool装饰器在当前server中可以注册多个工具 # 函数必须添加说明、参数说明(如果有参数)以及返回值,便于智能体调用和命中 @mcp.tool() async def func1(): ... @mcp.tool() async def func2(): ... ``` 可以参考server_sse.py代码 ```commandline @mcp.tool() async def get_weather(location: str) -> str: """ 获取指定地点的天气信息。 Args: location (str): 要查询天气的地点名称。 Returns: str: 返回的天气信息字符串。 """ return "It's always sunny in New York" ``` 3.服务配置 基于SSE方式: ```commandline # 服务器配置,设置端口名

Ollama-OCR实战:5分钟搞定PDF文档转Markdown(附qwen2.5vl模型配置)

本文详细介绍了如何利用Ollama本地部署多模态大模型qwen2.5vl,结合OCR技术,实现PDF文档到Markdown的端到端智能转换。通过解析传统OCR的局限与AI方案的优势,并提供从环境搭建、提示词工程到处理复杂表格的完整实战指南,帮助用户高效构建自动化文档处理流水线,彻底重塑文档处理工作流。

yog99的博客 606

MCP协议是开源的吗?MCP支持哪些编程语言创建 MCP Client 和 Server?

MCP协议是开源的吗?MCP支持哪些编程语言创建 MCP Client 和 Server?作者简介猫头虎是谁?作者名片 ✍️加入我们AI共创团队 🌐加入猫头虎的AI共创变现圈,一起探索编程世界的无限可能!🚀正文一、MCP协议的开源性质二、MCP协议的开源组件与实现1. **协议规范与 SDK**2. **示例服务器与模板**3. **Claude 本地集成**4. **生态建设与社区支持**三、MCP协议支持的编程语言四、总结文末粉丝福利联系我与版权声明 📩大家好,我是猫头虎。

猫头虎技术团队:授渔优于赠鱼,兴趣引领智慧,探索之乐尤显珍贵。商务合作+:Libin9iOak ,万粉变现+:优快云WF,猫头虎承诺每年免费为100名C站创作者做账号流量诊断服务!全网搜:猫头虎技术团队,点击文章底部名片或直接私信我一切皆可谈,快找虎哥! 1万+

Arduino跑通ssd1306_spi显示屏

代码首先,您需要下载两个库:● Adafruit GFX库,这是核心图形库,提供了一组通用的图形基元(点、线、圆等)。它需要与特定于硬件的库对应。● Adafruit SSD-1306 OLED显示库,这是基于SSD1306驱动程序的OLED显示器的库。解压缩这两个库并将它们添加到Arduino库文件夹中,然后运行Arduino IDE并从OLED库中打开SPI示例。

Leo ICer的博客 1494

MCP client开发与日志分析-使用Python+SSE传输机制

本文介绍了MCP(Model Context Protocol)客户端的开发流程,重点包括环境依赖、环境变量设置、MCP客户端创建、与MCP服务器建立连接、以及访问大模型和执行工具的方法。开发过程中,需安装MCP Python SDK,并通过.env文件配置大模型相关环境变量。与MCP服务器建立连接时,使用sse_client()方法,并通过ClientSession类初始化会话。访问大模型时,使用OpenAI格式的Chat Completions API进行Function Calling,首次访问时需在

adrninistrat0r的博客 1696

MATLAB创建GUI面板实现二维码生成与识别

利用matlab设计gui界面实现二维码的生成与内容识别

infinitystardust的博客 3149

AVL-Excite新手必看:5步搞定发动机阀系系统建模(附B站视频教程)

本文为AVL-Excite新手提供发动机阀系系统建模的5步详细指南,涵盖软件环境搭建、基本结构建立、关键参数设置、仿真分析及常见问题排查。通过清晰的步骤说明和实用技巧,帮助工程师快速掌握建模方法,并附有精选B站视频教程链接,便于实践学习。

weixin_29305313的博客 509

MCP概念与server开发及调试-使用Python+SSE传输机制

MCP(Model Context Protocol)是由Anthropic发布的一项新标准,旨在连接AI助手与数据存储系统,提升模型响应的质量和精准度。MCP通过提供通用开放标准,解决了AI系统与数据源之间的割裂问题,简化了数据访问机制。MCP采用client-server架构,支持多种传输机制,如Stdio、HTTP SSE和Streamable HTTP,并通过JSON-RPC 2.0协议进行消息交换。MCP server提供三大核心功能:Resources、Tools和Prompts,其中Tools

adrninistrat0r的博客 2895

CZT与FFT频谱分析方法对比:从任意频带重采样到高精度频谱分析

M = 85 % 输出点数f0 = 70 Hz % 起始频率DELF = 0.4 Hz % 频率步长频率分辨率提高到0.4 Hz分析带宽聚焦在[70, 103.6]Hz更清晰地分辨出78Hz和82Hz的频率分量。

2403_88098319的博客 1859

让AI再次伟大-MCP-Client开发指南

什么是mcp的客户端呢?这个函数的作用就是通过命令运行一个mcp-server,然后使用mcp-client客户端连接这个mcp-server,要保持一个会话状态,然后我们就可以通过这个session去请求到这个mcp-server了,然后去获取到这个mcp-server所提供的工具tools了。今天简单聊聊mcp-client客户端,并接入deepseek 模型,调用我们自己的mcp server,本篇是基于之前开发好的mcp-server进行的。并且使用python去实现mcp client的客户端。

爱吃知识的土豆倪的博客 1876

手机拍照也能玩高光谱?教你用TensorFlow Lite在Android上实现实时RGB转高光谱

本文介绍了如何利用TensorFlow Lite在Android设备上实现实时RGB到高光谱的图像重构技术。通过深度学习模型优化和移动端部署策略,使智能手机具备专业级光谱分析能力,适用于农业检测、化妆品分析等多个领域。

weixin_29091105的博客 247

给jetson nano 安装AX200网卡驱动

几经波折,因为在网上看到的基本都是amd版本而非arm版,然后最终选定V5.5是因为更新的几个版本的arm版本是false的(在https://kernel.ubuntu.com/~kernel-ppa/mainline/处选择版本时,得看在arm64上是false还是build succeeded,之前没经验呀刚刚才顿悟的) 1,参考文章https://blog.youkuaiyun.com/MIRANA0/article/details/106696334 学到了得下载如下四个: wget https://k

发嘎嘎的博客 2345

Python MCP SDK 内存连接测试实战:用 Client(mcp) 在不联网的情况下测试 MCP 服务器

本篇技术指南围绕官方 Python SDK for Model Context Protocol(MCP)中的 `Client` 类展开,讲解如何通过**进程内内存连接(in-memory connection)**对 MCP 服务器进行零网络、零端口、零子进程的单元测试。读完本文,你将掌握 `Client(server)` 的测试写法、`pytest` + `inline-snapshot` 的

gitblog_01088的博客 683

Python爬虫教程:如何爬取多平台电商商品信息(价格、评价、库存)

本文介绍了如何编写一个跨平台电商商品爬虫,爬取多个平台的商品信息,包括商品名称、价格、评价等数据。通过Python的爬虫库(如requestsSelenium)和数据处理库(如pandasmatplotlib)的结合,我们可以高效地获取和分析电商平台上的商品信息。

2201_76125261的博客 917

DeepSeek实战--MCP Client SSE模式

本文介绍了MCP架构中基于SSE(Server-Sent Events)的客户端实现方案。SSE模式通过HTTP协议实现服务器向客户端的单向实时数据推送,使用Starlette框架实现持久连接。文章对比了SSE与标准输入输出模式的差异,SSE模式支持实时更新、架构解耦,适合交互式应用。详细演示了从创建MCP服务器工具、建立Starlette应用到实现SSE客户端的完整流程,包括工具函数定义、SSE连接处理、客户端调用等关键步骤。

希望我的博客,能解决你工作中的问题 2070

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

多Server编排:同时管理多个MCP Server

标签 MCP, 多Server, 编排, Server管理, MCP架构上个月我们公司搞了个智能客服系统,要同时对接五六个 MCP Server。有查订单的,有查物流的,有管工单的,有查知识库的,还有个发邮件的。刚开始我觉得这有啥难的,每个 Server 单独连不就行了。结果上线第一周就出事了。事情是这样的。工单 Server 和订单 Server 都有个叫search的工具。客服问了一句"帮我查一下这个客户的工单和订单",Agent 调search。

白话机器学习 272

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

全网少有-通过Python调用MCP

摘要: 本文深入探讨了MCP(模型上下文协议)的实际应用,重点解决了如何连接sse格式的MCPServer和使用Python连接多个MCPServer的问题。文章从MCP的基本概念入手,解释了Host、Client、Server三个核心组件的关系,并通过代码示例详细演示了如何创建SSE服务器、连接单个和多个MCPServer。对于多个MCPServer的场景,作者提出了将Client类拆分为Host和Client的方案,说明如何汇总不同Server的工具列表并实现工具调用。最后提到可以使用langchain

龙井茶的Sky 3001
上一篇: MCP server支持在不同Python脚本中实现工具方法
下一篇: Java应用升级JDK或依赖库可能遇到的兼容性问题
adrninistrat0r
博客等级 码龄18年 395粉丝 136原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值