Docs

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; Discovery wird unter Veröffentlichung und Discovery behandelt. Jede Regel unten ist als Spezifikation 0.7, Referenzimplementierung oder ESFI-Praxis gekennzeichnet; die Marker werden im Überblick erklärt.

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

mpf-build wird als Quellcode unter 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 <source-dir> --config <path-to-mpf.config.json>

oder mit npm link aus demselben Verzeichnis den Befehl mpf-build auf Ihrer Maschine verfügbar machen.

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

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

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

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

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

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

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

Spezifikation 0.7

Option Wirkung
--config <path> Konfigurationsdatei; standardmäßig <source-dir>/mpf.config.json
--out <path> 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

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

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)

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

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.

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 aufgenommen werden.

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 · Discovery: Veröffentlichung und Discovery · Quelle: git.esfi.eu/esfi/mpf