mcpField
S
Secret Sentinel

Secret Sentinel

本地服务
github.com/AleBrito124356安全31 周前更新

关于 Secret Sentinel

Secret Sentinel 是用于 AI 编码工作流的本地秘密扫描 MCP 服务、命令行工具和 Agent 钩子集合。它检测代码、Git 变更、提示词、工具调用及 Agent 配置中的凭据,并在内容进入会话记录前进行脱敏。

主要功能

  1. 0164 种秘密检测器并扫描 Base64
  2. 02扫描文件、目录、Git 变更和配置
  3. 03对文本及工具输出中的秘密脱敏
  4. 04钩子拦截风险提示词和工具调用
  5. 05本地运行,无需账户或网络请求

适用场景

  1. 01提交前检查暂存的变更
  2. 02审计 MCP 和 Agent 配置文件
  3. 03防止提示词中的凭据发送出去
  4. 04分享日志前对秘密进行脱敏

MCP 相关

MCP 服务提供扫描、脱敏和检测器列表工具,以及引导提示词和模式资源。扫描工具标记为只读,并返回结构化结果。

配置

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

mcp.json · 通用配置
{
"mcpServers": {
"alebrito124356-mcp-secret-sentinel": {
"command": "uvx",
"args": [
"mcp-secret-sentinel"
]
}
}
}
启动命令uvx mcp-secret-sentinel

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

安装包
pypimcp-secret-sentinel0.3.0

工具

9

收录的工具列表 · 更新于 1 周前

参数类型必填说明
textstring是
source_namestring否
max_findingsinteger否

详细介绍

mcp-secret-sentinel

tests Python 3.10+ MCP SDK 1.x | 2.x License: MIT

为 AI 编码 Agent 提供本地密钥防护。 这是一个 MCP 服务、命令行工具和 Agent 钩子,可在 API 密钥、令牌、私钥和密码离开设备之前,检测它们是否出现在代码、提交、提示词、工具调用和 MCP 配置中。包含 64 种检测器,支持识别 Base64 编码内容,并会对每项检测结果进行脱敏。无需账户,不会发起网络请求。

密钥很少是通过黑客攻击泄露的;它们通常通过提交泄露,如今也会通过 Agent 泄露。GitGuardian 的 State of Secrets Sprawl 2026 统计发现,2025 年公开 GitHub 上新增了 2,865 万个密钥(增长 34%),AI 服务密钥增加了 81%,MCP 配置文件中包含 24,008 个独立密钥,而且由 AI 编码助手共同编写的提交具有更高的泄露率。密钥一旦被粘贴到 .mcp.json、通过 cat .env 输出到对话记录,或被匆忙的 Agent 写入配置中,就会立即泄露,即使下一次提交将其删除也无济于事。

Secret Sentinel 会在这些时刻设置检查点:

时机防护方式
Agent 将密钥写入受版本控制的文件、shell 命令或 MCP 调用Agent 钩子会拒绝该工具调用(Claude Code、Codex、Cursor)
你将密钥粘贴到提示词中Agent 钩子会在提示词到达模型之前将其拦截
工具输出密钥(cat .env、配置读取、详细日志)Agent 钩子会将其替换为 [REDACTED:<detector>],避免模型看到密钥
密钥存在于 .mcp.json、claude_desktop_config.json、CLAUDE.md 等文件中**scan_agent_configs**会审计所有 MCP 客户端和 Agent 文件,并标记由 Git 跟踪的文件
即将发布包含密钥的提交或推送scan_git_staged / scan_git_range、pre-commit 钩子和 GitHub Action
需要共享日志或输出**redact_text**会屏蔽所有密钥,同时保留其他所有内容

完整的密钥值绝不会出现在任何输出中,因此也不会进入对话记录。

安装

Claude Code 插件(一步安装技能、Agent 钩子和 MCP 服务):

/plugin marketplace add AleBrito124356/mcp-secret-sentinel
/plugin install secret-sentinel@secret-sentinel

钩子会直接从插件检出目录运行,只需 Python 3.10+(仅使用标准库)。MCP 服务通过 uv 启动。

