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.
| Parameter | Typ | Pflicht | Beschreibung |
|---|---|---|---|
key | string | ja | Ticket-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.
| Parameter | Typ | Pflicht | Beschreibung |
|---|---|---|---|
filterJson | string | nein | Filter 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.
| Parameter | Typ | Pflicht | Beschreibung |
|---|---|---|---|
opsJson | string | ja | Operationen 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.
| Parameter | Typ | Pflicht | Beschreibung |
|---|---|---|---|
codename | string | ja | Codename des eigenen Profils |
deletePage
Löscht eine veröffentlichte Seite aus der Datenbank. Die Seite ist danach nicht mehr erreichbar.
| Parameter | Typ | Pflicht | Beschreibung |
|---|---|---|---|
slug | string | ja | Slug 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).
| Parameter | Typ | Pflicht | Beschreibung |
|---|---|---|---|
slug | string | ja | URL-Slug des Diagramm-Bundles (beim Variantenvergleich: Entwurf A) |
fromVersion | integer | nein | Ausgangsversion (from). Versionsnummern liefert listVersions(slug). Pflicht ohne otherSlug. |
toVersion | integer | nein | Zielversion (to). from == to ist gueltig und liefert eine leere Quittung. Pflicht ohne otherSlug. |
otherSlug | string | nein | AW5: Slug eines zweiten Diagramms (Entwurf B) fuer den Variantenvergleich |
diffVersions
DEPRECATED -> listVersions. Dort versionA und versionB; funktioniert bis zur Messung unveraendert.
| Parameter | Typ | Pflicht | Beschreibung |
|---|---|---|---|
slug | string | ja | Slug der Seite |
versionA | integer | ja | Erste Versionsnummer aus listVersions |
versionB | integer | ja | Zweite 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).
| Parameter | Typ | Pflicht | Beschreibung |
|---|---|---|---|
ctx | object | nein | |
slug | string | ja | Slug der publizierten Figur, z.B. 'analog-coding-harness' |
scale | integer | nein | 1-4, Default 2 -- wie bei diagram.png. |
bg | string | nein | 'transparent' (Default) oder 'template' (Papier-Hintergrund --paper aus dem analog-v1-Designsystem). |
extractTemplate
DEPRECATED -> publishArtifact. Template-Welt entfaellt; funktioniert bis zur Messung unveraendert.
| Parameter | Typ | Pflicht | Beschreibung |
|---|---|---|---|
name | string | ja | Eindeutiger Template-Name |
category | string | ja | Konvention: 'design' markiert ein extrahiertes Design-Template |
description | string | nein | Optionale Beschreibung, z.B. woher/wann extrahiert |
htmlContent | string | ja | HTML 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.
| Parameter | Typ | Pflicht | Beschreibung |
|---|---|---|---|
query | string | ja | Suchbegriff 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).
| Parameter | Typ | Pflicht | Beschreibung |
|---|---|---|---|
slug | string | ja | Slug der Seite, z.B. 'kimi-claw-signature-template' |
path | string | nein | Optionaler relativer Pfad einer Begleitdatei, z.B. 'app.js'. Ohne Angabe: index.html/rawHtml. |
maxBytes | integer | nein | Optionale 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'.
| Parameter | Typ | Pflicht | Beschreibung |
|---|---|---|---|
include | string | nein | Umfang: 'default' (Landkarte, wie bisher) oder 'minimal' (nur Limits, Slug-Regeln, Encodings, gepinnte Libs). Ohne Angabe: 'default'. |
styles | string | nein | Optional: kommagetrennte Klassen-/Modulnamen oder Freitext, z.B. 'mz-card, mz-grid, particleField'. Liefert dieselben vollen Katalog-Eintraege unter 'styles' — spart den zweiten Aufruf. |
diagramType | string | nein | Optional: 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. |
topic | string | nein | Optional: 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.
| Parameter | Typ | Pflicht | Beschreibung |
|---|---|---|---|
capability | string | ja | Kommagetrennte Keywords, Diagramm-Typ oder Tool-Name, z.B. 'libs' |
getDesignMdFor
DEPRECATED -> searchBranding. Ein exakter Codename trifft dort immer; funktioniert unveraendert.
| Parameter | Typ | Pflicht | Beschreibung |
|---|---|---|---|
codename | string | ja | Exakter 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.
| Parameter | Typ | Pflicht | Beschreibung |
|---|---|---|---|
slug | string | nein | Slug eines publizierten Diagramms |
previewToken | string | nein | previewToken aus validateDiagram |
getPageContext
DEPRECATED -> getArtifactSource (liefert gerenderten Quelltext, nicht den Context-JSON). Dieses Tool liefert den Context-JSON unveraendert.
| Parameter | Typ | Pflicht | Beschreibung |
|---|---|---|---|
slug | string | ja | Slug 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.
| Parameter | Typ | Pflicht | Beschreibung |
|---|---|---|---|
slug | string | ja | Slug der Seite |
limit | integer | nein | Maximale 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.
| Parameter | Typ | Pflicht | Beschreibung |
|---|---|---|---|
templateName | string | ja | Template-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.
| Parameter | Typ | Pflicht | Beschreibung |
|---|---|---|---|
slug | string | ja | Slug 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).
| Parameter | Typ | Pflicht | Beschreibung |
|---|---|---|---|
status | string | nein | Optionaler Lifecycle-Filter: draft|current|superseded|archived |
kind | string | nein | Optionaler Gattungs-Filter: page|asset |
limit | integer | nein | Seiten je Block, Default 50, Maximum 200 |
cursor | string | nein | nextCursor aus der vorigen Antwort — blaettert weiter |
fields | string | nein | Optional: 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.
| Parameter | Typ | Pflicht | Beschreibung |
|---|---|---|---|
slug | string | ja | Slug der Seite |
versionA | integer | nein | Erste Versionsnummer fuer den Diff; nur zusammen mit versionB |
versionB | integer | nein | Zweite Versionsnummer fuer den Diff; nur zusammen mit versionA |
lookupStyles
DEPRECATED -> getCapabilities. Dort styles='<namen>'; funktioniert bis zur Messung unveraendert.
| Parameter | Typ | Pflicht | Beschreibung |
|---|---|---|---|
query | string | ja | Kommagetrennte 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').
| Parameter | Typ | Pflicht | Beschreibung |
|---|---|---|---|
ctx | object | nein | |
slug | string | ja | URL-Slug (Kleinbuchstaben, Ziffern, Bindestriche), z.B. 'three-demo' |
files | array | nein | EMPFOHLEN: 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. |
stagingToken | string | nein | Alternative zu files: der previewToken aus validateArtifact. Publiziert das dort gepruefte Bundle, ohne es erneut zu uebertragen. Laeuft mit der Preview ab (Default 15 min). |
filesJson | string | nein | Alt-Weg (Bestandsagenten): dasselbe Array als JSON-String, z.B. [{"path":"index.html","content":"<!doctype html>..."}]. Neu geschriebene Agenten nehmen stattdessen 'files'. |
metadataJson | string | nein | Optionales 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. |
overwrite | boolean | nein | true = bestehenden Slug ersetzen (alter Stand wird als Version gesichert). Default false. |
verbosity | string | nein | 'full' (Default) oder 'compact'. compact laesst Datei-Liste, warnings, libReferences und INFO-Hinweise weg — alles, was der Agent selbst geschickt hat oder nicht braucht. |
renderCheck | boolean | nein | true (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. |
mode | string | nein | H4: '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. |
deletePathsJson | string | nein | H4: JSON-Array von Pfaden, die aus dem publizierten Stand entfernt werden, z.B. ["alt.js"]. Nur bei mode='patch'. |
liveData | array | nein | E11 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. |
a11y | boolean | nein | E9: 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. |
html | string | nein | Kurzform 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').
| Parameter | Typ | Pflicht | Beschreibung |
|---|---|---|---|
slug | string | ja | URL-Slug, konventionell 'asset-{name}', z.B. 'asset-epic-dragon' |
filename | string | ja | Dateiname mit Endung, z.B. 'epic-dragon.svg'. Bestimmt Format und Content-Type; gespeichert wird die Datei als 'asset.{endung}'. |
content | string | nein | Der Inhalt als UTF-8-Text (z.B. das komplette <svg>...</svg>). Fuer Binaerformate stattdessen contentBase64 nutzen. |
contentBase64 | string | nein | Der Inhalt base64-kodiert — fuer PNG/JPG/WebP oder grosse Dateien. Genau eines von content oder contentBase64 setzen. |
metadataJson | string | nein | Optionales 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. |
overwrite | boolean | nein | true = 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.
| Parameter | Typ | Pflicht | Beschreibung |
|---|---|---|---|
slug | string | ja | URL-Slug (Kleinbuchstaben, Ziffern, Bindestriche) |
diagramJson | string | nein | Diagramm-JSON, wie bei validateDiagram |
stagingToken | string | nein | stagingToken aus validateDiagram — schliesst sich mit diagramJson aus |
metadataJson | string | nein | Metadaten-JSON {title?, description?, tags?}. Ohne title wird der <title> der gerenderten index.html genutzt (= meta.title des Diagramms). |
overwrite | boolean | nein | true = bestehenden Slug ersetzen (bisheriger Stand bleibt als Version erhalten). Default false. |
renderCheck | boolean | nein | true (Default) = die publizierte Seite zusaetzlich in einem echten Browser laden und Konsolenfehler zurueckmelden. |
inline | boolean | nein | H1: 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. |
mermaid | string | nein | MZP-110: Mermaid-Text statt diagramJson, dieselbe dritte Eingabeform wie bei validateDiagram (diagramJson wirkt dann als Overlay). Schliesst sich wie diagramJson mit stagingToken aus. |
ascii | string | nein | MZP-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'). |
drawio | string | nein | K06: 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).
| Parameter | Typ | Pflicht | Beschreibung |
|---|---|---|---|
templateName | string | ja | Template-Name (exakt) |
slug | string | ja | URL-Slug (Kleinbuchstaben, Ziffern, Bindestriche), z.B. 'meine-seite' |
contextJson | string | ja | JSON-Kontext mit Template-Variablen, z.B. {"title":"Hallo"} |
importImages | boolean | nein | true = 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'.
| Parameter | Typ | Pflicht | Beschreibung |
|---|---|---|---|
titel | string | ja | Titel des Quiz; daraus wird der Slug quiz-<titel> abgeleitet |
fragen | array | ja | Die 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.
| Parameter | Typ | Pflicht | Beschreibung |
|---|---|---|---|
slug | string | ja | URL-Slug (Kleinbuchstaben, Ziffern, Bindestriche), z.B. 'pascal' |
title | string | nein | Optionaler Titel (fuer Listing-UI), leer erlaubt |
rawHtml | string | ja | Komplettes 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.
| Parameter | Typ | Pflicht | Beschreibung |
|---|---|---|---|
slug | string | ja | URL-Slug (Kleinbuchstaben, Ziffern, Bindestriche), z.B. 'dialog' |
encoding | string | ja | Kompressions-Encoding: 'br' (Brotli, empfohlen) oder 'gzip' |
rawHtmlCompressedBase64 | string | ja | Komprimiertes HTML: rawHtml -> Brotli/Gzip -> Base64 |
title | string | nein | Optionaler 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.
| Parameter | Typ | Pflicht | Beschreibung |
|---|---|---|---|
slug | string | ja | URL-Slug des Diagramm-Bundles |
nodeId | string | ja | Id des Startknotens |
direction | string | ja | in | out | paths |
to | string | nein | Zielknoten, Pflicht bei direction=paths |
depth | integer | nein | Hoechstzahl der Hops bei in/out; weggelassen = transitiv |
version | integer | nein | Version; weggelassen = die aktuelle |
renderPreview
DEPRECATED -> publishArtifact. Template-Welt entfaellt; funktioniert bis zur Messung unveraendert.
| Parameter | Typ | Pflicht | Beschreibung |
|---|---|---|---|
templateName | string | ja | Exakter Template-Name |
contextJson | string | ja | JSON-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.
| Parameter | Typ | Pflicht | Beschreibung |
|---|---|---|---|
token | string | ja | Der 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).
| Parameter | Typ | Pflicht | Beschreibung |
|---|---|---|---|
slug | string | ja | Slug der Seite |
version | integer | ja | Wiederherzustellende 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"}}
| Parameter | Typ | Pflicht | Beschreibung |
|---|---|---|---|
profileJson | string | ja | Profil 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.
| Parameter | Typ | Pflicht | Beschreibung |
|---|---|---|---|
query | string | ja | Codename (exakt) oder Freitext-Charakterbeschreibung |
searchPages
DEPRECATED -> fullTextSearch (auch Seitentext, max. 100 Treffer). Slug-Kataloge: listPublishedPages(kind='asset'|'page'), Praefix selbst filtern.
| Parameter | Typ | Pflicht | Beschreibung |
|---|---|---|---|
fragment | string | ja | Suchfragment fuer den Slug |
fields | string | nein | Optional: 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.
| Parameter | Typ | Pflicht | Beschreibung |
|---|---|---|---|
slug | string | ja | Slug der Seite, die einen neuen Lebenszyklus-Status bekommt |
status | string | nein | draft|current|superseded|archived — optional, wenn supersededBy gesetzt wird |
supersededBy | string | nein | Slug des Nachfolgers. Gesetzt => status wird implizit 'superseded'. |
reason | string | nein | Freitext-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').
| Parameter | Typ | Pflicht | Beschreibung |
|---|---|---|---|
files | array | nein | EMPFOHLEN: die Bundle-Dateien als echtes Array (wie bei publishArtifact) |
filesJson | string | nein | Alt-Weg (Bestandsagenten): dasselbe Array als JSON-String |
reviewTtlSeconds | integer | nein | R13: 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). |
renderCheck | boolean | nein | MZP-49: false laesst den Browser-Blick auf die Preview weg. Ohne Angabe laeuft er. |
renderStrict | boolean | nein | E1: 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. |
liveData | array | nein | E11: wie bei publishArtifact, z.B. ["stats"] -- die Preview liefert dann /preview/{token}/_data.json, und ein stagingToken-Publish uebernimmt die Deklaration. |
a11y | boolean | nein | E9: 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. |
html | string | nein | Kurzform 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>').
| Parameter | Typ | Pflicht | Beschreibung |
|---|---|---|---|
diagramJson | string | nein | Diagramm-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. |
reviewTtlSeconds | integer | nein | Optionale Review-TTL in Sekunden fuer einen langlebigen Preview-Link (max 604800 = 7 Tage). Ohne Angabe gilt die kurze Standard-TTL (15 min). |
visualProof | boolean | nein | true = 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. |
inline | boolean | nein | H1: 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. |
mermaid | string | nein | MZP-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'). |
ascii | string | nein | MZP-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'). |
drawio | string | nein | K06: 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'). |