Markdown dla agentów AI: Accept text/markdown, Content-Signal i nagłówki Link wyjaśnione

Autor: SEOgrinder · Opublikowano · 10 min czytania

Krótka odpowiedź: Markdown dla agentów AI oznacza, że twój serwer odpowiada na ten sam adres czystym Markdownem zamiast HTML, gdy klient poprosi o to nagłówkiem żądania Accept: text/markdown. Przeglądarki nadal dostają HTML. Wystarczy kilka linijek kodu serwera albo funkcja CDN, którą włączasz, a agenci dostają czysty tekst bez menu i skryptów. Korzyść dla pozycji w wynikach albo cytowań AI nie jest potwierdzona, więc traktuj to jako tani dodatek do czytelnego HTML, dobrego robots.txt i mapy witryny, nigdy jako ich zamiennik.

Dlaczego agenci AI lubią Markdown?

Strona internetowa jest zbudowana dla przeglądarek. Wokół tekstu, który chcesz przeczytać, stoją nawigacja, baner cookies, skrypty, klasy stylów i stopki. Ludzkie oko to wszystko pomija. Program, który musi przekazać stronę modelowi językowemu, nie pominie tego za darmo: model ma ograniczone okno kontekstowe, a każdy dodatkowy element zajmuje jego część.

Markdown zachowuje to, co liczy się przy czytaniu: nagłówki, akapity, listy, tabele, linki. Dlatego agenci i podobne narzędzia są naturalnymi odbiorcami takiego formatu i dlatego też propozycja llms.txt jest napisana w Markdownie. O tym pliku pisaliśmy w artykule llms.txt: co to jest, jak go stworzyć i czy naprawdę działa.

Cloudflare pokazuje różnicę w rozmiarze. W zapowiedzi Markdown for Agents przykładowa odpowiedź zawiera nagłówek x-markdown-tokens z szacowaną liczbą tokenów (w przykładzie 725), dzięki czemu klient może ocenić, ile kontekstu zajmie strona.

Nie wiadomo natomiast, czy duże systemy wyszukiwania AI proszą o Markdown. Zapowiedź Cloudflare pokazuje dane z Cloudflare Radar o odpowiedziach Markdown wysyłanych do OAI-SearchBot. To dowodzi, że takie odpowiedzi się zdarzają, a nie że crawler o nie prosi; OpenAI tego nie dokumentuje. Dlatego tego nie twierdzimy. Udokumentowane jest to, że niektórzy agenci już o Markdown proszą, jak pokazują kolejne sekcje.

Negocjacja treści: Accept, Vary i Content-Type

Negocjacja treści (ang. content negotiation) to stara część HTTP. Jeden adres może mieć kilka reprezentacji, a klient mówi, którą woli. Cały mechanizm niosą trzy nagłówki:

NagłówekKto go wysyłaZnaczenie
AcceptKlient, w żądaniuJakich typów treści chce, opcjonalnie z wagami (q=0.8)
Content-TypeSerwer, w odpowiedziCo serwer faktycznie wysłał, tu text/markdown; charset=utf-8
Vary: AcceptSerwer, w odpowiedziOdpowiedź zależy od nagłówka Accept, więc pamięci podręczne nie mogą mieszać wersji

Przeglądarka podaje najpierw text/html i dopisuje jako zapas symbol wieloznaczny */*. Agent, który chce Markdown, wymienia go wprost, na przykład Accept: text/markdown albo Accept: text/markdown, text/html;q=0.8. Cloudflare pisze, że popularni agenci programistyczni, tacy jak Claude Code i OpenCode, wysyłają już takie nagłówki Accept.

Reguła, która chroni wszystkich, jest prosta: odpowiadaj Markdownem tylko wtedy, gdy text/markdown jest wymieniony wprost i oceniony nie niżej niż text/html. Symbol */* nigdy nie może się liczyć. Inaczej przeglądarki, narzędzia do sprawdzania linków i boty podglądów w mediach społecznościowych, które akceptują „cokolwiek”, dostałyby nagle Markdown.

Markdown dla agentów AI w Cloudflare

12 lutego 2026 roku Cloudflare przedstawił Markdown for Agents. Jeśli funkcja jest włączona dla twojej strefy (jest w wersji beta, bezpłatna w planach Pro, Business i Enterprise), żądanie z Accept: text/markdown dostaje twój HTML zamieniony w locie na Markdown. Twój serwer źródłowy pozostaje bez zmian.

Przykładowa odpowiedź z zapowiedzi pokazuje, jakich nagłówków się spodziewać:

content-type: text/markdown; charset=utf-8
vary: accept
x-markdown-tokens: 725
content-signal: ai-train=yes, search=yes, ai-input=yes

To najszybsza droga, jeśli twoja strona i tak działa za Cloudflare w jednym z tych planów, a przekonwertowany wynik wygląda dobrze. Sprawdź go przez curl (patrz sekcja „Jak to przetestować przez curl”), zanim na nim polegasz. Jeśli chcesz w pełni kontrolować, co mówi wersja Markdown, albo działasz na czymś innym, zbuduj to sam.

Zbuduj to sam: krótki przykład w Node

Poniższy szkic zawiera reguły z góry: Markdown tylko przy jednoznacznym żądaniu, Vary: Accept w obu wersjach, stały adres /index.md dla klientów, którzy nie negocjują, oraz link canonical w nagłówku odpowiedzi Markdown. To minimalny przykład, a nie kod produkcyjny.

import http from 'node:http';
import { readFileSync } from 'node:fs';

function wantsMarkdown(accept = '') {
  const weight = new Map();
  for (const part of accept.toLowerCase().split(',')) {
    const [range, ...params] = part.trim().split(';');
    const q = params.find((p) => p.trim().startsWith('q='));
    weight.set(range.trim(), q ? Number(q.trim().slice(2)) : 1);
  }
  const md = weight.get('text/markdown') ?? 0;
  const html = weight.get('text/html') ?? weight.get('text/*') ?? weight.get('*/*') ?? 0;
  return md > 0 && md >= html; // sam symbol wieloznaczny nigdy nie wybiera Markdowna
}

http.createServer((req, res) => {
  if (req.url === '/index.md' || (req.url === '/' && wantsMarkdown(req.headers.accept))) {
    res.writeHead(200, {
      'Content-Type': 'text/markdown; charset=utf-8',
      'Vary': 'Accept',
      'Link': '<https://example.com/>; rel="canonical"',
    });
    return res.end(readFileSync('index.md'));
  }
  if (req.url === '/') {
    res.writeHead(200, { 'Content-Type': 'text/html; charset=utf-8', 'Vary': 'Accept' });
    return res.end(readFileSync('index.html'));
  }
  res.writeHead(404, { 'Content-Type': 'text/plain; charset=utf-8' }); // każdy inny adres odpowiada 404
  res.end('Not found');
}).listen(3000);

Trzy szczegóły zasługują na bliższe spojrzenie:

  • Vary w obu wersjach. Odpowiedź HTML też potrzebuje Vary: Accept. Inaczej wspólna pamięć podręczna może zapisać HTML i wydać go agentowi, który prosił o Markdown, albo odwrotnie.
  • Stały adres. /index.md zawsze zwraca Markdown, niezależnie od tego, co wyśle klient. Agenci i ludzie mogą na niego linkować, a działa tam, gdzie nie da się ustawić nagłówków. Nasza własna strona seogrinder.com/index.md robi to w ten sposób.
  • Nagłówek canonical. Wersja Markdown to druga reprezentacja tej samej strony. Google dokumentuje, że rel="canonical" można wysyłać jako nagłówek HTTP dla plików, które nie są HTML. To mocny sygnał, że wersja Markdown należy do strony, ale nie gwarancja (Google).

Plik Markdown napisz ręcznie albo wygeneruj z tego samego źródła co HTML. W obu przypadkach powinien mówić to samo co strona, tylko bez ramy.

Nagłówki Link: wskaż agentom opis swojej strony

Nagłówek odpowiedzi Link jest zdefiniowany w RFC 8288. Wskazuje powiązany adres i rodzaj relacji, na przykład Link: </llms.txt>; rel="describedby". Relacja describedby jest zarejestrowana, a jej znaczenie pasuje: wskazany zasób opisuje ten zasób. Klient, który czyta nagłówki odpowiedzi, dowiaduje się więc, gdzie leży opis twojej strony, zanim w ogóle przeczyta treść odpowiedzi.

seogrinder.com wysyła ten nagłówek na stronie głównej i wskazuje nim swój llms.txt. W odpowiedzi Markdown ten sam nagłówek Link niesie dodatkowo relację canonical pokazaną wyżej, oddzieloną przecinkiem.

To, czy jakikolwiek agent dziś podąża za tymi linkami, nie jest potwierdzone. Koszt to jedna linijka w konfiguracji serwera.

Wiersz Content-Signal

We wrześniu 2025 roku Cloudflare wprowadził dla robots.txt wiersz, który mówi, co crawler może zrobić z twoimi treściami po ich pobraniu:

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

