关于 Numbers-LE
Numbers-LE 为开发者从配置、数据文件和文本中提取数字,便于检查数值与代码常量。它识别多种结构化格式及编程语言字面量,并提供编辑器、命令行和 MCP 服务接口。
主要功能
- 01提取结构化文件和代码中的数字
- 02识别 12 种编程语言的数字字面量
- 03在可用时提供记法和精确位置
- 04对提取结果去重和排序
适用场景
- 01检查配置或测试夹具中的数值范围
- 02比较多个配置文件中的端口和限制
- 03查找代码库中变更的常量
MCP 相关
MCP 服务通过 stdio 提供 `extract_numbers` 工具。它接收内容并返回提取结果,不读取文件,也不发起网络请求。
配置
本地服务的配置在各客户端中通用,复制后粘贴到客户端的 MCP 配置文件即可。
工具
1收录的工具列表 · 更新于 3 天前
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| dedupe | boolean | 否 | 将重复值合并,仅保留首次出现的值。 |
| format | enum | 否 | 文档格式。可选;格式无法识别或未指定时,直接扫描文本。json | jsonc | yaml | csv | tsv | toml | ini | env | python | rust | go | java | kotlin | csharp | cpp | c | javascript | typescript | sql | shellscript |
| content | string | 是 | 要扫描的文档文本。 |
| filename | string | 否 | 用于在 `format` 未指定时推断格式的文件名,例如 "config.toml"。 |
| maxResults | integer | 否 | 返回数字数量上限(默认值为 500)。meta.truncated 报告是否有结果被丢弃。 |
详细介绍
Numbers-LE:轻松提取数字
按一下键,即可提取当前文件中的所有数字
JSON/JSONC、YAML、CSV/TSV、TOML、INI、环境文件,以及十二种源代码语言
觉得有用? 点赞或评分能让其他开发者发现它 — ★ GitHub · ★ Open VSX · ★ Marketplace
功能
打开文件,运行 Numbers-LE: Extract Numbers,文档中的所有数值都会出现在新的编辑器中 — 然后可在其中去重和排序。可在 VS Code 以及基于 VS Code 的编辑器(如 Cursor 和 VSCodium)中使用(可从 Open VSX 安装)。
- 数据校验 — 提取配置文件或测试数据中的数字,一眼查看数值范围
- 配置审计 — 比较 INI/TOML/.env 文件中的端口、阈值和限制
- CSV 处理 — 提取全部内容、单列或多列,并分别放入不同文档
安装
| 渠道 | 可获得内容 | 安装 |
|---|---|---|
| VS Code | 在编辑器中按一下键即可完成相同的提取操作 | Marketplace |
| Cursor、VSCodium、Windsurf | 相同的扩展 | Open VSX |
| 终端或 CI 步骤 | 对整个目录树执行相同操作,并返回退出码 | npx numbers-le · npm 或 cargo install numbers-le · crates.io |
| 任意 MCP Agent,通过 Node 使用 | 通过 stdio 调用 extract_numbers | npx numbers-le-mcp · npm |
在 AI Agent 中使用
相同的引擎也以 MCP 服务的形式运行,因此 Agent 可以直接调用它,无需你运行命令。
| 编辑器 | 使用方式 |
|---|---|
| VS Code 1.101+ | 无需安装任何内容——扩展会在 Agent 模式下注册 extract_numbers |
| Claude Code | claude mcp add numbers-le -- npx -y numbers-le-mcp |
| Cursor、Windsurf 和其他工具 | 将其指向 npx numbers-le-mcp |
extract_numbers(content, format?, filename?, dedupe?, maxResults?)
按文档中的顺序返回数值,每个数值都附带其书写时使用的表示法;对于 JSON、源代码和纯文本,若位置精确,还会附带从 1 开始计数的行号和列号;已解析的格式(YAML、TOML、CSV、INI、dotenv)不提供位置,而不是猜测位置。默认最多返回 500 个,并通过 meta.truncated 标记是否截断。格式为可选项——无法识别的内容会按纯文本扫描,而不会被拒绝。
服务接收内容并返回数据——它不会读取文件,也不会自行发出网络请求。此项目已作为 numbers-le-mcp 发布到 npm,并以 io.github.nolindnaidoo/numbers-le 的名称收录在 MCP registry 中。
手动配置 — 任何带有 MCP 配置文件的宿主
大多数宿主都会读取 JSON 配置。添加一条配置:
{
"mcpServers": {
"numbers-le": {
"command": "npx",
"args": ["-y", "numbers-le-mcp"]
}
}
}
-y 会跳过首次运行时的安装提示。如果不想跟踪版本发布,可以固定版本——[email protected]。
不想每次启动都通过 npx?可以安装一次,然后指向二进制文件:
npm install -g numbers-le-mcp
{
"mcpServers": {
"numbers-le": { "command": "numbers-le-mcp" }
}
}
它通过 stdio 使用 MCP 通信,无需环境变量、API 密钥或自身配置。在将它接入其他内容之前,可以先进行检查:
echo '{"jsonrpc":"2.0","id":1,"method":"tools/list"}' | npx -y numbers-le-mcp
这会输出工具列表并退出——如果看到 extract_numbers,就说明服务可以正常运行。
支持的格式
| 格式 | 数字的判定方式 |
|---|---|
| JSON | 结构中任意位置的数值。带引号的数字("42")是字符串,不是数值,因此永远不会被提取 |
| YAML | 数值,包括十六进制/八进制整数形式和指数形式;多文档(---)流会提取每个文档中的数值 |
| TOML | 整数和浮点数(日期不属于数字) |
| CSV | 整个单元格内容都是数值的单元格——19.99 会被识别,12abc 和 1,000 则不会。不推断表头:每一行都是数据 |
| INI | 整个值的内容都是数值的项(INI 的值本质上都是字符串) |
| Environment | 整个值的内容都是数值的项(PORT=3000 会得到 3000;VERSION=1.2.3 不会得到任何结果) |
统一策略(一个启发式模块应用于所有格式):只提取有限数值——结果中不会出现 NaN、inf/.inf;强制转换的字符串必须全部为数值:可带正负号、小数点和指数的普通十进制数。
Python、Rust、Go、Java、Kotlin、C#、C、C++、JavaScript、TypeScript、SQL 和 shell 会由数字字面量提取器读取。它能识别十六进制 0xFF、二进制 0b1010、八进制 0o755 和旧式八进制 0755、数字分隔符 1_000_000 和 1'000,以及后缀 123n、1.5f、10u32、100L——并且知道 u32 是类型名,不是数字 32。不同方言会导致结果不同:在 C、C++、Go 和 Java 中,0755 是 493;在 Rust、Python 3、Kotlin 和 C# 中则是 755。
每个提取结果都会附带其书写时使用的表示法——decimal、hex、binary、octal、scientific、bigint。对于剩余内容,你可以明确指定格式,也可以回退到纯文本扫描(不使用语法:v1.2.3 会被识别为 1.2 和 0.3)。
CLI
相同的提取功能也可通过终端或 Shell 管道运行:Rust CLI 位于 crate/,并与扩展共用一份语料库 ——
crate/fixtures/ ——
因此两者读取文档的方式绝不会不同。可通过 npm 安装:npm install -g numbers-le(
或通过 npx numbers-le 运行),也可通过 crates.io 安装:
cargo install numbers-le。两种方式安装的是同一条命令,除了解析器拒绝损坏文档时使用的措辞不同外,输出逐字节保持一致。
numbers-le . # every number in the tree; JSON on stdout when piped
numbers-le --values config/ # just the numbers, one per line
numbers-le mcp # the same extraction over MCP on stdio
# the point of the whole thing:
numbers-le --values --dedupe src/ | sort -n > after.txt
diff before.txt after.txt # what constants moved this release
可从 npm 安装 (numbers-le) 或从 crates.io 安装 (numbers-le)。两种方式安装的都是同一条 numbers-le 命令。
npm install -g numbers-le # or run it once: npx numbers-le
cargo install numbers-le
总得有人核实代码中的比率是否与规范一致。 税率、数据保留期限、舍入边界。在受监管的环境中,这项核查是一项交付成果,而负责核查的人通常没有代码库副本,也从未打开过编辑器。
数字的输出格式与 JavaScript 完全一致 — 1e+21,而不是 Rust 的 1000000000000000000000。这个工具的全部输出都是文本形式的数字,因此呈现格式就是契约,而语料库会固定这一点。
退出码遵循 grep 的惯例 — 找到数字时为 0,未找到时为 1,问题格式错误时为 2。
命令
| 命令 | 描述 |
|---|---|
Numbers-LE: Extract Numbers | 从当前文档中提取所有数字 |
Numbers-LE: Deduplicate Numbers | 删除结果中的重复数字 |
Numbers-LE: Sort Numbers | 按数值或数量级对结果排序 |
Numbers-LE: Open Settings | 打开 Numbers-LE 设置 |
Numbers-LE: Help & Troubleshooting | 内置文档 |
默认情况下没有命令绑定快捷键。可在编辑器的 键盘快捷键 中为任意命令设置快捷键。
设置
| 设置项 | 默认值 | 描述 |
|---|---|---|
numbers-le.openResultsSideBySide | true | 在当前编辑器旁打开结果 |
numbers-le.postProcess.openInNewFile | true | 去重/排序结果写入新文件,而不是替换编辑器内容 |
numbers-le.showPositions | false | 显示每个数字所在的行和列 |
numbers-le.copyToClipboardEnabled | false | 同时将结果复制到剪贴板(非 CSV) |
numbers-le.clipboardIncludesPositions | false | 在复制内容中包含行和列 |
numbers-le.dedupeEnabled | false | 提取时自动去重 |
numbers-le.sortEnabled | false | 提取时自动排序 |
numbers-le.sortMode | off | numeric-asc/desc、magnitude-asc/desc |
numbers-le.showParseErrors | false | 以通知形式显示解析错误 |
numbers-le.notificationsLevel | silent | all = 所有通知,important = 警告 + 错误,silent = 仅错误 |
numbers-le.safety.enabled | true | 为超大文件/输出提供保护机制 |
numbers-le.safety.fileSizeWarnBytes | 1000000 | 文件超过此大小时发出警告 |
numbers-le.safety.largeOutputLinesThreshold | 50000 | 结果数量超过此阈值时,提供打开/复制/取消选项 |
numbers-le.safety.manyDocumentsThreshold | 8 | 打开此数量的列文档前进行确认 |
numbers-le.statusBar.enabled | true | 显示状态栏项目 |
numbers-le.telemetryEnabled | false | 仅本地事件日志(参见隐私) |
语言
除英语外,支持 12 种语言:
德语 · 西班牙语 · 法语 · 印度尼西亚语 · 意大利语 · 日语 · 韩语 · 葡萄牙语(巴西) · 俄语 · 乌克兰语 · 越南语 · 中文(简体)
两部分内容均已覆盖:清单(命令标题、设置名称和说明),以及扩展运行期间显示的所有内容(通知、状态栏、快速选择和提示词)。扩展会遵循 VS Code 的显示语言,因此会与编辑器当前设置的语言一致;无需单独设置。
隐私与安全
- 不访问网络。 扩展绝不会向任何地方发送数据。
telemetryEnabled设置只会将事件写入本地输出通道,供你检查(Numbers-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/numbers-le |
性能
| 输入 | 大小 | 找到数量 | 耗时 | 速率 | 扫描速度 |
|---|---|---|---|---|---|
| JSON 指标 | 2.18 MB | 120,000 | 69.12 ms | 1,736,013/sec | 31.6 MB/s |
| CSV 数据 | 0.93 MB | 150,000 | 88.02 ms | 1,704,098/sec | 10.6 MB/s |
| INI 配置 | 0.42 MB | 30,000 | 23.01 ms | 1,303,868/sec | 18 MB/s |
在 Apple M5 Pro、24 GB RAM、Node 24.3.0 上预热后运行 7 次所得的中位数。输入由 scripts/benchmark.ts 生成,而非纳入版本控制,因此上面的大小就是实际测量值。运行 bun run benchmark 可重现测试。
这些数据因机器而异,不会在 CI 中作为断言——用基准测试来阻止构建,只能说明运行器当时有多忙。
测试
| 指标 | 覆盖率 |
|---|---|
| 语句 | 81.24% |
| 分支 | 72.38% |
| 函数 | 89.20% |
| 行 | 82.72% |
共有 37 个文件中的 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 系列。
- pixelcoords — 冻结屏幕,标记区域,获取像素级精确的坐标和裁剪图像 pixelcoords.dev · crates.io · docs.rs
- pixelactions — 使用经过人工验证的坐标执行交互,并确认操作已生效 pixelactions.dev · crates.io · docs.rs
许可证
MIT © nolindnaidoo
评论
一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。