多智能体工具调用监控与高级行为分析平台(AgentTrace)——完整产品技术方案

2026/07/07 dev AgentTrace · 可观测性 · MCP · OpenClaw · 工具监控 · 行为分析 · OTel · 安全审计 26438 字 · 约 76 分钟 阅读 ...
AgentTrace 是面向 OpenClaw、Hermes、Claude Code、Codex 等智能体运行时的工具调用监控、审计、策略控制和高级行为分析平台。涵盖 Agent Hook Adapter、MCP Proxy/Sidecar、统一事件模型、策略引擎、行为分析、OTel 输出等完整架构设计。

多智能体工具调用监控与高级行为分析平台

产品技术方案

1. 方案摘要

随着 OpenClaw 接入的 MCP Server 数量和调用频率增长,当前最大问题不是“有没有 MCP 配置”,而是“运行时到底谁调用了哪个 MCP 工具、参数是什么、耗时多久、是否失败、失败发生在 Agent 层还是 MCP 协议层”。现有调研已经确认:OpenClaw 中本地工具可以被 weclawtrace 记录,但 fetch__fetchfetch__prompts_list 等 MCP 工具未出现在 daemon 策略日志中,说明 MCP 工具调用在现有可观测链路里存在真实盲区。

最终方案不是单纯写一个 OpenClaw 插件,而是建设一个 Agent Tool Observability & Behavior Analysis Layer

Agent 原生 Hook Adapter
        +
MCP 协议代理 / Sidecar
        +
统一事件模型 / 策略引擎 / 行为分析
        +
OTel / JSONL / DB / Dashboard / Alert

其中:

  • OpenClaw 内部:以 before_tool_call + after_tool_call Plugin Hook 作为主采集点。
  • MCP 工具兜底:引入 MCP Proxy / Sidecar,采集 tools/listtools/call、JSON-RPC 错误、transport、server 健康等协议层数据。
  • 跨 Agent 兼容:通过 Adapter 把 OpenClaw、Claude Code、Codex、Hermes 的不同 Hook 事件归一化为统一事件。
  • 高级行为分析:基于统一事件做链路追踪、风险评分、慢调用分析、失败聚合、权限越权检测、数据外传识别、异常工具序列检测。

2. 背景与问题定义

2.1 当前问题

OpenClaw 当前 MCP 调用存在以下运维痛点:

问题表现影响
调用链路不透明只能知道配置了哪些 MCP Server,不能稳定看到运行时调用失败时无法定位是 Agent、MCP Client、transport 还是 Server 问题
缺少性能基线无每次 MCP 工具耗时、P95、P99无法识别慢调用和性能退化
错误信息分散MCP Server 错误主要散落在日志里难以检索、聚合、告警
调用统计缺失无法回答“哪个 MCP Server 最常用”“哪个 Tool 最容易失败”无法做容量规划和治理
策略审计盲区部分 MCP 调用绕过现有 daemon 策略日志安全审计不完整
依赖健康不可见MCP Server backoff、冷却、连接失败缺少结构化记录排障成本高

调研文档中也明确列出了 OpenClaw MCP 的可观测性盲区,包括调用链路不透明、无性能基线、错误信息分散、无调用统计、backoff 原因难排查等问题。

2.2 根因分析

OpenClaw 内建工具和 MCP 工具在 Hook 与诊断事件路径上不完全一致。

调研结论显示:内建工具走 wrapToolWithBeforeToolCallHook 预包裹路径,会发射 tool.execution.* 诊断事件;MCP 工具走 toToolDefinitions inline fallback 路径,虽然同样触发 before_tool_call / after_tool_call Plugin Hook,但不发射 tool.execution.* 诊断事件。

因此,依赖 tool.execution.started/completed/error 诊断事件或开箱 OTel 的方案,会漏掉 MCP 工具调用;正确的 OpenClaw MCP 监控入口应是 Plugin Hook,尤其是 before_tool_call + after_tool_call

3. 产品定位

3.1 产品名称

建议内部产品名:

AgentTrace / ToolTrace / MCPTrace

本文以下统一称为 AgentTrace

3.2 一句话定位

AgentTrace 是面向 OpenClaw、Hermes、Claude Code、Codex 等智能体运行时的工具调用监控、审计、策略控制和高级行为分析平台。

3.3 用户角色

角色诉求
Agent 平台研发快速定位工具调用失败、Hook 缺失、协议错误
SRE / 运维监控 MCP Server 健康、慢调用、失败率、容量趋势
安全团队审计高危工具调用、敏感路径访问、数据外传行为
业务方 / 插件开发者了解工具使用情况、失败原因、参数质量
平台负责人统一治理多 Agent、多 MCP、多工具生态

4. 建设目标与非目标

4.1 建设目标

目标说明
覆盖 OpenClaw MCP 调用盲区对 MCP 工具调用做到开始、完成、错误、耗时、参数摘要、结果摘要可见
统一内建工具、插件工具、MCP 工具形成统一工具调用事件模型
支持跨 Agent 扩展兼容 OpenClaw、Claude Code、Codex、Hermes 以及未来其他 Agent
支持 MCP 协议级观测记录 tools/listtools/call、transport、JSON-RPC 错误、server 健康
支持高级行为分析工具链路、异常序列、风险评分、越权检测、数据外传识别
支持策略控制允许、阻断、改参、审批、降级、告警
支持生产可观测性输出 JSONL、数据库、OpenTelemetry traces / metrics / logs
最小侵入上线OpenClaw 优先通过插件完成 P0;深度增强通过 proxy 与小范围源码增强完成

4.2 非目标

非目标说明
不替代 Agent 自身权限系统AgentTrace 是观测与策略层,不直接替代底层沙箱
不默认保存完整敏感内容默认保存摘要、hash、大小、脱敏结果
不保证拦截所有系统副作用Shell、浏览器、网络、文件系统等仍需系统层 sensor 补充
不绑定某一个 Agent 实现OpenClaw 是首个落点,不把核心模型写死在 OpenClaw Hook 上

5. 总体架构

5.1 架构总览

