mcpField
Z
zn-gate

zn-gate

本地服务
usezn.com安全2今天更新

关于 zn-gate

zn-gate 是面向使用编码 Agent 或用 Python 构建 Agent 的开发者的开源本地安全层。它检测提示词注入、清理受支持工具流中的密钥、审查提示词和配置文件,并可代理本地 MCP 服务。

主要功能

  1. 01在本地检测提示词注入
  2. 02清理工具输出中的密钥
  3. 03审查提示词、技能和配置
  4. 04用防护代理包装本地 MCP 服务
  5. 05将 .env 值存入加密保险库
  6. 06查看本地安全活动

适用场景

  1. 01保护受支持的编码 Agent 工具流
  2. 02使用前检查提示词和技能
  3. 03为本地 MCP 服务添加安全代理
  4. 04避免 Agent 从文件读取 .env 实际值

MCP 相关

zn-gate 可作为 MCP 服务运行,提供检查工具调用和结果的工具。它也能包装本地 stdio MCP 服务;远程 URL 服务不作更改。

配置

本地服务的配置在各客户端中通用,复制后粘贴到客户端的 MCP 配置文件即可。

mcp.json · 通用配置
{
"mcpServers": {
"usezn-zn-gate": {
"command": "npx",
"args": [
"-y",
"zn-gate"
],
"env": {
"ZN_LOCAL_ONLY": "<ZN_LOCAL_ONLY>",
"ZN_CLOUD": "<ZN_CLOUD>",
"ZN_API_KEY": "<ZN_API_KEY>"
}
}
}
}
启动命令npx -y zn-gate
需要配置的环境变量
ZN_LOCAL_ONLYSet to true to force local-only mode, even if ZN_CLOUD=1.
ZN_CLOUDSet to 1 to let prompt analysis also query the optional cloud classifier. Off by default.
ZN_API_KEY密钥API key for the optional cloud check. Has no effect without ZN_CLOUD=1.

本地服务需要在你的电脑上安装运行环境(如 Node.js 18+)。各客户端的配置文件位置不同,请参考客户端文档。

安装包
npmzn-gate1.14.1

工具

4

收录的工具列表 · 更新于 今天

参数类型必填说明
textstring是要检查的用户输入、系统提示词或外部消息。

详细介绍

zn

zn-gate

CI npm version License: MIT

面向编码 Agent 的本地安全层。 使用 Claude Code、Codex CLI、Cursor 或 OpenCode 时,zn-gate 会保护你的机密、数据和系统。

zn-gate 是一个开源安全层,在你的设备上运行,介于 Agent 与其访问的工具和内容之间。它会检查 Agent 读取和调用的内容是否包含提示词注入,在模型看到工具输出前遮蔽其中的机密,并审计提示词、技能和配置。默认无需账户和网络连接,除 age-encryption(及其 @noble/@scure 依赖项)外没有运行时依赖;这些依赖用于机密保险库,已按 package-lock.json 中锁定的版本打包在软件包中。

适用对象: 使用 Claude Code、Codex CLI、Cursor、OpenCode 或任何 MCP 客户端的开发者。Python SDK:PyPI 上的 zn-gate。


安装

所有操作都在你的设备上运行;无需账户或 API 密钥。你需要 Node.js 18 或更高版本(nodejs.org 上的 LTS 版本)。如果 Node.js 版本较旧,zn-gate 和 zn 命令会停止运行,并说明如何安装。Claude Code 插件需要 Node.js 20.12 或更高版本。

快速上手:四个步骤,每步一条命令。 在你自己的终端中运行。

  1. npx -y zn-gate reach 显示编码 Agent 在这台设备上可以访问的内容:.env 文件中的机密(仅显示名称)、凭据文件和 MCP 服务。此操作只读,不会发送任何内容。详情请参阅 docs/reach.md。
  2. npx -y zn-gate init 会逐步为检测到的编码 Agent 设置防护,并在每次更改前征求你的同意。
  3. npx -y zn-gate check 会在临时文件夹中使用虚构机密测试防护。init 也会在最后运行此命令。
  4. npx -y zn-gate env shadow .env 会将 .env 中的真实值移入本地保险库,并在文件中留下标记。首次使用时,运行 npx -y zn-gate unlock 创建保险库。

