工具越来越多,管理越来越乱搭好一个 Agent 之后,第一件事往往是给它加工具:搜索、代码执行、数据库查询、API 调用……用传统的 Function Calling,工具定义是这样的:@tooldefsearch_jira(query:str)-str:"""搜索 Jira 工单"""...@tooldefquery_database(sql:str)-str:"""执行 SQL 查询"""...agent=create_react_agent(model=llm,tools=[search_jira,query_database,...])这套方案很好用——直到你开始构建第二个 Agent。问题出现了:Agent B 也需要search_jira。你把函数 import 过去,或者复制一份。然后是 Agent C、Agent D。工具定义开始在代码库里四处漂移。某天你修改了search_jira的逻辑,你需要找到所有引用它的地方——它们分散在四个不同的文件里。这就是MCP(Model Context Protocol)要解决的问题:把工具从"每个 Agent 自己定义"变成"统一的服务,所有 Agent 按协议连接"。MCP 的三层架构MCP 把工具调用拆成三个角色:┌────────────────────────────────────────────────────────────────┐ │ MCP 架构 │ ├──────────────────┬──────────────────────────────────────────────┤ │ Host │ 承载 Agent 的环境:Claude Desktop、 │ │ │ Claude Code、自定义 LangChain App │ │ │ 包含一个或多个 MCP Client │ ├──────────────────┼──────────────────────────────────────────────┤ │ Client │ 内嵌在 Host 里的协议客户端 │ │ │ 负责与 MCP Server 建立连接和通信 │ ├──────────────────┼──────────────────────────────────────────────┤ │ Server │ 独立进程,暴露工具(Tools) │ │ │ 也可以暴露资源(Resources)和提示(Prompts) │ └──────────────────┴──────────────────────────────────────────────┘ 通信方式: 本地:stdio(标准输入输出,子进程) 远程:HTTP + SSE(Server-Sent Events)与 Function Calling 的核心区别在于 Server 是独立进程:Function Calling:工具是 Python 函数,写在 Agent 代码里,同进程调用MCP:工具是独立服务,Agent(Client)通过 JSON-RPC 协议跨进程调用独立进程意味着:工具可以用任何语言实现,可以被任意数量的 Agent 共享,更新工具不影响 Agent 代码。Demo 1:传统 Function Calling 的问题@lc_tooldefcalculator(expression:str)-
Agent 系列(10):MCP 协议——工具生态的标准化接入
工具越来越多,管理越来越乱搭好一个 Agent 之后,第一件事往往是给它加工具:搜索、代码执行、数据库查询、API 调用……用传统的 Function Calling,工具定义是这样的:@tooldefsearch_jira(query:str)-str:"""搜索 Jira 工单"""...@tooldefquery_database(sql:str)-str:"""执行 SQL 查询"""...agent=create_react_agent(model=llm,tools=[search_jira,query_database,...])这套方案很好用——直到你开始构建第二个 Agent。问题出现了:Agent B 也需要search_jira。你把函数 import 过去,或者复制一份。然后是 Agent C、Agent D。工具定义开始在代码库里四处漂移。某天你修改了search_jira的逻辑,你需要找到所有引用它的地方——它们分散在四个不同的文件里。这就是MCP(Model Context Protocol)要解决的问题:把工具从"每个 Agent 自己定义"变成"统一的服务,所有 Agent 按协议连接"。MCP 的三层架构MCP 把工具调用拆成三个角色:┌────────────────────────────────────────────────────────────────┐ │ MCP 架构 │ ├──────────────────┬──────────────────────────────────────────────┤ │ Host │ 承载 Agent 的环境:Claude Desktop、 │ │ │ Claude Code、自定义 LangChain App │ │ │ 包含一个或多个 MCP Client │ ├──────────────────┼──────────────────────────────────────────────┤ │ Client │ 内嵌在 Host 里的协议客户端 │ │ │ 负责与 MCP Server 建立连接和通信 │ ├──────────────────┼──────────────────────────────────────────────┤ │ Server │ 独立进程,暴露工具(Tools) │ │ │ 也可以暴露资源(Resources)和提示(Prompts) │ └──────────────────┴──────────────────────────────────────────────┘ 通信方式: 本地:stdio(标准输入输出,子进程) 远程:HTTP + SSE(Server-Sent Events)与 Function Calling 的核心区别在于 Server 是独立进程:Function Calling:工具是 Python 函数,写在 Agent 代码里,同进程调用MCP:工具是独立服务,Agent(Client)通过 JSON-RPC 协议跨进程调用独立进程意味着:工具可以用任何语言实现,可以被任意数量的 Agent 共享,更新工具不影响 Agent 代码。Demo 1:传统 Function Calling 的问题@lc_tooldefcalculator(expression:str)-