mcpField
D
datoon

datoon

本地服务
github.comAI 与智能体22 周前更新

关于 datoon

datoon 是面向 LLM 数据管线的结构化数据到 TOON 转换工具,仅在预计节省 Token 时转换,否则保留原格式。它提供命令行、Python API 和 MCP 工具,并为每次决策说明原因。

主要功能

  1. 01自动识别多种结构化格式
  2. 02按结构和节省阈值决定转换
  3. 03将合适的数据转换为 TOON
  4. 04返回转换决策、原因和 Token 估算
  5. 05提供命令行与 Python API
  6. 06支持结构分析而无需 Node.js

适用场景

  1. 01为 LLM 提示词压缩规整的表格数据
  2. 02跳过转换后可能变大的嵌套数据
  3. 03在数据管线中记录转换判断与估算

MCP 相关

datoon 的 MCP 服务提供 convert_json、convert_text 和 analyze_json 工具,用于转换 JSON、CSV、YAML、XML、JSONL,或仅分析 JSON 结构。

配置

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

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

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

安装包
pypidatoon1.9.1

工具

还没有获取到工具列表

本地服务需要在你的电脑上运行后才能读取工具,维护者暂未提供工具列表。

详细介绍

README 配图

datoon

智能结构化数据→TOON 网关 — 仅在确实能节省令牌时才进行转换

测试 提交前检查 发布 PyPI Python 许可证:MIT

转换前/后 • 安装 • 功能一览 • 工作原理 • 基准测试 • 完整安装指南


原始结构化数据在大模型提示词中往往冗长。TOON 可以节省令牌,但盲目转换也可能让负载更糟。datoon 增加了一层决策逻辑:当结构和节省效果值得转换时就转换,不值得时就跳过,并始终说明原因。

支持 JSON、CSV、JSONL、YAML、XML、Parquet、Avro、ORC、Excel 和 Apple Numbers,并根据文件扩展名自动检测格式。

转换前 / 后

提示词中的 JSON(43 个令牌)
{"users":[
  {"id":1,"name":"Ada","role":"admin"},
  {"id":2,"name":"Lin","role":"analyst"},
  {"id":3,"name":"Grace","role":"viewer"}
]}
datoon 转换 → TOON(24 个令牌)
users[3]{id,name,role}:
  1,Ada,admin
  2,Lin,analyst
  3,Grace,viewer
{"decision":"convert","reason":"Estimated savings 44.19% (threshold 15.00%)."}
来自数据管道的 CSV(转为 JSON 后为 111 个令牌)
id,name,role
1,Ada,admin
2,Lin,analyst
3,Grace,viewer
datoon 自动转换 → TOON(24 个令牌)
datoon data.csv --report-stdout

结果相同。代码中无需进行 JSON 序列化。

非均匀负载(26 个令牌)
{"config":{"debug":true},"tags":["a","b"]}
datoon 跳过转换 → 保留 JSON
{"decision":"skip","reason":"No uniform object arrays found with at least 3 rows."}

无需调用 Node.js。不会悄然损坏数据。

数据相同。格式恰当。始终说明原因。

┌──────────────────────────────────────────────────┐
│  PAYLOAD SAVINGS (auto avg)    ████░░░░░░   28%  │
│  PAYLOAD SAVINGS (agent skill) ████████░░   62%  │
│  DECISION ACCURACY             ██████████  100%  │
│  HARMFUL CONVERSIONS BLOCKED   ██████████  100%  │
└──────────────────────────────────────────────────┘

重要

datoon 节省的是负载令牌,即提示词中结构化数据部分所占用的令牌。令牌节省效果取决于负载形态:均匀的表格数据适合转换;深度嵌套或非均匀结构则会跳过。每项决策都会附带原因,方便工作流记录日志、调试并信任结果。

安装

# core (JSON, CSV, JSONL, XML — no extra deps)
uv add datoon
pip install datoon

# with YAML support
pip install "datoon[yaml]"

# with Excel support
pip install "datoon[excel]"

# with Parquet / ORC / Avro support
pip install "datoon[columnar]"

# with Apple Numbers support
pip install "datoon[numbers]"

# with tiktoken-based token counting
pip install "datoon[tokens]"

# with MCP server
pip install "datoon[mcp]"