一条命令即可为设备上的编码 Agent 设置防护:

npx -y zn-gate init

init 会执行以下操作:

  • 检测设备上的 Claude Code、Codex CLI、Cursor 和 OpenCode。
  • 对尚未受到保护的每个 Agent,显示设置步骤:Claude Code 使用 zn-gate 插件(如果你的 Node.js 版本低于 20.12,则使用 zn 的 hooks),其他 Agent 使用 zn 的 hooks。
  • 仅在你确认后执行每个步骤。
  • 最后运行 zn-gate check。

请在你自己的终端中手动运行此命令。当 AI Agent 或脚本运行它时,它只会打印操作步骤。

Windows PowerShell: npm 和 npx 可能会报错“此系统禁止运行脚本”,因为默认执行策略会阻止 npm.ps1。请改用 npm.cmd、npx.cmd 和 zn.cmd(例如 npm.cmd install -g zn-gate),在命令提示符中运行命令,或者使用 Set-ExecutionPolicy -Scope CurrentUser RemoteSigned 为你的账户允许本地脚本。

如果遇到问题:

  • 出现 npx: command not found,或提示 Node.js 版本有问题:安装 Node.js 的 LTS 版本,打开新终端,然后重新运行命令。
  • 在 Windows 上出现“此系统禁止运行脚本”:请参阅上文的 PowerShell 说明。
  • init 只打印步骤,没有进行任何更改:这是 AI Agent 或脚本运行了它。请在自己的终端中手动运行。
  • check 显示 NOT protected:该行会说明原因以及要运行的命令。输出含义。
  • 想撤销 init 所做的更改:npx -y zn-gate init --revert。

然后将 .env 中的值保存在保险库中。 使用插件或钩子后,Agent 无法读取含真实值的 .env 文件;请将这些值移入 zn-gate 的加密保险库,文件中则保留 __ZN_STRIPE_KEY__ 之类的标记:

npx -y zn-gate unlock            # creates the vault the first time
npx -y zn-gate env shadow .env

完成后,你自己的应用也会读取 .env 中的标记:允许后,使用 zn-gate 的 run 命令启动应用一次即可(docs/secrets.md)。env shadow 会告诉你如何撤销此操作。

五分钟快速指南:docs/secrets.md。限制:docs/threat-model.md。不熟悉的术语:glossary。

其他安装方式:一次安装一个 Agent、其他编辑器、Python、仅 MCP 服务

一次安装一个 Agent(与 init 执行的步骤相同):

Claude Code:插件。 你还需要 Git 和 Claude Code 2.1.295 或更高版本。插件需要 Node.js 20.12 或更高版本。如果 Node.js 版本较旧,npx -y zn-gate init 会跳过插件,改为为 Claude Code 配置 zn 的钩子(如果已安装插件,zn-gate check 会说明);请更新 Node.js 以使用插件。

claude plugin marketplace add usezn/zn
claude plugin install zn-gate@usezn

之前运行过 zn hooks install claude-code?请先运行 zn hooks uninstall claude-code,否则两套钩子都会运行。

启动新的 Claude Code 会话。此后,Claude Code 将无法读取含真实值的 .env 文件和凭据文件;其工具返回内容中的机密会在模型看到之前被替换为标记或隐藏;粘贴到提示词中的机密会被拦截;Claude 还可以检查不可信文本中的提示词注入。未涵盖的范围:Claude Code 云端会话、Cowork 和聊天。详情:plugins/zn-gate。

Codex CLI、Cursor 或 OpenCode:钩子。

npm install -g zn-gate
zn hooks install codex           # or: cursor, opencode

在 Codex 中,使用 /hooks 批准新钩子。在 Cursor 中,shell 输出和文件内容不会被清理。各 Agent 支持的功能:docs/compat.md。

