Tools-Referenz
Neleto stellt 43 MCP-Tools in 8 Kategorien bereit. Jeder Tool-Aufruf erfordert einen Authorization: Bearer <token>-Header.
id-Felder für Dateien sind UUIDs (Strings), während IDs für Seiten, Layouts, Komponenten, Beiträge und Events Ganzzahlen sind.{ "items": [...], "total": n } — niemals ein reines Array auf oberster Ebene.page_update, layout_update und component_update überschreiben jedes Feld; jedes weggelassene Feld wird auf seinen leeren/Standardwert zurückgesetzt, nicht unverändert gelassen. Lade den Datensatz zuerst mit dem passenden *_get, wende deine Änderungen an und sende das vollständige Objekt zurück.data vs. Formular-defaultValue. In einem Komponenten-Template liest {{ properties.x }} das data[x] des Elements und rendert leer, wenn der Schlüssel fehlt — defaultValue ist nur ein Editor-Startwert und kein Fallback beim Rendern. Neue Elemente werden aus dem defaultValue jeder Property vorbefüllt, aber setze data explizit für alles, worauf du dich verlässt. Rendere Kind-Elemente mit {{ render_elements(children) }} — demselben Helper wie {{ render_elements(page.elements) }} und {{ render_elements(page.layout.elements) }}. Übersetzbare Felder (textarea / richtext / markdown) werden nur gespeichert, wenn page_create / page_update mit einem language-Code aufgerufen wird, und die Element-Reihenfolge ergibt sich aus der Array-Position (ein zurückgegebenes order von null ist bedeutungslos).tempId — auch bestehende. Bei page_update / layout_update muss jeder Eintrag des elements-Arrays eine tempId (String) enthalten, selbst Elemente, die bereits eine echte numerische id haben. Fehlt sie, wird die gesamte Anfrage mit missing field tempId abgelehnt. page_get / layout_get liefern jedes Element bereits mit gesetzter tempId (bestehende Elemente als "old-<id>") — diesen Wert unverändert übernehmen und zurücksenden. Das elements-Array hat Replace-Semantik: jedes bestehende Element, das du weglässt, wird stillschweigend gelöscht (ohne Warnung). Um ein Element zu behalten, sende es erneut; um eines zu löschen, entferne es aus elementsund trage seine numerische id in deletedElements ein.verbose: false verkleinern.page_create / page_update, layout_create / layout_update und component_create / component_update geben standardmäßig (verbose: true) den vollständigen gespeicherten Datensatz zurück — bei Seiten und Layouts inklusive der kompletten Komponentendefinition pro Element, was groß wird. Mit verbose: false erhältst du stattdessen nur das Nötigste: { id } bei Komponenten und { id, elements: [{ id, componentId, tempId, children }] } bei Seiten und Layouts — genug, um die echten IDs neu erzeugter Elemente zu erfahren, ohne den Datensatz-Echo. Sobald ein Aufbau funktioniert, ist das die bessere Wahl.sourceUrl anhängen — ohne separaten Upload-Schritt. In einem elements-Payload von page_* / layout_* erwartet eine relation-Property mit relationName: "file" normalerweise eine gespeicherte Datei-ID. Stattdessen kannst du in diesen data-Slot eine Ingest-Anweisung setzen: { "sourceUrl": "https://…" } (optionale Schlüssel: path, title, description, mimeType, status). Im selben Speichervorgang lädt und speichert der Server die Datei und setzt die resultierende ID ein — Upload und Verdrahtung fallen in einen Aufruf zusammen. Eine multiple-Dateirelation nimmt ein Array aus bestehenden IDs und solchen Objekten gemischt. Nur deklarierte Dateirelations-Slots werden so behandelt; jeder andere data-Wert wird unverändert gespeichert.Seiten
Tools zur Verwaltung von CMS-Seiten.
page_list
Alle verfügbaren Seiten im CMS auflisten.
page_get
Eine einzelne Seite mit Layout, Elementen und übersetztem Inhalt laden.
components-Array auf oberster Ebene gesammelt, und jedes Element behält seine componentId. Das component-Objekt pro Element und das components-Array sind nur lesender Kontext — page_update ignoriert sie, du musst sie also nicht zurücksenden.lean (Standard) dedupliziert Komponenten in das components-Array und behält je Komponente das form-Schema für die Bearbeitung, lässt aber die rein zum Rendern nötigen style/script/template weg. minimal lässt zusätzlich form weg (am kleinsten — Property-Schemas per component_get laden). full stellt das frühere Verhalten wieder her und bettet die vollständige Komponente in jedes Element ein (am größten — bei großen Seiten vermeiden).page_create
Eine neue Seite erstellen, inklusive Tags, Meta-Tags und Elementen.
/ beginnen (z.B. /ueber-uns).[] verwenden).page_update
Eine bestehende Seite aktualisieren. Gleiche Felder wie page_create, zusätzlich:
page_delete
Eine Seite soft-löschen.
page_duplicate
Eine Seite duplizieren mit neuem Pfad und Titel.
/ beginnen (z.B. /ueber-uns-kopie).Layouts
Layouts sind wiederverwendbare Templates, die mehreren Seiten zugewiesen werden können.
layout_list
Alle Seiten-Layouts auflisten.
layout_get
Ein einzelnes Layout mit Elementbaum laden.
layout_create
Ein wiederverwendbares Layout mit Template, Style, Script und fixen Elementen erstellen.
[] verwenden).tabler:<icon-name> — ein Icon aus dem Tabler-Set (Iconify-Collection-Präfix tabler), genau das, was der Icon-Picker im Admin speichert. Die gefüllte Variante hängt ein -filled an. Beispiele: tabler:layout-grid, tabler:layout-navbar, tabler:columns. Ein bloßes Wort ohne das tabler:-Präfix löst nicht auf.layout_update
Ein bestehendes Layout aktualisieren. Gleiche Felder wie layout_create, zusätzlich:
layout_delete
Ein Layout soft-löschen.
Komponenten
Komponenten sind wiederverwendbare Bausteine, die Redakteure auf Seiten einfügen können.
component_list
Alle wiederverwendbaren CMS-Komponenten auflisten. Liefert pro Komponente eine schlanke Zusammenfassung (id, label, category, icon, canHaveChildren) — genug, um eine Komponente zu finden und ihre id günstig aufzulösen. Die vollständige Definition (template/style/script/form) mit component_get laden.
false). false liefert schlanke Zusammenfassungen; true bettet je Komponente die vollständige Definition (template/style/script/form) ein — deutlich größer, nur bei Bedarf verwenden.component_get
Eine einzelne Komponente anhand der ID laden.
component_search
Komponenten nach Form-Label suchen. Liefert dieselbe schlanke Zusammenfassung wie component_list.
false). false liefert schlanke Zusammenfassungen; true bettet je Treffer die vollständige Definition ein.component_used_by_elements
Alle Element-Instanzen auflisten, die eine Komponente verwenden.
component_create
Eine neue Komponente erstellen.
tabler:<icon-name> — ein Icon aus dem Tabler-Set (Iconify-Collection-Präfix tabler), genau das, was der Icon-Picker im Admin speichert. Die gefüllte Variante eines Icons hängt ein -filled an den Namen. Beispiele: tabler:award-filled, tabler:message-circle-2, tabler:layout-grid. Ein bloßes Wort ohne das tabler:-Präfix löst nicht auf und rendert kein Icon. (Die Klassenform i-tabler-<icon-name> rendert ebenfalls, aber tabler:<icon-name> ist der kanonische Wert.)"" übergeben für eine Komponente ohne Skript.{{ properties.<key> }} rendern, Kind-Elemente mit {{ render_elements(children) }}.Bilder (Datei-Relationen). Ein Relationswert ist erst dann eine Datei, wenn du ihn bindest. Binde die Datei aus der Relation heraus und übergib die gebundene Datei zusammen mit einem erforderlichen Options-String an image_path. Ein Aufruf image_path(file) ohne Optionen oder das direkte Übergeben von relations.<id> ohne Binding ist ein harter Render-Fehler — kein leeres src:
{{#if relations.image as file}}
<img src="{{ image_path(file, "w_1600,f_webp") }}" alt="{{ file.title }}">
{{/if}}
Das liefert /image/user-upload/<file-id>?options=w_1600,f_webp aus. Optionen sind kommagetrennt und werden der Reihe nach angewendet — s_<N> (quadratisch), w_<N>, h_<N>, f_webp|jpeg|png|avif|gif, q_<N> (JPEG-Qualität), e_<t>_<l>_<w>_<h> (Zuschnitt), fit_contain|fit_cover|fit_fill|fit_inside|fit_outside — siehe Image-Scaling. Andere Relations-Helper folgen derselben Bind-zuerst-Regel: post_path(post), event_path(event) und file_path(file) für Downloads. Für eine multiple-Relation mit {{#each relations.<id> as file}} … {{/each}} iterieren.
f_ ist nur das Format — Fit nutzt fit_.f_ setzt das Ausgabeformat (f_webp, f_jpeg, …). Fit/Zuschnitt ist ein separatesfit_-Präfix (fit_cover, fit_contain, …). Es gibt kein f_cover/f_contain — schreibt man eines, wird es als Format interpretiert, schlägt bei der Validierung fehl und liefert einen harten HTTP 400 (kein Fallback auf das Original). fit_ funktioniert außerdem nur zusammen mit einer Größe und muss nach dem w_/h_/s_ in der Options-Zeichenkette stehen. Für einfaches Zuschneiden/Seitenverhältnis lieber CSS object-fit am <img> verwenden — das ist verlässlicher als die fit_-Option.Builder-Formular-Property (Repeater). Eine builder-Property ist ein Repeater: Der Editor verwaltet ein Array von Zeilen, die alle dieselben Felder haben. Die JSON-Struktur ist leicht falsch zu treffen. Das items-Array der Property-Definition enthält genau einen Eintrag — eine einzelne Zeilen-Vorlage — und die Felder pro Zeile liegen im props-Array dieses Eintrags (nicht als separate items-Einträge):
{
"id": "items",
"type": "builder",
"label": { "en": "Questions", "de": "Fragen" },
"description": null,
"hint": null,
"required": null,
"defaultValue": [
{ "id": "row1", "data": { "question": "...", "answer": "..." } },
{ "id": "row2", "data": { "question": "...", "answer": "..." } }
],
"items": [
{
"id": "question",
"type": "text",
"name": "question",
"label": { "en": "Item", "de": "Item" },
"icon": null,
"items": [],
"data": "",
"defaultValue": "",
"property": { "type": "text", "defaultValue": "" },
"props": [
{
"id": "question",
"type": "textarea",
"label": { "en": "Question", "de": "Frage" },
"defaultValue": null,
"description": null,
"hint": null,
"required": null
},
{
"id": "answer",
"type": "textarea",
"label": { "en": "Answer", "de": "Antwort" },
"defaultValue": null,
"description": null,
"hint": null,
"required": null
}
]
}
]
}
items= genau ein Zeilen-Vorlagen-Objekt. Die tatsächlichen Felder pro Zeile (question,answer, …) sind flache Property-Definitionen in dessenprops-Array.- Das Zeilen-Vorlagen-Objekt braucht weiterhin die Top-Level-Felder
id,name,data,defaultValue,items([]) und einproperty-Objekt ({ type, defaultValue }). Strikt vom Deserializer verlangt werdenlabel,name,data,props; der Rest spiegelt das, was der Admin-Builder-Konfigurationseditor erzeugt — mitschicken, damit die Definition sauber durch die UI läuft. - Setze
dataunddefaultValueder Zeilen-Vorlage auf""(leerer String). Keinen echten Platzhalter-String verwenden: Beim Speichern verteilt der Admin-Builder-Editor die Zeichen eines nicht-leeren Strings als überflüssige numerische Schlüssel ({"0":"H","1":"o",…}) in diedatajeder Zeile. Das bricht das Rendering nicht, beschädigt aber die gespeicherten Daten (bekannter Admin-UI-Bug);""vermeidet das. - Zeilenwerte — sowohl der Top-Level-
defaultValueder Property als auchdata[<propId>]jedes Elements — sind ein Array von{ id, data }-Objekten, nicht ein flaches{ fieldId: value }pro Zeile:[ { "id": "row1", "data": { "question": "…", "answer": "…" } } ]. - Im Template die Zeilenwerte über
item.data.<fieldId>lesen (nichtitem.<fieldId>):
{{#each properties.items as item}}
{{item.data.question}}
{{item.data.answer}}
{{/each}}
style-Block jeder Komponente wird in den <head> gehoben, aber die Reihenfolge, in der die Styles verschiedener Komponenten injiziert werden, folgt nicht zwingend der Seiten-/Element-Reihenfolge. Wenn zwei Komponenten dieselbe Eigenschaft auf einer gemeinsam genutzten Utility-Klasse setzen (z. B. ein geteiltes .wrap plus eine komponentenspezifische Klasse), kann die Kaskade unvorhersehbar auflösen. Komponentenspezifische Overrides mit einem spezifischeren Selektor einschränken (z. B. .meineKomponentenKlasse .wrap { … } statt nur .wrap { … }), damit sie unabhängig von der Injektionsreihenfolge gewinnen.component_update
Eine bestehende Komponente aktualisieren. Gleiche Felder wie component_create, zusätzlich:
component_delete
Eine Komponente und alle verknüpften Element-Instanzen löschen.
Blogbeiträge
post_list
Blogbeiträge auflisten.
post_get
Einen Blogbeitrag anhand der ID laden.
post_search
Blogbeiträge nach Titel, Beschreibung oder Inhalt suchen.
post_create
Einen Blogbeitrag erstellen.
"de" oder "en").{} sein).heroImageId).post_update
Einen Blogbeitrag aktualisieren. Gleiche Felder wie post_create, zusätzlich:
post_delete
Einen Blogbeitrag löschen.
Events
event_list
Events auflisten.
event_get
Ein Event anhand der ID laden.
event_search
Events nach Titel, Beschreibung oder Inhalt suchen.
event_today
Alle Events auflisten, die heute stattfinden.
Keine Parameter erforderlich.
event_upcoming
Bevorstehende Events auflisten.
Keine Parameter erforderlich.
event_create
Ein Event erstellen.
{} sein).heroImageId).event_update
Ein Event aktualisieren. Gleiche Felder wie event_create, zusätzlich:
event_delete
Ein Event löschen.
Dateien
Datei-IDs sind UUIDs (Strings), keine Ganzzahlen.
file_list
Dateien und Ordner auflisten oder eine einzelne Datei mit Inhalt laden. Datei-Datensätze enthalten eine serveUrl — eine absolute …/image/user-upload/<id>-URL, welche die gespeicherten Bytes ausliefert.
"/" für das Stammverzeichnis) oder eine bestimmte Datei per Pfad laden.["image/jpeg", "image/png"]).file_get
Eine Datei mit Tags anhand der ID laden. Der Datensatz enthält eine serveUrl — eine absolute …/image/user-upload/<id>-URL, welche die gespeicherten Bytes ausliefert.
file_search
Dateien nach Titel, Beschreibung, Pfad, Status oder MIME-Typ suchen.
true, werden Ordner aus den Ergebnissen ausgeschlossen.file_create
Eine Datei, einen Ordner oder einen Remote-Datei-Eintrag erstellen. Lokale Dateien werden leer auf dem Dateisystem angelegt.
/bilder/logo.png).file_upload
Eine Binärdatei oder ein Bild hochladen. Die Bytes werden auf eine von zwei Arten bereitgestellt: sourceUrl (eine http(s)-URL, die der Server selbst abruft) oder base64Data (Inline-base64). Genau eine ist erforderlich. Bei Erfolg enthält die Antwort die gespeicherte Byte-size sowie eine direkt nutzbare serveUrl (absolute …/image/user-upload/<id>-URL); diese URL akzeptiert zusätzlich Größenänderungen im Stil ?options=w_200,f_webp.
sourceUrl bevorzugen. Bei Angabe einer sourceUrl lädt der Server die Datei direkt herunter, sodass nichts Großes durch den Tool-Call läuft und kein Korruptionsrisiko besteht. Zeige damit auf eine bestehende serveUrl, eine generierte Bild-URL oder eine beliebige gehostete Datei. Inline-base64Data nur für kleine Payloads verwenden.base64Data wird inline als Tool-Call-Argument übertragen, und große Payloads können auf dem Weg zum Server beschädigt werden. Zeilenumbrochenes/mit Leerraum versehenes base64 wird akzeptiert (Leerraum wird vor dem Dekodieren entfernt), und bei einem Dekodierfehler gibt die Meldung an, ob das Payload abgeschnitten (Länge kein Vielfaches von 4) oder beschädigt aussieht. In beiden Fällen auf sourceUrl wechseln, statt dieselben Bytes erneut zu senden.base64Data bevorzugt; hat Vorrang, wenn beide gesetzt sind.data:image/…;base64,…-Data-URI). Nur erforderlich, wenn keine sourceUrl angegeben ist."image/png"). Fällt zurück auf den Content-Type der sourceUrl-Antwort, dann auf Erraten aus dem Pfad.file_upload_begin / file_upload_chunk / file_upload_commit
Chunked-Upload für den Fall, dass die Bytes inline gesendet werden müssen (keine sourceUrl) und für einen einzelnen file_upload-Aufruf zu groß sind. Die Datei wird in kleinen base64-Stücken gestreamt und per SHA-256-Prüfsumme verifiziert, sodass eine beschädigte Übertragung laut fehlschlägt, statt Müll zu speichern.
sourceUrl bei file_upload bevorzugen — ein einziger Aufruf ohne Korruptionsrisiko. Chunking nur als inline-sicheren Fallback verwenden.Ablauf:
file_upload_beginmit Ziel-path(+ optionalmimeType,status,title,description,metadata,tags,handleConflicts) → liefert{ uploadId, maxBytes }.file_upload_chunkwiederholt mit{ uploadId, data }—dataist base64 (roh oder umbrochen) für das nächste Stück, in Reihenfolge. Stücke klein halten (etwa wenige KB Rohbytes), damit das base64 kurz genug ist, um es fehlerfrei auszugeben. Optionalsha256(Kleinbuchstaben-Hex der Rohbytes dieses Stücks) mitgeben; bei Nichtübereinstimmung wird nur dieses Stück abgelehnt. Liefert{ receivedBytes }.file_upload_commitmit{ uploadId, sha256 }(Kleinbuchstaben-Hex der gesamten Datei, plus optionaltotalSize) → der Server setzt zusammen, verifiziert, speichert die Datei und liefert dieselbe{ size, serveUrl, … }-Antwort wiefile_upload.file_upload_abortmit{ uploadId }(optional) → verwirft einen unvollständigen Upload samt Temp-Datei, wenn er nicht abgeschlossen werden kann. Eine unbekannte oder bereits abgeschlosseneuploadIdist ein No-op.
Uploads, die eine Stunde lang inaktiv bleiben (kein Commit und kein neuer Chunk), werden automatisch entfernt; übrig gebliebene Temp-Dateien werden beim Neustart des Servers aufgeräumt. Chunks müssen vom selben Benutzer gesendet werden, der den Upload begonnen hat.
file_update
Datei-Metadaten oder den Inhalt einer lokalen Datei aktualisieren.
file_delete
Eine oder mehrere Dateien bzw. Ordner löschen.
file_move
Dateien in einen anderen Ordnerpfad verschieben oder kopieren.
"/bilder/archiv").true, werden die Dateien kopiert statt verschoben.file_rename
Eine Datei oder einen Ordner umbenennen (letztes Pfadsegment ändern).
Web-Dateien
Web-Dateien sind statische Textdateien, die im Root deiner Website bereitgestellt werden (z.B. /sitemap.xml, /llms.txt, /llms-full.txt). Jede Datei hat einen eindeutigen Pfad, einen rohen Textinhalt und einen MIME-Content-Type, der aus der Dateiendung abgeleitet wird.
web_file_list
Listet alle Web-Dateien auf.
Keine Parameter erforderlich.
web_file_get
Lädt eine einzelne Web-Datei anhand des Pfads.
"sitemap.xml").web_file_create
Erstellt eine neue Web-Datei, die unter /<path> erreichbar ist.
"sitemap.xml", "blog/llms.txt"). Schrägstriche sind erlaubt, um Dateien zu verschachteln. Muss eindeutig sein.web_file_update
Aktualisiert den Inhalt einer bestehenden Web-Datei anhand des Pfads.
web_file_delete
Löscht eine Web-Datei anhand des Pfads.
Einstellungen
settings_get
CMS-Einstellungen mit aufgelösten Seitenreferenzen und Meta-Tags laden. Die Antwort liefert außerdem die öffentlichen URLs der Live-Instanz, damit ein Agent die von ihm erstellte Website per Screenshot prüfen kann:
publicBaseUrl— der Host, unter dem die Website ausgeliefert wird (z.B.https://yannik.free.neleto.io).imageBaseUrl— das Präfix, unter dem hochgeladene Dateien ausgeliefert werden (z.B.…/image/user-upload).adminUrl— die Editor-URL.
settings_update
CMS-Einstellungen aktualisieren. Alle Felder sind optional - nur angegebene Felder werden geändert.
robots.txt.value (z.B. "de") und label (z.B. "Deutsch").