Tools-Referenz
Neleto stellt 40 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.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.
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.
Keine Parameter erforderlich.
component_get
Eine einzelne Komponente anhand der ID laden.
component_search
Komponenten nach Form-Label suchen.
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 als base64-kodierten Inhalt hochladen. base64Data akzeptiert sowohl reines base64 als auch eine Data-URI (data:image/jpeg;base64,…). 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.
Invalid base64Data: Invalid padding oder Invalid symbol at offset N fehl (der angegebene Offset ist nicht verlässlich, um das Problem zu lokalisieren). Etwa unter ~10 KB Rohbytes ist sicher; Payloads im Bereich ~15–48 KB+ werden sporadisch beschädigt. Für alles Größere die Originaldatei über den Admin-Medienmanager (oder einen direkten HTTP-Upload) hochladen und die entstandene Datei per id/Pfad referenzieren, statt sie inline zu übertragen. Ein identisches beschädigtes Payload erneut zu senden schlägt meist gleich fehl — bei Bedarf aus der Quelle neu kodieren."image/png"). Wird automatisch erkannt wenn nicht angegeben.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").