MCP-REFERENZ

mzone-publisher — MCP-Werkzeuge

43 Werkzeuge, erzeugt beim Start aus den @McpTool-Annotationen

backlogGet

Liest ein einzelnes Ticket vollstaendig: den ungekappten Rumpf und alle Kommentare als Markdown-Rohtext, in Erstellreihenfolge. Der Gegenpart zu backlogQuery, deren Rumpf bei 1200 Zeichen endet.

ParameterTypPflichtBeschreibung
keystringjaTicket-Key, z.B. 'MZP-37'

backlogQuery

Liest Tickets aus dem Backlog-Cockpit (/admin/backlog). filterJson ist optional und kennt: status[] (IDEA|READY|DOING|REVIEW|DONE|DROPPED), type[] (STORY|BUG|CHORE|SPIKE), priority[] (P0..P3), epic, assignee, text (sucht in Key, Titel, Rumpf), limit (Vorgabe 50, hoechstens 200), compact (true = ohne Rumpf, Kompaktmodus gegen das Token-Limit), fields (kommagetrennte Feldnamen, z.B. "key,title,status"; erlaubt: key, title, type, status, priority, epicKey, assignee, labels, wikiSlug, ageDays, createdAt, closedAt, body, bodyTruncated, commentCount; leere Felder fehlen in der Antwort immer). Weggelassene Filter schraenken nicht ein. Sortiert nach Prioritaet, dann Alter. Jedes Ticket traegt seinen Rumpf, gekappt bei 1200 Zeichen (bodyTruncated sagt es an); den vollen Rumpf und die Kommentare liefert backlogGet.

ParameterTypPflichtBeschreibung
filterJsonstringneinFilter als JSON-Objekt, z.B. {"status":["DOING"],"limit":20}. Weglassen liefert die 50 wichtigsten Tickets.

backlogWrite

Schreibt ins Backlog-Cockpit. opsJson ist ein Objekt {"ops":[...]} oder direkt ein Array. Jede Operation traegt ein Feld op: create (title Pflicht; body, type, priority, epic, assignee, labels[], wikiSlug optional; Key wird vergeben), update (key Pflicht, dieselben Felder; Leerstring loescht ein Feld, Weglassen laesst es stehen), move (key + to = Zielstatus, note optional) und comment (key + body). Operationen laufen einzeln: eine fehlerhafte stoppt die uebrigen nicht. Jede Aenderung erzeugt ein Event mit source=AGENT und dem eigenen Client-Namen als actor.

ParameterTypPflichtBeschreibung
opsJsonstringjaOperationen als JSON, z.B. {"ops":[{"op":"move","key":"MZP-31","to":"DONE"}]}

deleteBrandingProfile

Loescht ein eigenes Branding-Profil. Built-ins sind nicht loeschbar. Veroeffentlichte Diagramme bleiben unveraendert; nur ein neuer Publish mit meta.profile=<geloeschter Name> scheitert.

ParameterTypPflichtBeschreibung
codenamestringjaCodename des eigenen Profils

deletePage

Löscht eine veröffentlichte Seite aus der Datenbank. Die Seite ist danach nicht mehr erreichbar.

ParameterTypPflichtBeschreibung
slugstringjaSlug der zu löschenden Seite

diffDiagram

Strukturelles Delta zwischen zwei publizierten Versionen eines Diagramm-Bundles: added, removed, changed (Feld -> alt/neu in details) und rerouted (nur anders geroutet). Verglichen wird ein layoutfreies Modell: ein verschobener Knoten oder 1px versetzte Kanten erzeugen KEINEN Eintrag. Antwort: receipt (maschinenlesbare Quittung mit comparatorVersion, Hashes und Aenderungszeilen, genug fuer einen Aenderungstext ohne die Bilder), deltaUrl (Before|Delta|After unter /published/{slug}/delta) und summary. Fehlt einer Altversion die diagram.json, wird sie aus dem diagram.svg rekonstruiert (CANONICAL_FROM_SVG, Zonen-style nur genaehert). Fehler: DIAGRAM_DELTA_UNKNOWN_VERSION, DIAGRAM_DELTA_NOT_A_DIAGRAM. otherSlug vergleicht slug@fromVersion mit otherSlug@toVersion (Entwurf A gegen B; fehlende Versionen sind die aktuellen, receipt.toSlug nennt die Gegenseite). rules[] und lenses[] sind nicht Teil des Modells: ihren Stand melden validateDiagram und publishDiagram je Entwurf. Seitentext vergleicht listVersions(slug, versionA, versionB).

ParameterTypPflichtBeschreibung
slugstringjaURL-Slug des Diagramm-Bundles (beim Variantenvergleich: Entwurf A)
fromVersionintegerneinAusgangsversion (from). Versionsnummern liefert listVersions(slug). Pflicht ohne otherSlug.
toVersionintegerneinZielversion (to). from == to ist gueltig und liefert eine leere Quittung. Pflicht ohne otherSlug.
otherSlugstringneinAW5: Slug eines zweiten Diagramms (Entwurf B) fuer den Variantenvergleich

diffVersions

DEPRECATED -> listVersions. Dort versionA und versionB; funktioniert bis zur Messung unveraendert.

ParameterTypPflichtBeschreibung
slugstringjaSlug der Seite
versionAintegerjaErste Versionsnummer aus listVersions
versionBintegerjaZweite Versionsnummer aus listVersions

exportFigurePng

Liefert die Download-URL fuer die PNG-Fassung (transparent oder mit Papier-Hintergrund) einer bereits publizierten analog-v1-Figur (sketch-to-figure, siehe docs/agent-workflows/sketch-to-figure.md). Rastert nicht selbst -- die Rasterung passiert lazy beim ersten Abruf der URL. available=false heisst: unter diesem Slug wurde keine Figur mit dem az-svg-Konvent gefunden (kein figure.svg im Bundle).

