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

[智能体-240]:LangChain实现MCP工具调用的代码示例(MCP client端)

LangChain + MCP Client 工具调用最简示例

架构说明:

  1. MCP Server:独立进程 / 远端服务,向外暴露标准化 MCP 接口、提供工具元信息与远程执行;
  2. MCP Client(本示例):在 LangChain 侧封装成标准LangChain Tool,塞入bind_tools,沿用原有 LCEL 链路:Prompt | llm.bind_tools(mcp_tools) | tool_exec
  3. 上层 Chain 完全复用原有bind_tools + RunnableLambda执行器,业务链路无改动。

前置:MCP 遵循 Model Context Protocol 标准 JSON-RPC,示例封装通用 MCP 客户端;假设已有一台运行在http://127.0.0.1:8080/mcp的 MCP 服务。

1、依赖安装

bash

运行

pip install langchain langchain-openai requests pydantic

2、通用 MCP Client 封装(把远端 MCP 服务转为 LangChain Tool)

python

运行

import requests from typing import Dict, Any from langchain_core.tools import Tool from langchain_core.tools.base import BaseTool class MCPClient: def __init__(self, endpoint: str): self.endpoint = endpoint self.session = requests.Session() def list_tools(self) -> list[Dict[str, Any]]: """MCP协议:拉取远端全部工具元数据(name/desc/parameters schema)""" req = { "jsonrpc": "2.0", "id": 1, "method": "tools/list" } # 从远程MCP server获取tools清单 resp = self.session.post(self.endpoint, json=req).json() return resp["result"]["tools"] def call_tool(self, tool_name: str, args: Dict[str, Any]) -> str: """MCP协议:远程调用工具""" req = { "jsonrpc": "2.0", "id": 2, "method": "tools/call", "params": { "name": tool_name, "arguments": args } } # 对远程mcp server发起请求,远程执行tool调用 resp = self.session.post(self.endpoint, json=req).json() return str(resp["result"]["content"]) def to_langchain_tools(self) -> list[BaseTool]: """将MCP远端工具自动转换成LangChain @Tool格式""" mcp_tools_raw = self.list_tools() lc_tools = [] for item in mcp_tools_raw: name = item["name"] desc = item["description"] params_schema = item["inputSchema"] def create_tool(n=name): def _run(**kwargs): return self.call_tool(n, kwargs) return _run lc_tool = Tool( name=name, description=desc, func=create_tool() ) lc_tools.append(lc_tool) return lc_tools

3、LCEL 完整链路:bind_tools + 通用 tool_exec 执行器

python

运行

from langchain_openai import ChatOpenAI from langchain_core.messages import HumanMessage, AIMessage, ToolMessage from langchain_core.prompts import ChatPromptTemplate from langchain_core.runnables import RunnableLambda # ① 初始化MCP客户端,对接远端MCP Server mcp_client = MCPClient(endpoint="http://127.0.0.1:8080/mcp") # 自动拉取远端所有工具,转为LangChain标准工具 mcp_tool_list = mcp_client.to_langchain_tools() tool_map = {t.name: t for t in mcp_tool_list} # ② LLM绑定MCP远程工具(和本地工具bind_tools写法完全一致) base_llm = ChatOpenAI(model="gpt-3.5-turbo", temperature=0) llm_with_mcp = base_llm.bind_tools(mcp_tool_list) # ③ 通用工具执行节点:复用原有RunnableLambda执行逻辑(本地/远程工具统一执行) def tool_exec_func(ai_msg: AIMessage): if not ai_msg.tool_calls: return ai_msg.content msg_list = [] for call in ai_msg.tool_calls: tool = tool_map[call["name"]] res = tool.run(call["args"]) msg_list.append(ToolMessage(content=str(res), tool_call_id=call["id"])) final_msg = llm_with_mcp.invoke([HumanMessage(""), ai_msg] + msg_list) return final_msg.content tool_exec_node = RunnableLambda(tool_exec_func) # ④ 组装标准LCEL链路 prompt = ChatPromptTemplate.from_messages([("user", "{query}")]) chain = prompt | llm_with_mcp | tool_exec_node

4、调用测试

python

运行

# 示例:MCP服务内置计算器、查字符串长度等远端工具 resp = chain.invoke({"query": "计算 123 + 456"}) print(resp)

