README
令牌优化 (skinny-jeans)
对于超过50行的文件,优先使用 toon_read_file 而非内置的读取函数。
对于任何JSON/数据文件,使用 toon_read_json。
使用 toon_list_files 代替ls/Bash进行目录列表操作。
在读取大文件之前,使用 toon_estimate_tokens。
### 验证是否正常工作
启动Claude Code会话并运行 `/mcp`,你应该会看到 `skinny-jeans` 列出了5个工具。
## ✨ 主要特性
在Claude Code中,每次读取文件都会消耗API配额中的令牌。Markdown文件冗长(包含前页内容、徽章、空行),JSON文件在每个对象中都会重复字段名,代码中的注释对人类有帮助,但对已经理解代码的大语言模型(LLM)来说是噪音。
skinny-jeans作为一个MCP服务器,位于Claude和你的文件系统之间,可实时压缩内容:
Claude Code ──> skinny-jeans (MCP) ──> 从磁盘读取文件 │ ├── .json/.jsonl → TOON编码 节省约40 - 60% ├── .md/.mdx → Markdown压缩 节省约15 - 30% ├── .ts/.js/.py → 去除注释 节省约10 - 20% └── 其他文本 → 清理空白 节省约5%
## 💻 使用示例
### 基础用法
#### toon_read_file
这是主要工具,可读取任何文件并自动应用正确的优化:
toon_read_file({ path: "data.json" }) → [skinny-jeans: 缩小47%, 约51个令牌(原为约96个)] → TOON编码的内容
toon_read_file({ path: "README.md" }) → [skinny-jeans: 缩小22%, 约145个令牌(原为约186个)] → 压缩后的Markdown文件(无徽章、前页内容、多余空行)
toon_read_file({ path: "app.ts" }) → [skinny-jeans: 缩小15%, 约171个令牌(原为约201个)] → 去除注释后的代码
**参数:**
- `path`(字符串,必需) — 文件路径
- `maxTokens`(数字,可选) — 在指定的令牌数处截断输出
- `raw`(布尔值,可选) — 跳过优化,返回原始内容
#### toon_read_json
专门用于JSON文件,具有编码选项:
- `delimiter` — `"tab"`(默认)、`"comma"` 或 `"pipe"` 用于表格行
- `keyFolding` — `"safe"`(默认)将 `{"a": {"b": 1}}` 折叠为 `a.b: 1`
#### toon_estimate_tokens
在进行完整读取之前进行快速检查:
toon_estimate_tokens({ path: "big-dataset.json" }) → 文件: big-dataset.json → 大小: 245891字节,4521行 → 估计令牌数: 约52340 → 类别: json → 使用skinny-jeans的预期节省: 40 - 60%
#### toon_batch_estimate
分析整个项目:
toon_batch_estimate({ paths: ["src/", "data/"] }) → 令牌节省报告 (47个文件) → json: 12个文件,约45200个令牌 → 节省约20340个令牌 (45%) → 代码: 28个文件,约31000个令牌 → 节省约4650个令牌 (15%) → Markdown: 7个文件,约8900个令牌 → 节省约1780个令牌 (20%) → 总计: 约85100个令牌 → 估计节省: 约26770个令牌 (31%)
### 高级用法
skinny-jeans还可以作为独立的命令行工具使用:
```bash
# 读取文件并进行优化
skinny-jeans read data.json
# 估计文件的令牌数
skinny-jeans estimate large-file.ts
# 批量节省报告
skinny-jeans batch src/ data/ docs/
📚 详细文档
MCP工具
| 工具 | 用途 |
|------|------|
| toon_read_file(path) | 以优化形式读取任何文件。自动检测文件类型,应用正确的转换,并报告节省情况。 |
| toon_read_json(path) | 将JSON/JSONL转换为TOON,并提供编码选项(分隔符、键折叠)。 |
| toon_estimate_tokens(path\|text) | 在不读取整个文件的情况下估计令牌数。 |
| toon_list_files(path) | 以缩进树的形式提供紧凑的目录列表(无冗长的元数据)。 |
| toon_batch_estimate(paths) | 跨文件/目录的批量令牌节省报告。 |
转换方式
JSON/JSONL → TOON
使用 @toon-format/toon 编码器。对象数组变为带有共享标题的表格行,嵌套键折叠为点分路径。制表符分隔符比逗号更适合令牌化。
Markdown压缩
逐行状态机,去除:YAML前页内容、HTML注释、徽章图像、标题末尾的 #、多余的空行、行尾的空白。保留:代码块(从不修改)、表格、链接、块引用。
代码注释去除
去除全行的 // 和 /* */ 注释(C风格语言)以及 # 注释(Python、Ruby、shell)。保留内联注释(它们包含上下文)和包含类似注释语法的字符串字面量。
通用压缩
作为其他文本文件的备用方法:将3个或更多连续的空行合并为1个,去除行尾的空白。
预期令牌节省
| 文件类型 | 典型节省 | |------|------| | JSON(表格/数组数据) | 40 - 60% | | JSON(嵌套配置) | 20 - 35% | | Markdown(带有徽章的README) | 15 - 30% | | TypeScript/JavaScript | 10 - 20% | | Python | 10 - 25% | | 其他文本 | 5 - 10% |
🔧 技术细节
本地运行
# 直接测试MCP服务器
echo '{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2024-11-05","capabilities":{},"clientInfo":{"name":"test","version":"1.0"}}}' | node dist/index.js
# 注册以进行开发
claude mcp add --scope user --transport stdio skinny-jeans -- node $(pwd)/dist/index.js
Scan to join WeChat group