ParameterTypPflichtBeschreibung
ctxobjectnein
slugstringjaSlug der publizierten Figur, z.B. 'analog-coding-harness'
scaleintegernein1-4, Default 2 -- wie bei diagram.png.
bgstringnein'transparent' (Default) oder 'template' (Papier-Hintergrund --paper aus dem analog-v1-Designsystem).

extractTemplate

DEPRECATED -> publishArtifact. Template-Welt entfaellt; funktioniert bis zur Messung unveraendert.

ParameterTypPflichtBeschreibung
namestringjaEindeutiger Template-Name
categorystringjaKonvention: 'design' markiert ein extrahiertes Design-Template
descriptionstringneinOptionale Beschreibung, z.B. woher/wann extrahiert
htmlContentstringjaHTML mit ${variablen} fuer austauschbaren Inhalt

fullTextSearch

Volltextsuche ueber Titel, Slug, Context und Seitentext (ohne HTML-Markup), nach Relevanz sortiert, hoechstens 100 Treffer. Versteht deutsche Wortformen (Diagramm findet Diagramme). Syntax: "genaue phrase", a or b, -ausschluss. Slug und Titel matchen zusaetzlich als Teilstring. matchedIn nennt die Trefferstellen (slug, title, context, body). Nuetzlich um 'alle Seiten die Keycloak erwaehnen' zu finden. Liefert Summary ohne Context-JSON.

ParameterTypPflichtBeschreibung
querystringjaSuchbegriff oder Suchausdruck (Phrase in Anfuehrungszeichen, -wort schliesst aus)

getArtifactSource

R27/FR-3: liest zurueck, was tatsaechlich veroeffentlicht wurde — Content-Readback fuer raw_html-Seiten und Artefakt-Bundles. Bei einer Template-Seite liefert getPageContext (DEPRECATED, funktioniert) das Context-JSON, getArtifactSource den gerenderten Quelltext. Ohne path: das gespeicherte index.html (bzw. rawHtml) — bei Asset-Seiten aus R31 stattdessen die Datei selbst (asset.svg o.ae.), weil sie dort der Inhalt ist; der generierte Steckbrief bleibt ueber path='index.html' erreichbar. Mit path: eine benannte Begleitdatei des Bundles (z.B. 'app.js', 'style.css') als Text. Binaerdateien (Bilder, Fonts) werden abgelehnt — dies ist ein Quelltext-Reader, kein Datei-Download. maxBytes (Default 100000, Max 2000000) kuerzt grosse Dateien mit einem Hinweis am Ende statt den Kontext zu sprengen — analog web_fetch. Unbekannter Slug oder Pfad liefert einen strukturierten Fehler (PAGE_NOT_FOUND bzw. ASSET_NOT_FOUND).

ParameterTypPflichtBeschreibung
slugstringjaSlug der Seite, z.B. 'kimi-claw-signature-template'
pathstringneinOptionaler relativer Pfad einer Begleitdatei, z.B. 'app.js'. Ohne Angabe: index.html/rawHtml.
maxBytesintegerneinOptionale Obergrenze der zurueckgegebenen Bytes (Default 100000, Max 2000000)

getCapabilities

Selbstbeschreibung des Publishers als JSON und ERSTER CALL jedes Agenten, der etwas publizieren will: Groessenlimits, Endungen, Encodings, Slug-Regeln, gepinnte Bibliotheken ('libs': je EINE Zeile mit der neuesten Version, die richtige fuer ein neues Artefakt) und unter 'styling' das Klassen- und Modul-Vokabular von mzone-ui als Namensliste; wer daneben greift, bekommt UNKNOWN_STYLE_CLASS. styles='mz-card, mz-grid' liefert die vollen Katalog-Eintraege (ersetzt lookupStyles). include='minimal' haelt nur die harten Regeln. diagramType='flowchart' haengt Budget und Regeln dieses Typs an die Landkarte; den Typ allein samt Schema liefert topic='flowchart'. topic liefert Ausschnitte statt der Landkarte (ersetzt getCapabilityFor und listCapabilities): topic='list' nennt die Themen, sonst ein Thema, ein Diagramm-Typ oder ein Tool-Name (dessen Signatur), z.B. 'libs, icons, analog, publish'.

ParameterTypPflichtBeschreibung
includestringneinUmfang: 'default' (Landkarte, wie bisher) oder 'minimal' (nur Limits, Slug-Regeln, Encodings, gepinnte Libs). Ohne Angabe: 'default'.
stylesstringneinOptional: kommagetrennte Klassen-/Modulnamen oder Freitext, z.B. 'mz-card, mz-grid, particleField'. Liefert dieselben vollen Katalog-Eintraege unter 'styles' — spart den zweiten Aufruf.
diagramTypestringneinOptional: ein Diagramm-Typ (z.B. 'flowchart', 'sequence') aus DiagramType.jsonName. 'diagramRules' liefert dann nur das Budget dieses Typs statt der vollen Tabelle; ohne diagramType bleibt 'diagramRules' weg (Byte-Budget der Landkarte). Die Landkarte kommt trotzdem mit (bis 8 KB); nur den Typ liefert topic='<typ>'. Nicht mit include='minimal' kombinieren.
topicstringneinOptional: Ausschnitt statt Landkarte, kommagetrennt. 'list' nennt die Themen; sonst ein Thema (z.B. 'libs, icons, analog'), ein Diagramm-Typ oder ein Tool-Name (liefert dessen Signatur). Ersetzt getCapabilityFor. Hat Vorrang: include, styles und diagramType werden dann ignoriert.

