mcpField
S
Secrets-LE

Secrets-LE

本地服务
letools.dev安全12 天前更新

关于 Secrets-LE

Secrets-LE 在源代码、配置和文本文件中查找疑似硬编码凭据,并可在编辑器中将其替换为占位符。扫描器按模式识别多类密钥和令牌,结果会遮蔽凭据值,适用于本地检查和 CI 安全检查。

主要功能

  1. 01识别密钥、令牌、密码和私钥
  2. 02按文件分组并标注位置
  3. 03结果中遮蔽凭据值
  4. 04编辑器内清理当前文件
  5. 05提供 CLI 与 MCP 接口

适用场景

  1. 01提交前检查工作区中的凭据
  2. 02在 CI 中扫描代码仓库
  3. 03定位并清理活动文件中的密钥

MCP 相关

MCP 服务通过 stdio 提供 detect_secrets,分析调用方提供的文本并返回类型、置信度、键名和位置;不会返回凭据值,也不会读取文件或发起网络请求。

配置

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

mcp.json · 通用配置
{
"mcpServers": {
"nolindnaidoo-secrets-le": {
"command": "npx",
"args": [
"-y",
"secrets-le-mcp"
]
}
}
}
启动命令npx -y secrets-le-mcp

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

安装包
npmsecrets-le-mcp2.5.0

工具

1

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

参数类型必填说明
contentstring是要扫描的文本。
maxResultsinteger否返回的问题数上限(默认 500)。meta.truncated 报告是否有结果被省略。
sensitivityenum否要报告的发现项:"low" 报告所有匹配项,"medium"(默认值)会排除低置信度项,"high" 仅保留高置信度项。low | medium | high
includeTokensboolean否包含令牌检测器。
includeApiKeysboolean否包含 API 密钥检测器。
includePasswordsboolean否包含密码检测器。
includePrivateKeysboolean否包含私钥检测器。

详细介绍

Secrets-LE 标志

Secrets-LE:轻松检测机密

查找工作区中的硬编码凭据,并就地将其脱敏
API 密钥、令牌、密码、私钥——100% 本地运行,不会有任何内容离开你的设备

从 VS Code Marketplace 安装 Open VSX 下载量 npm 上的 secrets-le-mcp npm 上的 secrets-le crates.io 上的 secrets-le LE Tools


VS Code 中的 %manifest.ext.name%

觉得有用? 点赞或评分能帮助其他开发者发现它—— ★ GitHub · ★ Open VSX · ★ Marketplace

功能简介

打开工作区,运行 Secrets-LE: Detect Secrets,每个检测到的机密都会出现在结果文档中——按文件分组,并标出指向机密值本身的行号和列号。运行 Secrets-LE: Sanitize Secrets,即可将当前文件中的机密替换为占位符。可在 VS Code 以及 Cursor、VSCodium 等基于 VS Code 的编辑器中使用(可从 Open VSX 安装)。

检测基于正则表达式,针对每个文件的完整文本进行,因此适用于任何文本格式——代码、配置、.env 文件、YAML、JSON、日志。这是一道提交前的安全防线,并非万无一失:基于模式构建的扫描器可能会漏掉机密,也可能将非机密误判为机密。请检查检测结果。

安装

平台功能安装
VS Code在编辑器中检测并就地脱敏Marketplace
Cursor、VSCodium、Windsurf相同的扩展Open VSX
终端或 CI 步骤对整个目录树运行相同的扫描,并返回退出码cargo install secrets-le · crates.io
通过 Node 使用终端相同的命令行,与 Rust 版本逐字节保持一致npx secrets-le · npm
通过 Node 使用任意 MCP Agent通过标准输入输出运行 detect_secretsnpx secrets-le-mcp · npm

在 AI Agent 中使用

同一引擎也可作为 MCP 服务运行,因此 Agent 可以直接调用它,而不必由你运行命令。

