mcpField
S
Strings-LE

Strings-LE

本地服务
letools.dev开发工具1今天更新

关于 Strings-LE

Strings-LE 从配置文件、数据文件和源代码中提取字符串值,并在编辑器中生成结果,也可通过 CLI 扫描文件树。它支持多种结构化格式与编程语言,并提供 CSV 列选择和大文件流式处理。

主要功能

  1. 01提取 JSON、YAML、TOML 等字符串值
  2. 02解析多种编程语言的字符串
  3. 03CSV 列选择与流式处理
  4. 04支持去重、排序和位置显示
  5. 05提供编辑器、CLI 与 MCP

适用场景

  1. 01整理本地化文件中的待翻译文本
  2. 02审查配置文件中的字符串值
  3. 03从大型 CSV 中提取指定列
  4. 04汇总代码库中的用户可见文本

MCP 相关

MCP 服务通过 stdio 提供 extract_strings,解析输入内容并按文档顺序返回字符串值,可配置格式、去重、多行处理和结果上限;服务不读取文件或发起网络请求。

配置

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

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

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

安装包
npmstring-le-mcp2.5.1

工具

1

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

参数类型必填说明
dedupeboolean否将重复值合并,仅保留首次出现的值。
formatenum否文档格式。省略或无法识别格式时,将回退到提取带引号的字符串。json | jsonc | yaml | csv | tsv | toml | ini | env | python | rust | go | shellscript | php | ruby | perl | csharp | javascript | typescript | fallback
contentstring是要扫描的文档文本。
filenamestring否用于在 `format` 未指定时推断格式的文件名,例如 "config.toml"。
multilineboolean否对于此处无法解析的格式,允许带引号的字符串跨越多行,以便读取多行模板字面量或消息。对于自身字符串可跨行的语言,无论如何都会按此方式读取。
maxResultsinteger否返回字符串数量上限(默认 500)。meta.truncated 用于报告是否有内容被丢弃。

详细介绍

Strings-LE 标志

Strings-LE:轻松提取字符串

一键提取当前文件中的所有字符串值
支持 JSON/JSONC、YAML、CSV/TSV、TOML、INI、环境文件和十种源代码语言

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


VS Code 中的 Strings-LE

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

功能介绍

打开文件,运行 String-LE: Extract Strings,文档中的所有字符串值都会出现在新的编辑器中,然后即可进行去重和排序。支持 VS Code,以及 Cursor 和 VSCodium 等基于 VS Code 的编辑器(可从 Open VSX 安装)。

  • i18n 准备 — 将语言环境文件(JSON/YAML)展平为简洁的待翻译值列表
  • 配置审查 — 一目了然地查看 TOML/INI/.env 文件中的所有字符串值
  • CSV 挖掘 — 提取一列、多列或全部列;支持流式处理超大文件

安装

平台可获得的功能安装
VS Code在编辑器中一键完成同样的提取Marketplace
Cursor、VSCodium、Windsurf同一款扩展Open VSX
终端或 CI 步骤对整个目录树执行相同操作,并返回退出代码npx strings-le · npm 或 cargo install string-le · crates.io
任何 MCP Agent,通过 Node 使用通过标准输入输出调用 extract_stringsnpx string-le-mcp · npm

在 AI Agent 中使用

相同的引擎也可作为 MCP 服务运行,因此 Agent 可以直接调用它,无需你运行命令。

编辑器用法
VS Code 1.101+无需安装任何内容 — 扩展会在 Agent 模式下注册 extract_strings
Claude Codeclaude mcp add string-le -- npx -y string-le-mcp
Cursor、Windsurf 及其他工具将其指向 npx string-le-mcp

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

extract_strings(content, format?, filename?, dedupe?, multiline?, maxResults?)

按文档顺序返回值,默认最多返回 500 个,并通过 meta.truncated 标示是否截断。格式为可选项 — 无法识别的格式会回退到带引号的字符串。

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

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

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

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

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

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

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

它通过 stdio 使用 MCP 通信,无需环境变量、API 密钥或自行配置。将它接入其他内容前,可以先检查:

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

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

支持的格式

格式语言 ID提取内容
JSONjson字符串值(解析后提取;不包括键、数字和布尔值)
YAMLyaml字符串值,包括未加引号的普通标量、块标量/折叠标量和多文档文件
CSVcsv单元格,支持可选的表头处理、列选择,以及适用于大型文件的流式模式
TOMLtoml字符串值,包括多行字符串;日期和数字作为类型化值排除
INIini值(INI 无类型,因此看起来像数字的值也会作为字符串提取)
Environmentdotenv、env值(支持处理 export 前缀、引号和行内注释)
Pythonpython将三引号文档字符串作为一个字符串处理;支持 f 字符串和 r/b/u 前缀
Rustrust将原始字符串 r"…"、r#"…"#、r##"…"## 作为一个字符串处理,并保留其中的引号;支持字节字符串
Gogo将反引号原始字符串作为一个字符串处理,支持跨行
Shellshellscript将 Here 文档(<<EOF、<<'EOF'、<<-EOF)作为一个字符串处理
PHP、Ruby、Perlphp、ruby、perl将 Here 文档和 Now 文档(<<<EOT、<<<'NOW'、<<~EOS)作为一个字符串处理
C#csharp逐字字符串 @"…",其中 "" 表示一个引号;插值字符串 $"…"
JavaScript、TypeScriptjavascript、typescript(以及 react ID)将模板字面量作为一个字符串处理,包括插值和嵌套内容
Markdown 及其他格式markdown回退扫描单行中由 "双引号"、'单引号' 或 `反引号` 括起来的字符串

