KI-Agents und MCP

Der MCP-Server, Agent-Hooks, das Agent-Netzwerklog, Agent-Skills und wie der Mac wach bleibt.

Die Schritt-für-Schritt-Anleitungen für Claude Code, Codex, Cursor, Gemini CLI, Claude Desktop, Windsurf, Cline, Zed, Hermes Agent, OpenClaw, OpenCode, GitHub Copilot CLI und beliebige MCP-Clients findest du unter Kilobat in deinem KI-Agenten einrichten.

Gib einem Agent wie Claude Code, Codex oder Cursor diesen Prompt:

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-Server

kilobat mcp spricht das Model Context Protocol über stdio. Füge ihn zu Claude Code hinzu:

claude mcp add kilobat -- kilobat mcp

Oder füge ihn zu einem beliebigen Client hinzu, der eine mcpServers-Konfiguration liest:

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

Nur lesende Werkzeuge: 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 (jeder Host, den ein Agent und seine Befehle kontaktiert haben), benchmark_dns, check_url, list_connections, list_devices, trace_route, get_route_history, compare_speed_tests, get_exit_path (fragt Cloudflare nur nach deiner öffentlichen IP, wenn der Agent public_ip übergibt), check_vpn_leaks (der Lecktest, der externe Dienste fragt), list_networks, get_fastest_dns (das schnellste DNS pro Netzwerk aus den stillen Messungen der App), list_rules, list_approvals, list_blocked_connections, explain_verdict (jede auf Host oder App zutreffende Regel und die entscheidende), check_host_reputation (ob ein Host auf einer Malware-, Phishing-, Betrugs- oder Tracker-Liste steht, auf diesem Mac geprüft), get_protection_status, run_stutter_test und get_game_ping (sie senden nur Pings), get_nearby_radios, get_captive_portal (eine WLAN-Anmeldeseite, wie kilobat portal --json), service_status (fragt die öffentlichen Statusseiten der genannten Dienste oder laufenden Apps) und create_support_report (der Bericht für deinen Anbieter, den der Agent dir übergibt). Sie liefern dasselbe JSON wie die CLI. run_speedtest verbraucht Daten, run_lan_test überträgt fünf Sekunden lang Daten in deinem eigenen Netzwerk und fragt zuerst. keep_awake und release_awake verhindern für eine festgelegte Zeit den Ruhezustand bei Inaktivität, ohne Einstellungen zu ändern; keep_awake mit lid_closed hält den Mac nach deiner Freigabe auch bei geschlossenem Deckel aktiv und fragt zuerst. Änderungswerkzeuge (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, das dem Agenten auch verbietet, Schutz für seine eigene Anfrage auszuschalten, hold_upload, das den Upload einer anderen App zurückhält, set_dns, das auch den Cache leert, set_fastest_dns, set_dns_fallback und set_airdrop_visibility, das AirDrop-Einstellungen öffnet) sind als Änderungen markiert; ihre Beschreibungen weisen den Agenten an, dich zuerst zu fragen.

Agents verbinden

Ohne Hilfe richtet sich Kilobat nach dem Datenverkehr und der CPU-Last eines Agents, also kann ein stiller Agent fertig sein oder auf dich warten. Seine Hooks sagen Kilobat, zu welchem Projekt ein Lauf gehört, wann er auf dich wartet und wann er fertig ist. Jeder Hook führt kilobat agent-event aus, das nichts ausgibt, sofort zurückkehrt und immer mit 0 endet, sodass es den Agent nicht stören kann. Läuft die App nicht, warten die Ereignisse in einer kleinen Datei, die sie beim Öffnen liest. Kilobat liest Sitzungs-IDs, Ordner und kurze Statustexte, nie Prompts oder Antworten. Führe diese mit deinen vorhandenen Hooks zusammen.

Claude Code, in ~/.claude/settings.json. Jeder Hook bekommt auf stdin JSON mit Sitzungs-ID und Ordner, das --stdin-json liest. Eine Berechtigungs- oder Eingabeabfrage bedeutet „wartet“; Stop bedeutet „fertig“, sobald Hintergrundaufgaben abgeschlossen sind; ein Rate-Limit bedeutet „wartet“, bis es zurückgesetzt wird.