编辑器方法
VS Code 1.101+无需安装 — 此扩展会在 Agent 模式下注册 detect_secrets
Claude Codeclaude mcp add secrets-le -- npx -y secrets-le-mcp
Cursor、Windsurf 及其他工具将其指向 npx secrets-le-mcp

Claude Code 中的 Agent 调用 secrets-le MCP 服务

detect_secrets(content, sensitivity?, includeApiKeys?, includePasswords?, includeTokens?, includePrivateKeys?, maxResults?)

每条发现都会报告其类型、置信度、键名和从 1 开始的位置。绝不会返回值 — 预览内容会被截断并标注长度,上下文行中的密钥也会被遮蔽,因此无需让凭据离开发现它的机器,就能定位发现项。

服务接收内容并返回数据 — 不会读取文件,也不会自行发起网络请求。它以 secrets-le-mcp 的名称发布在 npm 上,并以 io.github.nolindnaidoo/secrets-le 的名称发布在 MCP 注册表中。

手动配置 — 任何带有 MCP 配置文件的宿主

大多数宿主都读取 JSON 配置。添加一条配置项:

{
  "mcpServers": {
    "secrets-le": {
      "command": "npx",
      "args": ["-y", "secrets-le-mcp"]
    }
  }
}

-y 会跳过首次运行时的安装提示。如果你不想跟踪版本更新,可以固定版本 — [email protected]。

不想每次启动都通过 npx 运行?可以安装一次,然后指向该二进制文件:

npm install -g secrets-le-mcp
{
  "mcpServers": {
    "secrets-le": { "command": "secrets-le-mcp" }
  }
}

它通过 stdio 使用 MCP 通信,无需环境变量、API 密钥或自身配置。将其接入任何工具之前,可以先进行检查:

echo '{"jsonrpc":"2.0","id":1,"method":"tools/list"}' | npx -y secrets-le-mcp

这会打印工具列表并退出 — 如果看到 detect_secrets,说明服务运行正常。

## 扫描文件夹或工作区

Detect 从磁盘读取文件,并按文件分组生成一份报告。

  • 整个工作区:从命令面板运行 Secrets-LE: Detect Secrets。
  • 单个文件夹:在资源管理器中右键单击该文件夹并选择 Detect Secrets in Folder,或运行 Secrets-LE: Detect Secrets in Folder 并选择一个文件夹。
# Secrets Detection Results

⚠️ Found 2 potential secret(s):

## 📄 .env (1 secret(s))

### PASSWORD (1)

- Line 1, Column 19
  Key: database_password
  Type: Password
  Confidence: high
  Value: hunter2… (14 chars)
  Context: DATABASE_PASSWORD=hunter2… (14 chars)

## 📄 src/config.ts (1 secret(s))

### API-KEY (1)

- Line 1, Column 17
  Key: apikey
  Type: Generic API key
  Confidence: high
  Value: sk_demo_… (40 chars)
  Context: const apiKey = "sk_demo_… (40 chars)";


---

# Warnings

- Not read: dependency folders, build output, caches and lockfiles; images, fonts, archives and other binary files; 1 file(s) ignored by .gitignore. The `secrets-le.workspace.*` settings change this.

扫描会读取哪些内容。 文件从磁盘读取,因此未保存的编辑内容不会被检测到。超过安全大小限制的文件,或非 UTF-8 文本文件,不会被读取。扫描最多处理 10,000 个文件或列出 10,000 个机密。报告末尾会逐项列出被跳过的内容。

即使 .gitignore 忽略了 .env 文件,扫描也会读取它们。 项目会在这些文件中保存机密,而运行此工具的目的就是检查这些内容。默认情况下,scanAlwaysInclude 包含 **/.env 和 **/.env.*。将其清空即可让 .gitignore 决定是否跳过这些文件。

跳过文件的扫描不能证明没有机密。 依赖项文件夹、.gitignore 忽略的其他文件或二进制文件中的机密不会被报告。要检查所有内容,请关闭这三个开关。

