Appearance
到目前为止,我们的工具都是手写的:一个函数、一段说明、一个 @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 服务端,就能把对面提供的工具自动变成自己能调用的工具——你一行工具代码都不用写。
上手:让 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 更强、更通"的部分就讲完了。接下来转向工程化的另一半——怎么科学地判断它到底好不好。下一篇:《评估:别再拍脑袋调提示词》。