import asyncio
from langchain_core.messages import HumanMessage, AIMessage, ToolMessage
from mcp import StdioServerParameters, stdio_client, ClientSession
from langchain_mcp_adapters.tools import load_mcp_tools
from langgraph.prebuilt import create_react_agent
from bailian.common import llm # 你自己的大模型封装(保持不动)
# ========================================
# 获取 MCP Tools 并运行 agent
# ========================================
async def mcp_playwright_tools():
# 1. 定义 MCP server 参数(这里用 Playwright MCP)
server_params = StdioServerParameters(
command="npx",
args=["@playwright/mcp@latest"] # 确保本地能运行 npx
)
# 2. 建立与 MCP server 的通信
async with stdio_client(server_params) as (read, write):
async with ClientSession(read, write) as session:
# 初始化 MCP 会话
await session.initialize()
# 3. 加载 MCP 提供的工具
tools = await load_mcp_tools(session)
print("已加载工具:", [t.name for t in tools])
# 4. 创建一个 ReAct agent,绑定大模型和 MCP 工具
agent = create_react_agent(model=llm, tools=tools, debug=True)
# 5. 发送用户输入给 agent
response = await agent.ainvoke(
input={
"messages": [
("user", "在百度中查询北京今天的天气,然后告诉我天气情况后结束")
]
}
)
# 6. 从响应中取出所有消息
messages = response["messages"]
# 7. 遍历消息并分类打印
for message in messages:
# 用户消息
if isinstance(message, HumanMessage):
print("用户:", message.content)
# 助理消息(可能是调用工具,也可能是普通回答)
elif isinstance(message, AIMessage):
if message.tool_calls:
# AI 调用了工具
for tool_call in message.tool_calls:
print("调用[调用工具]:", tool_call["name"], tool_call["args"])
elif message.content:
# AI 普通回答
print("助理:", message.content)
# 工具执行结果
elif isinstance(message, ToolMessage):
# 注意:content 有些是 dict,有些是 str,这里统一处理
result = message.content
if isinstance(result, dict) and "message" in result:
result = result["message"]
print("调用[工具返回结果]:", message.name, result)
# ========================================
# 程序入口
# ========================================
if __name__ == "__main__":
asyncio.run(mcp_playwright_tools())
日志截图如下:
我尝试用ai改了还是不行,最开始MCP用老师你课上那个打开浏览器后就一直卡住了,我换成第一个浏览器正常了他会自己去查询天气,但是日志我按照课上讲的代码,输出后还是这么大坨的日志