MCP-Server
Aktiviere mcp, um bei jedem Build eine vollständige, unabgeschnittene site/mcp-index.json (sowie site/mcp-manifest.json und eine mcp-nav.json pro Baum) zu schreiben, damit bxSites Cloud deine veröffentlichte Website über einen öffentlichen, schreibgeschützten MCP-Server für KI-Agenten bereitstellen kann - unabhängig von search/searchProvider.
Auf dieser Seite
MCP-Server
Schalte mcp: true in bxsites.yaml ein, und jeder build schreibt drei
Dateien neben deinen gerenderten Seiten - eine vollständige,
maschinenlesbare Kopie des Inhalts, der Navigation und der Baumstruktur
deiner Website, die bxSites Cloud liest, um
einen öffentlichen, schreibgeschützten
MCP-Server für deine veröffentlichte
Website bereitzustellen - dieselbe Idee wie
GitBooks „MCP servers for published docs".
Nach der Veröffentlichung können KI-Agenten und -Assistenten (Claude,
ChatGPT und jeder andere MCP-fähige Client) den Inhalt deiner Website
direkt durchsuchen, browsen und abrufen, statt gerendertes HTML zu
scrapen:
site/mcp-index.json- ein vollständiger Eintrag pro Seite, pro Baumsite/mcp-nav.json- die eigene Navigationsstruktur dieses Baums, pro Baumsite/mcp-manifest.json- ein websiteweiter Index aller Bäume (Hauptseite, Versionen, Sprachen) und wo die eigenen Dateien jedes Baums von oben zu finden sind
BxSites selbst erzeugt ausschließlich die auf dieser Seite beschriebenen Dateien - sie tatsächlich als MCP-Server über das Netzwerk auszuliefern, ist Aufgabe von bxSites Cloud, nicht etwas, das dieses Modul selbst übernimmt.
Das Erzeugen von mcp-index.json selbst ist kostenlos und funktioniert
allein mit bxSites build, ganz ohne Cloud-Konto. Es tatsächlich als
laufenden MCP-Server für eine veröffentlichte Website bereitzustellen,
ist eine Funktion von bxSites Cloud, die nur in den kostenpflichtigen
Plänen enthalten ist - nicht im kostenlosen Plan. Aktuelle Details zu
den Plänen findest du unter
bxsites.io/cloud.
Aktivieren
mcp: true
{ "mcp": true }
mcp = true
false (Standard) überspringt den gesamten Schritt - es werden weder
mcp-index.json, mcp-nav.json noch mcp-manifest.json geschrieben,
und build verursacht über die reine Prüfung des Flags hinaus keine
zusätzlichen Kosten.
Unabhängig von search
mcp hat nichts mit search/searchProvider zu tun - die
beiden sind voneinander unabhängige Schalter:
mcp-index.jsonwird unabhängig davon erzeugt, obsearchtrueoderfalseist, und unabhängig vonsearchProvider.provider("local","algolia","pagefind"oder ein eigener).- Das Aktivieren von
mcpändert nie etwas an der eigenen, besucherseitigen Suchbox deiner Website, und das Deaktivieren vonsearchdeaktiviert niemalsmcp-index.json.
Deshalb kann mcp-index.json nicht einfach search-index.json
wiederverwenden: Diese Datei wird nur für den "local"-Such-Provider
gebaut (eine Algolia- oder Pagefind-gestützte Website erzeugt gar keine
search-index.json, da beide ihren eigenen Index anderswo führen), und
ihr body-Feld ist absichtlich abgeschnitten - search-index.json wird
an den Browser jedes Besuchers für die Suchbox auf der Seite
ausgeliefert, weshalb es wichtig ist, sie klein zu halten. Keine dieser
Einschränkungen gilt für mcp-index.json: Sie wird serverseitig von
bxSites Cloud abgerufen, nicht an Besucher ausgeliefert, und ein
abgeschnittener Textkörper riskiert, dass ein KI-Agent eine unvollständige
oder falsche Antwort gibt.
Das Format von mcp-index.json
Ein Eintrag pro nicht versteckter Seite (dieselbe Konvention „versteckte
Seiten werden ausgeschlossen", die auch search-index.json/die
Navigation verwenden), sowohl für reguläre Doku-Seiten als auch für
Blog-Beiträge:
[
{
"title": "Getting Started",
"url": "getting-started/index.html",
"tags": ["guides"],
"headings": ["Getting Started", "Installation", "Next steps"],
"body": "Getting Started Installation Run bxSites new to scaffold a project... Next steps ...",
"markdown": "# Getting Started\n\n## Installation\n\nRun `bxSites new` to scaffold a project...\n\n## Next steps\n\n...",
"type": "page",
"categories": [],
"updatedAt": "2026-08-18T10:15:00.000Z"
},
{
"title": "Announcing bxSites 2.0",
"url": "blog/announcing-bxsites-2/index.html",
"tags": ["release"],
"headings": ["Announcing bxSites 2.0"],
"body": "Announcing bxSites 2.0 Today we're shipping...",
"markdown": "# Announcing bxSites 2.0\n\nToday we're shipping...",
"type": "post",
"categories": ["Releases"],
"updatedAt": "2026-08-15"
}
]
| Feld | Beschreibung |
|---|---|
title | Der Titel der Seite (Frontmatter title, wie bei search-index.json) |
url | Der URL-Pfad der Seite, relativ zur Wurzel ihres eigenen Baums - nie wurzelabsolut und ohne den eigenen path des Baums (siehe Baumrelative URLs weiter unten) |
tags | Das Frontmatter-Array tags der Seite |
headings | Der reine Text jeder Überschrift h1-h6 auf der Seite, in Dokumentreihenfolge |
body | Der vollständige reine Textinhalt der Seite, HTML-Tags entfernt - nie abgeschnitten |
markdown | Derselbe Seiteninhalt, aus dem gerenderten HTML in Markdown umgewandelt, nie abgeschnitten (siehe Markdown-Inhalt weiter unten). Fehlt in einem Index, der von einer älteren bxSites-Version erzeugt wurde - dort auf body zurückfallen. |
type | "page" für eine reguläre Doku-Seite, "post" für einen Blog-Beitrag |
categories | Das eigene Frontmatter-Array categories eines Beitrags; bei einer Doku-Seite immer [] (Doku-Seiten haben keine Kategorien) |
updatedAt | Das eigene Frontmatter-date eines Beitrags; bei einer Doku-Seite deren eigenes Frontmatter-date, sofern gesetzt, sonst der Zeitpunkt der letzten Änderung ihrer Quelldatei als ISO-8601-Zeitpunkt. "", wenn keines von beidem verfügbar ist. |
Abgesehen von markdown, type, categories und updatedAt ist dies dieselbe
Eintragsform wie bei search-index.json, mit einem Unterschied: dort
wird body auf 400 Zeichen mit abschließender Ellipse gekürzt; hier ist
es die vollständige Seite.
Markdown-Inhalt
markdown ist der gerenderte Seiteninhalt, in Markdown umgewandelt, damit
ein KI-Agent Überschriften, Code, Listen und Tabellen lesen kann, ohne HTML
zu parsen. Die Umwandlung geht vom gerenderten HTML aus, nicht von der
Quelldatei (die Build-Direktiven und Variablen enthalten kann), und
entspricht daher dem, was Besucher sehen. body bleibt unverändert und ist
weiterhin der reine Text für die Suche.
Das liefert die Umwandlung:
- Überschriften als ATX (
# Titel,## Abschnitt), ohne die Anker-Links - Codeblöcke mit Zaun behalten ihre Sprache, wenn der gerenderte Code eine hat
(ein
boxlang-Zaun); ein Block ohne Sprache wird als eingerückter Codeblock ausgegeben - Listen, verschachtelte Listen, Tabellen und Inline-Formatierung
- Tab-Gruppen: Jedem Panel wird sein Tab-Name fett vorangestellt (
**YAML**) - Hinweisboxen: ein Zitatblock, dessen erste Zeile der Titel in Fettschrift ist
- Bilder als
; dekorative Bilder ohne Alt-Text werden weggelassen - Skripte, Stile, SVG-Sprites und Formularelemente werden entfernt
- Links und Bildquellen bleiben genau wie gerendert: websiteabsolute Pfade,
die bereits den
baseUrl-Pfad des Builds und das Präfix des Baums enthalten (zum Beispiel/versions/0.9/guides/setup/index.html)
markdown verdoppelt die Größe von mcp-index.json in etwa. Bei dieser
Dokumentations-Website wuchsen die 73 Seiten des Hauptbaums von etwa
460 KB auf etwa 1 MB.
Baumrelative URLs
mcp-index.json wird einmal pro Baum geschrieben, und die url jedes
Eintrags ist relativ zur Wurzel des eigenen Baums: kein führender Schrägstrich,
kein Baum-Präfix, kein baseUrl-Pfad. Der vollständige Pfad einer Seite ist
der path des Baums aus dem Manifest, verbunden mit ihrer url (nur die
url, wenn path "" ist):
Baum (Manifest-path) | Index-Datei | url des Eintrags | Seitendatei |
|---|---|---|---|
"" | mcp-index.json | guides/setup/index.html | guides/setup/index.html |
versions/0.9 | versions/0.9/mcp-index.json | guides/setup/index.html | versions/0.9/guides/setup/index.html |
es | es/mcp-index.json | guides/setup/index.html | es/guides/setup/index.html |
Dieselbe url kommt also in jedem Baum vor, der diese Seite hat. Alles, was
einen Eintrag mit einem websiteabsoluten Anfragepfad abgleicht, etwa ein
passwortgeschützter Teilbaum, muss zuerst den path des Baums voranstellen.
Das betrifft nur url: Die Links und Bildquellen innerhalb von markdown
sind bereits websiteabsolut.
Das Format von mcp-manifest.json
Einmal pro Website-Build geschrieben (nicht einmal pro Baum), listet
site/mcp-manifest.json jeden Baum auf, der eine eigene
mcp-index.json/mcp-nav.json erhalten hat, damit der MCP-Server von
bxSites Cloud versions- und sprachbewusste Tools anbieten kann, ohne die
eigenen Verzeichniskonventionen von bx-sites erraten zu müssen:
[
{ "path": "", "label": "1.0.x", "version": "1.0.x", "locale": "en", "default": true },
{ "path": "next", "label": "Next", "version": null, "locale": "en", "default": false },
{ "path": "versions/0.9", "label": "0.9", "version": "0.9", "locale": "en", "default": false },
{ "path": "es", "label": "Español", "version": "1.0.x", "locale": "es", "default": false }
]
| Feld | Beschreibung |
|---|---|
path | Der eigene, wurzelrelative Pfad dieses Baums - "" für den Hauptbaum an der Website-Wurzel, sonst "next"/"versions/<name>"/"<localeCode>"/"versions/<name>/<localeCode>". Verbinde ihn mit /mcp-index.json (oder /mcp-nav.json), um die eigene Datei dieses Baums zu erhalten, z. B. "versions/0.9/mcp-index.json" - und für die Wurzel selbst einfach "mcp-index.json" (dort ist path gleich ""). |
label | Eine menschenlesbare Bezeichnung für diesen Baum - die eigene Bezeichnung des Versionsschalters (der Name von versions.default, der eigene Name einer einfachen Version oder "Latest"/"Next"), kombiniert mit der eigenen Bezeichnung der Sprache für einen Sprach-Unterbaum |
version | Der Name aus docs/versions/<name>/, den dieser Baum rendert, oder null, wenn es sich um keine benannte Version handelt (der unversionierte Hauptbaum oder /next/) |
locale | Der eigene Sprachcode dieses Baums - i18n.defaultLocale.code für einen Baum ohne Sprach-Suffix, sonst der eigene Code dieser Sprache |
default | true für den einen Baum, der an der Website-Wurzel gerendert wird - denjenigen, auf dem ein Besucher/KI-Agent ohne Angabe von Version oder Sprache landet |
Das Format von mcp-nav.json
Neben der eigenen mcp-index.json jedes Baums geschrieben (Website-
Wurzel, /next/, jeder /versions/<name>/-Baum, jeder Sprach-Unterbaum)
ist mcp-nav.json die eigene Navigation dieses Baums - genau dieselbe
verschachtelte { title, url, order, icon, children }-Struktur, aus der
das Theme selbst die Seitenleiste rendert -, damit der MCP-Server von
bxSites Cloud ein get_nav/Inhaltsverzeichnis-Tool anbieten kann, ohne
eine zweite, eigene Navigationsform zu erfinden:
[
{
"title": "Getting Started",
"url": "getting-started/index.html",
"order": 1,
"icon": "phosphor-duotone:rocket-launch",
"children": []
},
{
"title": "Guides",
"url": "",
"order": 2,
"icon": "",
"children": [
{ "title": "Search", "url": "guides/search/index.html", "order": 1, "icon": "", "children": [] }
]
}
]
Ein Ordner-Gruppenknoten ohne eigene index.md (wie "Guides" oben)
hat eine leere url - er ist keine Seite, sondern nur eine Überschrift
für seine children.
Websites mit mehreren Versionen und Sprachen
Genau wie search-index.json werden mcp-index.json/mcp-nav.json
einmal pro gerendertem Baum geschrieben - die Hauptseite, /next/ (wenn
versions.default gesetzt ist), jeder /versions/<name>/-Baum und
jeder Sprach-Unterbaum -, sodass jeder veröffentlichte Baum sein eigenes
Dateipaar erhält, das nur die eigenen Seiten und die eigene Navigation
dieses Baums abdeckt. mcp-manifest.json hingegen wird einmal pro Build
geschrieben, nur an der Website-Wurzel, und listet jeden dieser Bäume auf.