{
  "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, am einfachsten: notify in ~/.codex/config.toml. Codex übergibt nach jedem Zug ein JSON-Argument, das --json-arg liest. Es meldet nur „fertig“, und Codex führt nur ein einziges notify-Programm aus.

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

Um auch „wartet“ zu melden, nutze stattdessen Codex-Hooks in ~/.codex/hooks.json und vertraue ihnen mit /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, in ~/.gemini/settings.json. Gemini CLI läuft als node, daher kann Kilobat den Datenverkehr nicht dem Lauf zuordnen, aber der Status kommt an.

{
  "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 und Kanban): Installiere Kilobats Plug-in, das eine Datei zu Clines Plug-in-Speicher hinzufügt und keine anderen Einstellungen ändert. cline plugin uninstall kilobat entfernt es.

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

Es meldet einen Lauf als arbeitend, fertig, fehlgeschlagen (solange Cline offen bleibt), abgebrochen, durch ein Rate-Limit gebremst (sobald Clines eigene Wiederholungen aufgebraucht sind) und wartend, während Cline dir eine Frage stellt. Es wartet auf Subagents und Teammitglieder, bevor es einen Lauf als fertig meldet. Clines Freigabeabfragen sind für Plug-ins nicht sichtbar, daher deckt die Erkennung über Datenverkehr und CPU-Last diese ab.

Jeder andere Agent kann kilobat agent-event start|working|waiting|done|failed --agent <name> --session <id> --cwd <folder> aus seinen eigenen Hooks aufrufen. Füge --verbose hinzu, um zu sehen, was passiert, wenn du es von Hand ausprobierst.

Agent-Netzwerklog

Während Claude Code, Codex, Cursor, Gemini CLI, Aider, Windsurf, Claude Desktop, ChatGPT oder ein anderer Agent läuft, zeichnet Kilobat jeden Host auf, den er und die von ihm gestarteten Prozesse kontaktiert haben: npm, pip, uv, curl, git, brew, MCP-Server, auch wenn eine Shell dazwischen sitzt. Jede Sitzung, vom Start des Agent-Prozesses, bis er und alles, was er gestartet hat, beendet sind, listet die Hosts nach dem Prozess auf, der sich verbunden hat, die mit den meisten gesendeten Daten zuerst, mit Port und Protokoll, zuerst und zuletzt gesehen, gesendeten und empfangenen Bytes und der Zahl der Verbindungen, dazu den Projektordner, in dem der Agent lief. Du findest es unter Verlauf › Agent-Netzwerklog, und solange ein Agent läuft, zeigt das Menü eine Zeile wie „Claude Code · 14 Hosts · 2,1 MB gesendet“. „Als Markdown kopieren“ legt die Tabelle einer Sitzung für ein Issue oder ein Review in die Zwischenablage.

Markierungen zeigen, was einen zweiten Blick verdient, nie, dass etwas falsch ist: erstmals (kein Agent auf diesem Mac hat diesen Host bisher kontaktiert; bekannte Registrys wie registry.npmjs.org, pypi.org und github.com sowie der eigene Dienst des Agents gelten nie als neu), unverschlüsseltes HTTP (Port 80), großer Upload (über 10 MB an einen Host außer dem eigenen Dienst des Agents, damit Claude Code nicht markiert wird, wenn es seinen Kontext an Anthropic sendet), nur Adresse (kein Hostname bekannt) und Sharing oder Tunnel (eine kurze Liste von Paste-Sites, Filesharing-Diensten wie transfer.sh, Tunneln wie ngrok und trycloudflare.com und Request-Catchern wie webhook.site). „Nur markierte“ zeigt nur diese.

So funktioniert es: Kilobat liest ohnehin jede Sekunde die Netzwerkstatistiken von macOS pro Verbindung (dieselben wie nettop), mit dem Prozess jeder Verbindung. Agents erkennt es an ihrem Programm, an dem Paket, das ein Interpreter ausführt (node …/@openai/codex, python3 -m aider), oder am eigenen Programm der App, und es verfolgt den Prozessbaum jedes Agents: Der Kernel meldet sofort, wenn sich ein Prozess im Baum forkt, sodass auch ein curl, der eine Zehntelsekunde läuft, zugeordnet wird, solange er läuft, und Prozesse, die an launchd übergehen, bleiben beim Agent. Der nächstgelegene Agent gewinnt, also gehört Claude Code im Terminal von Cursor zu Claude Code. Hostnamen stammen vom Netzwerkfilter von Kilobat, wenn er aktiv ist (der Name, den eine App angefragt hat), aus Abfragen bekannter Entwickler-Hosts und der Hosts in den URLs in curl oder git eines Agents über den Resolver deines Macs mit Abgleich der Adressen, oder aus Reverse-DNS; das wird markiert, weil es der Name des Servers ist, nicht der, den die App angefragt hat. Ohne all das zeigt die Zeile die Adresse.

Was es nicht sehen kann: Datenverkehr, den macOS-Dienste für einen Prozess erzeugen (DNS-Abfragen laufen über mDNSResponder, Downloads über nsurlsessiond), Docker-Container und VMs (deren Datenverkehr läuft über den eigenen Prozess von Docker oder der VM) und Agenten in einem Editor, die in dessen Erweiterungsprozess laufen, etwa Cline oder Copilot in VS Code, und nicht vom Editor unterschieden werden können. In Cursor und Windsurf zählen Befehle im eingebauten Terminal zur App. Eine Verbindung, die zwischen zwei Messungen im Sekundentakt geöffnet und geschlossen wird, zählt trotzdem zu den Sitzungsbytes, ohne Host. Ein Prozess, der startet und endet, bevor die Fork-Meldung des Kernels verarbeitet wird, kann übersehen werden. Das Protokoll wird mit Kilobat Pro nur auf diesem Mac unter ~/Library/Application Support/Kilobat/agent-network-log.json aufgezeichnet, 30 Tage aufbewahrt und nie versendet; „Löschen“ bietet letzte Stunde, heute oder alles.

Ist der Schutz an, erscheinen auch Verbindungen, die Kilobat abgewiesen hat, in der Sitzung, markiert als „Blockiert“ mit der Liste oder der Regel des Agent-Wächters, obwohl sie keine Bytes übertragen haben.

Im Terminal gibt kilobat agent-log die letzte Sitzung aus oder, wenn ein Agent es ausführt, dessen eigene; --all, --since 2h, --agent claude, --flagged und --json grenzen sie ein. Das Lesen ist kostenlos, und kilobat agent-log --watch zeichnet live im Terminal auf, ohne die App oder Pro, und speichert nichts. Agents rufen das nur lesende MCP-Tool agent_network_log auf, das ohne Argumente ihre eigene Sitzung liefert, sodass ein Agent prüfen kann, womit eine von ihm ausgeführte Installation kommuniziert hat.

Verlauf löschen oder Website vergessen

Unter Einstellungen › Daten & Datenschutz entfernt Website vergessen einen Host aus blockierten Versuchen, dem Agenten-Netzwerkprotokoll, Zielen von Agentenläufen und Wachhalte-Sitzungen sowie dem Benachrichtigungsspeicher von Schutz. Mit Subdomains werden auch Namen wie www.example.com entfernt. „Website-Verlauf löschen“ entfernt dieselben Datensätze für die letzte Stunde, seit Mitternacht oder vollständig. Blockierte Versuche und das Agenten-Netzwerkprotokoll haben eigene Löschen-Menüs; das Kontextmenü einer Host-Zeile bietet „Vergessen“. Beim Löschen bleiben Regeln und Schutzeinstellungen erhalten. Künftige Aktivitäten können erneut aufgezeichnet werden.

Nutze im Terminal kilobat history forget example.com --subdomains --json oder kilobat history clear --hour (auch --today und --all sind verfügbar). Der Befehl bittet die laufende App, ihre aktuellen Aufzeichnungen zu löschen, oder bearbeitet gespeicherte Verläufe bei geschlossener App. MCP clear_history tut dasselbe nur auf deine Aufforderung an den Agenten. Das Löschen kann nicht rückgängig gemacht werden; das Ergebnis zählt die entfernten Einträge je Verlauf.

Solange eine App vorne ist

Zum Lesen oder Präsentieren hält „Solange eine App vorne ist“ in der Teetasse den Mac nur wach, solange die gewählte App im Vordergrund ist, und lässt ihn wieder in den Ruhezustand, sobald du wegwechselst. „Bildschirm anlassen“ in der Teetasse entscheidet, ob auch der Bildschirm an bleibt – wie bei allem, was Kilobat wach hält. Kilobat folgt den App-Wechsel-Ereignissen von macOS: Es fragt nicht ständig ab, bewegt nicht die Maus und täuscht keine Aktivität vor, kann dich also gegenüber Überwachungssoftware nicht anwesend erscheinen lassen. Es endet, wenn die App beendet wird, wenn du es ausschaltest oder im Akkubetrieb bei 20 % (oder dem Minimum, das du für Läufe bei geschlossenem Deckel festgelegt hast), und es hält nie den Deckel. Es hat eine eigene Sperre, sodass ein App-Wechsel oder das Beenden der App nie eine Wach-Sitzung oder einen Agent-Lauf beendet. Im Terminal: kilobat awake --while-frontmost Keynote --display.

Am Netzteil

Schalte „Am Netzteil wach bleiben“ ein (Einstellungen › Wach & Agenten) oder „Am Netzteil“ in der Teetasse, und das Anschließen des Netzteils hält den Mac wach, bis du es abziehst – wie die Statusleiste mit „Wach am Netzteil“ anzeigt. „Bildschirm anlassen“ entscheidet, ob auch der Bildschirm an bleibt. Schaltest du es aus, bleibt es bis zum nächsten Einstecken aus, auch wenn Kilobat neu startet. Kilobat erfährt vom Wechsel über die Stromquellen-Mitteilung von macOS selbst, ohne ständiges Abfragen. Abziehen beendet nur die Sitzung, die das Einstecken gestartet hat: Eine Sitzung, die du selbst gestartet hast, ein Download, auf den du wartest, eine App im Vordergrund, ein Agent-Lauf oder eine Sperre aus dem Terminal laufen weiter. Bei geschlossenem Deckel hält es den Mac nie am Laufen. Im Terminal: kilobat settings awake-on-power on und kilobat settings keep-screen-on on für den Bildschirm; kilobat conditions --json meldet es als awakeOnPower.

Betrieb bei geschlossenem Deckel

Zuklappen versetzt den Mac in den Ruhezustand, auch wenn Kilobat ihn wach hält – außer du erlaubst den Betrieb bei geschlossenem Deckel unter Einstellungen › Wach & Agenten. Dabei wird ein kleiner Helfer installiert, der als root läuft; macOS bittet dich, ihn unter Systemeinstellungen › Allgemein › Anmeldeobjekte zu erlauben. Ist er aktiv, hält ein arbeitender Agent-Lauf den Mac bei geschlossenem Deckel am Laufen, ebenso eine Wach-Sitzung, wenn du im Teetassen-Menü „Auch bei geschlossenem Deckel“ ankreuzt. Ein Agent, der auf dich wartet, hält ihn nur, wenn „Wach halten, während ein Agent wartet“ an ist, und höchstens 30 Minuten.

Ein zugeklappter Mac in einer Tasche kann überhitzen und seinen Akku leeren. Deshalb lässt der Helfer selbst den Mac in den Ruhezustand gehen: bei deinem Akku-Minimum (standardmäßig 20 %), wenn der Mac heiß wird, sobald er vom Netzteil getrennt wird, falls du „nur am Netzteil“ wählst, nach der längsten Dauer, die du festlegst (höchstens 8 Stunden), und eine Minute nachdem Kilobat beendet wurde. Startet der Helfer oder der Mac neu, während er hält, stellt er die Einstellung zuerst zurück. Kilobat zeigt, wie jede Sperre geendet hat, zum Beispiel „Mac durfte schlafen: Akku bei 20 %“.

Im Terminal bittet kilobat awake --lid-closed die App um dieselbe Sperre und sagt, warum, wenn es nicht geht; die Sperre endet mit dem Befehl. Agents nutzen keep_awake mit lid_closed, und dessen Beschreibung weist sie an, das vorher mit dir abzustimmen. kilobat conditions --json meldet lidClosedAllowed und den aktuellen lidHold.

Agent-Skills

Neun Agent-Skills bringen Coding-Agents bei, das Netzwerk eines Mac zu untersuchen und lange Läufe mit Kilobat am Laufen zu halten. Sie deuten seine Messungen, erklären, was unsicher ist, und fragen, bevor sie Einstellungen ändern. Installiere sie zusammen; der Skill kilobat schickt den Agent zu dem, der passt.

npx skills add seifip/kilobat-skills
kilobatHier anfangen. Einrichtung, Sicherheitsregeln und welcher Skill zur Frage passt.
mac-network-troubleshootingLangsames oder unzuverlässiges Internet mit unklarer Ursache: findet die fehlerhafte Ebene.
mac-wifi-troubleshootingSchwaches oder abbrechendes WLAN, volle Kanäle, der beste Platz für Mac oder Router.
mac-hotspot-data-saverSmartphone-Hotspots und Datenobergrenzen: was Daten verbraucht, Reiseprofil, Limits.
mac-dns-troubleshootingLangsame DNS-Abfragen, Resolver-Benchmarks, DNS-Wechsel, Captive Portals.
video-call-network-checkRuckelnde Anrufe und Spiele-Streams: Latenzspitzen, Jitter, Verlust, Bufferbloat und Uploads im Hintergrund.
mac-bandwidth-monitorWelche Apps die Verbindung nutzen, Nutzungsverlauf und wohin sie sich verbinden.
mac-app-firewallApps, Domains und IPs blockieren oder erlauben; bei neuen Apps fragen und antworten.
mac-agent-runsLange Agent-Läufe: den Mac wach halten, Bedingungen prüfen, Agent-Hooks verbinden, sehen, wann ein Lauf fertig ist, auf dich wartet oder hängt.

Installiere die Kilobat-CLI separat mit dem Homebrew-Befehl oben oder verbinde ihren MCP-Server. Die CLI erfordert macOS 14 oder neuer; der Homebrew-Build aus dem Quellcode erfordert Xcode 16 oder neuer. Sieh dir die Skills auf skills.sh an oder lies ihren Quellcode und ihre Referenzen.

Siri und Kurzbefehle

Frage Siri nach deiner Verbindung und Kilobat antwortet aus seinen eigenen Prüfungen in ein oder zwei Sätzen mit einer Zahlenkarte. Nenne den App-Namen in der Frage, wie Siri es benötigt: „Warum ist mein Internet laut Kilobat langsam?“ startet eine neue Prüfung und nennt die Ursache: „Dein WLAN ist in Ordnung; die Leitung deines Anbieters verliert seit 21:05 Uhr 4 % der Pakete. Das steht in deinem Anbieterbericht.“ Weitere Fragen: „Ist meine Verbindung laut Kilobat in Ordnung?“, „Warum ist mein Anruf laut Kilobat eingefroren?“ (der letzte Anrufbericht), „Ist Slack laut Kilobat ausgefallen?“ (jeder Dienst mit einer von Kilobat gelesenen Statusseite oder „Sind meine Apps laut Kilobat ausgefallen?“ für gerade verwendete Dienste), „Was nutzt mein Internet laut Kilobat?“, „Wie viele Daten habe ich laut Kilobat verbraucht?“, „Bin ich laut Kilobat bereit für meinen Anruf?“, „Ist mein VPN laut Kilobat undicht?“ und „Geschwindigkeitstest mit Kilobat starten“. Dieselben Fragen funktionieren in Spotlight; jede ist eine Aktion in Kurzbefehle, die ihre Antwort an den nächsten Schritt weitergibt: Netzwerkstatus mit Zustand, Ursache, Latenz und Verlust; Anrufbericht; Dienste und ihre gemeldeten Ausfälle; heutige Datenmenge. Die Kurzbefehle-Aktion „Modell verwenden“ kann die Ergebnisse an Apple Intelligence übergeben. Ohne Kilobat Pro nennt Siri das Problem und die Leitungswerte, die Anzahl eingefrorener Anrufe und ob ein Dienst ausgefallen ist; Pro ergänzt Ursache und Abhilfe. Fertige Kurzbefehle bauen auf denselben Aktionen auf.