仅安装 MCP 服务(适用于任何 MCP 客户端):

claude mcp add secret-sentinel -- uvx mcp-secret-sentinel
{
  "mcpServers": {
    "secret-sentinel": { "command": "uvx", "args": ["mcp-secret-sentinel"] }
  }
}

命令行工具(Git 钩子、CI、脚本):使用 pipx install mcp-secret-sentinel 或 pip install mcp-secret-sentinel。若要运行 GitHub 上的最新代码而非 PyPI 版本,请使用 uvx --from git+https://github.com/AleBrito124356/mcp-secret-sentinel mcp-secret-sentinel。

仅安装 Agent 技能(Agensi、skills.sh,以及任何会读取 SKILL.md 的 Agent):技能位于 skills/secret-sentinel。它会告诉 Agent 何时进行扫描、如何修复检测结果,以及如何轮换已泄露的凭据;并会在可用时使用 MCP 工具或命令行工具。

Agent 钩子

mcp-secret-sentinel hook 从 stdin 读取一个 JSON 格式的钩子事件,并打印 Agent 的决策。插件会为你配置好;如果不使用插件:

mcp-secret-sentinel install-agent-hooks --agent claude              # .claude/settings.json (shared)
mcp-secret-sentinel install-agent-hooks --agent claude --scope local # .claude/settings.local.json
mcp-secret-sentinel install-agent-hooks --agent cursor              # .cursor/hooks.json

安装程序会合并到现有设置中,并保留其他所有钩子。再次运行时,它会刷新自己的条目,而不是重复添加。

Agent 事件行为
Claude Code / Codex 对 Write、Edit、MultiEdit、NotebookEdit、Bash、PowerShell 和 mcp__* 工具触发的 PreToolUse当新内容、命令或 MCP 参数中包含机密信息时,拒绝调用(permissionDecision: "deny",并附上已脱敏的原因和修复方法)。允许写入 Git 忽略的文件(例如本地 .env)以及任何仓库之外的文件:机密信息就应该存放在那里。已跟踪的 .env 仍会受到保护。对 .secret-sentinel.toml、基线或 [tool.secret-sentinel] 表的编辑会返回 "ask",因此受保护的 Agent 无法暗中放宽自身的防护。
UserPromptSubmit阻止提示词并设置 suppressOriginalPrompt,避免密钥在阻止消息中回显。
Read、Bash、PowerShell、Grep、WebFetch 和 mcp__* 工具触发的 PostToolUse返回 updatedToolOutput,保持原有结构并替换所有机密信息(私钥会整块替换,从头部到尾部),并附注提醒模型不要尝试恢复机密信息。
Cursor beforeShellExecution、beforeMCPExecution、beforeReadFile、beforeSubmitPrompt使用已脱敏的消息返回 permission: "deny" / continue: false。

默认情况下,钩子会阻止 high 和 critical 级别的发现项,并放行 medium 级别的发现项(JWT、高熵字符串);hook --fail-on medium 会采用更严格的策略。钩子会遵循 .secret-sentinel.toml 中排除的路径。无论控制台代码页如何,事件都会按 UTF-8 读取,因此 Windows 上带重音符号的项目路径也能正常工作。遇到任何意外情况(JSON 格式错误、配置损坏、内部错误)时,都会以非阻止状态安全放行,因此钩子绝不会卡住 Agent;除“不是仓库”以外的 Git 错误不会中止扫描。我们自己的 MCP 工具不受此限制,因为它们本来就是为了接收机密信息而设计的。

MCP 工具