其他编辑器(VS Code、Antigravity、Windsurf、Cline、Zed、JetBrains、Continue):zn-gate 在这些编辑器中只能作为 MCP 服务运行。各编辑器的设置方法:usezn.com/docs/integrations/editors。

Python:适用于你自行构建的 Agent(用于 LangChain、CrewAI、LlamaIndex 或普通工具调用的规则引擎和机密信息隐藏功能)。它无法保护 Claude Code、Codex、Cursor 或其他编码 Agent。请在虚拟环境中安装;许多较新的 Linux 系统以及 macOS 上 Homebrew 提供的 Python 都会拒绝在虚拟环境之外执行 pip install(提示“externally-managed-environment”):

python3 -m venv .venv
.venv/bin/pip install zn-gate      # Windows: .venv\Scripts\pip install zn-gate

仅将 zn-gate 用作 MCP 服务(Agent 在需要时自行调用;不提供自动保护):

claude mcp add zn-gate -- npx -y zn-gate mcp     # Claude Code
codex mcp add zn-gate -- npx -y zn-gate mcp      # Codex CLI

Cursor(~/.cursor/mcp.json)和其他编辑器:{ "mcpServers": { "zn-gate": { "command": "npx", "args": ["-y", "zn-gate", "mcp"] } } }。OpenCode(~/.config/opencode/opencode.json):{ "mcp": { "zn-gate": { "type": "local", "command": ["npx", "-y", "zn-gate", "mcp"], "enabled": true } } }。

### 包装你已在使用的 MCP 服务

init 会在你的 Agent 配置文件中查找 MCP 服务、写入备份,并使用 zn-gate shield 包装每个本地(stdio)服务:

npx -y zn-gate init --dry-run   # preview, changes nothing
npx -y zn-gate init --wrap-mcp  # wrap (a .bak.<timestamp> copy is written first)
npx -y zn-gate init --shadow    # log detections without blocking
npx -y zn-gate init --revert    # restore the latest backup
Agent文件格式
Claude Desktopclaude_desktop_config.json(macOS ~/Library/Application Support/Claude/、Windows %APPDATA%\Claude\、Linux ~/.config/Claude/)mcpServers JSON
Claude Code~/.claude.json(用户级范围)mcpServers JSON
Cursor~/.cursor/mcp.jsonmcpServers JSON
Codex CLI~/.codex/config.toml(或 $CODEX_HOME/config.toml)[mcp_servers.<name>] TOML
OpenCode~/.config/opencode/opencode.jsonmcp JSON,command 数组
Antigravity~/.gemini/antigravity/mcp_config.json(Google 的 MCP 指南)和 ~/.gemini/config/mcp_config.json(共享设置,部分配置会使用);仅处理实际存在的文件mcpServers JSON
Hermes / PiAgent~/.hermes/mcp.jsonmcpServers JSON(尚未根据官方文档验证路径)

远程(URL)服务会保持原样。对于无法安全地读写往返的文件,init 绝不会重写:带注释的 OpenCode JSONC 文件和包含多行 args 的 Codex 条目会被报告为“手动包装”。

手动包装单个服务:

npx -y zn-gate shield -- uvx mcp-server-fetch

查看 zn-gate 做了什么

npx -y zn-gate report

查看这台电脑过去 7 天的简要摘要:被拦截的操作、被隐藏的密钥、新增的受保护 MCP 服务,以及等待你批准的工具变更。它只读取本地文件,无需账户,也不会发送任何内容。--since 30d 可更改时间范围,--json 会以脚本可用的格式输出。查看报告内容。

启用可选的云端检查

npx -y zn-gate connect

此操作是可选的,必须由你在自己的终端中亲自完成(Agent 无法代劳)。它会打开 usezn.com,让你创建仅用于分析的 API 密钥(该密钥无法读取你的使用情况或管理其他密钥),随后提示你在隐藏输入框中粘贴密钥。具有完整访问权限的密钥会被拒绝。密钥会保存在你的系统密钥链中(如果没有密钥链,则存入 zn 保管库),绝不会写入文件;zn 的钩子也会阻止 Agent 通过直接方式读取密钥。之后,你或 Agent 通过 analyze_prompt 发送的文本,在先移除检测到的密钥后,也会交由 usezn.com 上的 Galvanize 2 分类器检查。在你运行此操作之前,不会发送任何内容。zn-gate disconnect 会从这台电脑移除密钥,并询问是否也要在 usezn.com 上撤销密钥(默认选择否)。了解工作原理。

