AIエージェントとMCP

MCPサーバ、エージェントのフック、エージェントのネットワークログ、エージェントスキル、Macをスリープさせない方法。

Claude Code、Codex、Cursor、Gemini CLI、Claude Desktop、Windsurf、Cline、Zed、Hermes Agent、OpenClaw、OpenCode、GitHub Copilot CLI、その他のMCPクライアントの詳しい設定手順は、AIエージェントでKilobatを設定するをご覧ください。

Claude Code、Codex、Cursorなどのエージェントに、次のプロンプトを渡します:

Install the Kilobat CLI with `brew install seifip/kilobat/kilobat`. Run `kilobat diagnose --json`, `kilobat status --json` and `kilobat scan --json`, then tell me what is slowing my connection and how to fix it. Ask me before changing DNS, profiles or rules.

MCPサーバ

kilobat mcpはstdio上でModel Context Protocolを話します。Claude Codeに追加するには:

claude mcp add kilobat -- kilobat mcp

または、mcpServers設定を読み込む任意のクライアントに追加します:

{ "mcpServers": { "kilobat": { "command": "kilobat", "args": ["mcp"] } } }

読み取り専用ツール:get_status、diagnose_network、diagnose_connection、get_conditions、get_updaters、get_uploads、get_data_pack、get_wifi、scan_wifi、suggest_wifi_channel、get_usage_report、compare_usage、get_app_bandwidth、get_access_policy、get_network_history、list_sessions、agent_network_log(エージェントとそのコマンドが接続したすべてのホスト)、benchmark_dns、check_url、list_connections、list_devices、trace_route、get_route_history、compare_speed_tests、get_exit_path(エージェントがpublic_ipを渡した場合にのみCloudflareに公開IPを問い合わせます)、check_vpn_leaks(外部サービスに問い合わせるリークテスト)、list_networks、get_fastest_dns(アプリの静かな測定によるネットワークごとの最速DNS)、list_rules、list_approvals、list_blocked_connections、explain_verdict(ホストまたはアプリに一致するすべてのルールと判定したルール)、check_host_reputation(ホストがマルウェア、フィッシング、詐欺、トラッカーのリストにあるかをこのMacで確認)、get_protection_status、run_stutter_testとget_game_ping(pingのみ送信)、get_nearby_radios、get_captive_portal(kilobat portal --jsonと同じWi-Fiサインインページ)、service_status(指定されたサービスまたは実行中アプリの公開ステータスページに問い合わせ)、create_support_report(エージェントが渡すプロバイダ向けレポート)。CLIと同じJSONを返します。run_speedtestはデータを使用し、run_lan_testは確認後に自分のネットワーク上で5秒間データを転送します。keep_awakeとrelease_awakeは設定を変えずに一定時間アイドルスリープを防ぎます。keep_awakeをlid_closedとともに使うと、許可後に蓋を閉じたままでもMacを動作させ、先に確認します。変更ツール(set_profile、set_app_rule、set_new_app_mode、decide_approval、block_destination、set_budget、set_data_pack、set_app_quota、set_network_cost、set_updater_pause、set_kill_switch、自分のリクエストを通すために保護をオフにしないようエージェントにも伝えるset_protection、別のアプリのアップロードを保留するhold_upload、キャッシュも消去するset_dns、set_fastest_dns、set_dns_fallback、AirDrop設定を開くset_airdrop_visibility)は変更としてマークされ、説明には先に確認するよう記載されています。

エージェントを接続

フックがない場合、Kilobatはエージェントの通信とCPUから判断するため、静かなエージェントが完了したのか入力待ちなのかを区別できません。フックを使うと、実行がどのプロジェクトのものか、いつ入力待ちになり、いつ完了したかをKilobatに伝えられます。各フックはkilobat agent-eventを実行します。これは何も出力せず、すぐに戻り、常に0で終了するため、エージェントの動作を妨げることはありません。アプリが起動していない場合、イベントは小さなファイルに保存され、アプリの起動時に読み込まれます。Kilobatが読み取るのはセッションID、フォルダ、短い状態テキストだけで、プロンプトや応答は読みません。既存のフックとマージして使ってください。