值会进行去首尾空白处理;空值会被丢弃;键永远不会被提取 — 上述所有提取器都遵循同一条规则。回退扫描无法识别未加引号的字符串,因此已解析格式和源语言都使用专门的读取器;启用 string-le.fallback.multiline(MCP 工具中的 multiline)后,它会读取跨行的带引号内容。除非启用 string-le.showParseErrors,否则解析错误不会显示。

扫描文件夹或工作区

Extract 会读取当前打开的文档。扫描会读取磁盘上的多个文件,并生成一份报告。

  • 整个工作区:在命令面板中运行 String-LE: Extract Strings from Workspace。
  • 单个文件夹:在资源管理器中右键单击该文件夹,然后选择 Extract Strings from Folder;或者运行 String-LE: Extract Strings from Folder 并选择一个文件夹。

项目中同一个字符串可能出现在很多地方,因此报告会列出不同的字符串,按使用范围从广到窄排序,并显示每个字符串出现的次数和位置。每个字符串都会列在表格中。大多数字符串只出现一次,这类字符串会显示在其所在行中。重复出现的字符串则会在下方单独列出一个部分,显示每个出现位置:

# String-LE workspace report

`my-project` · 4 file(s) read · 3 distinct string(s), 7 occurrence(s) in 3 file(s)

| String | Occurrences | Files | Where |
|---|---|---|---|
| `Save changes` | 4 | 3 | |
| `Cancel` | 2 | 2 | |
| `Press Enter` | 1 | 1 | `src/b.py` · **2:8** |

## `Save changes` (4)

- `i18n/en.json` · **2:11**
- `src/a.ts` · **1:11**, **3:11**
- `src/b.py` · **1:9**

## `Cancel` (2)

- `i18n/en.json` · **3:13**
- `src/a.ts` · **2:11**

## Could not be read (1)

- `bad.json`: Invalid JSON: Expected value after colon in object property on line 1 column 6

位置信息遵循 string-le.showPositions 设置。关闭此设置后,每行会显示文件名以及字符串在该文件中的出现次数:src/a.ts (2)。复制到剪贴板的内容遵循 string-le.clipboardIncludesPositions 设置,与 Extract 的行为相同。

如果文件格式读取器无法解析某个文件,报告会列出该文件及原因,不会跳过它。超过 120 个字符或包含换行符的字符串会显示为一行截断后的文本。比较时仍会使用完整字符串。

扫描会读取什么。 文件从磁盘读取,因此不会包含未保存的更改。超过安全大小限制的文件,或非 UTF-8 文本文件,不会被读取。扫描最多处理 5,000 个文件或 10,000 个列出的字符串出现位置。报告末尾会列出每项未处理的内容,以免将较短的报告误认为项目没有问题。

扫描会跳过什么,以及如何更改设置。 默认启用三个开关,可在 Settings 中分别关闭:

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

还有两个列表可以调整扫描结果,无需关闭开关。若要跳过更多内容,请在 scanExcludes 中添加模式。若要读取开关会跳过的内容,请将其添加到 scanAlwaysInclude:

{
	// Also skip the test fixtures.
	"string-le.workspace.scanExcludes": ["**/fixtures/**"],
	// Read the vendored code, though the built-in list skips it.
	"string-le.workspace.scanAlwaysInclude": ["**/vendor/**"]
}

String-LE: Open Settings 会在 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。

影响扫描的设置位于 Settings 下。

命令行工具

同样的提取功能也可在终端或 Shell 管道中运行:Rust 命令行工具位于 crate/,与扩展共用同一语料库 —— crate/fixtures/ —— 因此两者读取文档的方式始终一致。可通过 npm 安装:npm install -g strings-le(或使用 npx strings-le 运行),也可通过 crates.io 安装:cargo install string-le。两种方式安装的是同一个命令,除了解析器用于拒绝损坏文档的措辞外,输出逐字节保持一致。

string-le .                      # every string in the tree; JSON on stdout when piped
string-le --values src/          # just the values, one per line
string-le --dedupe --values .    # each distinct string once
string-le mcp                    # the same extraction over MCP on stdio

# the point of the whole thing:
string-le --values --dedupe src/ | sort > after.txt
diff before.txt after.txt        # what changed in the copy this release

终端中的 string-le

通过 npm (strings-le) 或 crates.io (string-le) 安装。 两种方式安装的都是同一个 string-le 命令。

npm 上的 strings-le crates.io 上的 string-le

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

读取者并非作者。 扩展针对你当前打开的缓冲区提供结果。发布前仍需有人阅读每一条面向用户的字符串 —— QA 负责人、合规审查人员、本地化负责人 —— 而他们并未打开编辑器,其中有些人甚至无法获得代码库副本。命令行工具会将整个代码库放入一个文件,供他们阅读。

