Fra 33 til 100: Sådan gjorde jeg mit site agent-ready på en formiddag

Cloudflare har fornylig udgivet deres Agent Readiness scanner, en gradueringsrapport over hvor klart dit website er til at håndtere agenter. Mit første scan gav mig kun 38 ud af 100, hvilket selvfølgelig ikke var et tilfredsstillende resultat. Jeg brugte derfor min formiddag på at finde ud af hvad der manglede og endte med en score på 100. Her er hvad jeg gjorde og hvorfor jeg mener, det kommer til at betyde meget for din synlighed de næste par år. 

Hvis du vil teste dit eget site først, ligger scanneren her: radar.cloudflare.com/scan/agents. Den tjekker overordnet tre ting, det første er om du fortæller agenter hvad de må bruge dit til (Content Signals), om du annoncerer dine parsebare endpoints via Link-headers, og om du har nogle .well-known endpoints at pege på.

Hvad Agent Readiness rent faktisk måler

Cloudflares nye scanner er et forsøg på at etablere en slags standard, for hvordan websites bør og kan kommunikere med AI-agenter og en del af den bevægelse, jeg tidligere har beskrevet, hvor store virksomheder som Google, Anthropic, Cloudflare og ikke mindst OpenAI presser på for at få en protokol mellem websites og LLMer. Grundlæggende kan det hele defineres med 3 overordnede spørgsmål. Må agenten bruge mit indhold? Hvad er mit indhold? Og hvordan kan agenten interagere med mit website uden nødvendigvis at skulle crawle hele HTML strukturen?

Mit website scorede som sagt indledningsvist kun 38, det kom af at jeg havde en helt almindelig robots.txt, et sitemap og en OpenAPI-referencer, men ingen af de nye signaler, som Cloudflare leder efter. 

Content Signals i robots.txt

Første manglende punkt, var Content Signals til min robots.txt. En udvidelse, til en klassiske robots.txt-syntaks, som normalt blot viser hvilke stier der må eller ikke må crawles, men når det kommer til Content Signals handler det mere om at fortælle hvad indholdet må bruges til, eksempelvis træning, inference til LLM svar mv. Og lige præcis denne tilføjelse, er det tætteste vi kommer på en branchestandard, som det er lige nu i hvert fald. Cloudflare vægter dette punkt, meget tungt i deres scoring af dit website, hvilket oversat betyder, at de mener det er et meget vigtigt element. 

# robots.txt for henrik-bondtofte.dk
User-agent: *
Allow: /

# Content Signals
Content-Signal: search=yes, ai-train=no, ai-input=yes

Sitemap: https://www.henrik-bondtofte.dk/sitemap.xml

I ovenstående opsætning, tillader jeg at mit indhold, må bruges til at svare på brugerspørgsmål, det gør jeg gennem ai-input=yes, men jeg tillader ikke at modeller på trænes på mit indhold, det har jeg defineret ved at sætte ai-train=no. Det kan sagtens være, jeg ændrer særligt den sidste indstilling, på et senere tidspunkt. Jeg vil gerne være et svar i sprogmodellerne og der må gerne henvises til mit website, men jeg er ikke nødvendigvis interesseret i at mit indhold, skal bruges til at besvare spørgsmål direkte uden kildehenvisning, som næsten altid vil være tilfældet med træningsdata. Du skal selvfølgelig selv vurdere, hvad du syntes giver mening for dig og dit websites indhold. Tilføjelsen af content signals gav alene en forøgelse i scoren på 20. 

Linkbuilding gjort nemt – Anbefaling
Tilmeld dig Bazoom her

Synes du det er svært at finde relevante linkbuilding-medier? Så prøv Bazoom – en af verdens største handelspladser for linkbuilding. Her finder du relevante medier fra stort set alle lande, opdelt efter sprog, kategori og domæneautoritet. Brug koden Bondtofte1500 og få 1.500 kr. i sign-up bonus (mod normalt 750 kr.).

Link-headers via Nginx

Ved hvert eneste request, sendes der HTTP-headers, det er den måde agenter finder ud af, hvor dine parsebare endpoints findes, uden at al HTML skal parses.

Cloudflare tjekker specifikt efter disse. Personligt kører jeg Nginx foran Next.js på en Hetzner-server, så i mit tilfælde, blev det lagt i selve server-blokken, her er min tilføjelse til /etc/nginx/sites-available/henrik-bondtofte.dk:

server {
    server_name www.henrik-bondtofte.dk;

    add_header Link '</.well-known/mcp.json>; rel="mcp-server"' always;
    add_header Link '</.well-known/agent-skills.json>; rel="agent-skills"' always;
    add_header Link '</.well-known/api-catalog>; rel="api-catalog"' always;
    add_header Link '</openapi.json>; rel="service-desc"; type="application/json"' always;

    location / {
        proxy_pass http://127.0.0.1:3000;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
    }
}

Det vigtige her er “always”-flaget, som sikrer at headeren også bliver sendt med ved fejl-responses samt cached content. Uden det dropper Nginx dem på nogle respons-typer, og så ser scanneren dem slet ikke. Efter jeg havde gemt filen kørte jeg nginx -t for at teste konfigurationen, og derefter systemctl reload nginx for at få den ind uden nedetid. 

Dette kan verificeres med et curl:

curl -I https://www.henrik-bondtofte.dk/

Hvis du får Link-headers tilbage i responsen for dit website, så annoncerer du dine endpoints korrekt. I mit tilfælde, gav det en yderligere forbedring i scoren på 15. Husk at skifte domænet ud, med dit eget. 

.well-known endpoints

Så kom den del, jeg synes var sjovest, for det er her, det er her du rent faktisk gør dit site AI-optimeret i stedet for bare at sige ‘jeg findes’. Agenter og LLM’er benytter .well-known-stien (defineret i RFC 8615) til at finde standardiserede metadata-filer, og Cloudflare leder specifikt efter tre ting: et MCP server card, en agent-skills manifest og et API-katalog. Så lad os sørge for at de kan findes! 

MCP server card

MCP (Model Context Protocol) er Anthropics standard for hvordan AI-agenter kobler op på eksterne tjenester, mens et server card er den fil der beskriver hvad din MCP-server kan. Adoptionsraten for MCP er virkelig begyndt at sprede sig til de forskellige sprogmodeller.

Selv hvis du ikke har en fuld MCP-server kørende endnu, kan du pege på dit OpenAPI-skema og få point for det. Min /.well-known/mcp.json ser sådan her ud:

{
  "name": "henrik-bondtofte.dk",
  "version": "1.0.0",
  "description": "SEO-ekspertise, analyser og tools fra Henrik Bondtofte",
  "vendor": "Henrik Bondtofte",
  "contact": {
    "email": "[email protected]",
    "url": "https://www.henrik-bondtofte.dk/kontakt/"
  },
  "capabilities": {
    "resources": true,
    "tools": true,
    "prompts": false
  },
  "endpoints": {
    "openapi": "https://www.henrik-bondtofte.dk/openapi.json",
    "documentation": "https://www.henrik-bondtofte.dk/docs/"
  },
  "content_policy": {
    "ai_training": false,
    "ai_inference": true,
    "attribution_required": true
  }
}

Læg mærke til content_policy-blokken. Det er en duplikering af det jeg allerede har i robots.txt, men agenter der finder mcp.json først skal også kunne se mine præferencer der. Redundans er venlig adfærd her.

Men ovenstående er lidt et hack, for at få scoren op, for der er ikke tale om en ægte MCP. Jeg har dog efterføgende, valgt at lave en MCP baseret på min blog og mine bøger. Den kan du finde her: https://mcp.henrik-bondtofte.dk/

Agent skills manifest

Agent skills er en meget nyere men samtidig også langt mindre standardiseret, Cloudflare vægter den dog alligevel relativt højt i deres test. Helt konkret beskriver Agent skills manifest, hvilke opgaver en agent kan udføre på dine vegne eller hvilke data en agent, kan trække ud af dit website, i struktureret form. I mit tilfælde, har jeg en række tools og analyser, der kan hentes som JSON 

Min /.well-known/agent-skills.json:

{
  "schema_version": "2025-01",
  "skills": [
    {
      "id": "seo-analyse",
      "name": "SEO-analyse af dansk website",
      "description": "Teknisk audit, on-page gennemgang og linkprofil-vurdering",
      "input_schema": {
        "domain": "string",
        "depth": "shallow|deep"
      },
      "output": "https://www.henrik-bondtofte.dk/api/seo-analyse",
      "pricing": "on-request"
    },
    {
      "id": "keyword-research",
      "name": "Dansk keyword research",
      "description": "Søgevolumen, konkurrence og intent-klassificering",
      "input_schema": {
        "seed_keyword": "string",
        "market": "dk|se|no"
      },
      "output": "https://www.henrik-bondtofte.dk/api/keyword-research"
    }
  ],
  "contact": "[email protected]"
}