┌─────────────────────────────────────────────────────────────────────┐
│                           AgentTrace Platform                       │
│                                                                     │
│  ┌──────────────────────┐   ┌──────────────────────┐               │
│  │ Behavior Analysis     │   │ Policy Engine         │               │
│  │ - 风险评分             │   │ - allow / deny / ask  │               │
│  │ - 异常序列             │   │ - 改参 / 脱敏 / 告警   │               │
│  │ - 慢调用 / 失败聚合     │   │ - 审批策略             │               │
│  └──────────▲───────────┘   └──────────▲───────────┘               │
│             │                          │                           │
│  ┌──────────┴──────────────────────────┴───────────┐               │
│  │              Unified Event Normalizer             │               │
│  │  tool.call.* / mcp.rpc.* / llm.call.* / session.* │               │
│  └──────────▲──────────────────────────▲───────────┘               │
│             │                          │                           │
│  ┌──────────┴───────────┐   ┌──────────┴───────────┐               │
│  │ Agent Hook Adapters   │   │ MCP Proxy / Sidecar   │               │
│  │ OpenClaw / Claude     │   │ stdio / SSE / HTTP    │               │
│  │ Codex / Hermes / ...  │   │ JSON-RPC capture      │               │
│  └──────────▲───────────┘   └──────────▲───────────┘               │
│             │                          │                           │
│  ┌──────────┴──────────────────────────┴───────────┐               │
│  │ OpenClaw / Hermes / Claude Code / Codex / Others │               │
│  └──────────────────────────────────────────────────┘               │
│                                                                     │
│  Output: JSONL / PostgreSQL / ClickHouse / OTel / Grafana / Alerts  │
└─────────────────────────────────────────────────────────────────────┘

5.2 四层架构

第一层:Agent Hook Adapter

负责接入不同 Agent 的原生 Hook 系统。

Agent原生 Hook / 事件统一事件
OpenClawbefore_tool_calltool.call.started / tool.call.blocked
OpenClawafter_tool_calltool.call.completed / tool.call.error
Claude CodePreToolUsetool.call.started / tool.call.blocked
Claude CodePostToolUsetool.call.completed
Claude CodePostToolUseFailuretool.call.error
Claude CodePermissionRequesttool.call.approval_requested
CodexPreToolUsetool.call.started / tool.call.blocked
CodexPermissionRequesttool.call.approval_requested
CodexPostToolUsetool.call.completed / tool.call.error
Hermespre_tool_calltool.call.started
Hermespost_tool_calltool.call.completed / tool.call.error

Claude Code 官方文档说明,Hook 会在 Claude Code 生命周期特定点触发,工具调用相关事件包括 PreToolUsePostToolUse,且 MCP server tools 会像普通工具一样出现在 PreToolUsePostToolUsePostToolUseFailurePermissionRequestPermissionDenied 中,命名模式为 mcp__<server>__<tool>。(Claude)

Codex 官方文档说明,Codex Hooks 是把脚本注入 agentic loop 的扩展框架,PreToolUse 支持 Bash、apply_patch 和 MCP tool calls;PostToolUse 也覆盖 Bash、apply_patch 和 MCP tool calls,但文档同时提示它并不拦截所有 shell、WebSearch 或其他非 shell、非 MCP 工具路径。(OpenAI 开发者)

Hermes 官方文档显示,Hermes 会发现 MCP tools 和 plugin tools;工具执行流中包含 invoke_hook("pre_tool_call", ...)invoke_hook("post_tool_call", ...),插件侧也列出了 pre_tool_callpost_tool_call 生命周期 Hook。(Hermes Agent)

第二层:MCP Proxy / Sidecar

负责采集跨 Agent 的 MCP 协议层数据。

MCP 是开放协议,用于让 LLM 应用与外部数据源和工具集成;协议使用 JSON-RPC 2.0 消息在 Host、Client、Server 之间通信。(Model Context Protocol) MCP 工具协议中,tools/list 用于列出 server 的工具,tools/call 结果包含 contentstructuredContentisError 等字段;工具内部错误应通过 CallToolResult.isError=true 表达,而找不到工具或 server 不支持工具调用等异常条件才应作为 MCP error response。(Model Context Protocol)

MCP Proxy 采集内容:

initialize
tools/list
tools/call
resources/list
resources/read
prompts/list
prompts/get
JSON-RPC id
request / response size
transport: stdio / SSE / streamable-http
latency
protocol error
tool result isError
server stderr
connection timeout
request timeout
backoff / retry

第三层:统一事件模型与策略引擎

负责把不同 Agent、不同协议、不同工具来源转成统一结构。

核心事件:

agent.run.started
agent.run.ended

llm.call.started
llm.call.ended
llm.input.observed
llm.output.observed

tool.call.started
tool.call.approval_requested
tool.call.approval_decided
tool.call.blocked
tool.call.completed
tool.call.error
tool.result.persisted

mcp.rpc.request
mcp.rpc.response
mcp.rpc.error
mcp.server.health_changed

risk.finding.created
policy.decision.created

第四层:存储、查询、看板与告警

输出目标:

JSONL       本地审计、低成本落盘、故障兜底
PostgreSQL  结构化查询、配置、策略、审计
ClickHouse  大规模事件分析、聚合指标
OTel        traces / metrics / logs 对接现有可观测系统
Grafana     可视化大盘
Webhook     告警通知、审批流、工单系统

OpenTelemetry Protocol 官方说明,OTLP 用于在 telemetry source、collector、backend 之间传输 telemetry data,并覆盖 traces、metrics、logs 等信号;因此本方案把 OTel 作为生产可观测输出,而不是唯一存储。(OpenTelemetry)

6. OpenClaw 落地方案

6.1 OpenClaw 采集策略

OpenClaw P0 必须采用 Plugin Hook,而不是只订阅诊断事件。

原因如下:

  1. MCP 工具和内建工具都触发 before_tool_call / after_tool_call Plugin Hook。
  2. MCP 工具不发射 tool.execution.* 诊断事件。
  3. 依赖 OTel 开箱或诊断事件订阅无法完整覆盖 MCP。
  4. Plugin Hook 可以拿到工具名、参数、结果、耗时、会话、Agent、渠道、runId、toolCallId 等信息。

6.2 OpenClaw 插件职责

插件命名建议:

extensions/agenttrace-openclaw

职责:

