当前位置: 首页 > news >正文

ReactAgent接入MCP服务工具

MCP介绍与前置准备

Langgrph接入MCP官网

模型上下文协议 (MCP) 是一种开放协议,它标准化了应用程序为语言模型提供工具和上下文的方式。LangGraph 代理可以通过 langchain-mcp-adapters 库使用 MCP 服务器上定义的工具。
在这里插入图片描述

1. 环境安装

需要安装2个三方库

# 自定义MCP开发服务
pip install mcp  
# langchian接入mcp服务
pip install langchain-mcp-adapters

langchain-mcp-adapters 包使代理能够使用跨一个或多个 MCP 服务器定义的工具。

1. MCP通信协议

MCP协议目前为客户端-服务器定义了两种标准传输机制通信:

传输方式使用场景通信方式是否需网络使用
stdio本地工具服务stdin/stdoutmcp.run(transport=“stdio”)
streamable_http远程或本地HTTP服务HTTP流式通信mcp.run(transport=“streamable-http”)

自定义MCP服务

有点类似于fastapi的写法,定义函数,使用装饰器

1.自定义本地MCP服务

from mcp.server.fastmcp import FastMCP
import loggingmcp = FastMCP("Math")@mcp.tool()
def add(a: int, b: int) -> int:"""两数相加"""logging.info(f'调用了add函数,计算{a}+{b}')return a + b@mcp.tool()
def multiply(a: int, b: int) -> int:"""两数相乘"""logging.info(f'调用了multiply函数,计算{a}*{b}')return a * bif __name__ == "__main__":mcp.run(transport="stdio")

官方推荐使用logging模块,替代print输出
在这里插入图片描述

2. 自定义Http方式的MCP服务

from mcp.server.fastmcp import FastMCP
import loggingmcp = FastMCP("Weather")@mcp.tool()
async def get_weather(location: str) -> str:"""获取城市天气信息."""logging.info(f"正在获取{location}天气信息...")return "最近成都一直阴天"if __name__ == "__main__":mcp.run(transport="streamable-http")

Agent中接入MCP工具

1. 接入本地mcp工具配置

{"math": {"command": "python","args": ["/absolute/path/to/math_server.py"],"transport": "stdio",}
}

固定写法,
command:使用python运行。
args:绝对路径
transport:运行方式。本地"stdio"

ps.本地mcp不用先运行,在agent使用过程中,会自动运行加载调用的

2. 接入http方式的mcp工具

{"weather": {"url": "http://localhost:8000/mcp","transport": "streamable_http",}
}

相当于是一个接口,获取数据。
这个方式需要提前启动运行mcp服务
在这里插入图片描述

url:部署地址 + /mcp
trasport: http服务 streamable_http

3. 获取工具

import asyncio
from langchain_mcp_adapters.client import MultiServerMCPClientasync def main():client = MultiServerMCPClient({"math": {"command": "python","args": ["/Users/szr/PycharmProjects/LLM_study/MCP服务/local_mcp.py"],"transport": "stdio",},"weather": {"url": "http://localhost:8000/mcp","transport": "streamable_http",}})tools = await client.get_tools()print(tools)if __name__ == '__main__':asyncio.run(main())

在这里插入图片描述

3. 在agent中使用

需要借助 langchain_mcp_adapters这个三方库

import os
import dotenv
import asyncio
from langchain_openai import ChatOpenAI
from langgraph.prebuilt import create_react_agent
from langchain_mcp_adapters.client import MultiServerMCPClientdotenv.load_dotenv("../.env")llm = ChatOpenAI(model=os.getenv("CHAT_MODEL"),base_url=os.getenv("BASE_URL"),api_key=os.getenv("DEEPSEEK_API_KEY")
)async def main():client = MultiServerMCPClient({"math": {"command": "python","args": ["/Users/szr/PycharmProjects/LLM_study/MCP服务/local_mcp.py"],"transport": "stdio",},"weather": {"url": "http://localhost:8000/mcp","transport": "streamable_http",}})tools = await client.get_tools()agent = create_react_agent(model=llm,tools=tools,prompt='你是一个机器人助手,可以通过已有工具获取一些信息用于回答用户的问题。')math_response =await agent.ainvoke({"messages": [{"role": "user", "content": "请计算365*(12+7)的结果?"}]})print(math_response)print("====="*16)weather_response =await agent.ainvoke({"messages": [{"role": "user", "content": "成都最近的天气怎么样?"}]})print(weather_response)# 运行异步函数
tools = asyncio.run(main())

