Zum Inhalt springen

MCP-Server-Referenz

EmDash enthält einen integrierten Model Context Protocol (MCP)-Server unter /_emdash/api/mcp, der Inhaltsverwaltungsoperationen als Werkzeuge für KI-Assistenten bereitstellt.

Diese Seite behandelt die Protokolldetails: Authentifizierung, Transport, Werkzeugspezifikationen, OAuth-Entdeckung und Fehlerbehandlung.

Der MCP-Server unterstützt drei Authentifizierungsmethoden:

MethodeFunktionsweise
OAuth 2.1 Authorization Code + PKCEStandardablauf für MCP-Clients. Der Benutzer genehmigt Bereiche im Browser.
Persönlicher Zugriffstoken (PAT)Langlebige ec_pat_*-Tokens, die im Admin-Bereich erstellt werden.
Device FlowCLI-ähnlicher Ablauf, bei dem Sie einen Code im Browser genehmigen. Wird von emdash login verwendet.

Sitzungscookies (aus der Admin-Oberfläche) funktionieren ebenfalls, sind aber für externe MCP-Clients nicht praktikabel.

Tokens sind auf Bereiche beschränkt, um einzuschränken, welche Operationen ein Client ausführen kann. Bereiche werden während der OAuth-Autorisierung angefordert und bei jedem Werkzeugaufruf durchgesetzt.

BereichGewährt Zugriff auf
content:readInhalte auflisten, abrufen, vergleichen und durchsuchen. Taxonomiebegriffe und Menüs auflisten.
content:writeInhalte erstellen, aktualisieren, löschen, veröffentlichen, zurückziehen, planen, duplizieren und wiederherstellen. Taxonomiebegriffe erstellen.
media:readMedienobjekte auflisten und abrufen.
media:writeMedienmetadaten aktualisieren und löschen.
schema:readSammlungen auflisten und Sammlungsschemata abrufen.
schema:writeSammlungen und Felder erstellen und löschen.
adminVollzugriff auf alle Operationen.

Der admin-Bereich gewährt Zugriff auf alles. Sitzungsbasierte Authentifizierung (ohne Token) hat ebenfalls vollen Zugriff basierend auf der Rolle des Benutzers.

Zusätzlich zu Bereichen erfordern einige Werkzeuge eine minimale RBAC-Rolle:

OperationMinimale Rolle
InhaltsoperationenKein Minimum (Bereiche steuern den Zugriff)
Schema-LesenEditor (40)
Schema-SchreibenAdmin (50)

Siehe die Authentifizierungsanleitung für Rollendefinitionen.

Der Server verwendet den Streamable HTTP-Transport im zustandslosen Modus. Jede Anfrage ist unabhängig – es gibt keine Sitzungen oder langlebigen Verbindungen.

  • POST /_emdash/api/mcp — JSON-RPC-Werkzeugaufrufe senden
  • GET /_emdash/api/mcp — Gibt 405 zurück (kein SSE im zustandslosen Modus)
  • DELETE /_emdash/api/mcp — Gibt 405 zurück (keine Sitzung zum Schließen)

Antworten folgen dem JSON-RPC 2.0-Format. Fehler verwenden standardmäßige JSON-RPC-Fehlercodes, mit MCP-spezifischen Codes für Bereichs- und Berechtigungsfehler.

Der Server stellt 33 Werkzeuge über sieben Domänen bereit. Jedes Werkzeug gibt Ergebnisse als JSON-Textinhalt zurück oder bei Fehlern eine Fehlermeldung mit isError: true.

Listet Inhaltsartikel in einer Sammlung mit optionaler Filterung und Paginierung auf.

ParameterTypErforderlichBeschreibung
collectionstringJaSammlungsslug (z.B. posts, pages)
statusstringNeinFilter: draft, published oder scheduled
limitintegerNeinMaximale zurückzugebende Artikel (1-100, Standard 50)
cursorstringNeinPaginierungscursor aus einer vorherigen Antwort
orderBystringNeinFeld zum Sortieren (z.B. created_at, updated_at)
orderstringNeinSortierrichtung: asc oder desc (Standard desc)
localestringNeinNach Sprache filtern (z.B. en, fr). Nur relevant bei i18n.

