Wie schließt man ein eigenes System an einen KI-Agenten an?
Ein System ohne fertiges Plugin an einen Agenten hängen: vier Plugin-Arten, drei davon ohne neuen Build, und warum ein Manifest keinen Host nennen darf.
Das Ticketsystem im Haus hat eine REST-Schnittstelle. Sie gibt Vorgänge zurück, nimmt Kommentare an und erwartet einen Schlüssel im Header X-API-Key. Für GitLab, Jira und GitHub liegen fertige Anbindungen bereit, für dieses System liegt keine bereit. Wer es trotzdem an einen Agenten hängen will, hat zwei naheliegende Aussichten: Go schreiben und auf die nächste Version warten, oder dem Agenten den Schlüssel in die Sandbox legen.
Auf Hacker News stand 2025 ein Text mit 808 Punkten, der das Model Context Protocol als versehentlich universelles Plugin-System beschrieb. Damit stellt sich die Frage, die jedes Plugin-System stellt: was darf das fremde Ding, wenn es einmal läuft?
Drei der vier Arten kommen ohne neuen Build aus
In covey ist jedes Zielsystem ein Plugin, und ein Plugin kommt auf vier Arten in eine Installation. Ein builtin ist ein Go-Unterpaket und braucht einen Build. Ein custom ist ein JSON-Manifest, das eine generische REST-Maschine auslegt. Ein mcp ist die Konfiguration eines erreichbaren MCP-Servers. Und ein wasm ist ein WebAssembly-Modul, also echter Code.
Alle vier bedienen dieselbe Schnittstelle, und die letzten drei werden zur Laufzeit installiert.
Einkompiliert wird nur noch, was sich anders nicht ausdrücken lässt. Die Spec führt dafür vier Gründe auf, und drei davon tragen heute noch eingebaute Plugins. Der erste ist ein Protokoll, das nicht JSON über HTTP ist, etwa E-Mail über IMAP und SMTP oder SharePoint über Graph. Dazu kommt eine Anmeldung jenseits eines festen Headers, etwa OAuth2 bei Teams. Der dritte ist das Materialisieren von Dateien in der Sandbox, wie es der Checkout von GitLab und GitHub tut.
Der vierte Grund war echte Berechnung, und den nimmt heute niemand mehr in Anspruch. Zammad, VulnDB und Kubernetes sind seit 0.6.0 Katalogeinträge als WebAssembly.
Das Helpdesk aus dem ersten Absatz spricht JSON über HTTP mit einem festen Header. Es bekommt ein Manifest.
Pfade und Scopes stehen im Manifest, die Adresse liefert die Organisation
Die Datei gibt der Anmeldung, den Aktionen, den Feldern eines eingehenden Ereignisses und dem Verbindungstest je einen eigenen Block: auth, actions, webhook, probe. Für das Helpdesk steht unter auth der Header X-API-Key mit dem Format {token}. Darunter stehen zwei Aktionen, get_issue auf GET /issues/{issue_id} und comment auf POST /issues/{issue_id}/comments. Ruft das Helpdesk covey nie selbst an, entfällt der Block webhook, und der Router antwortet auf seinen Webhook-Eingang mit 404.
Parse nimmt die Datei fail-closed an: unbekannte Felder weist sie ab, der Name muss ^[a-z][a-z0-9_-]{1,31}$ erfüllen, mindestens eine Aktion muss vorhanden sein. Einen webhook-Block mit Feldern, aber ohne id_field, weist sie ebenfalls ab. Als Methode gelten GET, POST, PUT, PATCH und DELETE. Ein Scope, den der Block scopes nicht führt, bricht die Prüfung ab.
Die wichtigste Regel ist die kürzeste: jeder Pfad muss mit / beginnen. Ein Manifest kann deshalb keinen Host nennen, und die Adresse kommt aus dem gebrokerten helpdesk_url, das Token aus helpdesk_token, und beide liegen bei der Organisation. Ein bösartiger Eintrag erreicht damit höchstens ungewollte Endpunkte innerhalb des vereinbarten Systems, und dort greifen die Guard Rails und die Subjects der Aktionen.
Im Agenten steht danach eine Zeile in der ACCESS.md: - system: helpdesk scope: read,comment. Diese Wörter schränken nur ein, wenn das Manifest sie unter scopes führt. Fehlt der Block, nimmt die ACCESS.md jedes Wort an, und covey plugin lint schreibt es dem Autor vorher hin.
Das Modul bringt die Logik mit, der Host den Token
Manchmal reicht ein Aufruf nicht: wer einen Wert berechnen oder eine Datei aus dem Checkout lesen muss, schreibt gewöhnliches Go und übersetzt es mit GOOS=wasip1 GOARCH=wasm.
Der Laufzeit fehlen Sockets und ein eingehängtes Dateisystem. Der lineare Speicher endet bei 64 MiB, ein Aufruf bei 60 Sekunden, eine Aktion bei 64 Anfragen. Jeder Aufruf bekommt eine frische Instanz, damit nichts vom Agenten davor übrig bleibt.
Zugangsdaten sieht ein Modul nie. Es nennt einen Pfad, der Host setzt Basisadresse und Token ein, und einen Authentifizierungs-Header aus dem Modul überspringt er dabei. Ein Modul für das Helpdesk nennte also Pfade wie /issues/{issue_id}, und Adresse und Schlüssel setzte der Host davor.
Einen fremden Host darf ein Modul ansprechen, wenn es ihn in Describe angemeldet hat, und ein Betreiber sieht ihn dort vor der Installation. Der Aufruf läuft dann über https, und das gebrokerte Token bleibt zu Hause. Eine Umleitung, die die Origin verlässt, lehnt der Client ab.
Was aus dem Katalog kommt, prüft covey gegen einen Digest
Verteilt werden Manifeste, MCP-Konfigurationen und Module über einen Katalog. Der Katalog ist eine JSON-Datei hinter der Adresse in COVEY_MARKETPLACE_URL. Dieselbe Mechanik trägt GitLab raw, einen S3-Bucket, ein internes nginx oder einen file://-Pfad, und so werden auch firmeninterne Plugins verteilt.
Vor dem Speichern prüft covey den sha256 aus dem Katalogeintrag. Stimmt er nicht, nennt der Fehler beide Werte. Das fremde Repository darf force-gepusht, umgetaggt oder gelöscht werden, installiert wird trotzdem die geprüfte Fassung. Ein Helpdesk-Manifest aus einem firmeninternen Katalog durchläuft nach dieser Prüfung dasselbe Parse wie ein Handupload.
Vor dem ersten Aufruf entscheidet ein Mensch
Unter einem Bericht über eine bösartige VSCode-Erweiterung hat ein Leser das übliche Vertrauensmodell in einem Satz beschrieben: „install it, it runs, you trust its scope implicitly.“ Covey beantwortet das anders. Aus dem Katalog installierte Plugins landen mit enabled=false in der Datenbank, Installieren und Aktivieren bleiben zwei Schritte. Neue Versionen holt covey nie von selbst, sie erscheinen als Hinweis mit einem Diff und einem Knopf. Lädt jemand das Helpdesk-Manifest dagegen von Hand hoch, steht es sofort aktiv, denn einen Upload behandelt covey als Einrichtung durch einen Administrator.
Eine Ausnahme verlangt eine zweite Entscheidung: eine MCP-Konfiguration nennt ihren Endpunkt selbst. covey plugin lint schreibt vor der Installation die Zeile installing this opens the egress to samt Adresse, und die Freigabe läuft über die Egress-Liste.