检查是否正常运行

npx -y zn-gate check

对于每个已为你的用户配置的 Agent,zn-gate 都会要求其钩子在临时文件夹中读取一个包含虚假密钥的 .env 文件和一个普通文件。它会显示会告知 Agent 的内容;如果某行显示 未受保护,则会说明如何修复。不会通过网络发送任何内容,也不会更改任何设置。了解输出含义。

npx -y zn-gate test

这会运行本地自检(51 个精选样例:26 个攻击样例、25 个良性样例),并显示这台机器上的每项判定延迟。这是冒烟测试,不代表检测率。不会通过网络发送任何内容。

开发者:手动查看脱敏效果。 将包含虚假 AWS 密钥(AWS 文档中的示例)和数据库密码的工具输出,通过 zn-gate 发送,发送方式与 Agent 使用时完全相同;然后查看输出中的 sanitized_content,该字段就是模型会看到的内容:

printf '%s\n' '{"jsonrpc":"2.0","id":1,"method":"tools/call","params":{"name":"check_tool_result","arguments":{"tool_name":"read_file","content":"AWS_ACCESS_KEY_ID=AKIAIOSFODNN7EXAMPLE\nDATABASE_URL=postgres://app:hunter2@db:5432/main"}}}' \
  | npx -y zn-gate@latest mcp

各部分的作用

Scrubber:让机密信息远离模型上下文

  • 当前:对所有经过 zn-gate 的内容(check_tool_result、check_tool_call,以及由 shield / init 包装的服务的输出)进行脱敏,包括 AWS 密钥、OpenAI 和 Anthropic 密钥、GitHub 令牌、JWT、私钥和数据库 URL 密码。
  • 当前未覆盖:Agent 内置的工具(例如 Claude Code 中原生的文件读取),除非它们的输出经过 zn-gate。
  • 规划中:个人数据(PII)检测;为 Agent 内置工具提供钩子;由本地加密保险库支持的稳定占位符。

Galvanize:提示词注入检测

  • 当前,本地:采用确定性规则引擎,并针对同形异义字符、零宽字符、双向文本覆盖(CVE-2021-42574)、注释拼接和 Base64 进行规范化处理。它会检查提示词、工具参数、工具输出和 MCP 工具描述。
  • 当前,可选云端:Galvanize 2 分类器(开放权重,Apache-2.0)也可以检查发送到 analyze_prompt 的提示词,但只有设置 ZN_CLOUD=1 和 ZN_API_KEY 时才会启用。
  • 规划中:在 zn-gate 内本地运行 Galvanize。

Scan:审计 Agent 即将信任的内容

  • 当前:npx -y zn-gate scan <path> 会审计提示词模板、AGENTS.md / SKILL.md 文件和配置,查找注入陷阱和泄露的机密信息。发现问题时会以代码 1 退出,适用于 CI。可在网页 usezn.com/scan 上检查 MCP 服务。
  • 规划中:在添加 MCP 服务和技能之前,通过命令行对其进行审计。
MCP 工具
工具阶段功能网络
analyze_prompt大模型调用前检查提示词中是否存在注入、越狱和数据外泄模式。仅在设置 ZN_CLOUD=1 和密钥时使用,且会进行脱敏
check_tool_call执行前检查工具名称和参数;返回将机密信息屏蔽后的 sanitized_arguments。从不
check_tool_result摄入前检查工具输出中是否存在间接注入;返回经过机密信息脱敏的内容,或在拦截时返回已中和的内容。从不
zn_status任意阶段显示引擎、规则版本,以及(如有)离开本机的数据。从不

哪些内容会离开你的设备

默认情况下,不会有任何内容离开。