扫描会跳过哪些内容,以及如何更改。 默认情况下,三个开关均已开启,可分别在设置中关闭:

开关跳过的内容
scanUseDefaultExcludes依赖项文件夹、构建输出、工具缓存和锁文件。完整列表见下文
scanRespectGitignore项目的 .gitignore 文件所忽略的内容
scanSkipBinaryFiles图片、字体、归档文件及其他非文本文件

两个列表可以在不关闭开关的情况下调整扫描结果。要跳过更多内容,请在 scanExcludes 中添加模式。要读取开关原本会跳过的内容,请将其添加到 scanAlwaysInclude:

{
	// Also skip the test fixtures.
	"secrets-le.workspace.scanExcludes": ["**/fixtures/**"],
	// Keep reading .env files, and read the vendored code as well.
	"secrets-le.workspace.scanAlwaysInclude": ["**/.env", "**/.env.*", "**/vendor/**"]
}

Secrets-LE: Open Settings 会在设置编辑器中打开以上所有设置。

内置列表

文件夹(无论出现在哪里):

.git、.hg、.svn、node_modules、bower_components、jspm_packages、.pnpm-store、.yarn、vendor、site-packages、Pods、Carthage、dist、build、out、target、_build、_site、dist-newstyle、zig-out、storybook-static、cdk.out、DerivedData、CMakeFiles、.next、.nuxt、.output、.svelte-kit、.angular、.astro、.docusaurus、.vuepress、.expo、.turbo、.parcel-cache、.cache、.sass-cache、.jekyll-cache、.dart_tool、.pub-cache、.gradle、.kotlin、.cxx、.externalNativeBuild、captures、ephemeral、.symlinks、.swiftpm、.build、.bundle、.stack-work、.zig-cache、.godot、elm-stuff、.vercel、.netlify、.serverless、.aws-sam、.terraform、.venv、venv、__pycache__、.tox、.nox、.mypy_cache、.pytest_cache、.ruff_cache、.ipynb_checkpoints、.eggs、coverage、htmlcov、.nyc_output、.vscode-test、.idea、.vs、xcuserdata、*.egg-info

文件(无论出现在哪里):