模块职责
Hook Collector注册 before_tool_callafter_tool_callmodel_call_started/endedllm_input/output
MCP Detector识别 MCP 工具,解析 serverName、toolName、operation
Pending Call Store维护未完成调用,处理超时、缺失 after 事件
Redactor参数和结果脱敏、截断、hash
Event Emitter输出统一事件到本地队列
OTel Bridge手动创建 MCP tool span
Policy Client调用策略引擎,返回 allow / deny / ask / rewrite
Local JSONL Sink故障兜底落盘
Metrics Aggregator本地聚合 QPS、失败率、耗时分位数

6.3 MCP 工具识别

OpenClaw MCP 工具可通过三种方式识别:

方法说明
工具名模式serverName--toolName
PluginToolMetapluginId: "bundle-mcp",包含 serverName、toolName、operation
诊断身份分类toolSource: "mcp"toolOwner: "bundle-mcp"

调研文档中明确列出,MCP 工具名可使用 serverName--toolName 格式解析,也可以通过 PluginToolMeta 中的 pluginId: "bundle-mcp"mcp.serverName/toolName/operation 精确识别。

6.4 OpenClaw Hook 处理流程

before_tool_call
  │
  ├─ 解析 tool source
  ├─ 生成 / 获取 trace_id、span_id、tool_call_id
  ├─ 参数脱敏、hash、size 计算
  ├─ 写入 pendingCalls
  ├─ 输出 tool.call.started
  ├─ 调用策略引擎
  │     ├─ allow
  │     ├─ deny → return { block: true }
  │     ├─ ask  → return { requireApproval: ... }
  │     └─ rewrite → return { params: newParams }
  │
  └─ 返回 Hook 决策

after_tool_call
  │
  ├─ 根据 toolCallId 关联 pendingCalls
  ├─ 计算 durationMs
  ├─ 结果脱敏、hash、size 计算
  ├─ 判断 completed / error
  ├─ 输出 tool.call.completed 或 tool.call.error
  ├─ 结束 OTel span
  └─ 写入存储 / 指标 / 告警

6.5 Blocked / Missing After 处理

仅依赖 after_tool_call 会有盲区,因为被 before_tool_call 阻断、审批超时、进程异常退出时可能没有正常 after 事件。因此设计如下:

pendingCalls[toolCallId] = {
  status: "started",
  startedAt,
  timeoutAt,
  source,
  policyDecision
}

后台清理:

状态处理方式
正常 after输出 completed / error
本插件自己 block立即输出 blocked
requireApproval deny输出 approval_denied / blocked
超过 TTL 无 after输出 unknown / timeout / maybe_blocked
进程退出仍 pending启动恢复时输出 abandoned

如果要完整知道“是否被其他插件阻断”,仅插件层可能不够,需要在 OpenClaw Hook Runner 或 toToolDefinitions MCP fallback 路径增加统一 outcome 事件。这属于 P1 增强项。

6.6 OpenClaw OTel 增强

开箱 OTel 依赖诊断事件时会漏掉 MCP。因此 AgentTrace OpenClaw 插件需要在 Hook 中手动创建 MCP span。

Span 设计:

span.name = "agent.tool.call"
span.kind = INTERNAL

attributes:
  agent.runtime = "openclaw"
  agent.id
  session.id
  session.key
  run.id
  tool.call.id
  tool.name
  tool.source = "mcp"
  mcp.server.name
  mcp.tool.name
  mcp.operation
  tool.input.size_bytes
  tool.output.size_bytes
  tool.status
  tool.error.type
  tool.duration_ms

Metric 设计:

agent_tool_call_total{runtime, source, server, tool, status}
agent_tool_call_duration_ms_bucket{runtime, source, server, tool}
agent_tool_call_error_total{runtime, source, server, tool, error_type}
agent_tool_call_blocked_total{runtime, source, server, tool, policy}
mcp_server_backoff_total{server}
mcp_rpc_error_total{server, method, code}

调研文档也明确建议:生产级 OTel 监控需要结合方案 A,在 Plugin Hook 中手动创建 span;仅使用诊断事件或 OTel 开箱方案无法覆盖 MCP 工具。

7. MCP Proxy / Sidecar 方案

7.1 设计目的

Agent Hook 能看到“Agent 认为自己调用了什么工具”,但不一定能看到所有协议细节。例如:

MCP server 是否连接成功
tools/list 是否失败
JSON-RPC id 是多少
HTTP status 是多少
stdio stderr 输出是什么
server 是否返回 isError
transport 是否超时
是否进入 backoff

因此引入 MCP Proxy / Sidecar,作为跨 Agent 的最大公约数。

7.2 部署模式

HTTP / SSE / Streamable HTTP

Agent MCP Client
      │
      ▼
AgentTrace MCP Proxy
      │
      ▼
Real MCP Server

配置示例:

{
  "mcpServers": {
    "github": {
      "type": "streamable-http",
      "url": "http://agenttrace-proxy/mcp/github"
    }
  }
}

stdio

Agent
  │
  ├─ command: agenttrace-mcp-proxy --server filesystem --real "npx @modelcontextprotocol/server-filesystem"
  │
  ▼
Proxy Process
  │
  └─ Real MCP Server Process

配置示例:

{
  "mcpServers": {
    "filesystem": {
      "command": "agenttrace-mcp-proxy",
      "args": [
        "--server", "filesystem",
        "--real-command", "npx",
        "--real-args", "@modelcontextprotocol/server-filesystem,/workspace"
      ]
    }
  }
}

7.3 Proxy 采集事件

{
  "event_name": "mcp.rpc.request",
  "trace_id": "tr_abc",
  "span_id": "sp_rpc_1",
  "agent_runtime": "openclaw",
  "mcp_server": "github",
  "transport": "streamable-http",
  "jsonrpc_id": "42",
  "method": "tools/call",
  "request_size_bytes": 1240,
  "request_hash": "sha256:...",
  "started_at": "2026-07-07T12:00:00.123Z"
}
{
  "event_name": "mcp.rpc.response",
  "trace_id": "tr_abc",
  "span_id": "sp_rpc_1",
  "parent_span_id": "sp_tool_1",
  "mcp_server": "github",
  "method": "tools/call",
  "jsonrpc_id": "42",
  "duration_ms": 842,
  "response_size_bytes": 9352,
  "is_error_result": false,
  "protocol_error_code": null,
  "status": "completed"
}