数据处理位置会发送到任何地方吗?
工具输出(check_tool_result、shield)本地绝不会,任何配置下都不会
工具调用参数(check_tool_call、shield)本地绝不会,任何配置下都不会
MCP 工具和参数描述(shield)本地绝不会,任何配置下都不会
zn-gate 执行操作的计数(zn-gate stats:检查、拦截、替换的机密信息,以及按机密信息类型统计的数量)写入本地的 ~/.zn/stats.json绝不会,除非你开启 zn-gate stats share on:此时每天会发送一份报告,其中包含随机安装 ID、日期、zn-gate、OS 和 Node.js 版本、使用最多的 Agent 和 zn-gate 部分,以及按内置类型统计发现的机密信息数量(绝不包含值、提示词、变量或机密信息名称、路径、主机名或电子邮件地址)。zn-gate stats share show 会先显示报告内容。
提示词(analyze_prompt、zn-gate analyze)本地仅当你同时设置 ZN_CLOUD=1 和 ZN_API_KEY,或自行运行 zn-gate connect 时才会发送。发送前会在本地对机密信息进行脱敏。

单独设置 ZN_API_KEY 不会启用任何功能。另一种选择加入的方式是 zn-gate connect:你在自己的终端中运行该命令,它会将密钥保存在系统密钥链或 zn 保险库中,绝不会保存到文件(运行 zn-gate disconnect 可撤销连接;如果你确认,还可以在 usezn.com 撤销密钥;详情)。ZN_LOCAL_ONLY=true(或 --local-only)会覆盖 ZN_CLOUD=1 和已连接的密钥。npx -y zn-gate status 会显示当前启用的检测引擎,以及可选的云端检查是否开启。使用统计共享默认关闭,并有独立的状态查询命令:npx -y zn-gate stats share status。数据流示意图:仓库 README。

**1.4.0 及更早版本:**设置 ZN_API_KEY 后,本地未拦截的工具输出和工具调用参数会未经脱敏就发送到 api.usezn.com。1.4.1 移除了这条数据发送路径。请参阅 CHANGELOG。


性能(本地规则引擎,不联网)

测量日期为 2026-10-11,测试环境为 2 vCPU Intel Xeon Platinum 8259CL(AWS)、Node 24、zn-gate 1.4.1,输入未缓存。p50 为 3 次运行的中位数;p99 为 3 次运行中的最差值。

输入大小evaluate() p50evaluate() p99check_tool_result p50check_tool_result p99
200 B(典型提示词)0.012 ms0.09 ms0.045 ms0.19 ms
4 KB(典型工具输出)0.16 ms0.45 ms0.30 ms0.81 ms
64 KB(大型文件)2.4 ms4.8 ms3.8 ms6.7 ms

check_tool_result 包含机密信息脱敏。延迟大致随输入大小线性增长。在同一主机上,4 KB check_tool_result 的 MCP stdio 往返延迟 p50 为 0.5 ms。

在仓库中运行 node bench/bench_by_size.js 即可复现。欢迎把你的数据发给我们。

准确性:本地规则能检测什么,以及不能检测什么

本地引擎是一个确定性的特征签名和规范化层。它速度快、可解释,但不是语义分类器。

  • **自测:**51 个精选测试向量全部通过。这只是冒烟测试,并不代表检测率或误报率。
  • **已知局限:**对于完整源文件(check_tool_result 所看到的内容),规则可能会标记普通代码注释。1.5.0 减少了对代码和文档的误报,但代价是一些措辞较宽泛的覆盖尝试可能绕过本地规则。对于网页和第三方内容,优先使用 check_tool_result,而不是检查自己的仓库文件。
  • **检测率:**在包含 3,309 个示例的私有留出集上,Galvanize 2 的召回率为 83.4%,误报率为 0.81%(服务阈值为 0.662);这些数据针对云分类器,而非本地规则引擎。方法、各语言结果、已知薄弱环节和可复现的基准测试见模型卡和公告。它只是防御的一环,并非保证。