*.min.js、*.min.css、*.map、*.snap、*.lock、package-lock.json、pnpm-lock.yaml、npm-shrinkwrap.json、go.sum、*.pbxproj、*.iml、local.properties、output-metadata.json、.flutter-plugins、.flutter-plugins-dependencies、.packages、Generated.xcconfig、flutter_export_environment.sh、GeneratedPluginRegistrant.*、fastlane/report.xml、fastlane/test_output/**、doc/api/**

以下内容未列入,因为它们在许多项目中都是普通文件夹:bin、obj、tmp、logs、public、generated。如果项目会生成这些内容,通常会在 git 中忽略它们,而扫描会读取 .gitignore。

在“问题”面板中查看。 开启 secrets-le.workspace.scanProblemsEnabled 后,每个机密也会在所在行显示为警告。每次扫描都会替换上一次扫描的结果。消息会指出机密的类型,但不会显示其值。

影响扫描的设置位于设置中。

命令行工具

同样的检测也可在终端或 CI 步骤中运行:Rust 命令行工具位于 crate/,并与扩展共用同一张模式表 —— crate/signatures/patterns.toml —— 因此,两者对凭据的判定永远一致。同一命令行工具也以 secrets-le 的形式发布在 npm 上,供安装了 Node 但没有 Rust 的机器使用;CI 会在三种 操作系统上逐字节比对它与 crate,确保完全一致。

secrets-le .                        # scan a tree
secrets-le --sensitivity high .     # only high-confidence findings
secrets-le --no-ignore --hidden .   # reach .env and everything git ignores
secrets-le mcp                      # the same detection over MCP on stdio

终端中的 secrets-le

从 npm 安装 (secrets-le) 或从 crates.io 安装 (secrets-le)。两种方式都会安装同一个 secrets-le 命令。

npm 上的 secrets-le crates.io 上的 secrets-le

npm install -g secrets-le   # or run it once: npx secrets-le
cargo install secrets-le

退出代码就是答案:0 表示未发现任何内容 · 1 表示发现问题 · 2 表示问题格式错误——因此,secrets-le . 可直接用作 CI 步骤。

它绝不会打印凭据。 扫描器的输出会进入 CI 日志,而日志会被归档,通常所有人都可读取,且留存时间比密钥更长;如果扫描器打印出发现的内容,就会让这些内容比提交本身暴露得更广。预览内容最多显示 8 个字符,且不超过值长度的一半;上下文行会经过遮蔽,也没有任何标志可以更改这些限制。扩展负责修复发现的问题;二进制工具只负责报告。

检测内容

共 34 种模式,定义于 crate/signatures/patterns.toml——这是两个前端都会加载的同一张表。

类别类型
已命名发行方Anthropic sk-ant-、OpenAI sk-/sk-proj-、xAI xai-、Groq gsk_、Hugging Face hf_、Replicate r8_、GitHub ghp_/gho_/ghu_/ghs_/ghr_/github_pat_、GitLab、Slack xox?- 和 webhook URL、Discord webhook URL、Stripe sk_/rk_ 实时和测试密钥及 whsec_ webhook 密钥、Google AIza… 和 OAuth 客户端密钥 GOCSPX-、Linear lin_api_、DigitalOcean dop_v1_/doo_v1_/dor_v1_、Doppler dp.pt./dp.st.、SendGrid、Mailgun、Sentry、npm、PyPI、Docker Hub、HashiCorp Vault、Terraform Cloud、Supabase、Shopify、Square、Azure SAS
云凭据AWS Access Key ID(AKIA…,无需密钥名称)、AWS Secret Access Key、Azure 账户密钥、GCP/Google Cloud 密钥
令牌通用令牌、Bearer 令牌、访问令牌/刷新令牌、OAuth 令牌、JWT(基于密钥或裸 eyJ… 格式)
密码password/passwd/pwd 值,包括复合键(DATABASE_PASSWORD)
私钥多行 PEM 块——RSA/EC、OpenSSH、PGP
连接数据嵌入 user:pass@ 凭据的数据库 URL、连接字符串、会话 ID、Cookie

基于密钥的模式支持带引号和不带引号的键,因此 JSON("apiKey": "…")、YAML(api_key: …)、env(API_KEY=…)和代码(apiKey = '…')都能匹配。

有意不检测的内容:模板占位符(${VAR}、{{var}}、<your-key>、xxxxxxxx)、版本号以及仅仅看起来像点分格式的主机名(1.2.3 不是 JWT)、GCP 项目 ID(这是标识符,不是凭据),以及不含嵌入式凭据的数据库 URL。

已知限制:检测基于模式——经过混淆、拆分或命名不符合常规的密钥会被漏掉;标头不是标准 Base64 JSON(eyJ…)的 JWT 会被漏掉;没有可识别键名或前缀的高熵字符串不会被报告。

命令

命令描述
Secrets-LE: Detect Secrets扫描工作区并打开结果文档
Secrets-LE: Detect Secrets in Folder对单个文件夹执行相同操作。也可在资源管理器中的文件夹上使用
Secrets-LE: Sanitize Secrets替换活动文件中检测到的密钥(会先请求确认)
Secrets-LE: Open Settings打开 Secrets-LE 设置
Secrets-LE: Help内置文档

默认情况下,没有命令绑定快捷键。可在编辑器的 键盘快捷方式 中为任意命令设置快捷键。

设置

设置默认值描述
secrets-le.detection.sensitivitymediumlow 会报告所有内容,medium 会过滤低置信度匹配项,high 仅保留高置信度匹配项
secrets-le.detection.includeApiKeystrue检测 API 密钥和云凭据
secrets-le.detection.includePasswordstrue检测密码
secrets-le.detection.includeTokenstrue检测令牌和 JWT
secrets-le.detection.includePrivateKeystrue检测 PEM 私钥块
secrets-le.sanitization.replaceWith***REDACTED***Sanitize 使用的替换文本
secrets-le.workspace.scanPatterns["**/*"]文件夹或工作区扫描时读取的文件
secrets-le.workspace.scanUseDefaultExcludestrue跳过依赖项文件夹、构建输出、缓存和锁文件
secrets-le.workspace.scanRespectGitignoretrue跳过项目的 .gitignore 文件指定的内容
secrets-le.workspace.scanSkipBinaryFilestrue跳过图片、字体、压缩包和其他非文本文件
secrets-le.workspace.scanExcludes[]以 glob 模式指定更多要跳过的文件
secrets-le.workspace.scanAlwaysInclude["**/.env", "**/.env.*"]即使上述三项设置会跳过,也要读取这些文件
secrets-le.workspace.scanMaxFiles10000单次扫描读取的文件数上限
secrets-le.workspace.scanMaxResults10000单次扫描停止读取前列出的密钥数上限
secrets-le.workspace.scanProblemsEnabledfalse也在问题面板中显示扫描发现的密钥
secrets-le.safety.enabledtrue为超大文件设置防护措施
secrets-le.safety.fileSizeWarnBytes1000000跳过或拒绝超过此大小的文件
secrets-le.dedupeEnabledfalse在结果中合并值和类型相同的检测项
secrets-le.showPositionstrue显示发现的每个密钥所在的行和列
secrets-le.copyToClipboardEnabledfalse同时将结果复制到剪贴板
secrets-le.clipboardIncludesPositionstrue在复制内容中包含行和列
secrets-le.openResultsSideBySidetrue在当前编辑器旁打开结果
secrets-le.notificationsLevelimportantall = 每条通知,important = 警告 + 错误,silent = 仅错误
secrets-le.statusBar.enabledtrue显示状态栏项
secrets-le.telemetryEnabledfalse仅本地事件日志(参见隐私)