7.4 Proxy 与 Hook 事件关联

优先级:

  1. 通过 Agent Adapter 注入 traceparent / 自定义 header。
  2. HTTP MCP 使用 header 传递:x-agenttrace-trace-idx-agenttrace-run-id
  3. stdio MCP 通过 Proxy 会话上下文维护当前 Agent、session、run。
  4. 无法直接关联时,通过时间窗口、server、tool、jsonrpc id、process id 进行弱关联。

7.5 为什么 Proxy 必不可少

场景Hook 能否看到Proxy 能否看到
Agent 决定调用某工具部分
before 阻断
工具参数
MCP JSON-RPC id
tools/list 失败❌ / 不稳定
transport timeout❌ / 不完整
server stderr
HTTP status
MCP isError结果可见但语义可能弱
server backoff需 runtime 暴露✅ / 可推断

最终建议:Hook 用来理解 Agent 语义,Proxy 用来兜底协议事实。

8. 统一事件模型

8.1 基础字段

type AgentTraceBaseEvent = {
  event_id: string;
  event_name: string;
  event_version: "1.0";
  timestamp: string;

  trace_id: string;
  span_id: string;
  parent_span_id?: string;

  tenant_id?: string;
  workspace_id?: string;
  user_id_hash?: string;

  agent_runtime: "openclaw" | "claude_code" | "codex" | "hermes" | "other";
  agent_version?: string;
  agent_id?: string;

  session_id?: string;
  session_key?: string;
  turn_id?: string;
  run_id?: string;
  model_call_id?: string;

  source_adapter: string;
  source_event_name?: string;

  severity?: "debug" | "info" | "warning" | "critical";
};

8.2 工具调用事件

type ToolCallEvent = AgentTraceBaseEvent & {
  event_name:
    | "tool.call.started"
    | "tool.call.completed"
    | "tool.call.error"
    | "tool.call.blocked"
    | "tool.call.approval_requested"
    | "tool.call.approval_decided";

  tool_call_id: string;
  tool_name: string;
  tool_source: "core" | "mcp" | "plugin" | "shell" | "file" | "web" | "browser" | "unknown";
  tool_kind?: string;

  mcp?: {
    server_name?: string;
    safe_server_name?: string;
    tool_name?: string;
    operation?: "tool" | "resources_list" | "resources_read" | "prompts_list" | "prompts_get";
    transport?: "stdio" | "sse" | "streamable-http" | "unknown";
  };

  input?: {
    size_bytes?: number;
    hash?: string;
    summary?: string;
    redaction_applied?: boolean;
    schema_version?: string;
  };

  output?: {
    size_bytes?: number;
    hash?: string;
    summary?: string;
    redaction_applied?: boolean;
    is_error_result?: boolean;
  };

  status: "started" | "completed" | "error" | "blocked" | "unknown";
  duration_ms?: number;

  error?: {
    type?: string;
    message_summary?: string;
    code?: string | number;
    stack_hash?: string;
  };

  policy?: {
    policy_id?: string;
    decision?: "allow" | "deny" | "ask" | "rewrite" | "none";
    reason?: string;
    risk_level?: "low" | "medium" | "high" | "critical";
  };
};

8.3 MCP RPC 事件

type McpRpcEvent = AgentTraceBaseEvent & {
  event_name:
    | "mcp.rpc.request"
    | "mcp.rpc.response"
    | "mcp.rpc.error";

  mcp_server: string;
  transport: "stdio" | "sse" | "streamable-http";
  method: string;
  jsonrpc_id?: string | number;

  request?: {
    size_bytes?: number;
    hash?: string;
    summary?: string;
  };

  response?: {
    size_bytes?: number;
    hash?: string;
    is_error_result?: boolean;
    protocol_error_code?: number;
    protocol_error_message?: string;
  };

  duration_ms?: number;
  status: "started" | "completed" | "error" | "timeout";
};

9. 高级行为分析能力

9.1 行为分析目标

AgentTrace 不只做日志,还要识别“行为模式”。

分析能力示例
工具调用链路LLM → github.search → filesystem.write → shell.exec
高危工具识别删除文件、外发网络请求、读取密钥路径
参数风险检测/etc/passwd.env、SSH key、token、生产数据库
数据外传检测先 read secret,再调用 HTTP / webhook / browser / github issue
慢调用分析某 MCP Server P95 从 800ms 升到 5s
错误聚合github.search_repos 最近失败率升高
工具循环检测同一 tool + 相似参数连续调用 N 次
权限升级检测多次 deny 后尝试同类替代工具
Agent 越权检测非授权 Agent 调用生产环境 MCP
Prompt-to-tool 因果分析某类 prompt 更容易触发高危工具链

9.2 风险评分模型

risk_score =
  tool_risk_base
+ param_risk
+ output_risk
+ sequence_risk
+ identity_risk
+ environment_risk
+ anomaly_risk

示例规则:

规则风险 
MCP filesystem 读取 .envid_rsakubeconfigcritical 
读取敏感文件后 60 秒内调用外部 HTTP 工具critical 
shell 执行 rm -rfcurl | shcritical 
同一 MCP Server 5 分钟内错误率 > 30%warning 
同一工具同参重复调用超过 10 次warning 
未授权 Agent 调用生产数据库 MCPcritical 
参数中出现 access token、API key 模式high 
调用结果超过 5MB 且进入 LLM 上下文high 

9.3 行为规则 DSL

rules:
  - id: secret-read-then-egress
    name: 敏感文件读取后外传
    severity: critical
    when:
      sequence:
        - event: tool.call.completed
          where:
            tool_source: "mcp"
            input.summary.regex: "(\\.env|id_rsa|kubeconfig|credentials)"
        - event: tool.call.started
          within: "60s"
          where:
            tool_source_in: ["web", "browser", "mcp"]
            tool_name.regex: "(fetch|http|slack|github|webhook)"
    action:
      - alert
      - require_approval
      - create_finding

  - id: mcp-server-error-spike
    name: MCP Server 错误率突增
    severity: warning
    when:
      metric:
        name: agent_tool_call_error_rate
        group_by: ["mcp.server_name"]
        window: "5m"
        condition: "> 0.3"
    action:
      - alert