工具参数返回值
scan_texttext、source_name="input"、max_findings=200原始片段(代码、配置、差异、日志)的发现项
scan_filepath、max_findings=200单个文件的发现项;根据 BOM 解码 UTF-8/16/32,跳过二进制文件和超过 5 MB 的文件
scan_directorypath、max_files=500、max_findings=200递归扫描。在 git 仓库中,文件列表由 git 本身提供(遵循每个 .gitignore、否定规则和全局排除规则)
scan_git_stagedrepo_path、max_findings=200仅扫描 git diff --cached 中新增的行:也就是下一次提交将发布的内容
scan_git_rangerepo_path、base="@{upstream}"、head="HEAD"、max_commits=200、max_findings=200扫描 base..head 中的提交:默认正好是下一次 git push 将发布的内容
scan_git_historyrepo_path、max_commits=50、all_branches=false、max_findings=200扫描最近 N 次提交新增的行(来自 HEAD,或每个分支、标签和暂存区),并为每项标记其提交
scan_agent_configsproject_path、include_user=true、include_transcripts=false、max_findings=200审计 MCP 客户端配置和 Agent 指令文件(见下文)
redact_texttext{"text", "redactions", "by_pattern"}:将所有密钥替换为 [REDACTED:<detector>] 后的文本
list_patterns—当前启用的检测器及其严重级别和修复建议,以及允许列表规则

每个工具都标记为只读(readOnlyHint,无开放世界访问权限),因此客户端可以直接运行,无需确认提示。扫描工具会发布 outputSchema 并返回 structuredContent(MCP SDK 1.10+ / 2.x)。该服务还提供三个提示词:pre_push_check、leak_response 和 audit_agent_configs,以及一个 secret-sentinel://patterns 资源。

所有扫描工具都返回相同的结构:

{
  "clean": false,
  "findings": [
    {
      "file": "config/notify.yaml",
      "line": 14,
      "pattern": "Slack incoming webhook",
      "severity": "high",
      "redacted": "hook…(77 chars)",
      "advice": "Anyone with this URL can post messages to your workspace. Regenerate the webhook in your Slack app settings and load the URL from an environment variable."
    }
  ],
  "files_scanned": 6,
  "summary": "Found 1 potential secret(s) across 6 scanned file(s): 1 high. Do NOT commit or push until these are removed or rotated."
}

如果行内注释抑制了发现项,则会添加 suppressed;如果基线接受了部分发现项,则会添加 baselined。**响应有上限:**每次扫描最多列出 max_findings 个发现项(默认值为 200,按严重程度从高到低排列;0 = 不设上限)。如果必须截断报告,会标记 truncated: true,并保留 total_findings、counts_by_severity、counts_by_pattern 和 top_files,避免结果繁杂的目录淹没 Agent 的上下文。

审计 Agent 和 MCP 客户端配置

scan_agent_configs(CLI:mcp-secret-sentinel agents [PROJECT])会检查:

  • 项目文件:.mcp.json、.claude/settings.json、.claude/settings.local.json、.cursor/mcp.json、.vscode/mcp.json、.vscode/settings.json、.gemini/settings.json、.codex/config.toml、.windsurf/mcp.json、.amazonq/mcp.json、.kiro/settings/mcp.json、.roo/mcp.json、opencode.json,以及 Agent 指令文件 CLAUDE.md、CLAUDE.local.md、AGENTS.md、GEMINI.md、.cursorrules、.windsurfrules、.github/copilot-instructions.md。每个文件都会报告是否受 git 跟踪。
  • 用户文件:Claude Code(~/.claude.json、~/.claude/settings.json、~/.claude/CLAUDE.md)、Claude Desktop、Cursor、VS Code、Cline、Windsurf、Gemini CLI、Codex、Amazon Q、Kiro、Continue、Zed、opencode、Goose 和 LM Studio。
  • 会话转录(可选):最新的 Claude Code 和 Codex *.jsonl 日志。如果在那里发现密钥,该密钥也已发送给模型提供商。

包含发现项的文件会附带 hint,说明相应客户端如何引用环境变量,而不是直接写入字面值。例如,在 Claude Code 的 .mcp.json 中使用 "env": {"API_KEY": "${API_KEY}"},或在 VS Code 中使用 ${input:...} 提示词。

检测内容

64 个正则检测器,外加熵检查和 Base64 解码:

类别检测器
AI 和 LLMOpenAI(sk-proj-、sk-svcacct-、sk-admin-、旧版)、Anthropic、xAI、DeepSeek 风格的 sk-<hex>、Perplexity、OpenRouter、Groq、NVIDIA、Hugging Face、Replicate、Together AI、Cerebras、AWS Bedrock API 密钥
LLM 工具LangSmith、Langfuse、Pinecone、Firecrawl、Tavily
代码托管与软件包GitHub(ghp_、gho_、ghu_、ghs_、ghr_、github_pat_)、GitLab(glpat-、glptt-、gldt-、glrt-)、npm、PyPI
云与基础设施AWS 访问密钥和秘密密钥、Azure 存储密钥、Google API 密钥和 OAuth 客户端密钥、DigitalOcean、Cloudflare、Vercel、Supabase(sb_secret_、sbp_)、Neon、PlanetScale、Fly.io、Databricks、HashiCorp Vault、Doppler
支付、消息传递与 SaaSStripe 实时密钥、Square、Shopify、SendGrid、Resend、Mailchimp、Twilio、Slack 令牌和 Webhook、Discord Webhook、Telegram 机器人、Linear、Notion、Atlassian、Postman、Sentry、Grafana、PostHog
密钥和令牌私钥块(RSA、EC、DSA、OPENSSH、PGP、加密格式)、age 秘密密钥、JWT
URL 中的凭据数据库和队列连接字符串(Postgres、MySQL/MariaDB、MongoDB、AMQP、Redis),以及包含 user:password@ 的 http(s)/ftp/smtp URL
通用带引号代码中的 password / secret / api_key / token 风格赋值,以及 dotenv 风格的 UPPER_CASE=value 行
  • 熵:分配给变量的、长度不少于 20 个字符的带引号字符串,经验熵至少为 4.5 位/字符,且没有特定检测器认领该片段时。
  • Base64:对长度不少于 20 个 Base64 字符(标准或 URL 安全格式)的字符串进行解码;如果解码结果是可打印文本,就再扫描一次。因此,可以检测到 Kubernetes Secret 清单、Basic 身份验证标头或编码 PEM 密钥中的凭据。检测结果会沿用内部检测器的名称,并附加 (base64)。
  • 格式来自 gitleaks、betterleaks 和 trufflehog 规则集。不会报告本就应公开的 sb_publishable_ 密钥。

对于 URL 中的凭据,报告的值是密码,允许名单也只检查密码:postgres://app:<literal>@${DB_HOST}/app 仍会被报告。

明确忽略的内容(允许名单)

报告候选值之前,会根据以下启发式规则进行检查:

  • 过短:少于 8 个字符的值。
  • 已遮蔽:至少 80% 为 X、x、* 或点号的值,包括供应商前缀后跟一串 XXXX… 的情况。
  • example、placeholder、changeme 和 your-…-here 标记,以及 <angle brackets>。
  • 模板:${VAR}、{{ jinja }}、{% … %}、<%= … %>、#{…}。
  • 变量引用:仅包含 $UPPER_CASE_VAR、$(command)、$env:VAR 或 %VAR% 的值。
  • 格式占位符:%(name)s 或 {name}。
  • 环境变量查找:引用 os.environ 或 process.env 的值。
  • 通用赋值和仅熵检测:代码而非字面值(os.getenv("X")、settings.DB_PASSWORD、SECRETS[0]、拼接表达式的一侧),形似正则表达式的值(^(Write|Edit)$、[a-z]{32}),不含凭据的普通链接、查询或片段,以及用于填充 Agent 配置的文件系统路径(C:\Users\...、~/...、/usr/local/...)。这些规则不适用于供应商格式。
  • 保留的文档主机名:凭据 URL 指向 example.com / .net / .org、*.example 或 .invalid。
行内抑制
TEST_DSN = "postgres://ci:ci-only-password@db:5432/test"  # secret-sentinel: ignore

detect-secrets 的 pragma: allowlist secret 和 gitleaks 的 gitleaks:allow 也有效,因此无需修改已为这些工具添加注释的文件。标记不区分大小写,仅作用于所在行,并适用于暂存和已提交的行。被抑制的检测结果会计入 suppressed,绝不会被悄悄隐藏。