语言

除英语外,支持 12 种语言:

德语 · 西班牙语 · 法语 · 印度尼西亚语 · 意大利语 · 日语 · 韩语 · 葡萄牙语(巴西) · 俄语 · 乌克兰语 · 越南语 · 简体中文

这两部分均已覆盖——清单(命令标题、设置名称和描述),以及扩展运行时显示的所有内容(通知、状态栏、快速选择项和提示词)。扩展会使用 VS Code 的显示语言,因此会与编辑器当前设置的语言一致;无需单独设置。

隐私与安全

  • 不访问网络。 此扩展绝不会向任何地方发送数据。telemetryEnabled 设置只会将事件写入本地输出通道,供你查看(Secrets-LE Telemetry)。
  • MCP 服务绝不会返回秘密信息。 它的输出会发送给调用它的任何模型,因此预览内容会截断并标注长度,周围的上下文行也会经过遮蔽,使用的正是报告中相同的 utils/mask 辅助函数。没有任何参数可以关闭此功能;如果响应中出现任何值,构建检查就会失败——我们曾故意让工具泄露信息,并观察构建检查成功拦截。
  • 错误通知会在显示前遮蔽主目录路径和类似凭据的片段。
  • Sanitize 始终会在编辑文件前请求确认,且编辑是普通的、可撤销的文档编辑。
  • 评分提示最多出现两次。 第 3 次成功使用时,扩展会询问你是否愿意评分;如果你选择 稍后 或关闭提示,则会在第 20 次使用时再询问一次。选择 不再询问 后,提示便会结束。将 notificationsLevel 设为 important 或 silent 也会关闭提示。次数保存在 VS Code 的扩展存储中,不会发送到任何地方;选择 评分 会在浏览器中打开你安装时使用的列表页面——VS Code Marketplace 或 Open VSX。

文档

