关于 Neuronto ARD Registry: Agentic Resource Discovery (ARD) Index
Neuronto ARD Registry 是 Agentic Resource Discovery(ARD)规范的索引服务,可在所有公开 ARD 注册表中进行一次搜索,并提供已验证的 MCP 工具索引。它面向 Agent 开发者、API 与工具供应商以及平台团队。与仅存储服务名称与描述的目录不同,它会读取各 MCP 端点的 tools/list 来核实工具。
主要功能
- 01联合搜索多个公开 ARD 注册表并合并排序
- 02已验证的 MCP 工具名称与输入模式索引
- 03混合检索,结合 BM25 与向量检索
- 04端点存活探测,失效条目降低排名
- 05支持付费端点的价格信息筛选
适用场景
- 01Agent 在运行时按需查找可用的工具或服务
- 02API 厂商发布 manifest 以便被 ARD 客户端发现
- 03平台团队对内部服务进行发现与检索
配置
远程服务无需本地安装。选择你使用的客户端,复制配置或使用一键安装。
https://neuronto.com/mcpclaude mcp add --transport http com-neuronto-agents-tools-search-discovery-ard-registry https://neuronto.com/mcp{"mcpServers":{"com-neuronto-agents-tools-search-discovery-ard-registry":{"type":"http","url":"https://neuronto.com/mcp"}}}在 Cursor 中打开{"servers":{"com-neuronto-agents-tools-search-discovery-ard-registry":{"type":"http","url":"https://neuronto.com/mcp"}}}在 VS Code 中打开{"mcpServers":{"com-neuronto-agents-tools-search-discovery-ard-registry":{"type":"http","url":"https://neuronto.com/mcp"}}}{"mcpServers":{"com-neuronto-agents-tools-search-discovery-ard-registry":{"serverUrl":"https://neuronto.com/mcp"}}}命令在终端中运行;JSON 粘贴到对应客户端的 MCP 配置后重启。需要授权的服务会在首次连接时提示登录。
工具
4| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| kind | enum | 否 | 限定为一种资源类别。匹配时会进行规范化,因此 'mcp-server' 可在所有流通中的媒体类型下找到相关项,而 'a2a-agent' 或 'agent' 均可匹配 A2A 卡片以及 ACP、OASF 和 AgentFacts 描述符。'webmcp' 指浏览器页面工具,它们不是可调用的服务端。any | mcp-server | skill | a2a-agent | agent | webmcp | plugin | openapi | graphql | dataset | package | doc | catalog | registry |
| limit | integer | 否 | |
| query | string | 是 | 任务的通俗描述。例如:“抓取受 cloudflare 保护的网站”。 |
| network | string | 否 | 支付网络,例如 base、solana、tempo 或 stripe。 |
| payment | enum | 否 | 仅保留符合此付款要求的资源。“free”表示价格未知;“payable”表示已知价格或 402。any | free | payable | x402 | mpp | card |
| federate | boolean | 否 | 同时实时查询上游注册表并合并排名。关闭时速度更快。 |
| max_price_per_call | number | 否 | 单次调用的最高支付金额,单位为美元。价格未知的资源将被排除。 |
详细介绍
Neuronto ARD 注册表:智能体资源发现(ARD)索引
一次搜索即可覆盖所有公开 ARD 注册表,还可查询经过验证的 MCP 服务实际提供的内容。
什么是 ARD?
ARD 是 Agentic Resource Discovery(智能体资源发现) 的缩写,是一项开放规范,用于规定 AI Agent 如何发现所需的工具、技能、Agent 和 API。该规范由一个工作组于 2026 年 6 月发布,工作组成员包括 Google、Microsoft、Hugging Face、AWS、Cisco、GitHub、Nvidia、Salesforce 和 Snowflake。
智能体资源是 AI 客户端为完成任务而调用的任何对象:MCP 服务、A2A Agent、技能、API、工作流。
ARD 回答一个问题:“这项任务有哪些可用资源?”,然后便不再干预。它不是运行时,也不会取代 MCP 或 A2A。它告知 Agent 有哪些资源;Agent 则通过资源自身的协议进行连接。
它解决的问题
如今,Agent 只能使用有人提前为其安装的能力。每个工具都必须手动接入,每个工具描述都必须占用上下文窗口空间,与实际工作争夺空间。这种模式无法适应拥有数千种工具、甚至数百万种工具的生态系统。
ARD 将选择问题从上下文窗口转移到搜索服务中,这与早期网络从精选链接目录转向搜索引擎时发生的转变相同。
要实现这一点,必须具备两个角色。发布方在自己的域名下一个众所周知的位置描述所提供的内容。注册表则为这些描述建立索引并响应查询。Neuronto 兼具这两种角色。
为什么采用联邦索引
该规范定义了三种联邦模式,并将 auto 设为默认模式:注册表查询其对等方,合并结果后返回一个结果集。
但实际上,每个公开注册表只会根据自己的目录作答,因此在四个地方提出同一个问题会得到四种不同的答案,客户端还必须选择一个。Neuronto 正是为了解决这个问题而存在。
只需向 Neuronto 查询一次,查询便会同时发送到所有公开 ARD 注册表。结果通过互惠排名融合进行整合:它合并的是排序,而不是分数。这是必要的,因为每个注册表采用的校准方式各不相同;引入其他服务的评分,也会一并引入其偏差。
响应会指出哪些注册表已作答、哪些请求超时,因此调用方始终可以了解答案涵盖了联邦中的多少内容。
它有哪些不同之处
默认采用联邦模式。 按规范实现 federation: auto:在严格的时间预算内并发发送查询、融合排名,并逐个报告上游服务。对等方响应缓慢只会消耗时间预算,不会造成其他影响。
完全符合规范。 作为注册表和发布方通过规范的官方一致性测试工具,零错误、零警告,其中包括可选的 GET /agents 列表接口,该接口会返回正确分页的对象。
类型标准化。 当前有三种用于 MCP 服务的媒体类型(application/mcp-server、application/mcp-server+json、application/mcp-server-card+json),并有两个 URN 前缀作为发现标识符(urn:air: 和 urn:ai:)。由于筛选条件要求精确匹配,条目会被静默丢弃。Neuronto 会在接收时对两者进行标准化,因此,无论发布方如何拼写类型,MCP 服务筛选器都能返回这些服务。
经验证的工具索引,而不只是服务索引。 其他所有注册表都只存储服务名称和发布者编写的说明文字。Neuronto 会与每个已编入索引的 MCP 端点握手并读取其 tools/list,因此索引中存放的是实际工具名称和输入架构,也就是 Agent 实际需要匹配的内容。目前共有 2,223 个服务上的 32,183 个已验证工具,另有 1,918 个记录为需要凭据的端点,其他注册表都不会报告这些信息。内省是只读的:绝不会调用工具。
混合检索。 使用稀疏 BM25 和稠密向量,并通过与联邦检索相同的倒数排名融合进行合并,因此一次查询即可执行词法、语义和联邦检索,并返回统一排序结果。稠密检索环节包含在联邦检索预算内;如果不可用,则不会产生任何结果,因此不会拖慢词法快速路径。
经验证的可用性。 对已编入索引的端点进行探测,并在排名中降低无响应端点的优先级。基于自发布清单构建的注册表很快就会积累失效链接;提供这些链接,是让索引最快失去信任的方式。条目会被降级而非删除,因为服务可能会恢复。
根据证据生成清单,而非填写表单。 大多数域名永远不会手动编写清单。它们已经运行 MCP 服务、提供 OpenAPI 文档,或发布了 llms.txt,而清单只是重述爬虫已经能找到的内容。Neuronto 会探测域名,只为确实有响应的每项资源生成条目,记录证明依据,并托管结果。不会进行任何推断,因为猜测生成的清单会在他人的域名上做出对方从未提出、也无法辩护的声明。
索引中的私有部分。 组织内部 Agent 可以调用的内部服务列表,通常放在系统提示词中,既无法搜索,也无人审计。通过 DNS 证明所有权的域名可以注册这些服务,之后一次查询即可同时返回内部和公开结果,并分别标明其类型。私有条目存储在与公开索引分离的存储中,而不是由某个标志控制,因此从设计上就无法通过任何公开搜索、计数或页面访问它们。
调用前了解付款条款。 过去,用户会先找到并调用付费端点,然后才收到 402 Payment Required 响应。Neuronto 会从两个地方读取资源的费用信息,并将其分别保存:资源清单声明的内容(规范示例中的 pay: 条款、schema:offers,以及包含价格的目录格式),以及端点在未付款调用时返回的内容(PAYMENT-REQUIRED 标头或 402 响应正文中的 x402 条款,或 MPP 挑战)。要求付费的服务会被记录为可访问,而不是故障。结果包含 pay:protocol、pay:price、pay:currency 和 pay:network,并通过 paymentEvidence 说明是否有实时 402 响应予以确认;搜索也可以按这些字段筛选:
curl -sS -X POST https://neuronto.com/search -H 'content-type: application/json' \
-d '{"query":{"text":"crypto token prices","filter":{"pay:protocol":["x402"],"maxPricePerCall":0.01}},"federation":"none"}'
为高开销调用付费。 可自托管的 Neuronto 不收取任何费用。在 neuronto.com 上,为调用者执行外部操作的调用——联邦搜索、审计或清单构建——在额度内免费。超出额度后,429 响应会在 PAYMENT-REQUIRED 标头中附带 x402 价格;付费的 Agent 无需等待即可获得调用结果;发送 x-payment-protocol: x402 的客户端则会直接收到 402 响应。只有成功的调用才会结算。提交资源、认领域名、收录和结果排名都不收费。GET https://neuronto.com/x402 会说明当前生效的条款。
条款绝不会影响评分,注册表也绝不会处理付款:调用者直接向服务提供方付款。 如果你也希望我们代为结算款项。 读取价格只是问题的一半;收款是另一半。Neuronto 还运营着托管式 x402 facilitator,地址为 pay.neuronto.com,任何 x402 服务都可以通过一行配置指向它:它会检查买家签名的稳定币付款,并在链上完成结算;它绝不会持有任何人的资金,因为转账由买家签名,facilitator 只负责广播。目前在 Base 上运行,新服务上线期间免费。一个在线端点会收取十分之一美分,并在同一请求中原路返还,因此客户端可以免费端到端运行;pay.neuronto.com/status 发布的是实际观察到的行为,而非对其行为的承诺。
这是一个独立的托管服务:它不属于本仓库,本仓库中的任何内容都不依赖它,可自托管的 Neuronto 绝不会与它联系,也不会因为使用或不使用它而对任何资源进行不同排名。
拉开差距的排名。 只有当第一条和第五条结果之间的差距清晰可见时,相关性评分才有用。评分经过缩放,以保留实际差异,而不是把所有结果压缩到狭窄的区间内。
适用场景
- Agent 构建者,停止硬编码集成。在运行时请求所需能力,并连接当前最适合提供该能力的服务。
- API 和工具供应商,在自己的域名上发布一份清单,让所有 ARD 客户端都能发现你,无需申请加入经过筛选的市场。
- 平台团队,通过内部服务进行发现,让组织内的 Agent 以查找公共服务的相同方式找到它们。
使用方法
通过一次调用搜索此索引和整个联邦:
curl -s https://neuronto.com/search \
-H 'content-type: application/json' \
-d '{"query":{"text":"scrape a website behind cloudflare"},"federation":"auto"}'
也可以将其安装为 MCP 服务,让 Agent 通过它已经使用的接口进行搜索:
claude mcp add --transport http neuronto https://neuronto.com/mcp
注册表 API
| 端点 | 用途 |
|---|---|
POST /search | 排序后的结果。federation:auto(默认)、referrals、none。 |
POST /explore | 索引的分类计数。 |
GET /agents | 确定性分页列表,用于浏览而非排序。 |
POST /mcp | 以 MCP 工具的形式提供搜索、工具搜索、索引统计和发布功能。GET 和 DELETE 返回 405:没有由服务端发起的流,每个工具都会在发起请求的请求中返回结果。 |
POST /a2a | 通过 A2A 访问同一索引。message/send 返回一条 Message。Card 位于 /.well-known/agent-card.json 和 /.well-known/agent.json。 |
POST /tools、GET /tools?q= | 针对已验证工具而非服务进行工具级搜索。 |
POST /submit | 为 MCP 端点或发布清单的域名建立索引。200 表示已建立索引,202 表示已保留并将重试。 |
GET /submit/status/{id} | 查看提交的处理状态,以及其端点最后一次给出的响应。 |
POST /audit | 发布报告:发现情况、规范符合性、覆盖范围、竞争情况。 |
POST /manifest/build | 根据从域名获取的资源,为该域名生成清单。 |
GET /m/{host}.json | 托管的该生成清单。 |
GET /agents.md | 说明如何调用以及如何使用,供已到达此处的 Agent 阅读。 |
POST /claim、POST /claim/verify | 通过 DNS TXT 证明域名所有权,并获取密钥。GET /claim 说明具体步骤。 |
POST /private/entries | 注册内部服务。需要密钥。 |
GET /bench、GET /adoption | 检索效果测量,以及发布清单的对象。 |
GET /.well-known/ard.json | 我们自己的发布者清单。 |
GET /openapi.json | 上述所有接口的 OpenAPI 3.1 规范。 |
GET /.well-known/api-catalog | 上述说明的 RFC 9727 目录。 |
每个 GET 路由也会以相同的标头、无正文的形式响应 HEAD。
判断答案何时不够可靠
每个排名靠前的结果得分都接近 100。这是有意为之:分数是相对于同一结果集中的最佳命中计算的,因为 BM25 的数值大小取决于语料库和查询,因此绝对分数毫无意义。它能很好地排序,但单独来看会造成误导。查询
zzzz nonexistent capability qqqq 的得分是 100,因为总会有某个结果排在第一位。
因此,每个搜索响应都会在相对分数旁附带一个绝对数值:
"queryMatch": {
"coverage": 0.0,
"confidence": "none",
"matchedTerms": [],
"queryTerms": ["zzzz", "nonexistent", "capability", "qqqq"],
"note": "each result's `score` is relative to the best hit in this response ..."
}
coverage 表示查询中的实词有多少比例能在首个结果本身的文本中找到依据。它不受语料库影响,这是分数无法做到的属性,因此能区分“多个好答案中最好的一个”和“什么都没有时最好的一个”。
它衡量的是重叠程度,而非正确性。 如果某条目包含查询中的所有词,却做的是相反的事情,得分仍为 1.0。应将其视为置信度下限,而非判定结果;它也绝不是信任度或安全评级。
读取公共索引不需要密钥,也不需要注册。密钥仅用于接纳经过验证域名的私有条目,并且只有在通过 DNS 证明所有权后才会签发。
相关性分数仅表示语义相关性,绝不代表信任度、合规性或安全评级。规范明确规定,信任评估与发现过程相互独立。
搜索工具,而非服务
当你已经知道所需调用的形式时,托管该调用的服务只是实现细节:
curl -s 'https://neuronto.com/tools?q=extract+text+from+a+pdf&limit=5'
返回的每个工具都从其所属服务自己的 tools/list 中读取。同一搜索也可作为 MCP 工具 find_tool 提供给 Agent 使用,此外还有 find_resource、
registry_stats 和 publish_resource。只有 publish_resource 会写入数据,并且只有它声明了 readOnlyHint: false,因此客户端只查看工具列表就能判断哪个调用会产生效果。
衡量这一切是否有效
GET /bench 发布 ARD-Bench,这是针对公共 ARD 注册表的正面对比检索测量;GET /bench.json 则以纯 JSON 格式提供同一次运行结果及其生成时间。测试框架位于 app/bench.py,每周刷新。
任务集是一个文件,并且已冻结。 bench/declared-v1.json
(也通过 /bench/tasks.json 提供)包含 192 个任务,每个发布者一个。每条查询都逐字摘自发布者自己域名上的清单,任务还记录了该清单的 URL 和来源正文的 sha256,因此任何人都可以核实查询确实出自发布者,而非我们之手。该文件包含对任务集的摘要,且不会原地修改;新增任务集会成为新版本。任务按发布者划分为 tune 和 holdout 两部分:前者是唯一可用于选择任何排序参数的部分,基准报告则依据后者。
响应会区分两个容易混淆的指标:coverage 表示注册表是否索引了目标,recall@k_when_carried 表示注册表持有目标时是否能将其检索出来。我们的 coverage 按定义为 1.0,因为任务来自此索引中的资源,响应内容也说明了这一点。
排序权重经过测量,而非凭空断言, app/rank.py 中的每个权重旁边都列出了用于确定它的数据表。scripts/evalgate.py 每天都会对照固定基线(bench/baseline.json)运行:检查 holdout 的 recall@10 和 MRR、检查一组常规能力请求(scripts/battery.py,每个用例都不得退步),并确保联邦搜索的得分始终不低于本地搜索。任何下降都会导致门禁失败。
联邦搜索增加覆盖率,而不重新排序。 在 federation: auto 模式下,仅当此索引无法给出有把握的答案时才会查询其他注册表;它们返回的结果可以补充此索引中缺少的资源,但不会改变此索引已找到结果的顺序。在 holdout 上,auto 和 none 的 recall@10 均为 0.934;auto 的 MRR 更高,中位耗时为 177 ms,而 none 为 121 ms。
查询会发生什么
每个搜索响应都会携带 queryHandling 和 Neuronto-Query-Handling 标头,说明查询文本是否被保留、为生成此答案发送到了哪些注册表,以及是否进行了嵌入。"federation": "none" 表示查询不会离开服务。使用 API 密钥进行的搜索,或携带 Sec-GPC: 1 或 DNT: 1 的搜索会被计数,但其文本不会被保留;搜索记录会在 90 天后删除。完整声明请见 /privacy。
谁在发布 ARD 清单
GET /adoption 跟踪规范本身的采用情况:一份列出具名组织的观察名单,以及爬虫所见所有主机的清单发布率。截至撰写本文时,观察名单上的 20 家组织中有 3 家发布了清单:Hugging Face、Vercel 和 Zapier。这三家都在 /.well-known/ai-catalog.json 路径下提供清单,该路径已在 v0.91 中更名。在爬虫发现的 178 家发布者中,157 家提供旧版 ai-catalog.json,只有 14 家提供 ard.json,因此跟踪器会检查这两个路径:衡量路径而非实际做法,会得出错误答案。
开放数据集
经过验证的工具语料库以开放数据集形式发布,采用 CC BY 4.0 许可: huggingface.co/datasets/AgenticResourceDiscovery/verified-mcp-tools
tools.jsonl 包含全部 31,411 个经过验证的工具及其输入架构;servers.jsonl 包含 7,708 条内省结果,包括身份验证要求和失败类型。发布这个数据集,是因为工具检索研究(ToolRet,ACL Findings 2025)一直基于汇编语料库而非实时生态进行基准测试,而这里提供的正是实时生态。
徽章
如果你的 MCP 服务已被收录在索引中,徽章会说明我们验证过的内容:你的服务在 tools/list 中返回了多少个工具,以及端点是否有响应。
[](https://neuronto.com/ard-publishers/your.publisher.id)
发布者 ID 是 URN 中的发布者部分,或你的域名。徽章仅说明观察到的情况,绝非信任、安全性或质量评级。还未被收录?发布清单,爬虫就会找到你;或者运行控制台审计。
发布你自己的资源
有四种接入方式,所需投入依次增加。它们都不需要加入允许列表,也不需要注册。
你已经在运行 MCP 服务。 提交端点。Neuronto 会完成 initialize 握手,并读取该服务自己的 tools/list。这比清单中的声明更有力,因为服务是自行作出响应的。
curl -X POST https://neuronto.com/submit \
-H 'content-type: application/json' \
-d '{"endpoint":"https://example.com/mcp"}'
你正在 Agent 中工作。 这与 MCP 工具相同,因此无需离开对话,就能在对话中列出资源。
{"method":"tools/call","params":{"name":"publish_resource",
"arguments":{"endpoint":"https://example.com/mcp"}}}
它会像 HTTP 路由那样进行验证,而非盲目信任;并且会调用该路由,而不是重新实现一遍,因此两者不会出现偏差。
提交绝不会丢失。 如果端点当时因任何原因未能通过验证,响应会是 202,并包含 "status": "pending"、提交 ID 和 evidence:实际返回内容的 HTTP 状态码、内容类型和开头字节,或端点发送的 JSON-RPC 错误。注册表会保留该提交,并按固定计划重试(1 min、5 min、15 min、1 h、4 h、12 h、24 h、24 h),直到验证通过或重试次数用尽;GET /submit/status/{id} 会显示当前进度。如果拒绝是由注册表本身造成的,例如索引正忙,则不会消耗重试次数。因此,即使服务当时正在部署、DNS 记录尚未传播,或客户端在调用一次后就放弃,最终也会被编入索引,无需任何人再次提交。队列数量会在 /metrics.json 的 submissions 下公开统计。
索引繁忙时,其他写入端点会如实响应。 POST /claim/verify、POST /private/add 和 POST /private/delete 会返回 503、Retry-After 标头和 "status": "busy",而不是以未说明的方式失败;DNS 证明或请求不会丢失,请在指定秒数后重试。POST /manifest/build 仍会返回生成的清单,并在无法存储托管副本时附带说明,同时报告 "hosted_at": null。
你没有清单,也不想自己编写。 请求根据你的域名已公开的内容生成一份清单,然后复制它或添加其链接。
curl -X POST https://neuronto.com/manifest/build \
-H 'content-type: application/json' -d '{"domain":"example.com"}'
只有实际作出响应的资源才会成为条目,每个条目都会附带生成该条目的证据。托管副本 https://neuronto.com/m/example.com.json 会在自己的响应标头中说明,该文件是生成的,并非由域名所有者编写。
你有清单。 将其放在 /.well-known/ard.json,并提交域名,或等待爬虫抓取。
curl -X POST https://neuronto.com/submit \
-H 'content-type: application/json' -d '{"domain":"example.com"}'
也将其放在 /.well-known/ai-catalog.json。规范的 0.91 版重命名了该文件,但已部署的基础尚未迁移:在目前已验证的 ARD 发布者中,绝大多数仍只提供旧路径,因此只检查其中一个名称的使用方会错过大部分生态。
每个条目都要包含 representativeQueries。注册表会根据该字段中的词条构建语义索引;没有它的条目虽然是有效的目录条目,却永远不会出现在任何搜索结果中。
检查是否成功
curl -X POST https://neuronto.com/audit \
-H 'content-type: application/json' -d '{"domain":"example.com"}'
报告清单在四种发现路径上的可访问性、是否逐条符合规范、哪些注册表确实会返回你的资源,以及对于你希望被搜索到的查询,哪些资源取代了你出现在结果中,并说明这些条目具备哪些你可能没有的内容。免费,无需注册。也提供浏览器版本:/console。
最后一步,无论你通过哪种方式接入:添加徽章。 注册表开始返回你的资源后,就把徽章放到 README 或网站上。它会说明观测结果、已验证的工具数量以及端点是否有响应;情况变化时,它会自动更新。徽章免费,且不会影响你的索引或排名。以上每个响应的末尾都有相同的句子和可直接粘贴的代码片段;徽章页面提供了各种格式。
私有条目
组织可以注册自有 Agent 可调用的内部服务,并在一次查询中搜索公共资源和内部资源。
# 1. ask for the proof record, publish it as a TXT record at your apex
curl -X POST https://neuronto.com/claim \
-H 'content-type: application/json' -d '{"domain":"example.com"}'
# 2. verify, which returns an API key
curl -X POST https://neuronto.com/claim/verify \
-H 'content-type: application/json' -d '{"domain":"example.com"}'
# 3. register an internal service
curl -X POST https://neuronto.com/private/entries \
-H "authorization: Bearer $KEY" -H 'content-type: application/json' \
-d '{"entry":{"displayName":"Staff Directory","url":"https://internal/mcp",
"description":"Look up an employee record by name or badge number.",
"representativeQueries":["look up an employee record"]}}'
# 4. the same key on search admits them, alongside public results
curl -X POST https://neuronto.com/search \
-H "authorization: Bearer $KEY" -H 'content-type: application/json' \
-d '{"query":{"text":"look up an employee record"}}'
证明值根据域名生成,且永远不会改变,因此再次请求不会使已发布的记录失效。系统通过 DNS over HTTPS 读取该值,因此权威区域一旦提供该值,验证就会立即生效。只有验证才能签发密钥。
每条结果都会说明它来自公共索引还是你自己的条目。私有条目不会根据语料统计数据与公共条目进行排名,因为单个租户的索引规模太小,统计数据毫无意义;系统会根据条目自身文本覆盖查询内容的比例为其排序,因此无论索引规模大小,排序依据都相同。
规范
许可证
Apache-2.0
评论
一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。