--- mpf: '0.7' title: Implementierung — ESFI Docs url: https://docs.esfi.eu/de/standards/mpf/implementation/ mpf-url: https://docs.esfi.eu/de/standards/mpf/implementation/index.mpf organization: European Strategy & Future Infrastructure domain: docs.esfi.eu lang: de updated: '2026-11-03' author: ESFI provenance: human source-hash: 7e54c6a7be41c3b34c5ac863896d97598b932ba40d3f386980b7a88a774b3e1b toc: - level: 1 text: Implementierung id: implementierung - level: 2 text: Anforderungen id: anforderungen - level: 2 text: 1\. Referenzimplementierung beziehen id: 1-referenzimplementierung-beziehen - level: 2 text: '2\. Den Publisher deklarieren: mpf.config.json' id: 2-den-publisher-deklarieren-mpf-config-json - level: 3 text: Erforderliche Keys id: erforderliche-keys - level: 3 text: Optionale Keys id: optionale-keys - level: 2 text: 3\. Pro Seite überschreiben id: 3-pro-seite-überschreiben - level: 2 text: 4\. Bestimmen, was in den Body kommt id: 4-bestimmen-was-in-den-body-kommt - level: 3 text: Inhaltsbereich id: inhaltsbereich - level: 3 text: Marker auf der Seite id: marker-auf-der-seite - level: 2 text: 5\. Den Build zuletzt ausführen id: 5-den-build-zuletzt-ausführen - level: 3 text: Kommandozeilenoptionen id: kommandozeilenoptionen - level: 3 text: Was der Build schreibt id: was-der-build-schreibt - level: 3 text: Reihenfolge und Drift id: reihenfolge-und-drift - level: 2 text: 6\. Signieren (optional) id: 6-signieren-optional - level: 2 text: 7\. Discovery veröffentlichen id: 7-discovery-veröffentlichen - level: 2 text: 8\. Verifizieren id: 8-verifizieren - level: 2 text: Fehlerbehebung id: fehlerbehebung - level: 2 text: Auf dieser Seite id: auf-dieser-seite spec-origin: esfi.eu content-origin: docs.esfi.eu content-id: esfi:page:standards-mpf-implementation content-parity: html: true human-visible-source: true hidden-sections: false summary: Von einer bestehenden statischen Site zu veröffentlichtem MPF in einem Build-Schritt. index: true confidence: confirmed content-type: reference companion-footer: ESFI — civilization infrastructure · https://esfi.eu companion-contact: mailto:hermes@esfi.eu preferred-representation: mpf companion-scope: cite: true summarize: true train: true index: true relay: false language-variants: en: https://docs.esfi.eu/standards/mpf/implementation/index.mpf fr: https://docs.esfi.eu/fr/standards/mpf/implementation/index.mpf nl: https://docs.esfi.eu/nl/standards/mpf/implementation/index.mpf de: https://docs.esfi.eu/de/standards/mpf/implementation/index.mpf hr: https://docs.esfi.eu/hr/standards/mpf/implementation/index.mpf mpf-id: 4d3f5a2e1d17ea9770c081906d60c1b919995492b3b43a58b4d8a2c0256c5fd7 --- Sprache ✕ /de/standards/mpf/implementation/index.mpf[Datei öffnen ↗](/de/standards/mpf/implementation/index.mpf)[Spezifikation ↗](/de/standards/mpf/0.7)✕ wird geladen… # Implementierung {#implementierung} **Von einer bestehenden statischen Site zu veröffentlichtem MPF in einem Build-Schritt.** MPF wird erzeugt, nicht von Hand geschrieben. Die Referenzimplementierung `mpf-build` liest das fertige HTML einer Site und schreibt neben jede Seite einen `.mpf`\-Companion sowie die Maschinenindizes der Site. In Produktion ändert sich nichts: Der Server liefert weiterhin statische Dateien aus. Diese Seite ist der Implementierungsleitfaden. Felddefinitionen stehen in [Spezifikation 0.7](/de/standards/mpf/0.7); Discovery wird unter [Veröffentlichung und Discovery](/de/standards/mpf/publishing-and-discovery) behandelt. Jede Regel unten ist als **Spezifikation 0.7**, **Referenzimplementierung** oder **ESFI-Praxis** gekennzeichnet; die Marker werden im [Überblick](/de/standards/mpf) erklärt. ## Anforderungen {#anforderungen} - Eine Site, die statische HTML-Dateien erzeugt (beliebiger Generator oder handgeschriebenes HTML). - Node.js 18 oder neuer, um `mpf-build` auszuführen. **Referenzimplementierung** - Schreibzugriff auf das Ausgabeverzeichnis und auf DNS, wenn Sie die optionale DNS-Deklaration veröffentlichen. ## 1\. Referenzimplementierung beziehen {#1-referenzimplementierung-beziehen} `mpf-build` wird als Quellcode unter [git.esfi.eu/esfi/mpf](https://git.esfi.eu/esfi/mpf) veröffentlicht. Es wird derzeit nicht über das npm-Registry verteilt. ``` git clone https://git.esfi.eu/esfi/mpf.git cd mpf/mpf-build npm install ``` Direkt ausführen: ``` node ./bin/mpf-build.js --config ``` oder mit `npm link` aus demselben Verzeichnis den Befehl `mpf-build` auf Ihrer Maschine verfügbar machen. ## 2\. Den Publisher deklarieren: mpf.config.json {#2-den-publisher-deklarieren-mpf-config-json} Die Konfigurationsdatei legt fest, wer der Publisher ist, welche Sprachen die Site verwendet und welche Standarddeklarationen jede Seite trägt. Sie liegt üblicherweise im Projekt-Root. ``` { "mpf": "0.7", "organization": "Example Publisher", "domain": "example.org", "base-url": "https://example.org/", "spec-url": "https://docs.esfi.eu/spec/mpf/0.7", "author": "Example Publisher", "default-lang": "en", "languages": ["en"], "content-id-prefix": "example", "content-selector": "main", "description": "One line describing this publication.", "defaults": { "provenance": "human", "index": true, "companion-scope": { "cite": true, "summarize": true, "train": false, "index": true, "relay": false }, "companion-contact": "mailto:web@example.org", "companion-footer": "Example Publisher — https://example.org" } } ``` ### Erforderliche Keys {#erforderliche-keys} Der Builder bricht mit einem Fehler ab, wenn einer davon fehlt oder ungültig ist. **Referenzimplementierung** | Key | Regel | | --- | --- | | `mpf` | Versionsstring, der in jeder Datei ausgegeben wird | | `organization`, `domain`, `author` | Nicht leere Strings | | `base-url` | Basis-URL der Site; abschließende Slashes werden normalisiert | | `default-lang` | Muss einer der Werte in `languages` sein | | `languages` | Nicht leeres Array von Sprachcodes | | `content-id-prefix` | Namespace für erzeugte `content-id`\-Werte; bewusst getrennt von `organization`, damit Identifikatoren eine Namensänderung überleben | | `defaults.provenance` | `human`, `ai-assisted` oder `ai-generated` | | `defaults.index` | Boolean | ### Optionale Keys {#optionale-keys} | Key | Wirkung | Status | | --- | --- | --- | | `spec-url` | Kanonische Spezifikations-URL, als `MPF-spec` in `llms.txt` ausgegeben | **Spezifikation 0.7** | | `description` | Einzeilige Beschreibung in `llms.txt` und `llms.mpf` | **Spezifikation 0.7** | | `content-selector` | CSS-Selektor für den Inhaltsbereich | **Spezifikation 0.7** | | `spec-origin`, `content-origin` | Origin-Deklarationen im Frontmatter; standardmäßig `domain` | **Spezifikation 0.7** | | `signing-key` | Pfad zu einem Private Key; aktiviert Signaturen (siehe Schritt 6) | **Spezifikation 0.7** (Verhalten), **Referenzimplementierung** (Key Handling) | | `defaults.confidence` | `confirmed`, `probable`, `speculative` oder `contested` | **Referenzimplementierung** (zulässige Werte) | | `defaults.content-type` | `specification`, `narrative`, `data`, `analysis`, `reference`, `legal` oder `profile` | **Referenzimplementierung** (zulässige Werte) | | `defaults.companion-scope` | Booleans für `cite`, `summarize`, `train`, `index`, `relay` | **Spezifikation 0.7** (Feld), **Referenzimplementierung** (Validierung) | | `defaults.content-parity` | Standard-Paritätsdeklaration | **Spezifikation 0.7** | | `defaults.companion-instruction` | Publisher-Nachricht an den Maschinenleser; wird auch als Blockquote vor den Body gesetzt | **Spezifikation 0.7** | | `defaults.companion-footer` | Einzeilige Publisher-Signatur am Ende des Bodys; darf keine Zeilenumbrüche oder HTML enthalten | **Spezifikation 0.7** | | `defaults.companion-contact` | Kontakt für Maschinenleser, z. B. `mailto:` | **Spezifikation 0.7** | | `defaults.c2pa-manifest` | Zeiger auf ein C2PA-Manifest | **Spezifikation 0.7** | | `defaults.preferred-representation` | `mpf` oder `html` | **Referenzimplementierung** (zulässige Werte) | Jede Deklaration ist eine Publisher-Entscheidung. Behandeln Sie die Defaults als Aussage, für die Ihre Organisation einsteht, nicht als technische Einstellungen. `companion-scope` zeichnet nur Processing Intent auf. MPF trägt keine Lizenzbedingungen, Preise oder Vergütungsbedingungen; diese gehören in Lizenzierungsmechanismen außerhalb des Formats. ## 3\. Pro Seite überschreiben {#3-pro-seite-überschreiben} Jede Seite kann Site-Defaults mit einem JSON-Sidecar neben ihrer HTML-Datei überschreiben: `index.html` → `index.mpf.json`, `guide/page.html` → `guide/page.mpf.json`. **Spezifikation 0.7** (Existenz), **Referenzimplementierung** (zulässige Felder) ``` { "confidence": "speculative", "content-type": "analysis", "review-after": "2027-03-01", "companion-instruction": "This page contains projections. Treat figures as estimates." } ``` Zulässige Override-Felder: `title`, `author`, `summary`, `section`, `parent`, `lang`, `provenance`, `c2pa-manifest`, `confidence`, `content-type`, `valid-until`, `review-after`, `index`, `related`, `companion-instruction`, `companion-footer`, `companion-scope`, `companion-contact`, `preferred-representation`, `supersedes`, `superseded-by`, `language-variants`, `content-id`, `content-parity`, `signature`. Ein unbekanntes Feld stoppt den Build. `related` ist ein Array von `{ "url", "relation" }`, wobei `relation` einer der Werte `prerequisite`, `extends`, `source`, `contradicts`, `alternative`, `supersedes`, `details` ist. **Referenzimplementierung** ## 4\. Bestimmen, was in den Body kommt {#4-bestimmen-was-in-den-body-kommt} ### Inhaltsbereich {#inhaltsbereich} Der Builder nimmt das Element, das `content-selector` entspricht. Wenn nichts passt oder der Treffer leer ist, fällt er der Reihe nach auf `main`, `article`, `[role="main"]`, `.content` und `body` zurück. Innerhalb des ausgewählten Bereichs entfernt er Navigation, Header, Footer, Scripts, Styles und Elemente mit `aria-hidden="true"`. Eine Seite ohne brauchbaren Inhaltsbereich wird übersprungen und gemeldet. **Spezifikation 0.7** (Inhaltsauswahl), **Referenzimplementierung** (Fallback-Reihenfolge und Noise-Liste) ### Marker auf der Seite {#marker-auf-der-seite} Vier HTML-Attribute erlauben einem Publisher, den Maschinen-Body zu steuern, ohne zu ändern, was Menschen sehen. **Referenzimplementierung** | Attribut | Wirkung | | --- | --- | | `data-mpf-only` | Inhalt erscheint nur im MPF-Body und wird ihm vorangestellt. Sein Vorhandensein setzt `content-parity` auf `html: false`, `human-visible-source: false`, `hidden-sections: true`. | | `data-mpf-hide` | Inhalt wird aus dem MPF-Body ausgeschlossen. | | `data-mpf-text="…"` | Das Element wird im MPF-Body durch den angegebenen Text ersetzt; nützlich für verschleierte Kontaktadressen. | | `data-mpf-alt="…"` | Bilder, Medien und Embeds werden durch den angegebenen Text ersetzt. Embeds ohne dieses Attribut werden aus dem MPF-Body entfernt. | `data-mpf-only` sollte sparsam verwendet werden. Maschinenexklusiver Inhalt ist genau das, wofür die Paritätsdeklaration existiert; der Builder deklariert ihn automatisch, damit er nicht verborgen Autorität gewinnen kann. ## 5\. Den Build zuletzt ausführen {#5-den-build-zuletzt-ausführen} Führen Sie `mpf-build` nach dem finalen HTML über das fertige Ausgabeverzeichnis aus: ``` "scripts": { "build": "astro build", "postbuild": "mpf-build dist --config mpf.config.json" } ``` Geben Sie `--config` explizit an, wenn Sie ein erzeugtes Verzeichnis wie `dist/` verarbeiten, damit der Builder die Konfiguration nicht darin sucht. **Referenzimplementierung** ### Kommandozeilenoptionen {#kommandozeilenoptionen} **Spezifikation 0.7** | Option | Wirkung | | --- | --- | | `--config ` | Konfigurationsdatei; standardmäßig `/mpf.config.json` | | `--out ` | Ausgabe in ein anderes Verzeichnis; standardmäßig in place | | `--dry-run` | Meldet, was geschrieben würde, schreibt aber nichts | | `--verbose` | Protokolliert jede verarbeitete Seite mit Titel, URL und TOC-Anzahl | | `--watch` | Baut bei Änderungen an HTML, Seiten-Overrides oder Konfiguration neu | ### Was der Build schreibt {#was-der-build-schreibt} | Artefakt | Ort | Status | | --- | --- | --- | | Seiten-Companion | Neben jeder Seite, `.html` → `.mpf` | **Spezifikation 0.7** | | `llms.mpf` | Site-Root; MPF-Index von Seiten mit `index: true` | **Spezifikation 0.7** | | `llms.txt` | Site-Root; MPF-Abschnitt erzeugt oder ersetzt, anderer Inhalt bleibt | **Spezifikation 0.7** | | `llms-full.txt` | Site-Root; Bodies indexierter Seiten in der Standardsprache | **Spezifikation 0.7** | | `.sig`\-Dateien | Neben jeder `.mpf`, wenn Signing konfiguriert ist | **Spezifikation 0.7** | Kanonische URLs und `source-hash`\-Werte werden immer aus Quell-HTML und quellrelativem Pfad abgeleitet, nie aus dem Ausgabepfad. **Referenzimplementierung** ### Reihenfolge und Drift {#reihenfolge-und-drift} Jeder Companion bindet seine Quelle mit `source-hash`. Wenn HTML neu erzeugt wird, ohne `mpf-build` erneut auszuführen, oder umgekehrt, driften beide auseinander. Ein veralteter Companion ist schlimmer als ein fehlender, weil er maßgeblich aussieht. Halten Sie MPF-Generierung als letzten Build-Schritt und deployen Sie beide Repräsentationen gemeinsam. ## 6\. Signieren (optional) {#6-signieren-optional} Wenn `signing-key` auf eine Private-Key-Datei zeigt, signiert der Builder jeden Seiten-Companion und `llms.mpf`, schreibt die Signatur Base64-codiert in eine `.sig`\-Datei daneben und ergänzt eine `signature`\-URL im Frontmatter. Fehlt die Key-Datei, läuft der Build ohne Signaturen weiter und gibt eine Warnung aus. **Spezifikation 0.7** (Signaturfeld und Artefakt), **Referenzimplementierung** (Encoding und Key Handling) Die Signatur deckt die vollständige MPF-Datei ab, wie sie geschrieben wurde. Veröffentlichen Sie den zugehörigen Public Key dort, wo Leser ihn finden können, und geben Sie den verwendeten Algorithmus an. Der Key gehört nie ins Repository oder Ausgabeverzeichnis. ## 7\. Discovery veröffentlichen {#7-discovery-veröffentlichen} Der Build erzeugt `llms.txt` und `llms.mpf`. ESFI-Sites veröffentlichen außerdem einen DNS-TXT-Eintrag, eine `/.well-known/mpf`\-Deklaration und optional einen Alternate Link auf Seitenebene. Das ist **ESFI-Praxis**; die Einrichtung steht unter [Veröffentlichung und Discovery](/de/standards/mpf/publishing-and-discovery). ## 8\. Verifizieren {#8-verifizieren} Prüfen Sie, was Sie veröffentlicht haben, nicht was Sie konfiguriert haben: ``` curl -s https://example.org/index.mpf | head -30 # Companion existiert und lässt sich parsen curl -s https://example.org/llms.mpf | head -30 # Index existiert und listet Seiten curl -s https://example.org/llms.txt # MPF-Abschnitt, MPF-spec, MPF-index curl -s https://example.org/.well-known/mpf # ESFI-Praxis dig +short TXT _mpf.example.org # ESFI-Praxis ``` Prüfen Sie danach die Beziehung zwischen beiden Repräsentationen: 1. **Drift.** Berechnen Sie SHA-256 des ausgelieferten HTML und vergleichen Sie ihn mit `source-hash`. Ein Unterschied bedeutet, dass das Paar nicht synchron ist, sofern der Server HTML nicht unterwegs verändert. 2. **Identität.** `url` muss die kanonische menschliche Seite sein; `mpf-url` muss die Adresse sein, die Sie abgerufen haben. 3. **Sprachen.** Bestätigen Sie für jeden Eintrag in `language-variants`, dass die Datei existiert. Der Builder erzeugt diese Adressen aus der Konfiguration und prüft sie nicht. 4. **Parität.** Wenn `hidden-sections` `true` ist, lesen Sie den maschinenexklusiven Inhalt und prüfen Sie, dass er beabsichtigt ist. 5. **Scope.** Bestätigen Sie, dass `companion-scope` in den Dateien, `/.well-known/mpf` und im DNS-Eintrag dieselben Werte nennt. Sobald Ihre Ausgabe inspiziert werden kann und einer veröffentlichten Version entspricht, kann sie im [Implementierungsregister](/de/standards/mpf/implementation-registry) aufgenommen werden. ## Fehlerbehebung {#fehlerbehebung} | Symptom | Wahrscheinliche Ursache | Lösung | | --- | --- | --- | | `skipped: … (no content root)` | Selektor trifft nichts und die Fallbacks sind leer | `content-selector` auf das Element mit dem Seiteninhalt setzen | | Leere oder fast leere Bodies | Selektor trifft einen Wrapper ohne Inhalt | Mit `--verbose` ausführen und `content-selector` anpassen | | Build stoppt bei Konfiguration | Pflicht-Key fehlt oder Wert liegt außerhalb der erlaubten Menge | Fehler lesen; er nennt das Feld | | Build stoppt bei Seiten-Override | Nicht unterstütztes Feld in einer `.mpf.json`\-Datei | Feld entfernen oder Schreibweise prüfen (Keys sind kebab-case) | | `source-hash` stimmt nach Deploy nicht | HTML wurde nach MPF-Generierung verändert | Ganze Pipeline erneut mit MPF als letztem Schritt ausführen | | Seite fehlt in `llms.mpf` | `index` ist für die Seite `false` | Seiten-Override und `defaults.index` prüfen | | `companion-footer`\-Fehler | Footer enthält Zeilenumbruch oder HTML | Eine einzelne Klartextzeile verwenden | | Falsche Sprache auf einer Seite | Pfad beginnt nicht mit einem konfigurierten Sprachcode | Sprache zu `languages` hinzufügen oder `lang` im Seiten-Override setzen | * * * Spezifikation: [Spezifikation 0.7](/de/standards/mpf/0.7) · Discovery: [Veröffentlichung und Discovery](/de/standards/mpf/publishing-and-discovery) · Quelle: [git.esfi.eu/esfi/mpf](https://git.esfi.eu/esfi/mpf) ## Auf dieser Seite {#auf-dieser-seite} ESFI — civilization infrastructure · https://esfi.eu