search obejmuje indeksowanie i snippety, ai-input oznacza użycie treści bezpośrednio w odpowiedziach AI, a ai-train to trenowanie lub dostrajanie modelu. Format opisują zapowiedź Cloudflare i contentsignals.org. To deklaracja, a nie bariera: nikt nie jest zmuszony jej przestrzegać. Cloudflare pisze, że content signals wyrażają preferencje, nie są technicznymi środkami zaradczymi i że niektóre firmy mogą je po prostu ignorować. Jak pokazano wyżej, przykład Markdown od Cloudflare niesie też nagłówek odpowiedzi content-signal.

Ten wiersz należy do twojego robots.txt, razem ze wszystkimi innymi regułami dla botów AI. Szczegóły, w tym częsty błąd z osobnymi grupami dla każdego bota, znajdziesz w artykule robots.txt dla botów AI. Plik robots.txt serwisu seogrinder.com używa jednej wspólnej grupy dla wszystkich crawlerów i dziewięciu identyfikatorów AI, z wierszem Content-Signal: search=yes, ai-input=yes, ai-train=yes.

Jak to przetestować przez curl

Sprawdź to tym samym narzędziem, którego użyłby agent. Opcja -I pokazuje tylko nagłówki:

curl -sI -H "Accept: text/markdown" https://example.com/

W odpowiedzi szukaj czterech rzeczy: statusu 200, content-type: text/markdown, nagłówka vary zawierającego Accept oraz nagłówka link z adresem canonical. Tak wygląda wynik dla seogrinder.com, skrócony do istotnych wierszy:

HTTP/2 200
content-type: text/markdown; charset=utf-8
vary: Accept
link: </llms.txt>; rel="describedby"; type="text/plain", <https://seogrinder.com/>; rel="canonical"

Potem zrób próby odwrotne. Każda z nich musi zwrócić text/html:

curl -sI -H "Accept: text/html" https://example.com/
curl -sI -H "Accept: */*" https://example.com/
curl -sI https://example.com/

Na końcu wyślij -H "Accept: text/markdown, text/html;q=0.8". Markdown powinien wygrać, bo jest oceniony wyżej.

Jak sprawdza to SEOgrinder

Po skanowaniu otwórz w SEOgrinder kartę Gotowość na AI. W sekcji „Kontrole dla agentów AI” znajdziesz siedem wierszy. Trzy z nich dotyczą tego artykułu i wszystkie trzy stoją w grupie „Dodatki”:

  • Dostarczać tekst zamiast HTML (Markdown Negotiation): spełniony, gdy żądanie z Accept: text/markdown dostaje w odpowiedzi Markdown.
  • Poprowadzić agentów do danych (Link Headers): szuka przydatnych relacji w nagłówku odpowiedzi.
  • Zadeklarować użycie treści (Content Signals): szuka kompletnego wiersza Content-Signal, który obejmuje ai-train, search i ai-input.

Otwarte punkty pokazują przycisk Kopiuj prompt dla agenta bezpośrednio w wierszu, a spełnione punkty pokazują go dopiero po rozwinięciu wiersza, razem ze znalezionym tekstem. W przypadku otwartego punktu prompt opisuje, co utworzyć, pokazuje przez curl stan obecny i podaje polecenie do sprawdzenia wyniku. W przypadku spełnionego punktu prosi twojego asystenta programistycznego o przejrzenie tego, co istnieje, zmianę tylko tego, co konieczne, i zapytanie ciebie, zanim usunie regułę, której nie rozumie. Decyzje, takie jak zezwolenie botom AI lub ich zablokowanie, zostają po twojej stronie, a niektóre prompty dla otwartych punktów podpowiadają przykładowe wartości. Zdecyduj więc najpierw i przeczytaj prompt, zanim wkleisz go do Claude Code, Cursora, GitHub Copilota albo ChatGPT. Potem kliknij Sprawdź ponownie. Raporty są przechowywane w pamięci podręcznej do 24 godzin, a Sprawdź ponownie wymusza świeże sprawdzenie (kilka razy na godzinę).

SEOgrinder otwarcie mówi o grupie „Dodatki”: to propozycje pojedynczych dostawców, a wpływ na Google nie jest potwierdzony. Narzędzie nie mierzy też, czy ChatGPT, Gemini albo Perplexity faktycznie wymieniają twoją markę. Sprawdza techniczną podstawę: czy maszyny mogą dotrzeć do twojej strony i ją odczytać.

Czy to się opłaca?