getCapabilityFor

DEPRECATED -> getCapabilities. Dort topic='<thema>'; funktioniert bis zur Messung unveraendert.

ParameterTypPflichtBeschreibung
capabilitystringjaKommagetrennte Keywords, Diagramm-Typ oder Tool-Name, z.B. 'libs'

getDesignMdFor

DEPRECATED -> searchBranding. Ein exakter Codename trifft dort immer; funktioniert unveraendert.

ParameterTypPflichtBeschreibung
codenamestringjaExakter Codename (mitgeliefert oder eigen)

getDiagramChatView

Nur fuer den Chat-Viewer (MCP Apps, MZP-126) -- ein Agent braucht dieses Tool nicht. Liefert das fertige index.html eines publizierten Diagramms (slug) oder einer Preview (previewToken aus validateDiagram). Genau einen der beiden setzen.

ParameterTypPflichtBeschreibung
slugstringneinSlug eines publizierten Diagramms
previewTokenstringneinpreviewToken aus validateDiagram

getPageContext

DEPRECATED -> getArtifactSource (liefert gerenderten Quelltext, nicht den Context-JSON). Dieses Tool liefert den Context-JSON unveraendert.

ParameterTypPflichtBeschreibung
slugstringjaSlug der Seite, z.B. 'wiki-svc-mzone-ops'

getPageHistory

DEPRECATED -> listVersions (nur Staende ueber publishArtifact). Audit-Zeilen je Slug nur hier und unter /admin/audit.

ParameterTypPflichtBeschreibung
slugstringjaSlug der Seite
limitintegerneinMaximale Anzahl Eintraege (Default 20)

getPageStats

Gibt aggregierte Statistiken zurück: Anzahl Templates, veröffentlichte Seiten, Kategorien, Seiten der letzten 7 Tage

Keine Parameter.

getRatchetCityKit

Rezept fuer die Ratschen-Stadt in einem beliebigen Maven-Repo: jede Java-Datei als Haus (Grundflaeche und Hoehe nach Zeilen, Farbe nach JaCoCo-Abdeckung) in einer eigenstaendigen HTML-Datei, optional als isometrisches SVG samt Bildblock in der README. Das Tool fuehrt nichts aus: Du fuehrst die Schritte lokal in der Shell des Repos aus (steps, bash oder powershell), laedst das Kit mit Pruefsummen (files, vendor) und rufst build.py mit den Parametern auf. Es wird nichts hochgeladen. Farben und Titel setzt du ueber theme.json (theme.keys) und --title; ohne Angabe gilt der Look des mzone-publisher. Die README wird nur mit --readme angefasst.

Keine Parameter.

getTemplate

DEPRECATED -> publishArtifact. Template-Welt entfaellt; funktioniert bis zur Messung unveraendert.

ParameterTypPflichtBeschreibung
templateNamestringjaTemplate-Name (exakt), z.B. 'wiki-page'

listAssetUsage

R32: die Herkunfts-Achse in Gegenrichtung — welche Seiten haben deklariert, dass sie dieses Asset verwenden? Eine Seite deklariert das ueber usedAssets im metadataJson bei publishArtifact/publishAsset/publishPage. Nuetzlich vor dem Ueberschreiben eines aktiven (trust:active) Assets: die ASSET_UPDATED-Notice, die publishAsset bei einem Republish zurueckgibt, listet dieselben Seiten. Ohne deklarierte Nutzung leer — das Asset koennte trotzdem kopiert worden sein, nur eben nicht nachverfolgbar.

ParameterTypPflichtBeschreibung
slugstringjaSlug des Assets, z.B. 'asset-epic-dragon'

listCapabilities

DEPRECATED -> getCapabilities. Dort topic='list'; funktioniert bis zur Messung unveraendert.

Keine Parameter.

listPublishedPages

Listet veroeffentlichte Seiten als BLOCK mit schlankem Summary (Slug, Titel, Template-Name, Aenderungsdatum, URL, status, supersededBy, kind, mediaType). KEIN Context-JSON. H3: der Aufruf liefert standardmaessig 50 Seiten, nicht alle — die Antwort traegt total und nextCursor; nextCursor an den naechsten Aufruf weiterreichen blaettert weiter, null bedeutet letzter Block. limit maximal 200, darueber wird geklemmt. Context-JSON einer Template-Seite: getPageContext(slug) (DEPRECATED, funktioniert); gerenderter Quelltext: getArtifactSource(slug). Fuer Suche: fullTextSearch(query). Optionaler status-Filter (draft|current|superseded|archived, R28/FR-4): status='current' liefert nur gueltige Seiten, ohne die ueberholten Duplikate. Optionaler kind-Filter (page|asset, R31): kind='asset' ist der Katalog der Asset-Bibliothek. K07: fields='slug,title,status' liefert nur diese Felder (Kompaktmodus, Token-sparend).

ParameterTypPflichtBeschreibung
statusstringneinOptionaler Lifecycle-Filter: draft|current|superseded|archived
kindstringneinOptionaler Gattungs-Filter: page|asset
limitintegerneinSeiten je Block, Default 50, Maximum 200
cursorstringneinnextCursor aus der vorigen Antwort — blaettert weiter
fieldsstringneinOptional: kommagetrennte Feldnamen, z.B. 'slug,title,status' (Kompaktmodus). Erlaubt: slug, title, templateName, lastModified, url, status, supersededBy, kind, mediaType, trust, hallOfFame. Ohne Angabe: alle Felder.

listTemplates

DEPRECATED -> publishArtifact. Template-Welt entfaellt; funktioniert bis zur Messung unveraendert.

Keine Parameter.

listVersions

