---
title: "Agent surface"
url: "https://mira.omrajguru.site/docs/agents/"
description: "Markdown copies of every page, llms.txt, a search index, a content index for MCP, a crawler policy, and structured data, written on every build."
---

# Agent surface

People read a site through the browser. Agents do better with text, structure, and stable URLs. Mira writes both from the same source on every build, so they never drift apart.

## Markdown twins

Every page has a Markdown version at the same path with `.md`:

| Page | Twin |
| --- | --- |
| `/` | `/index.md` |
| `/docs/routing/` | `/docs/routing.md` |

A twin starts with frontmatter naming the page and its canonical URL:

```markdown
---
title: "Routing"
url: "https://mira.example/docs/routing/"
description: "How files in routes/ become URLs."
---

# Routing

Every .md or .mira file in routes/ is a page…
```

Pages written in Markdown reuse their source. Component pages are converted from their rendered `<main>` element, keeping headings, lists, links, code, and images and leaving out navigation and scripts. Each page links its twin with `<link rel="alternate" type="text/markdown">`. Turn twins off with `"agents": { "twins": false }`.

## llms.txt

`/llms.txt` follows the llms.txt format: the site's title and description, then every page grouped by collection, each linking to its twin. `/llms-full.txt` is every twin in one file, for agents that want the whole site in one request.

## Search API

`/_mira/search.json` lists every page with its title, description, headings, and text. See [Search](/docs/search/#the-index).

## Content index

`/_mira/content.json` describes the site and lists every collection, with its entry count and field types, and every data file. Each collection's published entries, with all their fields, are in `/_mira/collections/<name>.json`, and each data file in `/_mira/data/<name>.json`. Set `agents.content` to `false` to publish pages and search only.

## MCP

Any MCP client can read the whole site through these files, from a project or from the deployed URL. `llms.txt` ends with the command to connect. See [MCP server](/docs/mcp/).

## Crawler policy

For separate switches covering search, AI answers, and AI training, see [SEO and AI search](/docs/seo/#crawler-policy).

```json
{
  "agents": {
    "robots": { "*": "allow", "ExampleBot": "disallow" }
  }
}
```

Each agent gets `allow` or `disallow`, written to `/robots.txt` with specific agents first and the catch all last. When `site.url` is set, the file also points to the sitemap.

## Sitemap and feeds

With `site.url` set, the build writes `/sitemap.xml`, with `lastmod` from each page's `date`, and an RSS feed per collection with a dynamic route. Without it, Mira skips them and says so, since both need absolute URLs.

## Structured data

Every page has Open Graph tags for its title, description, type, and URL. Collection entries also get JSON-LD as a `BlogPosting` with the headline, description, publish date, and URL.

## Stable markup

Mira's own markup is semantic: one `<main>`, labeled navigation, headings in order, and `aria-current` on the current link. Transitions are skipped for automated browsers so the DOM stays still while an agent reads it.
