惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

V
V2EX
爱范儿
爱范儿
Martin Fowler
Martin Fowler
T
The Blog of Author Tim Ferriss
B
Blog RSS Feed
博客园 - 聂微东
G
GRAHAM CLULEY
Engineering at Meta
Engineering at Meta
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
WordPress大学
WordPress大学
Scott Helme
Scott Helme
AI
AI
S
Security Affairs
T
Threat Research - Cisco Blogs
M
MIT News - Artificial intelligence
T
Troy Hunt's Blog
H
Hackread – Cybersecurity News, Data Breaches, AI and More
人人都是产品经理
人人都是产品经理
AWS News Blog
AWS News Blog
T
Threatpost
Cyberwarzone
Cyberwarzone
www.infosecurity-magazine.com
www.infosecurity-magazine.com
U
Unit 42
V
Vulnerabilities – Threatpost
J
Java Code Geeks
博客园 - Franky
月光博客
月光博客
Blog — PlanetScale
Blog — PlanetScale
NISL@THU
NISL@THU
D
Docker
小众软件
小众软件
N
News and Events Feed by Topic
Microsoft Security Blog
Microsoft Security Blog
Y
Y Combinator Blog
A
Arctic Wolf
D
DataBreaches.Net
云风的 BLOG
云风的 BLOG
Forbes - Security
Forbes - Security
量子位
PCI Perspectives
PCI Perspectives
美团技术团队
K
KPMG report finds enterprise disconnect between AI and its ROI | CIO
I
InfoQ
Security Archives - TechRepublic
Security Archives - TechRepublic
有赞技术团队
有赞技术团队
腾讯CDC
P
Proofpoint News Feed
S
Security @ Cisco Blogs
G
Google Developers Blog
C
Cisco Blogs

鸟窝

鸟窝 鸟窝 鸟窝 鸟窝 鸟窝 鸟窝 鸟窝 鸟窝 鸟窝 鸟窝 鸟窝 鸟窝 鸟窝 鸟窝 鸟窝 鸟窝 鸟窝 鸟窝 鸟窝 鸟窝 鸟窝 鸟窝 鸟窝 鸟窝 鸟窝 鸟窝 鸟窝 鸟窝 LLM 究竟是如何工作的? Go 实验特性详解 amd64 微架构级别对 Go 程序性能提升多少? Loop Engineering 实践:一次批量实现 8 个 issue,完成夔牛工具的开发 Loop Engineering 实践:我把 RDMA 开发库移植到 Go 语言,花费 239 块钱 傻瓜式RDMA高性能网络开发:从零跑到 400 Gb每秒 百度物理网络监控工具开源第二弹:毫秒级监控工具 baize,让你的网络问题无处遁形 百度网络监控工具开源第三弹:lidar — 不只是 pingmesh 别只盯着gopacket了,看看这个强大的网络库 大厂的内部工具居然开源了! 一窥百度物理网络秒级监控定位的秘密 如何构建你自己的 Agent 运行时 寻找你代码中的臭味:一个让 AI 帮你嗅出架构腐化的开源 Skill 套壳不丢人!我用Go+AI搓了一个Agent统一编排框架,ClaudeCode-Codex-Pi全被我包了 告别死锁和陈旧语法、告别性能瓶颈:三个开源 Skill,新手Gopher 秒变 Go 语言大神 SPEC和PRD的区别 SPEC和方案设计有什么区别 从需求到上线,让 AI 管理你的整个研发流程! antigravity-cli 使用 CLIProxyAPI, 让最新的 Codex 能够支持国内的各大模型 Clawpatch + codex-review:AI 代码审查工具链的正确打开方式 拆解Manus:沙盒架构深度解析 40+ Claude Code Tips: From Basics to Advanced Ralph 实验:构建 SQLite UI 了解 Manus Sandbox - 您的云计算机 Notex:一个开源 NotebookLM 替代方案的实现 拆解Manus:真正有用的深度报告的生成 Claude Code 使用 我给每个模型服务商『捐』了10块钱,只为了... Go之禅 - 基于Rob Pike思想的Go语言哲学 Codex CLI vs Gemini CLI vs Claude Code:谁是最佳选择? goskills:Claude Skills 功能强大,为我所用 一行代码使用 Claude Skill 和 deepseek Linux 中网络包的一生 godotenv 库介绍 Codex CLI vs Gemini CLI vs Claude Code: Which is the Best? 使用Linux 30年了,我都不知道 ping 8.8 还能这么用? 从 AI 哪里挣钱? Go sync 包近两年发展综述 deepseek-v3.2-exp的闪电索引器
langchain + MCP:如虎添翼
by smallnest · 2025-11-01 · via 鸟窝