Snapshot-Historie eines Slugs: jede Version mit Zeitstempel, Groesse, Dateianzahl und publizierendem Agenten, neueste zuerst, der aktuelle Stand mit current=true. Mit versionA und versionB (Nummern aus dieser Liste) stattdessen Dateiliste plus Unified-Diff zwischen den beiden Staenden: unveraenderte Dateien fehlen, Textdateien tragen einen Diff mit 3 Zeilen Kontext, Binaerdateien und Textdateien ueber 20000 Zeilen einen SHA-256-Vergleich. Beim Ueberschreiben via publishArtifact wird der vorherige Stand automatisch gesichert.

ParameterTypPflichtBeschreibung
slugstringjaSlug der Seite
versionAintegerneinErste Versionsnummer fuer den Diff; nur zusammen mit versionB
versionBintegerneinZweite Versionsnummer fuer den Diff; nur zusammen mit versionA

lookupStyles

DEPRECATED -> getCapabilities. Dort styles='<namen>'; funktioniert bis zur Messung unveraendert.

ParameterTypPflichtBeschreibung
querystringjaKommagetrennte Klassen-/Modulnamen oder Freitext-Beschreibung

publishArtifact

PRIMAERER WEG zum Publizieren interaktiver HTML-Artefakte (Reports, 3D-Visualisierungen, Single-File-Apps): ein Bundle aus index.html plus beliebigen Begleitdateien, alle relativ zur index.html (kein CDN noetig), erreichbar unter https://publisher.maierzone.de/published/{slug}/ . Das Bundle kommt aus GENAU EINER Quelle: html (eine Datei), files (Array), stagingToken (aus validateArtifact, ohne erneute Uebertragung) oder filesJson (Alt-Weg). Was der Server schon haelt, per fromSlug/fromPath referenzieren statt neu senden. Existiert der Slug, scheitert der Call ohne overwrite=true; der alte Stand bleibt als Version (listVersions/rollbackArtifact). Rueckgabe: url, version, notices (code/severity/subject), reachability (allOk=false: gespeichert, aber falsch ausgeliefert) und der Browser-Blick (CONSOLE_ERROR, PAGE_EXCEPTION, RESOURCE_FAILED). Limit 10 MB dekomprimiert. Ein analog-Blatt ist ein Artefakt (dieses Tool), kein Diagramm; eine Zahl, die beim Oeffnen aktuell sein soll, ist liveData, nicht eingeschrieben. Weitere Weichen (compact, grosse Dateien, patch): getCapabilities(topic='publish').

ParameterTypPflichtBeschreibung
ctxobjectnein
slugstringjaURL-Slug (Kleinbuchstaben, Ziffern, Bindestriche), z.B. 'three-demo'
filesarrayneinEMPFOHLEN: die Bundle-Dateien als echtes Array. Genau eine davon MUSS path='index.html' haben. Je Datei: path (relativ) plus GENAU EINE Quelle — content (UTF-8-Text), contentBase64 (+ optional encoding='none'|'br'|'gzip') oder fromSlug (+ optional fromPath) fuer eine Datei, die der Publisher bereits haelt.
stagingTokenstringneinAlternative zu files: der previewToken aus validateArtifact. Publiziert das dort gepruefte Bundle, ohne es erneut zu uebertragen. Laeuft mit der Preview ab (Default 15 min).
filesJsonstringneinAlt-Weg (Bestandsagenten): dasselbe Array als JSON-String, z.B. [{"path":"index.html","content":"<!doctype html>..."}]. Neu geschriebene Agenten nehmen stattdessen 'files'.
metadataJsonstringneinOptionales Metadaten-JSON: {"title":"...","description":"...","tags":["viz","three"],"usedAssets":["asset-epic-dragon"],"socialPreview":true}. Ohne title wird der <title> der index.html genutzt. usedAssets (R32) deklariert verwendete Asset-Slugs — Grundlage fuer listAssetUsage auf jenen Assets. socialPreview (D-2, default true) steuert og:*/twitter:*-Tags + canonical, die beim Ausliefern in <head> injiziert werden — false schaltet sie ab.
overwritebooleanneintrue = bestehenden Slug ersetzen (alter Stand wird als Version gesichert). Default false.
verbositystringnein'full' (Default) oder 'compact'. compact laesst Datei-Liste, warnings, libReferences und INFO-Hinweise weg — alles, was der Agent selbst geschickt hat oder nicht braucht.
renderCheckbooleanneintrue (Default) = die publizierte Seite zusaetzlich in einem echten Browser laden und Konsolenfehler zurueckmelden. Kostet 2-4 s. Auf false setzen, wenn in einer Schleife Zwischenstaende publiziert werden und erst der letzte geprueft werden soll.
modestringneinH4: 'full' (Default) oder 'patch'. Bei 'patch' beschreibt filesJson nur geaenderte und neue Dateien; alles Unerwaehnte bleibt erhalten, und overwrite wird nicht verlangt. Ein Patch auf einen unbekannten Slug schlaegt mit PATCH_WITHOUT_BASE fehl.
deletePathsJsonstringneinH4: JSON-Array von Pfaden, die aus dem publizierten Stand entfernt werden, z.B. ["alt.js"]. Nur bei mode='patch'.
liveDataarrayneinE11 lebende Reports: Datenquellen, die der Server als _data.json neben index.html legt, z.B. ["stats"] oder ["stats","backlog"]. Nur Zahlen, live bei jedem Abruf; dazu _data.snapshot.json als eingefrorener Stand dieser Version. Lesen: fetch('_data.json').then(r=>r.ok?r.json():Promise.reject()).catch(()=>fetch('_data.snapshot.json').then(r=>r.json())). Bei mode=patch ohne liveData bleibt die bisherige Deklaration; [] entfernt sie.
a11ybooleanneinE9: true = der Browser-Blick misst zusaetzlich die Zugaenglichkeit (axe-core, WCAG 2.2 AA, nur der automatisch pruefbare Teil). Je verletzter Regel eine Notice A11Y_<REGEL> (z.B. A11Y_IMAGE_ALT) als WARNING mit impact, nodes, targets, helpUrl -- nie ERROR, ok bleibt unberuehrt. A11Y_CLEAN = nichts gefunden, A11Y_SKIPPED = nicht gemessen. Kostet bis 3 s. Default false; wirkt nur mit laufendem Render-Check.
htmlstringneinKurzform fuer EINE Datei: das komplette HTML-Dokument, wird als index.html publiziert. Schliesst sich mit files, stagingToken und filesJson aus.