# everything
pip install "datoon[all]"

需要 Python 3.12+。转换 TOON 需要安装 Node.js,且 npx 位于 PATH 中;无需 Node.js 也能进行分析和读取格式。

Claude Code 插件、Codex 和 MCP 配置 → INSTALL.md。

功能一览

内容
datoon CLI在终端或脚本中自动判断是否将任何受支持的格式转换为 TOON
Python API提供 convert_json_for_llm() + read_tabular(),适用于任何大模型工作流
MCP 服务提供 convert_json、convert_text、analyze_json 工具,适用于 Claude Desktop、Cursor、Windsurf
Claude Code 插件会话内触发器 /datoon,可通过一条命令从 GitHub 安装
Codex 插件市场插件,为 Codex 提供结构化数据模式
支持的输入格式
格式扩展名所需额外依赖
JSON.json—
JSONL.jsonl、.ndjson—
CSV.csv—
XML.xml—
YAML.yaml、.ymldatoon[yaml]
Excel.xlsx、.xlsdatoon[excel]
Parquet.parquetdatoon[columnar]
Avro.avrodatoon[columnar]
ORC.orcdatoon[columnar]
Apple Numbers.numbersdatoon[numbers]

工作原理

  1. 检测格式 — 根据 --format 标志、文件扩展名,或在读取 stdin 时默认使用 JSON
  2. 读取并规范化 — 将源数据解析为行字典列表;序列化为紧凑 JSON
  3. 分析结构 — 是否为统一的对象数组?深度是否可接受?行数是否达到最低要求?
  4. 提前筛选 — 非候选数据会在任何 CLI 调用前跳过;不会产生 Node.js 开销
  5. 转换并估算 — 运行 TOON CLI,计算 Token 节省量
  6. 按节省量筛选 — 低于阈值 → 返回 JSON;高于阈值 → 返回 TOON 和报告

每种情况下都会返回一个包含 decision、reason 和 Token 估算值的 ConversionReport。流水线不会出现意外的静默行为。


快速开始

JSON(stdin):

echo '{"users":[{"id":1,"name":"Ada"},{"id":2,"name":"Lin"},{"id":3,"name":"Grace"}]}' | datoon --report-stdout

CSV(根据扩展名自动检测):

datoon data.csv --report-stdout

JSONL:

datoon data.jsonl -o output.toon

YAML(需要 datoon[yaml]):

datoon data.yaml --report-stdout

Parquet(需要 datoon[columnar]):

datoon data.parquet --report ./report.json

显式指定格式:

datoon --format csv < data.csv --report-stdout

强制转换(绕过筛选 — 用于实验):

datoon data.json --force --report-stdout

Python API

JSON 转换:

from datoon import convert_json_for_llm, ConversionConfig, DatoonError

config = ConversionConfig(min_savings_ratio=0.15, max_depth=6, min_uniform_rows=3)

try:
    outcome = convert_json_for_llm(raw_json, config)
except DatoonError as exc:
    raise

# outcome.payload_text  — TOON or original JSON
# outcome.report.decision  — "convert" | "skip"
# outcome.report.reason    — human-readable explanation
send_to_model(outcome.payload_text)

通过 read_tabular 读取任意格式:

import json
from pathlib import Path
from datoon import read_tabular, convert_json_for_llm, ConversionConfig

# text formats: csv, jsonl, yaml, xml
rows = read_tabular("csv", text=csv_string)

# binary formats: excel, parquet, orc, avro, numbers
rows = read_tabular("parquet", path=Path("data.parquet"))

json_text = json.dumps(rows, separators=(",", ":"))
outcome = convert_json_for_llm(json_text, ConversionConfig())
send_to_model(outcome.payload_text)

仅分析结构(无需 Node.js):

from datoon.analyzer import analyze_payload
from datoon.models import ConversionConfig

analysis = analyze_payload(parsed_data, ConversionConfig())
print(analysis.is_candidate, analysis.reason)

MCP 服务

datoon 提供了一个 MCP 服务,包含三个工具:

工具描述
convert_json完整的 JSON 转换,包含策略筛选
convert_text转换 CSV、YAML、XML 或 JSONL 文本,包含策略筛选
analyze_json仅分析结构 — 无需 Node.js