MCP技术毋须多言了,上半年火的一塌糊涂,现在进入冷静期了。

langchain 本身就很方便的集成进程内的工具,但是加上 MCP的功能,就如虎添翼,可以充分利用网上上万的MCP的服务。

langchain 自从上个月融资了1.25亿美元之后,资金充足,也更加有动力推进产品的演化,相继发布了langchain/langgraph 1.0的版本。 langchain 1.0中统一了agent的创建,使用create_agent代替之前的create_tool_calling_agentcreate_react_agentcreate_json_agentcreate_xml_agent等。

这篇文章介绍 2(MCP的两种模式sse、stdio) x 2 (经典的langchain agent和1.0最新版create_agent两个模式)一共4个例子,介绍了langchain如何使用MCP 工具丰富其功能。

先决条件

在运行这些示例之前,请确保您已安装必要的库。您通常可以使用 pip 进行安装:

1

pip install langchain langchain-openai langchain-classic langchain-mcp-adapters mcp

此外,请确保您的环境中已安装 python3

共同组件

这两个示例都共享几个核心组件和一个共同目标:使用 LangChain Agent 通过 MCP 服务器提供的工具来回答一个简单的数学问题。

  • LLM 配置:两个示例都使用 ChatOpenAI,配置为 deepseek-v3 模型,温度为 0
    这是我使用百度云上提供的deepseek服务,你要是使用deepseek官方的服务,需要修改模型为deepseek-chat
    我已经把KEY和调用地址配置在环境变量中了,所以在代码中不用显示指定:

1

2

export OPENAI_API_KEY=bce-v3/abcsfsfdskgergerthntjrweeuidfu8324refbif3

export OPENAI_API_BASE=https://qianfan.baidubce.com/v2

创建模型对象:

1

llm = ChatOpenAI(model="deepseek-v3", temperature=0)

  • Agent 提示ChatPromptTemplate 用于定义 Agent 的角色并构建对话。它包括一个系统消息、可选的聊天历史记录、人类输入以及 Agent 暂存区(用于规划其行动)的占位符。

1

2

3

4

5

6

7

8

prompt = ChatPromptTemplate.from_messages(

[

("system", "你是一个可以使用工具的得力助手。 தயவுசெய்து கருவிகளைப் பயன்படுத்தவும்."),

MessagesPlaceholder("chat_history", optional=True),

("human", "{input}"),

MessagesPlaceholder("agent_scratchpad"),

]

)

  • Agent 创建和执行create_tool_calling_agent 函数用于构建能够使用工具的 Agent ,AgentExecutor 用于运行 Agent 。

1

2

agent = create_tool_calling_agent(llm, tools, prompt)

agent_executor = AgentExecutor(agent=agent, tools=tools, verbose=True)

  • 任务: Agent 被调用,输入为“123 + 456 等于多少?”。

MCP 服务

Stdio服务

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

import asyncio

from mcp.server import FastMCP

server = FastMCP(name="math_server", log_level="ERROR")

@server.tool()

def add(a: int, b: int) -> int:

"""将两个整数相加。"""

return a + b

async def main():

await server.run_stdio_async()

if __name__ == "__main__":

asyncio.run(main())

sse 服务

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

import asyncio

from typing import Annotated

from mcp.server import FastMCP

server = FastMCP(name="math_server", instructions="一个可以做加法的简单数学服务器。", log_level="ERROR")

@server.tool()

def add(

a: Annotated[int, "第一个整数"],

b: Annotated[int, "第二个整数"]

) -> int:

"""将两个整数相加。"""

return a + b

async def main():

await server.run_sse_async()

if __name__ == "__main__":

asyncio.run(main())

此示例演示了如何设置一个 MCP 服务器,该服务器通过标准输入和输出流与客户端通信。这适用于本地、单进程交互,其中服务器可以作为子进程生成。

目的

example_1_mcp_tool_stdio.py 脚本展示了如何:

  1. 定义一个通过 stdio 暴露工具的 MCP 服务器。
  2. 创建一个 stdio_client 来连接到此服务器。
  3. 将服务器提供的工具加载到 LangChain Agent 中。
  4. 使用 Agent 解决需要加载工具的问题。