Bereich: content:read | Nur-Lesen: Ja

Ruft einen einzelnen Inhaltsartikel anhand der ID oder des Slugs ab. Gibt alle Feldwerte, Metadaten und ein _rev-Token für optimistische Nebenläufigkeit zurück.

ParameterTypErforderlichBeschreibung
collectionstringJaSammlungsslug
idstringJaInhaltsartikel-ID (ULID) oder Slug
localestringNeinSprache für Slug-Suche. IDs sind global eindeutig.

Bereich: content:read | Nur-Lesen: Ja

Erstellt einen neuen Inhaltsartikel. Das data-Objekt sollte Feldwerte enthalten, die dem Schema der Sammlung entsprechen – verwenden Sie schema_get_collection, um zu prüfen, welche Felder verfügbar sind. Artikel werden standardmäßig als draft erstellt.

ParameterTypErforderlichBeschreibung
collectionstringJaSammlungsslug
dataobjectJaFeldwerte als Schlüssel-Wert-Paare
slugstringNeinURL-Slug (wird bei Auslassung automatisch aus dem Titel generiert)
statusstringNeinInitialer Status: draft oder published (Standard draft)
localestringNeinSprache für diesen Inhalt (Standard ist die Site-Standardsprache)
translationOfstringNeinID des Artikels, von dem dies eine Übersetzung ist

Bereich: content:write

Aktualisiert einen bestehenden Inhaltsartikel. Geben Sie nur Felder an, die Sie ändern möchten – nicht angegebene Felder bleiben unverändert.

ParameterTypErforderlichBeschreibung
collectionstringJaSammlungsslug
idstringJaInhaltsartikel-ID oder Slug
dataobjectNeinZu aktualisierende Feldwerte
slugstringNeinNeuer URL-Slug
statusstringNeinNeuer Status: draft oder published
_revstringNeinRevisions-Token von content_get für Konflikterkennung

Bereich: content:write

Löscht einen Inhaltsartikel vorübergehend, indem er in den Papierkorb verschoben wird. Verwenden Sie content_restore zum Rückgängigmachen oder content_permanent_delete zum endgültigen Entfernen.

ParameterTypErforderlichBeschreibung
collectionstringJaSammlungsslug
idstringJaInhaltsartikel-ID oder Slug

Bereich: content:write | Destruktiv: Ja

Stelle ein vorläufig gelöschtes Inhaltselement aus dem Papierkorb wieder her.

ParameterTypErforderlichBeschreibung
collectionstringJaSlug der Sammlung
idstringJaID oder Slug des Inhaltselements

Bereich: content:write

Lösche ein Inhaltselement aus dem Papierkorb endgültig und unwiderruflich. Das Element muss sich zuerst im Papierkorb befinden.

ParameterTypErforderlichBeschreibung
collectionstringJaSlug der Sammlung
idstringJaID oder Slug des Inhaltselements

Bereich: content:write | Destruktiv: Ja

Veröffentliche ein Inhaltselement, sodass es live auf der Website erscheint. Erstellt eine veröffentlichte Revision aus dem aktuellen Entwurf. Weitere Bearbeitungen erstellen einen neuen Entwurf, ohne die Live-Version zu beeinflussen, bis sie erneut veröffentlicht wird.

ParameterTypErforderlichBeschreibung
collectionstringJaSlug der Sammlung
idstringJaID oder Slug des Inhaltselements

Bereich: content:write

Setze ein veröffentlichtes Element auf den Entwurfsstatus zurück. Es wird nicht mehr auf der Live-Website sichtbar sein, aber sein Inhalt bleibt erhalten.

ParameterTypErforderlichBeschreibung
collectionstringJaSlug der Sammlung
idstringJaID oder Slug des Inhaltselements

Bereich: content:write

Plane ein Inhaltselement für eine zukünftige Veröffentlichung ein. Es wird automatisch zum angegebenen Datum/Zeitpunkt veröffentlicht.

ParameterTypErforderlichBeschreibung
collectionstringJaSlug der Sammlung
idstringJaID oder Slug des Inhaltselements
scheduledAtstringJaISO 8601 Datum/Uhrzeit (z.B. 2026-06-01T09:00:00Z)

