MCP API
Vollständige API-Referenz für das MCP-Gateway: Server, Tools, Richtlinien, Freigabeanfragen, Proxy.
Alle MCP-Endpunkte erfordern API-Key-Authentifizierung (Authorization: Bearer {project_api_key}) und setzen zusätzlich eine Rollen-Schwelle durch. Editor: registrieren, scannen, eine strengere Richtlinie erstellen. Admin: Server genehmigen / fortsetzen / pausieren / ablehnen / löschen, Werkzeuge zulassen, einen Server oder Agenten gezielt sperren, eine Werkzeugregel setzen, eine erlaubende Richtlinie erstellen, eine Richtlinie löschen.
Eine Ablehnung hat die Form {"error": {"code", "message", "request_id"}}; message ist englisch, maßgeblich ist code (siehe Ablehnungscodes).
Server
Server auflisten
GET /api/v1/mcp/serversGibt alle registrierten MCP-Server des Projekts zurück. Je Server:
| Feld | Bedeutung |
|---|---|
status | nur von Menschen gesetzt: PENDING_APPROVAL (wartet auf Genehmigung), ACTIVE, BLOCKED (pausiert). Ein Scan ändert ihn nie. |
scan_state | was der letzte Scan sagt: never · failed · not_run (konnte an Adresse oder Anmeldung nicht laufen) · unreadable (Ergebnis veraltet, erneut scannen) · succeeded. Nur succeeded ist genehmigbar. |
scan_reason | Grund des letzten nicht erfolgreichen Versuchs: bei failed unreachable · bad_status · rpc_error · invalid_response; bei not_run upstream_url_forbidden · auth_method_unsupported · auth_token_missing; sonst null |
is_healthy | ob der Server beim letzten Scan antwortete |
tool_count, tools_unreleased | Zahl der Werkzeuge und der nicht zugelassenen darunter (geänderte zählen nicht mit) |
last_scan_at | Zeitpunkt des letzten erfolgreichen Scans |
Server registrieren (Editor)
POST /api/v1/mcp/servers{
"name": "GitHub MCP Server",
"server_url": "https://api.githubcopilot.com/mcp/",
"connector_type": "custom",
"description": "Optionale Beschreibung",
"is_proxied": true
}connector_type ist ein optionales freies Label (Standard custom). Neue Server starten in PENDING_APPROVAL; die Registrierung löst keinen Scan aus.
Server aktualisieren (Editor)
PATCH /api/v1/mcp/servers/{id}Felder: name, description, auth_method, auth_config. Diese Route ist nur Metadaten — sie kann status nicht ändern. Statuswechsel laufen ausschließlich über die auditierten Lifecycle-Aktionen unten.
Server löschen (Admin)
DELETE /api/v1/mcp/servers/{id}Kaskadiert auf die Werkzeuge und Richtlinien dieses Servers. Auditiert.
Lifecycle-Aktionen (Admin, auditiert)
Statuswechsel nur über diese dedizierten, admin-auditierten Routen:
POST /api/v1/mcp/servers/{id}/activate # PENDING_APPROVAL → ACTIVE (genehmigen) oder BLOCKED → ACTIVE (fortsetzen)
POST /api/v1/mcp/servers/{id}/pause # ACTIVE → BLOCKED
POST /api/v1/mcp/servers/{id}/reject # PENDING_APPROVAL → entferntGenehmigen ist eine Entscheidung über jedes Werkzeug und nur nach einem erfolgreichen Scan möglich. Der Rumpf nennt jedes Werkzeug des letzten erfolgreichen Scans genau einmal, mit Regel und dem current_fingerprint aus der Werkzeugliste; ein Server ohne Werkzeuge wird mit "tools": [] genehmigt:
{ "tools": [ { "tool_id": "clxyz...", "rule": "REQUIRE_APPROVAL", "fingerprint": "5f0c7e…" } ] }rule ∈ ALLOW · LOG_ONLY · REQUIRE_APPROVAL · DENY. In einem Schritt wird der Server aktiv und jedes Werkzeug mit seiner Regel zugelassen: die Regel gilt als von diesem Admin bestätigt (is_auto_generated: false), der Stand des Werkzeugs (Name, Beschreibung, Eingabe-Schema) wird festgehalten. Antwort: {"id", "status": "ACTIVE", "release": {"release_id", "released": [{"tool_id", "tool_name", "rule", "approved_hash"}]}}.
Fortsetzen nimmt keine Werkzeuge ({}) und lässt nichts zu: Ein seit der Zulassung geändertes Werkzeug bleibt gesperrt. Jede Aktion schreibt einen Eintrag in das manipulationserkennende Protokoll der Admin-Aktionen (nach OCSF für SIEM-Export gemappt).
Werkzeuge zulassen (Admin)
POST /api/v1/mcp/servers/{id}/tools/releaseNur auf einem ACTIVE Server. Der Rumpf hat dieselbe Form wie bei der Genehmigung und nennt mindestens ein Werkzeug, das nicht zugelassen (matches_approved: null) oder seit der Zulassung geändert ist (matches_approved: false). Das ist auch der Weg, ein geändertes Werkzeug erneut zuzulassen. Antwort: {"release_id", "released": […]}. Je Werkzeug entsteht ein Protokolleintrag MCP_TOOL_RELEASED.
Werkzeuge scannen (Editor)
POST /api/v1/mcp/servers/{id}/scanVerbindet sich mit dem MCP-Server, entdeckt Werkzeuge, bestimmt je Werkzeug Aktion und Risiko und merkt sich den aktuellen Stand jedes Werkzeugs. Der Scan setzt keine Regel, lässt kein Werkzeug zu und ändert den Status nie.
Die Antwort spiegelt das Ergebnis ehrlich:
// erreicht und gescannt
{ "scanned": true, "tool_count": 12, "tools_new": 2, "tools_vanished": 0, "poisoning_suspects": 0, "policies_bound": 0, "tools_unreleased": 12, "server_status": "PENDING_APPROVAL" }
// Ziel konnte nicht gescannt werden (weiterhin HTTP 200 — kein Palveron-5xx)
{ "scanned": false, "reason": "unreachable", "detail": "refused", "target": "https://…", "server_status": "PENDING_APPROVAL" }tools_unreleased ist die Zahl der Werkzeuge, die nichts bedienen, bis ein Admin sie zulässt; server_status ist der unveränderte Status. reason ∈ unreachable · bad_status · rpc_error · invalid_response; die Serverliste zeigt danach scan_state: failed. Kann der Scan an der Konfiguration nicht laufen (private oder interne Adresse, nicht unterstützte Anmeldeart, fehlendes Token), antwortet die Route mit 400 (Validierung) und hält scan_state: not_run mit Grund fest.
Server-Werkzeuge auflisten
GET /api/v1/mcp/servers/{id}/toolsJedes Werkzeug trägt risk_level, category, description_hash, action, die wirksame serverweite Regel policy_action (null = keine Regel, Aufrufe werden zur Freigabe vorgelegt) und is_auto_generated (true = vom System angelegt, false = von einem Admin bestätigt) sowie die Zulassung:
| Feld | Bedeutung |
|---|---|
matches_approved | true = zugelassen und unverändert · false = seit der Zulassung geändert (gesperrt) · null = nicht zugelassen (gesperrt) |
approved_hash, approved_at | festgehaltener Stand und Zeitpunkt der Zulassung |
current_fingerprint | Fingerabdruck des aktuellen Stands; eine Zulassung nennt ihn zurück |
proposed_rule | vorgeschlagene Regel für ein wartendes Werkzeug, sonst null; entscheidet keinen Aufruf |
proposed_rule_source | action (aus der Aktion) oder template (aus einer strengeren Vorlagenregel, nur so DENY); null genau dann, wenn proposed_rule null ist |
„Vorschläge übernehmen" ist genau tools = [{tool_id: id, rule: proposed_rule, fingerprint: current_fingerprint}].
Eine Werkzeugregel setzen (Admin)
POST /api/v1/mcp/servers/{id}/tools/{tool_id}/verdict{ "action": "LOG_ONLY", "reason": "Geprüft — nur Protokollieren ausreichend" }Setzt (oder lockert) die serverweite Regel des Werkzeugs und ersetzt dabei dessen serverweite Regeln durch die neue, sodass Lockern tatsächlich wirkt. Lässt nichts zu: Für ein nicht zugelassenes oder geändertes Werkzeug ist der Weg …/tools/release. Wird protokolliert. Es gibt keinen Update-Endpunkt für Richtlinien; nutzen Sie diese Route, oder löschen Sie und legen Sie neu an.
Vorlagen
GET /api/v1/mcp/templatesListet die von Palveron gepflegten Vorlagen mit id, name, description, category, connector_type, auth_method, default_policies sowie available und unavailable_reason. Derzeit sind alle Vorlagen gesperrt (available: false, unavailable_reason: "auth_method_unsupported"): Sie melden sich mit einer Anmeldeart an, die das Gateway noch nicht unterstützt. Gesperrte Vorlagen bleiben gelistet; POST /api/v1/mcp/servers/from-template lehnt sie mit 409 mcp_template_unavailable ab und legt nichts an.
Registry (Katalog)
GET /api/v1/mcp/registry?q={suche}&frontable=true&cursor={registry_name}&limit=50Gibt Palverons Spiegel des offiziellen MCP-Registrys zurück — den Katalog hinter dem 1-Klick-Connect-Ablauf. Jedes Element: registry_name, version, description, remote_url, frontable (hat ein nutzbares HTTP-Remote), website_url, registry_status sowie die Vertrauens-Signale registry_updated_at, published_at, repository_url. Die Antwort trägt items, einen optionalen Keyset-next_cursor (über registry_name) und total.
Proxy
Einen Tool-Aufruf weiterleiten
POST /api/v1/mcp/proxy/{server_id}Akzeptiert jede JSON-RPC-2.0-Anfrage. Optional den Header X-Agent-Id mit einer registrierten Agent-ID (nackte CUID) senden, damit Aufrufe diesem Agenten zugeordnet werden — eine unbekannte ID wird als anonym behandelt. Für die Methode tools/call laufen folgende Prüfungen in dieser Reihenfolge:
- Agent gesperrt: ein gesperrter Agent wird zuerst abgewiesen (
-32003,AGENT_EMERGENCY_STOP) - Server aktiv:
PENDING_APPROVAL→-32002, pausiert (BLOCKED) →-32001 - Zulassung: ein seit der Zulassung geändertes Werkzeug (
-32002,APPROVED_FINGERPRINT_MISMATCH) und ein nicht zugelassenes Werkzeug (-32002,TOOL_NOT_RELEASED) werden gesperrt; ein nicht zugelassenes Werkzeug mit seit dem letzten Scan geänderter Beschreibung trägt den Legacy-Poisoning-Grund (-32002) - Regeln: die strengste Regel gewinnt (siehe Tool-Richtlinien):
DENY→-32003,REQUIRE_APPROVAL→-32004, keine Regel →-32004(NO_TOOL_RULE_REQUIRE_APPROVAL); das Berechtigungsmodell des Agenten kann zusätzlich verschärfen - Upstream-Auth anhängen: kann die Server-Auth nicht angehängt werden, wird der Aufruf fail-closed abgelehnt (
-32008) - Weiterleiten an den MCP-Server, dann den Aufruf mit
traceType: MCP_TOOL_CALLfesthalten
Nicht-tools/call-Methoden (initialize, tools/list) passieren ohne Richtlinien-Auswertung.
Fehlercodes:
| Code | Bedeutung |
|---|---|
-32001 | Server pausiert oder nicht ACTIVE |
-32002 | Aufruf gesperrt: Server wartet auf Genehmigung (PENDING_APPROVAL), Werkzeug nicht zugelassen (TOOL_NOT_RELEASED), seit der Zulassung geändert (APPROVED_FINGERPRINT_MISMATCH) oder poisoning-verdächtig |
-32003 | Werkzeug per Regel verweigert oder Agent gesperrt (AGENT_EMERGENCY_STOP) |
-32004 | Aufruf zur Freigabe vorgelegt (eingereiht; trägt die Request-ID), per Regel oder weil keine Regel gilt |
-32005 | Limit überschritten — kommt, wenn für den Agenten bereits zu viele Freigaben offen sind (erst auflösen oder abwarten) |
-32006 | Ungültige Antwort / Protokollfehler vom MCP-Server |
-32007 | MCP-Server nicht erreichbar |
-32008 | Server-Authentifizierung konnte nicht angehängt werden (fail-closed; HTTP 403) |
Richtlinien
Richtlinien auflisten
GET /api/v1/mcp/policiesRichtlinie erstellen (Editor, erlaubend: Admin)
POST /api/v1/mcp/policies{
"action": "DENY",
"mcp_tool_id": "clxyz...",
"agent_id": "ckagent...",
"reason": "Shell execution not allowed"
}action ist Pflicht, dazu mindestens mcp_tool_id oder agent_id; optional reason, conditions. Gültige Aktionen: ALLOW, LOG_ONLY, REQUIRE_APPROVAL, DENY; jeder andere Wert liefert 400 mit der erlaubten Menge. Eine erlaubende Richtlinie (ALLOW, LOG_ONLY) verlangt einen Admin. Mit agent_id sind nur REQUIRE_APPROVAL und DENY erlaubt, weil eine Agentenregel die serverweite Regel nur verschärfen kann; ALLOW oder LOG_ONLY liefert 400 mcp_agent_rule_ineffective und schreibt nichts. Es gibt keinen Update-Endpunkt; um die Regel eines Werkzeugs zu ändern, nutzen Sie die Route „Werkzeugregel setzen" oben.
Richtlinie löschen (Admin)
DELETE /api/v1/mcp/policies/{id}Freigabeanfragen
Offene auflisten
GET /api/v1/mcp/approvalsGibt nur offene Freigabeanfragen (PENDING) zurück, die noch nicht abgelaufen sind.
Entscheiden
POST /api/v1/mcp/approvals/{id}/decide{ "approved": true, "comment": "Geprüft — einmaliger Zugriff gewährt" }Nach einer Freigabe senden Sie den Aufruf erneut und führen die Freigabe-Kennung mit, entweder im Kopf X-Palveron-Approval-Id oder im Argument _palveron_approval_id. Die Freigabe gilt einmalig und nur für genau die Argumente, für die sie angefragt wurde (ein kanonischer Hash der Tool-Argumente); ein Aufruf mit anderen Argumenten eröffnet eine neue Freigabe-Anfrage.
Gezielter MCP-Stopp (Admin)
POST /api/v1/mcp/emergency-stop{ "scope": "server", "target_id": "<server_id>", "reason": "Security incident" }Scopes: server (einen bestimmten Server blockieren, target_id erforderlich; ein nicht ACTIVE Server bleibt unverändert) und agent (die offenen Freigaben eines Agenten beenden, target_id erforderlich). Jeder beendet nur die offenen Freigaben seines Ziels. Nur für Admins und als Flare-bestätigter Protokolleintrag festgehalten. Das frühere scope: "all" entfällt (mcp_scope_all_removed); um das ganze Projekt auf einmal zu stoppen, nutzen Sie die Notabschaltung des Projekts.
Ablehnungscodes
Bei jedem dieser Codes ist nichts geschrieben.
| Code | Status | Bedeutung | Route |
|---|---|---|---|
mcp_scan_missing | 409 | Server nie gescannt | genehmigen |
mcp_scan_failed | 409 | letzter Scan fehlgeschlagen | genehmigen |
mcp_scan_not_run | 409 | letzter Scan konnte an Adresse oder Anmeldung nicht laufen | genehmigen |
mcp_scan_unreadable | 409 | gespeichertes Scan-Ergebnis nennt die Werkzeuge nicht: erneut scannen | genehmigen |
mcp_release_tools_required | 400 | tools fehlt, oder ist beim Zulassen leer | genehmigen, zulassen |
mcp_release_tool_missing | 400 | ein Werkzeug des letzten Scans fehlt; die Meldung nennt die Namen | genehmigen |
mcp_release_tool_unknown | 400 | genanntes Werkzeug gehört nicht zur entscheidbaren Menge | genehmigen, zulassen |
mcp_release_tool_duplicate | 400 | Werkzeug mehrfach genannt | genehmigen, zulassen |
mcp_release_rule_invalid | 400 | rule außerhalb der vier Werte | genehmigen, zulassen |
mcp_release_surface_changed | 409 | Name, Beschreibung oder Parameter haben sich geändert, seit die Liste gelesen wurde: neu laden | genehmigen, zulassen |
mcp_release_already_released | 409 | Werkzeug ist zugelassen und unverändert; Regel über …/verdict ändern | zulassen |
mcp_release_server_not_active | 409 | Zulassen nur auf einem aktiven Server | zulassen |
mcp_resume_takes_no_tools | 400 | Fortsetzen mit tools | fortsetzen |
mcp_release_author_unresolved | 403 | Identität des Admins nicht aufgelöst; eine bestätigte Regel braucht ihren Menschen | genehmigen, zulassen |
mcp_agent_rule_ineffective | 400 | Agentenregel mit ALLOW oder LOG_ONLY | Richtlinie erstellen |
mcp_template_unavailable | 409 | Vorlage gesperrt; die Meldung nennt die Anmeldeart | aus Vorlage anlegen |
mcp_scope_all_removed | 400 | der MCP-Stopp stoppt nicht mehr alle Server auf einmal; nutzen Sie einen gezielten Stopp oder die Notabschaltung des Projekts | gezielt sperren |
mcp_server_name_conflict | 409 | ein Server mit diesem Namen besteht bereits im Projekt (ohne Unterschied von Groß- und Kleinschreibung und Randleerzeichen) | registrieren |