--- mpf: '0.7' title: Implémentation — ESFI Docs url: https://docs.esfi.eu/fr/standards/mpf/implementation/ mpf-url: https://docs.esfi.eu/fr/standards/mpf/implementation/index.mpf organization: European Strategy & Future Infrastructure domain: docs.esfi.eu lang: fr updated: '2026-11-03' author: ESFI provenance: human source-hash: ec1883765f56f08b6d5bf9aa7771c2f440bcd943ecfdef5f865e95d0cd36b67d toc: - level: 1 text: Implémentation id: implémentation - level: 2 text: Prérequis id: prérequis - level: 2 text: 1\. Obtenir l’implémentation de référence id: 1-obtenir-l-implémentation-de-référence - level: 2 text: '2\. Déclarer l’éditeur : mpf.config.json' id: 2-déclarer-l-éditeur-mpf-config-json - level: 3 text: Clés obligatoires id: clés-obligatoires - level: 3 text: Clés facultatives id: clés-facultatives - level: 2 text: 3\. Surcharger par page id: 3-surcharger-par-page - level: 2 text: 4\. Contrôler ce qui entre dans le corps id: 4-contrôler-ce-qui-entre-dans-le-corps - level: 3 text: Zone de contenu id: zone-de-contenu - level: 3 text: Marqueurs dans la page id: marqueurs-dans-la-page - level: 2 text: 5\. Exécuter le build en dernier id: 5-exécuter-le-build-en-dernier - level: 3 text: Options de ligne de commande id: options-de-ligne-de-commande - level: 3 text: Ce que le build écrit id: ce-que-le-build-écrit - level: 3 text: Ordonnancement et dérive id: ordonnancement-et-dérive - level: 2 text: 6\. Signer (facultatif) id: 6-signer-facultatif - level: 2 text: 7\. Publier la découverte id: 7-publier-la-découverte - level: 2 text: 8\. Vérifier id: 8-vérifier - level: 2 text: Dépannage id: dépannage - level: 2 text: Sur cette page id: sur-cette-page 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: D’un site statique existant à un MPF publié, en une étape de build. 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: e8bcece0df9c7e35af2aa5dfde1adcd841fd96bd4c8d6c02ededadec83cd7454 --- Langue ✕ /fr/standards/mpf/implementation/index.mpf[ouvrir le fichier ↗](/fr/standards/mpf/implementation/index.mpf)[spécification ↗](/fr/standards/mpf/0.7)✕ chargement… # Implémentation {#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](/fr/standards/mpf/0.7) ; la découverte est couverte dans [Publication et découverte](/fr/standards/mpf/publishing-and-discovery). 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](/fr/standards/mpf). ## Prérequis {#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 {#1-obtenir-l-implémentation-de-référence} `mpf-build` est publié sous forme de code source sur [git.esfi.eu/esfi/mpf](https://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 --config ``` 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 {#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 {#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é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 {#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 {#4-contrôler-ce-qui-entre-dans-le-corps} ### Zone de contenu {#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 {#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 {#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 {#options-de-ligne-de-commande} **Specification 0.7** | Option | Effet | | --- | --- | | `--config ` | Fichier de configuration ; valeur par défaut : `/mpf.config.json` | | `--out ` | É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 {#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 {#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) {#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 {#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](/fr/standards/mpf/publishing-and-discovery). ## 8\. Vérifier {#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](/fr/standards/mpf/implementation-registry). ## Dépannage {#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](/fr/standards/mpf/0.7) · Découverte : [Publication et découverte](/fr/standards/mpf/publishing-and-discovery) · Source : [git.esfi.eu/esfi/mpf](https://git.esfi.eu/esfi/mpf) ## Sur cette page {#sur-cette-page} ESFI — civilization infrastructure · https://esfi.eu