项目配置

mcp-secret-sentinel init 会写入带注释的 .secret-sentinel.toml。相同的键也适用于 pyproject.toml 中的 [tool.secret-sentinel] 表。程序会从扫描路径向上查找该文件,直到仓库根目录,并将其应用于 CLI、MCP 工具和 Agent 钩子。

exclude_paths = ["tests/fixtures/**", "*.snap"]   # globs relative to this file; ** spans directories
allowlist = ["^sk_test_"]                         # regexes matched against the secret value
disable = ["JSON Web Token"]                      # detector names, "High-entropy string" included
baseline = ".secret-sentinel-baseline.json"       # optional

[[rules]]
name = "Acme internal token"
regex = 'acme_[a-f0-9]{32}'
severity = "critical"        # critical | high | medium
advice = "Revoke it in the Acme console."

未知键、未知检测器名称和无效正则表达式都会报错,并指出文件和键,因此拼写错误不会悄悄削弱扫描效果。自定义规则会在内置检测器之前运行,并在 SARIF 中作为独立规则显示。

基线

在现有仓库中采用扫描器,通常会发现少量已知问题(旧测试夹具、已撤销的密钥)。检查后,将它们加入基线:

mcp-secret-sentinel baseline          # writes .secret-sentinel-baseline.json

后续扫描只会报告不在基线中的密钥,并将其余项计入 baselined。文件会存储每个值的加盐 PBKDF2 指纹(绝不存储值本身,也绝不存储快速哈希),以及文件和行号,以便审查者查看。匹配时会忽略行号,因此代码周围内容移动后,已接受的值仍会被接受;私钥的检测标头对所有密钥都相同,因此还会将其与文件名关联。该文件会写入扫描程序查找的位置:配置中的 baseline 路径,否则写入项目根目录。请将其提交;scan --no-config 会忽略它。

命令行

不带任何参数运行 mcp-secret-sentinel 会启动 stdio 服务,因此 MCP 客户端配置只需一个词。使用命令时,它会变为 CLI:

mcp-secret-sentinel scan                       # the current directory
mcp-secret-sentinel scan src config/app.yaml   # files and directories
git diff | mcp-secret-sentinel scan -          # stdin
mcp-secret-sentinel scan --staged              # what the next commit would add
mcp-secret-sentinel scan --range               # what the next push would publish (@{upstream}..HEAD)
mcp-secret-sentinel scan --history 100 --all-branches
mcp-secret-sentinel scan --format sarif -o secrets.sarif
mcp-secret-sentinel redact app.log > app.redacted.log
mcp-secret-sentinel agents .                   # audit agent / MCP client configs
mcp-secret-sentinel install-hook               # git pre-commit hook
mcp-secret-sentinel install-agent-hooks --agent claude
mcp-secret-sentinel baseline
mcp-secret-sentinel init
mcp-secret-sentinel patterns                   # detectors, allowlist rules, suppression markers
$ mcp-secret-sentinel scan src
src/billing.py:2  [critical] Stripe live key  sk_l…(32 chars)
    Roll the key in the Stripe Dashboard (Developers -> API keys). Live keys grant access to real payment data.
src/notify.py:3  [high] Slack incoming webhook  hook…(69 chars)
    Anyone with this URL can post messages to your workspace. Regenerate the webhook in your Slack app settings and load the URL from an environment variable.

Found 2 potential secret(s) across 2 scanned file(s): 1 critical, 1 high. Do NOT commit or push until these are removed or rotated.
选项(scan)含义
--format text|json|sarif人类可读报告(默认)、MCP JSON 报告或 SARIF 2.1.0
--fail-on critical|high|medium使退出状态为 1 的最低严重性(默认 medium,即任何发现)
--max-findings N最多列出 N 项发现,按严重性从高到低排列(默认 200;0 = 不限;除非设置此项,否则 SARIF 会列出所有项)
--max-files N目录扫描达到 N 个文件后停止(默认 5000)
--max-commits N配合 --range:最多扫描最新的 N 个提交(默认 200)
--config FILE / --no-config使用指定配置,或忽略配置和基线
--baseline FILE接受 FILE 中记录的发现
-o, --output FILE将报告写入文件;单行摘要会写入 stderr