9.4 策略控制能力

决策说明
allow放行
deny阻断工具调用
ask触发人工审批
rewrite修改参数,例如限制路径、去除敏感字段
redact放行但脱敏日志和结果
shadow只记录不阻断,用于灰度
degrade切换备用 MCP Server 或禁用某工具
annotate给模型追加安全上下文或纠错建议

10. 产品功能设计

10.1 总览 Dashboard

核心指标:

工具调用总量
MCP 调用总量
MCP Server 数量
活跃 Agent 数量
失败率
平均耗时 / P95 / P99
高危调用数
阻断数
审批数
Top MCP Server
Top Tool
Top Error

10.2 Trace 详情页

展示一次 Agent run 的完整链路:

session_start
  ↓
user_prompt
  ↓
model_call_started
  ↓
tool.call.started: github--search_repos
  ↓
mcp.rpc.request: tools/call
  ↓
mcp.rpc.response
  ↓
tool.call.completed
  ↓
model_call_ended
  ↓
agent_end

详情字段:

类别字段
身份user、tenant、workspace、agent、session、run
模型provider、model、tokens、duration
工具tool source、server、tool、params summary、result summary
MCPmethod、jsonrpc id、transport、protocol error、isError
风险risk score、命中规则、策略决策
性能span duration、P95 对比、重试、超时
审计原始事件 ID、存储位置、脱敏状态

10.3 MCP Server 画像页

每个 MCP Server 展示:

server name
transport
工具列表
调用量
成功率
错误率
P50 / P95 / P99
最近错误
最近 backoff
高危调用
调用它的 Agent / 用户 / workspace
schema 变化历史

10.4 工具治理页

支持:

按工具查看调用量
禁用工具
设置审批规则
设置参数白名单 / 黑名单
设置输出大小上限
设置敏感字段脱敏策略
设置异常告警阈值
查看工具 schema 演进

10.5 风险发现页

风险发现结构:

{
  "finding_id": "fd_123",
  "severity": "critical",
  "title": "读取敏感文件后外传",
  "trace_id": "tr_abc",
  "evidence_events": ["ev_1", "ev_2"],
  "agent_runtime": "openclaw",
  "session_id": "sess_1",
  "policy_action": "blocked",
  "status": "open"
}

10.6 审批页

审批内容:

谁发起
哪个 Agent
哪个工具
哪个 MCP Server
参数摘要
风险解释
建议动作
允许一次
允许本会话
允许该规则
拒绝

11. 数据存储设计

11.1 事件表

CREATE TABLE agenttrace_events (
  event_id TEXT PRIMARY KEY,
  event_name TEXT NOT NULL,
  event_version TEXT NOT NULL,
  ts TIMESTAMPTZ NOT NULL,

  trace_id TEXT NOT NULL,
  span_id TEXT NOT NULL,
  parent_span_id TEXT,

  tenant_id TEXT,
  workspace_id TEXT,
  user_id_hash TEXT,

  agent_runtime TEXT NOT NULL,
  agent_version TEXT,
  agent_id TEXT,

  session_id TEXT,
  session_key TEXT,
  turn_id TEXT,
  run_id TEXT,
  model_call_id TEXT,
  tool_call_id TEXT,

  tool_source TEXT,
  tool_name TEXT,
  mcp_server TEXT,
  mcp_tool TEXT,
  mcp_transport TEXT,

  status TEXT,
  duration_ms BIGINT,
  risk_level TEXT,
  policy_decision TEXT,

  payload JSONB NOT NULL
);

11.2 工具调用事实表

CREATE TABLE tool_calls (
  tool_call_id TEXT PRIMARY KEY,
  trace_id TEXT NOT NULL,
  run_id TEXT,
  session_id TEXT,

  agent_runtime TEXT NOT NULL,
  agent_id TEXT,

  tool_source TEXT NOT NULL,
  tool_name TEXT NOT NULL,
  mcp_server TEXT,
  mcp_tool TEXT,

  started_at TIMESTAMPTZ NOT NULL,
  completed_at TIMESTAMPTZ,
  duration_ms BIGINT,

  status TEXT NOT NULL,
  error_type TEXT,
  error_message_summary TEXT,

  input_size_bytes BIGINT,
  input_hash TEXT,
  input_summary TEXT,

  output_size_bytes BIGINT,
  output_hash TEXT,
  output_summary TEXT,

  policy_decision TEXT,
  risk_score DOUBLE PRECISION,
  risk_level TEXT
);

11.3 MCP RPC 表

CREATE TABLE mcp_rpc_calls (
  rpc_event_id TEXT PRIMARY KEY,
  trace_id TEXT,
  parent_tool_call_id TEXT,

  mcp_server TEXT NOT NULL,
  transport TEXT NOT NULL,
  method TEXT NOT NULL,
  jsonrpc_id TEXT,

  started_at TIMESTAMPTZ NOT NULL,
  completed_at TIMESTAMPTZ,
  duration_ms BIGINT,

  status TEXT NOT NULL,
  protocol_error_code INT,
  protocol_error_message TEXT,
  is_error_result BOOLEAN,

  request_size_bytes BIGINT,
  response_size_bytes BIGINT
);

11.4 策略与风险表

CREATE TABLE policy_decisions (
  decision_id TEXT PRIMARY KEY,
  event_id TEXT,
  trace_id TEXT,
  tool_call_id TEXT,

  policy_id TEXT NOT NULL,
  decision TEXT NOT NULL,
  reason TEXT,
  risk_level TEXT,

  created_at TIMESTAMPTZ NOT NULL
);

CREATE TABLE risk_findings (
  finding_id TEXT PRIMARY KEY,
  trace_id TEXT NOT NULL,
  title TEXT NOT NULL,
  severity TEXT NOT NULL,
  status TEXT NOT NULL,
  rule_id TEXT,
  evidence_event_ids JSONB,
  created_at TIMESTAMPTZ NOT NULL,
  resolved_at TIMESTAMPTZ
);

12. 脱敏与安全设计

12.1 默认采集策略

默认不保存完整输入输出,只保存:

