Entwicklerportal
Jede ConvoyPlan-Installation stellt eine REST-API und einen MCP-Server bereit. Damit lassen sich Marschverbände, Fahrzeuge, Wegpunkte, Routen und Live-Positionen aus anderen Systemen und von KI-Agenten lesen und planen.
Einstiegspunkte
| Schnittstelle | Adresse | Authentifizierung |
|---|---|---|
| REST-API | https://{instanz}/api | Authorization: Bearer <JWT> oder X-API-Key |
| MCP-Server | https://{instanz}/mcp | OAuth 2.0 mit PKCE (S256) |
| WebSocket (Live-Tracking) | https://{instanz}/api | wie REST |
Die öffentlich erreichbare Instanz läuft unter https://web.convoyplan.de/api; ihre
Daten gehören dem Betreiber, ein Zugang wird nicht frei vergeben.
Authentifizierung
Drei Verfahren, je nachdem, in wessen Namen gearbeitet wird:
- OAuth 2.0 mit PKCE über MCP — der vorgesehene Weg für KI-Agenten. Ein Mensch meldet sich im Browser an, wählt die Organisation und erteilt die Freigabe. Berechtigungen werden bei jedem Aufruf frisch gegen die Datenbank geprüft.
- JWT —
POST /api/auth/loginliefert ein Token für einen Benutzeraccount, optional mit TOTP als zweitem Faktor. - API-Key —
X-API-Key: cvp_<prefix>_<secret>für Dienst-zu-Dienst-Integrationen ohne Benutzerkontext. Ausgestellt im Superadmin-Portal unter Admin → API-Keys, wahlweise für eine Organisation oder systemweit, mit fester Rolle.
Ein Aufruf ohne gültiges Token antwortet mit 401 und
WWW-Authenticate: Bearer. Der vollständige Ablauf — von der
Beschaffung bis zum Widerruf — steht als Markdown unter
auth.md.
Berechtigungen
Jeder Zugriff ist auf eine Organisation und eine Rolle begrenzt: Admin, Planer, Fahrer oder Beobachter. Ein Beobachter-Token kann nicht schreiben, ein Organisations-Key sieht keine fremden Mandanten. Einzelheiten stehen im Wiki.
Testumgebung: Demo-Modus
Eine Installation ohne Lizenzschlüssel startet im Demo-Modus. Lesende Zugriffe
sind frei, schreibende antworten mit HTTP 402 Payment Required. Der
Demo-Modus ist dauerhaft kostenlos und genau dafür gedacht, eine Integration
gegen echte Endpunkte zu entwickeln, ohne Einsatzdaten zu verändern. Eine
eigene Instanz steht mit einem Befehl:
curl -fsSL https://convoyplan.de/install.sh | bash
Unter Windows: irm https://convoyplan.de/install.ps1 | iex in einer
PowerShell mit Administratorrechten.
OpenAPI-Spezifikation
Das Backend erzeugt eine OpenAPI-Spezifikation, liefert sie im Produktivbetrieb
aber nicht offen aus: /docs, /redoc und
/openapi.json antworten standardmäßig mit 404. Der
Betreiber schaltet sie frei — entweder geschützt über
DOCS_API_KEY (Abruf dann mit X-API-Key) oder offen
über ENABLE_DOCS=true. Eine öffentlich gehostete Spezifikation auf
dieser Domain gibt es nicht, weil sie nicht zu einer bestimmten Instanz gehören
würde.
MCP-Server
Der MCP-Server bringt lesende Tools für Marschverbände, Unterverbände, Fahrzeuge, Wegpunkte, gespeicherte Routen, letzte Positionen und Marschstatus mit sowie schreibende Tools für Planung, Fahrzeugzuordnung, Wegpunkte, Routenberechnung und Statusmeldungen. Dazu kommen Ressourcen für Dokumente und Live-Abonnements. Die Adresse steht im Admin-Portal der Instanz; ein Client registriert sie als Remote-MCP-Server und meldet sich per OAuth an. Der maschinenlesbare Steckbrief liegt unter /.well-known/mcp/server-card.json.
404 auf /mcp ist eine Antwort, kein Fehler.
Die Schnittstelle ist standardmäßig abgeschaltet und dann nicht montiert — es
gibt keinen Endpunkt und keine Discovery-Dokumente. Eingeschaltet wird sie vom
Betreiber der Instanz; zusätzlich gibt der Admin jeder Organisation ihre
Teilnahme einzeln frei, je Bereich (Konvois, Fahrzeuge, Wegpunkte, Routen,
Positionen, Status). Was danach durchgeht, entscheidet die Zustimmung eines
angemeldeten Benutzers auf /oauth/consent — für genau eine
Organisation und gedeckelt durch dessen Rolle. Die Werkzeugliste aus
tools/list ist deshalb instanz- und verbindungsabhängig; sie zu
cachen und wiederzuverwenden geht schief.
- Standardmäßig aus — Abgeschaltet montiert die Instanz keinen einzigen Endpunkt — es gibt nichts, was ein 404 nur zudeckt. Einschalten heißt, Einsatzdaten für einen externen Modellanbieter zu öffnen; diese Entscheidung gehört dem Betreiber und nicht dem Auslieferungszustand.
- Zwei Schalter, beide nötig — Der Betreiber schaltet die Schnittstelle auf der Instanz frei, der Admin jeder Organisation ihre Teilnahme — einzeln je Bereich: Konvois, Fahrzeuge, Wegpunkte, Routen, Positionen und Status. Wer eine Instanz für mehrere Organisationen betreibt, entscheidet damit nicht über deren Einsatzdaten.
- Ein Mensch stimmt zu — Zugriff entsteht erst durch die Zustimmung eines angemeldeten Benutzers im Browser: für genau eine Organisation, gedeckelt durch seine Rolle. Auf dem Zustimmungsbildschirm sind die Rechte einzeln ankreuzbar — ein Beobachter bekommt Schreibrechte auch durch Ankreuzen nicht.
- Kein Werkzeug löscht — Es gibt kein Werkzeug, das einen Konvoi, ein Fahrzeug, einen Wegpunkt, eine Route oder einen Benutzer löscht — und keines für Benutzerverwaltung, Lizenz oder Systemeinstellungen. Jeder schreibende Aufruf steht im Audit-Log mit Quelle „mcp"; einzelne Verbindungen lassen sich jederzeit trennen.
Jedes Werkzeug trägt Verhaltenszusagen (readOnlyHint,
destructiveHint, openWorldHint); als zerstörend ist
keines markiert, weil keines löscht. Alle Werkzeuge antworten zusätzlich
strukturiert (structuredContent) statt nur als Text — die Felder
sind benannt und müssen nicht aus einem Textblock gefischt werden. Für Clients
mit Oberfläche liegen drei Ansichten bei (Konvoi-Liste, Konvoi-Übersicht,
Marschstatus); sie laden nichts von außen nach und sind Zugabe: ein Programm
ohne Oberflächen bekommt dieselbe Antwort wie bisher.
Der Weg für ChatGPT läuft über den Developer Mode, nicht über das
App-Verzeichnis — ein Verzeichniseintrag könnte immer nur auf eine
Adresse zeigen und wäre für jede andere Instanz wertlos. Die
Anleitung im Wiki
nennt die drei Stolpersteine: das fehlende /mcp am Ende der
Adresse, die Verbindung, die je Unterhaltung eingeschaltet werden muss, und den
Haken bei den Schreibrechten beim Zustimmen — den ChatGPT später nicht
nachfordern kann.
Was eine Instanz über sich selbst ausliefert
Für den ersten Aufruf gegen eine unbekannte Installation:
GET /api/status/capabilities sagt ohne Anmeldung, ob der
MCP-Server montiert ist, ob ein Demo-Zugang besteht und wo die
maschinenlesbaren Beschreibungen liegen. Daneben liefert jede Instanz unter
ihrer eigenen Domain /llms.txt, /agents.md,
/auth.md, /api.md, eine kuratierte
/openapi.json der anmeldefreien Endpunkte, die
Well-Known-Dokumente (Agent Card, Agent Skills, ARD, MCP Server Card,
API-Katalog, Resource-Metadaten nach RFC 9728) und /ask für Fragen
über die Software. Markdown gibt es über Accept: text/markdown,
über .md und über ?mode=agent — nicht danach, ob sich
ein Abrufer als Bot zu erkennen gibt.
Alles davon gehört zur Instanz und lässt sich mit
AGENT_DISCOVERY=false abschalten; dann existieren diese Pfade
nicht. Auf dieser Domain gibt es die Gegenstücke unter
/llms.txt und /llms.md.
Für Agenten
- /developers.md — diese Seite als Markdown
- /developers/llms.txt — Kontext nur zu diesem Bereich
- /auth.md — Zugangsdaten beschaffen und widerrufen
- /.well-known/agent-skills/index.json — Agent Skills
- /.well-known/api-catalog — API-Katalog nach RFC 9727
- /.well-known/ard.json — Agentic Resource Discovery
Dokumentation
- API-Dokumentation — alle REST- und WebSocket-Endpunkte
- MCP-Server
- ChatGPT verbinden
- Agenten-Auskunft der Instanz
- Installation und Setup
- Entwicklung
- Changelog
Fragen zu einer Integration, die hier nicht beantwortet sind: anfrage@convoyplan.de.