datoon について
datoon は LLM パイプライン向けの構造化データから TOON への変換ツールで、推定トークン削減が見込める場合だけ変換し、それ以外は元の形式を保ちます。CLI、Python API、MCP ツールを備え、判断理由も返します。
主な機能
- 01複数の構造化形式を自動判別
- 02構造と削減しきい値による変換判定
- 03適したデータの TOON 変換
- 04判断、理由、トークン推定の報告
- 05CLI と Python API の提供
- 06Node.js 不要の構造分析
活用シーン
- 01LLM プロンプト内の規則的な表形式データの圧縮
- 02変換で肥大化する可能性のあるネストデータの除外
- 03パイプラインでの変換判断と推定値の記録
MCP 対応
datoon の MCP サーバーは convert_json、convert_text、analyze_json ツールを公開し、JSON、CSV、YAML、XML、JSONL テキストの変換や JSON 構造の分析を行います。
設定
ローカルサーバーの設定はどのクライアントでも共通です。コピーしてクライアントの MCP 設定ファイルに貼り付けてください。
ツール
ローカルサーバーのツールはマシン上で起動して初めて取得できます。メンテナーはまだツール一覧を提供していません。
詳細
datoon
スマートな構造化データ→TOONゲートウェイ — トークンを実際に節約できる場合にのみ変換します
変換前/変換後 • インストール • 利用できる機能 • 仕組み • ベンチマーク • インストールガイド全文
構造化データをそのままLLMのプロンプトに入れると、冗長になりがちです。TOONを使えばトークンを節約できますが、何も考えずに変換すると、かえってペイロードが悪化することもあります。datoonは判断レイヤーを追加し、構造と節約効果が見込める場合は変換し、そうでない場合は変換を見送ります。また、その理由を必ず説明します。
JSON、CSV、JSONL、YAML、XML、Parquet、Avro、ORC、Excel、Apple Numbersに対応しており、ファイル拡張子から形式を自動検出します。
変換前/変換後
プロンプト内のJSON(43トークン)
|
datoonが変換 → TOON(24トークン)
|
データパイプラインからのCSV(JSONでは111トークン)
|
datoonが自動変換 → TOON(24トークン)
同じ結果です。コード内でのJSONシリアライズは不要です。 |
均一でないペイロード(26トークン)
|
datoonは変換を見送り → JSONのまま維持
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への変換には、npxがPATHに含まれたNode.jsが必要ですが、分析や形式の読み取りには不要です。
Claude Codeプラグイン、Codex、MCPの設定については、INSTALL.mdをご覧ください。
利用できる機能
| 内容 | |
|---|---|
datoon CLI | 対応形式をターミナルやスクリプトからTOONへ自動判定付きで変換 |
| Python API | あらゆるLLMパイプラインで使えるconvert_json_for_llm()とread_tabular() |
| MCP サーバー | Claude Desktop、Cursor、Windsurf向けのconvert_json、convert_text、analyze_jsonツール |
| Claude Codeプラグイン | セッション内で起動する/datoon。1つのコマンドでGitHubからインストール |
| Codexプラグイン | Codex向けの構造化データモードを提供するマーケットプレイスプラグイン |
サポートされている入力形式
| 形式 | 拡張子 | 追加で必要なもの |
|---|---|---|
| JSON | .json | — |
| JSONL | .jsonl, .ndjson | — |
| CSV | .csv | — |
| XML | .xml | — |
| YAML | .yaml, .yml | datoon[yaml] |
| Excel | .xlsx, .xls | datoon[excel] |
| Parquet | .parquet | datoon[columnar] |
| Avro | .avro | datoon[columnar] |
| ORC | .orc | datoon[columnar] |
| Apple Numbers | .numbers | datoon[numbers] |
仕組み
- 形式を検出 —
--formatフラグ、ファイル拡張子、または標準入力の場合はデフォルトの JSON から判定します - 読み込みと正規化 — ソースを行の辞書のリストとして解析し、コンパクトな JSON にシリアライズします
- 構造を分析 — オブジェクトの配列は均一か、許容可能な深さか、最小行数を満たすかを確認します
- 早期に判定 — 対象外のデータは CLI 呼び出しの前にスキップされるため、Node.js のオーバーヘッドはありません
- 変換と推定 — TOON CLI を実行し、トークンの削減量を計算します
- 削減量を判定 — しきい値未満なら JSON を返し、しきい値以上ならレポートとともに TOON を返します
どの経路でも、decision、reason、トークン推定値を含む ConversionReport が返されます。パイプラインで予期しない動作が起こることはありません。
クイックスタート
JSON(標準入力):
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 には、3 つのツールを備えた 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 リファレンス
| フラグ | デフォルト | 説明 |
|---|---|---|
--format | auto | 入力形式:json、csv、jsonl、yaml、xml、excel、parquet、avro、orc、numbers |
--force | false | 判定と最小削減量のしきい値をバイパスします |
--min-savings | 0.15 | 必要な最小相対トークン削減量 |
--max-depth | 6 | 自動変換で許容する最大ネスト深度 |
--min-uniform-rows | 3 | 均一なオブジェクト配列に必要な最小行数 |
--timeout | 30 | TOON CLI 呼び出しを中断するまでの秒数 |
--report <path> | — | JSON 変換レポートをファイルに書き込みます |
--report-stdout | — | JSON 変換レポートを標準エラー出力に表示します |
-o <path> | stdout | 出力ファイルのパス |
--version | — | バージョンを表示して終了します |
形式はファイル拡張子から自動検出されます。上書きする場合や標準入力から読み込む場合は、--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)を避けながら、適したデータでは強制 TOON と同等の平均トークン数を実現します。判断ごとに、理由を含むレポートが表示されます。
| シナリオ | JSON ベースライン | 強制 TOON | datoon 自動 |
|---|---|---|---|
| 平均トークン数 | 77 | 50 | 50 |
| 平均トークン削減率 | 0.0% | 26.8% | 28.1% |
| 判断の品質 | 該当なし | すべて変換 | 3/5 を変換し、効果のないケースはスキップ |
| データセット | JSON | TOON(強制) | 元データからの削減率 | 自動 | 自動のトークン数 | 自動の削減率 |
|---|---|---|---|---|---|---|
| users-small | 54 | 40 | 25.9% | 変換 | 40 | 25.9% |
| events-medium | 219 | 162 | 26.0% | 変換 | 162 | 26.0% |
| orders-nested | 106 | 116 | -9.4% | スキップ | 106 | 0.0% |
| mixed-non-uniform | 35 | 47 | -34.3% | スキップ | 35 | 0.0% |
| metrics-wide | 142 | 103 | 27.5% | 変換 | 103 | 27.5% |
| 平均 | 111 | 94 | 7.1% | 3/5 を変換 | 89 | 15.9% |
強制変換では、5/5 のペイロードの変換に成功しました。
フォーマット変換ベンチマーク
一般的な構造化フォーマット(CSV、JSONL、XML、YAML)から変換した場合のトークン削減量です。 ベースラインは同じデータの JSON 表現です。これは、datoon を使わずに LLM が受け取る形式です。
| データセット | フォーマット | JSON トークン数 | TOON(強制) | 自動 | 自動のトークン数 | 自動の削減率 |
|---|---|---|---|---|---|---|
| users-csv | csv | 53 | 29 | 変換 | 29 | 45.3% |
| events-jsonl | jsonl | 194 | 109 | 変換 | 109 | 43.8% |
| catalog-xml | xml | 96 | 50 | 変換 | 50 | 47.9% |
| metrics-yaml | yaml | 129 | 61 | 変換 | 61 | 52.7% |
| 平均 | — | 118 | 62 | 4/4 を変換 | 62 | 47.4% |
強制変換では、4/4 のペイロードの変換に成功しました。
エージェントスキルの評価
アーティファクトベースのサブエージェント比較 — 同一の分析タスクを 2 つのモードで実施します。
with_skill:エージェントにdatoonスキルを与え、変換ワークフローに従わせます。without_skill:エージェントは JSON を直接使用し、TOON もdatoonも使用しません。
ペイロードサイズ 3 種類 × 3 回の反復 = エージェントの実行は合計 18 回です。どちらのモードも、回答の正解率は 100% でした。
| シナリオ | JSON の平均トークン数 | TOON の平均トークン数 | ペイロードの平均削減率 |
|---|---|---|---|
| 小 | 225 | 118 | 47.6% |
| 中 | 2,972 | 1,138 | 61.7% |
| 大 | 17,757 | 6,673 | 62.4% |
レポート全文と生の出力: benchmarks/agent_skill_eval/。削減量はペイロードのトークン数の推定値であり、エンドツーエンドのモデル使用トークン数全体ではありません。
開発
コントリビューターのワークフロー:CONTRIBUTING.md。メンテナー/エージェント向けメモ: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
リンク
- INSTALL.md — インストール方法の全体一覧、すべての対象、エージェントごとの詳細
- CONTRIBUTING.md — コントリビューターのワークフロー
- CLAUDE.md — エージェント向けメンテナーガイド
- CHANGELOG.md — リリース履歴
- SECURITY.md — 脆弱性の報告
- ライブドキュメント —
docs/ - イシュー — バグ、機能、質問
ライセンス
MIT
コメント
AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。