============================================================
WORDPRESS AI READINESS IMPLEMENTIERUNG
Schritt-fur-Schritt Anleitung: WordPress (Apache)
Stand: 27.05.2026, v7
============================================================
HAFTUNGSAUSSCHLUSS
-------
Die Umsetzung dieser Anleitung erfolgt auf eigene Gefahr.
Grundkenntnisse in der WordPress-Administration sowie
im Umgang mit FTP und Texteditoren sind notwendig.
Es wird empfohlen, vor jedem Eingriff, insbesondere vor
Änderungen an .htaccess und functions.php, eine vollständige
Sicherungskopie der Website und Datenbank anzulegen.
Fehlerhafte Umsetzung führt zu Funktionseinschränkungen
oder Nichtverfügbarkeit der Website.
Erfolg oder ein bestimmtes Ergebnis ist nicht garantiert.
Audit-Scores und Testergebnisse hängen von der agentischen
Technologie, jeweiliger Serverumgebung, Hosting-Setup und
der WordPress-Umgebung ab.
HINWEISE ZUR ANWENDUNG
-----------------------
- Alle Dateien: UTF-8 ohne BOM, LF-Zeilenenden
- Reihenfolge einhalten
- Platzhalter in [eckigen Klammern] vor Verwendung ersetzen
SUCHE / ERSETZE (einmalig vor dem Start):
Suche: deine-domain.com
Ersetze: [deine echte Domain, z.B. meinefirma.de]
Suche: [wordpressinstallationsordner]
Ersetze: [absoluter Serverpfad zum WordPress-Root,
z.B. /var/www/html/ oder /public_html/]
EMPFOHLENE TOOLS
----------------
Texteditor: Sublime Text (sublimetext.com)
Notepad++ (notepad-plus-plus.org)
FTP-Client: FileZilla (filezilla-project.org)
Dreamweaver (adobe.com)
CHECKER
-------
isitagentready.com: https://isitagentready.com
wordlift audit: https://audit.wordlift.io/
Google Rich Results: https://search.google.com/test/rich-results
DATEISTRUKTUR
-------------
Die folgende Übersicht zeigt alle Dateien und Verzeichnisse,
die in dieser Anleitung erstellt werden. Sie dient gleichzeitig
als Checkliste — alle Einträge sollten am Ende vorhanden sein.
wordpress-root/
│
├── .htaccess (bestehend — nicht anfassen)
├── wp-config.php (bestehend — nicht anfassen)
├── robots.txt (Schritt 01 — anpassen)
├── llms.txt (Schritt 02 — neu)
├── llms.en.txt (Schritt 03 — neu)
├── skill.md (Schritt 17 — neu)
├── auth.md (Schritt 23 — neu)
│
├── .well-known/
│ ├── .htaccess (Schritt 09 — neu)
│ ├── api-catalog (Schritt 04 — neu)
│ ├── ucp (Schritt 12 — neu)
│ ├── http-message-signatures-directory (Schritt 11 — neu)
│ ├── oauth-authorization-server (Schritt 13 — neu)
│ ├── openid-configuration (Schritt 14 — neu)
│ ├── oauth-protected-resource (Schritt 15 — neu)
│ ├── mcp.json (Schritt 08 — neu)
│ ├── mcp/
│ │ ├── server-card.json (Schritt 06 — neu)
│ │ └── server-cards.json (Schritt 07 — neu)
│ ├── agent-skills/
│ │ ├── .htaccess (Schritt 10 — neu)
│ │ └── index.json (Schritt 05 — neu)
│ └── webmcp/
│ └── tools.json (Schritt 16 — neu)
│
├── wp-content/
│ └── themes/
│ └── [dein-child-theme]/
│ └── functions.php (Schritte 18, 19, 22, 23 — ergänzen)
│
├── wp-admin/
└── wp-includes/
DNS (ausserhalb WordPress — beim DNS-Provider):
_index._agents.[deine-domain.com] TXT (Schritt 24 — neu)
------------------------------------------------------------
SCHRITT 01 — robots.txt
------------------------------------------------------------
Headline: Konfiguration der robots.txt für AI-Crawler
Beschreibung: Steuert welche Crawler auf welche Bereiche der
Website zugreifen dürfen. AI-Crawler werden
explizit erlaubt. Training-Crawler (ByteSpider,
CCBot) sind auf Allow gesetzt. Für Ausschluss
auf Disallow: / ändern.
Hinweis: Content-Signal ist ein IETF-Draft
(draft-romm-aipref-contentsignals), kein
offizieller RFC 9309-Standard. Google Search
Console meldet die Direktive als "Unknown
directive". AI-Nutzungsrechte werden besser
in llms.txt und .well-known/ucp deklariert.
Verzeichnis: Via FTP: [wordpressinstallationsordner]
ODER WordPress-Admin > SEO-Plugin > Datei-Editor
(Yoast SEO: Werkzeuge > Datei-Editor)
Dateiformat: .txt (keine Endung im Editor)
Aktion: Vollständigen Inhalt ersetzen
INHALT:
# robots.txt / RFC 9309
# Standard
User-agent: *
Disallow: /wp-admin/
Disallow: /wp-login.php
Disallow: /wp-register.php
Disallow: /cgi-bin/
Disallow: /?s=
Disallow: /?preview=
Disallow: /feed/
Disallow: /trackback/
Allow: /wp-admin/admin-ajax.php
Allow: /wp-content/uploads/
Allow: /wp-content/themes/
# Content-Signal: ai-train=no, search=yes, ai-input=no
# OPTIONAL: Content-Signal ist ein IETF-Draft, kein RFC-Standard.
# Google Search Console meldet "Unknown directive".
# AI-Nutzungsrechte werden in llms.txt und .well-known/ucp deklariert.
# AI Crawler
User-agent: GPTBot
Allow: /
Disallow: /wp-admin/
User-agent: ChatGPT-User
Allow: /
User-agent: ClaudeBot
Allow: /
Disallow: /wp-admin/
User-agent: anthropic-ai
Allow: /
User-agent: PerplexityBot
Allow: /
Disallow: /wp-admin/
User-agent: Google-Extended
Allow: /
User-agent: Googlebot-AI
Allow: /
# Training Crawler
User-agent: ByteSpider
Allow: /
User-agent: CCBot
Allow: /
# Sitemap
Sitemap: https://deine-domain.com/sitemap_index.xml
VALIDIERUNG: https://deine-domain.com/robots.txt im Browser,
keine Encoding-Artefakte, kein Umlaut-Fehler
------------------------------------------------------------
SCHRITT 02 — llms.txt (Deutsch)
------------------------------------------------------------
Headline: Erstellen der llms.txt
Beschreibung: Strukturierter Kontext für LLMs und AI-Agenten.
Markdown-Format gemäß llmstxt.org-Spezifikation.
Die erste Zeile (> ...) ist Pflichtfeld gemäß Spec.
Referenz: https://llmstxt.org
Verzeichnis: [wordpressinstallationsordner] (= WordPress-Root,
erreichbar unter https://deine-domain.com/llms.txt)
Dateiformat: .txt (Markdown-Syntax, UTF-8 ohne BOM)
Aktion: Neuerstellung
INHALT:
) am Ende löschen.
5. Datei speichern als: llms.txt — UTF-8 ohne BOM, LF-Zeilenenden.
-->
# [Firmenname / Markenname]
> [Pflichtfeld: Ein Satz — Was macht das Unternehmen, für wen, wo.
> Beispiel: Digitalagentur aus Hamburg für Markendesign,
> WordPress-Entwicklung und KI-Beratung im DACH-Raum.]
## Unternehmen
- **Firmenname**: [Offizieller Name inkl. Rechtsform, z.B. Muster GmbH]
- **Kurzname / Marke**: [Bekannter Name / Marke]
- **Gründung**: [Jahr]
- **Rechtsform**: [GmbH / UG / GbR / Einzelunternehmen / Freelancer]
- **Standort**: [Stadt, Land]
- **Website**: https://deine-domain.com/
- **Sprache**: [Deutsch / Englisch / mehrsprachig]
## Positionierung
[2–4 Sätze: Wer seid ihr, was unterscheidet euch, wen bedient ihr.
Für Agenturen: Kernkompetenz + Zielgruppe + Alleinstellungsmerkmal.
Für Freelancer: Spezialisierung + Arbeitsweise + Zielbranche.
Für KMU: Produkt/Dienstleistung + Region + Kundenprofil.]
## Dienstleistungen / Angebot
- [Leistung 1, z.B. Webdesign & WordPress-Entwicklung]
- [Leistung 2, z.B. Corporate Design & Branding]
- [Leistung 3, z.B. SEO & AI Readiness Optimierung]
- [Leistung 4 — optional]
- [Leistung 5 — optional]
- [Produkt oder Paket — optional, z.B. "Starter-Paket ab 990 €"]
## Technologie-Stack
- [z.B. WordPress, Elementor Pro, WooCommerce]
- [z.B. Adobe Creative Suite, Figma]
- [z.B. Apache, PHP, MySQL]
- [z.B. Shopify, Webflow — falls zutreffend]
- [weitere — optional]
## Spezialisierungen
- [Branche, z.B. B2B-Unternehmen, Handwerk, Gastronomie]
- [Zielgruppe, z.B. Mittelstand, Start-ups, Einzelpersonen]
- [Thema, z.B. AI Readiness, Barrierefreiheit, Core Web Vitals]
- [Region — optional, z.B. DACH, Berlin, Bayern]
## Arbeitsweise
[2–3 Sätze: Wie arbeitest du / arbeitet ihr.
Remote/vor Ort, Prozess, Kommunikation, Projektstruktur.
Für Freelancer: Verfügbarkeit, Zeitzonen, Reaktionszeit.]
## Referenzen
- [Projektname oder Beschreibung, Branche, Jahr]
- [Projektname — optional]
- [Portfolio-URL — optional: https://deine-domain.com/referenzen/]
## Auszeichnungen & Zertifizierungen
- [z.B. Google Partner, Meta Business Partner, Adobe Certified]
- [z.B. Auszeichnung XY, Jahr]
- [Abschnitt löschen wenn nicht relevant]
## Kundenstimmen
- "[Zitat]" — [Vorname Name, Unternehmen]
- "[Zitat]" — [Vorname Name, Funktion]
- [Nur mit ausdrücklicher Erlaubnis der Person verwenden]
- [Abschnitt löschen wenn nicht relevant]
## Blog & Ressourcen
- Thema: [z.B. WordPress-Tutorials, KI-Praxis, Branchenthemen]
- URL: https://deine-domain.com/blog/
- [Abschnitt löschen wenn kein Blog vorhanden]
## Social Media
- LinkedIn: [https://www.linkedin.com/in/... oder /company/...]
- [Instagram: URL — optional]
- [Facebook: URL — optional]
- [YouTube: URL — optional]
- [weitere — optional]
## Projektanfrage / Kontakt
- Kontaktformular: https://deine-domain.com/kontakt/
- E-Mail: [kontakt@deine-domain.com]
- Telefon: [+49 ... — optional]
- [Buchungslink, z.B. Calendly — optional]
## Metadaten
- Letzte Aktualisierung: [JJJJ-MM-TT]
- Sprache: Deutsch
- Version: 1.0
VALIDIERUNG: https://deine-domain.com/llms.txt —
Klartext, Markdown-Syntax sichtbar, UTF-8 korrekt
------------------------------------------------------------
SCHRITT 03 — llms.en.txt (Englisch)
------------------------------------------------------------
Headline: Erstellen der llms.en.txt (Englisch)
Beschreibung: Englischsprachige Version der llms.txt für
internationale AI-Systeme und Crawler.
Verzeichnis: [wordpressinstallationsordner]
Dateiformat: .txt (Markdown-Syntax, UTF-8 ohne BOM)
Aktion: Neuerstellung
VORGEHEN — Übersetzung per KI-Prompt:
Öffne ChatGPT, Claude oder ein anderes LLM deiner Wahl
und sende folgenden Prompt (llms.txt-Inhalt einfügen):
---PROMPT---
Translate the following llms.txt file from German to English.
Keep the Markdown structure and all URLs unchanged.
Replace "Letzte Aktualisierung" with "Last updated"
and "Sprache: Deutsch" with "Language: English".
Do not add any commentary, only return the translated file content.
[Hier vollständigen Inhalt deiner llms.txt einfügen]
---ENDE PROMPT---
Ergebnis als llms.en.txt speichern.
VALIDIERUNG: https://deine-domain.com/llms.en.txt
------------------------------------------------------------
SCHRITT 04 — .well-known/api-catalog
------------------------------------------------------------
Headline: Erstellen des API Catalog (RFC 9264)
Beschreibung: Deklariert verfügbare APIs der Domain für
AI-Agents und Discovery-Clients. Format: RFC 9264
Linkset mit service-doc und status.
Content-Type: application/linkset+json
(nicht application/json — Schritt 09 beachten).
Verzeichnis: [wordpressinstallationsordner].well-known/
Dateiformat: Keine Endung (JSON-Inhalt)
Aktion: Neuerstellung
INHALT:
{
"linkset": [
{
"anchor": "https://deine-domain.com/",
"service-doc": [
{
"href": "https://deine-domain.com/wp-json/",
"type": "application/json",
"title": "WordPress REST API Discovery"
}
],
"status": [
{
"href": "https://deine-domain.com/wp-json/",
"type": "application/json"
}
]
}
]
}
VALIDIERUNG: https://deine-domain.com/.well-known/api-catalog
------------------------------------------------------------
SCHRITT 05 — .well-known/agent-skills/index.json
------------------------------------------------------------
Headline: Erstellen der Agent Skills Deklaration
Beschreibung: Beschreibt welche Aktionen AI-Agents auf der
Domain ausführen können. Verweist auf real
existierende REST-API-Endpunkte.
Verzeichnis: [wordpressinstallationsordner].well-known/agent-skills/
(Unterverzeichnis anlegen)
Dateiformat: .json
Aktion: Neuerstellung (inkl. Verzeichnis)
INHALT:
{
"version": "1.0",
"provider": {
"name": "[Firmenname / Markenname]", // Offizieller Name
"url": "https://deine-domain.com/",
"contact": "[kontakt@deine-domain.com]" // Kontakt-E-Mail
},
"skills": [
{
"name": "search",
"type": "search",
"description": "Search website content via WordPress REST API.",
"endpoint": "https://deine-domain.com/wp-json/wp/v2/search",
"method": "GET",
"parameters": {
"search": "Search term (string)",
"per_page": "Results per page (integer, max 20)"
}
},
{
"name": "content",
"type": "read",
"description": "Retrieve pages and posts.",
"endpoint": "https://deine-domain.com/wp-json/wp/v2/pages",
"method": "GET",
"parameters": {
"per_page": "Number of results (integer)",
"_fields": "id,title,link,excerpt"
}
},
{
"name": "contact",
"type": "contact",
"description": "Contact form available at /kontakt/. Human interaction required.",
"endpoint": "https://deine-domain.com/kontakt/", // URL anpassen
"method": "GET"
}
]
}
VALIDIERUNG: https://deine-domain.com/.well-known/agent-skills/index.json
------------------------------------------------------------
SCHRITT 06 — .well-known/mcp/server-card.json
------------------------------------------------------------
Headline: Erstellen der MCP Server Card
Beschreibung: Deklariert MCP-Präsenz (Model Context Protocol).
Enthält serverInfo-Objekt (Pflichtfeld), Capabilities
und Resources. protocolVersion: 2024-11-05.
Verzeichnis: [wordpressinstallationsordner].well-known/mcp/
(Unterverzeichnis anlegen)
Dateiformat: .json
Aktion: Neuerstellung (inkl. Verzeichnis)
INHALT:
{
"schema_version": "v1",
"protocolVersion": "2024-11-05",
"serverInfo": {
"name": "[Firmenname] Web Server", // Pflichtfeld
"version": "1.0.0"
},
"name": "[Firmenname] Web Server",
"description": "[Kurzbeschreibung in einem Satz]",
"url": "https://deine-domain.com/",
"contact": {
"email": "[kontakt@deine-domain.com]",
"url": "https://deine-domain.com/kontakt/"
},
"capabilities": {
"tools": false,
"resources": true,
"prompts": false
},
"resources": [
{
"uri": "https://deine-domain.com/",
"name": "Startseite",
"mimeType": "text/html"
},
{
"uri": "https://deine-domain.com/llms.txt",
"name": "LLM Context",
"mimeType": "text/plain"
},
{
"uri": "https://deine-domain.com/wp-json/",
"name": "WordPress REST API Discovery",
"mimeType": "application/json"
}
]
}
VALIDIERUNG: https://deine-domain.com/.well-known/mcp/server-card.json
------------------------------------------------------------
SCHRITT 07 — .well-known/mcp/server-cards.json
------------------------------------------------------------
Headline: Erstellen der MCP Server Cards (Plural-Variante)
Beschreibung: Identischer Inhalt wie server-card.json.
Checker prüfen beide Pfade — beide müssen HTTP 200
zurückgeben.
Verzeichnis: [wordpressinstallationsordner].well-known/mcp/
Dateiformat: .json
Aktion: Neuerstellung (gleicher Inhalt wie Schritt 06)
VALIDIERUNG: https://deine-domain.com/.well-known/mcp/server-cards.json
------------------------------------------------------------
SCHRITT 08 — .well-known/mcp.json
------------------------------------------------------------
Headline: Erstellen der mcp.json im .well-known-Root
Beschreibung: Dritte MCP-Variante direkt im .well-known/-Root.
Checker prüfen alle drei Pfade.
Verzeichnis: [wordpressinstallationsordner].well-known/
(NICHT im mcp/-Unterverzeichnis)
Dateiformat: .json
Aktion: Neuerstellung (gleicher Inhalt wie Schritt 06)
VALIDIERUNG: https://deine-domain.com/.well-known/mcp.json
------------------------------------------------------------
SCHRITT 09 — .well-known/.htaccess
------------------------------------------------------------
Headline: Content-Type-Header für .well-known/-Verzeichnis
Beschreibung: Setzt korrekte Content-Type-Header für alle Dateien
im .well-known/-Verzeichnis. Eigene .htaccess im
Unterverzeichnis — kein Eingriff in Root-.htaccess.
Voraussetzung: mod_headers aktiv.
api-catalog: application/linkset+json (RFC 9264)
http-message-signatures-directory: application/jwk-set+json (RFC 7517)
Alle anderen endungslosen Dateien: application/json
Verzeichnis: [wordpressinstallationsordner].well-known/
Dateiformat: .htaccess (keine Endung)
Aktion: Neuerstellung
INHALT:
Header set Content-Type "application/linkset+json; charset=utf-8"
Header set Content-Type "application/json; charset=utf-8"
Header set Content-Type "application/json; charset=utf-8"
Header set Content-Type "application/jwk-set+json; charset=utf-8"
Header set Content-Type "application/json; charset=utf-8"
Header set Content-Type "application/json; charset=utf-8"
Header set Content-Type "application/json; charset=utf-8"
Options -Indexes
VALIDIERUNG: https://deine-domain.com/.well-known/api-catalog
→ Browser zeigt JSON-Baum (nicht Rohtext)
------------------------------------------------------------
SCHRITT 10 — .well-known/agent-skills/.htaccess
------------------------------------------------------------
Headline: CORS und Content-Type für agent-skills/
Beschreibung: Externe Checker benötigen CORS-Header um
index.json als JSON zu parsen.
Verzeichnis: [wordpressinstallationsordner].well-known/agent-skills/
Dateiformat: .htaccess (keine Endung)
Aktion: Neuerstellung
INHALT:
Header set Content-Type "application/json; charset=utf-8"
Header set Access-Control-Allow-Origin "*"
Header set Access-Control-Allow-Methods "GET, OPTIONS"
VALIDIERUNG: https://deine-domain.com/.well-known/agent-skills/index.json
→ Browser zeigt JSON-Baum
------------------------------------------------------------
SCHRITT 11 — .well-known/http-message-signatures-directory
------------------------------------------------------------
Headline: Erstellen des HTTP Message Signatures Directory (JWKS)
Beschreibung: Publiziert den öffentlichen Schlüssel der Domain
als JSON Web Key Set (RFC 7517) für Web Bot Auth /
HTTP Message Signatures (RFC 9421).
Vorbereitung für zukünftige Bot-/Agenten-
Authentifizierung — in der Praxis noch kaum
real eingesetzt. Implementierung sichert
Discovery-Kompatibilität und ist zukunftssicher.
Wichtig: Kein leeres keys-Array mehr — echtes JWKS
mit EC P-256 Public Key (isitagentready prüft dies).
Content-Type: application/jwk-set+json (Schritt 09).
SCHLÜSSEL GENERIEREN (einmalig, lokal):
OpenSSL (Terminal / Git Bash):
openssl ecparam -name prime256v1 -genkey -noout -out domain_ec.pem
openssl ec -in domain_ec.pem -pubout -out domain_ec_pub.pem
Python (x und y aus Public Key extrahieren):
from cryptography.hazmat.primitives.serialization import load_pem_public_key
import base64, json
pub = load_pem_public_key(open('domain_ec_pub.pem','rb').read())
n = pub.public_numbers()
def b64(v): return base64.urlsafe_b64encode(v.to_bytes(32,'big')).rstrip(b'=').decode()
print(json.dumps({"x": b64(n.x), "y": b64(n.y)}, indent=2))
Private Key (domain_ec.pem) bleibt lokal — wird nicht deployed.
Nur Public Key (x, y) kommt in die Datei unten.
Verzeichnis: [wordpressinstallationsordner].well-known/
Dateiformat: Keine Endung (JSON-Inhalt)
Aktion: Neuerstellung
INHALT:
{
"keys": [
{
"kty": "EC",
"crv": "P-256",
"use": "sig",
"kid": "[kurzname]-sig-1",
"alg": "ES256",
"x": "[base64url-encoded x-Koordinate]",
"y": "[base64url-encoded y-Koordinate]"
}
]
}
VALIDIERUNG: https://deine-domain.com/.well-known/http-message-signatures-directory
→ JSON mit keys-Array, ein Eintrag mit x und y
------------------------------------------------------------
SCHRITT 12 — .well-known/ucp
------------------------------------------------------------
Headline: Erstellen der Universal Content Permissions
Beschreibung: Deklariert Content-Nutzungsrechte für AI-Systeme.
ai_retrieval: yes = Inhalte dürfen abgerufen werden.
ai_training: no = Training-Datensätze ausgeschlossen.
Werte nach Bedarf anpassen.
Verzeichnis: [wordpressinstallationsordner].well-known/
Dateiformat: Keine Endung (JSON-Inhalt)
Aktion: Neuerstellung
INHALT:
{
"version": "1.0",
"site": "https://deine-domain.com/",
"permissions": {
"ai_training": "no", // "yes" wenn Training erlaubt
"ai_retrieval": "yes",
"ai_indexing": "yes",
"ai_summarization": "yes"
},
"attribution": {
"required": true,
"format": "[Firmenname] (https://deine-domain.com/)"
},
"contact": "[kontakt@deine-domain.com]"
}
VALIDIERUNG: https://deine-domain.com/.well-known/ucp
------------------------------------------------------------
SCHRITT 13 — .well-known/oauth-authorization-server
------------------------------------------------------------
Headline: Erstellen des OAuth Authorization Server Metadata
Beschreibung: Deklariert OAuth 2.0 Authorization Server gemäß
RFC 8414. Enthält agent_auth-Block für AI-Agent-
Registrierung (WorkOS auth.md-Protokoll).
register_uri verweist auf echten REST-Endpoint
(Schritt 23 — functions.php).
Verzeichnis: [wordpressinstallationsordner].well-known/
Dateiformat: Keine Endung (JSON-Inhalt)
Aktion: Neuerstellung
INHALT:
{
"issuer": "https://deine-domain.com",
"authorization_endpoint": "https://deine-domain.com/wp-login.php",
"token_endpoint": "https://deine-domain.com/wp-json/jwt-auth/v1/token",
"response_types_supported": ["code"],
"grant_types_supported": ["authorization_code"],
"token_endpoint_auth_methods_supported": ["none"],
"agent_auth": {
"skill": "https://deine-domain.com/auth.md",
"register_uri": "https://deine-domain.com/wp-json/[kurzname]/v1/agent-auth",
"claim_uri": "https://deine-domain.com/wp-json/[kurzname]/v1/agent-auth/claim",
"revocation_uri": "https://deine-domain.com/wp-json/[kurzname]/v1/agent-auth/revoke",
"identity_types_supported": ["anonymous"],
"anonymous": {
"credential_types_supported": ["api_key"]
}
}
}
HINWEIS: [kurzname] durch Kurzform deiner Domain ersetzen,
z.B. "mutter" für mutter.de.
Der Endpoint wird in Schritt 23 (functions.php)
als custom WordPress REST Route registriert.
VALIDIERUNG: https://deine-domain.com/.well-known/oauth-authorization-server
------------------------------------------------------------
SCHRITT 14 — .well-known/openid-configuration
------------------------------------------------------------
Headline: Erstellen der OpenID Connect Discovery
Beschreibung: OpenID Connect Discovery Endpoint für
AI-Agent-Authentifizierung.
Verzeichnis: [wordpressinstallationsordner].well-known/
Dateiformat: Keine Endung (JSON-Inhalt)
Aktion: Neuerstellung
INHALT:
{
"issuer": "https://deine-domain.com",
"authorization_endpoint": "https://deine-domain.com/wp-login.php",
"token_endpoint": "https://deine-domain.com/wp-json/jwt-auth/v1/token",
"response_types_supported": ["code"],
"subject_types_supported": ["public"],
"id_token_signing_alg_values_supported": ["RS256"]
}
VALIDIERUNG: https://deine-domain.com/.well-known/openid-configuration
------------------------------------------------------------
SCHRITT 15 — .well-known/oauth-protected-resource
------------------------------------------------------------
Headline: Erstellen des OAuth Protected Resource Metadata
Beschreibung: Deklariert die Domain als OAuth-geschützte
Ressource gemäß RFC 9728. scopes_supported
ist Pflichtfeld für auth.md-Checker.
Verzeichnis: [wordpressinstallationsordner].well-known/
Dateiformat: Keine Endung (JSON-Inhalt)
Aktion: Neuerstellung
INHALT:
{
"resource": "https://deine-domain.com",
"authorization_servers": ["https://deine-domain.com"],
"bearer_methods_supported": ["header"],
"scopes_supported": ["read"],
"resource_documentation": "https://deine-domain.com/wp-json/"
}
VALIDIERUNG: https://deine-domain.com/.well-known/oauth-protected-resource
------------------------------------------------------------
SCHRITT 16 — .well-known/webmcp/tools.json
------------------------------------------------------------
Headline: Erstellen der WebMCP Tools-Deklaration
Beschreibung: Deklariert WebMCP-Tools für Checker wie
wordlift audit. Leeres tools-Array ist valide
für Basis-Discovery.
Verzeichnis: [wordpressinstallationsordner].well-known/webmcp/
(Unterverzeichnis anlegen)
Dateiformat: .json
Aktion: Neuerstellung (inkl. Verzeichnis)
INHALT:
{
"version": "1.0",
"tools": []
}
VALIDIERUNG: https://deine-domain.com/.well-known/webmcp/tools.json
------------------------------------------------------------
SCHRITT 17 — skill.md
------------------------------------------------------------
Headline: Erstellen der skill.md Capabilities-Datei
Beschreibung: Markdown-Datei die Site-Capabilities für
AI-Agents beschreibt. Von wordlift und ähnlichen
Checkern erwartet.
Verzeichnis: [wordpressinstallationsordner]
Dateiformat: .md
Aktion: Neuerstellung
INHALT:
# [Firmenname] — Skills
## Search
Search website content via WordPress REST API.
Endpoint: https://deine-domain.com/wp-json/wp/v2/search?search={query}
## Content
Retrieve pages and posts.
Endpoint: https://deine-domain.com/wp-json/wp/v2/pages
## Contact
Contact form available at: https://deine-domain.com/kontakt/
Human interaction required.
VALIDIERUNG: https://deine-domain.com/skill.md
------------------------------------------------------------
SCHRITT 18 — functions.php: WebMCP Head Tags
------------------------------------------------------------
Headline: WebMCP Discovery-Tags im HTML-Head
Beschreibung: Fügt vier Discovery-Tags in den
ein:
meta name="mcp-server", link rel="mcp",
link rel="llms-txt", link rel="api-catalog".
Diese Tags ergänzen die HTTP Link-Header
(Schritt 21) — unterschiedliche Ebenen,
kein Konflikt.
Verzeichnis: [wordpressinstallationsordner]wp-content/themes/
[dein-child-theme]/
Dateiformat: .php (bestehend — Ergänzung)
Aktion: Am Ende der functions.php anhängen
CODE:
// === AI Readiness: Discovery-Tags im ===
add_action( 'wp_head', function() {
echo '' . "\n";
echo '' . "\n";
echo '' . "\n";
echo '' . "\n";
}, 1 );
VALIDIERUNG: Rechtsklick → Seitenquelltext → nach "mcp-server" suchen
------------------------------------------------------------
SCHRITT 19 — functions.php: Markdown Content Negotiation
------------------------------------------------------------
Headline: Markdown-Ausgabe für AI-Agents
Beschreibung: Liefert Seiteninhalte als text/markdown wenn
AI-Agent Accept: text/markdown sendet oder
?format=markdown Parameter gesetzt ist.
Reagiert auf Homepage und alle Singular-Seiten.
Nutzt apply_filters('the_content') für alle
Pagebuilder (Elementor, WPBakery, Gutenberg).
WPBakery-Shortcodes werden bereinigt.
base64-Blobs und leere Links werden entfernt.
Setzt Vary: Accept Header.
Verzeichnis: [wordpressinstallationsordner]wp-content/themes/
[dein-child-theme]/
Dateiformat: .php (bestehend — Ergänzung)
Aktion: Am Ende der functions.php anhängen (nach Schritt 18)
CODE:
// === AI Readiness: Markdown via ?format=markdown und Accept: text/markdown ===
add_action('template_redirect', function () {
$via_param = isset($_GET['format']) && $_GET['format'] === 'markdown';
$via_header = (
isset($_SERVER['HTTP_ACCEPT']) &&
stripos($_SERVER['HTTP_ACCEPT'], 'text/markdown') !== false
);
if (!$via_param && !$via_header) {
return;
}
if (is_admin() || wp_doing_ajax() || wp_doing_cron()) {
return;
}
$post = null;
if (is_front_page()) {
$front_id = (int) get_option('page_on_front');
if ($front_id > 0) {
$post = get_post($front_id);
}
} elseif (is_singular()) {
$post = get_queried_object();
}
if (!$post instanceof WP_Post) {
status_header(404);
header('Content-Type: text/markdown; charset=UTF-8');
echo "# Not found\n";
exit;
}
$title = wp_strip_all_tags(get_the_title($post));
$title = str_replace("\xC2\xAD", '', $title);
// apply_filters('the_content') funktioniert für alle Pagebuilder.
// Elementor hängt sich selbst in diesen Filter ein.
$content = apply_filters('the_content', $post->post_content);
$md = $content;
$md = str_replace("\xC2\xAD", '', $md);
$md = html_entity_decode($md, ENT_QUOTES | ENT_HTML5, 'UTF-8');
$md = preg_replace('/
HINWEIS aggregateRating:
Nur einfügen wenn verifizierte Quelle vorhanden.
Beispiel für Google Business Profile:
"aggregateRating": {
"@type": "AggregateRating",
"ratingValue": "[z.B. 4.8]",
"reviewCount": "[Anzahl]",
"bestRating": "5",
"worstRating": "1",
"url": "[Google Maps URL deines Eintrags]"
},
VALIDIERUNG: https://search.google.com/test/rich-results?url=https://deine-domain.com/
→ 0 Fehler, 0 Warnungen
------------------------------------------------------------
SCHRITT 21 — Root-.htaccess: llms.txt + auth.md Content-Type
------------------------------------------------------------
Headline: UTF-8 Content-Type für Root-Dateien
Beschreibung: Setzt korrekten Content-Type für llms.txt,
llms.en.txt und auth.md im WordPress-Root.
Standard-WordPress setzt keinen charset für
diese Dateitypen — führt zu Encoding-Fehlern
bei manchen Checkern.
Einfügestelle: VOR # BEGIN WordPress
WICHTIG: Vor Bearbeitung Root-.htaccess per FTP sichern.
Verzeichnis: [wordpressinstallationsordner] (Root-.htaccess)
Dateiformat: .htaccess (bestehend — Ergänzung)
Aktion: Block VOR # BEGIN WordPress einfügen
CODE:
Header set Content-Type "text/plain; charset=utf-8"
Header set Content-Type "text/plain; charset=utf-8"
Header set Content-Type "text/markdown; charset=utf-8"
VALIDIERUNG: curl -I https://deine-domain.com/llms.txt
→ Content-Type: text/plain; charset=utf-8
------------------------------------------------------------
SCHRITT 22 — Root-.htaccess: Link Response Headers (RFC 8288)
------------------------------------------------------------
Headline: HTTP Link-Header für Agent Discovery
Beschreibung: Sendet Link-Header im HTTP-Response auf Apache-
Ebene, damit AI-Agents maschinenlesbare Ressourcen
per RFC 8288 und RFC 9727 Section 3 entdecken
können. Apache-Ebene ist stabiler als PHP —
Header werden bei jeder Response gesetzt,
unabhängig von Cache, PHP-Ausführung oder
WordPress-Status. Orientiert an aktuellen
Agent-Discovery-Konventionen (an RFC 8288
angelehnt — Link-Relations gemäß IANA).
WICHTIG — Cache-Plugins (WP Fastest Cache, W3 Total Cache,
WP Super Cache): PHP-basierte Lösungen
(send_headers-Hook) sind mit diesen Plugins nicht
stabil — Cache liefert statische HTML-Dateien ohne
PHP-Ausführung aus. Apache-.htaccess ist die einzig
zuverlässige Alternative.
Verzeichnis: [wordpressinstallationsordner] (Root-.htaccess)
Dateiformat: .htaccess (bestehend — Ergänzung)
Aktion: Block ans Ende der Root-.htaccess anhängen
(nach # END WordPress)
Vorher: aktuellen Stand per FTP sichern.
CODE:
# BEGIN AI Readiness Link Headers
Header always add Link "; rel=\"api-catalog\""
Header always add Link "; rel=\"llms-txt\""
Header always add Link "; rel=\"describedby\""
Header always add Link "; rel=\"service-doc\""
# END AI Readiness Link Headers
VALIDIERUNG: curl -I https://deine-domain.com/
→ vier Link-Header sichtbar, keine Duplikate
(Windows CMD: curl -I https://deine-domain.com/
ohne grep — manuell nach "link:" suchen)
------------------------------------------------------------
SCHRITT 23 — functions.php: WebMCP registerTool()
------------------------------------------------------------
Headline: WebMCP Tools für AI-Agents registrieren (experimentell)
Beschreibung: Registriert Site-Tools via navigator.modelContext.
registerTool() — wird von isitagentready.com auf
checks.discovery.webMcp geprüft.
WICHTIG: navigator.modelContext ist eine
experimentelle Browser-API, aktuell nur in
Chrome Canary mit aktiviertem WebMCP-Flag
verfügbar. Kein produktiver Web-Standard.
In allen anderen Browsern No-op ohne Fehler.
Implementierung sinnvoll für Checker-Kompatibilität
— nicht als produktive Plattformtechnologie werten.
credentials:omit verhindert Cookie-Übertragung.
URL-Konstruktor für korrektes Parameter-Encoding.
per_page auf 1–20 geclampt.
wp_footer Priority 100 — nach allen Plugin-Scripts.
Tool-Namen mit Kurzname-Präfix — keine Kollision.
Verzeichnis: [wordpressinstallationsordner]wp-content/themes/
[dein-child-theme]/
Dateiformat: .php (bestehend — Ergänzung)
Aktion: Am Ende der functions.php anhängen (nach Schritt 22)
CODE:
// === AI Readiness: WebMCP registerTool() ===
add_action('wp_footer', function () {
if (is_admin() || wp_doing_ajax() || wp_doing_cron()) {
return;
}
?>
suchen
------------------------------------------------------------
SCHRITT 24 — functions.php: Agent Auth REST Endpoint
------------------------------------------------------------
Headline: Agent Registration Endpoint (auth.md)
Beschreibung: Registriert drei custom WordPress REST Routen
für anonyme AI-Agent-Registrierung gemäß
WorkOS auth.md-Protokoll (Stand: 2026-05,
Draft-Status — Protokoll noch nicht finalisiert).
Endpoint POST /wp-json/[kurzname]/v1/agent-auth
nimmt type=anonymous entgegen und gibt api_key
zurück (symbolisch — read-only Public Access).
Wird von isitagentready.com auf
agent_auth.register_uri geprüft.
Verzeichnis: [wordpressinstallationsordner]wp-content/themes/
[dein-child-theme]/
Dateiformat: .php (bestehend — Ergänzung)
Aktion: Am Ende der functions.php anhängen (nach Schritt 23)
CODE:
// === AI Readiness: Agent Auth REST Endpoint (auth.md) ===
add_action( 'rest_api_init', function() {
// POST /wp-json/[kurzname]/v1/agent-auth
register_rest_route( '[kurzname]/v1', '/agent-auth', [
'methods' => 'POST',
'callback' => function( WP_REST_Request $req ) {
$type = sanitize_text_field( $req->get_param( 'type' ) );
if ( $type !== 'anonymous' ) {
return new WP_Error( 'unsupported_type', 'Only anonymous registration supported.', [ 'status' => 400 ] );
}
return rest_ensure_response( [
'credential' => 'public-read-' . wp_generate_uuid4(),
'credential_type' => 'api_key',
'scopes' => [ 'read' ],
'note' => 'Read-only public access. No credential required for GET endpoints.'
] );
},
'permission_callback' => '__return_true',
] );
// POST /wp-json/[kurzname]/v1/agent-auth/claim
register_rest_route( '[kurzname]/v1', '/agent-auth/claim', [
'methods' => 'POST',
'callback' => function() {
return rest_ensure_response( [ 'status' => 'not_implemented' ] );
},
'permission_callback' => '__return_true',
] );
// POST /wp-json/[kurzname]/v1/agent-auth/revoke
register_rest_route( '[kurzname]/v1', '/agent-auth/revoke', [
'methods' => 'POST',
'callback' => function() {
return rest_ensure_response( [ 'status' => 'revoked' ] );
},
'permission_callback' => '__return_true',
] );
} );
HINWEIS: [kurzname] durch identischen Wert wie in Schritt 13
ersetzen, z.B. "mutter" für mutter.de.
VALIDIERUNG: curl -X POST https://deine-domain.com/wp-json/[kurzname]/v1/agent-auth
-H "Content-Type: application/json"
-d '{"type":"anonymous","requested_credential_type":"api_key"}'
→ HTTP 200, JSON mit credential und scopes
------------------------------------------------------------
SCHRITT 25 — auth.md (Agent Registration Guide)
------------------------------------------------------------
Headline: Erstellen der auth.md
Beschreibung: Maschinenlesbare Registrierungsanleitung für
AI-Agents gemäß WorkOS auth.md-Protokoll
(Stand: 2026-05, Draft-Status).
Beschreibt welche Registrierungsflows die Domain
unterstützt. Wird von isitagentready.com auf
Existenz, Heading "# Auth.md", vollständige
Registrierungsmethode und Verweis auf
oauth-protected-resource geprüft.
Content-Type: text/markdown (Schritt 21 beachten).
Verzeichnis: [wordpressinstallationsordner]
Dateiformat: .md
Aktion: Neuerstellung
INHALT:
# Auth.md — Agent Registration for deine-domain.com
## Step 1 — Discover
- Protected Resource Metadata: https://deine-domain.com/.well-known/oauth-protected-resource
- Authorization Server (incl. agent_auth block): https://deine-domain.com/.well-known/oauth-authorization-server
## Step 2 — Pick a method
deine-domain.com supports **anonymous** registration. No user identity required.
- No identity available → `anonymous`
## Step 3 — Register (Anonymous)
```http
POST https://deine-domain.com/wp-json/[kurzname]/v1/agent-auth
Content-Type: application/json
{
"type": "anonymous",
"requested_credential_type": "api_key"
}
```
Success response:
```json
{
"credential": "",
"credential_type": "api_key",
"scopes": ["read"]
}
```
## Scopes
- `read` — public content, pages, posts
## Revocation
```http
POST https://deine-domain.com/wp-json/[kurzname]/v1/agent-auth/revoke
Content-Type: application/json
{
"api_key": ""
}
```
Contact: [kontakt@deine-domain.com]
VALIDIERUNG: https://deine-domain.com/auth.md
→ Markdown-Ausgabe, Heading "# Auth.md" sichtbar
------------------------------------------------------------
SCHRITT 26 — DNS for AI Discovery (DNS-AID) — OPTIONAL
------------------------------------------------------------
Headline: DNS TXT-Record für AI Agent Discovery
Beschreibung: Publiziert DNS-basierten Discovery-Record für
AI-Agents gemäß DNS-AID-Spezifikation.
HINWEIS: DNS-AID ist ein IETF-Draft
(draft-mozleywilliams-dnsop-dnsaid,
Stand: 2026-03). Kein finalisierter Standard.
Die Spezifikation kann sich noch ändern.
AID v1.x verwendet TXT-Records als kanonischen
Mechanismus — universell unterstützt.
SVCB/HTTPS-Records (Typ 99) sind laut Spec der
bevorzugte Weg, werden aber von vielen deutschen
Hostern noch nicht im DNS-Panel angeboten.
TXT ist der empfohlene Fallback für v1.x.
Der Record wird beim DNS-Provider angelegt,
nicht im WordPress-Root.
AKTION: DNS-Panel des Hosters → neuen TXT-Record anlegen
RECORD:
Name: _index._agents
Typ: TXT
TTL: 600 (oder Provider-Standard)
Wert: v=aid1; proto=mcp; endpoint=https://www.deine-domain.com/.well-known/mcp/server-card.json
HINWEIS SVCB (Typ 99):
Falls der Hoster SVCB unterstützt (z.B. Cloudflare, Route 53):
Name: _index._agents
Typ: HTTPS (oder SVCB)
TTL: 600
Wert: 1 . alpn="h2" port=443 params="endpoint=/.well-known/mcp/server-card.json"
PROPAGATION:
DNS-Records propagieren bis zu 24h.
Test: https://dns.google/resolve?name=_index._agents.deine-domain.com&type=TXT
→ Status: 0 + Answer mit v=aid1-Wert = live
VALIDIERUNG: isitagentready.com — DNS for AI Discovery Check
(erscheint grün sobald isitagentready TXT-Records
auswertet — aktuell prüft der Checker primär SVCB)
============================================================
ERREICHBARE SCORES
============================================================
isitagentready.com: 92+ (Level 1 — Basic Web Presence)
Discoverability 3/3, Content 1/1,
Bot Access Control 2/3 (Content Signals optional),
API/Auth/MCP/Skill Discovery 6/6
Auth.md: grün nach Schritt 24+25
DNS-AID: grün nach Schritt 26 + Hoster-Support
Google Rich Results: 5/5 fehlerfrei
wordlift audit: ~80
HINWEIS SCORE:
Bot Access Control 2/3: Der fehlende Punkt ist "Content Signals
in robots.txt". Einkommentieren erhöht Score auf 3/3, kann aber
Google Search Console-Warnungen auslösen ("Unknown directive").
Kundenentscheidung.
DNS-AID (Schritt 26): Neuer Check seit 2026-05. TXT-Records
werden von einigen Hostern noch nicht als SVCB-Äquivalent
erkannt. Kein Einfluss auf Kern-Score.
============================================================
WAS DIESE ANLEITUNG LEISTET — UND WAS NICHT
============================================================
Diese Anleitung implementiert:
- Technische Discoverability (robots.txt, llms.txt, Sitemaps)
- Maschinenlesbare Infrastruktur (.well-known, MCP, API Catalog)
- Semantische Grundsignale (Schema.org, strukturierte Daten)
- Agenten-Discovery (DNS-AID, auth.md, JWKS)
- Markdown Content Negotiation
Diese Anleitung implementiert NICHT:
- GEO (Generative Engine Optimization)
- Citation Engineering
- LLM Retrieval Optimization
- Entity Authority / AI Reputation
- Kontrolle darüber, ob und wie LLMs die Website zitieren
Ein Score von 92+ auf isitagentready.com bedeutet:
Die technischen Voraussetzungen für AI-Agent-Kompatibilität
sind erfüllt. Es bedeutet NICHT, dass die Website in
KI-Antworten erscheint, zitiert wird oder von LLMs
bevorzugt behandelt wird.
Technische Readiness ist eine notwendige, aber keine
hinreichende Bedingung für KI-Sichtbarkeit.
============================================================
DEINE SCORES NOCH NICHT OPTIMAL?
============================================================
Wir analysieren dein Ergebnis und optimieren gemeinsam.
Web: https://www.vvdk.de
Mail: team@vvdk.de
LinkedIn: https://www.linkedin.com/company/vaivai-digital-keys/
============================================================