Markdown pour les agents IA : Accept text/markdown, Content-Signal et en-têtes Link

Par SEOgrinder · Publié le · 12 min de lecture

Réponse courte : Le Markdown pour les agents IA, c’est votre serveur qui répond à la même adresse par du Markdown brut plutôt que par du HTML, lorsque le client le demande avec l’en-tête de requête Accept: text/markdown. Les navigateurs continuent de recevoir du HTML. Il suffit de quelques lignes de code serveur ou d’une fonction de CDN à activer, et les agents obtiennent un texte propre, sans menus ni scripts. Un bénéfice pour le classement ou pour les citations par une IA n’est pas démontré : voyez-y un extra peu coûteux, à ajouter à un HTML lisible, à un bon robots.txt et à un sitemap, jamais à leur place.

Pourquoi les agents IA aiment-ils le Markdown ?

Une page web est conçue pour les navigateurs. Autour du texte que vous voulez lire, il y a de la navigation, une bannière de cookies, des scripts, des classes de style et des pieds de page. L’œil humain saute tout cela. Un programme qui doit transmettre la page à un modèle de langage ne peut pas le sauter gratuitement : le modèle a une fenêtre de contexte limitée, et chaque élément supplémentaire en consomme une partie.

Le Markdown conserve ce qui compte pour la lecture : titres, paragraphes, listes, tableaux, liens. Les agents et outils similaires sont donc des candidats naturels pour le demander, et c’est aussi pour cela que la proposition llms.txt est elle-même écrite en Markdown. Nous avons consacré un article à ce fichier : llms.txt : c’est quoi et à quoi ça sert vraiment.

Cloudflare rend l’argument de la taille visible. Dans son annonce de Markdown for Agents, l’exemple de réponse contient un en-tête x-markdown-tokens avec un nombre de tokens estimé (725 dans l’exemple), si bien qu’un client peut juger de la place que la page prendra dans son contexte.

Ce que cela ne dit pas, c’est si les grands systèmes de recherche IA demandent du Markdown. L’annonce de Cloudflare présente des données Radar sur des réponses en Markdown adressées à OAI-SearchBot. Cela prouve que de telles réponses existent, pas que le crawler les demande ; OpenAI ne le documente pas. Nous ne l’affirmons donc pas. Ce qui est documenté, c’est que certains agents le demandent déjà, comme le montrent les sections suivantes.

Négociation de contenu : Accept, Vary et Content-Type

La négociation de contenu (content negotiation) est un vieux mécanisme de HTTP. Une même adresse peut avoir plusieurs représentations, et le client indique celle qu’il préfère. Trois en-têtes portent tout le mécanisme :

En-têteEnvoyé parSignification
AcceptLe client, dans la requêteLes types de contenu souhaités, avec des pondérations facultatives (q=0.8)
Content-TypeLe serveur, dans la réponseCe que le serveur a réellement envoyé, ici text/markdown; charset=utf-8
Vary: AcceptLe serveur, dans la réponseLa réponse dépend de l’en-tête Accept : les caches ne doivent donc pas mélanger les versions

Un navigateur indique d’abord text/html et ajoute le joker */* en dernier recours. Un agent qui veut du Markdown le nomme explicitement, par exemple Accept: text/markdown ou Accept: text/markdown, text/html;q=0.8. Cloudflare écrit que des agents de programmation courants, comme Claude Code et OpenCode, envoient déjà de tels en-têtes Accept.

La règle qui protège tout le monde est simple : ne répondez en Markdown que si text/markdown est nommé explicitement et n’est pas moins bien noté que text/html. Le joker */* ne doit jamais compter. Sinon, un navigateur, un vérificateur de liens ou un robot d’aperçu pour les réseaux sociaux, qui acceptent tous « n’importe quoi », recevraient du Markdown.

Le Markdown pour les agents IA avec Cloudflare

Le 12 février 2026, Cloudflare a annoncé Markdown for Agents. Si la fonction est activée pour votre zone (elle est en bêta, gratuite, dans les offres Pro, Business et Enterprise), une requête avec Accept: text/markdown reçoit votre HTML converti à la volée en Markdown. Votre serveur d’origine ne change pas.

L’exemple de réponse de l’annonce montre les en-têtes à attendre :

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

C’est la voie la plus rapide si votre site passe déjà par Cloudflare dans l’une de ces offres et que le résultat converti vous convient. Vérifiez-le avec curl (voir « Comment le tester avec curl ») avant de vous y fier. Si vous voulez maîtriser entièrement ce que dit la version Markdown, ou si vous utilisez autre chose, construisez-la vous-même.

Le construire soi-même : un court exemple Node

L’esquisse suivante contient les règles ci-dessus : du Markdown uniquement pour une demande explicite, Vary: Accept sur les deux versions, une adresse fixe /index.md pour les clients qui ne négocient pas, et un lien canonical dans l’en-tête de la réponse Markdown. C’est un exemple minimal, pas du code de production.

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; // le joker seul ne choisit jamais Markdown
}

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' }); // toute autre adresse répond 404
  res.end('Not found');
}).listen(3000);

