Docs

Implémentation

D’un site statique existant à un MPF publié, en une étape de build.

MPF est généré, pas écrit à la main. L’implémentation de référence, mpf-build, lit le HTML final d’un site et écrit un compagnon .mpf à côté de chaque page, ainsi que les index machine du site. Rien ne change en production : le serveur continue de servir des fichiers statiques.

Cette page est le guide d’implémentation. Les définitions de champs se trouvent dans la Spécification 0.7 ; la découverte est couverte dans Publication et découverte. Chaque règle ci-dessous est marquée Specification 0.7, Reference implementation ou ESFI practice ; les marqueurs sont expliqués dans la Vue d’ensemble.

Prérequis

  • Un site qui produit des fichiers HTML statiques (avec n’importe quel générateur, ou du HTML écrit à la main).
  • Node.js 18 ou ultérieur pour exécuter mpf-build. Reference implementation
  • Un accès en écriture au répertoire de sortie, et au DNS si vous publiez la déclaration DNS facultative.

1. Obtenir l’implémentation de référence

mpf-build est publié sous forme de code source sur git.esfi.eu/esfi/mpf. Il n’est pas actuellement distribué via le registre npm.

git clone https://git.esfi.eu/esfi/mpf.git
cd mpf/mpf-build
npm install

Exécutez-le directement :

node ./bin/mpf-build.js <source-dir> --config <path-to-mpf.config.json>

ou rendez la commande mpf-build disponible sur votre machine avec npm link depuis le même répertoire.

2. Déclarer l’éditeur : mpf.config.json

Le fichier de configuration indique qui est l’éditeur, quelles langues le site utilise et quelles déclarations par défaut chaque page porte. Il se trouve généralement à la racine du projet.

{
  "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"
  }
}

Clés obligatoires

Le builder s’arrête avec une erreur si l’une de ces clés manque ou est invalide. Reference implementation

Clé Règle
mpf Chaîne de version émise dans chaque fichier
organization, domain, author Chaînes non vides
base-url URL de base du site ; les slashs finaux sont normalisés
default-lang Doit faire partie de languages
languages Tableau non vide de codes de langue
content-id-prefix Espace de noms des valeurs content-id générées ; délibérément distinct de organization afin que les identifiants survivent à un changement de nom
defaults.provenance human, ai-assisted ou ai-generated
defaults.index Booléen

Clés facultatives

Clé Effet Statut
spec-url URL canonique de la spécification, émise comme MPF-spec dans llms.txt Specification 0.7
description Description sur une ligne utilisée dans llms.txt et llms.mpf Specification 0.7
content-selector Sélecteur CSS de la zone de contenu Specification 0.7
spec-origin, content-origin Déclarations d’origine dans le frontmatter ; utilisent domain par défaut Specification 0.7
signing-key Chemin vers une clé privée ; active les signatures (voir étape 6) Specification 0.7 (comportement), Reference implementation (gestion de clé)
defaults.confidence confirmed, probable, speculative ou contested Reference implementation (valeurs autorisées)
defaults.content-type specification, narrative, data, analysis, reference, legal ou profile Reference implementation (valeurs autorisées)
defaults.companion-scope Booléens pour cite, summarize, train, index, relay Specification 0.7 (champ), Reference implementation (validation)
defaults.content-parity Déclaration de parité par défaut Specification 0.7
defaults.companion-instruction Message de l’éditeur au lecteur machine ; également ajouté au début du corps sous forme de blockquote Specification 0.7
defaults.companion-footer Signature de l’éditeur sur une ligne ajoutée au corps ; ne doit contenir ni saut de ligne ni HTML Specification 0.7
defaults.companion-contact Contact pour les lecteurs machines, par ex. mailto: Specification 0.7
defaults.c2pa-manifest Pointeur vers un manifeste C2PA Specification 0.7
defaults.preferred-representation mpf ou html Reference implementation (valeurs autorisées)

Chaque déclaration est une décision de l’éditeur. Traitez les valeurs par défaut comme une déclaration que votre organisation est prête à assumer, pas comme de simples paramètres techniques.