size_bytes
sha256 hash
结构化摘要
前 N 字符截断
敏感字段替换
schema 类型

12.2 脱敏规则

默认识别:

API key
Bearer token
JWT
AWS access key
GitHub token
OpenAI key
Anthropic key
SSH private key
数据库连接串
邮箱
手机号
身份证号
银行卡号
.env 内容
kubeconfig

12.3 内容采集等级

等级行为
off不采集参数和结果,只采集大小、hash
summary保存脱敏摘要
sampled按采样率保存脱敏内容
full_redacted保存完整脱敏内容
full_raw仅安全白名单环境可开启

12.4 权限控制

普通研发:只能看摘要和指标
服务 owner:可看自己 MCP Server 的脱敏明细
安全管理员:可看风险证据
审计管理员:可导出审计报告
平台管理员:可配置策略和保留周期

13. 跨 Agent 兼容方案

13.1 兼容原则

不要让行为分析直接依赖某个平台的 Hook 名称。
每个 Agent 只负责把原生事件转成统一事件。
MCP Proxy 作为跨 Agent 的协议层兜底。
非 MCP 工具通过各自 Hook 或系统层 sensor 补齐。

13.2 OpenClaw Adapter

能力实现
工具开始before_tool_call
工具完成after_tool_call
模型调用model_call_started/ended
LLM 输入输出llm_input/output
MCP 识别serverName--toolNamePluginToolMeta
OTelHook 内手动创建 span
盲区其他插件阻断后的 outcome 需要增强事件或 pending timeout 推断

13.3 Claude Code Adapter

Claude Code 适配:

Claude CodeAgentTrace
PreToolUsetool.call.started
PostToolUsetool.call.completed
PostToolUseFailuretool.call.error
PermissionRequesttool.call.approval_requested
PermissionDeniedtool.call.blocked
PostToolBatchtool.batch.completed
Elicitationmcp.elicitation.requested
ElicitationResultmcp.elicitation.completed

Claude Code 的 MCP 工具命名模式为 mcp__<server>__<tool>,因此 Adapter 可以稳定解析 servertool。(Claude)

13.4 Codex Adapter

Codex 适配:

CodexAgentTrace
PreToolUsetool.call.started / tool.call.blocked
PermissionRequesttool.call.approval_requested
PostToolUsetool.call.completed / tool.call.error
SubagentStartsubagent.started
SubagentStopsubagent.ended
UserPromptSubmituser.prompt.submitted

注意:Codex 官方文档明确说明,PreToolUse / PostToolUse 当前覆盖 Bash、apply_patch 和 MCP tool calls,但不完整覆盖所有 shell、WebSearch 或其他非 shell、非 MCP 工具,因此 Codex 适配必须配合 MCP Proxy 与系统层 sensor。(OpenAI 开发者)

13.5 Hermes Adapter

Hermes 适配:

HermesAgentTrace
pre_tool_calltool.call.started
post_tool_calltool.call.completed / tool.call.error
pre_llm_callllm.call.started / context injection
post_llm_callllm.call.ended
on_session_startsession.started
on_session_endsession.ended
subagent_stopsubagent.ended

Hermes 文档显示 MCP tools 会被发现并注册,运行时工具派发经过 plugin pre-hook 和 post-hook,因此可以用 Adapter 方式接入。(Hermes Agent)

13.6 其他 Agent

对于其他 Agent:

Agent 能力接入策略
有 before/after tool hook写 Adapter
只有 MCP 支持通过 MCP Proxy 覆盖 MCP 调用
只有 shell 工具用 shell wrapper / sandbox sensor
只有日志日志 parser 作为低保真 Adapter
无任何扩展点只能依赖协议代理和系统层观测

14. API 设计

14.1 查询工具调用

GET /api/v1/tool-calls?runtime=openclaw&mcp_server=github&status=error&from=...&to=...

返回:

{
  "items": [
    {
      "tool_call_id": "tc_123",
      "trace_id": "tr_abc",
      "agent_runtime": "openclaw",
      "tool_source": "mcp",
      "mcp_server": "github",
      "mcp_tool": "search_repos",
      "status": "error",
      "duration_ms": 1240,
      "started_at": "2026-07-07T12:00:00Z"
    }
  ],
  "next_cursor": "..."
}

14.2 查询 Trace

GET /api/v1/traces/{trace_id}

返回:

{
  "trace_id": "tr_abc",
  "session_id": "sess_1",
  "run_id": "run_1",
  "spans": [
    {
      "span_id": "sp_model_1",
      "name": "llm.call",
      "duration_ms": 2200
    },
    {
      "span_id": "sp_tool_1",
      "parent_span_id": "sp_model_1",
      "name": "tool.call",
      "tool_name": "github--search_repos",
      "duration_ms": 842
    }
  ]
}

14.3 策略决策接口

POST /api/v1/policy/evaluate

请求:

{
  "event_name": "tool.call.started",
  "agent_runtime": "openclaw",
  "tool_source": "mcp",
  "tool_name": "filesystem--read_file",
  "mcp_server": "filesystem",
  "mcp_tool": "read_file",
  "input_summary": "{\"path\":\"/etc/passwd\"}",
  "session_id": "sess_1",
  "agent_id": "agent_main"
}

返回:

{
  "decision": "deny",
  "risk_level": "critical",
  "policy_id": "block-sensitive-system-path",
  "reason": "禁止读取系统敏感路径"
}

14.4 上报事件接口

POST /api/v1/events

用于 Adapter、Proxy、系统 sensor 上报统一事件。

15. 告警设计

15.1 告警规则

告警条件等级
MCP Server 错误率突增5 分钟错误率 > 30% 且调用数 > 20warning
MCP Server 全部失败连续 10 次失败critical
慢调用突增P95 超过历史均值 3 倍warning
高危工具调用命中 critical 策略critical
敏感读取后外传命中序列规则critical
未授权 Agent 调用Agent 不在 server allowlistcritical
Hook 数据缺失started 后超时无 completedwarning
Proxy 与 Hook 数据不一致RPC 存在但 tool event 缺失warning

15.2 告警输出

Slack / 飞书 / 邮件
Webhook
PagerDuty / Opsgenie
Jira / 工单系统
安全事件平台