Claude Code:~/.claude/settings.jsonに記述します。各フックはセッションIDとフォルダを含むJSONをstdinで受け取り、--stdin-jsonがそれを読み取ります。権限や入力の確認は「入力待ち」、Stopはバックグラウンドタスクの終了後に「完了」、レート制限はリセットまで「入力待ち」を意味します。

{
  "hooks": {
    "SessionStart": [{ "hooks": [{ "type": "command", "command": "kilobat agent-event --agent claude --stdin-json" }] }],
    "UserPromptSubmit": [{ "hooks": [{ "type": "command", "command": "kilobat agent-event --agent claude --stdin-json" }] }],
    "Notification": [{ "hooks": [{ "type": "command", "command": "kilobat agent-event --agent claude --stdin-json" }] }],
    "Stop": [{ "hooks": [{ "type": "command", "command": "kilobat agent-event --agent claude --stdin-json" }] }],
    "StopFailure": [{ "hooks": [{ "type": "command", "command": "kilobat agent-event --agent claude --stdin-json" }] }],
    "SessionEnd": [{ "hooks": [{ "type": "command", "command": "kilobat agent-event --agent claude --stdin-json" }] }]
  }
}

Codex(最も簡単な方法):~/.codex/config.tomlのnotifyを使います。Codexは各ターンの後にJSON引数を渡し、--json-argがそれを読み取ります。通知されるのは完了だけで、Codexが実行できるnotifyプログラムは1つだけです。

notify = ["kilobat", "agent-event", "done", "--agent", "codex", "--json-arg"]

入力待ちも通知したい場合は、代わりに~/.codex/hooks.jsonでCodexのフックを使い、/hooksで信頼済みにします:

{
  "hooks": {
    "SessionStart": [{ "hooks": [{ "type": "command", "command": "kilobat agent-event --agent codex --stdin-json" }] }],
    "UserPromptSubmit": [{ "hooks": [{ "type": "command", "command": "kilobat agent-event --agent codex --stdin-json" }] }],
    "PermissionRequest": [{ "hooks": [{ "type": "command", "command": "kilobat agent-event --agent codex --stdin-json" }] }],
    "Stop": [{ "hooks": [{ "type": "command", "command": "kilobat agent-event --agent codex --stdin-json" }] }]
  }
}

Gemini CLI:~/.gemini/settings.jsonに記述します。Gemini CLIはnodeとして動作するため、Kilobatはその通信を実行と結び付けられませんが、状態は届きます。

{
  "hooks": {
    "SessionStart": [{ "hooks": [{ "type": "command", "command": "kilobat agent-event --agent gemini --stdin-json" }] }],
    "BeforeAgent": [{ "hooks": [{ "type": "command", "command": "kilobat agent-event --agent gemini --stdin-json" }] }],
    "Notification": [{ "hooks": [{ "type": "command", "command": "kilobat agent-event --agent gemini --stdin-json" }] }],
    "AfterAgent": [{ "hooks": [{ "type": "command", "command": "kilobat agent-event --agent gemini --stdin-json" }] }]
  }
}

Cline(CLI、SDK、Kanban):Kilobatのプラグインをインストールします。Clineのプラグインストアにファイルを1つ追加するだけで、ほかの設定は変更しません。cline plugin uninstall kilobatで削除できます。

cline plugin install https://kilobat.app/agents/cline/kilobat.ts

報告する状態は、作業中、完了、失敗(Clineが開いている間)、キャンセル、レート制限(Cline自身のリトライが尽きた後)、入力待ち(Clineが質問しているとき)です。実行を完了とする前に、サブエージェントやチームメイトの終了を待ちます。Clineの承認プロンプトはプラグインからは見えないため、その部分は通信とCPUによる検出で補います。

そのほかのエージェントも、独自のフックからkilobat agent-event start|working|waiting|done|failed --agent <name> --session <id> --cwd <folder>を呼び出せます。手動で試すときは--verboseを付けると、何が起きたかを確認できます。

エージェントのネットワークログ

