MCP 是一种开放协议,通过标准化的服务器实现,使 AI 模型能够安全地与本地和远程资源进行交互。MCP 可帮助你在 LLM 之上构建智能代理和复杂的工作流。MCP 采用客户端-服务器架构,主机应用程序可以连接到多个服务器。
这里用个demo展示一下如何使用MCP。首先需要pip install mcp安装库。

1. 服务端

服务端用@mcp.tool注册服务即可:

import json,httpx,requests,logging,sys
from typing import Any
import pandas as pd
from pandasql import sqldf
from mcp.server.fastmcp  import FastMCP
import warnings
from qwen_agent.llm import get_chat_model
from dotenv import load_dotenv
logger = logging.getLogger(__name__)
load_dotenv()
warnings.filterwarnings("ignore")
mcp = FastMCP("Server")
bearer = os.getenv('BEARER')
llm = get_chat_model({"model": os.getenv('MODEL_NAME'),"model_server": os.getenv('MODEL_SERVER'),"api_key":os.getenv('MODEL_KEY')})@mcp.tool()
def query_hour(question: str, start_at: str="2025-04-01", end_at: str="2025-06-01") -> str:"""输入关于时间范围相关问题,返回问题的查询结果。:param question: 关于时间范围的问题:param start_at: 查询开始时间,时间格式为"2025-01-01":param end_at: 查询结束时间,时间格式为"2025-06-01":return: 问题的查询结果"""res = requests.post("***",json = {"start_at": start_at,"end_at": end_at},verify=False,headers ={"Authorization":bearer}).json()for response in llm.chat([{"role": "system", "content": f"结果信息如下{str(res)},请尽量简洁回复问题"},{"role": "user", "content": f"{question}"}]):passreturn response[0]['content']if __name__ == "__main__":# 以标准 I/O 方式运行 MCP 服务器logging.basicConfig(stream=sys.stdout, level=logging.INFO)logger.info('start server')mcp.run(transport='stdio')

2. 客户端

客户端可以用任意的mcp前端,这里手动撸一个:

import asyncio,logging,os,json
from typing import Optional
from contextlib import AsyncExitStack
from qwen_agent.llm import get_chat_model
from mcp import ClientSession, StdioServerParameters
from mcp.client.stdio import stdio_client
from dotenv import load_dotenv
load_dotenv()
class MCPClient:def __init__(self):"""初始化 MCP 客户端"""self.exit_stack = AsyncExitStack()self.llm = get_chat_model({"model": os.getenv('MODEL_NAME')',"model_server": os.getenv('MODEL_SERVER')',,"api_key":'MODEL_KEY'})self.session: Optional[ClientSession] = Noneself.exit_stack = AsyncExitStack()        async def connect_to_server(self, server_script_path: str):"""连接到 MCP 服务器并列出可用工具"""is_python = server_script_path.endswith('.py')is_js = server_script_path.endswith('.js')if not (is_python or is_js):raise ValueError("服务器脚本必须是 .py 或 .js 文件")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()print("\n已连接到服务器,支持以下工具:", [tool.name for tool in response.tools])     async def process_query(self, query: str) -> str:"""使用大模型处理查询并调用可用的MCP工具 (Function Calling)"""messages = [{"role": "user", "content": query}]tool_response = await self.session.list_tools()functions = [{"name": tool.name,"description": tool.description,"parameters": tool.inputSchema} for tool in tool_response.tools]for responses in self.llm.chat(messages=messages,functions=functions):passfor message in responses:if fn_call := message.get("function_call", None):fn_name: str = fn_call['name']fn_args: dict = json.loads(fn_call["arguments"])result = await self.session.call_tool(fn_name, fn_args)fn_res: str = result.content[0].textmessages.append({"role": "function","name": fn_name,"content": fn_res,})# 将上面的结果再返回给大模型用于生产最终的结果for responses in self.llm.chat(messages=messages, functions=functions):passreturn responses[0]['content'] async 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)  # 发送用户输入到APIif '错误' in response:response = await self.process_query(response+query)print(f"\n🤖 LighthouseAI: {response}")except Exception as e:print(f"\n⚠️ 发生错误: {str(e)}")async def cleanup(self):"""清理资源"""await self.exit_stack.aclose()async def main():if len(sys.argv) < 2:print("Usage: python client.py <path_to_server_script>")sys.exit(1)client = MCPClient()try:await client.connect_to_server(sys.argv[1])await client.chat_loop()finally:await client.cleanup()if __name__ == "__main__":import syslogging.basicConfig(stream=sys.stdout, level=logging.INFO)asyncio.run(main())