Bereich: content:write

Vergleiche die veröffentlichte (Live-)Version eines Inhaltselements mit seinem aktuellen Entwurf. Gibt beide Versionen und ein Flag zurück, das anzeigt, ob es Änderungen gibt.

ParameterTypErforderlichBeschreibung
collectionstringJaSlug der Sammlung
idstringJaID oder Slug des Inhaltselements

Bereich: content:read | Nur Lesen: Ja

Verwirft den aktuellen Entwurf und stellt die letzte veröffentlichte Version wieder her. Funktioniert nur bei Elementen, die mindestens einmal veröffentlicht wurden.

ParameterTypErforderlichBeschreibung
collectionstringJaSlug der Sammlung
idstringJaID oder Slug des Inhaltselements

Bereich: content:write | Destruktiv: Ja

Liste vorläufig gelöschte Inhaltselemente im Papierkorb einer Sammlung auf.

ParameterTypErforderlichBeschreibung
collectionstringJaSlug der Sammlung
limitintegerNeinMaximale Anzahl Elemente (1-100, Standard 50)
cursorstringNeinPaginierungs-Cursor

Bereich: content:read | Nur Lesen: Ja

Erstelle eine Kopie eines bestehenden Inhaltselements. Das Duplikat wird als Entwurf mit “(Kopie)” am Ende des Titels und einem automatisch generierten Slug erstellt.

ParameterTypErforderlichBeschreibung
collectionstringJaSlug der Sammlung
idstringJaID oder Slug des zu duplizierenden Inhaltselements

Bereich: content:write

Hole alle Lokalisierungsvarianten eines Inhaltselements. Gibt die Übersetzungsgruppe und eine Zusammenfassung jeder Lokalisierungsversion zurück. Nur relevant, wenn i18n aktiviert ist.

ParameterTypErforderlichBeschreibung
collectionstringJaSlug der Sammlung
idstringJaID oder Slug des Inhaltselements

Bereich: content:read | Nur Lesen: Ja

Liste alle im CMS definierten Inhaltssammlungen auf. Gibt Slug, Label, unterstützte Funktionen und Zeitstempel zurück.

Keine Parameter.

Bereich: schema:read | Mindestrolle: Editor | Nur Lesen: Ja

Hole detaillierte Informationen über eine Sammlung, einschließlich aller Felddefinitionen. Felder beschreiben das Inhaltsmodell: Name, Typ, Einschränkungen und Validierungsregeln. Nutze dies, um zu verstehen, was content_create und content_update erwarten.

ParameterTypErforderlichBeschreibung
slugstringJaSlug der Sammlung (z.B. posts)

Bereich: schema:read | Mindestrolle: Editor | Nur Lesen: Ja

Erstelle eine neue Inhaltssammlung. Dies erstellt eine Datenbanktabelle und eine Schemadefinition. Der Slug muss aus Kleinbuchstaben und Zahlen mit Unterstrichen bestehen und mit einem Buchstaben beginnen.

ParameterTypErforderlichBeschreibung
slugstringJaEindeutiger Bezeichner (/^[a-z][a-z0-9_]*$/)
labelstringJaAnzeigename (Plural, z.B. “Blogbeiträge”)
labelSingularstringNeinAnzeigename im Singular
descriptionstringNeinBeschreibung dieser Sammlung
iconstringNeinSymbolname für die Admin-Oberfläche
supportsstring[]NeinFunktionen: drafts, revisions, preview, scheduling, search (Standard: ['drafts', 'revisions'])

Bereich: schema:write | Mindestrolle: Admin

Lösche eine Sammlung und ihre Datenbanktabelle. Dies ist unwiderruflich und löscht alle Inhalte in der Sammlung.

ParameterTypErforderlichBeschreibung
slugstringJaZu löschender Sammlung-Slug
forcebooleanNeinErzwinge das Löschen, auch wenn die Sammlung Inhalte hat

Bereich: schema:write | Mindestrolle: Admin | Destruktiv: Ja