关键组件和代码

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

import asyncio

import os

from pathlib import Path

from langchain_openai import ChatOpenAI

from langchain_classic.agents import AgentExecutor, create_tool_calling_agent

from langchain_core.prompts import ChatPromptTemplate, MessagesPlaceholder

from langchain_mcp_adapters.tools import load_mcp_tools

from mcp.client.stdio import stdio_client

from mcp import ClientSession, StdioServerParameters

async def run_mcp_tool_example():

mcp_server_path = Path(__file__).parent / "mcp_math_server_stdio.py"

server_params = StdioServerParameters(

command="python3",

args=[str(mcp_server_path)],

)

async with stdio_client(server_params) as (read, write):

async with ClientSession(read, write) as session:

await session.initialize()

tools = await load_mcp_tools(session)

print("正在调用 agent 回答一个数学问题...")

response = await agent_executor.ainvoke(

{"input": "123 + 456 等于多少?", "chat_history": []}

)

print(f"Agent 回答: {response['output']}")

if __name__ == "__main__":

asyncio.run(run_mcp_tool_example())

如何运行

要运行此示例,只需执行 Python 脚本:

1

python3 example_1_mcp_tool_stdio.py

您将看到 Agent 的思考过程和最终答案打印到控制台。

此示例演示了如何集成一个 MCP 服务器,该服务器通过 HTTP 上的服务器发送事件(SSE)暴露其工具。此方法更适用于工具服务器可能是独立网络服务的情况。

目的

example_1_mcp_tool_sse.py 脚本展示了如何:

  1. 将 MCP SSE 服务器作为单独的进程启动。
  2. 创建一个 MultiServerMCPClient 来连接到此基于 HTTP 的服务器。
  3. 将服务器提供的工具加载到 LangChain Agent 中。
  4. 使用 Agent 解决需要加载工具的问题。

关键组件和代码演练

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

import asyncio

import os

from pathlib import Path

import sys

from langchain_openai import ChatOpenAI

from langchain_classic.agents import AgentExecutor, create_tool_calling_agent

from langchain_core.prompts import ChatPromptTemplate, MessagesPlaceholder

from langchain_mcp_adapters.client import MultiServerMCPClient

async def run_mcp_tool_example():

mcp_server_path = Path(__file__).parent / "mcp_math_server_sse.py"

server_process = await asyncio.create_subprocess_exec(

sys.executable, str(mcp_server_path),

stdout=asyncio.subprocess.PIPE,

stderr=asyncio.subprocess.PIPE,

)

await asyncio.sleep(5)

client = MultiServerMCPClient(

{

"math": {

"transport": "sse",

"url": "http://localhost:8000/sse",

},

}

)

tools = await client.get_tools()

print("正在调用 agent 回答一个数学问题...")

response = await agent_executor.ainvoke(

{"input": "123 + 456 等于多少?", "chat_history": []}

)

print(f"Agent 回答: {response['output']}")

server_process.terminate()

await server_process.wait()

if __name__ == "__main__":

asyncio.run(run_mcp_tool_example())

如何运行

要运行此示例,只需执行 Python 脚本:

1

python3 example_1_mcp_tool_sse.py

您将看到 Agent 的思考过程和最终答案打印到控制台。请注意,在此示例中,AgentExecutorverbose 标志设置为 False,以避免 SSE 服务器子进程产生过多的输出。

比较:Stdio 与 SSE

  • Stdio(标准 I/O)

    • 简单性:更易于设置本地、单机通信。
    • 执行:MCP 服务器通常作为客户端应用程序的子进程生成。
    • 用例:适用于紧密耦合的组件,或者当您希望将工具服务器直接与应用程序捆绑时。
  • SSE(服务器发送事件)

    • 灵活性:允许 MCP 服务器作为独立的网络服务运行,可能在不同的机器上。
    • 可伸缩性:可以成为更大微服务架构的一部分。
    • 执行:客户端连接到正在运行的 HTTP 端点。服务器需要单独启动(如示例中通过 asyncio.create_subprocess_exec 所示)。
    • 用例:适用于分布式系统、基于 Web 的应用程序,或者当工具服务器需要被多个客户端访问时。

这两种方法都有效地允许 LangChain Agent 发现和利用使用多客户端协议定义的工具,从而为这些工具的部署和访问提供了灵活性。

