Shengxing Zhang

项目 · AI 安全

AgentGuard

面向 AI 代理工具调用的最小权限代理。

AgentGuard 是 AI 代理与 MCP 服务器之间的一个进程。代理的客户端配置指向它,不再直接指向服务器。真正的服务器由它启动,此后两侧的每条消息都经过它。它工作在 MCP 的 stdio 传输上,即按行分隔的 JSON-RPC,代理和服务器都不需要改代码。每个 tools/call 和 resources/read 请求在转发前检查。这两类调用的结果,连同 prompts/get 的结果,在返回前检查。

AI 代理 MCP CLIENT AgentGuard JSON-RPC / STDIO 策略引擎请求侧01 注入检测响应侧02 秘密脱敏响应侧03 MCP 服务器 TOOL BACKEND tools/call tools/call 结果 结果 审计日志 · 哈希链 JSONL
AgentGuard 的数据流。上方:请求经策略引擎放行后到达服务器。下方(蓝线):结果依次经注入检测与秘密脱敏后返回代理。

每次调用经过的检查

01 · 调用策略(请求侧)

规则检查每个请求的参数。文件路径、shell 命令、网络主机各有一组拒绝和允许列表,也可以按工具单独设置。路径先解析相对形式、.. 和符号链接,再按服务器实际会打开的文件判断。参数属于哪一类,由服务器在 tools/list 里声明的 schema 和参数名决定。对不上任何一类的参数默认放行并写入日志,也可以配置为拒绝。被拒绝的调用不会到达服务器。

02 · 注入检测(响应侧)

扫描工具、资源和提示词返回的文本,寻找形似指令的内容。错误信息也在扫描范围内。匹配前先规范化:移除零宽字符,折叠同形字和全角字符,解开一层 base64。只要有一条规则命中,整条结果就被拦下,代理收到一个列出命中规则的错误响应。

03 · 秘密脱敏(响应侧)

通过检测的输出再检查一遍。符合已知格式的秘密替换为 [REDACTED:规则名],其余内容不动。匹配在规范化后的文本上进行,替换只落在原文对应的那一段。

审计日志

每一层的每个决定写一条记录,每条记录带前一条的哈希。改动中间的记录,下一次校验会指出位置。删掉末尾的记录,或把改动之后的哈希整体重算,只有事先用 agentguard anchor 把链头存到别处才能发现。设置 anchor_file 后,每个会话开始和结束时自动存一次。agentguard report 按会话列出代理访问过的文件、主机和命令。

会话限制(需开启)

一次运行是一个会话。可以限制会话内文件、网络、命令调用的次数和返回内容的字节数。另有三条固定的顺序规则,例如读取敏感文件之后拒绝后续网络调用。这些在随包的默认策略里全部关闭。

人工确认(需开启)

规则可以给出 ask。另一个终端里的 agentguard approve 回答它:拒绝、放行一次、本会话放行、总是放行。同一次调用里只要有规则给出拒绝,就直接拒绝,不再询问。确认通道是 Unix 套接字。Windows 没有这个通道,所有 ask 都按拒绝处理。

现状

角色
独立完成:设计、代码、测试、文档与威胁模型
发布
PyPI: agentguard-mcp · v0.2.0 · pip install agentguard-mcp
测试
369 个(Linux),agentguard/ 行覆盖率 93%
内置规则
34 条:文件 10、命令 4、网络 6、脱敏 7、注入 7
核心代码
13 个模块共 3,917 行
运行时依赖
1 个(PyYAML)
许可证
MIT

以上数字对应 PyPI 上的 v0.2.0,即仓库提交 762145c。在该提交上运行 scripts/stats.py、pytest 和 coverage 可以重新得到。本页更新于 2026 年 10 月 11 日。

安装与验证

40 秒演示录像

第一条命令从 PyPI 安装。第二条用 agentguard 启动 MCP 服务器,代替直接启动。第三条校验审计日志。默认策略随包安装。要改规则,先用 agentguard default-policy 导出一份,改后用 --config 指定。客户端配置里只改启动命令一处,服务器不改。

示例:三条命令
pip install agentguard-mcp
agentguard run -- python3 your_mcp_server.py
agentguard verify-audit agentguard_audit.log

仓库里的 demo/run_demo.sh 用默认策略对一个自身不设限制的服务器运行十二步,先不经代理,再经过代理。读取 ~/.ssh/id_rsa,被拒绝并记录。同一个读取换用一个参数名不叫 path 的工具,同样被拒绝。读取一个含 AWS 密钥的文件,内容返回,密钥被遮盖。抓取一个被投毒的网页,URL 合法,抓取放行,返回内容被判为注入并整条拦下。agentguard report 列出这个会话访问过的内容。手工改动一条已写入的审计记录,下一次校验报出被改的行。录像以 0.2.0 录制,约 40 秒。

不承诺什么

  • 不给 MCP 服务器进程加沙箱。服务器在操作系统层面的行为,协议层的代理看不到。
  • 不保证捕获所有注入措辞。规则公开在策略 YAML 里,读过规则的人可以绕开。匹配前的规范化只处理零宽字符、同形字、全角字符和一层 base64,识别不了多层编码和图片里的文字。计划中的 LLM 分类层用于补这个缺口,尚未实现。
  • 审计日志能发现篡改,不能阻止篡改。链头没有另存时,删掉末尾记录或整体重写无法发现。另存之后也只是能发现,不能阻止。
  • 对不上任何一类的参数默认放行,只在审计日志里记为 unclassified。把 unclassified_arguments 设为 deny 才会拒绝。
  • 单次工具调用没有超时,也没有速率限制。

完整论证在仓库的 THREAT_MODEL.md。

与同类工具的比较

完整调研

garak、promptfoo 一类工具在部署前对模型做红队测试,不接触运行中代理收到的内容。AgentGuard 在运行时的流量路径上,对每次调用执行策略。两类工具互补,不属于同一类别。

同一类别是 MCP 运行时网关:mcp-firewall、Lasso 的 MCP Gateway、微软的 MCP Gateway,以及若干更小的拦截器。它们在同一时期形成了大致相同的形态。AgentGuard 与它们的差别在规模。它有一个运行时依赖,核心代码 13 个模块约 3,900 行,没有仪表盘,没有 SaaS 组件,审计日志的防篡改性质有文档说明,可以独立校验。它的功能比这些工具少。相应地,代码可以完整读完、完整审完。仓库里的调研逐项对比了这些工具,包括更成熟的方案领先的地方。

下一步

  • 在规则之后加一层 LLM 分类,对正则未标记的输出做第二次判断。0.2 有意未做这一层,先保证已有部分成立。规则会保留,因为结果确定,可以审计。
  • 在增加规则之前先收集真实流量。误报率目前只能写「未观察到」,因为检测器处理过的真实内容还太少。
  • 把审计链的锚点自动存到主机之外。目前 agentguard anchor 输出链头,保存位置由使用者自己安排。
  • 让人工确认在 Windows 上可用,并支持 Streamable HTTP 传输。目前只支持 stdio。
  • 用这些证据决定方向:向功能更全的网关扩展,还是保持现在的规模。

相关文章

全部文章