内容位置
工具可以说什么——范围、输出约定、拒绝事项、非目标crate/SPEC.md
扩展的构建与内部构成——架构、不变量、工具链、发布AGENTS.md
CLI 的构建与内部构成crate/AGENTS.md
变更内容CHANGELOG.md · crate/CHANGELOG.md
此工具的页面,以及另外 15 个工具letools.dev/tools/secrets-le

性能

输入大小发现数量用时速率扫描速度
含凭据的源码1.97 MB40,000132.32 ms302,301/sec14.9 MB/s
干净的源码1.92 MB070.88 ms—27.2 MB/s
Env 文件0.60 MB021.88 ms—27.4 MB/s

在 Apple M5 Pro、24 GB RAM、Node 24.3.0 上预热后运行 7 次所得的中位数。输入由 scripts/benchmark.ts 生成,并未提交到代码库,因此上述大小与实际测量值 完全一致。运行 bun run benchmark 可复现。

这些数据因机器而异,不会作为 CI 的断言——以基准测试结果作为构建门槛, 只能说明运行器当时有多忙。

测试

指标覆盖率
语句86.89%
分支78.60%
函数86.45%
行88.49%

24 个文件中共有 412 个测试用例,另有一个在真实 VS Code 扩展宿主中运行的集成测试套件, 以及一个将构建好的 .vsix 安装到干净配置文件中的端到端测试。

数据由 scripts/coverage-readme.js 根据实际运行结果——coverage/coverage-summary.json 和 coverage/test-results.json——生成;如果此部分内容发生偏差,CI 就会失败。运行 bun run test:coverage 可复现,测试 用例数以 vitest 打印的数字为准。

LE 系列的更多工具

为每个模型眼前的工作打造的 16 款单一用途工具。每款都附带一个 Rust CLI 和一个 MCP 服务。一页尽览:letools.dev

提取

  • String-LE — 提取代码库中的所有字符串,方便人工阅读
  • Numbers-LE — 提取代码库中所有硬编码数字,方便人工检查
  • Units-LE — 提取所有带单位的数量并统一格式,遇到含义不明确的数量时会按名称拒绝处理
  • Dates-LE — 提取所有日期和时间戳,并给出每个日期和时间戳解析出的确切时刻
  • IDs-LE — 提取所有 UUID、ULID、NanoID、ObjectId 和 Snowflake,并解码其中的时间
  • IPs-LE — 提取所有 IP 地址、CIDR 网段和 MAC 地址,统一格式并按范围分类
  • URLs-LE — 提取代码库中的所有 URL,并给出协议和确切位置
  • Paths-LE — 提取代码库中的所有文件路径,并说明它们是否仍指向实际内容
  • Colors-LE — 提取代码库中的所有颜色,并指出哪些颜色不在你的调色板中

检查

  • Regex-LE — 查找代码库中的所有正则表达式,并报告哪些可能导致灾难性回溯
  • Versions-LE — 查找某个依赖项在仓库的各个清单文件中受到不同约束的位置
  • i18n-LE — 识别项目使用的 i18n 库,然后依据该库的规则审查其目录
  • Scrape-LE — 在编写抓取器之前检查网页能否抓取,并说明何时无法判断

防护

  • Secrets-LE — 查找代码库中的硬编码凭据,绝不在报告中打印凭据
  • EnvSync-LE — 比较目录树中的 dotenv 文件,并指出哪些文件缺少哪些键
  • Unicode-LE — 查找那些隐藏含义的 Unicode 字符——双向控制字符、不可见字符、同形异义字符、混合文字系统

每款工具都独立运行:没有共享的 crate,也没有发布的核心库。若有两款工具得出相同结论,那是因为这个答案经得起两次验证。

联系 — nolindnaidoo.com · GitHub · LinkedIn

nolindnaidoo 的其他项目

Rust — pixelcoords 和 pixelactions 构成一个工作循环:pixelcoords 回答 位置,pixelactions 在那里执行操作。它们有各自的工具、各自的风格——不属于 LE 系列。

许可证

MIT © nolindnaidoo

评论

支持 Markdown

第一次接触 MCP?

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

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