publishAsset

Legt EINE Datei als eigene, auffindbare Seite ab (Asset-Bibliothek, Slug 'asset-{name}'), z.B. ein SVG, ein Diagramm, einen Datensatz. Unter /published/{slug}/ entsteht ein Steckbrief, die Datei liegt unter asset.{endung}. title/description/tags im metadataJson sind der Text, ueber den fullTextSearch das Asset findet; getArtifactSource liefert den Quelltext. Vertrauen: inerte Formate (svg, png, jpg, json, md, csv, txt ...) duerfen blind kopiert werden, html/js/css sind trust:active und erst nach Lesen verwendbar; ein SVG mit aktiven Inhalten wird abgelehnt (ACTIVE_SVG_CONTENT). Details: getCapabilities(topic='publish').

ParameterTypPflichtBeschreibung
slugstringjaURL-Slug, konventionell 'asset-{name}', z.B. 'asset-epic-dragon'
filenamestringjaDateiname mit Endung, z.B. 'epic-dragon.svg'. Bestimmt Format und Content-Type; gespeichert wird die Datei als 'asset.{endung}'.
contentstringneinDer Inhalt als UTF-8-Text (z.B. das komplette <svg>...</svg>). Fuer Binaerformate stattdessen contentBase64 nutzen.
contentBase64stringneinDer Inhalt base64-kodiert — fuer PNG/JPG/WebP oder grosse Dateien. Genau eines von content oder contentBase64 setzen.
metadataJsonstringneinOptionales Metadaten-JSON: {"title":"Epic Dragon","description":"Roter Drache, Seitenansicht","tags":["dragon","fantasy"],"usedAssets":["asset-scale-texture"]}. title/description/tags sind der Text, ueber den andere Agenten das Asset spaeter finden. usedAssets (R32) deklariert, welche anderen Asset-Slugs DIESES Asset selbst verwendet (z.B. eine referenzierte Textur) — Grundlage fuer listAssetUsage auf jenen Assets. socialPreview (D-2, default true) steuert og:*/twitter:*-Tags + canonical auf dem generierten Steckbrief. Fehlen title/description, werden bei einem SVG <title> und <desc> uebernommen; ohne beides ist das Asset nur ueber den Slug auffindbar.
overwritebooleanneintrue = bestehendes Asset ersetzen (alter Stand bleibt als Version). Default false.

publishDiagram

Rendert Diagramm-JSON serverseitig im maierzone-Skin und publiziert index.html + diagram.svg unter /published/{slug}/ — mit Versionierung, Overwrite-Schutz und Audit wie publishArtifact (ADR-011, Delegation an dieselbe Artefakt-Pipeline). ZWEI WEGE, GENAU EINEN setzen: (1) diagramJson — parst und validiert wie validateDiagram (dessen Hinweise wie RULE_VIOLATED stehen im Ergebnis), ein ungueltiges Diagramm scheitert mit DIAGRAM_INVALID statt zu publizieren. (2) stagingToken — der previewToken aus validateDiagram; das dort bereits gerenderte Bundle wird publiziert, ohne erneut zu rendern oder zu uebertragen. Beides fehlend liefert MISSING_INPUT. Nach dem Publish zaehlt ein echter Browser nach (visualProof): sichtbare Formen, Elemente ohne Ausdehnung und Elemente ausserhalb der Zeichenflaeche. Weicht das von der Renderer-Bilanz ab, kommt RENDER_MISMATCH als WARNING — der Publish bleibt davon unberuehrt.

ParameterTypPflichtBeschreibung
slugstringjaURL-Slug (Kleinbuchstaben, Ziffern, Bindestriche)
diagramJsonstringneinDiagramm-JSON, wie bei validateDiagram
stagingTokenstringneinstagingToken aus validateDiagram — schliesst sich mit diagramJson aus
metadataJsonstringneinMetadaten-JSON {title?, description?, tags?}. Ohne title wird der <title> der gerenderten index.html genutzt (= meta.title des Diagramms).
overwritebooleanneintrue = bestehenden Slug ersetzen (bisheriger Stand bleibt als Version erhalten). Default false.
renderCheckbooleanneintrue (Default) = die publizierte Seite zusaetzlich in einem echten Browser laden und Konsolenfehler zurueckmelden.
inlinebooleanneinH1: true liefert das fertige, kollisionsfreie SVG direkt im Feld diagramSvg — zum Einbetten in einen Report ohne Umweg ueber getArtifactSource. Default false, weil ein SVG leicht 20 KB Kontext kostet.
mermaidstringneinMZP-110: Mermaid-Text statt diagramJson, dieselbe dritte Eingabeform wie bei validateDiagram (diagramJson wirkt dann als Overlay). Schliesst sich wie diagramJson mit stagingToken aus.
asciistringneinMZP-148: ASCII-Skizze (Kaesten, Pfeile, Zonen) statt diagramJson; diagramJson wirkt dann als Overlay, mermaid darf nicht zugleich gesetzt sein. Zeichenvorrat, Lage-Regel und Beispiel: getCapabilities(topic='ascii').
drawiostringneinK06: draw.io-Datei (mxfile oder mxGraphModel, auch komprimiert) statt diagramJson; diagramJson wirkt dann als Overlay, mermaid/ascii duerfen nicht zugleich gesetzt sein. Die Lage der Datei wird nicht gelesen, das Auto-Layout rechnet neu. Umfang und Meldungen: getCapabilities(topic='drawio').