退出状态: 0 表示干净(或仅有低于 --fail-on 的发现),1 表示存在达到或高于 --fail-on 的发现,2 表示用法错误(选项错误、缺少路径、不是 git 仓库、修订版本未知、配置损坏)。所有格式的输出都会经过脱敏处理。

使用 git 钩子阻止提交
mcp-secret-sentinel install-hook            # in the repository, or: install-hook path/to/repo

这会写入 .git/hooks/pre-commit(或 core.hooksPath 指定的目录)。钩子会使用安装它的 Python 运行 scan --staged,因此暂存内容中包含密钥时会拒绝提交;git commit --no-verify 可跳过一次。除非传入 --force,否则安装程序不会覆盖其他工具的钩子;传入该参数时,会将旧钩子保留为 pre-commit.bak。

使用 pre-commit 框架:

repos:
  - repo: https://github.com/AleBrito124356/mcp-secret-sentinel
    rev: v0.3.0
    hooks:
      - id: secret-sentinel
GitHub Action
name: secrets
on: [push, pull_request]
jobs:
  scan:
    runs-on: ubuntu-latest
    permissions:
      contents: read
      security-events: write   # for the SARIF upload
    steps:
      - uses: actions/checkout@v4
      - uses: AleBrito124356/[email protected]
        with:
          fail-on: high          # critical | high | medium
          # range: origin/main..HEAD   # scan only new commits (checkout with fetch-depth: 0)
          use-config: ${{ github.event_name != 'pull_request' }}  # a PR could edit the config

该 action 会向代码扫描写入经过脱敏处理的 SARIF 报告(每个检测器对应一条规则,并包含 security-severity),将文本报告放入作业摘要,并在发现达到或高于 fail-on 时使步骤失败。若扫描无法运行(范围错误、浅克隆、配置损坏),则会以独立错误失败,而不会将其报告为发现。CLI 中的 --format sarif 会为其他 CI 生成相同的 SARIF 2.1.0 日志。

工作原理

flowchart TD
    A[Agent hook, MCP tool or CLI] --> B{Source}
    B -->|text / file| C[Decode by BOM, split on newline only]
    B -->|directory| D[git ls-files, or a walk outside git;<br/>skip caches, envs, binaries, lockfiles,<br/>config excludes] --> C
    B -->|staged / range / history| E[git diff / git log -p, zero context,<br/>diff config overridden, no external programs] --> P[Hunk-counting parser:<br/>added lines, real paths, commit tags] --> C
    C --> S{Inline marker?}
    S -->|yes| U[Counted in suppressed]
    S -->|no| F[Custom rules, then 64 detectors;<br/>specific patterns claim spans first]
    F --> G[Base64 runs decoded and rescanned]
    G --> H2[Entropy >= 4.5 bits/char on<br/>assigned strings of 20+ chars]
    H2 --> H{Allowlist: placeholders, templates,<br/>variables, code, regexes, config allowlist}
    H -->|placeholder| I[Dropped]
    H -->|real candidate| BL{In the baseline?}
    BL -->|yes| BB[Counted in baselined]
    BL -->|no| J[Redact: at most 4 chars and<br/>a quarter of the value, + length]
    J --> K[Report, SARIF, hook decision<br/>or REDACTED marker]
编码和行号

文件会在二进制检查前按字节顺序标记(UTF-8、UTF-16 LE/BE、UTF-32)解码,也能识别没有 BOM 的 UTF-16,因此会扫描 Windows PowerShell 5.1 的 > 和 Out-File 输出,而不是跳过。行只按 \n 拆分,因此行内的换页符、\x85、U+2028 和 U+2029 都不会导致报告的行号偏移。

脱敏保证

