本节把 Kiwi 的远程 MCP server 接入 LangChain Agent,让 Agent 可以调用航班搜索工具,并通过 thread_id 保持一次对话的记忆。
上一节使用 stdio 启动本地 MCP server。本节换成远程 MCP server:Kiwi 通过网络提供航班相关工具,Agent 不需要知道它内部如何实现。
| 对比 | 本地 stdio MCP | 远程 MCP |
|---|---|---|
| 连接方式 | command + args 启动子进程 | url 连接远程服务 |
| 适合场景 | 本地脚本、内部工具、开发调试 | 第三方平台、云服务、共享能力 |
| 本课示例 | resources/2.1_mcp_server.py | https://mcp.kiwi.com |
Notebook 使用 MultiServerMCPClient 连接 travel_server。拿到的 tools 就是后续旅行 Agent 的外部能力。
client = MultiServerMCPClient(
{
"travel_server": {
"transport": "sse",
"url": "https://mcp.kiwi.com",
}
}
)
tools = await client.get_tools()sse 表示通过 Server-Sent Events 连接远程 MCP server。后续课程也会出现 streamable_http。
把工具交给 Agent 前,先打印工具名称是一个很实用的调试步骤。它能确认连接是否成功,也能帮助你理解模型能调用哪些动作。
for msg in tools:
pprint(msg.name)
print()远程 MCP 工具集可能会更新。先看工具名称和描述,再写 system prompt,可以减少模型误用工具的概率。
旅行 Agent 的核心配置有三项:模型、MCP tools、checkpointer。InMemorySaver 让同一个 thread_id 的对话可以保留上下文。
from langgraph.checkpoint.memory import InMemorySaver
agent = create_agent(
deepseek_model(),
tools=tools,
checkpointer=InMemorySaver(),
system_prompt="You are a travel agent. No follow up questions.",
)Kiwi MCP 提供的航班搜索能力。
保存同一线程中的消息历史和状态。
要求 Agent 扮演旅行代理,并避免追问。
实际调用时,Notebook 使用 ainvoke 和 configurable.thread_id。这让一次旅行规划请求可以和后续对话关联起来。
config = {"configurable": {"thread_id": "1"}}
response = await agent.ainvoke(
{
"messages": [
HumanMessage(
content="Get me a return flight from Melbourne to Changsha on Sep 1st 2026 and return on Sep 18st 2026."
)
]
},
config,
)
print(response["messages"][-1].content)航班工具通常对日期、机场、人数等参数很敏感。system prompt 中的“No follow up questions”会迫使模型基于已有信息搜索,但缺失参数时结果可能更不稳定。