Jeg har gjort mig umage med at holde beskrivelserne korte og deskriptive. En agent der læser den her fil skal på under et sekund kunne vurdere om mit site er relevant for en given brugeropgave eller ej. Det er den samme logik som man bruger til søgeordsanalyse, at tale samme sprog som dine kunder, her er kunden blot en agent.

API catalog

Den sidste .well-known-fil er et API-katalog. Her er der flere konkurrerende formater i spil, men det mest udbredte er RFC 9727, der definerer et simpelt katalog over tilgængelige API-beskrivelser. Derfor vil jeg anbefale dig, at du vælger den. Mit /.well-known/api-catalog er bare en liste over OpenAPI-specs og andre service-beskrivelser:

{
  "linkset": [
    {
      "anchor": "https://www.henrik-bondtofte.dk/",
      "service-desc": [
        {
          "href": "https://www.henrik-bondtofte.dk/openapi.json",
          "type": "application/vnd.oai.openapi+json"
        }
      ],
      "service-doc": [
        {
          "href": "https://www.henrik-bondtofte.dk/docs/api",
          "type": "text/html"
        }
      ],
      "status": [
        {
          "href": "https://status.henrik-bondtofte.dk",
          "type": "text/html"
        }
      ]
    }
  ]
}

I virkeligheden er dette bare at pege på hvor dine beskrivelser er at finde, så en agent ikke skal gætte sig frem til destinationerne (det er de sjældent særligt gode til). 

Fra 75 til 100

Efter de tre .well-known-filer var oppe, lå jeg på en score på omkring 90. Det sidste der manglede var at mine JSON-filer skulle have korrekte Content-Type-headers og at de var tilgængelige uden redirects.

Jeg havde en enkelt der fejlede fordi min Next.js-app forsøgte at 308-redirecte fra /.well-known/mcp.json til en variant med trailing slash, som Cloudflares scanner ikke følger. Fikset ved at servere dem statisk fra Nginx direkte:

location /.well-known/ {
    root /var/www/react-site/public;
    default_type application/json;
    add_header Cache-Control "public, max-age=3600" always;
    try_files $uri $uri.json =404;
}

Problem løst og da jeg kørte testen endnu en gang fik jeg 100 ud af 100 mulige. Det tog alt i alt, tre timer, hvilket også indebar læsning af specs og fejlsøgning af blandt andet redirect udfordringen.

Hvorfor jeg tror det her bliver afgørende

Jeg har nævnt det før, både i nyhedsbreve og også på LinkedIn og nu siger jeg det igen, søgning er godt i gang med at flytte sig fra de små blå links til deciderede AI svar og dem der kommer til at vinde i starten, bliver også dem, der sørger for at LLM nemmest kan håndtere, finde og interagere med og det er lige præcis her agent readyness spiller en afgørende rolle. Tror jeg i hvert fald, det samme gør Cloudflare. Hvis ChatGPT, Claude eller Perplexity skal citere dig som kilde, skal de kunne finde ud af hvad du er, hvad du mener, og om de må bruge dit indhold. Det er præcis det Content Signals, Link-headers og .well-known-filer løser.

Jeg siger ikke at Cloudflares scanner er det definitive mål for om dit site er AI-klart, men det er skridt i den rigtige retning – ingen ved endnu, hvordan næste år ser ud og slet ikke hvordan verden ser ud om to år. Vi er stadig i det meget tidlige stadie, og de fleste af “standarderne” er ikke endelig formaliserede endnu. Men når Cloudflare, Anthropic og Google alle peger i samme retning, plejer det at være et ret stærkt signal om hvor vi skal hen og jeg vælger i hvert fald at følge med. 

Kør dit site gennem radar.cloudflare.com/scan/agents og se hvor du ligger. Hvis du er under 50, så har du næsten helt sikkert de samme huller jeg havde, og de kan lukkes med de kodestumper der står herover.

 

author avatar
Henrik Bondtofte SEO-specialist & strateg med fokus på AI og retrieval
Henrik Bondtofte er en af Danmarks mest erfarne SEO-specialister med over 20 års praktisk erfaring. Han står bag flere anerkendte fagbøger om SEO, linkbuilding og interne links og er forfatteren bag denne blog, hvor han deler sine erfaringer.

Del denne artikel

Indsend Kommentar

Din e-mailadresse vil ikke blive publiceret. Krævede felter er markeret med *