用途
mcp-audit 是一个面向 MCP 服务器的即插即用安全与可观测性代理。它位于 MCP 客户端与任意上游 MCP 服务器之间,生成经过签名的审计追踪、脱敏敏感载荷、执行允许/拒绝策略和按工具限流,并暴露本地只读仪表盘。它并非特定领域的 MCP 服务器,而是透明代理,包装任意 MCP 服务器并审计流经的 JSON-RPC 流量。目录中显示的可能是上游服务器暴露的工具,而非 mcp-audit 自身实现的工具。
MCP 2026 路线图提出了企业在审计追踪、网关模式和运维可见性方面的需求。mcp-audit 可作为可部署的侧车或本地包装器填补这一空白:它位于任意 MCP 客户端与服务器之间,保留协议流量,并为工具调用、资源读取、提示请求及所有其他 JSON-RPC 方法记录签名审计条目。
主要能力
- 审计 AI 智能体在受监管环境中的工具调用
- 检测意外或危险的 MCP 工具使用
- 保留签名的 JSONL 或 SQLite 日志用于事件审查
- 在存储请求和响应前脱敏敏感字段
- 阻止不允许的工具并施加按工具限流,无需修改上游 MCP 服务器
支持的传输方式:
- stdio:适用于 Claude Desktop 等本地 MCP 客户端
- http:适用于通过 HTTP 暴露的 MCP 服务器
HTTP 上游可使用自定义 CA 包、TLS 服务器名称覆盖和可选 mTLS 客户端证书。上游重试默认禁用;仅在启用时适用于保守的、幂等的 JSON-RPC 方法;tools/call 不重试。
审计条目包含:ULID、时间戳、方向、传输、JSON-RPC 方法、工具名称(如存在)、脱敏后的参数/结果、JSON-RPC 错误(如存在)、持续时间、客户端/服务器标识,以及可选的 HMAC-SHA256 签名。
策略执行:mcp-audit 可在 tools/call 到达上游 MCP 服务器之前执行同步的允许/拒绝规则。被拒绝的调用返回 JSON-RPC 错误,同时仍会写入审计日志。规则按顺序求值,空字段和 * 匹配任意值,因此可配合 default_action: deny 和显式 allow 规则用于更严格的部署。
OTLP 导出:可将 tools/call 审计条目作为 OTLP/HTTP JSON span 导出到 Jaeger、Tempo、Honeycomb 或任何兼容 OTLP 的收集器。导出使用当前 OpenTelemetry MCP 与 GenAI 语义约定(如 mcp.method.name、jsonrpc.request.id、gen_ai.operation.name、gen_ai.tool.name、network.transport、network.protocol.name、rpc.response.status_code、error.type),项目特定属性保持链接导向(如 mcp_audit.entry_id、mcp_audit.direction、mcp_audit.client_id、mcp_audit.server_id、mcp_audit.storage、mcp_audit.signature.present)。默认不导出请求参数和工具结果,签名 JSONL 或 SQLite 审计行仍是证据产物,OTLP 提供关联、延迟和运维可见性。导出器健康通过 Prometheus 指标在 mcp_audit_otel_ 前缀下可见,包括导出请求、span 结果、丢弃 span、队列深度和队列容量。临时 OTLP 失败以有界指数退避重试;可重试响应遵循 Retry-After,最长至 otel.retry.max_interval_ms。
仪表盘:显示最近条目、过滤器、可展开的请求/结果 JSON、热门工具、今日调用和错误率,每五秒刷新。默认仅监听 127.0.0.1:9090。要暴露在其他接口,需显式配置 dashboard.bind_address 并启用认证或置于受信访问代理之后。配置 dashboard.auth.token 后,对 /、/api/entries 和 /api/stats 的请求须携带凭证;缺失或无效凭证返回 401 Unauthorized 和 WWW-Authenticate: Bearer realm="mcp-audit-dashboard"。同一远程地址的重复认证失败会被限流为 429 Too Many Requests。仪表盘 JSON API 响应包含 Cache-Control: no-store。
Prometheus 指标:mcp-audit 在独立端点暴露 Prometheus 指标,以便平台团队抓取运维数据而不暴露仪表盘。应用指标使用 mcp_audit_ 前缀并避免无界标签。可通过 metrics.tool_labels: false 禁用工具级标签以严格控制基数。策略决策以 mcp_audit_policy_decisions_total{action="allow|deny"} 暴露。
使用方式
安装:
- 下载最新预构建二进制并运行
- 使用 Docker 运行
- 使用 Go 从源码安装
- 要固定特定发布以实现可复现安装,请参阅 INSTALL.md
运行:
- stdio 模式运行
- 在 Windows PowerShell 上生成密钥并设为环境变量
- HTTP 模式运行
- 使用 Docker Compose 运行
默认仪表盘地址为 http://127.0.0.1:9090,Prometheus 指标默认位于 http://localhost:9091/metrics。
配置:默认从当前目录加载 config.yaml,CLI 标志覆盖配置值,AUDIT_SECRET 覆盖 audit.secret。
客户端配置示例涵盖:Cursor stdio、Continue stdio、VS Code stdio、Claude Desktop stdio、Zed stdio。也可配置 Claude Desktop 启动 mcp-audit 而非上游 MCP 服务器。
HTTP 转发安全:默认剥离逐跳请求头和 Authorization 后再转发到上游。要向受信认证上游传递 bearer token,需显式选择加入。转发头(包括 bearer token 等机密)会原样传输到上游服务器,仅在控制或信任上游 MCP 服务器时启用。Authorization 是唯一可选择性转发的敏感头,因为部分 MCP HTTP 服务器需要它进行上游认证。Cookie、Set-Cookie 和 Proxy-Authorization 始终被拒绝,它们代表发往其他组件(如浏览器会话或代理链)的状态,在 MCP 请求转发中没有正当用途。若现有部署依赖隐式 Authorization 转发,需添加相应配置。
日志轮转:JSONL 轮转默认禁用,支持基于大小和基于 UTC 时间的触发。轮转归档使用 UTC 时间戳,如 audit.jsonl.20260610T214605Z;同一秒内多次轮转则添加数字后缀。归档时间戳反映轮转事件的墙钟时间,而非跨越的截止时间。基于时间的轮转是追加驱动的:mcp-audit 不启动后台计时器,因此若数天无写入,活动文件不会在截止后轮转,直到下一次追加。错过的截止时间不会补做,下一次追加最多创建一个归档。max_age_days 使用归档文件名中编码的轮转时间戳,即自轮转以来的年龄,而非归档中最旧条目的年龄。年龄保留在 max_files 保留之前运行。压缩和 SQLite 归档不属于本发布。
适用场景
- AI 智能体在受监管环境中产生的工具调用审计
- 检测意外或危险的 MCP 工具使用
- 事件审查用的签名日志留存
- 存储前对敏感字段脱敏
- 在不修改上游 MCP 服务器的情况下阻止不允许的工具并施加按工具限流
- 通过 OTLP 将审计条目导出到 Jaeger、Tempo、Honeycomb 等 OTLP 兼容收集器,实现关联、延迟和运维可见性
限制
- 本发布不包含压缩和 SQLite 归档
- 上游重试默认禁用,仅适用于保守的幂等 JSON-RPC 方法,tools/call 不重试
- OTLP 默认不导出请求参数和工具结果
- 基于时间的 JSONL 轮转为追加驱动,不补做错过的截止时间
- 仪表盘默认仅监听 127.0.0.1:9090
- Cookie、Set-Cookie 和 Proxy-Authorization 始终被拒绝转发
- 转发头(包括 bearer token 等机密)会原样传输到上游,仅在控制或信任上游 MCP 服务器时启用 Authorization 转发
其他信息
许可证:Apache-2.0,详见 LICENSE。架构说明见 ARCHITECTURE.md,平台特定安装与故障排除见 INSTALL.md,稳定性保证见 STABILITY.md,贡献指南见 CONTRIBUTING.md,发布历史见 CHANGELOG.md,安全漏洞报告流程见 SECURITY.md。