Claude Code、Codex、Cursor、Gemini CLI、Aider、Windsurf、Claude Desktop、ChatGPTなどのエージェントの実行中、Kilobatはエージェントとそれが起動したプロセスが接続したすべてのホストを記録します:npm、pip、uv、curl、git、brew、MCPサーバ。間にシェルが入っていても記録されます。各セッションは、エージェントのプロセスが起動してから、エージェントとそれが起動したものがすべて終了するまでで、接続したプロセスごとにホストを送信量の多い順に並べ、ポートとプロトコル、初回と最終の検出時刻、送受信バイト数、接続数、エージェントが実行されたプロジェクトフォルダを表示します。「履歴」›「エージェントのネットワークログ」にあり、エージェントの実行中はメニューに「Claude Code · ホスト14件 · 送信2.1 MB」のような1行が表示されます。「Markdownとしてコピー」を使うと、セッションの表をIssueやレビュー用にクリップボードにコピーできます。

フラグは、もう一度見ておく価値があるものを示すだけで、何かが問題だという意味ではありません:初回(このMacのエージェントがそのホストに接続したのは初めて。registry.npmjs.org、pypi.org、github.comなどのよく知られたレジストリと、エージェント自身のサービスは新規扱いになりません)、暗号化なしのHTTP(ポート80)、大きなアップロード(エージェント自身のサービス以外の1つのホストに10 MB超。Claude CodeがAnthropicにコンテキストを送ってもフラグは付きません)、アドレスのみ(ホスト名が不明)、共有・トンネル(ペーストサイト、transfer.shなどのファイル共有、ngrokやtrycloudflare.comなどのトンネル、webhook.siteなどのリクエストキャッチャーの短いリスト)。「フラグ付きのみ」を選ぶと、これらだけが表示されます。

仕組み:Kilobatはもともと、macOSの接続ごとのネットワーク統計(nettopと同じもの)を、各接続のプロセスとともに毎秒読み取っています。エージェントは、実行ファイル、インタープリタが実行するパッケージ(node …/@openai/codex、python3 -m aider)、またはアプリ自身の実行ファイルから認識し、各エージェントのプロセスツリーを追跡します。ツリー内のプロセスがforkした瞬間にカーネルから通知が届くため、0.1秒しか動かないcurlでも実行中に割り当てられ、launchdに親が付け替えられたプロセスもそのエージェントのものとして扱われます。いちばん近いエージェントが優先されるので、Cursorのターミナルで実行したClaude CodeはClaude Codeのものになります。ホスト名は、ネットワークフィルタがオンならKilobatのフィルタ(アプリが問い合わせた名前)から取得します。ほかに、よく知られた開発者向けホストと、エージェントのcurlやgitのURLにあるホストをMacのリゾルバで引いてアドレスを照合するか、逆引きDNSを使います。逆引きDNSはアプリが問い合わせた名前ではなくサーバの名前なので、マークが付きます。どれも得られない場合、行にはアドレスが表示されます。

確認できないもの:macOSのサービスがプロセスのために行う通信(DNSの名前解決はmDNSResponder、ダウンロードはnsurlsessiond経由)、DockerコンテナとVM(通信はDockerまたはVM自身のプロセスから出ます)、エディタの機能拡張ホスト内で実行されるエージェント(VS CodeのClineやCopilotなど、エディタと区別できません)。CursorとWindsurfでは、内蔵ターミナルに入力したコマンドはアプリの通信として集計されます。1秒間隔の2回のサンプルの間に開閉した接続も、ホスト名なしでセッションのバイト数に含まれます。カーネルのfork通知が処理される前に開始・終了したプロセスは見逃される場合があります。ログはKilobat ProでこのMacの~/Library/Application Support/Kilobat/agent-network-log.jsonにのみ記録され、30日間保持され、どこにも送信されません。「消去」では過去1時間、今日、すべてを選べます。

保護機能がオンの場合、Kilobatが拒否した接続も、データを1バイトも運んでいなくてもセッションに表示され、リストまたはエージェントガードのルールとともに「ブロック」と示されます。