Trois détails méritent qu’on s’y arrête :

  • Vary sur les deux versions. La réponse HTML a elle aussi besoin de Vary: Accept. Sinon, un cache partagé peut stocker le HTML et le servir à un agent qui avait demandé du Markdown, ou l’inverse.
  • L’adresse fixe. /index.md renvoie toujours du Markdown, quel que soit ce que le client envoie. Les agents comme les humains peuvent y faire un lien, et elle fonctionne là où l’on ne peut pas définir d’en-têtes. Notre propre page seogrinder.com/index.md fonctionne ainsi.
  • L’en-tête canonical. La version Markdown est une seconde représentation de la même page. Google documente que rel="canonical" peut être envoyé comme en-tête HTTP pour les fichiers qui ne sont pas du HTML. C’est un signal fort que la version Markdown appartient à la page, pas une garantie (Google).

Écrivez le fichier Markdown à la main ou générez-le à partir de la même source que le HTML. Dans les deux cas, il doit dire la même chose que la page, simplement sans l’habillage.

L’en-tête de réponse Link est défini dans la RFC 8288. Il désigne une adresse liée et le type de relation, par exemple Link: </llms.txt>; rel="describedby". La relation describedby est enregistrée, et son sens convient : la ressource liée décrit celle-ci. Un client qui lit les en-têtes de réponse apprend ainsi où se trouve la description de votre site, avant même d’analyser le corps de la réponse.

seogrinder.com envoie cet en-tête sur sa page d’accueil et pointe vers son propre llms.txt. Sur la réponse Markdown, le même en-tête Link porte en plus la relation canonical vue plus haut, séparée par une virgule.

Savoir si un agent suit aujourd’hui ces liens n’est pas démontré. Le coût est d’une ligne dans la configuration du serveur.

La ligne Content-Signal

En septembre 2025, Cloudflare a introduit pour le robots.txt une ligne qui indique ce qu’un crawler peut faire de votre contenu une fois qu’il l’a récupéré :

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

search couvre l’indexation et les snippets, ai-input l’utilisation directe du contenu dans les réponses d’une IA, et ai-train l’entraînement ou l’ajustement d’un modèle. L’annonce de Cloudflare et contentsignals.org décrivent le format. C’est une déclaration, pas une barrière : personne n’est obligé de la respecter. Cloudflare précise que les content signals expriment des préférences, qu’ils ne sont pas des contre-mesures techniques et que certaines entreprises pourraient tout simplement les ignorer. Comme on l’a vu plus haut, l’exemple Markdown de Cloudflare comporte lui aussi un en-tête de réponse content-signal.

La ligne a sa place dans votre robots.txt, avec toutes les autres règles pour les robots IA. Les détails, y compris l’erreur fréquente des groupes séparés par robot, sont dans robots.txt pour les crawlers IA. Le robots.txt de seogrinder.com utilise un groupe commun pour tous les crawlers et neuf identifiants d’IA, avec Content-Signal: search=yes, ai-input=yes, ai-train=yes.

Comment le tester avec curl

Vérifiez avec le même outil que celui qu’un agent utiliserait. L’option -I n’affiche que les en-têtes :

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

Cherchez quatre éléments dans la réponse : le statut 200, content-type: text/markdown, un vary contenant Accept, et un en-tête link avec l’adresse canonical. Voici le résultat pour seogrinder.com, abrégé aux lignes utiles :

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"

Faites ensuite les vérifications inverses. Chacune doit renvoyer text/html :

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

Envoyez enfin -H "Accept: text/markdown, text/html;q=0.8". Le Markdown doit l’emporter, car il est mieux noté.

Comment SEOgrinder le vérifie

Ouvrez l’onglet Préparation à l'IA de SEOgrinder après une analyse. Sous « Contrôles pour agents IA », vous trouvez sept lignes. Trois d’entre elles concernent cet article, et toutes trois se trouvent dans le groupe « Extras » :

  • Servir du texte plutôt que du HTML (Markdown Negotiation) : rempli lorsqu’une requête avec Accept: text/markdown renvoie du Markdown.
  • Conduire les agents à tes données (Link Headers) : cherche des relations utiles dans l’en-tête de réponse.
  • Déclarer l’usage du contenu (Content Signals) : cherche une ligne Content-Signal complète, couvrant ai-train, search et ai-input.

Les points ouverts affichent le bouton Copier le prompt agent directement dans la ligne ; les points remplis l’affichent une fois la ligne dépliée, avec le texte trouvé. Pour un point ouvert, le prompt décrit ce qu’il faut créer, montre l’état actuel avec curl et donne une commande pour vérifier le résultat. Pour un point rempli, il demande à votre assistant de programmation de relire l’existant, de ne modifier que le nécessaire et de vous demander avant de supprimer une règle qu’il ne comprend pas. Les décisions comme autoriser ou bloquer les crawlers IA restent les vôtres, et certains prompts de points ouverts proposent des valeurs d’exemple : décidez donc d’abord, et lisez le prompt avant de le coller dans Claude Code, Cursor, GitHub Copilot ou ChatGPT. Cliquez ensuite sur Réanalyser pour relancer l’analyse. Les rapports restent en cache jusqu’à 24 heures, et Réanalyser force une nouvelle analyse (quelques fois par heure).

