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())
这里举个例子,直接生成的数据分析图像

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

浙公网安备 33010602011771号