简介
本次演示围绕 Bright Data Web MCP 与 LangGraph 的集成实操展开,完整展示了从获取大模型 API Key、创建大模型会话,到获取 Bright Data API Key、通过 MultiServerMCPClient 连接 Web MCP 服务器,并在 Bright Data 后台进一步启用浏览器自动化工具、扩展智能体可调用能力的全流程;同时结合 LangGraph 的 StateGraph,搭建了包含大模型节点、工具调用节点和路由规则节点的循环式 AI 研究智能体。演示过程中,通过'打开网页并持续滚动,直到提取 30 条语录的作者、内容与标签'这一实际任务,直观呈现了智能体基于实时网页数据进行搜索、抓取、交互和推理的完整效果。实测结果表明,LangGraph 提供了清晰可控的智能体状态管理与决策机制,而 Bright Data Web MCP 则补足了真实网页访问与动态页面交互能力,使 AI Agent 无需将复杂抓取逻辑硬编码进提示词或业务代码中,也能更稳定地完成生产级研究任务。
from __future__ import annotations
import argparse
import asyncio
import json
import os
import sys
from typing import Any, Literal
from urllib.parse import urlencode
from dotenv import load_dotenv
from langchain_core.messages import HumanMessage, SystemMessage, ToolMessage
from langchain_openai import ChatOpenAI
from langchain_mcp_adapters.client import MultiServerMCPClient
from langgraph.graph import END, START, MessagesState, StateGraph
SYSTEM_PROMPT = """
You are a web research assistant. Task:
- Research the user's topic using Google search results and a few sources.
- Return 6–10 simple bullet points.
- Add a short "Sources:" list with only the URLs you used.
How to use tools:
- First call the search tool to get Google results.
- Select 3–5 reputable results and scrape them.
- If scraping fails, try a different result.
Constraints:
- Use at most 5 sources.
- Prefer official docs or primary sources.
- Keep it quick: no deep crawling.
"""
def make_llm_call_node(llm_with_tools):
async def llm_call():
messages = [SystemMessage(content=SYSTEM_PROMPT)] + state[]
ai_message = llm_with_tools.ainvoke(messages)
{: [ai_message]}
llm_call
():
():
last_ai_msg = state[][-]
tool_results = []
tool_call last_ai_msg.tool_calls:
tool = tools_by_name.get(tool_call[])
tool:
tool_results.append(
ToolMessage(
content=,
tool_call_id=tool_call[],
)
)
observation = (
tool.ainvoke(tool_call[])
(tool, )
tool.invoke(tool_call[])
)
tool_results.append(
ToolMessage(
content=(observation),
tool_call_id=tool_call[],
)
)
{: tool_results}
tool_node
() -> [, END]:
last_message = state[][-]
(last_message, , ):
END
():
load_dotenv()
bd_token = os.getenv()
bd_token:
ValueError()
client = MultiServerMCPClient({
: {
: ,
: ,
}
})
tools = client.get_tools()
tools_by_name = {tool.name: tool tool tools}
()
openai_api_key = os.getenv()
llm = ChatOpenAI(
model=,
temperature=,
api_key=openai_api_key,
base_url=,
)
llm_with_tools = llm.bind_tools(tools)
graph = StateGraph(MessagesState)
graph.add_node(, make_llm_call_node(llm_with_tools))
graph.add_node(, make_tool_node(tools_by_name))
graph.add_edge(START, )
graph.add_conditional_edges(, should_continue, [, END])
graph.add_edge(, )
agent = graph.()
topic =
result = agent.ainvoke(
{: [HumanMessage(content=)]},
config={: }
)
(result[][-].content)
__name__ == :
asyncio.run(main())


