ARD 规范:为 AI Agent 补上工具发现与可信验证层

2026-07-14 29 预计阅读时间: 1 分钟
来源: infoq.com AI 摘要 Original link

Disclaimer: This article is an AI-assisted summary. Read it together with the original source when precision matters. The summary may omit context, version differences, or edge cases and is not official documentation.

预计阅读时间:9 分钟

Google 与多家行业合作伙伴发布了 Agentic Resource Discovery(ARD)规范,试图解决 AI Agent 生态中的一个基础问题:当工具、API 和其他 Agent 持续变化时,Agent 如何动态找到可用能力,并判断这些能力是否可信、兼容且适合当前任务。

ARD 的定位不是替代 MCP、OpenAPI 等执行协议,而是在它们之上增加发现层。目录负责发布资源,注册中心帮助检索资源,现有协议继续负责描述参数和执行调用。这种分层让 Agent 不必把所有工具绑定在代码或系统提示词中。

发现与执行需要分开

当前不少 Agent 应用在启动时加载一组固定工具:开发者编写函数定义,将 OpenAPI 文档转换成工具,或者配置若干 MCP Server。工具数量较少时,这种方式足够直接;当组织内部出现数百个 API、多个版本和不同信任等级时,静态配置会暴露几个问题:

  • Agent 的上下文无法容纳全部工具定义。
  • 工具升级、下线后,静态清单容易失效。
  • 同名能力可能由多个团队或供应商提供。
  • 找到一个接口,并不代表该接口已经通过身份、来源和完整性验证。

ARD 所描述的目录和注册中心可以承担检索入口。Agent 先根据任务查找候选资源,再读取资源指向的 MCP、OpenAPI 或其他执行描述,最后按照本地安全策略决定是否调用。

可以把这套流程理解为:

用户任务
   ↓
能力查询,例如“发送审批邮件”
   ↓
ARD 目录或注册中心
   ↓
候选工具、API 或 Agent + 来源与验证信息
   ↓
读取 MCP/OpenAPI 执行描述
   ↓
策略检查、授权与实际调用

这里最重要的边界是:发现结果只是候选项,不应自动等同于执行许可。

Catalog、Registry 与信任信息各自做什么

从来源摘要可以确定,ARD 强调基于 catalog 和 registry 的发现机制,并关注验证、互操作性与信任。实际落地时,可以把几个角色分开处理:

  • 资源发布者声明能力、版本、执行协议和描述文档的位置。
  • Catalog保存资源元数据,让能力能够被索引和查询。
  • Registry提供跨团队或跨目录的发现入口。
  • 执行协议继续使用 MCP、OpenAPI 等既有机制。
  • 策略执行方根据签名、发布者、环境和权限决定是否放行。

这种设计的价值在于,发现层不必重新定义每个 API 参数,也不必发明另一套工具调用格式。例如,目录记录可以说明某项能力使用 OpenAPI,并指向对应文档;Agent 在选中该资源后,再解析 OpenAPI operation 并执行请求。

信任同样不能只靠一个 verified: true 字段。生产系统至少要追问:谁完成了验证、验证的对象是哪一个版本、元数据是否被篡改、签名是否过期,以及发布者是否仍在允许名单中。

可以这样实践:搭建一个最小发现目录

下面是一个演示性伪项目,用于说明如何把“发现”和“执行描述”连接起来。字段名称仅为实践假设,并不代表 ARD 正式规范中的真实 Schema;接入正式实现时,应替换为规范定义的字段和验证流程。

创建 catalog.yaml

resources:
  - id: com.example.ticket-search
    name: Ticket Search API
    description: Search support tickets by keyword and status
    version: 1.2.0
    capabilities:
      - search_support_tickets
    execution:
      protocol: openapi
      descriptor: https://tools.example.com/tickets/openapi.json
    publisher:
      id: com.example.platform
    verification:
      status: verified
      digest: sha256:replace-with-real-descriptor-digest

  - id: com.example.docs-agent
    name: Internal Documentation Agent
    description: Answers questions using approved internal documentation
    version: 2.0.1
    capabilities:
      - answer_internal_docs
    execution:
      protocol: mcp
      descriptor: https://agents.example.com/docs/mcp.json
    publisher:
      id: com.example.knowledge
    verification:
      status: verified
      digest: sha256:replace-with-real-descriptor-digest

再创建一个可运行的 discover.py。运行前需要安装 PyYAML,并将查询词作为命令行参数传入:

#!/usr/bin/env python3
import sys
from pathlib import Path

import yaml


def discover(catalog: dict, query: str) -> list[dict]:
    words = {word.lower() for word in query.split()}
    matches = []

    for resource in catalog.get("resources", []):
        searchable = " ".join([
            resource.get("name", ""),
            resource.get("description", ""),
            *resource.get("capabilities", []),
        ]).lower()

        score = sum(word in searchable for word in words)
        verified = resource.get("verification", {}).get("status") == "verified"
        if score and verified:
            matches.append((score, resource))

    matches.sort(key=lambda item: (-item[0], item[1]["id"]))
    return [resource for _, resource in matches]


def main() -> None:
    query = " ".join(sys.argv[1:]) or "search support tickets"
    catalog = yaml.safe_load(Path("catalog.yaml").read_text(encoding="utf-8"))

    for resource in discover(catalog, query):
        execution = resource["execution"]
        print(f'{resource["id"]} {resource["version"]}')
        print(f'  protocol: {execution["protocol"]}')
        print(f'  descriptor: {execution["descriptor"]}')


if __name__ == "__main__":
    main()

执行:

python -m venv .venv
. .venv/bin/activate
python -m pip install PyYAML
python discover.py "search support tickets"

这个示例只完成本地检索和最低限度的状态过滤。生产实现还需要下载 descriptor、校验摘要或数字签名、限制允许的发布者,并在调用工具前进行用户授权。

接入时不要省略这些控制

ARD 降低了发现能力的成本,但动态发现也扩大了攻击面。恶意发布者可能伪装成常用工具,合法工具的描述文档也可能在发布后被替换。采用这类机制时,建议建立以下检查项:

  • 将资源身份绑定到可验证的发布者,而不是只相信显示名称。
  • 对目录记录和执行描述做签名或内容摘要校验。
  • 固定生产环境允许使用的协议、域名和发布者范围。
  • 把“可被发现”与“允许执行”设为两个独立权限。
  • 记录 Agent 选择了哪个资源版本、选择原因及实际调用结果。
  • 为失效、撤销和版本升级设计缓存刷新机制。
  • 对高风险操作保留人工确认、最小权限凭证和调用限额。

ARD 值得关注的地方,不是又增加了一种调用协议,而是尝试为分散的 Agent 能力建立统一入口。团队可以先从内部只读目录开始,复用现有 OpenAPI 或 MCP 资产,并逐步加入发布者验证、版本治理和策略控制。只有当发现结果能够被独立验证,而且执行仍受明确授权约束时,动态工具发现才适合进入生产环境。


相关推荐