跳到正文
Elaine Blog
返回

为什么需要 MCP:从本地工具到跨应用能力连接

更新于:
Tool Calling 与 MCP

本地工具已经能查询订单,但你希望网页助手、桌面应用和 IDE 都能使用它。如果每个应用都复制一份工具定义和调用适配代码,升级时容易不一致。

可以把能力集中到一个服务,客户端以统一方式发现名称、参数与结果。这就是 MCP 在此处承担的工作。它把能力连接标准化,业务函数内部仍然需要自己处理订单授权与错误。

三个角色沿着请求怎样协作

Host 是用户使用的模型应用,负责会话、工具选择范围、权限交互和结果呈现。Client 是 Host 中负责 MCP 协议的组件。Server 暴露工具、资源或提示,内部访问数据库、文件或其他服务。

例如 Host 先向 shop Server 查询工具列表,将 get_order 转换成模型工具定义。模型生成 call-01 后,Host 校验当前允许调用,Client 发出 MCP 请求 42,Server 查订单并返回,Host 将结果对应到 call-01。

Server 不需要拿到全部用户聊天才能执行一次查询。只应接收完成当前工具所需的参数和获准上下文。Host 连接多个 Server 时,还要区分同名工具及各自凭据。

JSON-RPC 在这里表达什么

JSON-RPC 请求通过 method 指明方法,通过 params 传入参数,通过 id 关联响应。MCP 在这种消息形式上定义 tools/list、tools/call 等语义。

下面是基于 2026-07-28 的教学请求,客户端信息使用虚构值,实际序列化交给 SDK:

{
  "jsonrpc": "2.0",
  "id": 42,
  "method": "tools/call",
  "params": {
    "name": "get_order",
    "arguments": {"order_id": "A1042"},
    "_meta": {
      "io.modelcontextprotocol/protocolVersion": "2026-07-28",
      "io.modelcontextprotocol/clientInfo": {"name": "shop-host", "version": "1.0"},
      "io.modelcontextprotocol/clientCapabilities": {}
    }
  }
}

函数参数在 arguments 中,协议元数据在 _meta 中;把 tenant_id 填进元数据也不会自动产生身份认证。返回响应使用相同 JSON-RPC id,但其中的工具内容还要由 Host 转成模型结果。

通知没有普通请求那样的响应配对,不能把每一条日志都当成请求。支持的通知方向与方法取决于协议版本,不能直接把通用 JSON-RPC 的所有可能性当成 MCP 当前允许的行为。

当前版本与旧教程为什么不同

本系列固定讲解 MCP 2026-07-28。该版本采用自包含请求与逐请求版本、能力信息,旧版的 initialize/initialized 和协议 Session 不再是当前主线。Client 可以先调用 server/discover,也可以直接发送请求并处理版本不支持错误。官方版本说明

这里“可以不调用发现”不等于 Server 可以随意不实现规范要求的发现方法。能力可发现、客户端是否提前发现、某次操作是否被授权,也是三个不同问题。

旧 Server 仍可能需要握手。SDK 提供的兼容路径要结合实际对端和版本确认,不能删除所有旧逻辑后宣称任何客户端都能连接。协议版本与 Python 包版本也不是同一数字:本文 SDK 固定为 2.1.1。

无状态协议不等于无状态业务

请求不依赖协议会话,并不意味着售后任务、审批或长任务没有状态。它们可以保存在业务数据库中,由明确的任务 handle 或操作 ID 关联。

如果 Server 把草稿藏在某个连接对应的内存字典,下一次请求落到另一实例就找不到。可以把 draft_id 返回给 Host,后续请求明确引用,并在服务端检查所有权。

HTTP 连接池仍然可能存在,缓存仍然可能存在。移除协议 Session 不会替你解决业务数据一致性,更不会消除授权和共享存储需求。

与普通 HTTP API 怎样组合

已有订单 API 可以由 MCP 工具内部调用。OpenAPI 描述普通 HTTP 服务的路径、参数与响应;MCP 提供面向 Host 的工具、资源和提示发现方式。二者可以共同服务于同一业务能力。

把所有 OpenAPI 操作自动导成模型工具未必合适。接口可能过于底层、参数需要凭据、返回含敏感字段;需要筛选和转换成清楚的任务契约。

如果只有一个本地函数且没有复用需求,直接注册就足够。MCP 增加进程或网络边界、版本与连接管理,收益应来自明确的能力共享需求。

A2A 又处在哪一层

当对方是能够独立接受目标、推进任务、请求补充信息并返回产物的 Agent,A2A 提供任务与消息交互机制;普通订单查询不必包装成长任务 Agent。A2A 核心概念

MCP 也可通过扩展承载长操作,因此不能只按耗时长短选择协议。更重要的是对方提供一个能力调用,还是接受一个具有独立任务语义的委派。

一个 Agent 可以通过工具创建 A2A 任务,任务内部又使用 MCP 查询资料。记录中关联 A2A Task ID、MCP 请求 ID 和业务操作 ID,但不要互相替代。

内存连接和真实传输要分开看

Python SDK 的 Client(server_object) 可直接在进程内分发,不经过完整 JSON-RPC 帧传输。它适合观察注册和结果形状,却不能证明 stdio framing、进程启动或远程认证已经正确。

本系列因此提供 mcp_client_demo.py下载 的内存与 stdio 两种模式。前者理解接口,后者运行独立 Server 进程。它们都未在本次写作中执行。

当你能沿一个请求指出 Host、Client、Server 分别做了什么,再看原语与传输就不会把协议能力误当成模型能力。

继续阅读

上一篇:工具什么时候可以执行:授权、审批与可恢复工作流

下一篇:MCP 不只有工具:Resources、Prompts 与多轮请求

下载文件、依赖与运行边界见配套指南下载


分享这篇文章:

上一篇
工具什么时候可以执行:授权、审批与可恢复工作流
下一篇
MCP 不只有工具:Resources、Prompts 与多轮请求