ターミナルでは、kilobat agent-logで最新のセッションを表示します。エージェントが実行した場合は、そのエージェント自身のセッションです。--all、--since 2h、--agent claude、--flagged、--jsonで絞り込めます。読み取りは無料で、kilobat agent-log --watchを使えばアプリやProなしでターミナルにリアルタイムで記録できます(何も保存されません)。エージェントは読み取り専用のMCPツールagent_network_logを呼び出せます。引数なしなら自分のセッションが返るので、自分が実行したインストールがどこと通信したかを確認できます。

履歴を消去またはサイトを削除

「設定」›「データとプライバシー」のサイトを削除は、ホストをブロックされた試行、エージェントネットワークログ、エージェントの実行とスリープ防止セッションの接続先、保護の通知履歴から削除します。サブドメインを含めるとwww.example.comなども削除されます。「サイト履歴を消去」では過去1時間、午前0時以降、またはすべての同じ記録を削除します。ブロックされた試行とエージェントネットワークログにはそれぞれ消去メニューがあり、ホスト行のコンテキストメニューからも削除できます。履歴を消去してもルールと保護設定は保持されます。今後のアクティビティは再び記録される場合があります。

ターミナルではkilobat history forget example.com --subdomains --jsonまたはkilobat history clear --hourを使用します(--todayと--allも利用可能)。アプリの起動中はライブ記録の削除をアプリに依頼し、終了中は保存された履歴を編集します。MCPのclear_historyも同様に動作しますが、エージェントに履歴消去を依頼した場合に限ります。削除は取り消せません。結果には各履歴から削除された件数が表示されます。

アプリが最前面にある間

読書やプレゼンのときは、ティーカップの「アプリが最前面にある間」を使うと、選んだアプリが最前面にある間だけMacをスリープさせず、ほかのアプリに切り替えるとすぐにスリープできるようにします。ティーカップの「画面をオンのままにする」で、Kilobatがスリープさせないほかの対象と同じく、画面もオンのままにするかどうかを決められます。KilobatはmacOS自身のアプリ切り替えイベントを利用します。ポーリングやマウスの移動、操作の偽装は行わないため、監視ソフトウェアに対して在席を装うことはできません。アプリの終了時、オフにしたとき、またはバッテリー駆動で残量20%(蓋を閉じた実行用に設定した下限)になると終了し、蓋を閉じた状態での動作は維持しません。独自に保持しているため、アプリを切り替えたり終了したりしても、スリープ防止のセッションやエージェントの実行が終わることはありません。ターミナルからは:kilobat awake --while-frontmost Keynote --display。

電源接続中

「電源接続中はスリープさせない」(「設定」›「スリープ防止とエージェント」)、またはティーカップの「電源接続中」をオンにすると、電源アダプタを接続してから外すまでMacをスリープさせません。ステータス表示には「電源接続中はスリープしません」と表示されます。「画面をオンのままにする」で、画面もオンのままにするかを決められます。オフにすると、Kilobatを再起動しても次に電源を接続するまでオフのままです。KilobatはmacOS自身の電源ソース通知で切り替えを検知し、ポーリングは行いません。電源を外して終わるのは、電源の接続で始まったセッションだけです。自分で開始したセッション、待っているダウンロード、最前面のアプリ、エージェントの実行、ターミナルからの保持は続きます。蓋を閉じた状態でMacを動かし続けることはありません。ターミナルからはkilobat settings awake-on-power on、画面はkilobat settings keep-screen-on onで設定します。kilobat conditions --jsonはこれをawakeOnPowerとして報告します。

蓋を閉じた状態での実行

Kilobatがスリープさせないようにしていても、蓋を閉じるとMacはスリープします。ただし、「設定」›「スリープ防止とエージェント」で蓋を閉じた状態での実行を許可した場合は別です。許可すると、rootとして動作する小さなヘルパーがインストールされ、macOSが「システム設定」→「一般」→「ログイン項目」で許可を求めます。オンにすると、エージェントが作業中の間は蓋を閉じてもMacが動き続けます。ティーカップのメニューで「蓋を閉じた状態でも」にチェックを入れたスリープ防止のセッションも同様です。入力待ちのエージェントがMacを動かし続けるのは、「エージェントの入力待ち中もスリープさせない」がオンの場合だけで、最長30分です。

