Skip to content

Agent 进阶(六)MCP:给 Agent 装上「万能接口」

🕒 Published at:

到目前为止,我们的工具都是手写的:一个函数、一段说明、一个 @tool。想让 Agent 会查天气就手写查天气、会连数据库就手写连数据库。能用,但有个大问题——每个人都在重复造轮子MCP 就是来终结这种重复的。这一篇用大白话讲清 MCP 是什么、解决什么问题、怎么用。

先讲个"充电器"的故事

十几年前,每个手机品牌的充电器接口都不一样:诺基亚一种、三星一种、苹果一种。你换个手机,一堆旧充电线全废了,出门还得记得带对应的那根。后来有了 USB-C——一个统一标准,一根线充手机、平板、笔记本、耳机,全世界通用。

AI 工具现在正处在"USB-C 之前"的混乱期。你写的查天气工具,只能你自己的 Agent 用;别人写的连数据库工具,你想用还得照着重写一遍。MCP(Model Context Protocol,模型上下文协议)就是 AI 工具界的 USB-C——它规定了一套统一的"接口标准",只要大家都按这个标准来,任何 Agent 都能即插即用地接入任何按 MCP 做好的工具。

它到底解决了什么:M×N 变 M+N

用个更硬核一点的说法。假设有 M 个 AI 应用、N 个工具/数据源,在没有统一标准的世界里,每个应用要对接每个工具都得单独写一遍适配,总共要写 M×N 份对接代码——数量爆炸。

有了 MCP 这个统一标准后,每个应用只要"会说 MCP"这一种语言、每个工具只要"按 MCP 暴露"一次,双方就能通。对接量从 M×N 骤降到 M+N。这就是标准的威力——你可能没意识到,正是因为有了 USB 标准,你才不用为每个设备配一根专属线。

两个角色:MCP 服务端 和 MCP 客户端

MCP 的世界里就两种角色,很好记:

MCP 服务端(Server):把某些能力(工具、数据)按 MCP 标准"对外提供"的一方。比如 GitHub 官方做了个 MCP 服务端,把"读仓库、提 issue、看 PR"这些能力暴露出来;文件系统、数据库、地图、浏览器……现在都有大量现成的 MCP 服务端,社区里成百上千个,拿来即用。

MCP 客户端(Client):你的 Agent 这一方。它"连上"一个或多个 MCP 服务端,就能把对面提供的工具自动变成自己能调用的工具——你一行工具代码都不用写。

你的 AgentMCP 客户端GitHub MCP 服务端读仓库 / 提 issue数据库 MCP 服务端查表 / 写数据地图 MCP 服务端导航 / 查地点用 MCP 统一接入,工具自动到手

上手:让 Agent 接入 MCP 工具

LangChain 提供了 langchain-mcp-adapters,帮你把 MCP 服务端的工具"翻译"成 LangChain 的工具,直接喂给 create_agent

bash
pip install -U langchain-mcp-adapters langchain langchain-openai

用法就三步:配置要连的服务端 → 拿到工具 → 塞给 Agent。

python
import os, asyncio
from langchain_mcp_adapters.client import MultiServerMCPClient
from langchain.agents import create_agent
from langchain_openai import ChatOpenAI

model = ChatOpenAI(
    model="qwen-plus",
    api_key=os.getenv("DASHSCOPE_API_KEY"),
    base_url="https://dashscope.aliyuncs.com/compatible-mode/v1",
)

# 1) 配置要连接的 MCP 服务端(可以同时连多个)
client = MultiServerMCPClient({
    # 本地进程方式启动的服务端(stdio)
    "math": {
        "command": "python",
        "args": ["math_server.py"],
        "transport": "stdio",
    },
    # 通过 HTTP 连接的远程服务端
    "weather": {
        "url": "http://localhost:8000/mcp/",
        "transport": "streamable_http",
    },
})

async def main():
    # 2) 一行拿到所有服务端提供的工具(已自动转成 LangChain 工具)
    tools = await client.get_tools()

    # 3) 塞给 Agent,它就"学会"了这些工具,和自己手写的没区别
    agent = create_agent(model=model, tools=tools)
    result = await agent.ainvoke({
        "messages": [{"role": "user", "content": "帮我算一下 (12 + 8) 乘以 3"}]
    })
    print(result["messages"][-1].content)

asyncio.run(main())

注意这里用的是异步写法(async / await / ainvoke),因为连接 MCP 服务端天然是网络 IO。重点看第 2、3 步:get_tools() 把对面的能力一次性收进来,接下来 Agent 用起来和入门篇手写的工具完全一样——它根本不关心工具是自己写的还是从 MCP 来的。这就是"即插即用"。

MCP 的价值,和一点提醒

价值:你不再需要为每个外部系统手写工具。想让 Agent 会操作 GitHub、查数据库、控制浏览器?找一个现成的 MCP 服务端连上就行,生态里已经有海量选择,而且还在飞快增长。这让 Agent 的能力边界一下子被打开了。

提醒:MCP 服务端是"别人的代码/服务",接入前要留意来源可信度和权限——一个能读写你数据库或文件系统的 MCP 服务端,权限给大了是有风险的。生产里要挑官方或可信来源的服务端,并配合我们前面讲的人工确认中间件给危险操作加闸。

Node 侧:MCP 本身是跨语言的中立协议,和用什么语言写 Agent 无关。LangChain.js 也有对应的 MCP 适配包(@langchain/mcp-adapters),用法思路一致:连服务端 → 取工具 → 交给 Agent。同一个 MCP 服务端,Python 和 Node 的 Agent 都能连。

小结

MCP 是 AI 工具界的"USB-C":一套统一标准,让对接量从 M×N 降到 M+N,你的 Agent 能即插即用地接入海量现成工具。角色只有两个——提供能力的服务端、连接使用的客户端(你的 Agent);用 langchain-mcp-adapters 三步接入。记得关注服务端的可信度和权限。

到这里,"让 Agent 更强、更通"的部分就讲完了。接下来转向工程化的另一半——怎么科学地判断它到底好不好。下一篇:《评估:别再拍脑袋调提示词》。