Sechs praktische Schritte, um dieselbe Site für Menschen und KI-Agenten bereitzustellen — inklusive Copy-Paste-Checkliste
In den letzten vier Tagen habe ich mit Claude Code smarts.md von einer Smart-Contract-Doku-Site für Menschen in eine für AI-Agenten umgebaut.
Das klingt gleich, ist es aber nicht. Eine Site für Menschen optimiert Lesbarkeit, Suche und Ladezeit. Eine Site für AI-Agenten muss andere Fragen beantworten:
robots.txt sie aus?Das sind die sechs Dinge, die ich Claude bauen ließ. Jedes einzelne ist für sich nützlich und lässt sich unabhängig in deine Site übernehmen.
robots.txt ausdrücklich willkommen heißenDie meisten Sites erben ihre robots.txt aus einer alten Vorlage, die jeden unbekannten User-Agent implizit verbietet. Aber ab 2025 sind viele AI-Crawler neue User-Agents — GPTBot, ClaudeBot, PerplexityBot, Applebot-Extended, Google-Extended, CCBot, meta-externalagent und mehr. Wenn du sie reinlassen willst, musst du explizit Allow setzen.
Die robots.txt von smarts startet mit einer Policy-Notiz und listet dann User-agent + Allow: / für 12 Crawler — OpenAI, Anthropic, Perplexity, Google Gemini, Apple, Common Crawl, Meta, Cohere. Die Haltung ist eindeutig: Diese Site existiert, um von KIs gelesen zu werden.
llms.txt — ein Menü für LLMsllms.txt ist eine Konvention, die llmstxt.org vorschlägt: Du legst ein knappes Markdown im Site-Root ab, das dem LLM sagt, was diese Site ist, wie man sie nutzt und wo die wichtigsten Einstiegspunkte liegen. Der Elevator Pitch deiner Site.
Die llms.txt von smarts hat rund 60 Zeilen und enthält:
/{chain}/{address} vs. kurzer Slug)Die zentrale Einsicht: LLMs bezahlen deine Doku in Tokens, also crawlen sie nicht die ganze Site. Gib ihnen einen destillierten Index, und die Trefferquote steigt spürbar.
.well-known/mcp.json — früh setzenDas MCP-Protokoll hat noch keine Discovery-Konvention wie /.well-known/openid-configuration. Heute crawlt kein öffentlicher Client einen festen well-known-Pfad.
Das Manifest zu veröffentlichen kostet trotzdem nur 30 Zeilen:
def well_known_mcp
response.set_header("Cache-Control", "public, max-age=3600")
response.set_header("Access-Control-Allow-Origin", "*")
render json: {
name: "smarts",
version: "0.1.0",
description: "...",
protocol_version: "2024-11-05",
transports: [{ type: "sse", endpoint: "https://smarts.md/mcp/sse" }],
capabilities: { tools: true, resources: false, prompts: false },
tools: MCP_TOOLS.map { |t| { name: t[:name], description: t[:blurb] } }
}
end
Sobald eine Discovery-Konvention steht, muss ich keine Zeile ändern. Gleichzeitig ist das Selbstdokumentation für Entwickler — wer neugierig auf mein MCP ist, macht einfach curl smarts.md/.well-known/mcp.json.
Der Trick: Das tools-Array wird aus der Konstante MCP_TOOLS abgeleitet — Single Source of Truth. Ein vorhandener struktureller Test erzwingt, dass jede app/tools/*_tool.rb in dieser Konstante auftaucht. Dadurch erbt das Manifest kostenlos die Garantie, „neue Tools nicht zu vergessen".
.md-Variante: WebFetch-freundliche Destillation für jede SeiteMein Favorit. Das WebFetch-Tool von Claude Code muss beliebiges HTML selbst säubern und Inhalte extrahieren — Token-teuer und instabil. Was, wenn du .md direkt ausspielst?
Rails' respond_to unterstützt das nativ:
# config/routes.rb
get ":slug(.:format)", to: "contracts#show",
constraints: { slug: ContractSlugs::ROUTE_PATTERN, format: /html|md/ }
https://smarts.md/usdc-eth liefert HTML; https://smarts.md/usdc-eth.md liefert 40 Zeilen Markdown — Adresse, Chain, Klassifizierung, MCP-Endpoint, Anfrage via AI-Agent, Quelllinks.
# USD Coin on Ethereum
- **Address:** `0xa0b8...`
- **Chain:** Ethereum
- **Classification:** ERC-20 Token
## Query via AI agent
- **MCP endpoint:** `https://smarts.md/mcp/sse`
- **Reference:** `usdc-eth`
- **Sample prompt:** "Tell me the current state of usdc-eth"
Ein Fetch, alle strukturierten Inhalte, die ein AI-Agent will, kein DOM-Parser nötig. Claude hat das zügig erledigt — ein Controller, zwei .md.erb-Templates, (.:format) in den Routes, fertig.
Das ist die umgekehrte Entdeckung: Ein Teil meiner Besucher nutzt bereits Claude Code / Cursor / Windsurf. Sie landen auf einer Contract-Seite, und der nächste Impuls ist meist „lass meine KI mal draufschauen".
Also rendert jede Contract-Seite eine Karte mit:
usdc-eth) oder chain/address, mit Copy-Buttonmcp.smarts.md (Einzeiler-Setup)Ein Klick Reibung zwischen „ich schaue mir diesen Contract an" und „ich frage meine KI dazu". Die Karte nutzt eine DaisyUI-Card und einen generischen Stimulus-Controller copy — 50 Zeilen erb. Ein Regressionstest fixiert die data-copy-text-value-Attribute, damit ein späteres Refactor nicht still den falschen String in Nutzer-Clipboards pastet.
OpenGraph, Twitter Card, JSON-LD — die klassische Such- und Social-Card-Schicht. Lohnt sich, weil AI-Crawler hier auch lesen.
Die spannende Entscheidung ist, wie JSON-LD einen Smart Contract beschreiben soll. Claude hat sich für eine WebPage entschieden, die eine SoftwareApplication umschließt:
{
"@type": "WebPage",
"about": {
"@type": "SoftwareApplication",
"name": "USD Coin",
"applicationCategory": "SmartContract",
"operatingSystem": "Ethereum",
"identifier": "0xa0b8..."
}
}
operatingSystem bekommt den Chain-Namen, identifier die Adresse, additionalType die Klassifizierung (z. B. „Uniswap V3 Pool"). schema.org hat keinen eigenen SmartContract-Typ, aber SoftwareApplication plus diese Felder reichen aus, damit ein LLM versteht: „Das ist ein Contract auf Ethereum mit einer bestimmten Adresse."
Das OG-Bild ist ein 1200×630-summary_large_image; Twitter Card, Breadcrumbs, softwareVersion und license runden das Ganze ab.
Die sechs Punkte oben verteilen sich auf sieben PRs in vier Tagen:
| PR | Dateien | Größe |
|---|---|---|
feat/ai-crawler-discovery |
2 | ~126 loc |
feat/well-known-mcp-manifest |
4 | ~129 loc |
feat/markdown-contract-pages |
6 | ~298 loc |
feat/contract-mcp-card |
3 | ~126 loc |
feat/seo-meta-tags |
8 | ~292 loc |
feat/seo-enrichments |
8 | ~189 loc |
feat/og-card |
— | — |
Jeder ist ein eigenständiger PR mit eigenen Tests und Commit-Message. Diese feine Schnittkadenz ist das Wertvollste an der Zusammenarbeit mit Claude — jeder PR ist klein genug, den Diff auf einen Blick zu prüfen, aber gestapelt ergibt sich eine vollständige AI-Oberfläche der Site.
Wenn du eine Content-Site hast und sie AI-freundlich machen willst, geh in dieser Reihenfolge vor:
robots.txt explizit erlauben/llms.txt schreiben (ein destilliertes Menü).md-Variante geben/.well-known/mcp.json veröffentlichenDie ersten fünf wird dir kaum ein SEO-Engineer erzählen — sie stehen nicht im klassischen Playbook. Aber aus vier Tagen Daten bei mir: Die AI-Traffic-Kurve und die Menschen-Traffic-Kurve sind zwei komplett unabhängige Reihen. Man muss beide bedienen.