baton について
baton は、コーディングエージェントのセッションを形式間で変換するツールで、Claude Code のセッションを OpenCode などで継続できます。作業中にエージェントを切り替えたい開発者や、トランスクリプトを統一形式で保存したい開発者を対象とし、MCP サーバーとしても動作します。
主な機能
- 01複数のエージェント形式間でのセッション変換
- 02共通の中間表現による読み書き
- 03OpenCode への変換済みセッションの自動インポート
- 04各エージェントのセッションファイルの一覧表示
- 05セッション移行を MCP ツールとして提供
活用シーン
- 01利用上限に達した Claude Code のセッションを OpenCode へ移行
- 02難しいバグについて別のエージェントの意見を得る
- 03複数エージェントのセッションを統一形式でアーカイブ
MCP 対応
baton は MCP サーバーとして list_sessions、convert_session、import_to_target、detect_format を公開し、エージェントが会話中にセッションを移行できるようにします。
設定
ローカルサーバーの設定はどのクライアントでも共通です。コピーしてクライアントの MCP 設定ファイルに貼り付けてください。
ツール
ローカルサーバーのツールはマシン上で起動して初めて取得できます。メンテナーはまだツール一覧を提供していません。
詳細
コーディングエージェント間でバトンを渡しましょう。
任意のコーディングエージェントのセッションを、別の任意のエージェントに変換できます。コマンド1つ。中断したところから続けられます。
引き継いだトランスクリプトは 14/17 個の具体的な事実を保持していました。手書きの引き継ぎサマリーは 3/17 でした。ベンチマーク ↓
午後4時の問題
午後4時です。Claude Code が 「利用上限に達しました — 午後10時にリセットされます」 と表示します。あなたはセッションに3時間を費やしてきました。アーキテクチャは決定し、エッジケースは洗い出し、diff は半分まで書けています。
❌ baton なしの場合 — 別のエージェントを開いてゼロからやり直し。計画を再度説明し、ファイルを読み直し、すでに下したすべての決定を再び議論することになります。
✅ baton ありの場合 — セッションを引き継いで続行できます:
baton convert --from claude-code --to opencode --latest --import
# using latest claude-code session: 2026-07-09 15:58 Refactor the auth middleware to…
# passed baton: claude-code → opencode (1388 messages) → handoff.json
# Imported session: ses_8c4c973a521549e2
opencode -s ses_8c4c973a521549e2 # same conversation, different runner
あらゆる方向に機能します。タスクの途中でエージェントを切り替えたり、難しいバグについて別の意見を試したり、セッションをエディターのエージェントからターミナルのエージェントへ移したり、すべてを1つの形式でアーカイブしたりできます。
クイックスタート
# zero-install run (downloads prebuilt binary)
npx @kasabeh/baton-mcp --help
# convert your most recent session + auto-import into the target agent
baton convert --from claude-code --to opencode --latest --import
# or omit the path to pick interactively — newest first,
# each session previewed by its first user message
baton convert --from claude-code --to opencode --import
# or pass an explicit session file
baton convert --from claude-code --to opencode <session.jsonl> --import
# see every session on your machine, across all agents
baton list
セッションファイルはどこにありますか?
これらを自分で探し回る必要はありません(--latest と対話形式のピッカーが自動で見つけてくれます)が、参考までに — 各エージェントはトランスクリプトをディスク上に保存します:
| エージェント | 場所 |
|---|---|
| Claude Code | ~/.claude/projects/<encoded-cwd>/<session-uuid>.jsonl |
| Codex CLI | ~/.codex/sessions/<YYYY>/<MM>/<DD>/rollout-*.jsonl |
baton list は、検出できるすべてのセッションのパスを、すべてのエージェントにわたって出力します。
サポートされる形式
| エージェント | 読み込み | 書き込み | 自動インポート |
|---|---|---|---|
| Claude Code | ✅ | ✅ | — |
| OpenCode | ✅ | ✅ | ✅ opencode import |
| Codex CLI | ✅ | ✅ | — |
| Gemini CLI | ✅ | ✅ | — |
| Zed | ✅ | ✅ | — |
| Aider | ✅ | ✅ | — |
| Cursor | ✅¹ | —² | — |
| Continue | ✅ | — | — |
| Cline / Roo | ✅ | —² | — |
¹ Cursor はエクスポートされた JSON から読み込みます(sqlite3 state.vscdb "SELECT value FROM ItemTable WHERE key='aiService:chats'")
² 予定なし: Cursor と Cline はセッション状態をエディターのデータベース(SQLite / VS Code の globalState)内に保持しており、ファイルレベルのインポート経路がありません。
ベンチマーク
トランスクリプト全体を引き継ぐことは、次のエージェントのために引き継ぎサマリーを書くことより優れているのでしょうか?実際の 3.4 MB の Claude Code セッションで両方を測定しました(両アームとも同じモデル、異なるのはコンテキストのみ):
| セッションサイズ | baton トランスクリプト | 引き継ぎサマリー |
|---|---|---|
| sm (93 KB) | 3/3 の詳細を想起 | 1/3 |
| md (198 KB) | 6/6 | 1/6 |
| lg (599 KB) | 5/8 | 1/8 |
| 合計 | 14/17 | 3/17 |
サマリーは、最も小さなスライスであっても具体的な事実(バージョン、行数、MSRV)を失いました — 受け取ったエージェントはそれらを再発見するためにファイルを読み直し、コマンドを再実行する必要がありました。機械的な忠実性: 896 件のメッセージすべてがすべてのターゲットに書き込まれます。ラウンドトリップの損失は、各ターゲット形式の表現力の差を反映しています(claude-code 896/896、codex 736、gemini-cli 723、aider 111 — チャットテキストのみを保存するため)。
さらに タスク継続 も測定しました: セッションをタスク途中の3つの時点で切断し、新しいエージェントにタスク、状態、次のステップを述べるよう依頼しました。結果: 同等(baton 10/12、引き継ぎ 10/12)— 優れたサマリーは次に何をすべきかには十分です。トランスクリプトは、サマリーの作成者が予期しなかった具体的な事実に関する問いに答えるものです。そして、サマリーはエージェントがトランスクリプト全体を読んで書くことに時間を費やして初めて存在します — baton はその移行を無償にします。
詳細な方法論、注意事項、再現手順: benchmark/RESULTS.md。
MCP サーバー
baton は MCP サーバーでもあります — エージェントは会話の途中で、自分自身でバトンを渡すことができます:
| ツール | 説明 |
|---|---|
list_sessions | すべてのエージェントをスキャンし、統合されたリストを返します |
convert_session | セッションをある形式から別の形式に変換します |
import_to_target | 変換 + 対象エージェントのインポートコマンドを実行します |
detect_format | ファイル/ディレクトリを検査し、どのエージェントが生成したかを報告します |
baton install # registers baton in every detected agent's MCP config
baton doctor # verify
baton uninstall # remove from all agents
仕組み
Claude Code session (.jsonl)
│
▼
baton read ──► canonical Session { messages: [Text, Reasoning, ToolCall, ToolResult] }
│
▼
baton write ──► OpenCode import JSON (SessionV1 schema)
すべてのエージェント形式は正規の中間表現に読み込まれ、その後、対象の形式で書き出されます。新しい形式の追加は O(1) であり、ペアごとのコンバーターのような O(N×M) ではありません。
インストール
# npm (prebuilt binary, no Rust needed)
npm install -g @kasabeh/baton-mcp
# Homebrew
brew install kaseban/tap/baton-mcp
# Cargo binstall (prebuilt binary)
cargo binstall baton-mcp
# Cargo (from source)
cargo install baton-mcp
# Shell installer (prebuilt binary)
curl --proto '=https' --tlsv1.2 -LsSf https://github.com/Kaseban/baton/releases/latest/download/baton-mcp-installer.sh | sh
または GitHub Releases からバイナリを取得してください。
ビルド
git clone https://github.com/Kaseban/baton.git
cd baton
cargo build --release
./target/release/baton --help
コントリビューション
各形式は src/formats/<name>.rs にあり、Format トレイト (read + write) を実装しています。完全なリファレンス実装については src/formats/claude_code.rs を参照してください。
9 つの形式すべてにリーダーがあります。Claude Code、OpenCode、Codex、Zed、Aider、Gemini CLI にはライターもあります。現在最もインパクトのあるコントリビューションは、Continue 向けのライターです。
デモの再生成
README の GIF は VHS でスクリプト化されています: vhs assets/demo.tape。これは、偽のセッションが格納されたサンドボックス化された $HOME (/tmp/demo) に対して記録されるため、実際のセッションデータが GIF に含まれることはありません。
バトンを落とさないでください。
ライセンス
MIT OR Apache-2.0 のデュアルライセンスです。
コメント
AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。