publishPage

DEPRECATED -> publishArtifact. Template-Welt entfaellt; funktioniert bis zur Messung unveraendert (ADR-Pfad offen).

ParameterTypPflichtBeschreibung
templateNamestringjaTemplate-Name (exakt)
slugstringjaURL-Slug (Kleinbuchstaben, Ziffern, Bindestriche), z.B. 'meine-seite'
contextJsonstringjaJSON-Kontext mit Template-Variablen, z.B. {"title":"Hallo"}
importImagesbooleanneintrue = Bilder freigegebener Hosts serverseitig holen (MZP-96)

publishQuiz

Baut aus Fragen ein Multiple-Choice-Quiz und publiziert es als selbstlaufende Seite quiz-<titel> (Punktestand und Wiederholung nur im Browser des Spielers, kein Backend). Du schreibst nur die Fragen; Validierung, Seitenbau, Publish und Rueckpruefung uebernimmt der Server. Regeln: genau 4 Optionen, richtig = Index 0..3, keine doppelten oder leeren Optionen, keine Sammeloptionen ('alle der oben', 'beides'), erklaerung Pflicht, niveau leicht|mittel|schwer, richtige Position gleichverteilt. Bei Verstoss kommt QUIZ_INVALID mit ALLEN Fehlern; korrigieren und erneut senden. Ein bestehender Slug wird ueberschrieben (alter Stand bleibt als Version, listVersions/rollbackArtifact). Empfohlener Ablauf: Prompt 'mzp-quiz'.

ParameterTypPflichtBeschreibung
titelstringjaTitel des Quiz; daraus wird der Slug quiz-<titel> abgeleitet
fragenarrayjaDie Fragen: [{frage, optionen:[4 Texte], richtig:0..3, erklaerung, niveau:'leicht'|'mittel'|'schwer'}]

publishRawPage

DEPRECATED -> publishArtifact. Dort html='<dokument>' mit slug; ein vorhandener Slug braucht overwrite=true. Funktioniert bis zur Messung unveraendert.

ParameterTypPflichtBeschreibung
slugstringjaURL-Slug (Kleinbuchstaben, Ziffern, Bindestriche), z.B. 'pascal'
titlestringneinOptionaler Titel (fuer Listing-UI), leer erlaubt
rawHtmlstringjaKomplettes HTML-Dokument, wird 1:1 serviert

publishRawPageCompressed

DEPRECATED -> publishArtifact. Dort files mit contentBase64 und encoding; ein vorhandener Slug braucht overwrite=true. Funktioniert bis zur Messung.

ParameterTypPflichtBeschreibung
slugstringjaURL-Slug (Kleinbuchstaben, Ziffern, Bindestriche), z.B. 'dialog'
encodingstringjaKompressions-Encoding: 'br' (Brotli, empfohlen) oder 'gzip'
rawHtmlCompressedBase64stringjaKomprimiertes HTML: rawHtml -> Brotli/Gzip -> Base64
titlestringneinOptionaler Titel (fuer Listing-UI), leer erlaubt

queryDiagram

Befragt den Graphen eines publizierten Diagramm-Bundles, ohne dass die diagram.json in den Kontext muss. direction=in: was fuehrt zu nodeId (stromauf), out: was haengt daran (stromab) — transitiv, mit depth begrenzbar (1 = direkte Nachbarn). direction=paths: alle einfachen Pfade von nodeId nach to, kuerzester zuerst, hoechstens 10 (truncated sagt, ob es mehr gab); kein Pfad ist eine leere Liste, kein Fehler. Kanten gelten gerichtet wie gespeichert. Die Antwort traegt nur Ids, Labels und Kanten-Keys, keine Geometrie. Versionsvergleiche macht diffDiagram.

ParameterTypPflichtBeschreibung
slugstringjaURL-Slug des Diagramm-Bundles
nodeIdstringjaId des Startknotens
directionstringjain | out | paths
tostringneinZielknoten, Pflicht bei direction=paths
depthintegerneinHoechstzahl der Hops bei in/out; weggelassen = transitiv
versionintegerneinVersion; weggelassen = die aktuelle

renderPreview

DEPRECATED -> publishArtifact. Template-Welt entfaellt; funktioniert bis zur Messung unveraendert.

ParameterTypPflichtBeschreibung
templateNamestringjaExakter Template-Name
contextJsonstringjaJSON-Objekt mit Template-Variablen, z.B. {"title":"Hallo","body":"Welt"}

revokePreview

R13: einen Review-Link vor seinem Ablauf ungueltig machen. Wirkt sofort — die URL antwortet danach mit 404, unabhaengig davon, wer sie schon hat. Gilt nur fuer langlebige Links aus validateArtifact(reviewTtlSeconds); kurze Standard-Previews laufen ohnehin nach 15 Minuten aus. Unbekannter, abgelaufener oder bereits widerrufener Token liefert revoked=false statt eines Fehlers: das Ergebnis ist dasselbe, der Link funktioniert nicht mehr.

ParameterTypPflichtBeschreibung
tokenstringjaDer previewToken aus validateArtifact

rollbackArtifact

