Un point de terminaison Model Context Protocol, pour qu’un agent puisse
interroger la documentation au lieu de la scraper.

## Outils

| Outil           | Ce qu’il fait                                           |
| :-------------- | :------------------------------------------------------ |
| `list_versions` | Chaque version, avec le préfixe qui la délimite         |
| `list_pages`    | La table des matières, bornée et délimitée              |
| `search_docs`   | Trouver une page par terme, avec un extrait             |
| `read_page`     | Une page en Markdown, avec le frontmatter de duxt       |

## La portée est un préfixe d’URL

`list_versions` renvoie le préfixe sous lequel chaque version est servie —
`/app`, `/app/v1`, `/de/app` — et cette chaîne constitue toute la portée
qu’acceptent `list_pages` et `search_docs`. Elle porte aussi le libellé de la
version, son statut de cycle de vie, les langues dans lesquelles elle est
publiée et si elle est celle par défaut : un agent choisit donc une édition
avant d’y chercher.

Omettre le préfixe couvre toutes les versions, dans la langue par défaut du
site. Une version imbriquée sous une autre — `/app/v1` sous le `/app` courant —
n’est jamais dans la portée de sa parente.

## Réponses bornées

Les deux listes acceptent `limit` (20 par défaut, 100 au maximum) et un
`cursor`. Les résultats sont triés par chemin, et une ligne `nextCursor` indique
où reprendre ; une liste sans elle est complète. Le curseur est le dernier
chemin renvoyé, il reste donc stable si la documentation change entre deux
appels.

## Ce que renvoie `read_page`

Le frontmatter YAML propre à duxt — chemin, préfixe, libellé et ref de la
version, langue et statut de cycle de vie — au-dessus du Markdown tel qu’écrit,
son frontmatter d’origine retiré. Jamais le HTML rendu, jamais l’arbre d’analyse
de Content.

## Remarques

Les mêmes collections que les pages, si bien que les réponses ne peuvent pas
diverger de ce qui est publié. Le nom du serveur, sa description et ses
instructions viennent des options du module.

Le serveur réutilise un index de chemins par collection de production. Une liste lit les métadonnées demandées et une ligne de continuation. La recherche lit les corps par blocs de 64 pages maximum et s’arrête lorsque la réponse est complète. Unicode et la priorité des traductions restent identiques. Sans résultat, tout le périmètre est parcouru sans conserver tous les corps en mémoire.