告警内容必须包含:

trace_id
agent_runtime
session_id
run_id
mcp_server
tool_name
status
duration
error_summary
risk_reason
dashboard_url

16. 部署方案

16.1 Lite 模式:OpenClaw 插件

适合快速修复 OpenClaw MCP 盲区。

OpenClaw
  └─ agenttrace-openclaw plugin
       ├─ before_tool_call
       ├─ after_tool_call
       ├─ JSONL
       └─ OTel manual span

优点:

实施快
侵入低
能覆盖 OpenClaw MCP 工具调用

不足:

协议层细节不足
跨 Agent 不覆盖
其他插件阻断 outcome 可能需要推断

16.2 Standard 模式:插件 + MCP Proxy + OTel

适合生产运维。

OpenClaw / Other Agent
  ├─ Agent Adapter
  └─ MCP Proxy
       └─ AgentTrace Collector
            ├─ DB
            ├─ OTel
            └─ Dashboard

优点:

同时有 Agent 语义和 MCP 协议事实
支持 Dashboard 和告警
具备跨 Agent 扩展能力

16.3 Enterprise 模式:多 Agent + 行为分析 + 策略控制

适合平台化治理。

OpenClaw Adapter
Claude Code Adapter
Codex Adapter
Hermes Adapter
MCP Proxy Fleet
System Sensor
Policy Engine
Behavior Analysis
SIEM / SOC / OTel / BI

优点:

跨 Agent 统一治理
支持风险评分和审批
支持安全审计和合规

17. 配置设计

17.1 AgentTrace 配置

agenttrace:
  enabled: true

  runtime:
    name: openclaw
    adapter: openclaw-plugin

  capture:
    input:
      mode: summary
      max_bytes: 4096
      hash: true
      redact: true
    output:
      mode: summary
      max_bytes: 4096
      hash: true
      redact: true

  mcp:
    detect:
      name_patterns:
        - "serverName--toolName"
        - "mcp__server__tool"
      plugin_meta: true
    proxy:
      enabled: true
      capture_tools_list: true
      capture_tools_call: true
      capture_resources: true
      capture_prompts: true

  policy:
    enabled: true
    mode: shadow
    endpoint: "http://agenttrace-policy:8080/api/v1/policy/evaluate"

  sinks:
    jsonl:
      enabled: true
      path: "/var/log/agenttrace/events.jsonl"
    otel:
      enabled: true
      endpoint: "http://otel-collector:4318"
      protocol: "http/protobuf"
    database:
      enabled: true
      dsn: "${AGENTTRACE_DB_DSN}"

  privacy:
    raw_content_enabled: false
    redact_secrets: true
    user_id_hash_salt_env: "AGENTTRACE_HASH_SALT"

  reliability:
    queue_size: 10000
    flush_interval_ms: 1000
    pending_call_ttl_ms: 300000
    fail_open: true

17.2 策略配置

policies:
  - id: block-sensitive-path
    enabled: true
    match:
      tool_source: mcp
      input_regex: "(/etc/passwd|\\.env|id_rsa|kubeconfig)"
    decision: ask
    severity: critical

  - id: readonly-github-default
    enabled: true
    match:
      mcp_server: github
      mcp_tool_regex: "^(create|delete|update|merge|close).*"
    decision: ask
    severity: high

  - id: block-production-db-for-non-prod-agent
    enabled: true
    match:
      mcp_server: prod-db
      agent_id_not_in:
        - sre-agent
        - db-admin-agent
    decision: deny
    severity: critical

18. 性能与可靠性设计

18.1 性能目标

项目目标
Hook before 额外耗时P95 < 10ms,不含远程策略审批
Hook after 额外耗时P95 < 5ms
本地队列吞吐单实例 ≥ 1000 events/s
JSONL 落盘延迟P95 < 1s
OTel export 延迟P95 < 5s
Proxy 额外耗时P95 < 20ms
事件丢失率正常退出 < 0.1%
采集失败策略fail-open,不影响工具主链路

18.2 可靠性策略

本地内存队列 + 批量 flush
JSONL fallback
OTel / DB 写入失败自动重试
队列满时按策略丢弃 debug 事件,保留 critical 事件
pending call TTL 自动补偿 unknown 事件
Collector 不可用时不阻断 Agent
策略引擎不可用时按配置 fail-open / fail-closed

18.3 背压策略

情况行为
DB 慢切 JSONL fallback
OTel 慢批量重试,超过阈值降采样
队列满丢弃低优先级事件
critical 风险事件永不采样丢弃,优先落盘
Proxy 压力过大降级只记录 metadata,不记录摘要

19. OpenClaw 源码增强建议

P0 可以只做插件,但为了长期完整性,建议增加两个小增强。

19.1 MCP inline fallback 补诊断事件

toToolDefinitions inline fallback 路径补齐:

tool.execution.started
tool.execution.completed
tool.execution.error
tool.execution.blocked

这样 MCP 工具和内建工具在诊断事件层也一致。

19.2 Hook outcome 统一事件

新增 Hook outcome 事件:

tool.hook.before.completed

字段:

{
  "toolCallId": "...",
  "toolName": "...",
  "outcome": "allow|block|approval_requested|error",
  "pluginId": "...",
  "reason": "..."
}

这样可以解决“监控插件先记录 started,但后续其他插件 block 后没有 after”的可观测问题。

20. 实施路线

阶段 0:验证版

目标:证明 OpenClaw MCP 工具调用可以被看见。

交付:

agenttrace-openclaw 插件
before_tool_call / after_tool_call 采集
MCP 工具识别
JSONL 日志
基础统计 CLI

验收:

调用 fetch MCP 工具后,JSONL 中出现 started + completed/error
字段包含 serverName、toolName、toolCallId、runId、durationMs、status
本地 exec/write/edit/read 仍正常记录

阶段 1:生产版 OpenClaw

目标:OpenClaw MCP 调用具备生产可观测性。

交付:

OTel manual span
PostgreSQL / ClickHouse 写入
基础 Dashboard
错误率 / 慢调用告警
参数和结果脱敏
pending call timeout 补偿

验收:

Grafana 可看到 MCP Server 调用量、失败率、P95/P99
Trace 中能串联 session → run → model call → tool call
MCP 调用失败时可定位 server、tool、error、duration

