Zum Inhalt springen

MCP

Dieselbe API, an einen Assistenten gerichtet statt an ein Szenario. Ein MCP-Client entscheidet zur Laufzeit anhand der Tool-Beschreibungen, was er aufruft — er erreicht also genau das, was die dahinterliegenden Zugangsdaten erreichen, und unter jedem Tool liegt ein Aufruf der öffentlichen API.

Ein Endpunkt

Alles geht an POST /v1/mcp. Es gibt keine Sitzung zu öffnen und keinen Stream zu halten: GET und DELETE antworten mit 405, und jede Nachricht ist eine eigene Anfrage.

POST https://api.mosaqo.app/v1/mcp
Authorization: Bearer $MOSAQO_KEY
MCP-Protocol-Version: 2026-07-28

Die Protokollrevisionen 2025-03-26 bis 2026-07-28 werden alle bedient. Ein Client, der mit initialize beginnt, bekommt den erwarteten Handshake; einer, der seine Version bei jeder Anfrage nennt, wird so bedient.

Mit einem API-Schlüssel verbinden

Der schnellste Weg und der richtige für ein Werkzeug, das Sie selbst betreiben. Jeder Schlüssel funktioniert als Bearer-Token, und die angebotenen Tools werden auf die Scopes dieses Schlüssels zugeschnitten.

Die meisten Clients nehmen einen Block wie diesen:

{
  "mcpServers": {
    "mosaqo": {
      "type": "http",
      "url": "https://api.mosaqo.app/v1/mcp",
      "headers": { "Authorization": "Bearer $MOSAQO_KEY" }
    }
  }
}
curl -X POST https://api.mosaqo.app/v1/mcp \
  -H "Authorization: Bearer $MOSAQO_KEY" \
  -H "Content-Type: application/json" \
  -H "MCP-Protocol-Version: 2026-07-28" \
  -H "Mcp-Method: tools/list" \
  -d '{ "jsonrpc": "2.0", "id": 1, "method": "tools/list" }'

Über OAuth verbinden

Für einen Connector in fremdem Verzeichnis, wo die Person nie einen Schlüssel anfasst. Discovery nach RFC 9728 und RFC 8414, Clients registrieren sich selbst nach RFC 7591, und jede Autorisierung nutzt PKCE mit S256.

curl https://api.mosaqo.app/.well-known/oauth-protected-resource
curl https://api.mosaqo.app/.well-known/oauth-authorization-server

Ein nicht autorisierter Aufruf sagt selbst, wohin und wonach zu fragen ist:

HTTP/1.1 401 Unauthorized
WWW-Authenticate: Bearer realm="Mosaqo MCP",
  resource_metadata="https://api.mosaqo.app/.well-known/oauth-protected-resource",
  scope="qr:read analytics:read reviews:read exports:read"

Wer zustimmt, ist bei Mosaqo angemeldet, wählt den betroffenen Workspace und kann das nur dort, wo er Inhaber oder Admin ist — dieselbe Grenze, die entscheidet, wer einen API-Schlüssel ausstellen darf. Trennen lässt es sich danach unter Bulk & API.

Was ein Assistent kann

Die Scopes, die Sie bereits kennen, unverändert. Ein Tool, das die Zugangsdaten nicht erlauben, steht nicht in tools/list und lässt sich auch durch Nennen nicht aufrufen — die lebende Antwort für jede Verbindung ist also tools/list selbst.

ScopeErlaubt
qr:readQR-Codes, Ordner und Vorlagen auflisten und lesen
qr:writeErstellen, ändern, umlenken, veröffentlichen, archivieren und löschen
exports:readGerenderte Karten herunterladen
analytics:readAggregierte Analytics und einzelne Scans
bulk:writeBulk-Jobs anlegen und lesen
webhooks:writeWebhook-Abonnements verwalten
reviews:readOrte, Umfragen und wie sie laufen — nie die Antworten selbst

Was er nie erreicht

Was Menschen in eine Umfrage geschrieben haben. reviews:read öffnet Ihre Orte, Ihre Umfragen und deren Verlauf — Anzahl, Bewertungen, Verteilung je Frage. Die Sätze, die ein Besucher getippt hat, werden hier so wenig zurückgegeben wie irgendwo sonst, wohin Zugangsdaten reichen — aus demselben Grund, aus dem die feedback.*-Events eine Bewertung tragen und nie die Worte.

Einen Code löschen. Die REST-Route verlangt eine getippte Bestätigung, weil das Zerstören der Weiterleitung hinter einem gedruckten Code nicht rückgängig zu machen ist, und das ist keine Bestätigung, die ein Assistent stellvertretend gibt. Stattdessen gibt es Archivieren, und das lässt sich umkehren.

Schreiben ist als Schreiben markiert. Ein Tool, das etwas ändert, trägt readOnlyHint: false, Archivieren trägt destructiveHint: true — und genau das lässt einen Client innehalten und eine Person fragen, bevor er läuft.