配置

  • ZN_CLOUD:设为 1 后,analyze_prompt / zn-gate analyze 也会查询云分类器。需要 ZN_API_KEY。默认关闭。
  • ZN_API_KEY:usezn.com/dashboard 中的 API 密钥。未设置 ZN_CLOUD=1 时无效。(zn-gate connect 会为你保存密钥并开启云端检查。)
  • ZN_LOCAL_ONLY:设为 true 后强制仅使用本地检查,即使设置了 ZN_CLOUD=1 也是如此。
  • ZN_STRICT:设为 1 后,也会拦截默认仅发出警告的规则(见下文)。
  • ZN_LONG_INPUT:指定如何将长文本(超过 1,000 个字符)发送给云分类器。windows(默认)会让分类器检查最多 20 个相互重叠的 512 词元窗口,避免漏掉长文档中间或末尾的注入内容;off 则只检查前 512 个词元。也可以使用 --long-input windows|off。窗口检查速度较慢,也稍微更容易将长篇无害文本标记出来;无论是否使用窗口,云端检查都按文本长度计费,因此 off 不会减少计费次数(最多 2,000 个字符时为 1 次调用,此后每增加 1,000 个字符再增加 1 次;结果中的 billed_calls);详见更新日志。
  • ZN_STAGE:v30(默认,当前生产 API)或 prod(旧版端点)。ZN_API_URL 可覆盖两者。
  • NO_COLOR(任意非空值)或 TERM=dumb:命令输出不显示颜色、符号或框线;状态词(ALLOWED、BLOCKED、PASSED 等)仍会显示。输出不是终端时也会关闭颜色。

要为某个 MCP 服务启用云端检查,请在其条目中添加:"env": { "ZN_CLOUD": "1", "ZN_API_KEY": "zn_live_..." }。

自定义规则(.znrules 或 zn.config.json)
# .znrules
path:.env.production
path:/etc/secrets
CONFIDENTIAL_INTERNAL_PROJECT_[A-Z0-9]+
本地审计日志

zn-gate shield 会将每项决策追加到 ~/.zn/evidence.jsonl,作为包含秘密信息脱敏预览的哈希链(SHA-256)记录。它可以检测意外或局部修改。但对于拥有该文件写入权限、能够重新计算整个哈希链的人来说,它无法防止篡改。

npx -y zn-gate evidence --verify
npx -y zn-gate evidence --ui        # local dashboard on http://localhost:3100
npx -y zn-gate evidence --tail 20

哪些内容会被拦截,哪些只会触发警告

zn-gate 会拦截几乎可以确定属于攻击或信息泄露的内容:读取凭据文件(.env、~/.aws/credentials、SSH 密钥),索要 API 密钥或密码,通过隐藏图片链接发送数据,在 Base64 或不可见字符中隐藏指令,“忽略之前的所有指令”,以及危险命令。

还有一些模式也会出现在普通文本中,例如 YAML 中的 system: 键、“绕过缓存”,或介绍什么是越狱的文章。对于这些内容,zn-gate 会放行,并附上一条简短警告(结果中的 advisory),以便你或你的 Agent 查看。

要拦截这些内容,请启用严格模式:设置 ZN_STRICT=1,或在项目的 zn.config.json 中添加 "strict": true,或在 .znrules 中添加一行 strict。

常见问题

我需要账号或 API 密钥吗? 不需要。所有本地功能都无需账号或密钥。

它会拦截合法内容吗? 有时会。在 init 或 shield 中使用 --shadow,即可在评估期间记录检测结果而不进行拦截。

如何移除它? npx -y zn-gate init --revert 会从备份中恢复你的配置。对于独立服务,请从 Agent 配置中移除 zn-gate 条目。

安全

请将漏洞报告发送至 [email protected]。相关政策和安全港说明:SECURITY.md。

许可证

MIT © usezn

此软件包包含 age-encryption(BSD-3-Clause)及其 @noble / @scure 依赖项(MIT);请参阅 THIRD_PARTY_NOTICES.md。

评论

支持 Markdown

第一次接触 MCP?

从协议是什么,到在客户端里装上第一个服务,这几条回答覆盖了大多数入门问题。

一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。