3. 使用方式

启动MCP clinet: uv run client.py server.py
会弹出一个聊天界面,可以在后面输入问题,mcp服务器会根据问题找到相对应的tool进行回复:
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/pingmian/85317.shtml
繁体地址,请注明出处:http://hk.pswp.cn/pingmian/85317.shtml
英文地址,请注明出处:http://en.pswp.cn/pingmian/85317.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Python机器学习(一)】NumPy/Pandas手搓决策树+使用Graphviz可视化(以西瓜书数据集为例)

下题来源于笔者学校的《模式识别与机器学习》课程的作业题,本文将通过使用NumPy处理数学运算,Pandas处理数据集,Graphviz实现决策树可视化等Python库来实现决策树算法及其格式化。 导入用到的Python库: import numpy as np import pandas as pd from graphviz import Digr…

react-activation 组件级缓存解决方案

文章目录 一、KeepAlive 组件二、AliveScope 容器三、useAliveController Hook四、生命周期五、完整示例 react-activation 主要解决 React 项目中的「页面缓存」需求(是第三方库&#xff0c;非React 官方)&#xff0c;类似于 Vue 中的 <KeepAlive>&#xff1a; 功能说明…

CentOS 7内核升级方案

关于升级 CentOS 7 系统内核至 4.19 版本的可执行升级方案,可根据实际情况进行调整和完善,希望能对大家有所帮助: 一、升级背景与目的 随着业务的发展和系统稳定性的要求,当前 CentOS 7 系统所使用的内核版本 3.10.0-1160.el7.x86_64 已经无法满足部分新功能需求以及面临…

树莓派实验实践记录与技术分析

一、内核驱动开发&#xff1a;hello 模块实现 驱动程序代码 #include <linux/init.h> #include <linux/module.h> static int __init hello_init(void) { printk(KERN_INFO "hello kernel\n"); return 0; } module_init(hello_init); static void …

【秦九绍算法】小红的 gcd

题目 牛客网&#xff1a;小红的 gcd 题目分析 我们知道&#xff0c;求gcd就用欧几里得算法&#xff08;辗转相除法&#xff09;&#xff1a;gcd(a,b)gcd(b,a mod b)。但是这题的a非常大&#xff0c;最大是一个1e6位数&#xff0c;无法使用任何数据类型存储。如果使用高精度…

AWS服务监控之EC2内存监控

首先在IAM里找到角色&#xff0c;创建角色&#xff0c;选择EC2 然后在被监控的机器上安装cloudwatch-agent 官方链接在本地服务器上安装 CloudWatch 代理 - Amazon CloudWatch wget https://s3.amazonaws.com/amazoncloudwatch-agent/redhat/amd64/latest/amazon-cloudwatch-a…

鸿蒙 ArkWeb 和 H5混编开发

ArkWeb Web 相关标准技术(HTML/CSS/JS)&#xff0c;是业内支持性最广泛的技术&#xff0c;可以在最广泛的平台下实现“一次编写到处运行”&#xff1b;大部分对性能无需极致要求的应用页面&#xff0c;都可以使用 Web 技术来实现。 鸿蒙 ArkWeb Kit&#xff08;方舟 Web&…

设计模式-迪米特法则(Law of Demeter, LoD)

迪米特法则&#xff08;Law of Demeter, LoD&#xff09; 别名&#xff1a;最少知识原则&#xff08;Least Knowledge Principle&#xff09; 核心思想&#xff1a;一个对象应尽可能少地与其他对象发生交互&#xff0c;只与直接的朋友&#xff08;成员变量、方法参数、方法返回…

python获取AB直线间任意一点经纬度

获取AB直线间任意一点经纬度 1、目标 已知A点经纬度,距离;B点经纬度,距离,如果C点在AB之间,且知道C点距离,求C点的经纬度信息。 目标:在AB这条直线上,根据给定的距离(从A点开始沿直线到某点的距离)来求该点的经纬度。 2、方法 首先计算AB的总长度(大圆距离),…

Android实战——系统字体库加载流程

Android 系统字体库指的是在Android设备上用于显示文本的字体集合。随着Android系统的更新,其对字体的支持也日益增强,允许开发者和用户更灵活地定制界面文字显示。 一、字体库介绍 1、字体库文件 字体库文件是指存储字体数据的文件,这些文件包含了创建文本字符所需的所有…

嵌入式乐鑫音频项目“无声”问题深度调试复盘与方法论总结

前言&#xff1a;一场典型的“工程师寻踪之旅” 本次调试始于一个看似简单却极其顽固的问题&#xff1a;在一个基于乐鑫ESP-ADF&#xff08;音频开发框架&#xff09;的DuerOS示例项目中&#xff0c;移植到M5Stack ATOMIC Echo Base硬件上后&#xff0c;程序能够成功编译、烧录…

地下安全防线:电缆通道防外破地钉如何守护城市隐形生命线

在繁华都市的柏油马路之下、在静谧乡村的泥土深处&#xff0c;纵横交错的地下管线如同城市与乡村的 “隐形生命线”&#xff0c;承载着电力输送、供水供气、通信传输等重要功能&#xff0c;默默维系着现代社会的正常运转。然而&#xff0c;这条 “生命线” 正面临着诸多潜在威胁…

linux时间同步方案

yum install chrony -y # 配置 chrony 使用国内服务器 sed -i s/^pool.*pool.ntp.org/#&/ /etc/chrony.conf cat >> /etc/chrony.conf <<EOF server ntp.aliyun.com iburst server ntp.tencent.com iburst server ntp.ntsc.ac.cn iburst server time1.cloud.t…

C语言笔记(鹏哥)上课板书+课件汇总(KMP算法的动态规划简易处理+字符函数和字符串函数)

一、目录 kmp动态规划简易处理next数组字符函数与字符串函数 一、目录二、引言C语⾔标准库中提供了⼀系列库函数 三、字符分类函数&#xff08;字符相关的函数&#xff09;推荐一个网站 四、字符转换函数&#xff08;字符相关的函数&#xff09;五、strlen&#xff08;字符串相…

Java大模型开发入门 (13/15):拥抱官方标准 - Spring AI框架入门与实践

前言 到目前为止&#xff0c;我们整个系列的旅程都是在功能强大的LangChain4j框架上构建的。它就像一个装备齐全的“瑞士军刀”&#xff0c;为我们提供了构建RAG和Agents所需的所有底层和高层工具。 然而&#xff0c;在Java企业级开发的世界里&#xff0c;有一个名字我们永远…

Github搜索案例

今天的内容是这个案例的实现&#xff0c;以及其中涉及到的内容&#xff0c;需要全部掌握&#xff0c;比如ref&#xff0c;受控组件&#xff0c;props在组件之中的传递&#xff0c;以及Pubsub包的使用这些前端React框架有关的内容。现在进入正题 1.github搜索案例&#xff08;a…

Vue3学习(生命周期,hooks,axios的简单讲解)

一&#xff0c;前言 继续努力&#xff0c;南方见。 二&#xff0c;生命周期 1.对生命周期的理解 例如&#xff1a;人的生命周期&#xff0c;出生&#xff0c;经历&#xff0c;死亡 组件的话就是&#xff0c;创建&#xff0c;挂载&#xff0c;更新&#xff0c;销毁。***在特…

Pytorch实战四 基于 VGG net 搭建一个串联的神经网络结构

系列文章目录 文章目录 系列文章目录前言一、VGG类的搭建1.源码2.初始化类2.1 初始化函数2.2 前向传播函数 forward(self,x) 二、卷积补充卷积 前言 对于标准的 VGG net 输入图像的尺寸是 24 x 24,进行 32 维的下采样之后得到一个 7 x 7 的特征图&#xff0c;然后用 FC 层完成分…

大学专业解读——计算机

我们继续&#xff0c;讲讲排名第二流行的新工科专业——计算机。说到计算机&#xff0c;可能所有人都知道&#xff0c;但具体到细分的专业类别&#xff0c;除了计算机科学&#xff0c;其实大多数人都是不了解的。 序&#xff1a; 计算机主要有如下几个专业&#xff1a; 计算机…

Bootstrap 5学习教程,从入门到精通, Bootstrap 5 列表组(List Group)语法知识点及案例(14)

Bootstrap 5 列表组(List Group)语法知识点及案例 一、列表组基础语法 列表组是Bootstrap中用于显示一系列内容的灵活组件&#xff0c;常用于显示菜单、导航或任何项目列表。 基本列表组结构 <ul class"list-group"><li class"list-group-item&quo…