{"id":791,"date":"2026-05-05T06:00:00","date_gmt":"2026-05-05T04:00:00","guid":{"rendered":"https:\/\/alain.goudey.eu\/side\/?p=791"},"modified":"2026-05-05T07:48:48","modified_gmt":"2026-05-05T05:48:48","slug":"comment-rendre-son-site-agent-ready-guide-pratique-pour-depasser-90-100-sur-le-test-cloudflare","status":"publish","type":"post","link":"https:\/\/alain.goudey.eu\/side\/2026\/05\/05\/comment-rendre-son-site-agent-ready-guide-pratique-pour-depasser-90-100-sur-le-test-cloudflare\/","title":{"rendered":"Comment rendre son site Agent-Ready : guide pratique pour d\u00e9passer 90\/100 sur le test Cloudflare"},"content":{"rendered":"\n<p>En avril 2026, Cloudflare a lanc\u00e9&nbsp;<strong>IsItAgentReady<\/strong>, un outil de diagnostic qui \u00e9value la compatibilit\u00e9 d&rsquo;un site web avec les agents IA. Le principe est simple : entrer une URL, obtenir un score sur 100 et une liste de crit\u00e8res pass\u00e9s ou \u00e9chou\u00e9s. Le probl\u00e8me, c&rsquo;est que la quasi-totalit\u00e9 des sites web actuels obtiennent un score proche de z\u00e9ro.<\/p>\n\n\n\n<p>J&rsquo;ai d\u00e9cid\u00e9 de passer un site statique h\u00e9berg\u00e9 sur un mutualis\u00e9 Apache (OVH) de 0 \u00e0 100. Voici le retour d&rsquo;exp\u00e9rience complet, avec tous les fichiers, les pi\u00e8ges rencontr\u00e9s, et les solutions qui fonctionnent r\u00e9ellement en production. Comptez une demi-journ\u00e9e de travail si vous \u00eates \u00e0 l&rsquo;aise avec Apache et le terminal, une journ\u00e9e si vous d\u00e9couvrez ces sujets. Et mois si vous ma\u00eetrisez bien les outils IA (je suis pass\u00e9 de 25\/100 \u00e0 plus de 90\/100 avec Claude Cowork, en 1h environ).<\/p>\n\n\n\n<div class=\"wp-block-rank-math-toc-block\" id=\"rank-math-toc\"><h2>Sommaire<\/h2><nav><ul><li class=\"\"><a href=\"#pourquoi-rendre-son-site-agent-ready\">Pourquoi rendre son site Agent-Ready ?<\/a><\/li><li class=\"\"><a href=\"#ce-que-teste-exactement-is-it-agent-ready\">Ce que teste exactement IsItAgentReady<\/a><\/li><li class=\"\"><a href=\"#prerequis-avant-de-commencer\">Pr\u00e9requis avant de commencer pour aller vers un site agent-ready<\/a><\/li><li class=\"\"><a href=\"#les-9-criteres-du-test-is-it-agent-ready\">Les 9 crit\u00e8res du test IsItAgentReady<\/a><ul><\/ul><\/li><li class=\"\"><a href=\"#la-structure-de-fichiers-complete\">La structure de fichiers compl\u00e8te d&rsquo;un site agent-ready<\/a><\/li><li class=\"\"><a href=\"#le-htaccess-complet-sections-ajoutees\">Le .htaccess complet (sections ajout\u00e9es)<\/a><\/li><li class=\"\"><a href=\"#les-pieges-rencontres-et-comment-les-eviter\">Les pi\u00e8ges rencontr\u00e9s (et comment les \u00e9viter) pour un site agent-ready<\/a><\/li><li class=\"\"><a href=\"#verification-et-debogage\">V\u00e9rification et d\u00e9bogage du site agent-ready<\/a><\/li><li class=\"\"><a href=\"#au-dela-du-score-pourquoi-cest-important\">Au-del\u00e0 du score : pourquoi c&rsquo;est important un site agent-ready ?<\/a><\/li><li class=\"\"><a href=\"#feuille-de-route-par-ou-commencer\">Feuille de route du site agent-ready : par o\u00f9 commencer ?<\/a><\/li><li class=\"\"><a href=\"#adapter-la-demarche-selon-votre-stack-technique\">Adapter la d\u00e9marche du site agent-ready selon votre stack technique<\/a><\/li><li class=\"\"><a href=\"#et-le-llms-txt-dans-tout-ca\">Et le llms.txt dans tout \u00e7a ? C&rsquo;est important pour un site agent-ready ?<\/a><\/li><li class=\"\"><a href=\"#ressources-et-references\">Ressources et r\u00e9f\u00e9rences<\/a><\/li><\/ul><\/nav><\/div>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"pourquoi-rendre-son-site-agent-ready\">Pourquoi rendre son site Agent-Ready ?<\/h3>\n\n\n\n<p>Les moteurs de recherche classiques indexent vos pages depuis 25 ans. Mais une nouvelle g\u00e9n\u00e9ration de clients arrive : les&nbsp;<strong>agents IA<\/strong>. ChatGPT, Claude, Perplexity, Copilot et bient\u00f4t des milliers d&rsquo;agents sp\u00e9cialis\u00e9s parcourent le web pour r\u00e9pondre aux questions de leurs utilisateurs. Ces agents ne lisent pas le HTML comme un navigateur. Ils cherchent des m\u00e9tadonn\u00e9es structur\u00e9es, des fichiers descriptifs, des API standardis\u00e9es.<\/p>\n\n\n\n<p>Un site agent-ready est un site qui dit aux agents :&nbsp;<em>voici qui je suis, ce que je propose, comment acc\u00e9der \u00e0 mon contenu, et sous quelles conditions<\/em>. C&rsquo;est le SEO de demain, ou plus exactement le&nbsp;<strong>GEO<\/strong>&nbsp;(<a href=\"https:\/\/alain.goudey.eu\/side\/2026\/03\/20\/geo-marketing-et-share-of-voice-les-ia-generatives-redefinissent-la-visibilite-des-marques\/\" data-type=\"link\" data-id=\"https:\/\/alain.goudey.eu\/side\/2026\/03\/20\/geo-marketing-et-share-of-voice-les-ia-generatives-redefinissent-la-visibilite-des-marques\/\">Generative Engine Optimization<\/a>).<\/p>\n\n\n\n<p>Ce qui change fondamentalement par rapport au SEO classique, c&rsquo;est la nature de l&rsquo;interaction. Un bot Google crawle votre page, extrait des mots-cl\u00e9s, et vous classe dans un index. Un agent IA, lui,&nbsp;<strong>consomme<\/strong>&nbsp;votre contenu : il le lit, le synth\u00e9tise, et le reformule dans une r\u00e9ponse \u00e0 un utilisateur. Il peut aussi agir en votre nom s&rsquo;il trouve un formulaire de contact ou une API. Les m\u00e9tadonn\u00e9es que vous exposez ne servent plus seulement \u00e0 \u00eatre trouv\u00e9, mais \u00e0 \u00eatre&nbsp;<strong>compris et correctement repr\u00e9sent\u00e9<\/strong>&nbsp;dans les r\u00e9ponses g\u00e9n\u00e9ratives.<\/p>\n\n\n\n<p>La bonne nouvelle : tout cela est r\u00e9alisable sur n&rsquo;importe quel h\u00e9bergement web, y compris un mutualis\u00e9 OVH \u00e0 quelques euros par mois. Aucun framework n&rsquo;est n\u00e9cessaire, aucune d\u00e9pendance Node ou Python. Du HTML, du JSON, un peu de PHP, et un&nbsp;<code>.htaccess<\/code>&nbsp;bien configur\u00e9 suffisent.<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-large is-resized\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"702\" src=\"https:\/\/alain.goudey.eu\/side\/wp-content\/uploads\/2026\/05\/IsItAgentReady-1-1024x702.png\" alt=\"Illustration d\u2019un site web agent-ready optimis\u00e9 pour les agents IA avec IsItAgentReady de Cloudflare\" class=\"wp-image-794\" style=\"aspect-ratio:1.458716692555861;width:583px;height:auto\" srcset=\"https:\/\/alain.goudey.eu\/side\/wp-content\/uploads\/2026\/05\/IsItAgentReady-1-1024x702.png 1024w, https:\/\/alain.goudey.eu\/side\/wp-content\/uploads\/2026\/05\/IsItAgentReady-1-300x206.png 300w, https:\/\/alain.goudey.eu\/side\/wp-content\/uploads\/2026\/05\/IsItAgentReady-1-768x526.png 768w, https:\/\/alain.goudey.eu\/side\/wp-content\/uploads\/2026\/05\/IsItAgentReady-1.png 1125w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n<\/div>\n\n\n<p>Pour situer l&rsquo;enjeu : au moment o\u00f9 j&rsquo;\u00e9cris ces lignes (mai 2026), la majorit\u00e9 des sites web obtiennent un score inf\u00e9rieur \u00e0 10 sur le test IsItAgentReady. M\u00eame des sites majeurs (voir ci-dessous <a href=\"http:\/\/www.lemonde.fr\" data-type=\"link\" data-id=\"www.lemonde.fr\" target=\"_blank\" rel=\"noopener\">lemonde.fr<\/a> avec un score de 25\/100 \u00e0 la date du 05\/05\/2026), avec des \u00e9quipes techniques importantes, n&rsquo;ont pas encore impl\u00e9ment\u00e9 ces standards. C&rsquo;est \u00e0 la fois un constat et une opportunit\u00e9 : si vous faites le travail maintenant, vous serez dans la poign\u00e9e de sites qui parlent couramment la langue des agents IA.<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-large is-resized\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"781\" src=\"https:\/\/alain.goudey.eu\/side\/wp-content\/uploads\/2026\/05\/image-1024x781.png\" alt=\"Le site lemonde.fr n'a un score que de 25\/100 au test site agent-ready de Cloudflare\" class=\"wp-image-801\" style=\"width:563px;height:auto\" srcset=\"https:\/\/alain.goudey.eu\/side\/wp-content\/uploads\/2026\/05\/image-1024x781.png 1024w, https:\/\/alain.goudey.eu\/side\/wp-content\/uploads\/2026\/05\/image-300x229.png 300w, https:\/\/alain.goudey.eu\/side\/wp-content\/uploads\/2026\/05\/image-768x586.png 768w, https:\/\/alain.goudey.eu\/side\/wp-content\/uploads\/2026\/05\/image.png 1147w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n<\/div>\n\n\n<h3 class=\"wp-block-heading\" id=\"ce-que-teste-exactement-is-it-agent-ready\">Ce que teste exactement IsItAgentReady<\/h3>\n\n\n\n<p>L&rsquo;outil de Cloudflare fonctionne de mani\u00e8re transparente : il envoie des requ\u00eates HTTP \u00e0 votre site et analyse les r\u00e9ponses. Pour les Link headers, il inspecte les en-t\u00eates de la r\u00e9ponse HTTP de votre page d&rsquo;accueil. Pour le Content-Signal, il t\u00e9l\u00e9charge votre&nbsp;<code>robots.txt<\/code>&nbsp;et cherche la directive dans un bloc&nbsp;<code>User-agent<\/code>. Pour le content negotiation Markdown, il envoie une requ\u00eate avec&nbsp;<code>Accept: text\/markdown<\/code>&nbsp;et v\u00e9rifie que la r\u00e9ponse contient du Markdown (et non du HTML). Pour les fichiers&nbsp;<code>.well-known<\/code>, il tente de les t\u00e9l\u00e9charger et valide leur structure JSON. Pour WebMCP, il analyse le HTML de votre page d&rsquo;accueil \u00e0 la recherche d&rsquo;un script qui appelle&nbsp;<code>navigator.modelContext.provideContext()<\/code>&nbsp;ou expose&nbsp;<code>window.__webmcp_tools<\/code>.<\/p>\n\n\n\n<p>Chaque crit\u00e8re vaut environ 11 points. Un score de 92 signifie que 8 crit\u00e8res sur 9 sont valid\u00e9s. Le test est binaire par crit\u00e8re : il passe ou il \u00e9choue, il n&rsquo;y a pas de score partiel. Cela signifie qu&rsquo;une erreur de syntaxe JSON dans un seul fichier vous co\u00fbte 11 points d&rsquo;un coup. C&rsquo;est \u00e0 la fois frustrant (pas de gratification progressive) et motivant (chaque fichier corrig\u00e9 fait bondir le score). J&rsquo;ai toutefois constat\u00e9 un souci car mon robots.txt est une ancienne version qui ne se met pas \u00e0 jour dans le test cloudflare en d\u00e9pit de mes modifications sur le site. Th\u00e9oriquement je devrai \u00eatre \u00e0 100\/100.<\/p>\n\n\n\n<p>L&rsquo;outil est accessible gratuitement sur&nbsp;<a href=\"https:\/\/isitagentready.com\" target=\"_blank\" rel=\"noreferrer noopener\">isitagentready.com<\/a>. Entrez votre URL, cliquez sur \u00ab\u00a0Scan\u00a0\u00bb, et en quelques secondes vous obtenez un diagnostic complet avec, pour chaque crit\u00e8re, un statut vert (pass\u00e9) ou rouge (\u00e9chou\u00e9) et un lien vers la documentation correspondante.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"prerequis-avant-de-commencer\">Pr\u00e9requis avant de commencer pour aller vers un site agent-ready<\/h3>\n\n\n\n<p>Avant de se lancer, assurez-vous d&rsquo;avoir un&nbsp;<strong>fichier&nbsp;<code>llms.txt<\/code><\/strong>&nbsp;\u00e0 la racine de votre site. Ce fichier, popularis\u00e9 par le standard&nbsp;<a href=\"https:\/\/llmstxt.org\" target=\"_blank\" rel=\"noreferrer noopener\">llmstxt.org<\/a>, est une description structur\u00e9e de votre site destin\u00e9e aux LLM. Il n&rsquo;est pas directement not\u00e9 par IsItAgentReady, mais il est r\u00e9f\u00e9renc\u00e9 par quatre des neuf crit\u00e8res (Link headers, API Catalog, MCP Server Card, Agent Skills). C&rsquo;est le socle informationnel de toute la d\u00e9marche.<\/p>\n\n\n\n<p>Un bon&nbsp;<code>llms.txt<\/code>&nbsp;contient : une pr\u00e9sentation synth\u00e9tique du site et de son auteur, les th\u00e9matiques couvertes, les pages cl\u00e9s avec leurs URLs, et les informations de contact. R\u00e9digez-le comme si vous deviez briefer un assistant IA en 60 secondes sur qui vous \u00eates et ce qu&rsquo;on trouve sur votre site.<\/p>\n\n\n\n<p>Vous aurez aussi besoin d&rsquo;un acc\u00e8s FTP ou SSH \u00e0 votre h\u00e9bergement, de PHP disponible (m\u00eame sur un mutualis\u00e9 basique, c&rsquo;est le cas), et d&rsquo;un terminal avec&nbsp;<code>curl<\/code>&nbsp;pour tester vos modifications. Un \u00e9diteur de texte avec coloration JSON est un plus appr\u00e9ciable vu le nombre de fichiers JSON \u00e0 cr\u00e9er.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"les-9-criteres-du-test-is-it-agent-ready\">Les 9 crit\u00e8res du test IsItAgentReady<\/h3>\n\n\n\n<p>L&rsquo;outil de Cloudflare \u00e9value 9 signaux, chacun valant environ 11 points. Voici chacun d&rsquo;entre eux avec l&rsquo;impl\u00e9mentation concr\u00e8te qui m&rsquo;a permis de les valider.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"1-link-response-headers-rfc-8288\">1. Link Response Headers (RFC 8288)<\/h4>\n\n\n\n<p>Le premier crit\u00e8re v\u00e9rifie que votre serveur envoie des en-t\u00eates HTTP&nbsp;<code>Link<\/code>&nbsp;pour guider les agents vers les ressources de d\u00e9couverte du site. C&rsquo;est l&rsquo;\u00e9quivalent d&rsquo;un panneau indicateur \u00e0 l&rsquo;entr\u00e9e : \u00ab\u00a0le plan du site est par ici, la documentation est par l\u00e0\u00a0\u00bb.<\/p>\n\n\n\n<p><strong>Ce qu&rsquo;il faut envoyer :<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Link: &lt;\/.well-known\/api-catalog&gt;; rel=\"api-catalog\"\nLink: &lt;\/llms.txt&gt;; rel=\"service-doc\"\nLink: &lt;\/.well-known\/agent-skills\/index.json&gt;; rel=\"describedby\"<\/code><\/pre>\n\n\n\n<p><strong>Le pi\u00e8ge Apache\/OVH :<\/strong>&nbsp;sur un h\u00e9bergement mutualis\u00e9, les directives&nbsp;<code>Header set<\/code>&nbsp;ou&nbsp;<code>Header append<\/code>&nbsp;dans le&nbsp;<code>.htaccess<\/code>&nbsp;ne fonctionnent pas toujours, m\u00eame avec&nbsp;<code>mod_headers<\/code>&nbsp;activ\u00e9. J&rsquo;ai perdu du temps \u00e0 tester diff\u00e9rentes syntaxes (<code>&lt;Files&gt;<\/code>,&nbsp;<code>SetEnvIf<\/code>,&nbsp;<code>Header always append<\/code>) sans succ\u00e8s.<\/p>\n\n\n\n<p><strong>La solution qui fonctionne :<\/strong>&nbsp;passer par PHP. Cr\u00e9ez un fichier&nbsp;<code>index.php<\/code>&nbsp;\u00e0 la racine :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&lt;?php\nheader('Link: &lt;\/.well-known\/api-catalog&gt;; rel=\"api-catalog\"', false);\nheader('Link: &lt;\/llms.txt&gt;; rel=\"service-doc\"', false);\nheader('Link: &lt;\/.well-known\/agent-skills\/index.json&gt;; rel=\"describedby\"', false);\nreadfile(__DIR__ . '\/index.html');\n<\/code><\/pre>\n\n\n\n<p>Le param\u00e8tre&nbsp;<code>false<\/code>&nbsp;dans&nbsp;<code>header()<\/code>&nbsp;est crucial : il permet d&rsquo;envoyer plusieurs en-t\u00eates&nbsp;<code>Link<\/code>&nbsp;sans que chaque appel \u00e9crase le pr\u00e9c\u00e9dent. Ensuite, ajoutez dans votre&nbsp;<code>.htaccess<\/code>&nbsp;:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>DirectoryIndex index.php index.html<\/code><\/pre>\n\n\n\n<p>Ainsi, Apache servira&nbsp;<code>index.php<\/code>&nbsp;en priorit\u00e9, qui injectera les en-t\u00eates puis affichera votre&nbsp;<code>index.html<\/code>&nbsp;normalement. Du point de vue du visiteur, rien ne change : le contenu HTML est identique, le temps de chargement reste le m\u00eame. Seuls les en-t\u00eates HTTP sont enrichis.<\/p>\n\n\n\n<p>V\u00e9rifiez avec les DevTools du navigateur (onglet Network &gt; cliquez sur la requ\u00eate vers&nbsp;<code>\/<\/code>&nbsp;&gt; onglet Headers) que les trois en-t\u00eates&nbsp;<code>Link<\/code>&nbsp;apparaissent bien dans la section \u00ab\u00a0Response Headers\u00a0\u00bb. Vous pouvez aussi utiliser&nbsp;<code>curl -I https:\/\/votre-site.fr\/<\/code>&nbsp;depuis le terminal.<\/p>\n\n\n\n<p><strong>Pourquoi trois en-t\u00eates Link ?<\/strong>&nbsp;Chacun pointe vers un type de ressource diff\u00e9rent. Le&nbsp;<code>rel=\"api-catalog\"<\/code>&nbsp;dit aux agents \u00ab\u00a0voici le catalogue de mes API\u00a0\u00bb (RFC 9727). Le&nbsp;<code>rel=\"service-doc\"<\/code>&nbsp;dit \u00ab\u00a0voici ma documentation principale\u00a0\u00bb (dans notre cas, le&nbsp;<code>llms.txt<\/code>). Le&nbsp;<code>rel=\"describedby\"<\/code>&nbsp;dit \u00ab\u00a0voici une description structur\u00e9e de mes capacit\u00e9s\u00a0\u00bb (le fichier Agent Skills). Ensemble, ces trois en-t\u00eates forment un trio de d\u00e9couverte qui permet \u00e0 n&rsquo;importe quel agent de comprendre votre site d\u00e8s la premi\u00e8re requ\u00eate HTTP, avant m\u00eame de parser le HTML.<\/p>\n\n\n\n<p><strong>Variante Nginx :<\/strong>&nbsp;si vous \u00eates sur Nginx au lieu d&rsquo;Apache, ajoutez directement dans votre bloc&nbsp;<code>server<\/code>&nbsp;:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>add_header Link '&lt;\/.well-known\/api-catalog&gt;; rel=\"api-catalog\"' always;\nadd_header Link '&lt;\/llms.txt&gt;; rel=\"service-doc\"' always;\nadd_header Link '&lt;\/.well-known\/agent-skills\/index.json&gt;; rel=\"describedby\"' always;<\/code><\/pre>\n\n\n\n<p><strong>Variante Node.js \/ Express :<\/strong>&nbsp;si votre site tourne sous Express, ajoutez un middleware :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>app.use((req, res, next) =&gt; {\n  res.append('Link', '&lt;\/.well-known\/api-catalog&gt;; rel=\"api-catalog\"');\n  res.append('Link', '&lt;\/llms.txt&gt;; rel=\"service-doc\"');\n  res.append('Link', '&lt;\/.well-known\/agent-skills\/index.json&gt;; rel=\"describedby\"');\n  next();\n});<\/code><\/pre>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"2-markdown-pour-les-agents-content-negotiation\">2. Markdown pour les Agents (Content Negotiation)<\/h4>\n\n\n\n<p>L&rsquo;id\u00e9e est simple : quand un agent envoie&nbsp;<code>Accept: text\/markdown<\/code>&nbsp;dans sa requ\u00eate HTTP, votre serveur lui sert une version Markdown de la page au lieu du HTML. L&rsquo;agent obtient ainsi du contenu propre, sans balisage, facile \u00e0 traiter.<\/p>\n\n\n\n<p><strong>Impl\u00e9mentation :<\/strong>&nbsp;cr\u00e9ez un dossier&nbsp;<code>\/md\/<\/code>&nbsp;\u00e0 la racine contenant une version&nbsp;<code>.md<\/code>&nbsp;de chaque page. Par exemple,&nbsp;<code>\/md\/index.md<\/code>,&nbsp;<code>\/md\/contact.md<\/code>,&nbsp;<code>\/md\/expertise.md<\/code>, etc.<\/p>\n\n\n\n<p>Ajoutez ensuite ces r\u00e8gles dans votre&nbsp;<code>.htaccess<\/code>&nbsp;:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code># Content negotiation - Markdown pour agents\n&lt;IfModule mod_rewrite.c&gt;\n  RewriteCond %{HTTP_ACCEPT} text\/markdown\n  RewriteCond %{REQUEST_FILENAME} !-d\n  RewriteCond %{DOCUMENT_ROOT}\/md%{REQUEST_URI}.md -f\n  RewriteRule ^(.*)$ \/md\/$1.md &#91;L]\n\n  RewriteCond %{HTTP_ACCEPT} text\/markdown\n  RewriteRule ^\/?$ \/md\/index.md &#91;L]\n&lt;\/IfModule&gt;\n\n&lt;IfModule mod_headers.c&gt;\n  &lt;FilesMatch \"\\.md$\"&gt;\n    Header set Content-Type \"text\/markdown; charset=utf-8\"\n  &lt;\/FilesMatch&gt;\n&lt;\/IfModule&gt;<\/code><\/pre>\n\n\n\n<p>La premi\u00e8re r\u00e8gle g\u00e8re les pages internes (<code>\/expertise<\/code>&nbsp;\u2192&nbsp;<code>\/md\/expertise.md<\/code>), la seconde g\u00e8re la page d&rsquo;accueil. Vous pouvez tester avec&nbsp;<code>curl<\/code>&nbsp;:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>curl -H \"Accept: text\/markdown\" https:\/\/votre-site.fr\/expertise<\/code><\/pre>\n\n\n\n<p><strong>Conseil :<\/strong>&nbsp;pour le fichier&nbsp;<code>\/md\/index.md<\/code>, vous pouvez r\u00e9utiliser le contenu de votre&nbsp;<code>llms.txt<\/code>&nbsp;si vous en avez un. Les deux remplissent une fonction similaire.<\/p>\n\n\n\n<p><strong>Sur le contenu des fichiers Markdown :<\/strong>&nbsp;ne vous contentez pas d&rsquo;un export brut du HTML vers Markdown. Profitez-en pour structurer le contenu de mani\u00e8re optimale pour un LLM : des en-t\u00eates clairs, des listes \u00e0 puces pour les faits cl\u00e9s, des m\u00e9tadonn\u00e9es en d\u00e9but de fichier (nom, titre, institution, contact). Un agent qui re\u00e7oit du Markdown bien structur\u00e9 produira des r\u00e9ponses beaucoup plus pr\u00e9cises qu&rsquo;avec du HTML pars\u00e9 approximativement.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"3-content-signals-dans-robots-txt\">3. Content Signals dans robots.txt<\/h4>\n\n\n\n<p>Les Content Signals sont une extension du&nbsp;<code>robots.txt<\/code>&nbsp;(proposition IETF en cours via&nbsp;<a href=\"https:\/\/contentsignals.org\" target=\"_blank\" rel=\"noreferrer noopener\">contentsignals.org<\/a>) qui permet d&rsquo;exprimer des pr\u00e9f\u00e9rences granulaires sur l&rsquo;utilisation de votre contenu par les IA : entra\u00eenement autoris\u00e9 ou non, recherche autoris\u00e9e, utilisation en entr\u00e9e de prompt, etc.<\/p>\n\n\n\n<p><strong>Le pi\u00e8ge :<\/strong>&nbsp;la directive&nbsp;<code>Content-Signal<\/code>&nbsp;doit imp\u00e9rativement se trouver&nbsp;<strong>\u00e0 l&rsquo;int\u00e9rieur d&rsquo;un bloc&nbsp;<code>User-agent<\/code><\/strong>, et non pas flottante en fin de fichier. C&rsquo;est la subtilit\u00e9 qui m&rsquo;a co\u00fbt\u00e9 plusieurs tentatives.<\/p>\n\n\n\n<p><strong>Format correct :<\/strong>&nbsp;placez ceci&nbsp;<strong>en tout d\u00e9but<\/strong>&nbsp;de votre&nbsp;<code>robots.txt<\/code>, avant les autres blocs&nbsp;<code>User-agent<\/code>&nbsp;:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code># Content Signals (AI preferences)\nUser-agent: *\nContent-Signal: ai-train=no, search=yes, ai-input=no<\/code><\/pre>\n\n\n\n<p>Ici,&nbsp;<code>ai-train=no<\/code>&nbsp;signifie que vous n&rsquo;autorisez pas l&rsquo;utilisation de votre contenu pour entra\u00eener des mod\u00e8les,&nbsp;<code>search=yes<\/code>&nbsp;autorise l&rsquo;indexation pour la recherche (y compris IA), et&nbsp;<code>ai-input=no<\/code>&nbsp;interdit l&rsquo;injection de votre contenu comme entr\u00e9e de prompt. Adaptez ces valeurs selon votre politique.<\/p>\n\n\n\n<p><strong>Important :<\/strong>&nbsp;le bloc&nbsp;<code>Content-Signal<\/code>&nbsp;doit \u00eatre rattach\u00e9 \u00e0 un&nbsp;<code>User-agent: *<\/code>&nbsp;et non isol\u00e9. Le parseur de l&rsquo;outil Cloudflare ne le d\u00e9tectera pas autrement.<\/p>\n\n\n\n<p><strong>Valeurs possibles :<\/strong>&nbsp;les signaux reconnus incluent&nbsp;<code>ai-train<\/code>&nbsp;(entra\u00eenement de mod\u00e8les),&nbsp;<code>search<\/code>&nbsp;(indexation pour la recherche),&nbsp;<code>ai-input<\/code>&nbsp;(utilisation comme contexte de prompt), et&nbsp;<code>ai-summarize<\/code>&nbsp;(r\u00e9sum\u00e9 automatique). Chacun accepte&nbsp;<code>yes<\/code>&nbsp;ou&nbsp;<code>no<\/code>. Vous pouvez les combiner sur une seule ligne s\u00e9par\u00e9e par des virgules, ou les d\u00e9clarer sur des lignes s\u00e9par\u00e9es. La syntaxe sur une seule ligne est plus compacte et fonctionne bien avec le parseur Cloudflare.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"4-api-catalog-rfc-9727\">4. API Catalog (RFC 9727)<\/h4>\n\n\n\n<p>Le fichier&nbsp;<code>\/.well-known\/api-catalog<\/code>&nbsp;est un standard W3C\/IETF qui recense les API et services expos\u00e9s par un site. M\u00eame un site statique sans API au sens strict peut l&rsquo;impl\u00e9menter en r\u00e9f\u00e9ren\u00e7ant ses points d&rsquo;entr\u00e9e informationnels.<\/p>\n\n\n\n<p>Cr\u00e9ez le fichier&nbsp;<code>\/.well-known\/api-catalog<\/code>&nbsp;(sans extension) avec le type MIME&nbsp;<code>application\/linkset+json<\/code>&nbsp;:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>{\n  \"linkset\": &#91;\n    {\n      \"anchor\": \"https:\/\/votre-site.fr\/\",\n      \"service-desc\": &#91;\n        {\n          \"href\": \"https:\/\/votre-site.fr\/llms.txt\",\n          \"type\": \"text\/plain\"\n        }\n      ],\n      \"service-doc\": &#91;\n        {\n          \"href\": \"https:\/\/votre-site.fr\/llms.txt\",\n          \"type\": \"text\/plain\"\n        }\n      ],\n      \"status\": &#91;\n        {\n          \"href\": \"https:\/\/votre-site.fr\/\",\n          \"type\": \"text\/html\"\n        }\n      ]\n    }\n  ]\n}<\/code><\/pre>\n\n\n\n<p>Et dans votre&nbsp;<code>.htaccess<\/code>, assurez-vous que le type MIME est correctement d\u00e9clar\u00e9 :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&lt;IfModule mod_mime.c&gt;\n  AddType application\/linkset+json api-catalog\n&lt;\/IfModule&gt;<\/code><\/pre>\n\n\n\n<p><strong>Pour aller plus loin :<\/strong>&nbsp;si votre site expose une vraie API REST (un endpoint de recherche, un flux RSS structur\u00e9, etc.), ajoutez-la comme entr\u00e9e suppl\u00e9mentaire dans le&nbsp;<code>linkset<\/code>. Le standard RFC 9727 est con\u00e7u pour r\u00e9f\u00e9rencer plusieurs services : chaque objet du tableau&nbsp;<code>linkset<\/code>&nbsp;peut avoir son propre&nbsp;<code>anchor<\/code>&nbsp;et ses propres relations. Pour un site statique, une seule entr\u00e9e suffit.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"5-o-auth-open-id-connect-discovery\">5. OAuth \/ OpenID Connect Discovery<\/h4>\n\n\n\n<p>Ce crit\u00e8re v\u00e9rifie l&rsquo;existence du fichier&nbsp;<code>\/.well-known\/openid-configuration<\/code>. Pour un site public sans authentification, il suffit de cr\u00e9er un fichier minimal qui indique que le contenu est librement accessible :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>{\n  \"issuer\": \"https:\/\/votre-site.fr\",\n  \"authorization_endpoint\": \"https:\/\/votre-site.fr\/contact\",\n  \"token_endpoint\": \"https:\/\/votre-site.fr\/contact\",\n  \"response_types_supported\": &#91;\"code\"],\n  \"grant_types_supported\": &#91;\"authorization_code\"],\n  \"subject_types_supported\": &#91;\"public\"],\n  \"id_token_signing_alg_values_supported\": &#91;\"RS256\"],\n  \"scopes_supported\": &#91;\"openid\", \"profile\"],\n  \"service_documentation\": \"https:\/\/votre-site.fr\/llms.txt\",\n  \"x-note\": \"Site public sans API protegee. Ce fichier est fourni pour la conformite agent discovery uniquement.\"\n}<\/code><\/pre>\n\n\n\n<p>Le champ&nbsp;<code>x-note<\/code>&nbsp;est une convention (pr\u00e9fixe&nbsp;<code>x-<\/code>) pour indiquer aux d\u00e9veloppeurs et aux agents que ce fichier est purement d\u00e9claratif. Un agent bien con\u00e7u comprendra qu&rsquo;il n&rsquo;y a pas d&rsquo;authentification \u00e0 n\u00e9gocier ici.<\/p>\n\n\n\n<p><strong>Pourquoi l&rsquo;inclure si on n&rsquo;a pas d&rsquo;API ?<\/strong>&nbsp;Parce que l&rsquo;absence du fichier est interpr\u00e9t\u00e9e comme un signal n\u00e9gatif par le test Cloudflare. Sa pr\u00e9sence, m\u00eame minimale, indique que vous avez r\u00e9fl\u00e9chi \u00e0 la question de l&rsquo;authentification et que vous avez choisi de rendre votre contenu librement accessible. C&rsquo;est de la communication intentionnelle.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"6-o-auth-protected-resource-metadata-rfc-9728\">6. OAuth Protected Resource Metadata (RFC 9728)<\/h4>\n\n\n\n<p>M\u00eame logique : le fichier&nbsp;<code>\/.well-known\/oauth-protected-resource<\/code>&nbsp;d\u00e9clare les ressources prot\u00e9g\u00e9es par OAuth. Pour un site enti\u00e8rement public, on indique simplement que tout est accessible en lecture sans authentification :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>{\n  \"resource\": \"https:\/\/votre-site.fr\",\n  \"authorization_servers\": &#91;\"https:\/\/votre-site.fr\"],\n  \"scopes_supported\": &#91;\"read\"],\n  \"x-note\": \"Site public. Tout le contenu est accessible sans authentification.\"\n}<\/code><\/pre>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"7-mcp-server-card\">7. MCP Server Card<\/h4>\n\n\n\n<p>Le&nbsp;<strong>Model Context Protocol<\/strong>&nbsp;(MCP) est un standard \u00e9mergent qui permet aux agents IA de d\u00e9couvrir et d&rsquo;interagir avec des services. Le \u00ab\u00a0Server Card\u00a0\u00bb est la carte de visite MCP de votre site. Ce fichier se place dans&nbsp;<code>\/.well-known\/mcp\/server-card.json<\/code>&nbsp;:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>{\n  \"serverInfo\": {\n    \"name\": \"mon-site\",\n    \"version\": \"1.0.0\",\n    \"description\": \"Description concise de votre site et de son contenu principal.\"\n  },\n  \"transport\": {\n    \"type\": \"https\",\n    \"url\": \"https:\/\/votre-site.fr\"\n  },\n  \"capabilities\": {\n    \"resources\": true,\n    \"tools\": false,\n    \"prompts\": false\n  },\n  \"resources\": &#91;\n    {\n      \"name\": \"llms-txt\",\n      \"description\": \"Informations structurees pour les LLMs\",\n      \"uri\": \"https:\/\/votre-site.fr\/llms.txt\",\n      \"mimeType\": \"text\/plain\"\n    },\n    {\n      \"name\": \"sitemap\",\n      \"description\": \"Plan du site XML\",\n      \"uri\": \"https:\/\/votre-site.fr\/sitemap.xml\",\n      \"mimeType\": \"application\/xml\"\n    }\n  ]\n}<\/code><\/pre>\n\n\n\n<p>D\u00e9clarez&nbsp;<code>\"tools\": false<\/code>&nbsp;et&nbsp;<code>\"prompts\": false<\/code>&nbsp;si votre site est purement informationnel (pas d&rsquo;API REST, pas de fonction callable). Si vous avez un formulaire de contact, vous pouvez choisir de ne pas l&rsquo;exposer comme \u00ab\u00a0tool\u00a0\u00bb MCP pour \u00e9viter le spam automatis\u00e9. Listez dans&nbsp;<code>resources<\/code>&nbsp;les fichiers cl\u00e9s que les agents devraient conna\u00eetre en priorit\u00e9.<\/p>\n\n\n\n<p><strong>Note sur la sp\u00e9cification :<\/strong>&nbsp;la MCP Server Card est d\u00e9finie dans le&nbsp;<a href=\"https:\/\/github.com\/nichochar\/mcp-server-card\" target=\"_blank\" rel=\"noreferrer noopener\">SEP-1649<\/a>&nbsp;du Model Context Protocol. Le standard est encore jeune et susceptible d&rsquo;\u00e9voluer, mais le chemin&nbsp;<code>\/.well-known\/mcp\/server-card.json<\/code>&nbsp;est d\u00e9j\u00e0 reconnu par plusieurs scanners et agents.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"8-agent-skills-discovery\">8. Agent Skills Discovery<\/h4>\n\n\n\n<p>Le standard Agent Skills (<a href=\"https:\/\/agentskills.io\" target=\"_blank\" rel=\"noreferrer noopener\">agentskills.io<\/a>, v0.2.0) permet de d\u00e9crire les \u00ab\u00a0comp\u00e9tences\u00a0\u00bb de votre site : quelles informations un agent peut-il y trouver, quelles actions peut-il y effectuer ? Le fichier se place dans&nbsp;<code>\/.well-known\/agent-skills\/index.json<\/code>&nbsp;:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>{\n  \"$schema\": \"https:\/\/agentskills.io\/schema\/v0.2.0\/index.json\",\n  \"skills\": &#91;\n    {\n      \"name\": \"get-biography\",\n      \"type\": \"resource\",\n      \"description\": \"Retrieve structured biographical information.\",\n      \"url\": \"https:\/\/votre-site.fr\/llms.txt\",\n      \"sha256\": \"abc123...\"\n    },\n    {\n      \"name\": \"browse-publications\",\n      \"type\": \"resource\",\n      \"description\": \"Browse academic publications.\",\n      \"url\": \"https:\/\/votre-site.fr\/publications\",\n      \"sha256\": \"def456...\"\n    },\n    {\n      \"name\": \"contact-form\",\n      \"type\": \"action\",\n      \"description\": \"Submit a contact request via the form.\",\n      \"url\": \"https:\/\/votre-site.fr\/contact\",\n      \"sha256\": \"ghi789...\"\n    }\n  ]\n}<\/code><\/pre>\n\n\n\n<p>Chaque skill a un&nbsp;<code>type<\/code>&nbsp;(<code>resource<\/code>&nbsp;pour du contenu consultable,&nbsp;<code>action<\/code>&nbsp;pour un formulaire ou une interaction) et un hash SHA-256 du fichier r\u00e9f\u00e9renc\u00e9, qui permet aux agents de v\u00e9rifier l&rsquo;int\u00e9grit\u00e9 du contenu. Pour calculer le hash :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>sha256sum votre-fichier.html<\/code><\/pre>\n\n\n\n<p><strong>Pensez \u00e0 mettre \u00e0 jour les hash<\/strong>&nbsp;chaque fois que vous modifiez les fichiers r\u00e9f\u00e9renc\u00e9s.<\/p>\n\n\n\n<p><strong>Combien de skills d\u00e9clarer ?<\/strong>&nbsp;Il n&rsquo;y a pas de minimum ni de maximum, mais visez la pertinence. Chaque skill doit correspondre \u00e0 une action ou une ressource r\u00e9ellement utile pour un agent. Un site vitrine peut en avoir 3 \u00e0 5 (biographie, publications, portfolio, contact). Un site e-commerce pourrait en avoir davantage (catalogue produits, suivi commande, politique retour, etc.). L&rsquo;important est que la description soit suffisamment pr\u00e9cise pour qu&rsquo;un agent sache quand utiliser chaque skill.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"9-web-mcp-browser-api\">9. WebMCP (Browser API)<\/h4>\n\n\n\n<p>WebMCP est le crit\u00e8re le plus avant-gardiste. Il s&rsquo;agit d&rsquo;exposer des \u00ab\u00a0outils\u00a0\u00bb directement dans le navigateur via l&rsquo;API JavaScript&nbsp;<code>navigator.modelContext.provideContext()<\/code>. Quand un agent IA navigue sur votre site via un navigateur (comme le font d\u00e9j\u00e0 Claude, ChatGPT avec browsing, ou Perplexity), il peut appeler ces outils pour obtenir des donn\u00e9es structur\u00e9es.<\/p>\n\n\n\n<p>Cr\u00e9ez un fichier&nbsp;<code>\/js\/webmcp.js<\/code>&nbsp;:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>(function() {\n  'use strict';\n  if (typeof navigator === 'undefined') return;\n\n  var tools = &#91;\n    {\n      name: \"get_site_info\",\n      description: \"Get structured information about this website.\",\n      inputSchema: {\n        type: \"object\",\n        properties: {},\n        required: &#91;]\n      },\n      execute: function() {\n        return fetch('\/llms.txt')\n          .then(function(r) { return r.text(); })\n          .then(function(text) { return { content: text }; });\n      }\n    },\n    {\n      name: \"get_contact_info\",\n      description: \"Get contact information.\",\n      inputSchema: {\n        type: \"object\",\n        properties: {},\n        required: &#91;]\n      },\n      execute: function() {\n        return Promise.resolve({\n          contact_url: \"https:\/\/votre-site.fr\/contact\",\n          response_time: \"48-72 heures\"\n        });\n      }\n    }\n  ];\n\n  if (navigator.modelContext &amp;&amp;\n      typeof navigator.modelContext.provideContext === 'function') {\n    navigator.modelContext.provideContext({ tools: tools });\n  }\n\n  window.__webmcp_tools = tools;\n})();<\/code><\/pre>\n\n\n\n<p>Incluez ensuite ce script dans toutes vos pages HTML :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&lt;script src=\"\/js\/webmcp.js\" defer&gt;&lt;\/script&gt;<\/code><\/pre>\n\n\n\n<p>L&rsquo;API&nbsp;<code>navigator.modelContext<\/code>&nbsp;n&rsquo;est pas encore support\u00e9e par les navigateurs grand public, mais elle est d\u00e9j\u00e0 utilis\u00e9e par les agents qui naviguent via des navigateurs instrument\u00e9s (Playwright, Puppeteer, ou les modes \u00ab\u00a0browsing\u00a0\u00bb des LLM). Le script se d\u00e9grade gracieusement : si l&rsquo;API n&rsquo;existe pas, il ne fait rien. L&rsquo;exposer sur&nbsp;<code>window.__webmcp_tools<\/code>&nbsp;en fallback permet aux agents qui ne supportent pas l&rsquo;API native de d\u00e9couvrir les outils via le DOM.<\/p>\n\n\n\n<p><strong>Quels outils d\u00e9clarer ?<\/strong>&nbsp;Pensez \u00e0 ce qu&rsquo;un agent pourrait vouloir savoir sur votre site sans parser le HTML : informations de contact, th\u00e9matiques principales, catalogue de services. Chaque outil a un&nbsp;<code>inputSchema<\/code>&nbsp;(JSON Schema d\u00e9crivant les param\u00e8tres attendus) et une fonction&nbsp;<code>execute<\/code>&nbsp;qui retourne une Promise. Gardez les outils simples et sans effets de bord pour les types&nbsp;<code>resource<\/code>.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"la-structure-de-fichiers-complete\">La structure de fichiers compl\u00e8te d&rsquo;un site agent-ready<\/h3>\n\n\n\n<p>Au final, voici les fichiers ajout\u00e9s ou modifi\u00e9s pour un site statique Apache :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>\/\n\u251c\u2500\u2500 .htaccess                              (modifie)\n\u251c\u2500\u2500 index.php                              (nouveau)\n\u251c\u2500\u2500 index.html                             (inchange)\n\u251c\u2500\u2500 robots.txt                             (modifie)\n\u251c\u2500\u2500 llms.txt                               (recommande, meme si non note)\n\u251c\u2500\u2500 js\/\n\u2502   \u2514\u2500\u2500 webmcp.js                          (nouveau)\n\u251c\u2500\u2500 md\/\n\u2502   \u251c\u2500\u2500 index.md                           (nouveau)\n\u2502   \u251c\u2500\u2500 contact.md                         (nouveau)\n\u2502   \u2514\u2500\u2500 ...                                (une version .md par page)\n\u2514\u2500\u2500 .well-known\/\n    \u251c\u2500\u2500 api-catalog                        (nouveau)\n    \u251c\u2500\u2500 openid-configuration               (nouveau)\n    \u251c\u2500\u2500 oauth-protected-resource           (nouveau)\n    \u251c\u2500\u2500 mcp\/\n    \u2502   \u2514\u2500\u2500 server-card.json               (nouveau)\n    \u2514\u2500\u2500 agent-skills\/\n        \u2514\u2500\u2500 index.json                     (nouveau)<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"le-htaccess-complet-sections-ajoutees\">Le .htaccess complet (sections ajout\u00e9es)<\/h3>\n\n\n\n<p>Voici les blocs \u00e0 ajouter \u00e0 votre&nbsp;<code>.htaccess<\/code>&nbsp;existant. L&rsquo;ensemble est compatible avec un h\u00e9bergement mutualis\u00e9 Apache standard :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code># Priorite index.php pour les Link headers\nDirectoryIndex index.php index.html\n\n# Content negotiation - Markdown pour agents\n&lt;IfModule mod_rewrite.c&gt;\n  RewriteCond %{HTTP_ACCEPT} text\/markdown\n  RewriteCond %{REQUEST_FILENAME} !-d\n  RewriteCond %{DOCUMENT_ROOT}\/md%{REQUEST_URI}.md -f\n  RewriteRule ^(.*)$ \/md\/$1.md &#91;L]\n\n  RewriteCond %{HTTP_ACCEPT} text\/markdown\n  RewriteRule ^\/?$ \/md\/index.md &#91;L]\n&lt;\/IfModule&gt;\n\n&lt;IfModule mod_headers.c&gt;\n  &lt;FilesMatch \"\\.md$\"&gt;\n    Header set Content-Type \"text\/markdown; charset=utf-8\"\n  &lt;\/FilesMatch&gt;\n&lt;\/IfModule&gt;\n\n# Types MIME pour .well-known\n&lt;IfModule mod_mime.c&gt;\n  AddType application\/linkset+json api-catalog\n&lt;\/IfModule&gt;\n\n&lt;IfModule mod_headers.c&gt;\n  &lt;Files \"api-catalog\"&gt;\n    Header set Content-Type \"application\/linkset+json\"\n  &lt;\/Files&gt;\n  &lt;Files \"openid-configuration\"&gt;\n    Header set Content-Type \"application\/json\"\n  &lt;\/Files&gt;\n  &lt;Files \"oauth-protected-resource\"&gt;\n    Header set Content-Type \"application\/json\"\n  &lt;\/Files&gt;\n&lt;\/IfModule&gt;\n\n# CORS pour les fichiers de decouverte\n&lt;FilesMatch \"\\.(txt|xml|jsonld|json)$\"&gt;\n  Header set Access-Control-Allow-Origin \"*\"\n&lt;\/FilesMatch&gt;<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"les-pieges-rencontres-et-comment-les-eviter\">Les pi\u00e8ges rencontr\u00e9s (et comment les \u00e9viter) pour un site agent-ready<\/h3>\n\n\n\n<p><strong>1. Les en-t\u00eates Link qui ne s&rsquo;envoient pas.<\/strong>&nbsp;Certain h\u00e9bergeurs mutualis\u00e9s,&nbsp;<code>mod_headers<\/code>&nbsp;dans&nbsp;<code>.htaccess<\/code>&nbsp;ne permet pas toujours d&rsquo;ajouter des en-t\u00eates personnalis\u00e9s. La solution PHP avec&nbsp;<code>index.php<\/code>&nbsp;est la plus fiable et la plus portable. Si vous \u00eates sur Nginx, utilisez&nbsp;<code>add_header<\/code>&nbsp;dans votre bloc&nbsp;<code>server<\/code>.<\/p>\n\n\n\n<p><strong>2. Le Content-Signal mal positionn\u00e9.<\/strong>&nbsp;La directive&nbsp;<code>Content-Signal<\/code>&nbsp;doit \u00eatre \u00e0 l&rsquo;int\u00e9rieur d&rsquo;un bloc&nbsp;<code>User-agent: *<\/code>, pas flottante en fin de fichier. Le parseur de l&rsquo;outil Cloudflare applique la sp\u00e9cification \u00e0 la lettre : une directive orpheline est ignor\u00e9e.<\/p>\n\n\n\n<p><strong>3. Le cache de l&rsquo;outil Cloudflare.<\/strong>&nbsp;IsItAgentReady met en cache les r\u00e9sultats. Si vous corrigez un fichier et relancez le test imm\u00e9diatement, vous verrez peut-\u00eatre encore l&rsquo;ancienne version. L&rsquo;outil utilise le CDN de Cloudflare pour r\u00e9cup\u00e9rer vos fichiers, et si vous \u00eates vous-m\u00eame derri\u00e8re Cloudflare, la propagation peut prendre du temps. Pensez \u00e0 purger le cache depuis votre dashboard Cloudflare, ou attendez quelques heures. Vous pouvez aussi tenter un appel direct \u00e0 l&rsquo;endpoint API du scanner pour forcer un nouveau scan.<\/p>\n\n\n\n<p><strong>4. Le dossier .well-known sur mutualis\u00e9.<\/strong>&nbsp;Certains h\u00e9bergeurs bloquent l&rsquo;acc\u00e8s aux dossiers commen\u00e7ant par un point. V\u00e9rifiez que votre&nbsp;<code>.htaccess<\/code>&nbsp;n&rsquo;a pas de r\u00e8gle&nbsp;<code>RedirectMatch 403 \/\\.<\/code>&nbsp;trop agressive, et testez l&rsquo;acc\u00e8s avec&nbsp;<code>curl https:\/\/votre-site.fr\/.well-known\/api-catalog<\/code>.<\/p>\n\n\n\n<p><strong>5. Les URLs propres et le content negotiation.<\/strong>&nbsp;Si vous utilisez des URLs sans extension (<code>\/expertise<\/code>&nbsp;au lieu de&nbsp;<code>\/expertise.html<\/code>), vos r\u00e8gles de r\u00e9\u00e9criture Markdown doivent en tenir compte. La condition&nbsp;<code>RewriteCond %{DOCUMENT_ROOT}\/md%{REQUEST_URI}.md -f<\/code>&nbsp;g\u00e8re ce cas en v\u00e9rifiant que le fichier&nbsp;<code>.md<\/code>&nbsp;correspondant existe avant de r\u00e9\u00e9crire. Mais testez chaque page individuellement avec&nbsp;<code>curl -H \"Accept: text\/markdown\"<\/code>&nbsp;car les interactions entre r\u00e8gles de r\u00e9\u00e9criture peuvent \u00eatre surprenantes.<\/p>\n\n\n\n<p><strong>6. L&rsquo;ordre des r\u00e8gles dans .htaccess.<\/strong>&nbsp;Les r\u00e8gles de content negotiation Markdown doivent \u00eatre plac\u00e9es&nbsp;<strong>apr\u00e8s<\/strong>&nbsp;vos r\u00e8gles de suppression d&rsquo;extension (<code>.html<\/code>) mais&nbsp;<strong>avant<\/strong>&nbsp;la r\u00e9\u00e9criture interne qui ajoute&nbsp;<code>.html<\/code>. Si l&rsquo;ordre est invers\u00e9, Apache peut r\u00e9\u00e9crire l&rsquo;URL en&nbsp;<code>.html<\/code>&nbsp;avant m\u00eame que la condition&nbsp;<code>text\/markdown<\/code>&nbsp;soit \u00e9valu\u00e9e, et votre content negotiation ne fonctionnera jamais. Pour d\u00e9boguer, activez temporairement le&nbsp;<code>RewriteLog<\/code>&nbsp;si votre h\u00e9bergeur le permet.<\/p>\n\n\n\n<p><strong>7. Les fichiers sans extension dans .well-known.<\/strong>&nbsp;Le fichier&nbsp;<code>api-catalog<\/code>&nbsp;(sans extension&nbsp;<code>.json<\/code>) peut poser probl\u00e8me. Certains serveurs ne savent pas quel type MIME servir pour un fichier sans extension. C&rsquo;est pourquoi la directive&nbsp;<code>AddType application\/linkset+json api-catalog<\/code>&nbsp;et le&nbsp;<code>Header set Content-Type<\/code>&nbsp;dans une balise&nbsp;<code>&lt;Files&gt;<\/code>&nbsp;sont tous les deux n\u00e9cessaires : l&rsquo;un est un filet de s\u00e9curit\u00e9 pour l&rsquo;autre.<\/p>\n\n\n\n<p><strong>8. Les hash SHA-256 qui changent.<\/strong>&nbsp;Dans le fichier Agent Skills, chaque ressource r\u00e9f\u00e9renc\u00e9e a un hash SHA-256. Si vous modifiez une page (m\u00eame un espace en trop), le hash change et l&rsquo;int\u00e9grit\u00e9 \u00e9choue. En pratique, les agents ne v\u00e9rifient pas encore syst\u00e9matiquement ces hash, mais c&rsquo;est une bonne hygi\u00e8ne de les maintenir \u00e0 jour. Int\u00e9grez le recalcul dans votre workflow de d\u00e9ploiement : un simple&nbsp;<code>sha256sum *.html<\/code>&nbsp;avant chaque mise en production.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"verification-et-debogage\">V\u00e9rification et d\u00e9bogage du site agent-ready<\/h3>\n\n\n\n<p>Avant de lancer le test Cloudflare, v\u00e9rifiez chaque crit\u00e8re individuellement :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code># 1. Link headers\ncurl -I https:\/\/votre-site.fr\/ | grep -i \"link:\"\n\n# 2. Markdown content negotiation\ncurl -H \"Accept: text\/markdown\" https:\/\/votre-site.fr\/\n\n# 3. Content-Signal dans robots.txt\ncurl https:\/\/votre-site.fr\/robots.txt | head -5\n\n# 4. API Catalog\ncurl https:\/\/votre-site.fr\/.well-known\/api-catalog\n\n# 5. OpenID Configuration\ncurl https:\/\/votre-site.fr\/.well-known\/openid-configuration\n\n# 6. OAuth Protected Resource\ncurl https:\/\/votre-site.fr\/.well-known\/oauth-protected-resource\n\n# 7. MCP Server Card\ncurl https:\/\/votre-site.fr\/.well-known\/mcp\/server-card.json\n\n# 8. Agent Skills\ncurl https:\/\/votre-site.fr\/.well-known\/agent-skills\/index.json\n\n# 9. WebMCP (verifier dans le source HTML)\ncurl https:\/\/votre-site.fr\/ | grep \"webmcp\"<\/code><\/pre>\n\n\n\n<p>Si toutes ces commandes retournent le contenu attendu, vous \u00eates pr\u00eat pour le test.<\/p>\n\n\n\n<p><strong>Script de v\u00e9rification automatis\u00e9 :<\/strong>&nbsp;pour gagner du temps, vous pouvez regrouper ces commandes dans un script bash. Ajoutez des tests de code retour HTTP (<code>curl -o \/dev\/null -s -w \"%{http_code}\"<\/code>) pour v\u00e9rifier que chaque endpoint retourne un 200, et parsez le Content-Type pour confirmer qu&rsquo;il correspond au type attendu. Un&nbsp;<code>jq .<\/code>&nbsp;sur les fichiers JSON vous permettra aussi de d\u00e9tecter les erreurs de syntaxe avant que le scanner Cloudflare ne les voie.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"au-dela-du-score-pourquoi-cest-important\">Au-del\u00e0 du score : pourquoi c&rsquo;est important un site agent-ready ?<\/h3>\n\n\n\n<p>Obtenir 90 ou 100 sur IsItAgentReady n&rsquo;est pas une fin en soi. C&rsquo;est un indicateur que votre site parle la langue des agents IA, et cela a des implications concr\u00e8tes.<\/p>\n\n\n\n<p>D&rsquo;abord, la&nbsp;<strong>visibilit\u00e9 dans les r\u00e9ponses g\u00e9n\u00e9r\u00e9es par IA<\/strong>. Quand un utilisateur demande \u00e0 ChatGPT, Claude ou Perplexity des informations sur votre domaine d&rsquo;expertise, un site correctement balis\u00e9 a plus de chances d&rsquo;\u00eatre cit\u00e9 comme source. Le fichier&nbsp;<code>llms.txt<\/code>, les m\u00e9tadonn\u00e9es structur\u00e9es et les Content Signals indiquent aux agents que votre contenu est fiable, \u00e0 jour et que vous consentez explicitement \u00e0 son utilisation en contexte de recherche. C&rsquo;est une forme de recommandation technique : vous facilitez le travail de l&rsquo;agent, et en retour il vous cite plus facilement et plus fid\u00e8lement.<\/p>\n\n\n\n<p>Ensuite, le&nbsp;<strong>contr\u00f4le<\/strong>. Les Content Signals vous permettent de dire explicitement \u00ab\u00a0oui\u00a0\u00bb \u00e0 l&rsquo;indexation pour la recherche tout en disant \u00ab\u00a0non\u00a0\u00bb \u00e0 l&rsquo;entra\u00eenement des mod\u00e8les. C&rsquo;est un levier de gouvernance qui n&rsquo;existait pas jusqu&rsquo;ici. Contrairement au&nbsp;<code>robots.txt<\/code>&nbsp;classique qui ne permet que d&rsquo;autoriser ou de bloquer le crawl, les Content Signals expriment des nuances : vous pouvez autoriser la recherche mais interdire l&rsquo;entra\u00eenement, autoriser le r\u00e9sum\u00e9 mais interdire l&rsquo;injection dans un prompt. C&rsquo;est un vocabulaire de consentement bien plus riche.<\/p>\n\n\n\n<p>Enfin, la&nbsp;<strong>pr\u00e9paration<\/strong>. Ces standards sont jeunes (certains encore en draft IETF) mais convergent rapidement. MCP est pouss\u00e9 par Anthropic et adopt\u00e9 par un \u00e9cosyst\u00e8me croissant, WebMCP \u00e9merge de la communaut\u00e9 des agents navigateurs, les Content Signals sont port\u00e9s par une coalition multi-acteurs incluant des \u00e9diteurs et des d\u00e9veloppeurs d&rsquo;IA. Impl\u00e9menter ces standards aujourd&rsquo;hui, c&rsquo;est ne pas avoir \u00e0 rattraper un retard demain.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"feuille-de-route-par-ou-commencer\">Feuille de route du site agent-ready : par o\u00f9 commencer ?<\/h3>\n\n\n\n<p>Si vous partez de z\u00e9ro, voici l&rsquo;ordre que je recommande :<\/p>\n\n\n\n<p><strong>Phase 1 (30 minutes) :<\/strong>&nbsp;cr\u00e9ez votre&nbsp;<code>llms.txt<\/code>&nbsp;et ajoutez le&nbsp;<code>Content-Signal<\/code>&nbsp;dans votre&nbsp;<code>robots.txt<\/code>. Ce sont les deux actions les plus rapides et les plus impactantes. Le&nbsp;<code>llms.txt<\/code>&nbsp;est d\u00e9j\u00e0 lu par de nombreux agents m\u00eame sans les autres standards.<\/p>\n\n\n\n<p><strong>Phase 2 (1 heure) :<\/strong>&nbsp;mettez en place les fichiers&nbsp;<code>.well-known<\/code>&nbsp;(api-catalog, openid-configuration, oauth-protected-resource, mcp\/server-card.json, agent-skills\/index.json). Ce sont des fichiers JSON statiques \u00e0 d\u00e9poser sur votre serveur. Le plus long est de r\u00e9diger les descriptions et de calculer les hash SHA-256.<\/p>\n\n\n\n<p><strong>Phase 3 (1 heure) :<\/strong>&nbsp;impl\u00e9mentez les Link headers (via&nbsp;<code>index.php<\/code>&nbsp;sur Apache) et le content negotiation Markdown. Ces deux crit\u00e8res n\u00e9cessitent de toucher \u00e0 la configuration serveur, ce qui demande un peu plus d&rsquo;attention et de tests.<\/p>\n\n\n\n<p><strong>Phase 4 (30 minutes) :<\/strong>&nbsp;ajoutez le script WebMCP dans vos pages HTML. C&rsquo;est le crit\u00e8re le plus \u00ab\u00a0futuriste\u00a0\u00bb et le moins critique \u00e0 court terme, mais il compl\u00e8te le tableau pour atteindre 100. C&rsquo;est aussi le seul crit\u00e8re qui demande d&rsquo;\u00e9crire du JavaScript, mais le code n\u00e9cessaire reste minimal.<\/p>\n\n\n\n<p>Entre chaque phase, testez avec&nbsp;<code>curl<\/code>&nbsp;et les DevTools avant de relancer le test Cloudflare. Et surtout, gardez en t\u00eate que le cache de l&rsquo;outil peut vous jouer des tours : si un crit\u00e8re \u00e9choue alors que votre&nbsp;<code>curl<\/code>&nbsp;retourne le bon r\u00e9sultat, attendez quelques heures avant de tout remettre en question.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"adapter-la-demarche-selon-votre-stack-technique\">Adapter la d\u00e9marche du site agent-ready selon votre stack technique<\/h3>\n\n\n\n<p>L&rsquo;exemple d\u00e9taill\u00e9 dans cet article concerne un site statique HTML sur Apache mutualis\u00e9, mais les principes s&rsquo;appliquent \u00e0 toutes les stacks.<\/p>\n\n\n\n<p><strong>WordPress :<\/strong>&nbsp;la gestion des en-t\u00eates Link peut se faire via un petit plugin custom ou dans le&nbsp;<code>functions.php<\/code>&nbsp;de votre th\u00e8me enfant avec&nbsp;<code>add_action('send_headers', ...)<\/code>. Les fichiers&nbsp;<code>.well-known<\/code>&nbsp;doivent \u00eatre cr\u00e9\u00e9s physiquement \u00e0 la racine (WordPress ne les g\u00e8re pas nativement). Pour le content negotiation Markdown, vous pouvez utiliser un plugin qui intercepte les requ\u00eates avec&nbsp;<code>Accept: text\/markdown<\/code>&nbsp;et retourne une version simplifi\u00e9e du contenu via&nbsp;<code>wp_strip_all_tags()<\/code>&nbsp;avec une mise en forme Markdown basique. Le script WebMCP s&rsquo;ajoute classiquement avec&nbsp;<code>wp_enqueue_script()<\/code>.<\/p>\n\n\n\n<p><strong>Sites statiques (Hugo, Jekyll, Eleventy) :<\/strong>&nbsp;c&rsquo;est paradoxalement le cas le plus simple. G\u00e9n\u00e9rez les fichiers&nbsp;<code>.well-known<\/code>&nbsp;et les versions Markdown comme des fichiers statiques suppl\u00e9mentaires dans votre pipeline de build. Pour les Link headers, si vous d\u00e9ployez sur Netlify ou Vercel, utilisez le fichier&nbsp;<code>_headers<\/code>&nbsp;(Netlify) ou&nbsp;<code>vercel.json<\/code>&nbsp;(Vercel) pour injecter les en-t\u00eates. Sur Cloudflare Pages, utilisez&nbsp;<code>_headers<\/code>&nbsp;\u00e9galement. Pour le content negotiation, Netlify et Cloudflare Pages supportent les Edge Functions qui peuvent intercepter l&rsquo;en-t\u00eate&nbsp;<code>Accept<\/code>.<\/p>\n\n\n\n<p><strong>Applications SPA (React, Vue, Angular) :<\/strong>&nbsp;le d\u00e9fi principal est que les agents n&rsquo;ex\u00e9cutent pas toujours le JavaScript. Assurez-vous que vos fichiers&nbsp;<code>.well-known<\/code>&nbsp;et votre&nbsp;<code>robots.txt<\/code>&nbsp;sont servis statiquement par le serveur (et non g\u00e9n\u00e9r\u00e9s par le framework). Le script WebMCP fonctionne naturellement dans une SPA puisqu&rsquo;il s&rsquo;ex\u00e9cute c\u00f4t\u00e9 client. Pour le content negotiation Markdown, configurez votre serveur de production (Nginx, Caddy, etc.) pour g\u00e9rer la r\u00e9\u00e9criture au niveau serveur, pas au niveau application.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"et-le-llms-txt-dans-tout-ca\">Et le llms.txt dans tout \u00e7a ? C&rsquo;est important pour un site agent-ready ?<\/h3>\n\n\n\n<p>Le fichier&nbsp;<code>llms.txt<\/code>&nbsp;n&rsquo;est pas directement \u00e9valu\u00e9 par IsItAgentReady, mais il est le fil rouge de toute l&rsquo;architecture agent-ready. Il est r\u00e9f\u00e9renc\u00e9 dans les Link headers (<code>rel=\"service-doc\"<\/code>), dans l&rsquo;API Catalog (<code>service-desc<\/code>&nbsp;et&nbsp;<code>service-doc<\/code>), dans le MCP Server Card (comme ressource), dans l&rsquo;Agent Skills (comme skill&nbsp;<code>get-biography<\/code>), et m\u00eame dans le&nbsp;<code>openid-configuration<\/code>&nbsp;(<code>service_documentation<\/code>).<\/p>\n\n\n\n<p>C&rsquo;est votre&nbsp;<strong>page d&rsquo;accueil pour les machines<\/strong>. Si vous ne deviez impl\u00e9menter qu&rsquo;une seule chose avant de toucher aux 9 crit\u00e8res Cloudflare, ce serait ce fichier. Un&nbsp;<code>llms.txt<\/code>&nbsp;bien r\u00e9dig\u00e9 peut \u00e0 lui seul am\u00e9liorer significativement la fa\u00e7on dont les IA parlent de vous et de votre activit\u00e9. Pensez-y comme un pitch deck pour algorithmes : clair, factuel, structur\u00e9, et facilement parsable.<\/p>\n\n\n\n<p>Le format recommand\u00e9 par&nbsp;<a href=\"https:\/\/llmstxt.org\" target=\"_blank\" rel=\"noreferrer noopener\">llmstxt.org<\/a>&nbsp;est du Markdown simple avec des en-t\u00eates hi\u00e9rarchiques. Commencez par un titre&nbsp;<code># Nom du site<\/code>, suivi d&rsquo;un paragraphe de pr\u00e9sentation, puis des sections pour chaque aspect important (expertise, publications, services, contact). Incluez les URLs compl\u00e8tes de vos pages cl\u00e9s. Un agent qui lit ce fichier doit pouvoir r\u00e9pondre correctement \u00e0 la question \u00ab\u00a0qui est cette personne \/ entreprise et que fait-elle ?\u00a0\u00bb sans avoir \u00e0 crawler le reste du site.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"ressources-et-references\">Ressources et r\u00e9f\u00e9rences<\/h3>\n\n\n\n<p>Voici les sp\u00e9cifications et outils mentionn\u00e9s dans cet article :<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><a href=\"https:\/\/isitagentready.com\" target=\"_blank\" rel=\"noreferrer noopener\">IsItAgentReady<\/a>&nbsp;par Cloudflare (l&rsquo;outil de test)<\/li>\n\n\n\n<li><a href=\"https:\/\/www.rfc-editor.org\/rfc\/rfc8288\" target=\"_blank\" rel=\"noreferrer noopener\">RFC 8288<\/a>&nbsp;(Web Linking)<\/li>\n\n\n\n<li><a href=\"https:\/\/www.rfc-editor.org\/rfc\/rfc9727\" target=\"_blank\" rel=\"noreferrer noopener\">RFC 9727<\/a>&nbsp;(API Catalog)<\/li>\n\n\n\n<li><a href=\"https:\/\/www.rfc-editor.org\/rfc\/rfc9728\" target=\"_blank\" rel=\"noreferrer noopener\">RFC 9728<\/a>&nbsp;(OAuth Protected Resource Metadata)<\/li>\n\n\n\n<li><a href=\"https:\/\/contentsignals.org\" target=\"_blank\" rel=\"noreferrer noopener\">Content Signals<\/a><\/li>\n\n\n\n<li><a href=\"https:\/\/agentskills.io\" target=\"_blank\" rel=\"noreferrer noopener\">Agent Skills Discovery<\/a><\/li>\n\n\n\n<li><a href=\"https:\/\/spec.modelcontextprotocol.io\" target=\"_blank\" rel=\"noreferrer noopener\">Model Context Protocol (MCP)<\/a><\/li>\n\n\n\n<li><a href=\"https:\/\/llmstxt.org\" target=\"_blank\" rel=\"noreferrer noopener\">llms.txt<\/a><\/li>\n<\/ul>\n\n\n\n<p>Le web des agents IA est en train de se construire. Les standards d\u00e9crits ici ne sont pas des gadgets : ce sont les fondations d&rsquo;un nouveau contrat entre les \u00e9diteurs de contenu et les machines qui le consomment. Un contrat dans lequel vous gardez le contr\u00f4le sur ce qui est autoris\u00e9 et ce qui ne l&rsquo;est pas, tout en maximisant votre visibilit\u00e9 dans les nouveaux canaux de d\u00e9couverte.<\/p>\n\n\n\n<p>Que vous g\u00e9riez un site personnel, un blog technique, un site institutionnel ou un e-commerce, la d\u00e9marche est la m\u00eame. Les fichiers sont simples, les standards sont ouverts, et le test Cloudflare vous donne un retour imm\u00e9diat sur votre progression.<\/p>\n\n\n\n<p>Une derni\u00e8re r\u00e9flexion : le site agent-ready ne remplace pas le SEO classique, il le compl\u00e8te. Vos balises&nbsp;<code>title<\/code>, vos meta descriptions, votre Schema.org, votre maillage interne et votre contenu de qualit\u00e9 restent essentiels pour les moteurs de recherche traditionnels. Les standards d\u00e9crits ici ajoutent une couche de m\u00e9tadonn\u00e9es structur\u00e9es sp\u00e9cifiquement con\u00e7ue pour les machines qui raisonnent, et non plus seulement pour celles qui indexent. C&rsquo;est la diff\u00e9rence entre \u00eatre dans un annuaire et savoir se pr\u00e9senter de mani\u00e8re intelligible \u00e0 quelqu&rsquo;un qui vous rencontre pour la premi\u00e8re fois.<\/p>\n\n\n\n<p>Le mouvement est lanc\u00e9, et il est irr\u00e9versible. Les sites qui s&rsquo;adaptent t\u00f4t b\u00e9n\u00e9ficieront d&rsquo;un avantage durable : celui d&rsquo;\u00eatre compris, cit\u00e9s et recommand\u00e9s par la prochaine g\u00e9n\u00e9ration d&rsquo;interfaces entre les humains et l&rsquo;information. C&rsquo;est \u00e7a \u00eatre un site agent-ready.<\/p>\n\n\n\n<p>Alors testez votre site sur <a href=\"https:\/\/isitagentready.com\/\" data-type=\"link\" data-id=\"https:\/\/isitagentready.com\/\" target=\"_blank\" rel=\"noopener\">IsItAgentReady.com<\/a>&#8230; le mien est \u00e0 92\/100 aujourd&rsquo;hui<\/p>\n","protected":false},"excerpt":{"rendered":"<p>En avril 2026, Cloudflare a lanc\u00e9\u00a0IsItAgentReady, un outil de diagnostic qui \u00e9value la compatibilit\u00e9 d&rsquo;un site web avec les agents IA. Le principe est simple : entrer une URL, obtenir un score sur 100 et une liste de crit\u00e8res pass\u00e9s ou \u00e9chou\u00e9s. Le probl\u00e8me, c&rsquo;est que la quasi-totalit\u00e9 des sites web actuels obtiennent un score proche de z\u00e9ro.<\/p>\n<p>J&rsquo;ai d\u00e9cid\u00e9 de passer un site statique h\u00e9berg\u00e9 sur un mutualis\u00e9 Apache (OVH) de 0 \u00e0 100. Voici le retour d&rsquo;exp\u00e9rience complet, avec tous les fichiers, les pi\u00e8ges rencontr\u00e9s, et les solutions qui fonctionnent r\u00e9ellement en production. Comptez une demi-journ\u00e9e de travail si vous \u00eates \u00e0 l&rsquo;aise avec Apache et le terminal, une journ\u00e9e si vous d\u00e9couvrez ces sujets. Et mois si vous ma\u00eetrisez bien les outils IA (je suis pass\u00e9 de 25\/100 \u00e0 plus de 90\/100 avec Claude Cowork, en 1h environ).<\/p>\n","protected":false},"author":1,"featured_media":792,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[165,18],"tags":[51,170,173],"class_list":["post-791","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-geo-marketing","category-metiers","tag-ai","tag-geo","tag-site-agent-ready"],"_links":{"self":[{"href":"https:\/\/alain.goudey.eu\/side\/wp-json\/wp\/v2\/posts\/791","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/alain.goudey.eu\/side\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/alain.goudey.eu\/side\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/alain.goudey.eu\/side\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/alain.goudey.eu\/side\/wp-json\/wp\/v2\/comments?post=791"}],"version-history":[{"count":8,"href":"https:\/\/alain.goudey.eu\/side\/wp-json\/wp\/v2\/posts\/791\/revisions"}],"predecessor-version":[{"id":805,"href":"https:\/\/alain.goudey.eu\/side\/wp-json\/wp\/v2\/posts\/791\/revisions\/805"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/alain.goudey.eu\/side\/wp-json\/wp\/v2\/media\/792"}],"wp:attachment":[{"href":"https:\/\/alain.goudey.eu\/side\/wp-json\/wp\/v2\/media?parent=791"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/alain.goudey.eu\/side\/wp-json\/wp\/v2\/categories?post=791"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/alain.goudey.eu\/side\/wp-json\/wp\/v2\/tags?post=791"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}