Stellt eine fruehere Version wieder her — inklusive aller Assets, nicht nur des HTML. Der aktuelle Stand wird vorher selbst gesichert, ein Rollback ist also ebenfalls reversibel. Verfuegbare Versionen: listVersions(slug).

ParameterTypPflichtBeschreibung
slugstringjaSlug der Seite
versionintegerjaWiederherzustellende Versionsnummer aus listVersions

saveBrandingProfile

Legt ein eigenes Branding-Profil an oder aendert es (Upsert); danach rendert meta.profile=<codename> in validateDiagram/publishDiagram damit. Pflicht: codename, mode (light|dark, eine Palette je Profil), vibe, colors.surface/text/accent; optional colors.primary/secondary (werden series1/2), voice, theme (Ueberschreibung einzelner Theme-Felder wie muted, link, rule), typography, layoutPrinciples. Der Server leitet die uebrigen Theme-Felder ab und prueft den Kontrast (Text unter 4.5:1 ist ein Fehler, Akzent unter 3:1 eine Warnung); das abgeleitete Theme steht im Ergebnis. Built-ins (nightline, ledger, monoblock, arcade) sind nicht ueberschreibbar. Beispiel: {"codename":"acme","mode":"light","vibe":"Sachlich, blau","colors":{"surface":"#FFFFFF","text":"#1B1F23","accent":"#0B6BCB"}}

ParameterTypPflichtBeschreibung
profileJsonstringjaProfil als JSON-Objekt (Beispiel in der Tool-Beschreibung)

searchBranding

Sucht unter den Branding-Profilen fuer Diagramme/Artefakte (mitgelieferte nightline, ledger, monoblock, arcade und eigene aus saveBrandingProfile; `source` sagt welche) — exakter Codename trifft immer, Freitext wird gegen die vibe-Beschreibung gesucht (z.B. 'verspielt' -> arcade). Liefert bei Treffer das volle Basis-Profil. Diese Werte sind eine BASIS, kein festes Regelwerk: einzelne Tokens (Farbe, Dichte, Typo) duerfen vor Gebrauch frei angepasst werden.

ParameterTypPflichtBeschreibung
querystringjaCodename (exakt) oder Freitext-Charakterbeschreibung

searchPages

DEPRECATED -> fullTextSearch (auch Seitentext, max. 100 Treffer). Slug-Kataloge: listPublishedPages(kind='asset'|'page'), Praefix selbst filtern.

ParameterTypPflichtBeschreibung
fragmentstringjaSuchfragment fuer den Slug
fieldsstringneinOptional: kommagetrennte Feldnamen, z.B. 'slug,title'

setPageLifecycle

R28/FR-4: markiert eine Seite als draft|current|superseded|archived und/oder setzt ihren Nachfolger. Wird supersededBy gesetzt, ist der Status implizit superseded — status muss dann nicht separat mitgegeben werden. Der Server prueft, dass der Nachfolger existiert (Fehler SUCCESSOR_NOT_FOUND) und dass keine Zyklen entstehen (Fehler LIFECYCLE_CYCLE). Alte Seiten bleiben erreichbar (kein Loeschen) — sie bekommen beim Ausliefern einen Hinweisbanner auf den Nachfolger. listPublishedPages(status:'current') filtert danach die ueberholten Duplikate raus.

ParameterTypPflichtBeschreibung
slugstringjaSlug der Seite, die einen neuen Lebenszyklus-Status bekommt
statusstringneindraft|current|superseded|archived — optional, wenn supersededBy gesetzt wird
supersededBystringneinSlug des Nachfolgers. Gesetzt => status wird implizit 'superseded'.
reasonstringneinFreitext-Begruendung, z.B. 'Nachtest IV deckt denselben Umfang mit neuerem Stand ab'

validateArtifact

Prueft ein Bundle OHNE es zu speichern (Groessen, Dateitypen, index.html, kaputtes HTML, CDN-Referenzen, tote relative Links) und legt eine Preview an: previewUrl (Default 15 min) plus previewToken, der als stagingToken an publishArtifact geht, ohne das Bundle erneut zu senden. Gleiche Quellen wie publishArtifact (html, files, filesJson, fromSlug). Die Preview wird in einem echten Browser geladen (CONSOLE_ERROR, PAGE_EXCEPTION, RESOURCE_FAILED, 2-4 s); ein Befund der Stufe ERROR macht ok=false. Review-Links fuer Externe (reviewTtlSeconds, max 7 Tage) und Widerruf: getCapabilities(topic='publish').

ParameterTypPflichtBeschreibung
filesarrayneinEMPFOHLEN: die Bundle-Dateien als echtes Array (wie bei publishArtifact)
filesJsonstringneinAlt-Weg (Bestandsagenten): dasselbe Array als JSON-String
reviewTtlSecondsintegerneinR13: gewuenschte Lebensdauer des Preview-Links in SEKUNDEN, z.B. 86400 fuer einen Tag. Ohne Angabe gilt die kurze Standard-TTL (15 min, nur im Speicher). Maximum 604800 (7 Tage).
renderCheckbooleanneinMZP-49: false laesst den Browser-Blick auf die Preview weg. Ohne Angabe laeuft er.
renderStrictbooleanneinE1: true (Default) = ein Browser-Befund der Stufe ERROR (PAGE_EXCEPTION/CONSOLE_ERROR/RESOURCE_FAILED) macht ok=false. false = Befunde nur als Notices, ok bleibt beim Bundle-Urteil.
liveDataarrayneinE11: wie bei publishArtifact, z.B. ["stats"] -- die Preview liefert dann /preview/{token}/_data.json, und ein stagingToken-Publish uebernimmt die Deklaration.
a11ybooleanneinE9: true = der Browser-Blick misst zusaetzlich die Zugaenglichkeit (axe-core, WCAG 2.2 AA, nur der automatisch pruefbare Teil). Je verletzter Regel eine Notice A11Y_<REGEL> (z.B. A11Y_IMAGE_ALT) als WARNING mit impact, nodes, targets, helpUrl -- nie ERROR, ok bleibt unberuehrt. A11Y_CLEAN = nichts gefunden, A11Y_SKIPPED = nicht gemessen. Kostet bis 3 s. Default false; wirkt nur mit laufendem Render-Check.
htmlstringneinKurzform fuer EINE Datei: das komplette HTML-Dokument, wird als index.html publiziert. Schliesst sich mit files und filesJson aus.

