Markdown dla agentów AI: Accept text/markdown, Content-Signal i nagłówki Link wyjaśnione
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łówek | Kto go wysyła | Znaczenie |
|---|---|---|
Accept | Klient, w żądaniu | Jakich typów treści chce, opcjonalnie z wagami (q=0.8) |
Content-Type | Serwer, w odpowiedzi | Co serwer faktycznie wysłał, tu text/markdown; charset=utf-8 |
Vary: Accept | Serwer, w odpowiedzi | Odpowiedź 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.mdzawsze 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/markdowndostaje 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 obejmujeai-train,searchiai-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: Acceptpamięć 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.