# From SEO to GEO: the technical architecture of an AI-readable website

> RAG, llms.txt, JSON-LD, TDM and MCP: the technical architecture that lets AI search engines read and cite your site correctly. With code.

![Minimalist illustration in mint green on black of the architecture of an AI-readable website: fading search-result bars on the left, an entity knowledge graph growing from structured data in the center, a cited AI answer card on the right.](https://cdn.btlabs.dev/media/von-seo-zu-geo-ki-lesbare-architektur-2688x1520-9a186c01.webp)

Berger+Team · Oct 28, 2026

Topic: [Machine-readable website →](https://btlabs.dev/en/ai-website)

For decades, discoverability rested on a single model: search engines crawl HTML, evaluate links, and return a list of blue links. The human is the filter, opening the pages one by one.

[Generative engines](https://btlabs.dev/en/ai-discoverability) like [Google AI Overviews](https://btlabs.dev/en/glossary/ai-overviews) , Perplexity or ChatGPT break this model. They use [Retrieval-Augmented Generation](https://btlabs.dev/en/glossary/rag-retrieval-augmented-generation)   **(RAG)**: they search for relevant content in real time, load the matching text segments into the context of a [language model](https://btlabs.dev/en/glossary/llm-large-language-model) , and generate a consolidated answer with source attributions. If you're not cited, you're invisible.

This article is [the technical companion to it](https://btlabs.dev/en/posts/dual-channel-visibility) — for everyone who wants to build a website not only for people, but also for machines. We walk through the mechanics of RAG, the proven [GEO](https://btlabs.dev/en/glossary/geo-generative-engine-optimization) levers, the necessary standards and proposals ([llms.txt](https://btlabs.dev/en/glossary/llms-txt) , [JSON-LD](https://btlabs.dev/en/glossary/structured-data) , TDM, [MCP](https://btlabs.dev/en/glossary/mcp-model-context-protocol) ), and the mistakes we've seen in practice.

## 1\. How generative engines select

At the core of a RAG system lies a simple geometric idea. The search query and the document chunks are converted into high-dimensional vectors via an embedding model. The relevance of two vectors is usually determined through **cosine similarity**:

> **Cosine similarity**
> sim(q, d) = (q · d) / (‖q‖ ‖d‖)

Here, `q` is the vector of the query and `d` is the vector of a document chunk. The system selects the `k` chunks with the highest similarity and passes them to the language model as context.

The practical consequence: how you split your content into chunks (structure, headings, paragraph logic) decides whether your statements are classified cleanly in semantic terms — or linked incorrectly. Poor chunking is a main cause of the “citation-shaped hallucinations”, where an AI links a source to a statement that doesn't appear there at all.

Where these vectors are stored, and how an AI finds the right passage among them, is explained in [What is a vector database?](https://btlabs.dev/en/posts/what-is-a-vector-database).

## 2\. The proven GEO levers

The study _“GEO: Generative Engine Optimization”_ (Aggarwal et al., ACM KDD 2024) systematically measured which text changes increase the likelihood of being cited by an LLM — with a visibility gain of up to **40%**. The most effective methods:

- **Statistics Addition** — concrete figures and data instead of qualitative statements. LLMs prefer precision.
- **Cite Sources** — back up your own statements with source references. Dramatically increases perceived trustworthiness.
- **Quotation Addition** — include verbatim expert quotes. Signals qualitative depth.

Notably: the effect is domain-dependent and especially strong for pages that were initially poorly ranked. Keyword stuffing — the old [SEO](https://btlabs.dev/en/glossary/seo-search-engine-optimisation) reflex — by contrast does not work.

## 3\. llms.txt: the lean shadow surface

The **llms.txt**protocol proposed by Jeremy Howard (Answer.AI, September 2024) provides a Markdown file at the domain root that delivers the core of the site without HTML ballast — as a token-efficient entry point for LLMs.

The specification (see llmstxt.org) is deliberately minimal:

> **llms.txt**
> \# btlabs Core
>
> \> Headless platform for SMEs: one data base, multiple channels —
> \> multilingual, machine-readable, privacy-friendly.
>
> \## Services
> \- \[Corporate Websites\](/en/services/websites.md): strategy, design, implementation
> \- \[AI Discoverability\](/en/services/geo.md): GEO, structured data, MCP
>
> \## Optional
> \- \[About us\](/en/about.md): Berger+Team, Bolzano

An honest assessment: no major AI provider has formally committed to weighting llms.txt as a fixed signal. The realistic state in 2026 resembles schema.org around 2014 — not universally honored, but cheap enough to be worth it. A hedge without a premium.

## 4\. JSON-LD: making the entity graph explicit

RAG systems prefer data laid out as a graph of facts. With **JSON-LD per schema.org** you link entities explicitly, instead of letting the AI guess how brand, offering and people are connected:

> **JSON-LD · schema.org**
> {
> "@context": "https://schema.org",
> "@graph": \[
> {
> "@type": "Organization",
> "@id": "https://btlabs.dev/#organization",
> "name": "btlabs Core",
> "areaServed": { "@type": "AdministrativeArea", "name": "Südtirol" }
> },
> {
> "@type": "WebPage",
> "@id": "https://btlabs.dev/leistungen",
> "isPartOf": { "@id": "https://btlabs.dev/#website" },
> "about": { "@id": "https://btlabs.dev/#organization" }
> }
> \]
> }

What such a facts graph means in practice is explained in [What is a Knowledge Graph?](https://btlabs.dev/en/posts/what-is-a-knowledge-graph).

The `@graph` with `@id`references is the point: it turns loose snippets into a connected network — and reduces exactly the faulty links that lead to hallucinations. An everyday example of exactly these broken links is [the NAP error: wrongly recommended by AI instead of not at all](https://btlabs.dev/en/posts/the-nap-error-recommended-wrong) — when name, address and phone number aren't recognized as one coherent entity.

## 5\. TDM & ai.txt: visibility yes, training by choice

Via the **W3C** [TDM Reservation Protocol](https://btlabs.dev/en/glossary/tdm-opt-out-tdmrep) (Final Report 2024, based on Art. 4 of the EU Copyright Directive, referenced by the [EU AI Act](https://btlabs.dev/en/glossary/ai-act-eu-ai-regulation) ) you declare in [machine-readable](https://btlabs.dev/en/glossary/machine-readable-website) form whether your content is released for AI training or commercial mining:

> **tdmrep.json**
> // /.well-known/tdmrep.json
> \[
> {
> "location": "/",
> "tdm-reservation": 1,
> "tdm-policy": "https://btlabs.dev/tdm-policy.json"
> }
> \]

`tdm-reservation: 1` is not a “no TDM” signal, but a “rights reserved” signal. Important in practice: under the working group's interpretation, search and discoverability are considered _not_ covered by the opt-out — so you can stay visible in AI search while at the same time objecting to training.

## 6\. MCP: from document to queryable entity

Perhaps the most important step is the **Model Context Protocol (MCP)**. Instead of letting the AI scrape your site, you offer an authenticated, schema-defined endpoint through which authorized agents read in a targeted way — and act in a controlled way:

> **Policy & Tools · TypeScript**
> // Policy declaration
> export const AI\_ALLOW\_MODEL\_TRAINING = false
> export const AI\_ALLOW\_DATA\_MINING = false
> export const AI\_ATTRIBUTION\_REQUIRED = true
> export const MCP\_ENDPOINT = '/api/mcp'
>
> // Exposed tools — scoped, auditable
> const mcpTools = \[
> 'list\_services',
> 'search\_content',
> 'get\_opening\_hours',
> 'submit\_inquiry', // controlled, not open
> \] as const

The MCP keys' rights can be enabled per area and action — for example read in many areas, write only to defined types. Every action is logged. That is how your website becomes a **queryable entity** — the groundwork for the coming [Agent-to-Agent-Web](https://btlabs.dev/en/ai-automation), in which personal AI assistants compare, request and book on behalf of their users. What that agent readiness actually requires, beyond the chatbot misconception, is explained in [Agent-ready doesn’t mean "bolt on a chatbot"](https://btlabs.dev/en/posts/agent-ready-doesnt-mean-chatbot). How these rights are graded in detail is shown by [a look at granular MCP keys](https://btlabs.dev/en/posts/mcp-keys-granular-rights-per-data-area).

## 7\. Lessons learned from practice

From building the btlabs Core architecture, a few pitfalls that aren't in any specification:

**Avoid silent truncation.** If a feed like `llms-full.txt` loads thousands of documents unpaginated, you risk memory overflow and unnoticed truncated responses. Solution: limit hints (`Showing first N of M`) and cursor-based pagination.

**Multilingual linking.** AI models work across languages. If the Markdown twins lack the [hreflang](https://btlabs.dev/en/glossary/hreflang) analogues (links to translations), you weaken your cross-lingual citation power — which is fatal precisely in a region like [South Tyrol](https://btlabs.dev/en/multilingual-website).

**Don't “decorate” bot protocols.** Inventing your own keywords in `ai.txt` is ineffective — parsers rigidly look for the vocabulary fixed in the proposal. Sticking to the standard beats creativity.

**Resolve placeholders before delivery.** AI crawlers must not read unfinished templates (`{{contactEmail}}`), only the final, verified data. Resolution belongs before the Markdown build, not after.

## 8\. How btlabs Core implements this

In btlabs Core, these building blocks are not a plugin stack but part of the platform. The `llms.txt` is built on the fly from the CMS — with parallel queries to minimize latency:

> **llms.txt build · TypeScript**
> const \[pages, posts, faqs\] = await Promise.all(\[
> cms.find({
> collection: 'pages',
> locale: core.locale,
> where: { and: publishedFilter('pages') },
> limit: 25,
> select: { slug: true, title: true, meta: true },
> }),
> // ...weitere Abfragen
> \])

JSON-LD, hreflang, tdmrep.json, ai.txt and the MCP endpoint are generated from the same data base as the human-facing website — one [single source of truth](https://btlabs.dev/en/glossary/single-source-of-truth) , two output layers. That is exactly the point: the machine-readable layer is not a bolt-on afterthought, but falls out automatically as a by-product.

Why this separation of content and presentation matters for a small business too is explained in [Headless: why the way your website is built matters](https://btlabs.dev/en/posts/headless-how-your-website-is-built).

## Conclusion

The traditional web was built for the human eye. The coming web is an Agent-to-Agent-Web in which AI interfaces talk to each other. The KPIs shift accordingly: away from classic ranking, toward **LLM-Share-of-Voice** and **Citation Probability**.

The technology for it exists today — RAG-friendly structure, llms.txt, JSON-LD, TDM and MCP. Most SMEs simply aren't using it yet. Those who build now build the lead.

One thing matters here: a good Google ranking alone is no longer enough. [First on Google, Invisible in ChatGPT](https://btlabs.dev/en/posts/first-on-google-invisible-in-chatgpt) shows why ranking and AI visibility are two games with their own rules.

If you want to check how well your own site is structured for AI systems, or need help with implementation — [get in touch](https://btlabs.dev/en/contact).

## Sources & standards

- **GEO: Generative Engine Optimization** — Aggarwal, P. et al., ACM SIGKDD 2024\. [arxiv.org/abs/2311.09735](https://arxiv.org/abs/2311.09735)
- **The /llms.txt proposal** — Jeremy Howard, Answer.AI, 2024\. [llmstxt.org](https://llmstxt.org/) · [Original proposal](https://www.answer.ai/posts/2024-09-03-llmstxt.html)
- **W3C TDM Reservation Protocol (TDMRep)** — W3C CG Final Report, 2024\. [w3.org/community/reports/tdmrep](https://www.w3.org/community/reports/tdmrep/CG-FINAL-tdmrep-20240510/)
- **AI Search Has a Citation Problem** — Tow Center for Digital Journalism, Columbia, 2025\. [cjr.org](https://www.cjr.org/tow%5Fcenter/we-compared-eight-ai-search-engines-theyre-all-bad-at-citing-news.php)
- **schema.org** — vocabulary for structured data. [schema.org](https://schema.org)
- **Model Context Protocol (MCP)** — open standard for [AI agent](https://btlabs.dev/en/glossary/ai-agent) interfaces. [modelcontextprotocol.io](https://modelcontextprotocol.io)

_Note: GEO, llms.txt and TDMRep are young, evolving approaches — llms.txt, for instance, is an industry proposal, not a ratified standard. Adoption and impact are growing, but are not formally guaranteed by any major AI provider._

## Frequently asked questions.

**What does GEO get me — why should my website be cited by AI?**

When more and more people get their answers straight from ChatGPT, Perplexity or Google's AI, whether you get found is no longer decided by your Google ranking alone — but by whether the AI names you as a source. That is where GEO (Generative Engine Optimization) comes in: it prepares your content so AI systems can read it correctly, understand it and cite it in their answers. The benefit is concrete: you get a chance of being recommended when a potential customer asks the AI for a provider like you — with clear, independently readable statements, structured data and machine-readable formats. If you're not visible here, you simply don't exist for this growing group of searchers.

**Do I absolutely need an llms.txt?**

It is not a Google ranking signal (Google says so itself) — but it takes minutes to create and is useful as orientation for AI agents. A cheap addition, not a miracle cure.

How widespread it really is, we measure ourselves: as of November 2026, 14.8% of the domains probed serve an llms.txt. The measurement is open in the [ai-discovery-radar](https://btlabs.dev/en/ai-discovery-radar).

**What does my business gain if AI assistants can talk directly to my website?**

Your details are ready exactly where people increasingly ask. Instead of an AI scraping your page and guessing, it reads exactly the content you've provided through an open interface — MCP (Model Context Protocol): services, opening hours, contact details. The aim: fewer incorrect statements about your business and correctly sourced citations — whether an AI uses this route is up to its provider. You stay in control — you decide which content is accessible, and every access is logged.

**Has classic SEO become obsolete with AI search?**

No. Google AI overviews mostly cite pages that already rank well classically. SEO remains the ticket in — AI optimisation (GEO) is the extension with citable answers, structure and visible authority.

Next step

## Want to look at it together?

No pitch, no standard package — an honest take on your project. A reply, usually within 24h.

[Start a conversation →](https://btlabs.dev/en/contact#cta)

## You might also like

- [· How an AI agent reads your business: the four interfaces behind the answer · An AI agent does not open your website the way a person does — it fetches four machine-readable interfaces. Which ones, what happens when one is missing, and the honest limit: 23,520 machine requests in 30 days (as of August 2026), but only four counted citations.](https://btlabs.dev/en/posts/how-ai-agents-read-your-business)
- [· What an AI agent finds on your website: a five-step self-check · Before an AI agent reads your pages, it checks a handful of agreed addresses. You can check five of them yourself with a browser in a few minutes — with what each one means and how common it is.](https://btlabs.dev/en/posts/ai-agent-website-self-check)
- [· The vocabulary machines share · Schema.org is not a format, it is a dictionary — a finite public list of things machines agreed to call by the same name. Invent a word and nobody reads it.](https://btlabs.dev/en/posts/schema-org-vocabulary-explained)

---
Source: https://btlabs.dev/en/posts/from-seo-to-geo-architecture
Languages: [de](https://btlabs.dev/llms/de/posts/von-seo-zu-geo-architektur) · [it](https://btlabs.dev/llms/it/posts/da-seo-a-geo-architettura)
See also: [llms.txt](https://btlabs.dev/llms.txt) · [ai.txt (Policy)](https://btlabs.dev/ai.txt) · [identity.json](https://btlabs.dev/identity.json)