关键要点(贴合之前分工逻辑)

  1. bind_tools无改动:MCP 远端工具经过封装后和本地 Python 工具使用方式完全一致,LLM 只看工具 name/desc/schema,分不清是本地函数还是网络远程调用;
  2. tool_exec 执行节点无改动tool.run()内部已经被 MCP Client 封装为网络请求,上层执行逻辑统一,不用区分本地 / 远程;
  3. 解耦价值:MCP Server 独立部署、独立升级;LangChain Agent 不用改代码、不用重新打包,仅修改 MCP 对接地址即可切换远端工具服务。

拓展:本地 + MCP 远程工具混用

python

运行

# 本地自定义工具 + MCP远程工具合并放入同一tools列表 from langchain_core.tools import tool @tool def local_hello(name: str) -> str: """本地函数:打招呼""" return f"hello {name}" all_tools = [local_hello] + mcp_tool_list llm_all = base_llm.bind_tools(all_tools)

LLM 自动按需选择调用本地函数 或 MCP 远端服务。

补充:MCP Server 简易示意(伪逻辑)

python

运行

# MCP Server内部:收到tools/call,调用内部业务函数,返回结果 # 工具实现可以是任意语言(Python/Java/Go),与LangChain项目彻底分离
http://www.jsqmd.com/news/945553/

相关文章:

  • 【权威认证】工信部信创工作组推荐方案:AI工具与智能勋章融合的6层可信架构标准
  • 3分钟掌握秒传脚本:如何实现永久有效的百度网盘文件分享
  • 用Python复现AB3DMOT:200+FPS的3D目标跟踪,从KITTI点云数据开始
  • 2026年 速冻蔬菜基地/5000亩蔬菜基地供应商推荐榜单:绿色生态种植与冷链保鲜实力典范 - 品牌企业推荐师(官方)
  • 保姆级教程:在Ubuntu 20.04上为AirSim ROS节点添加自定义角速度控制接口
  • 千寻智能Spirit v1.6反超英伟达Cosmos 3,3个月融资近50亿背后有何秘诀?
  • 2026年近期广东有实力的精密热流道供应商综合分析与推荐 - 2026年企业资讯
  • OpenClaw从入门到应用——CLI:Dashboard
  • WzComparerR2深度解析:冒险岛游戏资源提取与分析的终极实战指南
  • 2026青少年防控镜片评测:星乐视4.0三效压轴/渐进多焦点镜片/眼轴控制镜片/碳晶A5膜镜片/离焦镜片/耐磨镜片/选择指南 - 优质品牌商家
  • DeepXDE深度解析:5步掌握物理信息神经网络的核心技术
  • Memos数据库文件(.db)的另类玩法:不靠官方导出,用几行Python代码喂饱你的Obsidian Thino插件
  • 2026年隧道陶钢复合板厂家推荐榜:重庆装饰陶钢板/铝陶钢复合板/隧道用钢石板/铝钙板品牌深度解析 - 品牌企业推荐师(官方)
  • 实测才敢推!2026年靠谱AI论文工具榜单,免费款也能高效产初稿
  • 绕过微软账户限制:离线方式管理Windows预览体验计划
  • 大语言模型开发的工作岗位都有哪些?
  • 把开发环境装进U盘:用WTG打造一个即插即用的Python/数据分析移动工作站
  • 南京信息工程大学LaTeX论文模板终极指南:5步解决本科生毕业论文排版难题
  • Jina Reader:当AI拥有互联网之眼,你的LLM将看到怎样的世界?
  • 2026年上海地区器械吸塑供应商选择指南:以专业实力铸就安全屏障 - 2026年企业资讯
  • # FIVEOS AI智能编程测试说明
  • 雁过留痕:撤销15秒留痕规则
  • 别再只引入`fastjson2`了!Spring 6整合FastJson2必须知道的三个Maven依赖
  • OpenClaw从入门到应用——CLI:设备
  • 终极风扇控制神器:FanControl让你的电脑告别噪音与过热烦恼
  • 2026上海防水维修哪家好?权威靠谱防水公司推荐|全屋漏水根治测评 - 苏易修缮
  • 熬夜整理:2026年8款论文降AI率工具真实测评,告别AI感,过稿率翻倍
  • 从Viterbi到PSP:手把手教你用Python仿真逐幸存路径处理算法
  • 杭州中职院校实力排行:杭州宠物护理专业技校/杭州技校/杭州数字媒体专业技校/杭州新能源专业技校/杭州无人机专业技校/选择指南 - 优质品牌商家
  • 2024 BPMN画图工具实测:从“能画”到“能落地”的5款推荐(附避坑指南)