A Model Context Protocol endpoint, so an agent can query the documentation
instead of scraping it.

## Tools

| Tool            | What it does                                          |
| :-------------- | :---------------------------------------------------- |
| `list_versions` | Every version, with the prefix that scopes it         |
| `list_pages`    | The table of contents, bounded and scoped             |
| `search_docs`   | Find a page by term, with an excerpt around the match |
| `read_page`     | One page as Markdown, with duxt frontmatter           |

## Scope is a URL prefix

`list_versions` hands back the prefix each version is served at — `/app`,
`/app/v1`, `/de/app` — and that string is the whole of the scope `list_pages`
and `search_docs` accept. It also carries the version's label, lifecycle status,
which languages it is published in and whether it is the default, so an agent
chooses an edition before it searches one.

Omitting the prefix covers every version, in the site's default language. A
version nested under another — `/app/v1` below the current `/app` — is never
inside its parent's scope.

## Bounded answers

Both listings take `limit` (20 by default, 100 at most) and a `cursor`. Results
are ordered by path, and a `nextCursor` line names where to resume; a listing
without one is complete. The cursor is the last path returned, so it stays
stable when the documentation changes between two calls.

## What `read_page` returns

duxt's own YAML frontmatter — path, prefix, version label and ref, locale and
lifecycle status — over the authored Markdown with the author's own frontmatter
removed. Never the rendered HTML, and never Content's parse tree.

## Notes

Same collections as the pages, so the answers cannot drift from what is
published. The server name, description and instructions come from the module
options.

The server reuses a path-only index for each production collection. A listing reads metadata for the requested results plus one continuation row. Search reads bodies in blocks of at most 64 pages and stops once the answer and continuation are known. Unicode matching and translation precedence are unchanged. A term with no matches still scans the whole scope, but does not retain all bodies in memory.