Agent 能力发现
把 MCP Server 与 A2A Agent 作为控制面资源注册、缓存、鉴权与发现的完整实践。
Agent 能力发现不是把服务列表塞进提示词,而是把 MCP Server、Tool、A2A Agent 和 Skill 当作与服务、规则同级的控制面资源。这样发现能力时可以复用注册、缓存、权限和审计链路。
目标架构
- 平台在 Console / API 注册 MCP Server 或 A2A Agent Card。
- 数据进入 store,并由 CacheManager 增量刷新。
- Agent 运行时或 Pole Agent 通过 Registry / MCP 接口查询能力目录。
- 鉴权策略限制谁可以读哪些 Server、Tool 或 Agent。
- 变更可审计;目录具备稳定 revision / 版本语义。
注册 MCP Server
在 Console 的 MCP Registry:
- 选择正确的 Namespace(运行环境)。
- 创建 MCP Server,填写名称、协议与业务元数据。
- 维护 Tool 列表与后端绑定。
- 确认缓存已刷新,列表查询可见。
- 给调用方主体授予最小读权限。
控制面 HTTP 装配会打开 MCP 缓存,并暴露 SSE 入口(实现路径以 /ai/mcp/v1/sse 为基线)。Pole Agent 只允许调用白名单工具,例如:
list_namespaceslist_mcp_serverslist_mcp_server_toolsget_config_filesearch_config_files
未在白名单中的工具不会被 Agent 使用。
注册 A2A Agent
A2A Registry 当前只承担:
- Agent Card
- 技能(Skill)
- 协议接口
- 能力元数据
不承担任务代理、会话编排或 Agent Runtime。实践中把它当作“可发现的能力名片”,而不是执行引擎。
操作建议:
- 先定义 Agent 对外技能边界。
- 在 Registry 登记 Card 与 skills。
- 与后端服务、MCP Server 的关系写清楚,避免双份目录。
- 权限上区分“登记者”和“发现者”。
Pole Agent 使用边界
Pole Agent 是 Console 的一等对话入口,适合:
- 查询 Namespace、MCP、配置等只读问题
- 生成配置修改提案并预览差异
- 在人工确认后保存草稿
不适合也不被允许:
- 自动发布配置或治理规则
- 直接删除生产资源
- 绕过鉴权访问未授权资源
配置写路径:读取 → 提案 → 预览 → 哈希/并发检查 → 用户确认 → 仅保存草稿 → 用户在配置中心发布。
实际配置是什么
社区 e2e 载荷(pole-control-plane/test/e2e/internal/e2e/fixtures.go):
MCP Server
{
"name": "demo-mcp",
"namespace": "default",
"protocol": "MCP_PROTOCOL_SSE",
"backend_type": "service",
"backend_service": { "namespace": "default", "name": "gateway" },
"tools": [{
"name": "orders.query",
"description": "query orders",
"input_schema": {
"type": "object",
"properties": { "id": { "type": "string" } }
}
}]
}A2A Agent(Registry 名片,不执行任务)
{
"name": "demo-a2a",
"namespace": "default",
"source_type": "custom",
"backend": { "type": "service", "namespace": "default", "service": "gateway" },
"agent_card": {
"name": "demo-a2a",
"description": "demo card",
"version": "1.0.0",
"url": "http://127.0.0.1/a2a",
"skills": [{ "id": "order-query", "name": "Order Query", "description": "query orders" }]
},
"skills": [{ "id": "order-query", "name": "Order Query", "description": "query orders" }]
}主要 API:/ai/mcp/v1/servers、/ai/a2a/v1/agents、/ai/a2a/v1/agents/{id}/card、/ai/mcp/v1/server/tools。SSE 基线:/ai/mcp/v1/sse。
社区 Demo
| 入口 | 说明 |
|---|---|
| e2e | pole-control-plane/test/e2e/console_api:MCP/A2A CRUD + card/skills |
| Agent 烟测 | console/web/scripts/smoke-agent-workbench.mjs:提案→确认只改草稿 |
| 授权契约 | console/web/scripts/verify-ai-resource-authorization.mjs |
| Console | MCP、A2A、Pole Agent |
# 控制面仓库
CGO_ENABLED=0 go test -tags=e2e ./test/e2e/console_api/... -count=1 -run MCP
POLE_BASE_URL=http://127.0.0.1:8080 node console/web/scripts/smoke-agent-workbench.mjs怎么触发验证
# 登录后(Authorization)
curl -sS -X POST "$BASE/ai/mcp/v1/servers" -H 'Content-Type: application/json' \
-H "Authorization: $TOKEN" \
-d @mcp-server.json | jq '{code,info}'
curl -sS "$BASE/ai/mcp/v1/servers?namespace=default&offset=0&limit=20" \
-H "Authorization: $TOKEN" \
| jq '.data[]? | {name,namespace,protocol}'
curl -sS -X POST "$BASE/ai/a2a/v1/agents" -H 'Content-Type: application/json' \
-H "Authorization: $TOKEN" \
-d @a2a-agent.json | jq '{code,info}'Console:/ai/mcps、/ai/a2a 新建 → 详情核对 tools / skills / card。
Pole Agent:对话改配置 → 确认后到配置中心看草稿,active release 不应自动变化。
效果是什么
| 步骤 | 预期效果 |
|---|---|
| 创建 MCP | 列表出现 Server;/server/tools 能列出 orders.query |
| 创建 A2A | 列表出现 Agent;/agents/{id}/card 返回 skills |
| 鉴权收紧 | 无权限主体读目录失败(资源类型 MCPServerResources / A2AAgentResources) |
| Agent 确认写配置 | 仅保存草稿;须人工在配置中心发布才对客户端可见 |
| 删除资源 | 目录与缓存不再返回该 Server/Agent |
与服务治理对齐
| 实践 | 原因 |
|---|---|
| MCP/A2A 进入统一 API / store / cache | 避免第二套目录漂移 |
| 发现请求走鉴权 | Agent 也是主体,不是超级用户 |
| 目录带 revision | 客户端可判断是否需要刷新 |
| 与 Service 绑定清晰 | Tool/Agent 最终仍落到可治理的后端 |
检查清单
- MCP/A2A 资源落在正确 Namespace
- Tool / Skill 描述足够让调用方理解边界
- 缓存与 Console 列表一致
- 读权限已收敛
- Pole Agent 白名单与 LLM 配置按需启用
- 文档与演示未声称 A2A 可执行任务编排