Füge ein neues Feld zum Schema einer Sammlung hinzu. Dies fügt der Datenbanktabelle eine Spalte hinzu.

ParameterTypeRequiredBeschreibung
collectionstringJaCollection-Slug
slugstringJaFeldkennung (/^[a-z][a-z0-9_]*$/)
labelstringJaAnzeigename
typestringJaDatentyp (siehe unten)
requiredbooleanNeinOb das Feld erforderlich ist
uniquebooleanNeinOb Werte eindeutig sein müssen
defaultValueanyNeinStandardwert für neue Einträge
validationobjectNeinEinschränkungen: min, max, minLength, maxLength, pattern, options
optionsobjectNeinWidget-Konfiguration: collection (für Referenzen), rows (für Textarea)
searchablebooleanNeinIn den Volltextsuchindex aufnehmen
translatablebooleanNeinOb dieses Feld übersetzbar ist (Standard: true)

Feldtypen: string, text, number, integer, boolean, datetime, select, multiSelect, portableText, image, file, reference, json, slug.

Für select- und multiSelect-Typen müssen die erlaubten Werte in validation.options angegeben werden.

Bereich: schema:write | Mindestrolle: Admin

Entfernt ein Feld aus einer Collection. Löscht die Spalte und alle Daten in diesem Feld. Unumkehrbar.

ParameterTypeRequiredBeschreibung
collectionstringJaCollection-Slug
fieldSlugstringJaZu entfernender Feld-Slug

Bereich: schema:write | Mindestrolle: Admin | Destruktiv: Ja

Listet hochgeladene Mediendateien mit optionaler MIME-Typ-Filterung und Paginierung auf.

ParameterTypeRequiredBeschreibung
mimeTypestringNeinNach MIME-Typ-Präfix filtern (z.B. image/, application/pdf)
limitintegerNeinMaximale Anzahl (1-100, Standard 50)
cursorstringNeinPaginierungs-Cursor

Bereich: media:read | Nur Lesen: Ja

Ruft Details einer einzelnen Mediendatei anhand der ID ab. Gibt Metadaten zurück, einschließlich Dateiname, MIME-Typ, Größe, Abmessungen, Alt-Text und URL.

ParameterTypeRequiredBeschreibung
idstringJaMedienobjekt-ID

Bereich: media:read | Nur Lesen: Ja

Aktualisiert Metadaten einer hochgeladenen Mediendatei. Die Datei selbst kann nicht geändert werden.

ParameterTypeRequiredBeschreibung
idstringJaMedienobjekt-ID
altstringNeinAlt-Text für Barrierefreiheit
captionstringNeinBeschriftungstext
widthintegerNeinBildbreite in Pixeln
heightintegerNeinBildhöhe in Pixeln

Bereich: media:write

Löscht eine Mediendatei endgültig. Entfernt den Datenbankeintrag und die Datei aus dem Speicher. Inhalte, die auf diese Medien verweisen, haben dann defekte Referenzen.

ParameterTypeRequiredBeschreibung
idstringJaMedienobjekt-ID

Bereich: media:write | Destruktiv: Ja

Volltextsuche über Inhalts-Collections hinweg. Collections müssen search in ihrer supports-Liste haben und Felder müssen als searchable markiert sein.

ParameterTypeRequiredBeschreibung
querystringJaSuchanfrage-Text
collectionsstring[]NeinSuche auf bestimmte Collection-Slugs beschränken
localestringNeinErgebnisse nach Sprache filtern
limitintegerNeinMaximale Ergebnisse (1-50, Standard 20)

Bereich: content:read | Nur Lesen: Ja

Listet alle Taxonomie-Definitionen auf (z.B. Kategorien, Tags). Gibt Name, Label, ob hierarchisch und zugehörige Collections zurück.

Keine Parameter.

Bereich: content:read | Nur Lesen: Ja

Listet Begriffe in einer Taxonomie mit Paginierung auf.

ParameterTypeRequiredBeschreibung
taxonomystringJaTaxonomie-Name (z.B. categories, tags)
limitintegerNeinMaximale Anzahl (1-100, Standard 50)
cursorstringNeinPaginierungs-Cursor