validateDiagram

Prueft Diagramm-JSON (oder mermaid/ascii/drawio) OHNE zu speichern: Schema, 4px-Grid, Komplexitaets-Budgets, Connector-Geometrie, Taste-Warnungen. Bei Erfolg kommt eine TTL-Preview (index.html + diagram.svg) mit previewToken, den publishDiagram als stagingToken annimmt, ohne neu zu rendern. renderSummary zaehlt die tatsaechlich gezeichneten Knoten, Kanten, Zonen und typ-spezifischen Elemente; kommt nichts heraus, schlaegt die Pruefung fehl (EMPTY_RENDER, TYPE_BLOCK_EMPTY). Connectors muessen NICHT von Hand geroutet werden: Andock-Seite, Verteilung und Ausweichen rechnet der Server; waypoints sind Steuerpunkte, edges[].props.fromSide/toSide erzwingt eine Seite. Typen, Feldnamen und Budgets: getCapabilities(topic='<typ>') bzw. getCapabilities(diagramType='<typ>').

ParameterTypPflichtBeschreibung
diagramJsonstringneinDiagramm-JSON: {type, meta:{title,subtitle,variant,direction,...}, nodes:[{id,x,y,w,h,label,sublabel,nodeType,props}], edges:[{id,from,to,label,style,waypoints,props}], zones:[{id,x,y,w,h,label,trustBoundary,nodes?:[nodeId,...]}] (Mitgliedschaft per node.zone ODER zones[].nodes; widersprechen sie sich, gilt node.zone), legend:[{symbol,text}], views:[{id,label,focus,note}]} plus typ-spezifische Bloecke als eigene Felder AUF OBERSTER EBENE, z.B. {"type":"sequence","lifelines":[...]} -- Schema und Beispiel je Typ ueber getCapabilities(topic='<typ>'), alle Typen: getCapabilities(topic='diagramTypes'). nodes[].x/y/w/h sind optional: fehlen sie bei einem graphfoermigen Typ (flowchart, architecture, data-flow, high-level, state, it-state, process, tree, org-chart, nested, dependency, mindmap (radiales Layout — genau ein Knoten braucht nodeType=focal als Zentrum)), rechnet der Server das Auto-Layout selbst — meta.direction (LR | TB, Default LR) steuert die Laufrichtung. meta.variant: minimal (Default) | dark | full-editorial | custom | quiet | kontrast | gematik | journal | signal | blueprint | terminal. Alle meta-Felder (variant, profile, colors, sketch, interactive, animation, pngScale, transparentBackground, repoBaseUrl), Viewer-Props (repoPath, wikiSlug, drillDown) und die LAYOUT_QUALITY-Felder: getCapabilities(topic='diagramMeta'). Architektur-Regeln (rules), Sichten (lenses) und Muster: getCapabilities(topic='architecture'). Optional, wenn stattdessen mermaid, ascii oder drawio gesetzt ist -- eines davon wird gebraucht.
reviewTtlSecondsintegerneinOptionale Review-TTL in Sekunden fuer einen langlebigen Preview-Link (max 604800 = 7 Tage). Ohne Angabe gilt die kurze Standard-TTL (15 min).
visualProofbooleanneintrue = die erzeugte Preview zusaetzlich in einem echten Browser nachzaehlen lassen (visualProof: sichtbare Formen, Elemente ohne Ausdehnung, Elemente ausserhalb der Zeichenflaeche). Default false, weil der Browser-Roundtrip rund 1,8 s kostet; beim publishDiagram laeuft die Pruefung ohnehin ohne Zutun.
inlinebooleanneinH1: true liefert das fertige, kollisionsfreie SVG direkt im Feld diagramSvg — zum Einbetten in einen Report ohne Umweg ueber getArtifactSource. Default false, weil ein SVG leicht 20 KB Kontext kostet.
mermaidstringneinMZP-110: Mermaid-Text statt diagramJson — dritte Eingabeform, schliesst sich mit diagramJson NICHT aus: gesetzt, wird diagramJson als OVERLAY behandelt (per id in die Mermaid-Knoten gemergt). Dialekte flowchart/graph, stateDiagram(-v2), erDiagram, classDiagram, sequenceDiagram; Syntax-Umfang, Overlay- und Id-Regeln: getCapabilities(topic='mermaid').
asciistringneinMZP-148: ASCII-Skizze (Kaesten, Pfeile, Zonen) statt diagramJson; diagramJson wirkt dann als Overlay, mermaid darf nicht zugleich gesetzt sein. Zeichenvorrat, Lage-Regel und Beispiel: getCapabilities(topic='ascii').
drawiostringneinK06: draw.io-Datei (mxfile oder mxGraphModel, auch komprimiert) statt diagramJson; diagramJson wirkt dann als Overlay, mermaid/ascii duerfen nicht zugleich gesetzt sein. Die Lage der Datei wird nicht gelesen, das Auto-Layout rechnet neu. Umfang und Meldungen: getCapabilities(topic='drawio').