每条发现最多显示前 4 个字符,且不超过值长度的四分之一,并附上总长度:"hook…(77 chars)"、"Tr…(8 chars)"。完整值绝不会出现在输出、对话记录、钩子决策或日志中。代码中通过单一的 redact() 入口强制执行这一保证;测试套件也会断言原始值不会出现在序列化结果、钩子决策和真实的 MCP stdio 流量中,包括结构化内容。

Git 扫描读取文本,不受你的 diff 设置影响

Git 工具会解析 git diff / git log -p 的输出,而本地设置可能会改变这些输出:外部 diff 工具会替换 diff,diff.mnemonicPrefix 或 diff.noprefix 会破坏文件名。因此,每次 Git 调用都会传入 --no-ext-diff --no-textconv --src-prefix=a/ --dst-prefix=b/ -U0 --inter-hunk-context=0 --no-color,通过 -c 覆盖 core.quotePath、core.fsmonitor、diff.noprefix、diff.mnemonicPrefix、diff.relative、diff.submodule、log.showSignature 和 log.showRoot,移除 GIT_EXTERNAL_DIFF / GIT_DIFF_OPTS,不使用可选锁,关闭 stdin,并拒绝以 - 开头的修订版本。Diff 解析器是由区块行数驱动的状态机,因此,内容中新增的 +++ something 行会被视为内容,而不会被误认为文件头。

限制

  • 基于正则检测,而非验证:不会向提供方核对发现的内容(否则会将你的密钥发送到网络)。gitleaks、betterleaks 或 trufflehog 等专用扫描器拥有数百条规则,并可选择实时验证,也应纳入你的流水线;这是 Agent 在提交尚未生成前运行的快速本地检查点。
  • 在 Git 之外,只应用简单的根目录 .gitignore 模式(不支持取反、** 或嵌套文件)。在 Git 工作树内,文件列表由 Git 提供,且会应用所有规则。
  • 熵检测需要足够的多样性:候选值至少需要包含 23 个不同字符,才能达到每字符 4.5 位。较短的随机字符串则由正则检测器覆盖。
  • 未加引号的通用赋值仅会在 dotenv 风格的 UPPER_CASE=value 行中检测,这是为减少误报而有意作出的权衡。
  • 逐行匹配:跨行拆分的密钥只会通过其首行检测(例如 BEGIN PRIVATE KEY 标头)。Base64 只解码一层。
  • 行内抑制仅限同一行,因为在零上下文 diff 中,上一行通常不可见。
  • 不会对合并提交进行 diff(这是 Git 的 git log -p 默认行为),因此,只有在解决冲突时引入的密钥会被范围扫描和历史扫描漏掉;scan_git_staged 仍会在创建合并提交前发现它。
  • 不会扫描 Git 中的二进制文件;摘要会按名称列出这些文件。
  • Cursor 钩子支持遵循 Cursor 发布的钩子协议;Claude Code 的钩子协议则通过真实管道上的端到端测试覆盖。

开发

git clone https://github.com/AleBrito124356/mcp-secret-sentinel
cd mcp-secret-sentinel
pip install -e ".[dev]"
python -m pytest

在源代码树中,运行 python -m mcp_secret_sentinel 可启动 CLI(不带参数时启动 MCP 服务)。core.py、config.py、agents.py 和 hooks.py 仅使用标准库;server.py 包含 MCP 接线代码。

测试套件中绝不包含真实形式的密钥字面值:每个正向测试样例都会在运行时通过拼接构造,且测试会扫描此代码库并要求扫描结果干净。测试覆盖每个检测器、允许列表、Base64 解码、熵、脱敏、编码、行号、针对真实仓库的 Git 解析、作为子进程运行的 CLI、钩子决策(包括通过插件的 shell 启动器运行)、Agent 配置审计、配置和基线,以及通过 SDK 自带客户端与 MCP 服务进行真实 stdio 通信(包括结构化输出)。CI 会在 Linux、Windows 和 macOS 上运行测试,使用 Python 3.10 至 3.13,并覆盖 MCP SDK 的两个主版本。

相关 MCP 服务

这是一个轻量、依赖极少的 MCP 服务系列之一:

许可证

MIT

评论

支持 Markdown

第一次接触 MCP?

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

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