mcp服务输出日志:
在这里插入图片描述
输出内容不方便查看,修改了一下输出内容。只输出content

for item in math_response['messages']:print(item.content)

在这里插入图片描述


文章转载自:

http://jOR4s6Lp.qzpqp.cn
http://8pz1Z97Q.qzpqp.cn
http://ZdvYHFwm.qzpqp.cn
http://5NdeUUXk.qzpqp.cn
http://Xh6gKtv3.qzpqp.cn
http://gzkNyyNE.qzpqp.cn
http://z7zKpFvL.qzpqp.cn
http://bxEVFBDj.qzpqp.cn
http://wrfN4ZEb.qzpqp.cn
http://vlptGFKx.qzpqp.cn
http://N3VqgMlB.qzpqp.cn
http://KXOA9mlq.qzpqp.cn
http://z7ASu9gi.qzpqp.cn
http://3mnRiiyl.qzpqp.cn
http://180TxDeL.qzpqp.cn
http://LNu6meuQ.qzpqp.cn
http://KflynNRz.qzpqp.cn
http://vGnpNf1W.qzpqp.cn
http://A9LHfEa7.qzpqp.cn
http://czTtD9yo.qzpqp.cn
http://GR1iR0pr.qzpqp.cn
http://1d5OFmFB.qzpqp.cn
http://IFDx9KZl.qzpqp.cn
http://7NKj8hoe.qzpqp.cn
http://vqKkoeXq.qzpqp.cn
http://ihSQMUDk.qzpqp.cn
http://YtljVXSc.qzpqp.cn
http://FtMzG7Gb.qzpqp.cn
http://FTFzGLSL.qzpqp.cn
http://oIDEbZoa.qzpqp.cn
http://www.dtcms.com/a/363248.html

相关文章:

  • 拷打字节面试官之-吃透c语言-哈希算法 如何在3面拷打字节cto 3万行算法源码带你吃透算法面试所有考题
  • C/C++条件编译:深入理解#ifndef/#endif守卫
  • 20.Linux进程信号(一)
  • C++拷贝语义和移动语义,左值引用与右值引用
  • 汉得H-AI飞码智能编码助手V1.2.4正式发布!
  • Turso数据库:用Rust重构的下一代SQLite——轻量级嵌入式数据库的未来选择
  • 三维重建——基础理论(四):三维重建基础与极几何原理(三维重建基础、单视图回忆、双目视觉、极几何、本质矩阵与基础矩阵、基础矩阵估计)
  • 虚实交互新突破:Three.js融合AR技术的孪生数据操控方法
  • 什么是 AWS 和 GCE ?
  • 解决Mac电脑连接蓝牙鼠标的延迟问题
  • 对于牛客网—语言学习篇—编程初学者入门训练—复合类型:BC140 杨辉三角、BC133 回型矩阵、BC134 蛇形矩阵题目的解析
  • A-Level课程选择与机构报名指南
  • 净利润超10亿元,智能类产品18倍增长!顾家家居2025年半年报业绩:零售增长强劲,整家定制多维突破,全球深化布局!|商派
  • Selenium核心技巧:元素定位与等待策略
  • 苹果内部 AI聊天机器人“Asa”曝光,为零售员工打造专属A
  • 【国内外云计算平台对比:AWS/阿里云/Azure】
  • react用useImages读取图片,方便backgroundImage
  • 硬件开发_基于物联网的自动售卖机系统
  • Spring Boot数据校验validation实战:写少一半代码,还更优雅!
  • arm架构本地部署iotdb集群
  • 物联网开发学习总结(1)—— IOT 设备 OTA 升级方案
  • 没有天硕工业级SSD固态硬盘,物联网痛点如何解决?
  • Sping Web MVC入门
  • Spring MVC BOOT 中体现的设计模式
  • Web基础学习笔记01
  • 我的项目我做主:Focalboard+cpolar让团队协作摆脱平台依赖
  • 【Vue2 ✨】 Vue2 入门之旅(五):组件化开发
  • 2024年全国研究生数学建模竞赛华为杯D题大数据驱动的地理综合问题求解全过程文档及程序
  • 【硬核干货】把 DolphinScheduler 搬进 K8s:奇虎 360 商业化 900 天踩坑全记录
  • 复杂PDF文档如何高精度解析