LangChain之调用MCP工具

import os
import uuid

import dotenv
import asyncio


from langchain_core.messages import HumanMessage
from langchain_mcp_adapters.client import MultiServerMCPClient
from langchain.agents import create_agent
from langgraph.checkpoint.memory import MemorySaver

from main import llm

dotenv.load_dotenv()

# 配置MCP地址和通信协议

# 高德地图 MCP服务端
GAODE_API_KEY = os.getenv('GAODE_API_KEY')
ZHIPU_API_KEY = os.getenv('ZHIPU_API_KEY')

from mcp.shared.exceptions import McpError

async def run_mcp_agent():
    max_retries = 3
    for attempt in range(max_retries):
        try:
            print(f"Attempt {attempt + 1}/{max_retries} starting...")
            client = MultiServerMCPClient({
                "fetch_mcp_server_config": {
                    "transport": "streamable_http",
                    "url": "<fetch的mcp链接>",
                },
                "zhipu_search_mcp_server_config": {
                    "transport": "sse",
                    "url": f"https://open.bigmodel.cn/api/mcp/web_search/sse?Authorization={ZHIPU_API_KEY}",
                },
                "context_mcp_server_config": {
                    "transport": "streamable_http",
                    "url": "<数据图像生成的mcp链接>",
                },
                "gaode_mcp_server_config": {
                    "transport": "streamable_http",
                    "url": f"https://mcp.amap.com/mcp?key={GAODE_API_KEY}",
                }
            })

            tools = await client.get_tools()
            agent = create_agent(
                llm,
                tools=tools
            )

            res = await agent.ainvoke({
                "messages": [HumanMessage(content="联网搜索今日天气")],
            })
            print(res)
            
            # 自动打开图像
            import re
            import webbrowser
            
            messages = res.get("messages", [])
            for msg in messages:
                if hasattr(msg, "content"):
                    content = msg.content
                    if isinstance(content, list):
                        # Handle list content (e.g. from ToolMessage)
                        for item in content:
                            if isinstance(item, dict) and item.get("type") == "text":
                                text = item.get("text", "")
                                urls = re.findall(r'http[s]?://(?:[a-zA-Z]|[0-9]|[$-_@.&+]|[!*\\(\\),]|(?:%[0-9a-fA-F][0-9a-fA-F]))+', text)
                                for url in urls:
                                    if any(ext in url.lower() for ext in ['.png', '.jpg', '.jpeg', '.gif', 'original']):
                                        print(f"Opening image: {url}")
                                        webbrowser.open(url)
            break
            
        except McpError as e:
            print(f"MCP Error encountered: {e}")
            if "Session terminated" in str(e) and attempt < max_retries - 1:
                print("Session terminated. Retrying...")
                await asyncio.sleep(2)
                continue
            raise e
        except Exception as e:
            print(f"An error occurred: {e}")
            raise e


asyncio.run(run_mcp_agent())

这里举个例子,直接生成的数据分析图像
4a9cf356dde70844f86284a84d02cbd4

MCP工具调用过程可以使用Pycharm插件查看

posted @ 2025-12-23 20:34  AttaSayyid  阅读(0)  评论(0)    收藏  举报