To zależy od tego, co oferuje twoja strona. Dokumentacja, strony referencyjne, długie poradniki i bazy wiedzy to rodzaj treści, które agenci pobierają, żeby odpowiedzieć na konkretne pytanie, i tam czysta wersja Markdown jest przydatna. Dla małego sklepu albo lokalnej firmy z pięcioma podstronami czas lepiej poświęcić podstawom: tekstowi, który jest w HTML bez JavaScriptu, robots.txt wpuszczającemu boty wyszukujące i mapie witryny.

Jeśli chodzi o własne funkcje AI Google, Google pisze, że nie ma dodatkowych wymagań, żeby pojawić się w AI Overviews albo AI Mode, ani innych specjalnych optymalizacji; szczegóły są w dokumentacji Google. Wersja Markdown nie jest tam więc wymogiem. Inni asystenci mogą zachowywać się inaczej, ale nikt nie może obiecać, że asystent AI wymieni twoją stronę.

Najczęstsze błędy

  • Brak nagłówka Vary. Bez Vary: Accept pamięć podręczna albo CDN może wydać następnemu odwiedzającemu złą wersję.
  • Pamięć podręczna przed serwerem, która ignoruje nagłówek. Testuj przez publiczny adres, a nie tylko na serwerze źródłowym.
  • Markdown dla przeglądarek. Jeśli twój test traktuje symbol */* jak prośbę o Markdown, odwiedzający zobaczą surowy tekst. Przetestuj w zwykłej przeglądarce.
  • Brak linku canonical. Wersja Markdown może wtedy zostać potraktowana jako osobna strona. Wybraliśmy nagłówek canonical zamiast noindex, bo wersja uzyskana przez negocjację leży pod tym samym adresem co strona.
  • Wersja Markdown, która mówi coś innego. Utrzymuj treść taką samą jak na stronie HTML, tylko bez ramy. Nie mamy źródła, jak wyszukiwarki traktują różnice między jedną a drugą wersją, więc trzymaj obie identyczne.
  • Nieaktualny plik. Ręcznie napisany index.md, który wymienia zeszłoroczną ofertę, wprowadza agentów w błąd. Generuj go ze źródła strony albo wpisz na swoją listę kontrolną.
  • Pusta strona HTML. Jeśli sam HTML nie ma tekstu, dopóki nie wykona się JavaScript, Markdown dla agentów nie naprawi problemu u pozostałych klientów, na przykład u podglądów w mediach społecznościowych. SEOgrinder zgłasza strony, które powstają dopiero w przeglądarce.

Najczęstsze pytania

Czy Markdown dla agentów AI jest czynnikiem rankingowym?

Nie ma na to dowodu. Traktuj to jako format dostarczania treści maszynom, a nie dźwignię rankingową.

Czy ChatGPT, Claude albo Perplexity proszą o Markdown?

Cloudflare pisze, że agenci programistyczni, tacy jak Claude Code i OpenCode, wysyłają już Accept: text/markdown. Dla crawlerów wyszukujących dużych dostawców nie ma dokumentacji, że o niego proszą; dane Cloudflare Radar pokazują odpowiedzi Markdown dla OAI-SearchBot, co nie jest dowodem na nagłówek żądania. Nie jest to więc potwierdzone.

Czy potrzebuję Cloudflare?

Nie. Cloudflare oferuje konwersję jako funkcję (w wersji beta, w planach Pro, Business i Enterprise). Szkic w Node wyżej pokazuje, że wystarczy kilka linijek kodu serwera, a te same reguły da się zaimplementować w każdym serwerze lub frameworku.

Czy użyć negocjacji treści, czy osobnego adresu .md?

Możesz oba. Stały adres, jak /index.md, łatwo podlinkować i przetestować. Negocjacja zostawia jeden adres dla obu grup odbiorców. seogrinder.com oferuje oba rozwiązania dla strony głównej.

Czy zwykli odwiedzający kiedykolwiek zobaczą wersję Markdown?

Nie, jeśli przestrzegasz reguły o symbolu wieloznacznym: Markdown jest wysyłany tylko wtedy, gdy text/markdown jest wymieniony wprost i oceniony nie niżej niż text/html.

Twój następny krok

Uruchom bezpłatne skanowanie w SEOgrinder i otwórz kartę Gotowość na AI. Spójrz na trzy wiersze z grupy „Dodatki”: Markdown, Link Headers i Content Signals, i zdecyduj, czy twoja strona należy do tych, które agenci czytają. Jeśli tak, skopiuj prompt dla agenta, pozwól asystentowi wprowadzić zmianę, sprawdź wynik przez curl i przeskanuj stronę ponownie.

Więcej z bloga