mcpField
B
Baton

Baton

ローカル
kanumuri9593.github.io開発ツール15 日前に更新

Baton について

Batonは、Flutter、Web、React Native、ネイティブiOS・Androidアプリを実行・検査するローカルデーモン、MCPサーバー、CLIです。コーディングエージェントが変更を適用し、リロード結果、エラー、ネットワークリクエスト、スクリーンショットを確認できます。

主な機能

  1. 01デバイスやブラウザーでアプリを実行
  2. 02対応ターゲットのホットリロードと再起動
  3. 03新しいエラーや通信障害の報告
  4. 04スクリーンショットの取得
  5. 05複数プロジェクトとセッションの管理

活用シーン

  1. 01コード変更ごとのアプリ確認
  2. 02フロントエンドとAPIの同時実行
  3. 03レビュー用アプリスクリーンショットの取得
  4. 04モバイルシミュレーターでの変更テスト

MCP 対応

BatonはMCPサーバーを通じて、アプリの検査、実行、リロード、ログ、スクリーンショット操作を提供します。MCPクライアントはツールでターゲットを実行し、変更を確認してセッションを管理できます。

設定

ローカルサーバーの設定はどのクライアントでも共通です。コピーしてクライアントの MCP 設定ファイルに貼り付けてください。

mcp.json · 共通設定
{
"mcpServers": {
"kanumuri9593-baton": {
"command": "npx",
"args": [
"-y",
"baton-run"
]
}
}
}
起動コマンドnpx -y baton-run

ローカルサーバーにはマシン上の実行環境(Node.js 18 以上など)が必要です。設定ファイルの場所はクライアントごとに異なります。

パッケージ
npmbaton-run0.2.10

ツール

29

掲載時のツール一覧 · 3 週間前に更新

パラメーター型必須説明
rootstringいいえ
limitintegerいいえ
querystringいいえ
sincenumberいいえ
sessionsarrayいいえ
errorsOnlybooleanいいえ

詳細

Baton

Baton

あらゆるコーディングエージェントから、アプリの実行、ホットリロード、チェック、スクリーンショットの撮影ができます。
Flutter、Next.js、Vite、React Native / Expo、ネイティブの iOS および Android アプリを、ターミナル、Baton アプリ、または任意の MCP クライアントから操作できます。

npm バージョン CI MIT ライセンス Node >= 24 MCP Registry: io.github.kanumuri9593/baton

ウェブサイト · エージェントのセットアップ · エージェント向けメモ · PDF ガイド · トークン調査 · 変更履歴

VS Code にインストール VS Code Insiders にインストール Baton を Cursor に追加

エージェントがウェブページを編集し、check_change がブラウザーのコンソールエラーとともに NOT OK を報告します。エージェントが誤字を修正すると、check_change はスマートフォンのスクリーンショットとともに OK を報告します

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
  1. cwd にプロジェクトの絶対パスを設定して、inspect_project(および list_targets)を実行します。
  2. シミュレーターまたはエミュレーターが起動していない場合は、boot_device を実行します。名前を指定しない場合は、起動可能なデバイスの一覧が表示されます。
  3. run_target を実行します。API とフロントエンドを使う場合は run_workflow を実行し、その後 wait_for を使います。wait_for は最大 15 分待機できるため、初回のネイティブビルドにも十分です。
  4. 編集のたびに 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
Codexcodexdocs/clients/codex.md
Cursorcursordocs/clients/cursor.md
VS Code(GitHub Copilot エージェントモード)vscodedocs/clients/vscode.md
Antigravityantigravitydocs/clients/antigravity.md
Gemini CLIgeminidocs/clients/gemini-cli.md
Windsurfwindsurfdocs/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 / ExpoFast 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 が作成・保守しています。

コメント

MCP は初めてですか?

プロトコルの概要から最初のサーバーの導入まで、よくある疑問にまとめて答えます。

AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。