SEOgrinder est franc à propos du groupe « Extras » : ce sont des suggestions de certains éditeurs, et un effet sur Google n’est pas démontré. L’outil ne mesure pas non plus si ChatGPT, Gemini ou Perplexity mentionnent réellement votre marque. Il vérifie la base technique : les machines peuvent-elles atteindre et lire votre page ?

Cela vaut-il l’effort ?

Cela dépend de ce que propose votre site. La documentation, les pages de référence, les longs guides et les bases de connaissances sont le type de contenu que les agents récupèrent pour répondre à une question précise, et une version Markdown propre y est utile. Pour une petite boutique ou un commerce local de cinq pages, le temps est mieux investi dans les bases : du texte présent dans le HTML sans JavaScript, un robots.txt qui laisse entrer les robots de recherche, et un sitemap.

Pour les fonctions d’IA de Google, Google indique qu’il n’y a aucune exigence supplémentaire pour apparaître dans les AI Overviews ou en AI Mode, ni d’autres optimisations particulières à prévoir ; les détails figurent dans la documentation de Google. Une version Markdown n’y est donc pas une condition. D’autres assistants peuvent se comporter autrement, mais personne ne peut promettre qu’un assistant d’IA citera votre page.

Erreurs fréquentes

  • Pas d’en-tête Vary. Sans Vary: Accept, un cache ou un CDN peut servir la mauvaise version au visiteur suivant.
  • Un cache en amont qui ignore l’en-tête. Testez via l’adresse publique, pas seulement contre votre serveur d’origine.
  • Du Markdown pour les navigateurs. Si votre vérification traite le joker */* comme une demande de Markdown, les visiteurs voient du texte brut. Testez avec un navigateur normal.
  • Pas de lien canonical. La version Markdown peut alors être traitée comme une page distincte. Nous avons choisi l’en-tête canonical plutôt que noindex, parce que la version négociée se trouve à la même adresse que la page.
  • Une version Markdown qui dit autre chose. Gardez le même contenu que la page HTML, sans l’habillage. Nous n’avons aucune source sur la façon dont les moteurs de recherche traitent les différences entre les deux : gardez-les donc identiques.
  • Un fichier périmé. Un index.md écrit à la main qui liste l’offre de l’an dernier induit les agents en erreur. Générez-le à partir de la source de la page, ou ajoutez-le à votre liste de contrôle.
  • Une page HTML vide. Si le HTML lui-même ne contient aucun texte tant que JavaScript n’a pas tourné, le Markdown pour agents ne corrige pas le problème pour les autres clients, comme les aperçus sociaux. SEOgrinder signale les pages qui ne sont construites que dans le navigateur.

Questions fréquentes

Le Markdown pour les agents IA est-il un facteur de classement ?

Rien ne le prouve. Voyez-y un format de livraison pour les machines, pas un levier de classement.

ChatGPT, Claude ou Perplexity demandent-ils du Markdown ?

Cloudflare écrit que des agents de programmation comme Claude Code et OpenCode envoient déjà Accept: text/markdown. Pour les crawlers de recherche des grands éditeurs, aucune documentation n’indique qu’ils le demandent ; les données Radar de Cloudflare montrent des réponses en Markdown adressées à OAI-SearchBot, ce qui ne prouve pas l’existence d’un en-tête de requête. Ce n’est donc pas démontré.

Ai-je besoin de Cloudflare ?

Non. Cloudflare propose la conversion comme fonction (en bêta, dans les offres Pro, Business et Enterprise). L’esquisse Node ci-dessus montre que quelques lignes de code serveur suffisent, et les mêmes règles peuvent être intégrées dans n’importe quel serveur ou framework.

Faut-il utiliser la négociation de contenu ou une adresse .md distincte ?

Vous pouvez faire les deux. Une adresse fixe comme /index.md se partage et se teste facilement. La négociation conserve une seule adresse pour les deux publics. seogrinder.com propose les deux pour sa page d’accueil.

Les visiteurs ordinaires verront-ils un jour la version Markdown ?

Pas si vous respectez la règle du joker : le Markdown n’est envoyé que si text/markdown est nommé explicitement et n’est pas moins bien noté que text/html.

Votre prochaine étape

Lancez l’analyse gratuite dans SEOgrinder et ouvrez l’onglet Préparation à l'IA. Regardez les trois lignes Extras consacrées à Markdown, aux Link Headers et aux Content Signals, et décidez si votre site fait partie de ceux que les agents lisent. Si oui, copiez le prompt agent, laissez votre assistant faire la modification, vérifiez le résultat avec curl, puis relancez l’analyse.

Autres articles du blog