--- mpf: '0.7' title: Implementatie — ESFI Docs url: https://docs.esfi.eu/nl/standards/mpf/implementation/ mpf-url: https://docs.esfi.eu/nl/standards/mpf/implementation/index.mpf organization: European Strategy & Future Infrastructure domain: docs.esfi.eu lang: nl updated: '2026-11-03' author: ESFI provenance: human source-hash: ce0bc04ccc85b784af33ae5f9f3535246a0b8c5a8984cf80563a164eef6a9bed toc: - level: 1 text: Implementatie id: implementatie - level: 2 text: Vereisten id: vereisten - level: 2 text: 1\. Haal de referentie-implementatie op id: 1-haal-de-referentie-implementatie-op - level: 2 text: '2\. Declareer de uitgever: mpf.config.json' id: 2-declareer-de-uitgever-mpf-config-json - level: 3 text: Verplichte keys id: verplichte-keys - level: 3 text: Optionele keys id: optionele-keys - level: 2 text: 3\. Override per pagina id: 3-override-per-pagina - level: 2 text: 4\. Bepaal wat in de body terechtkomt id: 4-bepaal-wat-in-de-body-terechtkomt - level: 3 text: Contentgebied id: contentgebied - level: 3 text: Markers in de pagina id: markers-in-de-pagina - level: 2 text: 5\. Voer de build als laatste uit id: 5-voer-de-build-als-laatste-uit - level: 3 text: Command-line opties id: command-line-opties - level: 3 text: Wat de build schrijft id: wat-de-build-schrijft - level: 3 text: Volgorde en drift id: volgorde-en-drift - level: 2 text: 6\. Ondertekenen (optioneel) id: 6-ondertekenen-optioneel - level: 2 text: 7\. Publiceer discovery id: 7-publiceer-discovery - level: 2 text: 8\. Verifieer id: 8-verifieer - level: 2 text: Problemen oplossen id: problemen-oplossen - level: 2 text: Op deze pagina id: op-deze-pagina 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: Van een bestaande statische site naar gepubliceerde MPF, in één buildstap. 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: bbe3cffd789037387d7843d8cae1c91c048a163475680046dcaa487249943162 --- Taal ✕ /nl/standards/mpf/implementation/index.mpf[bestand openen ↗](/nl/standards/mpf/implementation/index.mpf)[specificatie ↗](/nl/standards/mpf/0.7)✕ laden… # Implementatie {#implementatie} **Van een bestaande statische site naar gepubliceerde MPF, in één buildstap.** MPF wordt gegenereerd, niet met de hand geschreven. De referentie-implementatie, `mpf-build`, leest de voltooide HTML van een site en schrijft naast elke pagina een `.mpf`\-companion, samen met de machine-indexen van de site. In productie verandert niets: de server blijft statische bestanden serveren. Deze pagina is de implementatiehandleiding. Velddefinities staan in [Specificatie 0.7](/nl/standards/mpf/0.7); discovery wordt behandeld in [Publicatie en discovery](/nl/standards/mpf/publishing-and-discovery). Elke regel hieronder is gemarkeerd als **Specificatie 0.7**, **Referentie-implementatie** of **ESFI-praktijk**; de markers worden uitgelegd in het [Overzicht](/nl/standards/mpf). ## Vereisten {#vereisten} - Een site die statische HTML-bestanden produceert (ongeacht generator, of handgeschreven HTML). - Node.js 18 of nieuwer om `mpf-build` uit te voeren. **Referentie-implementatie** - Schrijftoegang tot de outputmap, en tot DNS als u de optionele DNS-declaratie publiceert. ## 1\. Haal de referentie-implementatie op {#1-haal-de-referentie-implementatie-op} `mpf-build` wordt als bron gepubliceerd op [git.esfi.eu/esfi/mpf](https://git.esfi.eu/esfi/mpf). Het wordt momenteel niet via het npm-register verspreid. ``` git clone https://git.esfi.eu/esfi/mpf.git cd mpf/mpf-build npm install ``` Voer het rechtstreeks uit: ``` node ./bin/mpf-build.js --config ``` of maak het commando `mpf-build` beschikbaar op uw machine met `npm link` vanuit dezelfde map. ## 2\. Declareer de uitgever: mpf.config.json {#2-declareer-de-uitgever-mpf-config-json} Het configuratiebestand vermeldt wie de uitgever is, welke talen de site gebruikt en welke standaarddeclaraties elke pagina draagt. Het staat doorgaans in de projectroot. ``` { "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" } } ``` ### Verplichte keys {#verplichte-keys} De builder stopt met een fout wanneer een van deze ontbreekt of ongeldig is. **Referentie-implementatie** | Key | Regel | | --- | --- | | `mpf` | Versiestring die in elk bestand wordt uitgestuurd | | `organization`, `domain`, `author` | Niet-lege strings | | `base-url` | Basis-URL van de site; afsluitende slashes worden genormaliseerd | | `default-lang` | Moet één van `languages` zijn | | `languages` | Niet-lege array met taalcodes | | `content-id-prefix` | Namespace voor gegenereerde `content-id`\-waarden; bewust los van `organization` zodat identifiers een naamswijziging overleven | | `defaults.provenance` | `human`, `ai-assisted` of `ai-generated` | | `defaults.index` | Boolean | ### Optionele keys {#optionele-keys} | Key | Effect | Status | | --- | --- | --- | | `spec-url` | Canonieke specificatie-URL, uitgestuurd als `MPF-spec` in `llms.txt` | **Specificatie 0.7** | | `description` | Beschrijving op één regel gebruikt in `llms.txt` en `llms.mpf` | **Specificatie 0.7** | | `content-selector` | CSS-selector voor het contentgebied | **Specificatie 0.7** | | `spec-origin`, `content-origin` | Origindeclaraties in frontmatter; standaard `domain` | **Specificatie 0.7** | | `signing-key` | Pad naar een private key; activeert signatures (zie stap 6) | **Specificatie 0.7** (gedrag), **Referentie-implementatie** (key handling) | | `defaults.confidence` | `confirmed`, `probable`, `speculative` of `contested` | **Referentie-implementatie** (toegestane waarden) | | `defaults.content-type` | `specification`, `narrative`, `data`, `analysis`, `reference`, `legal` of `profile` | **Referentie-implementatie** (toegestane waarden) | | `defaults.companion-scope` | Booleans voor `cite`, `summarize`, `train`, `index`, `relay` | **Specificatie 0.7** (veld), **Referentie-implementatie** (validatie) | | `defaults.content-parity` | Standaard pariteitsdeclaratie | **Specificatie 0.7** | | `defaults.companion-instruction` | Bericht van de uitgever aan de machinelezer; wordt ook als blockquote voor de body geplaatst | **Specificatie 0.7** | | `defaults.companion-footer` | Uitgeverssignatuur op één regel, toegevoegd aan de body; mag geen regeleinden of HTML bevatten | **Specificatie 0.7** | | `defaults.companion-contact` | Contact voor machinelezers, bijvoorbeeld `mailto:` | **Specificatie 0.7** | | `defaults.c2pa-manifest` | Verwijzing naar een C2PA-manifest | **Specificatie 0.7** | | `defaults.preferred-representation` | `mpf` of `html` | **Referentie-implementatie** (toegestane waarden) | Elke declaratie is een beslissing van de uitgever. Behandel de defaults als een verklaring waar uw organisatie achter zal staan, niet als technische instellingen. `companion-scope` legt alleen processing intent vast. MPF bevat geen licentievoorwaarden, prijzen of compensatievoorwaarden; die horen bij licentiemechanismen buiten het formaat. ## 3\. Override per pagina {#3-override-per-pagina} Elke pagina kan sitestandaarden overschrijven met een JSON-sidecar naast haar HTML-bestand: `index.html` → `index.mpf.json`, `guide/page.html` → `guide/page.mpf.json`. **Specificatie 0.7** (bestaan), **Referentie-implementatie** (toegestane velden) ``` { "confidence": "speculative", "content-type": "analysis", "review-after": "2027-03-01", "companion-instruction": "This page contains projections. Treat figures as estimates." } ``` Toegestane overridevelden: `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`. Een onbekend veld stopt de build. `related` is een array van `{ "url", "relation" }`, waarbij `relation` één van `prerequisite`, `extends`, `source`, `contradicts`, `alternative`, `supersedes`, `details` is. **Referentie-implementatie** ## 4\. Bepaal wat in de body terechtkomt {#4-bepaal-wat-in-de-body-terechtkomt} ### Contentgebied {#contentgebied} De builder neemt het element dat overeenkomt met `content-selector`. Als niets overeenkomt, of de match leeg is, valt hij in deze volgorde terug op `main`, `article`, `[role="main"]`, `.content` en `body`. Binnen het geselecteerde gebied verwijdert hij navigatie, headers, footers, scripts, styles en elementen met `aria-hidden="true"`. Een pagina zonder bruikbaar contentgebied wordt overgeslagen en gerapporteerd. **Specificatie 0.7** (contentselectie), **Referentie-implementatie** (fallbackvolgorde en ruislijst) ### Markers in de pagina {#markers-in-de-pagina} Vier HTML-attributen laten een uitgever de machinebody sturen zonder te veranderen wat mensen zien. **Referentie-implementatie** | Attribuut | Effect | | --- | --- | | `data-mpf-only` | Content verschijnt alleen in de MPF-body en wordt ervoor geplaatst. De aanwezigheid ervan zet `content-parity` op `html: false`, `human-visible-source: false`, `hidden-sections: true`. | | `data-mpf-hide` | Content wordt uitgesloten van de MPF-body. | | `data-mpf-text="…"` | Het element wordt in de MPF-body vervangen door de opgegeven tekst; nuttig voor verhulde contactadressen. | | `data-mpf-alt="…"` | Afbeeldingen, media en embeds worden vervangen door de opgegeven tekst. Embeds zonder dit attribuut verdwijnen uit de MPF-body. | `data-mpf-only` moet spaarzaam worden gebruikt. Machine-only content is precies waarvoor de pariteitsdeclaratie bestaat; de builder declareert die automatisch zodat ze niet verborgen gezag kan krijgen. ## 5\. Voer de build als laatste uit {#5-voer-de-build-als-laatste-uit} Voer `mpf-build` uit nadat de HTML definitief is, over de voltooide outputmap: ``` "scripts": { "build": "astro build", "postbuild": "mpf-build dist --config mpf.config.json" } ``` Geef `--config` expliciet door wanneer u een gegenereerde map zoals `dist/` verwerkt, zodat de builder de configuratie niet daarin zoekt. **Referentie-implementatie** ### Command-line opties {#command-line-opties} **Specificatie 0.7** | Optie | Effect | | --- | --- | | `--config ` | Configuratiebestand; standaard `/mpf.config.json` | | `--out ` | Schrijf output naar een andere map; standaard in place | | `--dry-run` | Rapporteer wat zou worden geschreven, schrijf niets | | `--verbose` | Log elke verwerkte pagina met titel, URL en aantal items in de inhoudsopgave | | `--watch` | Bouw opnieuw bij wijzigingen in HTML, page overrides of configuratie | ### Wat de build schrijft {#wat-de-build-schrijft} | Artefact | Locatie | Status | | --- | --- | --- | | Page companion | Naast elke pagina, `.html` → `.mpf` | **Specificatie 0.7** | | `llms.mpf` | Siteroot; MPF-index van pagina’s met `index: true` | **Specificatie 0.7** | | `llms.txt` | Siteroot; MPF-sectie gemaakt of vervangen, overige content behouden | **Specificatie 0.7** | | `llms-full.txt` | Siteroot; bodies van geïndexeerde pagina’s in de standaardtaal | **Specificatie 0.7** | | `.sig`\-bestanden | Naast elke `.mpf`, wanneer signing is geconfigureerd | **Specificatie 0.7** | Canonieke URL’s en `source-hash`\-waarden worden altijd uit de bron-HTML en het bronrelatieve pad afgeleid, nooit uit het outputpad. **Referentie-implementatie** ### Volgorde en drift {#volgorde-en-drift} Elke companion verankert zijn bron met `source-hash`. Als de HTML opnieuw wordt gegenereerd zonder `mpf-build` opnieuw te draaien, of omgekeerd, drijven beide uit elkaar. Een verouderde companion is erger dan een ontbrekende, omdat hij gezaghebbend lijkt. Houd MPF-generatie als laatste stap van de build en deploy beide representaties samen. ## 6\. Ondertekenen (optioneel) {#6-ondertekenen-optioneel} Wanneer `signing-key` naar een private-keybestand wijst, ondertekent de builder elke page companion en `llms.mpf`, schrijft de signature base64-gecodeerd naar een `.sig`\-bestand ernaast en voegt een `signature`\-URL aan de frontmatter toe. Als het keybestand ontbreekt, gaat de build zonder signatures door en print een waarschuwing. **Specificatie 0.7** (signatureveld en artefact), **Referentie-implementatie** (encoding en key handling) De signature dekt het volledige MPF-bestand zoals geschreven. Publiceer de bijbehorende public key waar lezers hem kunnen vinden en vermeld welk algoritme wordt gebruikt. De key hoort nooit in de repository of outputmap. ## 7\. Publiceer discovery {#7-publiceer-discovery} De build produceert `llms.txt` en `llms.mpf`. ESFI-sites publiceren daarnaast een DNS TXT-record, een `/.well-known/mpf`\-declaratie en optioneel een page-level alternate link. Dit is **ESFI-praktijk**; hoe u die instelt staat in [Publicatie en discovery](/nl/standards/mpf/publishing-and-discovery). ## 8\. Verifieer {#8-verifieer} Controleer wat u hebt gepubliceerd, niet wat u hebt geconfigureerd: ``` curl -s https://example.org/index.mpf | head -30 # companion bestaat en kan worden geparsed curl -s https://example.org/llms.mpf | head -30 # index bestaat en bevat pagina's curl -s https://example.org/llms.txt # MPF-sectie, MPF-spec, MPF-index curl -s https://example.org/.well-known/mpf # ESFI-praktijk dig +short TXT _mpf.example.org # ESFI-praktijk ``` Controleer daarna de relatie tussen beide representaties: 1. **Drift.** Bereken de SHA-256 van de geserveerde HTML en vergelijk die met `source-hash`. Een mismatch betekent dat het paar uit sync is, tenzij de server HTML tijdens transport wijzigt. 2. **Identiteit.** `url` moet de canonieke menselijke pagina zijn; `mpf-url` moet het adres zijn dat u hebt opgehaald. 3. **Talen.** Bevestig voor elke invoer in `language-variants` dat het bestand bestaat. De builder genereert deze adressen uit configuratie en controleert ze niet. 4. **Pariteit.** Als `hidden-sections` `true` is, lees de machine-only content en controleer dat u die bedoelt. 5. **Scope.** Bevestig dat `companion-scope` in de bestanden, `/.well-known/mpf` en het DNS-record dezelfde waarden vermelden. Zodra uw output kan worden geïnspecteerd en overeenkomt met een gepubliceerde versie, kan hij in het [Implementatieregister](/nl/standards/mpf/implementation-registry) worden opgenomen. ## Problemen oplossen {#problemen-oplossen} | Symptoom | Waarschijnlijke oorzaak | Oplossing | | --- | --- | --- | | `skipped: … (no content root)` | Selector matcht niets en de fallbacks zijn leeg | Stel `content-selector` in op het element met de paginacontent | | Lege of bijna lege bodies | Selector matcht een wrapper zonder content | Voer uit met `--verbose` en pas `content-selector` aan | | Build stopt op configuratie | Verplichte key ontbreekt of waarde ligt buiten toegestane set | Lees de fout; die noemt het veld | | Build stopt op een page override | Niet-ondersteund veld in een `.mpf.json`\-bestand | Verwijder het veld of controleer de spelling (keys zijn kebab-case) | | `source-hash` mismatch na deploy | HTML is veranderd na MPF-generatie | Voer de volledige pipeline opnieuw uit met MPF als laatste | | Pagina ontbreekt in `llms.mpf` | `index` is `false` voor die pagina | Controleer de page override en `defaults.index` | | `companion-footer`\-fout | Footer bevat een regeleinde of HTML | Gebruik één regel platte tekst | | Verkeerde taal op een pagina | Pad begint niet met een geconfigureerde taalcode | Voeg de taal toe aan `languages` of stel `lang` in de page override in | * * * Specificatie: [Specificatie 0.7](/nl/standards/mpf/0.7) · Discovery: [Publicatie en discovery](/nl/standards/mpf/publishing-and-discovery) · Bron: [git.esfi.eu/esfi/mpf](https://git.esfi.eu/esfi/mpf) ## Op deze pagina {#op-deze-pagina} ESFI — civilization infrastructure · https://esfi.eu