
不写一行 LLM 调用让 Agent 确定性地发现并调用注册中心里的 MCP 工具从一个场景说起假设你在写一个 AI Agent它要查一下杭州的天气。天气服务不是你写的它注册在公司的 Nacos 集群里是一个标准的 MCP Server。要完成这个任务Agent 得做一串动作发现服务、确认版本、拿到工具列表和参数 schema、发起调用、处理失败、留审计记录。常见的做法是让大模型自己去摸索。实测下来这种方式每轮要消耗上万个 input token而且结果不稳定——如果注册表里的描述写着天气、后端实际只有时间工具模型还可能直接编一个气温出来。OpenClaw.NET 的做法是把这串动作做成一条确定性管线全程不调用 LLM。本文介绍这套基于 Nacos 3.2.4 AI 注册中心和 MCP 协议的集成怎么用、背后是什么结构。一、Nacos AI 管理中心管什么Nacos 3.x 把 AI 资源提升为与配置管理、服务发现并列的核心能力叫 AI Registry。它管的是Skill、Agent、MCP Server、Prompt、AgentSpec 这些东西怎么注册进平台、怎么治理、怎么按版本发布、怎么被运行时发现。先建立一个认知很多集成问题都出在这里AI 资源不是配置也不是普通服务。配置管理关心内容的发布和监听服务发现关心实例健康。MCP Server 的治理重点是另外一些东西协议类型、端点、版本以及工具开关toolSpec.ToolsMeta——管理员可以在 Nacos 控制台直接关掉某个 MCP Server 的某个工具运行时必须遵守。OpenClaw.NET 走的是 Nacos MCP Router 模式由 Router 统一发现注册表中的 MCP Server对外提供 search / add / use 三个工具。二、架构三层各管一摊职责划分是这样的Registry 决定存在什么、谁可见Router 决定如何被发现和连接OpenClaw Runtime 决定何时、以何身份、经何审批执行。┌──────────────────────────────────────────────┐ │ Nacos 3.2.4 · AI 管理中心 │ │ MCP 元数据 / 工具开关 / 端点 / 版本 │ └────────────────┬─────────────────────────────┘ │ RedNb.Nacos.Ai分页 blur 检索 ┌────────────────▼─────────────────────────────┐ │ NacosMcpRouter.NET global tool │ │ search → add → use 三工具 · ONNX 本地向量检索 │ └────────────────┬─────────────────────────────┘ │ MCP 协议 ┌────────────────▼─────────────────────────────┐ │ OpenClaw.Adapters.Nacos OpenClaw.Adapters│ │ provider发现/绑定/ .Nacos.Events │ │ 失败规范化 失效事件 │ ├──────────────────────────────────────────────┤ │ OpenClaw.Core 契约 OpenClaw.Agent 策略引擎 │ │ 确定性排序 / 有界缓存 / 熔断 / 审计回放 │ ├──────────────────────────────────────────────┤ │ meta-skill DAGtool_call 步骤 capability_ref │ └──────────────────────────────────────────────┘层组件职责注册中心Nacos 3.2.4 AI 管理中心托管 MCP Server 元数据、版本、端点、工具开关发现路由NacosMcpRoutersearch搜索 Server→ add安装连接→ use调用工具运行时OpenClaw.NET能力解析、策略审批、缓存熔断、审计全程零 LLM 调用三、上手Agent 侧只需要几行声明接入的复杂工作都在 adapter 和运行时里。对 Agent 开发者来说只需要在 skill 文件里声明一个能力引用- id: weather kind: tool_call capability_ref: provider: nacos binding: dynamic intent: task_description: 查询杭州今天天气 keywords: [天气, 杭州] tool_args: city: 杭州几个字段的含义provider: nacos这个能力从 Nacos 注册中心解析不是本地静态绑定binding: dynamic动态绑定运行时按需搜索、选择最合适的 MCP Server 和工具intent给 Router 的检索意图。Router 内部用 ONNX 做本地向量检索不依赖外部 LLM。解析和调用由AgentRuntime/MafAgentRuntime的同一条 capability 路径完成没有 LLM 发现调用。你写的是意图找哪个 Server、调哪个工具、参数怎么填由管线完成。四、使用时会碰到的四个机制使用侧很轻但了解这几个机制对配置和排障有帮助。4.1 协议防腐层Router 的工具返回不是结构化 JSON而是自然语言包裹 JSON 的散文信封比如 search 的返回## 获取查询天气的步骤如下: ### 1. 当前可用的mcp server列表为:{weather-mcp:{...}} ### 2. 从当前可用的mcp server列表中选择你需要的mcp server调add_mcp_server工具安装mcp serverOpenClaw.NET 把对这些中文字面量 marker 的解析收敛到一个独立的契约文件并有测试钉住。上游协议变化的影响被限制在这一个点业务代码不用动。同一套 adapter 同时兼容 Python 版和 .NET 版 Router。实际影响升级 Router 或 Nacos 版本时只需要看 adapter 的兼容性说明。4.2 缓存与世代动态解析结果会缓存TTL 300 秒、容量 1024、FIFO 驱逐缓存键里编入了世代generationkey {provider.Id}:{generation}:{binding}:{intentKey}Nacos 侧配置一变世代 1旧键直接失效旧世代的在途解析晚到了也写不进新缓存。如果填充完成后发现世代变了返回capability_stale_binding让调用方重试不会静默使用旧绑定。4.3 熔断同一目标安全域 provider 世代 Server 工具连续失败 3 次熔断 30 秒成功一次立即复位被策略阻止Blocked的失败不计入。熔断器容量满时冷却中的熔断器不会被驱逐只淘汰尚未熔断的条目。4.4 失效事件Nacos 配置变更的监听链路Nacos 长轮询 → 内容 SHA-256 → 与上次哈希比对 → 不同则发布 CapabilityChange → 缓存全量清空几点说明SHA-256 去重防止 SDK 把初始快照当变更重复投递只保留 digest失效通道不传输、不落地配置正文用保守的全量失效正确性优先于缓存命中率。五、安全模型句柄不等于授权这套集成里有一条原则贯穿始终A tool handle, never permission to execute. 能力句柄只是句柄授权在每次执行时重新检查。具体体现整个能力解析与执行被包装成名为resolve_capability的工具先经过 OpenClawToolExecutor 的治理链审批、hooks、审计、工具策略再执行目标工具userId / sessionId 随 MCP 请求的Meta字段传给 Router审计链路完整缓存命中后会复检如果当前 skill 策略已不允许某工具动态绑定丢弃缓存重新解析静态绑定保持 pin、在执行阶段拒绝注册表元数据不等于真实能力。即使注册中心的描述和后端实际能力不符Gateway 的本地策略与授权依然生效。六、上手 Checklist按这个顺序把环境跑起来准备 Nacos 3.2.4在 AI 管理中心注册你的 MCP Server元数据、端点、版本、工具开关安装 Router.NET global tool不需要 Python 环境dotnet tool install --global NacosMcpRouter注意Router 的 Console API client 默认连127.0.0.1:8080且不可覆盖本地验证时把 Nacos Console 端口固定为 8080在 skill 文件中声明capability_ref见第三节按需选择binding: dynamic动态发现或静态绑定固定目标运行 Agent观察治理链日志能力解析、策略审批、工具调用、审计记录应一一对应全程无 LLM 发现调用验证治理行为在 Nacos 控制台关闭某个工具确认运行时在数秒内完成失效并拒绝后续调用。结语Nacos 3.2.4 的 AI Registry 解决有什么、谁可见OpenClaw.NET 运行时解决能不能安全地用。对使用者来说这套集成的收益很直接几行 YAML 声明意图换来确定性的发现、调用和治理——成本可预测行为可审计失败有明确的降级路径。本文基于https://github.com/clawdotnet/openclaw.netmain2026-09-27整理涉及组件OpenClaw.Adapters.Nacos(.Events)、CapabilitySlotExecutor、CapabilityBindingCache、NacosMcpRouter。