companion-scope consigne uniquement une intention de traitement. MPF ne porte ni conditions de licence, ni tarifs, ni conditions de compensation ; celles-ci appartiennent à des mécanismes de licence extérieurs au format.

3. Surcharger par page

Toute page peut surcharger les valeurs par défaut du site avec un sidecar JSON placé à côté de son fichier HTML : index.html → index.mpf.json, guide/page.html → guide/page.mpf.json. Specification 0.7 (existence), Reference implementation (champs autorisés)

{
  "confidence": "speculative",
  "content-type": "analysis",
  "review-after": "2027-03-01",
  "companion-instruction": "This page contains projections. Treat figures as estimates."
}

Champs de surcharge autorisés : 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.

Un champ inconnu arrête le build. related est un tableau de { "url", "relation" }, où relation est l’une des valeurs prerequisite, extends, source, contradicts, alternative, supersedes, details. Reference implementation

4. Contrôler ce qui entre dans le corps

Zone de contenu

Le builder prend l’élément correspondant à content-selector. Si rien ne correspond, ou si la correspondance est vide, il essaie dans l’ordre main, article, [role="main"], .content puis body. Dans la zone sélectionnée, il retire la navigation, les en-têtes, les pieds de page, les scripts, les styles et les éléments marqués aria-hidden="true". Une page sans zone de contenu utilisable est ignorée et signalée. Specification 0.7 (sélection de contenu), Reference implementation (ordre de repli et liste de bruit)

Marqueurs dans la page

Quatre attributs HTML permettent à un éditeur de contrôler le corps machine sans modifier ce que voient les personnes. Reference implementation

Attribut Effet
data-mpf-only Le contenu apparaît uniquement dans le corps MPF, ajouté au début. Sa présence fixe content-parity à html: false, human-visible-source: false, hidden-sections: true.
data-mpf-hide Le contenu est exclu du corps MPF.
data-mpf-text="…" L’élément est remplacé dans le corps MPF par le texte donné ; utile pour les adresses de contact obfusquées.
data-mpf-alt="…" Les images, médias et embeds sont remplacés par le texte donné. Les embeds sans cet attribut sont supprimés du corps MPF.

data-mpf-only est celui qu’il faut utiliser avec parcimonie. Le contenu visible uniquement par les machines est précisément ce que la déclaration de parité doit rendre visible ; le builder le déclare automatiquement afin qu’il ne puisse pas être caché.

5. Exécuter le build en dernier

Exécutez mpf-build après que le HTML est final, sur le répertoire de sortie terminé :

"scripts": {
  "build": "astro build",
  "postbuild": "mpf-build dist --config mpf.config.json"
}

Passez --config explicitement lors du traitement d’un répertoire généré comme dist/, afin que le builder ne cherche pas la configuration à l’intérieur. Reference implementation

Options de ligne de commande

Specification 0.7

Option Effet
--config <path> Fichier de configuration ; valeur par défaut : <source-dir>/mpf.config.json
--out <path> Écrire la sortie dans un autre répertoire ; valeur par défaut : sur place
--dry-run Indiquer ce qui serait écrit sans rien écrire
--verbose Journaliser chaque page traitée avec son titre, son URL et le nombre d’entrées de table des matières
--watch Reconstruire lors de changements du HTML, des surcharges de page ou de la configuration

Ce que le build écrit

Artefact Emplacement Statut
Compagnon de page À côté de chaque page, .html → .mpf Specification 0.7
llms.mpf Racine du site ; index MPF des pages avec index: true Specification 0.7
llms.txt Racine du site ; section MPF créée ou remplacée, autre contenu préservé Specification 0.7
llms-full.txt Racine du site ; corps des pages indexées dans la langue par défaut Specification 0.7
Fichiers .sig À côté de chaque .mpf, lorsque la signature est configurée Specification 0.7

Les URL canoniques et les valeurs source-hash sont toujours dérivées du HTML source et de son chemin relatif à la source, jamais du chemin de sortie. Reference implementation

Ordonnancement et dérive

