============================================================ 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('/]*>.*?<\/script>/is', '', $md); $md = preg_replace('/]*>.*?<\/style>/is', '', $md); $md = preg_replace('/]*>.*?<\/noscript>/is', '', $md); $md = preg_replace('/]*>.*?<\/svg>/is', '', $md); $md = preg_replace('/]*>(.*?)<\/h1>/is', "# $1\n\n", $md); $md = preg_replace('/]*>(.*?)<\/h2>/is', "## $1\n\n", $md); $md = preg_replace('/]*>(.*?)<\/h3>/is', "### $1\n\n", $md); $md = preg_replace('/]*>(.*?)<\/h4>/is', "#### $1\n\n", $md); $md = preg_replace('/\[([^\]]+)\]\(#elementor-action[^\)]*\)/i', '$1', $md); $md = preg_replace('/]+href=["\']([^"\'> ]+)["\'][^>]*>(.*?)<\/a>/is', '[$2]($1)', $md); $md = preg_replace('/]*>(.*?)<\/li>/is', "- $1\n", $md); $md = preg_replace('/<\/?(ul|ol)[^>]*>/is', "\n", $md); $md = preg_replace('/<(strong|b)[^>]*>(.*?)<\/\1>/is', '**$2**', $md); $md = preg_replace('/<(em|i)[^>]*>(.*?)<\/\1>/is', '*$2*', $md); $md = preg_replace('/]*>(.*?)<\/p>/is', "$1\n\n", $md); $md = preg_replace('//is', "\n", $md); $md = wp_strip_all_tags($md); $md = preg_replace('/^[ \t]+/m', '', $md); // führende Whitespaces $md = preg_replace('/[ \t]+$/m', '', $md); // trailing Whitespaces $md = preg_replace('/[ \t]+/', ' ', $md); $md = preg_replace('/\n\s+\n/', "\n\n", $md); $md = preg_replace('/\[\/?vc_[^\]]*\]/i', '', $md); // WPBakery $md = preg_replace('/\[\/?mk_[^\]]*\]/i', '', $md); // WPBakery MK $md = preg_replace('/[A-Za-z0-9+\/]{100,}={0,2}/', '', $md); // base64-Blobs $md = preg_replace('/\[\s*\]\([^)]*\)/', '', $md); // leere Links $md = preg_replace('/\n{3,}/', "\n\n", $md); $output = "# " . trim($title) . "\n\n" . trim($md) . "\n"; nocache_headers(); status_header(200); if (!headers_sent()) { header('Content-Type: text/markdown; charset=UTF-8'); header('X-Robots-Tag: noindex'); header('Vary: Accept'); } echo $output; exit; }); VALIDIERUNG: https://deine-domain.com/?format=markdown → Klartext ohne HTML-Tags, keine base64-Blobs, keine leeren Links, saubere Whitespaces RISIKOHINWEIS: Vor produktivem Einsatz auf komplexen Setups ausführlich testen. Bekannte Konfliktquellen: - WPML / Polylang: Sprachweichen können format=markdown umleiten - Redirect-Plugins: 301/302 vor template_redirect abgefangen - SEO-Plugins (Rank Math, Yoast): canonical-Konflikte möglich - Aggressive Cache-Layer (WP Fastest Cache, Cloudflare): gecachte Version ignoriert ?format=markdown - Security-Plugins (Wordfence, iThemes): Parameter-Filterung - Reverse Proxies / CDN: Vary: Accept wird ggf. nicht weitergeleitet ------------------------------------------------------------ SCHRITT 20 — Schema.org JSON-LD ------------------------------------------------------------ Headline: Organization / ProfessionalService Schema Beschreibung: Strukturierte Daten für AI-Systeme und Google. @id #organization vereinheitlicht den Knoten mit Yoast/Rank Math — kein Konflikt, Google mergt beide Quellen. WICHTIG — Nie setzen (Yoast liefert diese — Duplikat-Fehler): name · legalName · employee · hasOfferCatalog · url WICHTIG — Pflichtfeld für Google Product-Snippets: name ist Pflichtfeld in Product-Schema (nicht Organization). aggregateRating: Nur einfügen wenn verifizierte Quelle vorhanden (Google Business Profile, Trustpilot o.ä.). DREI WEGE ZUR IMPLEMENTIERUNG (einen wählen): Option A — WPCode Lite (empfohlen, kein Theme-Eingriff): 1. WordPress-Admin → WPCode → Code Snippets → + Add Snippet 2. Typ: HTML 3. Inhalt: Script (siehe unten) einfügen — direkt mit 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/ ============================================================