阶段 2:MCP Proxy

目标:补齐协议层事实。

交付:

HTTP / SSE / streamable-http proxy
stdio proxy
tools/list / tools/call 采集
JSON-RPC id 关联
transport timeout / protocol error 采集
server health 状态

验收:

即使 Agent Hook 缺失,MCP Proxy 仍能记录 tools/call
能区分 tool result isError 与 MCP protocol error
能看到 tools/list 失败和 transport timeout

阶段 3:多 Agent Adapter

目标:兼容 Hermes、Claude Code、Codex。

交付:

Claude Code Adapter
Codex Adapter
Hermes Adapter
统一 naming parser
统一事件 SDK

验收:

Claude Code 的 mcp__server__tool 被解析为 mcp.server + mcp.tool
Codex 的 PreToolUse/PostToolUse 可转成 tool.call.started/completed
Hermes 的 pre_tool_call/post_tool_call 可转成统一事件
不同 Agent 的事件能进入同一 Dashboard

阶段 4:高级行为分析与策略

目标:从“看见调用”升级为“理解行为、发现风险、自动治理”。

交付:

风险规则引擎
工具序列分析
敏感数据外传检测
审批流
策略灰度
风险发现页

验收:

敏感文件读取后外传能生成 critical finding
高危 MCP 调用可触发 ask / deny
慢调用和错误率异常可自动告警

21. 验收标准

21.1 功能验收

编号验收项标准
A1OpenClaw MCP 调用可见fetchgithubfilesystem 等 MCP 工具调用均有 started/completed/error
A2字段完整server、tool、toolCallId、runId、session、agent、duration、status 全部存在
A3错误可检索可按 server、tool、error_type 查询失败
A4慢调用可观测可查看 P50/P95/P99
A5Trace 可串联session → run → model → tool → mcp rpc 可串联
A6OTel 可展示Jaeger / Tempo / Grafana 中可看到 MCP tool span
A7数据脱敏token、key、secret 不出现在明文日志
A8策略可用高危参数可触发 deny / ask
A9Proxy 可用MCP tools/call 在 proxy 层可见
A10多 Agent 可扩展至少 OpenClaw + 一个外部 Agent 接入统一事件模型

21.2 性能验收

编号指标标准
P1Hook 额外耗时P95 < 10ms
P2Proxy 额外耗时P95 < 20ms
P3事件写入延迟P95 < 5s
P4Agent 主链路影响Collector 故障时工具调用不受影响
P5数据丢失正常运行事件丢失率 < 0.1%

21.3 安全验收

编号验收项标准
S1默认不保存原文默认 summary + hash
S2敏感信息脱敏常见 token / key / secret 自动替换
S3权限隔离非授权用户不能查看跨 workspace 明细
S4审计不可篡改JSONL / DB 事件包含 hash 和事件 ID
S5策略留痕每次 allow / deny / ask 均可审计

22. 风险与应对

风险说明应对
Hook after 缺失工具被阻断、进程退出时无 afterpending TTL + blocked 事件 + 源码增强
其他插件先阻断监控插件可能拿不到事件调整 Hook 优先级;P1 增加 Hook outcome
MCP 命名不统一OpenClaw server--tool,Claude/Codex mcp__server__toolAdapter 内置 parser
原始结果过大大结果影响存储和性能默认只存摘要、大小、hash
敏感数据泄露参数和结果可能含 secret默认脱敏、禁止 raw、权限隔离
Codex Hook 覆盖不完整官方文档说明部分工具路径不被 Hook 覆盖MCP Proxy + shell wrapper + system sensor
Proxy 引入延迟所有 MCP 请求经过代理异步采集、低开销转发、可旁路
策略误杀deny 影响正常任务shadow 灰度、ask 审批、规则回放
多 Agent 字段差异session、run、tool id 不统一统一事件模型允许 optional + synthetic id

23. 推荐最终落地形态

最终推荐采用三件套:

1. OpenClaw Plugin Hook Adapter
   解决 OpenClaw MCP 工具调用不可见问题。

2. MCP Proxy / Sidecar
   解决跨 Agent、跨协议、transport、JSON-RPC、server health 可观测问题。

3. Unified Event + Policy + Behavior Analysis Platform
   解决多 Agent 统一分析、审计、风控、告警、Dashboard 问题。

落地优先级:

P0:OpenClaw 插件,立即修复 MCP 调用不可见。
P1:手动 OTel span + Dashboard,形成生产可观测。
P2:MCP Proxy,补齐协议层和跨 Agent 兜底。
P3:Claude Code / Codex / Hermes Adapter,统一多 Agent。
P4:行为分析和策略控制,升级为治理平台。

24. 最终结论

这个方案的核心判断是:

OpenClaw 内部不要再依赖诊断事件或开箱 OTel 来监控 MCP 工具,而应以 before_tool_call + after_tool_call Plugin Hook 为主采集点。 调研已经证明 MCP 工具虽然会进入 Plugin Hook,但不会发射 tool.execution.* 诊断事件,因此现有诊断事件链路和开箱 OTel 会漏掉 MCP。

跨 Agent 不要试图复用 OpenClaw 的 Hook 名称,而要复用统一事件模型。 Claude Code、Codex、Hermes 都有各自 Hook 体系,但命名、字段、覆盖范围不同;通过 Adapter 归一化为 tool.call.started/completed/error/blocked 才能做统一分析。(Claude)

跨 MCP 生态的最大公约数是 MCP Proxy。 因为 MCP 是标准协议,且工具调用、工具列表、调用结果、错误语义都可以在协议层观测;Proxy 可以弥补各 Agent Hook 覆盖差异,是兼容 Hermes、Claude Code、Codex 和未来其他 Agent 的关键。(Model Context Protocol)

最终产品形态应是:

Agent Hook Adapter 负责语义
MCP Proxy 负责协议事实
Unified Event Model 负责归一化
Policy Engine 负责治理
Behavior Analysis 负责高级风险识别
OTel / DB / Dashboard 负责生产可观测

这样既能解决 OpenClaw 当前 MCP 监控盲区,也能演进为面向多智能体、多工具生态的统一可观测与安全治理平台。

文档信息