news 2026/5/28 23:36:35

langchian 使用外部MCP工具创建自己的MCP服务

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
langchian 使用外部MCP工具创建自己的MCP服务

普通智能体接入高德MCP

mcp协议官网:https://modelcontextprotocol.info/zh-cn/
关于什么是mcp建议大家看一下MCP官网就可以,首页的描述就非常贴切
“AI应用的USB-C接口” 接口通用,功能强大

接入流程

官网示例:https://docs.langchain.com/oss/python/langchain/mcp

  1. 添加 langchain-mcp-adapters 包来将 MCP 服务中的工具适配成 agent 使用的工具
  2. getTools 方法是异步的

接入代码实现

""" 【简单创建智能体,并将MCP服务工具,注入给智能体】 可参考官方文档地址:https://docs.langchain.com/oss/python/langchain/mcp """importasyncioimportosfromdotenvimportload_dotenvfromlangchain_core.messagesimportHumanMessagefromlangchain_core.toolsimporttoolfrompydanticimportBaseModel,Fieldfromlangchain_mcp_adapters.clientimportMultiServerMCPClientfromlangchain_openaiimportChatOpenAIfromlangchain.agentsimportcreate_agent load_dotenv()# 1. 创建本地工具classAddInputArgs(BaseModel):a:float=Field(description="第一个数字",example=1)b:float=Field(description="第二个数字",example=2)@tool(description="对输入的两个数字执行加法运算",args_schema=AddInputArgs,return_direct=False)defadd(a,b)->float:returna+b# 2. 获取 MCP 工具asyncdefget_mcp_tools():"""异步获取 MCP 工具,这里get_tools是异步的"""mcp_client=MultiServerMCPClient({"amap-maps-streamableHTTP":{"url":"https://mcp.amap.com/mcp?key="+os.getenv("AMAP_KEY"),"transport":"http"},})returnawaitmcp_client.get_tools()# 3. 主异步函数asyncdefmain():# 获取 MCP 工具print("正在获取 MCP 工具...")mcp_tools=awaitget_mcp_tools()# 汇总工具列表total_tools=[add]+mcp_toolsprint(f"✅ 所有工具列表(共{len(total_tools)}个):")fori,toolinenumerate(total_tools,1):print(f"{i}.{tool.name}")# 4. 初始化大模型llm=ChatOpenAI(model="qwen-max-latest",base_url="https://dashscope.aliyuncs.com/compatible-mode/v1",api_key=os.getenv("DASHSCOPE_API_KEY"),streaming=True,)# 5. 创建智能体agent=create_agent(model=llm,tools=total_tools,system_prompt="你是一个智能助手,可以调用高德 MCP 工具来帮助用户完成日常的一些需求")# 6. 调用智能体(使用异步调用!)print("\n🚀 开始调用智能体...")# ✅ 关键修改:使用 ainvoke() 而不是 invoke()result=awaitagent.ainvoke(input={"messages":[HumanMessage(content="我现在在上海市闵行区正矩科技大厦,我的车牌是‘浙AFQ5247’,我想开车导航去人民广场,请你给我规划下路线和时间。因为有禁行时间段!")]})# 7. 完成调用后打印,如果需要实时流式输出,则需要创建 create_react_agent 这里的普通智能体,只能事后打印消息记录print("\n"+"="*60)print("💬 对话记录:")print("="*60)formsginresult['messages']:t=type(msg).__name__ift=='HumanMessage':print(f"👤{msg.content}")elift=='AIMessage':ifhasattr(msg,'tool_calls')andmsg.tool_calls:fortool_callinmsg.tool_calls:args_str=', '.join(f'{k}={v}'fork,vintool_call['args'].items())print(f"🤖 调用{tool_call['name']}({args_str})")elifmsg.content:print(f"🤖{msg.content}")elift=='ToolMessage':print(f"🔧{msg.name}{msg.content[:100]}...")# 只显示前100字符print("="*60)returnresult# 8. 运行主函数if__name__=="__main__":# 使用 asyncio.run() 启动异步主函数asyncio.run(main())

创建自己的MCP服务

通过 FastMCP 创建

官网链接:https://docs.langchain.com/oss/python/langchain/mcp#custom-servers

""" 【自定义MCP】 官网:https://docs.langchain.com/oss/python/langchain/mcp#custom-servers """fromfastmcpimportFastMCP mcp=FastMCP("Math")@mcp.tool()defadd(a:int,b:int)->int:"""Add two numbers"""returna+b@mcp.tool()defmultiply(a:int,b:int)->int:"""Multiply two numbers"""returna*bif__name__=="__main__":mcp.run(transport="streamable-http")

使用mcp时的配置 JSON

{"mcpServers":{"fastmcp":{"url":"http://127.0.0.1:8000/mcp"}}}

本地AI编辑器TARE中配置MCP工具

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/8 18:47:12

GetX 从 0 开始:理解 Flutter 的“对象级响应式系统”

很多人听说 GetX,是因为它“什么都能干”:状态管理、路由、依赖注入。 但如果一上来就学 API,很容易学成“工具集合”。 这篇文章只做一件事: 👉 从 0 建立对 GetX 的正确认知:它到底解决什么问题&#xff…

作者头像 李华
网站建设 2026/5/23 15:05:39

科普视频动画素材哪里找?10个高画质库帮你搞定(第1个超实用!)

科普视频要想让观众看得懂、记得住,除了专业的知识讲解,生动的动画素材绝对是点睛之笔。无论是细胞分裂的微观世界、行星运行的宇宙奇观,还是物理实验的动态模拟,合适的动画素材都能让抽象的科学概念变得直观有趣。但很多创作者苦…

作者头像 李华
网站建设 2026/5/21 13:55:14

亲测好用!专科生毕业论文必备10款一键生成论文工具测评

亲测好用!专科生毕业论文必备10款一键生成论文工具测评 2026年专科生论文写作工具测评:为何值得一看? 随着高校教育的不断深化,专科生在毕业论文撰写过程中面临的挑战也日益增多。从选题构思到文献检索,再到格式排版与…

作者头像 李华