这两个示例都是langchain经典的Agent开发模型,他们演示了langchain将 MCP 工具与 LangChain Agent 集成的强大功能和灵活性。无论它们是通过 stdio 还是 SSE 暴露。这使得健壮且可伸缩的 Agent 应用程序成为可能。

接下来我介绍如何使用 Langchain 1.0 中新的 create_agent 函数来构建 Agent ,并将其与 MCP 工具集成。与之前的示例不同,create_agent 提供了一种更简洁的方式来定义 Agent ,直接接受 LLM 模型、工具列表和系统提示,并返回一个可流式传输的图(graph)对象。

示例 3:使用 Langchain 1.0 create_agent 的 MCP SSE 工具集成

此示例展示了如何将 MCP SSE 服务器提供的工具与 Langchain 1.0 的 create_agent 函数结合使用。它演示了如何启动 SSE 服务器、获取工具,然后使用新的 Agent 创建和调用模式来解决数学问题。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

import asyncio

import os

from pathlib import Path

import sys

from langchain_openai import ChatOpenAI

from langchain.agents import create_agent

from langchain_mcp_adapters.client import MultiServerMCPClient

async def run_mcp_sse_new_agent_example():

server_process = None

try:

mcp_server_path = Path(__file__).parent / "mcp_math_server_sse.py"

server_process = await asyncio.create_subprocess_exec(

sys.executable, str(mcp_server_path),

stdout=asyncio.subprocess.PIPE,

stderr=asyncio.subprocess.PIPE,

)

await asyncio.sleep(5)

client = MultiServerMCPClient(

{

"math": {

"transport": "sse",

"url": "http://localhost:8000/sse",

},

}

)

tools = await client.get_tools()

llm = ChatOpenAI(model="deepseek-v3", temperature=0)

graph = create_agent(

model=llm,

tools=tools,

system_prompt="你是一个可以使用工具的得力助手。 தயவுசெய்து கருவிகளைப் பயன்படுத்தவும்.",

)

print("正在调用 agent 回答一个数学问题...")

inputs = {"messages": [{"role": "user", "content": "123 + 456 等于多少?"}]}

async for chunk in graph.astream(inputs, stream_mode="updates"):

print(chunk)

finally:

if server_process and server_process.returncode is None:

print("\nTerminating server process...")

server_process.terminate()

await server_process.wait()

elif server_process and server_process.returncode is not None:

print(f"\nServer process exited with code: {server_process.returncode}")

if server_process and server_process.stderr:

stderr_output = await server_process.stderr.read()

if stderr_output:

print("\nServer stderr output:")

print(stderr_output.decode())

if __name__ == "__main__":

asyncio.run(run_mcp_sse_new_agent_example())

示例 4:使用 Langchain 1.0 create_agent 的 MCP Stdio 工具集成

此示例演示了如何将 MCP Stdio 服务器提供的工具与 Langchain 1.0 的 create_agent 函数结合使用。它展示了如何通过 stdio 客户端连接到服务器、获取工具,然后使用新的 Agent 创建和调用模式来解决数学问题。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

import asyncio

import os

from pathlib import Path

from langchain_openai import ChatOpenAI

from langchain.agents import create_agent

from langchain_mcp_adapters.tools import load_mcp_tools

from mcp.client.stdio import stdio_client

from mcp import ClientSession, StdioServerParameters

async def run_mcp_stdio_new_agent_example():

mcp_server_path = Path(__file__).parent / "mcp_math_server_stdio.py"

server_params = StdioServerParameters(

command="python3",

args=[str(mcp_server_path)],

)

async with stdio_client(server_params) as (read, write):

async with ClientSession(read, write) as session:

await session.initialize()

tools = await load_mcp_tools(session)

llm = ChatOpenAI(model="deepseek-v3", temperature=0)

graph = create_agent(

model=llm,

tools=tools,

system_prompt="你是一个可以使用工具的得力助手。 தயவுசெய்து கருவிகளைப் பயன்படுத்தவும்.",

)

print("正在调用 agent 回答一个数学问题...")

inputs = {"messages": [{"role": "user", "content": "123 + 456 等于多少?"}]}

async for chunk in graph.astream(inputs, stream_mode="updates"):

print(chunk)

if __name__ == "__main__":

asyncio.run(run_mcp_stdio_new_agent_example())