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 :
- 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. - Identité.
urldoit être la page humaine canonique ;mpf-urldoit être l’adresse que vous avez récupérée. - 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. - Parité. Si
hidden-sectionsvauttrue, lisez le contenu réservé aux machines et assurez-vous qu’il est intentionnel. - Périmètre. Confirmez que
companion-scopedans les fichiers,/.well-known/mpfet 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