源文件是这里的重点。 .ts 或 .py 文件是面向用户文案所在之处,因此每种语言都由其自身的字面语法来读取;任何仍未识别的内容都会转而进行带引号字符串提取,而不会被拒绝。

退出码遵循 grep —— 找到字符串时为 0,未找到时为 1,问题格式错误时为 2 —— 因此未找到内容也是一种答案,而非错误。

命令

命令说明
String-LE: Extract Strings从当前文档提取所有字符串值
String-LE: Extract Strings from Workspace提取工作区每个文件中的不重复字符串,并标明每个字符串所在的位置
String-LE: Extract Strings from Folder对单个文件夹执行同样的操作。也可在资源管理器中的文件夹上执行
String-LE: Deduplicate Strings从当前文档中移除重复行
String-LE: Sort Strings按字母顺序或长度对行排序
String-LE: Toggle CSV Streaming为大型 CSV 文件启用/禁用流式处理
String-LE: Open Settings打开 String-LE 设置
String-LE: Help & Troubleshooting内置文档

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

设置

设置默认值描述
string-le.openResultsSideBySidetrue在当前编辑器旁边打开结果
string-le.postProcess.openInNewFiletrue后处理命令将结果写入新文件,而不是就地编辑
string-le.showPositionsfalse显示每个字符串所在的行和列
string-le.copyToClipboardEnabledfalse同时将结果复制到剪贴板(CSV 输出时禁用)
string-le.clipboardIncludesPositionsfalse复制内容中包含行和列
string-le.dedupeEnabledfalse提取后自动对结果去重
string-le.sortEnabledfalse提取后自动对结果排序
string-le.sortModeoffalpha-asc、alpha-desc、length-asc、length-desc
string-le.csv.streamingEnabledfalse将 CSV 结果逐步写入编辑器
string-le.showParseErrorsfalse以通知形式显示解析错误
string-le.notificationsLevelsilentall = 每条通知,important = 警告 + 错误,silent = 仅错误
string-le.workspace.scanPatterns["**/*"]文件夹或工作区扫描要读取的文件
string-le.workspace.scanUseDefaultExcludestrue跳过依赖项文件夹、构建输出、缓存和锁文件
string-le.workspace.scanRespectGitignoretrue跳过项目的 .gitignore 文件所排除的内容
string-le.workspace.scanSkipBinaryFilestrue跳过图像、字体、存档文件及其他非文本文件
string-le.workspace.scanExcludes[]要跳过的其他文件,以 glob 模式指定
string-le.workspace.scanAlwaysInclude[]即使被上述三项设置之一排除,也要读取的文件
string-le.workspace.scanMaxFiles5000单次扫描读取的最多文件数
string-le.workspace.scanMaxResults10000停止读取前单次扫描列出的最多匹配项数
string-le.safety.enabledtrue为超大文件和输出提供保护措施
string-le.safety.fileSizeWarnBytes1000000提取的文件超过此大小时发出警告
string-le.safety.largeOutputLinesThreshold50000结果数超过此值时提供“打开/复制/取消”选项
string-le.safety.manyDocumentsThreshold8打开此数量的结果文档前进行确认(CSV 多列)
string-le.statusBar.enabledtrue显示状态栏项
string-le.telemetryEnabledfalse仅限本地的事件日志(参见“隐私”)

语言

除英语外,还支持十二种语言:

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

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

隐私与安全

  • 不访问网络。 此扩展绝不会向任何地方发送数据。telemetryEnabled 设置仅会将事件写入本地输出通道,供你检查(String-LE)。
  • MCP 服务同样遵循这一原则。 它接收内容作为参数并返回数据:不访问文件系统、不发起网络调用、不收集遥测数据。你的 Agent 已有文件读取工具,因此在服务中重复实现这些功能,只会在没有增加能力的情况下引入路径遍历攻击面。若服务导入了任何可能访问上述任一项的内容,check:mcp-bundle 就会导致构建失败。
  • 错误通知会隐藏用户主目录和类似凭据的片段。
  • 最多提示评分两次。 第 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/string-le

性能

输入大小找到耗时速率扫描速度
JSON 本地化文件1.77 MB40,0009.53 ms4,198,116/秒185.9 MB/s
YAML 本地化文件1.01 MB30,00013.33 ms2,250,169/秒75.7 MB/s
CSV 字符串1.35 MB80,00228.29 ms2,827,438/秒47.8 MB/s

在 Apple M5 Pro、24 GB RAM、Node 24.3.0 上预热后运行 7 次所得的中位数。输入由 scripts/benchmark.ts 生成,而非纳入版本控制,因此上方大小与实际测量值完全一致。使用 bun run benchmark 复现。

这些数据因机器而异,不会在 CI 中作为断言——以基准测试结果决定是否允许构建,只能说明运行器当时有多忙。

测试

指标覆盖率
语句81.57%
分支72.80%
函数89.50%
行83.13%

43 个文件中共有 525 个测试用例,另有一个在真实 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 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。