LangChain LangGraph
Module 1 Module 2 Module 3
Module 2 · 工具、状态与多 Agent
1 2.1 MCP
2 2.1 Travel Agent
3 2.2 Runtime Context
4 2.2 State
5 2.3 Multi Agent
6 2.4 Wedding Planners
7 Bonus: RAG
8 Bonus: SQL
SUM Module Summary
HomeLangChainModule 2 · 工具、状态与多 Agent2.1 MCP
📓 Notebook 📖 Explained
LANGCHAIN MODULE 2 · LESSON 2.1a

MCP:把外部能力接入 Agent
Tools · Resources · Prompts

本节用 MultiServerMCPClient 同时连接本地 server 和时间 server,把 MCP 暴露的工具、资源和 prompt 交给 LangChain Agent 使用。

1 MCP 解决什么问题?

MCP(Model Context Protocol)的核心价值,是把外部系统的能力统一暴露给模型应用。对 LangChain Agent 来说,MCP server 可以提供三类东西:toolsresourcesprompts

类型在本课中的含义Agent 如何使用
Tools可调用动作,例如查时间、查外部系统作为 create_agent(..., tools=tools) 的工具列表
Resources可读取资料,例如 server 提供的文本、文件或配置先读出来,再放入 prompt 或上下文
Promptsserver 维护的提示模板取出后作为 system_prompt
关键理解

MCP 不是让模型直接访问任意系统,而是通过 server 明确暴露可用能力。Agent 只看到被注册出来的工具、资源和 prompt。

2 初始化环境和兼容处理

Notebook 先加载环境变量,再处理 Windows + Jupyter 下启动 stdio 子进程时可能遇到的事件循环和 stderr 问题。

Python
from dotenv import load_dotenv
load_dotenv()

import os
import sys
import asyncio
from langchain.agents import create_agent
from langchain.messages import HumanMessage
from langchain_mcp_adapters.client import MultiServerMCPClient

if sys.platform == "win32":
    if not isinstance(asyncio.get_event_loop_policy(), asyncio.WindowsProactorEventLoopPolicy):
        asyncio.set_event_loop_policy(asyncio.WindowsProactorEventLoopPolicy())

    if "ipykernel" in sys.modules:
        sys.stderr = sys.__stderr__
为什么需要这段兼容代码

stdio 类型的 MCP server 依赖子进程通信。Jupyter 在 Windows 上的事件循环和标准错误流比较特殊,所以 notebook 先做兼容处理。

3 配置 MultiServerMCPClient

MultiServerMCPClient 可以同时管理多个 MCP server。本课连接两个 server:一个本地 Python server,另一个通过 uvx 启动的时间 server。

Python
client = MultiServerMCPClient(
    {
        "local_server": {
            "transport": "stdio",
            "command": "python",
            "args": ["resources/2.1_mcp_server.py"],
        },
        "time": {
            "transport": "stdio",
            "command": "uvx",
            "args": ["mcp-server-time", "--local-timezone=Australia/Melbourne"],
        },
    }
)
local_server

本地脚本暴露课程自定义的 tools、resources 和 prompt。

time

第三方 MCP server 暴露时间查询工具。

client

统一拉取能力,并交给 Agent 使用。

4 获取 tools、resources 和 prompt

连接完成后,client 可以分别读取 MCP server 暴露的工具、资源和 prompt。这里的 prompt 会作为 Agent 的系统提示词。

Python
tools = await client.get_tools()
resources = await client.get_resources("local_server")
prompt = await client.get_prompt("local_server", "prompt")
prompt = prompt[0].content
注意

get_tools() 默认会聚合 client 管理的所有 server 工具;而 resources 和 prompts 通常需要指定 server 名称。

5 创建 Agent 并异步调用

拿到 MCP 工具和 prompt 后,Agent 的创建方式和普通 LangChain tool 几乎一样。区别在于 MCP 工具往往涉及进程或网络 I/O,所以 notebook 使用 await agent.ainvoke(...)

Python
agent = create_agent(
    model=deepseek_model(),
    tools=tools,
    system_prompt=prompt,
)

question = HumanMessage(content="What time is it?")
response = await agent.ainvoke({"messages": [question]})

print(response["messages"][-1].content)
调用链

用户问题进入 Agent 后,模型会根据工具描述决定是否调用 MCP tool;MCP server 返回结果后,模型再组织最终自然语言回答。

6 本课最小心智模型

1. Server 暴露能力

MCP server 负责定义工具、资源和 prompt。它可以是本地脚本,也可以是远程服务。

2. Client 拉取能力

MultiServerMCPClient 把多个 server 的能力统一拿到当前程序里。

3. Agent 使用能力

create_agent 接收 tools 和 system prompt,运行时由模型决定调用哪个工具。

适用场景

当工具来自外部进程、第三方服务、公司内部系统,或者需要跨语言复用时,MCP 比直接写 Python tool 更容易标准化。