バッグの中で閉じたMacは、過熱したりバッテリーを使い切ったりするおそれがあります。そのためヘルパー自体が、バッテリー残量が下限(デフォルトは20%)に達したとき、Macが高温になったとき、電源接続時のみを選んだ場合は電源が外れた直後、設定した最長時間(最大8時間)が過ぎたとき、そしてKilobatの終了から1分後にMacをスリープさせます。保持中にヘルパーまたはMacが再起動した場合は、まず設定を元に戻します。Kilobatは各保持がどう終わったかを、「Macのスリープを許可:バッテリー残量20%」のように表示します。

ターミナルからkilobat awake --lid-closedを実行すると、アプリに同じ保持を求め、できない場合は理由を示します。保持はコマンドの終了とともに終わります。エージェントはkeep_awakeをlid_closed付きで使います。その説明文で、事前にユーザーに確認するよう指示しています。kilobat conditions --jsonはlidClosedAllowedと現在のlidHoldを報告します。

エージェントスキル

9つのAgent Skillsが、Macのネットワークのトラブルシューティングと、Kilobatで長時間の実行を続ける方法をコーディングエージェントに教えます。Kilobatの測定結果を解釈し、不確かな点を説明し、設定を変更する前に確認します。まとめてインストールしてください。kilobatスキルが、質問に合ったスキルへエージェントを案内します。

npx skills add seifip/kilobat-skills
kilobatここから始めます。セットアップ、安全のためのルール、質問に合うスキルの選び方。
mac-network-troubleshooting原因のはっきりしない、遅いまたは不安定なインターネット:問題のある層を特定します。
mac-wifi-troubleshooting弱い・途切れるWi-Fi、混雑したチャンネル、Macやルーターの最適な置き場所。
mac-hotspot-data-saverスマートフォンのテザリングとデータ上限:データを使っているもの、旅行プロファイル、予算。
mac-dns-troubleshooting遅い名前解決、リゾルバのベンチマーク、DNSの切り替え、キャプティブポータル。
video-call-network-checkカクつく通話やゲームストリーミング:遅延の急増、ジッター、ロス、バッファブロート、バックグラウンドのアップロード。
mac-bandwidth-monitorどのアプリが回線を使っているか、使用履歴、接続先。
mac-app-firewallアプリ、ドメイン、IPのブロックと許可。新しいアプリの確認と応答。
mac-agent-runs長時間のエージェント実行:Macをスリープさせない、状況の確認、エージェントのフックの接続、実行の完了・入力待ち・停滞の把握。

Kilobat CLIは上記のHomebrewコマンドで別途インストールするか、MCPサーバを接続してください。CLIにはmacOS 14以降が、HomebrewでのソースビルドにはXcode 16以降が必要です。skills.shのスキルを見るか、ソースとリファレンスを読んでください。

Siriとショートカット

Siriに接続について尋ねると、Kilobatは自身のチェックに基づいて1~2文と数値のカードで答えます。Siriが必要とするため、質問にアプリ名を含めてください。「Kilobatでインターネットが遅い理由は?」と聞くと新たにチェックし、「Wi-Fiは正常です。午後9時5分からプロバイダの回線で4%のパケットロスが発生しています。プロバイダ向けレポートに記載されています」のように原因を示します。他にも「Kilobatで接続に問題がないか確認」「Kilobatで通話が止まった理由は?」(前回の通話レポート)、「KilobatでSlackが停止しているか確認」(Kilobatがステータスページを読み取る任意のサービス、または使用中のアプリ全体)、「Kilobatでインターネットを使っているものは?」「Kilobatでデータ使用量は?」「Kilobatで通話の準備はできている?」「KilobatでVPNがリークしている?」「Kilobatで速度テスト」などを尋ねられます。同じ質問はSpotlightでも使え、ショートカットアプリの各アクションは結果を次のステップに渡します。ネットワークの状態・原因・遅延・ロス、通話レポート、サービスの障害状況、今日のデータ使用量などです。ショートカットの「モデルを使用」アクションは結果をApple Intelligenceに渡せます。Kilobat ProなしでもSiriは問題、回線の測定値、通話が止まった回数、サービス障害を答え、Proでは原因と対処法を追加します。すぐに使えるショートカットは同じアクションを利用しています。