Baton について
Batonは、Flutter、Web、React Native、ネイティブiOS・Androidアプリを実行・検査するローカルデーモン、MCPサーバー、CLIです。コーディングエージェントが変更を適用し、リロード結果、エラー、ネットワークリクエスト、スクリーンショットを確認できます。
主な機能
- 01デバイスやブラウザーでアプリを実行
- 02対応ターゲットのホットリロードと再起動
- 03新しいエラーや通信障害の報告
- 04スクリーンショットの取得
- 05複数プロジェクトとセッションの管理
活用シーン
- 01コード変更ごとのアプリ確認
- 02フロントエンドとAPIの同時実行
- 03レビュー用アプリスクリーンショットの取得
- 04モバイルシミュレーターでの変更テスト
MCP 対応
BatonはMCPサーバーを通じて、アプリの検査、実行、リロード、ログ、スクリーンショット操作を提供します。MCPクライアントはツールでターゲットを実行し、変更を確認してセッションを管理できます。
設定
ローカルサーバーの設定はどのクライアントでも共通です。コピーしてクライアントの MCP 設定ファイルに貼り付けてください。
ツール
29掲載時のツール一覧 · 3 週間前に更新
| パラメーター | 型 | 必須 | 説明 |
|---|---|---|---|
| root | string | いいえ | |
| limit | integer | いいえ | |
| query | string | いいえ | |
| since | number | いいえ | |
| sessions | array | いいえ | |
| errorsOnly | boolean | いいえ |
詳細
Baton
あらゆるコーディングエージェントから、アプリの実行、ホットリロード、チェック、スクリーンショットの撮影ができます。
Flutter、Next.js、Vite、React Native / Expo、ネイティブの iOS および Android アプリを、ターミナル、Baton アプリ、または任意の MCP クライアントから操作できます。
ウェブサイト · エージェントのセットアップ · エージェント向けメモ · PDF ガイド · トークン調査 · 変更履歴
Baton は、実行中のアプリを管理するローカルデーモンと、その前面で動作する MCP サーバーおよび CLI です。エージェントはシミュレーターまたはブラウザーでアプリを起動し、編集のたびに check_change を 1 回呼び出します。すると、リロード結果、エラー行、失敗したリクエスト、スクリーンショットを含む新しい情報だけが、OK / NOT OK の判定とともに返されます。同じ実行結果をターミナル、Baton アプリ、Claude Code のプロンプト上部のバンドで確認でき、同じボタンを押すこともできます。Baton は、既存の .vscode/launch.json、package.json、pubspec.yaml、Xcode プロジェクト、Gradle プロジェクトを読み取ります。
0.2.10 は一般公開されている開発者向けプレビューです。 不具合や希望する機能については、イシューを作成してください。
クイックスタート
アプリを実行するマシンに Node.js 24+ が必要です。macOS、Linux、Windows に対応しています。
npm install -g baton-run
baton setup # adds Baton to every coding agent installed on this machine
エージェントを再起動するか、新しいチャットを開いて、「アプリを実行して、スクリーンショットを見せて」と頼みます。
その他の方法:
| 方法 | コマンド |
|---|---|
| Claude Code プラグイン | /plugin marketplace add kanumuri9593/Baton then /plugin install baton@baton |
| Codex プラグイン | codex plugin marketplace add kanumuri9593/Baton then codex plugin add baton@baton |
| VS Code または Cursor、ワンクリック | このページ上部にあるインストールボタン |
| VS Code MCP ギャラリー | Extensions ビューで @mcp baton を検索します(GitHub MCP Registry の掲載情報) |
| MCP サーバー、インストール不要 | サーバーコマンドとして npx -y baton-run を実行します([email protected] でバージョンを固定) |
| GitHub からバージョンを固定してインストール | npm install -g github:kanumuri9593/Baton#v0.2.10 |
| ソースから | git clone https://github.com/kanumuri9593/Baton.git && cd Baton && npm install && npm run build |
baton setup は各ツールの設定にある baton エントリーのみを編集し、変更するすべてのファイルのバックアップ .baton-backup を保持するため、再実行しても安全です。baton setup cursor codex を実行すると対象をそのツールに限定でき、--dry-run は変更内容を事前に確認し、--remove は設定を元に戻します。
mcpServers ブロックを受け取る MCP クライアントであれば、いずれも使用できます。
{
"mcpServers": {
"baton": { "command": "npx", "args": ["-y", "[email protected]"] }
}
}
エージェントのループ
inspect_project → boot_device → run_target → wait_for → edit → check_change → fix → check_change
cwdにプロジェクトの絶対パスを設定して、inspect_project(およびlist_targets)を実行します。- シミュレーターまたはエミュレーターが起動していない場合は、
boot_deviceを実行します。名前を指定しない場合は、起動可能なデバイスの一覧が表示されます。 run_targetを実行します。API とフロントエンドを使う場合はrun_workflowを実行し、その後wait_forを使います。wait_forは最大 15 分待機できるため、初回のネイティブビルドにも十分です。- 編集のたびに
check_changeを実行します。編集を適用し(Flutter はホットリロード、Web と React Native は HMR、ネイティブアプリと通常のプロセスは再起動)、変更された部分だけを返します。
NOT OK console/storefront action=none status=running 2280ms
new errors (1):
[vite] Internal server error: Unexpected token (14:2)
Flutter のリロードに失敗した場合は、DevFS synchronization failed だけでなく、コンパイラーエラーが返されます。
lib/main.dart:419:19: Error: Expected ';' after this.
スクリーンショットは、iOS シミュレーター、Android デバイス、Web アプリに対応しています。Web の場合、Baton はセッション URL を、一時的なヘッドレス Chrome、Edge、Brave(または BATON_CHROME)で、phone(実際の 390×844 のモバイルレイアウト)、tablet、desktop、または WIDTHxHEIGHT のビューポートで開きます。
Web のキャプチャはデフォルトで 1×です。そのため、スマートフォンの画像は 390×844 となり、モデルで約 430 個の画像トークンを使用します。細部が重要な場合は、scale: 2(--scale 2)を指定してください。screenshot: false を指定した check_change はテキストのみを返しますが、Web ページの読み込みは行うため、コンソールエラーも報告されます。シミュレーターとデバイスのスクリーンショットは、それぞれの画面解像度で返されます。
Baton はアプリを起動し、証拠を報告します。UI のタップやスクリーンショットの判定は行いません。キャプチャが意味するのは画像が書き込まれたということであり、画面が正しいということではありません。入力が必要なフローでは、Playwright MCP、Chrome DevTools MCP、またはデバイス制御用 MCP と組み合わせてください。
29 個のツール: inspect_project、list_targets、list_sessions、list_checkouts、list_devices、boot_device、run_target、run_workflow、check_change、hot_reload、hot_restart、stop_session、forget_session、wait_for、read_logs、session_summary、screenshot、set_debug_flag、diagnose、list_network_requests、get_network_request、clear_network_requests、read_launch_config、write_launch_config、run_proof、list_proofs、list_run_history、show_dashboard、dashboard_action(MCP Apps をサポートするホストで show_dashboard が描画するライブカード上のボタン)。各ツールには MCP ヒントが付いているため、それを尊重するクライアントは読み取り専用の 16 個のツールでプロンプトを省略できます。
対応エージェント
| エージェント | baton setup の ID | ガイド |
|---|---|---|
| Claude Code(ターミナル、デスクトップアプリ、VS Code) | claude(プラグインをインストールします) | docs/clients/claude-code.md |
| Codex | codex | docs/clients/codex.md |
| Cursor | cursor | docs/clients/cursor.md |
| VS Code(GitHub Copilot エージェントモード) | vscode | docs/clients/vscode.md |
| Antigravity | antigravity | docs/clients/antigravity.md |
| Gemini CLI | gemini | docs/clients/gemini-cli.md |
| Windsurf | windsurf | docs/clients/windsurf.md |
| Claude Desktop(チャット) | 手動のみ | docs/clients/claude-desktop.md |
MCP に対応していないエージェントは、同じ CLI をシェルから実行できます。すべてのコマンドは失敗時に 0 以外の値で終了し、
baton check <session> --json は check_change と同じ判定を返します。エージェントに関する詳細:
AGENTS.md。クローラー向けの概要:llms.txt。
共有用の印刷可能なガイド:クイックスタート、 エージェントセットアップガイド、FAQ。
Claude Code 内:Baton バンド
プラグインは、ターミナルとデスクトップアプリで何かが実行されている間、プロンプトの上に Baton を表示します。実行ごとに 1 行で、デバイスまたは URL、ステータス、CPU とメモリ、アイコンボタンが表示されます。
| ボタン | 機能 |
|---|---|
| ☰ | その実行の最近のログを行の下に表示または非表示にします |
| 🐞 | デバッグ:Claude に実行時のエラーとログを読み込み、原因を修正して check_change を実行するよう依頼します |
| ▶ | 再生:実行中のアプリをホットリロード(または再起動)し、一時停止中のアプリを再開するか、終了後にもう一度実行します |
| ⏸ | アプリを一時停止します(macOS) |
| ⏹ | 停止します。実行が終了すると、✕(閉じる)に変わります |
| ⧉ | その実行専用のシミュレーターウィンドウ(またはウェブページ)を前面に表示します(macOS) |
ヘッダーには +(新しい実行:プロンプトに /baton:run を挿入)と、すべての実行に対する ▶ ⏸ ⏹ ⧉ が用意されています。一括表示を押すと、すべてのデバイスのウィンドウが前面に表示されます。/baton を実行すると、同じワークスペースがより長いログとともにサイドペインに表示されます。バンドとペインは MCP ツールと同じデーモンを参照するため、Claude、CLI、Baton アプリのいずれから開始した実行も、すべての場所に表示されます。詳細:
docs/clients/claude-code.md。
対応内容
| フレームワーク | ホットリロード(状態を保持) | 再起動 | 備考 |
|---|---|---|---|
| Flutter / Dart | ✅ デーモンプロトコルによる実際のホットリロード | ✅ ホットリスタート | デバイス、DevTools、デバッグフラグ、スクリーンショット(Flutter web も対応) |
| Next.js、Vite、Nuxt、Astro、Remix、Angular、CRA | 保存時に HMR を自動実行 | ✅ 開発サーバーを再起動 | 実際の URL と準備状態を検出。スマートフォン、タブレット、デスクトップのスクリーンショットに対応 |
| React Native / Expo | Fast Refresh を自動実行 | ✅ 開発クライアントにリロードをブロードキャスト | Metro のメッセージソケットと通信 |
| ネイティブ iOS(Xcode) | — | ✅ ビルド、再インストール、再起動 | 選択したシミュレーター向けにビルドし、インストールして起動。ログを追跡し、スクリーンショットを撮影 |
| ネイティブ Android(Gradle) | — | ✅ ビルド、再インストール、再起動 | installDebug を実行し、ランチャーアクティビティを起動。logcat を追跡し、スクリーンショットを撮影 |
| その他すべて | — | ✅ 終了して再起動 | 任意の launch.json または package.json スクリプト |
機能は実態に即して報告されます。Vite のセッションが Flutter の状態を保持するホットリロードに対応しているかのように表示されることはありません。そのため、コントロールパネルではボタンがグレーアウトし、エージェントには何も起きないままになるのではなく、明確な拒否が返されます。
ターゲットの検出元
Baton は、すでにある設定を読み取ります。新しい設定ファイルは必要ありません。
.vscode/launch.json。読み取りのみで、変更しないため、IDE はそのまま使えます.claude/launch.json。同じ形式ですpackage.json:dev、start、serve、storybookのスクリプト。パッケージマネージャーはロックファイルから判定しますpubspec.yaml:launch.jsonがない Flutter プロジェクトにもデフォルト設定を用意します- Xcode:
.xcodeproj/.xcworkspace、共有スキーム、Podfile、またはPackage.swift - Gradle:
settings.gradle(.kts)、ラッパー、アプリケーションモジュール、または単独のAndroidManifest.xml
ios/ または android/ のネストされたフォルダーだけを選択すると、ネイティブターゲットになります。Flutter
または React Native のルートを選択すると、ホットリロードを行うフレームワークが実行されます。ネイティブセッションでは、
選択したデバイス上でビルド、インストール、起動を行い、その後アプリのログを追跡します。再起動すると再ビルドして
再起動します。
baton init は、検出した内容から .vscode/launch.json を作成します(.claude/launch.json の場合は
--claude を指定します)。小規模な起動設定については、examples/ を参照してください。
CLI
baton list # every target, and where it came from
baton run "iOS Simulator (DEV)" # names match on any unambiguous substring
baton run "iOS Simulator (DEV)" --branch origin/main
baton ps # what's running
baton logs dev -f # follow output
baton check webapp --viewport phone # did my edit break anything?
baton reload --all
baton stop --all
baton devices --all # connected devices, plus every one you could boot
baton boot "iPhone 17 Pro Max" # start a simulator that isn't running
baton add ~/code/storefront # watch another project too
baton doctor # sources, blockers, nested projects, guidance
baton app # the control panel
baton help ですべてのコマンドを確認できます。
複数のアプリとプロジェクトを同時に実行する
依存関係の順序に従って API とコンソールを 1 回の呼び出しで起動します。
baton workflow examples/workflow-lab/workflow.json
結果にはセッション ID、準備状況、URL、問題が発生した箇所が表示されます。MCP エージェントは
run_workflow を使用します。依存関係のない2 プロジェクトのデリバリーラボをお試しください。
デーモンは 1 つのディレクトリに限定されません。baton add <path> で別のプロジェクトを追跡できます。コントロールパネルには、
プロジェクトごとのサイドレールと All が表示されます。セッション ID は
プロジェクトごとに割り当てられるため(storefront/npm-dev、api/npm-dev)、2 つのプロジェクトで同じ
npm dev を実行できます。セッションはデーモン上で動作するため、ターミナルを閉じてもアプリは停止しません。
まだ起動していないデバイス
connected
● iPhone 17 Pro 48F0A0D1-… ios (emulator)
● sdk gphone16k arm64 emulator-5556 android (emulator)
bootable
○ iPhone 17 Pro Max 3237F94B-… ios iOS 26.5
○ iPad mini (A17 Pro) 51470177-… ios iOS 26.5
○ Pixel 10 Pro Pixel_10_Pro android
Flutter のエミュレーター一覧ではすべての iPhone と iPad が 1 つの項目にまとめられるため、Baton は simctl
を直接呼び出します。baton boot "iPad mini" はデバイスを起動し、Flutter から認識できるまで待機してから、
実行に使用するデバイス ID を表示します。
git を切り替えずに別のブランチを使う
ローカルまたはリモートのブランチを選択すると、Baton は ~/.baton/worktrees の下に git worktree を作成し、
フォルダー内のシークレットと設定をコピーして(build/ や node_modules は除く)、そのコピーから実行します。
ブランチ、スタッシュ、エディターはそのままです。既存の worktree(エージェントがすでに編集しているフォルダー)
も追加でき、ホットリロードはそのフォルダーを追跡します。
baton run "iOS Simulator (DEV)" --branch origin/main
baton run "iOS Simulator (DEV)" --checkout ~/wt/agent-a
baton checkouts
起動前チェック
設定が gitignore 対象のファイルを参照していることはよくあります。Baton は事前にチェックし、見つからない場合は起動を拒否します。
✗ "iOS Simulator (DEV / dev flavor)" cannot run yet:
missing config/secrets.local.json — copy config/secrets.local.template.json to config/secrets.local.json
baton list も同じ方法でブロックされたターゲットを表示します。--force を指定すると、そのまま実行します。
デバイスをまたいだエビデンス
baton proof "Local lab" --branch main --devices "iPhone 17 Pro" --appearance light,dark
証跡バンドルにはログ、スクリーンショット、ネットワークの概要が含まれます。起動と検証のガイドを参照し、 認証情報が不要なFlutter ラボから始めてください。
バックエンドのトレース
Node の起動ターゲットでは、ローカルの OpenTelemetry HTTP/HTTPS および
fetch のメタデータを取得するために "batonTrace": true を設定できます。baton diagnose(および MCP の diagnose)は、
セッション全体にわたる上限付きのエラー概要を返します。baton diagnose <trace-id> --all を実行すると、
Node プロジェクトをまたいで 1 つのリクエストを追跡できます。ローカルバックエンドのトレースを参照してください。
The Baton アプリ
baton app
セッションごとにコンパクトな1行で表示します。ステータス、再読み込み/再起動/停止、ログ、アプリの URL と DevTools へのリンクを確認できます。r ですべてをホットリロードし、R でホットリスタートします。App Store からダウンロードすることはできません。
- macOS:ネイティブのフローティングランチャーとメニューバー項目を利用できます。フルスクリーンのターミナルより前面に表示され、フォーカスを奪いません。また、メニューバー項目には実行中のセッション数が表示されます。小さな AppKit ホストは初回使用時に
hud/のソースからコンパイルされます。Xcode または Command Line Tools が必要です。これらがない場合、Baton はブラウザーで開きます。 - Linux と Windows(または
baton app --browser):デーモンがループバック上で配信する、アプリ風のブラウザーウィンドウに同じページを表示します。外部へのリクエストはありません。
設定:docs/app-settings.md。baton hud は引き続き互換性エイリアスとして利用できます。
動作の仕組み
.vscode/launch.json ─┐
package.json ───────┤
pubspec.yaml ───────┼─► detect ─► daemon ─► one session per target
Xcode / Gradle ─────┘ │ (flutter | web-dev | react-native | ios | android | process)
│
WebSocket + POST /rpc on 127.0.0.1
├── Baton app (native panel on macOS, browser elsewhere)
├── baton (any terminal)
└── baton-mcp (any agent)
1つのデーモンがすべてのセッションを管理するため、ターミナルで開始したセッションはコントロールパネルとエージェントの両方から確認できます。デーモンは 127.0.0.1 にバインドし、ポートとトークンを記録した ~/.baton/daemon.json(モード 0600)を書き込みます。クライアントはこのファイルを読み取り、認証を行います。
Flutter の場合、セッションは flutter run --machine の子プロセスであり、各制御操作はドキュメント化された JSON プロトコル(app.restart、app.stop、app.callServiceExtension)による1回のリクエストです。FVM に対応しており、.fvm/flutter_sdk を指定しているプロジェクトでは、その SDK が使用されます。詳しくはdocs/architecture.mdをご覧ください。
ステータス
0.2.3 時点で、ライブラリ数3,692の大規模な本番 Flutter アプリでテスト済みです。ホットリロードは87 ms、ホットリスタートは359 msで、シミュレーターを3台同時に実行できました。また、Flutter、Vite、プレーンなワーカーの3つのプロジェクトを1つのコントロールパネルで並べて実行できました。Flutter アダプターが最も充実しています。Web と React Native のアダプターでは、実行、再起動、ログ、URL 検出に対応しています。
トラブルシューティング
ERR_UNSUPPORTED_NODE_MODULES_TYPE_STRIPPING:古い[email protected]を使用しています。npm uninstall -g baton-run && npm install -g baton-runを実行してください。- エージェントに Baton が表示されない:アプリを再起動するか、
baton setupの後に新しいチャットを開いてから、docs/clients.mdのツール別ガイドを確認してください。 - Web のスクリーンショットに失敗する:Chrome、Chromium、Edge、Brave のいずれかをインストールするか、
BATON_CHROMEにブラウザーのバイナリを指定してください。 - その他の問題:
baton doctorを実行するか、Claude Code で/baton:doctorを実行してください。
バージョンを固定せず github:kanumuri9593/Baton を指定すると、main が使用されます。#v0.2.10 を指定するか、npm install -g baton-run を実行することをおすすめします。
貢献
npm install
npm test # portable tests, no simulator required
npm run typecheck
CONTRIBUTING.mdをご覧ください。セキュリティ上の問題は、SECURITY.mdに記載されている方法で非公開に報告してください。このプロジェクトは行動規範に従っています。
アプリアイコンとベクターマークはassets/にあります。npm run icons を実行すると、一般的なすべてのサイズの PNG と macOS 用の .icns が生成されます。
ライセンス
MIT。Yeswanth Varma Kanumuri が作成・保守しています。
コメント
AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。