Chaque compagnon fixe sa source avec source-hash. Si le HTML est régénéré sans réexécuter mpf-build, ou l’inverse, les deux représentations dérivent. Un compagnon obsolète est pire qu’un compagnon absent, car il paraît faire autorité. Gardez la génération MPF comme dernière étape du build et déployez les deux représentations ensemble.

6. Signer (facultatif)

Lorsque signing-key pointe vers un fichier de clé privée, le builder signe chaque compagnon de page et llms.mpf, écrit la signature encodée en base64 dans un fichier .sig à côté, et ajoute une URL signature au frontmatter. Si le fichier de clé manque, le build continue sans signatures et affiche un avertissement. Specification 0.7 (champ et artefact de signature), Reference implementation (encodage et gestion de clé)

La signature couvre le fichier MPF complet tel qu’il est écrit. Publiez la clé publique correspondante à un endroit où les lecteurs peuvent la trouver, et indiquez l’algorithme utilisé. La clé n’a jamais sa place dans le dépôt ni dans le répertoire de sortie.

7. Publier la découverte

Le build produit llms.txt et llms.mpf. Les sites ESFI publient également un enregistrement DNS TXT, une déclaration /.well-known/mpf et, facultativement, un lien alternate au niveau de la page. Ce sont des ESFI practice ; leur mise en place est décrite dans Publication et découverte.

8. Vérifier

Vérifiez ce que vous avez publié, pas ce que vous avez configuré :

curl -s https://example.org/index.mpf | head -30     # companion exists and parses
curl -s https://example.org/llms.mpf | head -30      # index exists and lists pages
curl -s https://example.org/llms.txt                 # MPF section, MPF-spec, MPF-index
curl -s https://example.org/.well-known/mpf          # ESFI practice
dig +short TXT _mpf.example.org                      # ESFI practice

Vérifiez ensuite la relation entre les deux représentations :

  1. Dérive. Calculez le SHA-256 du HTML servi et comparez-le à source-hash. Une différence signifie que les deux représentations ne sont plus synchronisées, sauf si le serveur modifie le HTML en transit.
  2. Identité. url doit être la page humaine canonique ; mpf-url doit être l’adresse que vous avez récupérée.
  3. Langues. Pour chaque entrée de language-variants, confirmez que le fichier existe. Le builder génère ces adresses depuis la configuration et ne les vérifie pas.
  4. Parité. Si hidden-sections vaut true, lisez le contenu réservé aux machines et assurez-vous qu’il est intentionnel.
  5. Périmètre. Confirmez que companion-scope dans les fichiers, /.well-known/mpf et l’enregistrement DNS indiquent les mêmes valeurs.

Une fois votre sortie inspectable et conforme à une version publiée, elle peut être inscrite au Registre des implémentations.

Dépannage

Symptôme Cause probable Correction
skipped: … (no content root) Le sélecteur ne correspond à rien et les replis sont vides Définir content-selector sur l’élément qui contient le contenu de la page
Corps vide ou presque vide Le sélecteur correspond à un wrapper sans le contenu Exécuter avec --verbose et ajuster content-selector
Le build s’arrête sur la configuration Clé obligatoire manquante ou valeur hors de l’ensemble autorisé Lire l’erreur ; elle nomme le champ
Le build s’arrête sur une surcharge de page Champ non pris en charge dans un fichier .mpf.json Retirer le champ ou vérifier son orthographe (les clés sont en kebab-case)
source-hash différent après déploiement Le HTML a changé après la génération MPF Réexécuter tout le pipeline avec MPF en dernier
Page absente de llms.mpf index vaut false pour cette page Vérifier la surcharge de page et defaults.index
Erreur companion-footer Le footer contient un saut de ligne ou du HTML Utiliser une seule ligne de texte brut
Mauvaise langue sur une page Le chemin ne commence pas par un code de langue configuré Ajouter la langue à languages ou définir lang dans la surcharge de page

Spécification : Spécification 0.7 · Découverte : Publication et découverte · Source : git.esfi.eu/esfi/mpf