Bereich: content:read | Nur Lesen: Ja

Erstellt einen neuen Begriff in einer Taxonomie. Für hierarchische Taxonomien kann eine parentId angegeben werden, um einen untergeordneten Begriff zu erstellen.

ParameterTypeRequiredBeschreibung
taxonomystringJaTaxonomie-Name
slugstringJaURL-sicherer Bezeichner
labelstringJaAnzeigename
parentIdstringNeinÜbergeordnete Begriffs-ID (für hierarchische Taxonomien)
descriptionstringNeinBeschreibung des Begriffs

Bereich: content:write

Listet alle Navigationsmenüs auf. Gibt Name, Label und Zeitstempel zurück.

Keine Parameter.

Bereich: content:read | Nur Lesen: Ja

Ruft ein Menü anhand des Namens inklusive aller seiner Einträge in der richtigen Reihenfolge ab. Einträge haben ein Label, eine URL, einen Typ und optional ein übergeordnetes Element für Verschachtelung.

ParameterTypeRequiredBeschreibung
namestringJaMenüname (z.B. main, footer)

Bereich: content:read | Nur Lesen: Ja

Listet den Revisionsverlauf für einen Inhaltseintrag auf, neueste zuerst. Erfordert, dass die Collection revisions unterstützt.

ParameterTypeRequiredBeschreibung
collectionstringJaCollection-Slug
idstringJaInhalts-ID oder -Slug
limitintegerNeinMaximale Revisionen (1-50, Standard 20)

Bereich: content:read | Nur Lesen: Ja

Stellt einen Inhaltseintrag auf eine frühere Revision zurück. Ersetzt den aktuellen Entwurf durch die Daten der angegebenen Revision. Wird nicht automatisch veröffentlicht – bei Bedarf danach content_publish verwenden.

ParameterTypeRequiredBeschreibung
revisionIdstringJaWiederherzustellende Revisions-ID

Bereich: content:write

MCP-Clients, die OAuth 2.1 unterstützen, können automatisch ermitteln, wie die Authentifizierung erfolgt. Der Server veröffentlicht zwei Metadaten-Dokumente:

GET /.well-known/oauth-protected-resource
{
"resource": "https://example.com/_emdash/api/mcp",
"authorization_servers": ["https://example.com/_emdash"],
"scopes_supported": [
"content:read", "content:write",
"media:read", "media:write",
"schema:read", "schema:write",
"admin"
],
"bearer_methods_supported": ["header"]
}
GET /_emdash/.well-known/oauth-authorization-server
{
"issuer": "https://example.com/_emdash",
"authorization_endpoint": "https://example.com/_emdash/oauth/authorize",
"token_endpoint": "https://example.com/_emdash/api/oauth/token",
"scopes_supported": ["content:read", "content:write", "..."],
"response_types_supported": ["code"],
"grant_types_supported": [
"authorization_code",
"refresh_token",
"urn:ietf:params:oauth:grant-type:device_code"
],
"code_challenge_methods_supported": ["S256"],
"token_endpoint_auth_methods_supported": ["none"],
"device_authorization_endpoint": "https://example.com/_emdash/api/oauth/device/code"
}

Wenn eine nicht authentifizierte Anfrage den MCP-Endpunkt erreicht, antwortet der Server mit:

HTTP/1.1 401 Unauthorized
WWW-Authenticate: Bearer resource_metadata="https://example.com/.well-known/oauth-protected-resource"

Dies löst den standardmäßigen MCP-Client-Erkennungsablauf aus.

Tool-Fehler werden als Textinhalt mit isError: true zurückgegeben:

{
"content": [{ "type": "text", "text": "Collection 'nonexistent' not found" }],
"isError": true
}

Bereichs- und Berechtigungsfehler lösen MCP-Protokollfehler aus:

{
"jsonrpc": "2.0",
"error": {
"code": -32600,
"message": "Insufficient scope: requires content:write"
},
"id": 1
}

Transportebenen-Fehler (Serverfehlkonfiguration, unbehandelte Ausnahmen) geben den JSON-RPC-Fehlercode -32603 (Interner Fehler) zurück, ohne Implementierungsdetails preiszugeben.