Claude Desktop / Cursor / Windsurf 配置:

{
  "mcpServers": {
    "datoon": {
      "command": "uvx",
      "args": ["--from", "datoon[mcp]", "datoon", "mcp"]
    }
  }
}

本地运行:

datoon mcp     # or the standalone script: datoon-mcp

已列入 MCP Registry、Smithery 和 Glama。参见 MARKETPLACES.md。


Claude Code 插件

直接从 GitHub 安装:

claude plugin marketplace add andrii-su/datoon
claude plugin install datoon@datoon

在会话中触发:

/datoon
convert this JSON to TOON if it saves tokens
use datoon mode for structured data

CLI 参考

标志默认值描述
--formatauto输入格式:json、csv、jsonl、yaml、xml、excel、parquet、avro、orc、numbers
--forcefalse绕过筛选和最低节省量阈值
--min-savings0.15所需的最低相对 Token 节省量
--max-depth6自动转换的最大嵌套深度
--min-uniform-rows3统一对象数组中的最少行数
--timeout30中止 TOON CLI 调用前等待的秒数
--report <path>—将 JSON 转换报告写入文件
--report-stdout—将 JSON 转换报告打印到 stderr
-o <path>stdout输出文件路径
--version—打印版本并退出

根据文件扩展名自动检测格式。从 stdin 读取时,或需要覆盖自动检测结果时,请使用 --format。


基准测试

PYTHONPATH=src python benchmarks/run.py --dry-run
PYTHONPATH=src python benchmarks/run.py
PYTHONPATH=src python benchmarks/run.py --update-readme
为什么自动模式优于强制转换

自动模式会跳过收益较低、风险较高的负载(orders-nested、mixed-non-uniform),同时在适合转换的负载上,其平均 token 数与强制 TOON 转换相当。每项决策都会附带有据可循的报告。

场景JSON 基准强制 TOONdatoon 自动模式
平均 token 数775050
平均 token 节省比例0.0%26.8%28.1%
决策质量不适用全部转换转换 3/5,跳过有害情况
数据集JSONTOON(强制)原始节省比例自动模式自动模式 token 数自动模式节省比例
users-small544025.9%转换4025.9%
events-medium21916226.0%转换16226.0%
orders-nested106116-9.4%跳过1060.0%
mixed-non-uniform3547-34.3%跳过350.0%
metrics-wide14210327.5%转换10327.5%
平均111947.1%转换 3/58915.9%

5/5 个负载均成功强制转换。

格式转换基准测试

从常见结构化格式(CSV、JSONL、XML、YAML)转换时的 token 节省情况。 基准是相同数据的 JSON 表示,也就是不使用 datoon 时大模型会收到的内容。

数据集格式JSON token 数TOON(强制)自动模式自动模式 token 数自动模式节省比例
users-csvcsv5329转换2945.3%
events-jsonljsonl194109转换10943.8%
catalog-xmlxml9650转换5047.9%
metrics-yamlyaml12961转换6152.7%
平均—11862转换 4/46247.4%

4/4 个负载均成功强制转换。

Agent 技能评估

基于产物的子 Agent 对比——分析任务相同,模式不同:

  • with_skill:Agent 获得了 datoon 技能,并遵循转换工作流。
  • without_skill:Agent 直接使用 JSON,不使用 TOON 或 datoon。

3 种负载大小 × 3 次迭代 = 共运行 18 次 Agent。两种模式的回答正确率均为 100%。

场景JSON 平均 token 数TOON 平均 token 数负载平均节省比例
小22511847.6%
中2,9721,13861.7%
大17,7576,67362.4%

完整报告和原始输出:benchmarks/agent_skill_eval/。节省数据是负载 token 的估算值,并非端到端模型 token 使用量。


开发

贡献者工作流:CONTRIBUTING.md。维护者/Agent 说明:CLAUDE.md。

设置:

uv sync --extra dev
uvx pre-commit install

测试:

pytest -m "not integration"   # unit only (102 tests)
pytest                        # with integration (requires Node.js + npx)

技能同步 + 插件元数据:

python scripts/validate_skill_sync.py
python scripts/validate_plugin_metadata.py

链接


许可证

MIT

评论

支持 Markdown

第一次接触 MCP?

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

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