[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"$fETM_rKUlO8vXeR5g4aZBZeB1te9-J7iAj0eyluEqlx0":3,"$fraJ1FZ3Ykw6geFTRTKqE7ipsgR-lKBOuwhSIoMf4tPA":26},{"_id":4,"slug":5,"__v":6,"author":7,"body":8,"canonical":9,"category":10,"createdAt":11,"date":12,"description":13,"htmlContent":14,"image":15,"imageAlt":15,"readingTime":16,"tags":17,"title":24,"updatedAt":25},"69d29ed39c725b3087e298a5","mcp-a2a-nlweb-and-agents-md-the-standards-powering-the-agentic-web-via-sejournal-slobodanmanic",0,"Equipe Seogard","Googlebot n'est plus le seul robot qui compte. Depuis 2025, des agents IA autonomes — capables de naviguer entre des services, de passer des commandes, de comparer des offres — frappent à la porte de vos serveurs. Et ils ne lisent pas le HTML comme un crawler classique. Quatre protocoles émergents structurent ce nouveau web agentique : **MCP** (Model Context Protocol), **A2A** (Agent-to-Agent), **NLWeb** (Natural Language Web) et **AGENTS.md**. Si vous gérez un site de plus de quelques centaines de pages, ces standards vont redéfinir la manière dont votre contenu est consommé — bien au-delà des SERPs traditionnelles.\n\n## Le web agentique : un changement de paradigme pour le crawl\n\nLe web tel que les moteurs de recherche le consomment repose sur un modèle vieux de 30 ans : un robot HTTP récupère du HTML, extrait des liens, suit des directives dans `robots.txt`, et indexe du texte. Ce modèle suppose un consommateur passif qui lit des documents.\n\nLes agents IA ne fonctionnent pas ainsi. Un agent LLM comme ceux propulsés par GPT-4, Claude ou Gemini ne \"lit\" pas une page produit — il **exécute une tâche**. \"Trouve-moi un vol Paris-Tokyo sous 600€ en mai avec escale maximale d'une heure\" implique de requêter des APIs, comparer des résultats structurés, et potentiellement interagir avec des services tiers pour réserver.\n\nCe glissement a trois conséquences techniques immédiates :\n\n1. **Le HTML seul ne suffit plus.** Un agent a besoin d'interfaces structurées (APIs, schémas, protocoles de communication) pour agir, pas seulement pour lire.\n2. **Le crawl budget prend une nouvelle dimension.** Quand des centaines d'agents autonomes interrogent vos endpoints, la gestion de la charge serveur dépasse le cadre de [Googlebot et du crawl budget classique](/blog/crawl-budget-mythe-ou-realite-pour-votre-site).\n3. **Les directives d'accès doivent évoluer.** `robots.txt` a été conçu pour des crawlers web. Il ne couvre pas les cas d'usage d'agents qui veulent interagir avec vos services, pas simplement les indexer.\n\nC'est exactement ce vide que MCP, A2A, NLWeb et AGENTS.md cherchent à combler. Chaque protocole adresse une couche différente du problème.\n\n## MCP (Model Context Protocol) : l'interface entre LLM et données\n\n### Ce que MCP résout\n\nDéveloppé par Anthropic et publié en open source fin 2024, le Model Context Protocol standardise la manière dont un modèle de langage accède à des sources de données externes. Avant MCP, chaque intégration LLM-outil était ad hoc : un plugin ChatGPT pour Expedia, un autre pour Kayak, chacun avec son propre format de requête et de réponse.\n\nMCP propose une architecture client-serveur simple : le LLM (client) envoie des requêtes structurées à un serveur MCP qui expose des \"tools\" (fonctions appelables) et des \"resources\" (données accessibles). Le format est JSON-RPC 2.0 — un choix pragmatique qui s'appuie sur un standard existant plutôt que d'en inventer un nouveau.\n\n### Implémentation concrète\n\nVoici à quoi ressemble un serveur MCP minimal exposant un catalogue produit e-commerce :\n\n```typescript\nimport { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { StdioServerTransport } from \"@modelcontextprotocol/sdk/server/stdio.js\";\nimport { z } from \"zod\";\n\nconst server = new McpServer({\n  name: \"catalog-server\",\n  version: \"1.0.0\",\n});\n\n// Expose un outil de recherche produit\nserver.tool(\n  \"search_products\",\n  \"Recherche dans le catalogue produit par catégorie, prix et disponibilité\",\n  {\n    category: z.string().describe(\"Catégorie produit (ex: 'chaussures-running')\"),\n    max_price: z.number().optional().describe(\"Prix maximum en euros\"),\n    in_stock: z.boolean().default(true).describe(\"Uniquement les produits en stock\"),\n  },\n  async ({ category, max_price, in_stock }) => {\n    // Requête vers votre base de données / API interne\n    const products = await db.products.search({ category, max_price, in_stock });\n    return {\n      content: [\n        {\n          type: \"text\",\n          text: JSON.stringify(products, null, 2),\n        },\n      ],\n    };\n  }\n);\n\n// Expose une ressource statique : les conditions de livraison\nserver.resource(\n  \"shipping-policy\",\n  \"shipping://policy\",\n  async (uri) => ({\n    contents: [\n      {\n        uri: uri.href,\n        mimeType: \"text/plain\",\n        text: \"Livraison gratuite dès 50€. Délai : 2-5 jours ouvrés en France métropolitaine.\",\n      },\n    ],\n  })\n);\n\nconst transport = new StdioServerTransport();\nawait server.connect(transport);\n```\n\nCe serveur permet à n'importe quel client MCP (un agent Claude, une intégration custom, un orchestrateur) de rechercher des produits et de consulter la politique de livraison sans jamais parser du HTML.\n\n### Les limites à connaître\n\nMCP ne gère pas l'authentification de manière native dans sa version actuelle — c'est volontairement laissé à la couche transport. Pour un catalogue public, ce n'est pas un problème. Pour des données utilisateur (historique de commandes, panier), vous devrez implémenter OAuth 2.0 ou un mécanisme équivalent au-dessus du transport HTTP SSE.\n\nPar ailleurs, MCP est conçu pour l'interaction **LLM → service**. Il ne couvre pas la communication entre agents — c'est là qu'A2A entre en jeu.\n\n## A2A (Agent-to-Agent Protocol) : la communication inter-agents\n\n### Le problème de l'orchestration\n\nImaginez un scénario réaliste : un utilisateur demande à son agent personnel \"Organise mon déménagement Paris → Lyon le 15 juin\". Cet agent doit coordonner un agent de réservation de camion, un agent de changement d'adresse postale, un agent d'assurance, et potentiellement un agent de comparaison de fournisseurs d'énergie.\n\nSans protocole standard, chaque paire d'agents doit implémenter sa propre logique d'intégration. Avec N agents, ça fait N×(N-1)/2 intégrations point-à-point — un problème combinatoire classique que l'industrie a déjà rencontré avec les APIs REST avant l'émergence de GraphQL et des API gateways.\n\n### Ce qu'A2A standardise\n\nLe protocole A2A, poussé par Google en collaboration avec plus de 50 partenaires technologiques, définit trois mécanismes fondamentaux :\n\n- **Agent Cards** : des fichiers JSON hébergés à `/.well-known/agent.json` qui décrivent les capacités d'un agent (ce qu'il sait faire, quels formats il accepte, ses endpoints).\n- **Task management** : un cycle de vie standardisé pour les tâches (submitted → working → completed/failed) avec support du streaming et des notifications push.\n- **Message exchange** : un format unifié pour les messages entre agents, supportant texte, fichiers, données structurées et formulaires interactifs.\n\nVoici la structure d'une Agent Card typique :\n\n```json\n{\n  \"name\": \"DeliveryScheduler\",\n  \"description\": \"Agent de planification de livraison pour e-commerce\",\n  \"url\": \"https://logistics.example-store.fr/a2a\",\n  \"version\": \"2.1.0\",\n  \"capabilities\": {\n    \"streaming\": true,\n    \"pushNotifications\": true\n  },\n  \"skills\": [\n    {\n      \"id\": \"schedule-delivery\",\n      \"name\": \"Planifier une livraison\",\n      \"description\": \"Planifie et optimise la livraison d'une commande en fonction de l'adresse, du créneau souhaité et des contraintes logistiques\",\n      \"inputModes\": [\"application/json\"],\n      \"outputModes\": [\"application/json\"]\n    },\n    {\n      \"id\": \"track-shipment\",\n      \"name\": \"Suivre un colis\",\n      \"description\": \"Retourne le statut en temps réel d'un envoi\",\n      \"inputModes\": [\"text/plain\"],\n      \"outputModes\": [\"application/json\", \"text/plain\"]\n    }\n  ],\n  \"authentication\": {\n    \"schemes\": [\"oauth2\"],\n    \"credentials\": \"https://logistics.example-store.fr/oauth/authorize\"\n  }\n}\n```\n\nL'analogie avec `robots.txt` et les sitemaps est frappante — et intentionnelle. Là où `robots.txt` dit aux crawlers ce qu'ils **ne doivent pas** faire, l'Agent Card dit aux agents ce que le service **sait** faire.\n\n### Impact sur l'architecture technique\n\nPour un site e-commerce de 15 000 pages, implémenter A2A signifie concrètement :\n\n- Héberger une Agent Card à `/.well-known/agent.json` (trivial)\n- Exposer un endpoint A2A capable de recevoir des tâches, les traiter, et renvoyer des résultats structurés (non trivial — c'est en réalité construire une API orientée tâches)\n- Gérer la montée en charge des requêtes agents en parallèle des requêtes humaines et crawlers\n\nCe dernier point est critique. Si votre [configuration robots.txt](/blog/robots-txt-guide-complet-avec-exemples) limite déjà le crawl rate de Googlebot pour protéger vos serveurs, l'ajout d'agents A2A multiplie la surface d'appel.\n\n## NLWeb : le Schema.org du web agentique\n\n### L'initiative Microsoft\n\nNLWeb, porté par Microsoft et publié en avril 2025, prend le problème par un angle radicalement différent de MCP et A2A. Au lieu de demander aux sites d'implémenter des serveurs de protocoles, NLWeb propose de rendre **le contenu web existant** directement interrogeable en langage naturel.\n\nLe principe : vous ajoutez un endpoint NLWeb à votre site qui accepte des requêtes en langage naturel et retourne des réponses structurées en Schema.org. L'idée est que si votre site utilise déjà des [données structurées JSON-LD](/blog/donnees-structurees-guide-pratique-json-ld), NLWeb peut servir de couche d'interrogation par-dessus.\n\n### Pourquoi c'est pertinent pour le SEO technique\n\nNLWeb crée un pont direct entre le travail de balisage structuré que vous faites déjà pour Google (Product schema, FAQ schema, Article schema) et la consommation par des agents IA.\n\nConcrètement, si vous avez correctement implémenté le [schema Product pour votre e-commerce](/blog/product-schema-pour-l-e-commerce-seo), un agent NLWeb peut transformer une requête comme \"Quels sont vos sacs à dos de randonnée imperméables entre 80 et 150€ ?\" en une réponse structurée sans que l'agent ait à parser votre HTML, interpréter votre JavaScript, ou reverse-engineer votre navigation à facettes.\n\n### Architecture type\n\nNLWeb s'appuie sur un pipeline en trois étapes :\n\n1. **Ingestion** : votre contenu (pages HTML avec balisage Schema.org, flux produits) est indexé dans une base vectorielle (FAISS, Qdrant, Azure AI Search).\n2. **Requête NL** : l'agent envoie une requête en langage naturel à votre endpoint NLWeb.\n3. **Réponse Schema.org** : le système effectue une recherche sémantique, puis utilise un LLM pour formater la réponse en Schema.org.\n\n```python\n# Exemple simplifié d'un endpoint NLWeb avec FastAPI\nfrom fastapi import FastAPI\nfrom pydantic import BaseModel\nimport json\n\napp = FastAPI()\n\nclass NLWebQuery(BaseModel):\n    query: str\n    max_results: int = 5\n    schema_type: str = \"Product\"  # Type Schema.org attendu en réponse\n\nclass NLWebResponse(BaseModel):\n    results: list\n    schema_context: str = \"https://schema.org\"\n\n@app.post(\"/nlweb/ask\")\nasync def nlweb_ask(req: NLWebQuery):\n    # 1. Recherche sémantique dans l'index vectoriel\n    candidates = await vector_store.similarity_search(\n        query=req.query,\n        top_k=req.max_results * 3,  # Sur-échantillonner pour le re-ranking\n        filter={\"@type\": req.schema_type}\n    )\n\n    # 2. Re-ranking avec un LLM pour pertinence\n    ranked = await llm.rerank(\n        query=req.query,\n        documents=candidates,\n        top_k=req.max_results\n    )\n\n    # 3. Formatage en Schema.org\n    results = []\n    for doc in ranked:\n        results.append({\n            \"@context\": \"https://schema.org\",\n            \"@type\": \"Product\",\n            \"name\": doc.metadata[\"name\"],\n            \"description\": doc.metadata[\"description\"],\n            \"offers\": {\n                \"@type\": \"Offer\",\n                \"price\": doc.metadata[\"price\"],\n                \"priceCurrency\": \"EUR\",\n                \"availability\": doc.metadata[\"availability\"],\n                \"url\": doc.metadata[\"canonical_url\"]\n            }\n        })\n\n    return NLWebResponse(results=results)\n```\n\nLe trade-off est clair : NLWeb est plus facile à adopter si vous avez déjà un balisage Schema.org solide, mais il nécessite une infrastructure de recherche vectorielle et un accès LLM — ce qui représente un coût d'exploitation non négligeable.\n\n## AGENTS.md : le robots.txt pour les agents IA\n\n### Le chaînon manquant\n\nLes trois protocoles précédents définissent **comment** les agents interagissent avec vos services. AGENTS.md définit **ce qu'ils ont le droit de faire** — et c'est peut-être le standard le plus immédiatement actionable pour les équipes SEO.\n\nAGENTS.md est un fichier texte placé à la racine de votre site (comme `robots.txt`) qui déclare des permissions et des contraintes spécifiquement pour les agents IA. Là où `robots.txt` gère les crawlers HTTP, AGENTS.md gère les agents qui veulent **agir** sur ou avec votre contenu.\n\n### Structure et syntaxe\n\nLe format est délibérément simple — markdown structuré avec des sections conventionnelles :\n\n```markdown\n# AGENTS.md\n\n## Identity\nName: ExempleStore\nDescription: E-commerce de matériel outdoor, 14 500 produits actifs\nContact: tech-seo@exemple-store.fr\n\n## Permissions\n- READ: /api/products/*, /api/categories/*\n- SEARCH: /nlweb/ask\n- ACTION: /api/cart/add (requires authentication)\n- DENY: /api/admin/*, /api/users/*\n\n## Rate Limits\n- Default: 60 requests/minute per agent\n- Authenticated: 300 requests/minute per agent\n- Burst: 10 requests/second max\n\n## Data Usage\n- Caching: allowed for 3600 seconds\n- Training: not permitted\n- Attribution: required (link to source URL)\n\n## Preferred Protocols\n- MCP: https://exemple-store.fr/mcp\n- A2A: https://exemple-store.fr/.well-known/agent.json\n- NLWeb: https://exemple-store.fr/nlweb/ask\n\n## Human Escalation\n- For orders > 500€, redirect to human support\n- Contact: support@exemple-store.fr\n```\n\nPlusieurs points méritent attention :\n\n**La directive \"Training: not permitted\"** est la plus débattue. Elle exprime l'intention du site de ne pas voir son contenu utilisé pour l'entraînement de modèles IA. Contrairement à `robots.txt` dont le respect est quasi universel par les moteurs majeurs, AGENTS.md n'a aujourd'hui aucune force contraignante. Son respect dépend entièrement de la bonne volonté des développeurs d'agents.\n\n**Les rate limits** sont déclaratifs, pas impératifs. Vous devez toujours implémenter un vrai rate limiting côté serveur (via Nginx, Cloudflare, votre API gateway). AGENTS.md informe les agents bien intentionnés de vos limites pour qu'ils s'auto-régulent — exactement comme `Crawl-delay` dans robots.txt, que Googlebot ignore d'ailleurs.\n\n**La section \"Preferred Protocols\"** crée un point d'entrée centralisé. Un agent qui découvre votre AGENTS.md sait immédiatement quels protocoles vous supportez et où trouver les endpoints correspondants.\n\n## Scénario concret : migration d'un e-commerce vers le web agentique\n\n### Le contexte\n\nPrenons **OutdoorPro**, un e-commerce français de matériel outdoor : 14 500 pages produit, 850 pages catégorie, 200 pages de contenu éditorial. Stack technique : Next.js 14 en SSR, PostgreSQL, hébergé sur AWS. Trafic organique : 180 000 sessions/mois. Le site a déjà un balisage Schema.org Product sur toutes les fiches produit et utilise un [sitemap XML bien structuré](/blog/sitemap-xml-bonnes-pratiques-pour-l-indexation).\n\nL'équipe constate dans ses logs serveur une augmentation de 340% des requêtes provenant de user-agents identifiés comme des agents IA (ClaudeBot, GPTBot, PerplexityBot, etc.) sur les 6 derniers mois. Le crawl budget est sous pression, et certaines pages catégories critiques sont crawlées moins fréquemment par Googlebot — un symptôme d'[index bloat combiné à une surcharge de crawl](/blog/index-bloat-quand-trop-de-pages-nuisent-a-votre-seo).\n\n### Plan d'implémentation en 4 phases\n\n**Phase 1 (semaine 1-2) : AGENTS.md et mise à jour robots.txt**\n\nDéployer un AGENTS.md qui définit clairement les permissions et les rate limits. En parallèle, mettre à jour robots.txt pour gérer les bots IA spécifiques :\n\n```nginx\n# Extrait de la config Nginx — rate limiting par catégorie de bot\nmap $http_user_agent $agent_category {\n    default          \"human\";\n    \"~*googlebot\"    \"search_crawler\";\n    \"~*bingbot\"      \"search_crawler\";\n    \"~*claudebot\"    \"ai_agent\";\n    \"~*gptbot\"       \"ai_agent\";\n    \"~*perplexitybot\" \"ai_agent\";\n}\n\nlimit_req_zone $agent_category zone=ai_agents:10m rate=30r/m;\nlimit_req_zone $agent_category zone=search_crawlers:10m rate=120r/m;\n\nserver {\n    location /api/ {\n        limit_req zone=ai_agents burst=10 nodelay;\n        proxy_pass http://backend;\n    }\n\n    location / {\n        limit_req zone=search_crawlers burst=20;\n        proxy_pass http://frontend;\n    }\n}\n```\n\n**Phase 2 (semaine 3-4) : Endpoint NLWeb**\n\nLe balisage Schema.org Product existe déjà. L'équipe indexe les 14 500 fiches produit dans Qdrant (base vectorielle open source) et expose un endpoint NLWeb. Coût d'infrastructure estimé : une instance Qdrant à ~80€/mois + coût LLM pour le re-ranking (~200€/mois pour le volume anticipé).\n\n**Phase 3 (semaine 5-8) : Serveur MCP**\n\nImplémentation d'un serveur MCP exposant trois outils : `search_products`, `check_availability`, `get_shipping_estimate`. Ce serveur est accessible via HTTP SSE (Server-Sent Events) et nécessite une API key pour les opérations d'écriture (ajout au panier).\n\n**Phase 4 (semaine 9-12) : Agent Card A2A**\n\nPublication de l'Agent Card à `/.well-known/agent.json` décrivant les capacités du service. Cette phase est la moins urgente car l'écosystème A2A est encore naissant — peu d'agents consommateurs utilisent le protocole en production à la date de publication de cet article.\n\n### Résultats attendus et métriques\n\nAprès 3 mois de déploiement, les métriques à surveiller :\n\n- **Crawl budget Googlebot** : le rate limiting des bots IA devrait libérer de la bande passante pour le crawl organique. Vérifiable dans Google Search Console > Paramètres > Statistiques d'exploration.\n- **Requêtes agents** : volume, taux de succès, latence. Un agent qui reçoit des réponses structurées via MCP/NLWeb ne retente pas — contrairement à un agent qui scrape du HTML et échoue sur du [JavaScript non rendu](/blog/javascript-seo-ce-que-google-peut-et-ne-peut-pas-crawler).\n- **Trafic de référence** : les agents qui citent vos produits comme source génèrent potentiellement du trafic qualifié via les liens d'attribution.\n\n## Ce qui change pour le SEO technique dès maintenant\n\nNe vous y trompez pas : ces quatre protocoles sont à des stades de maturité très différents. MCP est le plus avancé en adoption réelle (Anthropic, OpenAI et Google l'ont tous intégré ou annoncé un support). NLWeb et A2A sont fonctionnels mais peu déployés hors des early adopters. AGENTS.md est encore au stade de proposition communautaire.\n\nPourtant, trois actions sont pertinentes dès aujourd'hui :\n\n**Auditer vos logs serveur pour quantifier le trafic agent.** Si vous ne distinguez pas les requêtes GPTBot/ClaudeBot/PerplexityBot de votre trafic crawler classique, vous pilotez à l'aveugle. Screaming Frog peut analyser vos log files pour isoler ces user-agents. Un outil de monitoring comme Seogard permet de détecter automatiquement les variations anormales de crawl qui pourraient être causées par l'afflux d'agents IA.\n\n**Consolider votre balisage Schema.org.** C'est le dénominateur commun entre le SEO classique et le web agentique. Un balisage Product, [FAQ](/blog/faq-schema-augmenter-sa-visibilite-serp), [Article](/blog/article-schema-pour-les-blogs-et-medias) ou [BreadcrumbList](/blog/breadcrumblist-ameliorer-la-navigation-serp) propre aujourd'hui sera directement exploitable par NLWeb demain. L'investissement est le même, le ROI est doublé.\n\n**Rédiger un AGENTS.md dès maintenant.** Même si aucun agent ne le respecte encore systématiquement, vous posez un cadre. Quand les standards se stabiliseront, vous serez déjà en place. Le coût est littéralement un fichier texte à la racine de votre site.\n\nLe web agentique ne remplace pas le SEO — il le prolonge. Vos [données structurées](/blog/donnees-structurees-guide-pratique-json-ld), votre architecture technique, votre [gestion des redirections](/blog/migration-de-site-checklist-seo-des-redirections) et votre performance serveur restent les fondations. Mais les consommateurs de ces fondations ne sont plus uniquement des crawlers et des navigateurs. Ce sont des agents autonomes, et ils ont besoin de protocoles pour dialoguer avec votre infrastructure. MCP, A2A, NLWeb et AGENTS.md sont les premiers candidats sérieux pour ce rôle — suivez leur évolution dans la [documentation officielle MCP](https://modelcontextprotocol.io/), les [specs A2A de Google](https://google.github.io/A2A/) et le [repo NLWeb de Microsoft](https://github.com/microsoft/NLWeb).\n```","https://seogard.io/blog/mcp-a2a-nlweb-and-agents-md-the-standards-powering-the-agentic-web-via-sejournal-slobodanmanic","Actualités SEO","2026-04-05T17:41:38.987Z","2026-04-05","Analyse technique des standards MCP, A2A, NLWeb et AGENTS.md qui structurent le web agentique, et leurs implications concrètes pour le SEO technique.","\u003Cp>Googlebot n'est plus le seul robot qui compte. Depuis 2025, des agents IA autonomes — capables de naviguer entre des services, de passer des commandes, de comparer des offres — frappent à la porte de vos serveurs. Et ils ne lisent pas le HTML comme un crawler classique. Quatre protocoles émergents structurent ce nouveau web agentique : \u003Cstrong>MCP\u003C/strong> (Model Context Protocol), \u003Cstrong>A2A\u003C/strong> (Agent-to-Agent), \u003Cstrong>NLWeb\u003C/strong> (Natural Language Web) et \u003Cstrong>AGENTS.md\u003C/strong>. Si vous gérez un site de plus de quelques centaines de pages, ces standards vont redéfinir la manière dont votre contenu est consommé — bien au-delà des SERPs traditionnelles.\u003C/p>\n\u003Ch2>Le web agentique : un changement de paradigme pour le crawl\u003C/h2>\n\u003Cp>Le web tel que les moteurs de recherche le consomment repose sur un modèle vieux de 30 ans : un robot HTTP récupère du HTML, extrait des liens, suit des directives dans \u003Ccode>robots.txt\u003C/code>, et indexe du texte. Ce modèle suppose un consommateur passif qui lit des documents.\u003C/p>\n\u003Cp>Les agents IA ne fonctionnent pas ainsi. Un agent LLM comme ceux propulsés par GPT-4, Claude ou Gemini ne \"lit\" pas une page produit — il \u003Cstrong>exécute une tâche\u003C/strong>. \"Trouve-moi un vol Paris-Tokyo sous 600€ en mai avec escale maximale d'une heure\" implique de requêter des APIs, comparer des résultats structurés, et potentiellement interagir avec des services tiers pour réserver.\u003C/p>\n\u003Cp>Ce glissement a trois conséquences techniques immédiates :\u003C/p>\n\u003Col>\n\u003Cli>\u003Cstrong>Le HTML seul ne suffit plus.\u003C/strong> Un agent a besoin d'interfaces structurées (APIs, schémas, protocoles de communication) pour agir, pas seulement pour lire.\u003C/li>\n\u003Cli>\u003Cstrong>Le crawl budget prend une nouvelle dimension.\u003C/strong> Quand des centaines d'agents autonomes interrogent vos endpoints, la gestion de la charge serveur dépasse le cadre de \u003Ca href=\"/blog/crawl-budget-mythe-ou-realite-pour-votre-site\">Googlebot et du crawl budget classique\u003C/a>.\u003C/li>\n\u003Cli>\u003Cstrong>Les directives d'accès doivent évoluer.\u003C/strong> \u003Ccode>robots.txt\u003C/code> a été conçu pour des crawlers web. Il ne couvre pas les cas d'usage d'agents qui veulent interagir avec vos services, pas simplement les indexer.\u003C/li>\n\u003C/ol>\n\u003Cp>C'est exactement ce vide que MCP, A2A, NLWeb et AGENTS.md cherchent à combler. Chaque protocole adresse une couche différente du problème.\u003C/p>\n\u003Ch2>MCP (Model Context Protocol) : l'interface entre LLM et données\u003C/h2>\n\u003Ch3>Ce que MCP résout\u003C/h3>\n\u003Cp>Développé par Anthropic et publié en open source fin 2024, le Model Context Protocol standardise la manière dont un modèle de langage accède à des sources de données externes. Avant MCP, chaque intégration LLM-outil était ad hoc : un plugin ChatGPT pour Expedia, un autre pour Kayak, chacun avec son propre format de requête et de réponse.\u003C/p>\n\u003Cp>MCP propose une architecture client-serveur simple : le LLM (client) envoie des requêtes structurées à un serveur MCP qui expose des \"tools\" (fonctions appelables) et des \"resources\" (données accessibles). Le format est JSON-RPC 2.0 — un choix pragmatique qui s'appuie sur un standard existant plutôt que d'en inventer un nouveau.\u003C/p>\n\u003Ch3>Implémentation concrète\u003C/h3>\n\u003Cp>Voici à quoi ressemble un serveur MCP minimal exposant un catalogue produit e-commerce :\u003C/p>\n\u003Cpre class=\"shiki github-dark\" style=\"background-color:#24292e;color:#e1e4e8\" tabindex=\"0\">\u003Ccode>\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">import\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> { McpServer } \u003C/span>\u003Cspan style=\"color:#F97583\">from\u003C/span>\u003Cspan style=\"color:#9ECBFF\"> \"@modelcontextprotocol/sdk/server/mcp.js\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">;\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">import\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> { StdioServerTransport } \u003C/span>\u003Cspan style=\"color:#F97583\">from\u003C/span>\u003Cspan style=\"color:#9ECBFF\"> \"@modelcontextprotocol/sdk/server/stdio.js\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">;\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">import\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> { z } \u003C/span>\u003Cspan style=\"color:#F97583\">from\u003C/span>\u003Cspan style=\"color:#9ECBFF\"> \"zod\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">;\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">const\u003C/span>\u003Cspan style=\"color:#79B8FF\"> server\u003C/span>\u003Cspan style=\"color:#F97583\"> =\u003C/span>\u003Cspan style=\"color:#F97583\"> new\u003C/span>\u003Cspan style=\"color:#B392F0\"> McpServer\u003C/span>\u003Cspan style=\"color:#E1E4E8\">({\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">  name: \u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"catalog-server\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">,\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">  version: \u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"1.0.0\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">,\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">});\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#6A737D\">// Expose un outil de recherche produit\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">server.\u003C/span>\u003Cspan style=\"color:#B392F0\">tool\u003C/span>\u003Cspan style=\"color:#E1E4E8\">(\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#9ECBFF\">  \"search_products\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">,\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#9ECBFF\">  \"Recherche dans le catalogue produit par catégorie, prix et disponibilité\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">,\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">  {\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">    category: z.\u003C/span>\u003Cspan style=\"color:#B392F0\">string\u003C/span>\u003Cspan style=\"color:#E1E4E8\">().\u003C/span>\u003Cspan style=\"color:#B392F0\">describe\u003C/span>\u003Cspan style=\"color:#E1E4E8\">(\u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"Catégorie produit (ex: 'chaussures-running')\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">),\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">    max_price: z.\u003C/span>\u003Cspan style=\"color:#B392F0\">number\u003C/span>\u003Cspan style=\"color:#E1E4E8\">().\u003C/span>\u003Cspan style=\"color:#B392F0\">optional\u003C/span>\u003Cspan style=\"color:#E1E4E8\">().\u003C/span>\u003Cspan style=\"color:#B392F0\">describe\u003C/span>\u003Cspan style=\"color:#E1E4E8\">(\u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"Prix maximum en euros\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">),\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">    in_stock: z.\u003C/span>\u003Cspan style=\"color:#B392F0\">boolean\u003C/span>\u003Cspan style=\"color:#E1E4E8\">().\u003C/span>\u003Cspan style=\"color:#B392F0\">default\u003C/span>\u003Cspan style=\"color:#E1E4E8\">(\u003C/span>\u003Cspan style=\"color:#79B8FF\">true\u003C/span>\u003Cspan style=\"color:#E1E4E8\">).\u003C/span>\u003Cspan style=\"color:#B392F0\">describe\u003C/span>\u003Cspan style=\"color:#E1E4E8\">(\u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"Uniquement les produits en stock\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">),\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">  },\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">  async\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> ({ \u003C/span>\u003Cspan style=\"color:#FFAB70\">category\u003C/span>\u003Cspan style=\"color:#E1E4E8\">, \u003C/span>\u003Cspan style=\"color:#FFAB70\">max_price\u003C/span>\u003Cspan style=\"color:#E1E4E8\">, \u003C/span>\u003Cspan style=\"color:#FFAB70\">in_stock\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> }) \u003C/span>\u003Cspan style=\"color:#F97583\">=>\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> {\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#6A737D\">    // Requête vers votre base de données / API interne\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">    const\u003C/span>\u003Cspan style=\"color:#79B8FF\"> products\u003C/span>\u003Cspan style=\"color:#F97583\"> =\u003C/span>\u003Cspan style=\"color:#F97583\"> await\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> db.products.\u003C/span>\u003Cspan style=\"color:#B392F0\">search\u003C/span>\u003Cspan style=\"color:#E1E4E8\">({ category, max_price, in_stock });\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">    return\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> {\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">      content: [\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">        {\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">          type: \u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"text\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">,\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">          text: \u003C/span>\u003Cspan style=\"color:#79B8FF\">JSON\u003C/span>\u003Cspan style=\"color:#E1E4E8\">.\u003C/span>\u003Cspan style=\"color:#B392F0\">stringify\u003C/span>\u003Cspan style=\"color:#E1E4E8\">(products, \u003C/span>\u003Cspan style=\"color:#79B8FF\">null\u003C/span>\u003Cspan style=\"color:#E1E4E8\">, \u003C/span>\u003Cspan style=\"color:#79B8FF\">2\u003C/span>\u003Cspan style=\"color:#E1E4E8\">),\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">        },\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">      ],\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">    };\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">  }\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">);\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#6A737D\">// Expose une ressource statique : les conditions de livraison\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">server.\u003C/span>\u003Cspan style=\"color:#B392F0\">resource\u003C/span>\u003Cspan style=\"color:#E1E4E8\">(\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#9ECBFF\">  \"shipping-policy\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">,\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#9ECBFF\">  \"shipping://policy\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">,\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">  async\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> (\u003C/span>\u003Cspan style=\"color:#FFAB70\">uri\u003C/span>\u003Cspan style=\"color:#E1E4E8\">) \u003C/span>\u003Cspan style=\"color:#F97583\">=>\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> ({\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">    contents: [\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">      {\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">        uri: uri.href,\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">        mimeType: \u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"text/plain\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">,\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">        text: \u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"Livraison gratuite dès 50€. Délai : 2-5 jours ouvrés en France métropolitaine.\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">,\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">      },\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">    ],\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">  })\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">);\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">const\u003C/span>\u003Cspan style=\"color:#79B8FF\"> transport\u003C/span>\u003Cspan style=\"color:#F97583\"> =\u003C/span>\u003Cspan style=\"color:#F97583\"> new\u003C/span>\u003Cspan style=\"color:#B392F0\"> StdioServerTransport\u003C/span>\u003Cspan style=\"color:#E1E4E8\">();\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">await\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> server.\u003C/span>\u003Cspan style=\"color:#B392F0\">connect\u003C/span>\u003Cspan style=\"color:#E1E4E8\">(transport);\u003C/span>\u003C/span>\u003C/code>\u003C/pre>\n\u003Cp>Ce serveur permet à n'importe quel client MCP (un agent Claude, une intégration custom, un orchestrateur) de rechercher des produits et de consulter la politique de livraison sans jamais parser du HTML.\u003C/p>\n\u003Ch3>Les limites à connaître\u003C/h3>\n\u003Cp>MCP ne gère pas l'authentification de manière native dans sa version actuelle — c'est volontairement laissé à la couche transport. Pour un catalogue public, ce n'est pas un problème. Pour des données utilisateur (historique de commandes, panier), vous devrez implémenter OAuth 2.0 ou un mécanisme équivalent au-dessus du transport HTTP SSE.\u003C/p>\n\u003Cp>Par ailleurs, MCP est conçu pour l'interaction \u003Cstrong>LLM → service\u003C/strong>. Il ne couvre pas la communication entre agents — c'est là qu'A2A entre en jeu.\u003C/p>\n\u003Ch2>A2A (Agent-to-Agent Protocol) : la communication inter-agents\u003C/h2>\n\u003Ch3>Le problème de l'orchestration\u003C/h3>\n\u003Cp>Imaginez un scénario réaliste : un utilisateur demande à son agent personnel \"Organise mon déménagement Paris → Lyon le 15 juin\". Cet agent doit coordonner un agent de réservation de camion, un agent de changement d'adresse postale, un agent d'assurance, et potentiellement un agent de comparaison de fournisseurs d'énergie.\u003C/p>\n\u003Cp>Sans protocole standard, chaque paire d'agents doit implémenter sa propre logique d'intégration. Avec N agents, ça fait N×(N-1)/2 intégrations point-à-point — un problème combinatoire classique que l'industrie a déjà rencontré avec les APIs REST avant l'émergence de GraphQL et des API gateways.\u003C/p>\n\u003Ch3>Ce qu'A2A standardise\u003C/h3>\n\u003Cp>Le protocole A2A, poussé par Google en collaboration avec plus de 50 partenaires technologiques, définit trois mécanismes fondamentaux :\u003C/p>\n\u003Cul>\n\u003Cli>\u003Cstrong>Agent Cards\u003C/strong> : des fichiers JSON hébergés à \u003Ccode>/.well-known/agent.json\u003C/code> qui décrivent les capacités d'un agent (ce qu'il sait faire, quels formats il accepte, ses endpoints).\u003C/li>\n\u003Cli>\u003Cstrong>Task management\u003C/strong> : un cycle de vie standardisé pour les tâches (submitted → working → completed/failed) avec support du streaming et des notifications push.\u003C/li>\n\u003Cli>\u003Cstrong>Message exchange\u003C/strong> : un format unifié pour les messages entre agents, supportant texte, fichiers, données structurées et formulaires interactifs.\u003C/li>\n\u003C/ul>\n\u003Cp>Voici la structure d'une Agent Card typique :\u003C/p>\n\u003Cpre class=\"shiki github-dark\" style=\"background-color:#24292e;color:#e1e4e8\" tabindex=\"0\">\u003Ccode>\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">{\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#79B8FF\">  \"name\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">: \u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"DeliveryScheduler\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">,\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#79B8FF\">  \"description\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">: \u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"Agent de planification de livraison pour e-commerce\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">,\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#79B8FF\">  \"url\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">: \u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"https://logistics.example-store.fr/a2a\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">,\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#79B8FF\">  \"version\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">: \u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"2.1.0\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">,\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#79B8FF\">  \"capabilities\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">: {\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#79B8FF\">    \"streaming\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">: \u003C/span>\u003Cspan style=\"color:#79B8FF\">true\u003C/span>\u003Cspan style=\"color:#E1E4E8\">,\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#79B8FF\">    \"pushNotifications\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">: \u003C/span>\u003Cspan style=\"color:#79B8FF\">true\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">  },\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#79B8FF\">  \"skills\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">: [\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">    {\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#79B8FF\">      \"id\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">: \u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"schedule-delivery\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">,\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#79B8FF\">      \"name\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">: \u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"Planifier une livraison\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">,\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#79B8FF\">      \"description\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">: \u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"Planifie et optimise la livraison d'une commande en fonction de l'adresse, du créneau souhaité et des contraintes logistiques\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">,\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#79B8FF\">      \"inputModes\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">: [\u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"application/json\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">],\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#79B8FF\">      \"outputModes\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">: [\u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"application/json\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">]\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">    },\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">    {\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#79B8FF\">      \"id\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">: \u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"track-shipment\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">,\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#79B8FF\">      \"name\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">: \u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"Suivre un colis\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">,\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#79B8FF\">      \"description\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">: \u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"Retourne le statut en temps réel d'un envoi\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">,\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#79B8FF\">      \"inputModes\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">: [\u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"text/plain\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">],\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#79B8FF\">      \"outputModes\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">: [\u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"application/json\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">, \u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"text/plain\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">]\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">    }\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">  ],\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#79B8FF\">  \"authentication\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">: {\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#79B8FF\">    \"schemes\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">: [\u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"oauth2\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">],\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#79B8FF\">    \"credentials\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">: \u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"https://logistics.example-store.fr/oauth/authorize\"\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">  }\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">}\u003C/span>\u003C/span>\u003C/code>\u003C/pre>\n\u003Cp>L'analogie avec \u003Ccode>robots.txt\u003C/code> et les sitemaps est frappante — et intentionnelle. Là où \u003Ccode>robots.txt\u003C/code> dit aux crawlers ce qu'ils \u003Cstrong>ne doivent pas\u003C/strong> faire, l'Agent Card dit aux agents ce que le service \u003Cstrong>sait\u003C/strong> faire.\u003C/p>\n\u003Ch3>Impact sur l'architecture technique\u003C/h3>\n\u003Cp>Pour un site e-commerce de 15 000 pages, implémenter A2A signifie concrètement :\u003C/p>\n\u003Cul>\n\u003Cli>Héberger une Agent Card à \u003Ccode>/.well-known/agent.json\u003C/code> (trivial)\u003C/li>\n\u003Cli>Exposer un endpoint A2A capable de recevoir des tâches, les traiter, et renvoyer des résultats structurés (non trivial — c'est en réalité construire une API orientée tâches)\u003C/li>\n\u003Cli>Gérer la montée en charge des requêtes agents en parallèle des requêtes humaines et crawlers\u003C/li>\n\u003C/ul>\n\u003Cp>Ce dernier point est critique. Si votre \u003Ca href=\"/blog/robots-txt-guide-complet-avec-exemples\">configuration robots.txt\u003C/a> limite déjà le crawl rate de Googlebot pour protéger vos serveurs, l'ajout d'agents A2A multiplie la surface d'appel.\u003C/p>\n\u003Ch2>NLWeb : le Schema.org du web agentique\u003C/h2>\n\u003Ch3>L'initiative Microsoft\u003C/h3>\n\u003Cp>NLWeb, porté par Microsoft et publié en avril 2025, prend le problème par un angle radicalement différent de MCP et A2A. Au lieu de demander aux sites d'implémenter des serveurs de protocoles, NLWeb propose de rendre \u003Cstrong>le contenu web existant\u003C/strong> directement interrogeable en langage naturel.\u003C/p>\n\u003Cp>Le principe : vous ajoutez un endpoint NLWeb à votre site qui accepte des requêtes en langage naturel et retourne des réponses structurées en Schema.org. L'idée est que si votre site utilise déjà des \u003Ca href=\"/blog/donnees-structurees-guide-pratique-json-ld\">données structurées JSON-LD\u003C/a>, NLWeb peut servir de couche d'interrogation par-dessus.\u003C/p>\n\u003Ch3>Pourquoi c'est pertinent pour le SEO technique\u003C/h3>\n\u003Cp>NLWeb crée un pont direct entre le travail de balisage structuré que vous faites déjà pour Google (Product schema, FAQ schema, Article schema) et la consommation par des agents IA.\u003C/p>\n\u003Cp>Concrètement, si vous avez correctement implémenté le \u003Ca href=\"/blog/product-schema-pour-l-e-commerce-seo\">schema Product pour votre e-commerce\u003C/a>, un agent NLWeb peut transformer une requête comme \"Quels sont vos sacs à dos de randonnée imperméables entre 80 et 150€ ?\" en une réponse structurée sans que l'agent ait à parser votre HTML, interpréter votre JavaScript, ou reverse-engineer votre navigation à facettes.\u003C/p>\n\u003Ch3>Architecture type\u003C/h3>\n\u003Cp>NLWeb s'appuie sur un pipeline en trois étapes :\u003C/p>\n\u003Col>\n\u003Cli>\u003Cstrong>Ingestion\u003C/strong> : votre contenu (pages HTML avec balisage Schema.org, flux produits) est indexé dans une base vectorielle (FAISS, Qdrant, Azure AI Search).\u003C/li>\n\u003Cli>\u003Cstrong>Requête NL\u003C/strong> : l'agent envoie une requête en langage naturel à votre endpoint NLWeb.\u003C/li>\n\u003Cli>\u003Cstrong>Réponse Schema.org\u003C/strong> : le système effectue une recherche sémantique, puis utilise un LLM pour formater la réponse en Schema.org.\u003C/li>\n\u003C/ol>\n\u003Cpre class=\"shiki github-dark\" style=\"background-color:#24292e;color:#e1e4e8\" tabindex=\"0\">\u003Ccode>\u003Cspan class=\"line\">\u003Cspan style=\"color:#6A737D\"># Exemple simplifié d'un endpoint NLWeb avec FastAPI\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">from\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> fastapi \u003C/span>\u003Cspan style=\"color:#F97583\">import\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> FastAPI\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">from\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> pydantic \u003C/span>\u003Cspan style=\"color:#F97583\">import\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> BaseModel\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">import\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> json\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">app \u003C/span>\u003Cspan style=\"color:#F97583\">=\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> FastAPI()\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">class\u003C/span>\u003Cspan style=\"color:#B392F0\"> NLWebQuery\u003C/span>\u003Cspan style=\"color:#E1E4E8\">(\u003C/span>\u003Cspan style=\"color:#B392F0\">BaseModel\u003C/span>\u003Cspan style=\"color:#E1E4E8\">):\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">    query: \u003C/span>\u003Cspan style=\"color:#79B8FF\">str\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">    max_results: \u003C/span>\u003Cspan style=\"color:#79B8FF\">int\u003C/span>\u003Cspan style=\"color:#F97583\"> =\u003C/span>\u003Cspan style=\"color:#79B8FF\"> 5\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">    schema_type: \u003C/span>\u003Cspan style=\"color:#79B8FF\">str\u003C/span>\u003Cspan style=\"color:#F97583\"> =\u003C/span>\u003Cspan style=\"color:#9ECBFF\"> \"Product\"\u003C/span>\u003Cspan style=\"color:#6A737D\">  # Type Schema.org attendu en réponse\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">class\u003C/span>\u003Cspan style=\"color:#B392F0\"> NLWebResponse\u003C/span>\u003Cspan style=\"color:#E1E4E8\">(\u003C/span>\u003Cspan style=\"color:#B392F0\">BaseModel\u003C/span>\u003Cspan style=\"color:#E1E4E8\">):\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">    results: \u003C/span>\u003Cspan style=\"color:#79B8FF\">list\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">    schema_context: \u003C/span>\u003Cspan style=\"color:#79B8FF\">str\u003C/span>\u003Cspan style=\"color:#F97583\"> =\u003C/span>\u003Cspan style=\"color:#9ECBFF\"> \"https://schema.org\"\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#B392F0\">@app.post\u003C/span>\u003Cspan style=\"color:#E1E4E8\">(\u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"/nlweb/ask\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">)\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">async\u003C/span>\u003Cspan style=\"color:#F97583\"> def\u003C/span>\u003Cspan style=\"color:#B392F0\"> nlweb_ask\u003C/span>\u003Cspan style=\"color:#E1E4E8\">(req: NLWebQuery):\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#6A737D\">    # 1. Recherche sémantique dans l'index vectoriel\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">    candidates \u003C/span>\u003Cspan style=\"color:#F97583\">=\u003C/span>\u003Cspan style=\"color:#F97583\"> await\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> vector_store.similarity_search(\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#FFAB70\">        query\u003C/span>\u003Cspan style=\"color:#F97583\">=\u003C/span>\u003Cspan style=\"color:#E1E4E8\">req.query,\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#FFAB70\">        top_k\u003C/span>\u003Cspan style=\"color:#F97583\">=\u003C/span>\u003Cspan style=\"color:#E1E4E8\">req.max_results \u003C/span>\u003Cspan style=\"color:#F97583\">*\u003C/span>\u003Cspan style=\"color:#79B8FF\"> 3\u003C/span>\u003Cspan style=\"color:#E1E4E8\">,  \u003C/span>\u003Cspan style=\"color:#6A737D\"># Sur-échantillonner pour le re-ranking\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#FFAB70\">        filter\u003C/span>\u003Cspan style=\"color:#F97583\">=\u003C/span>\u003Cspan style=\"color:#E1E4E8\">{\u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"@type\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">: req.schema_type}\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">    )\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#6A737D\">    # 2. Re-ranking avec un LLM pour pertinence\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">    ranked \u003C/span>\u003Cspan style=\"color:#F97583\">=\u003C/span>\u003Cspan style=\"color:#F97583\"> await\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> llm.rerank(\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#FFAB70\">        query\u003C/span>\u003Cspan style=\"color:#F97583\">=\u003C/span>\u003Cspan style=\"color:#E1E4E8\">req.query,\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#FFAB70\">        documents\u003C/span>\u003Cspan style=\"color:#F97583\">=\u003C/span>\u003Cspan style=\"color:#E1E4E8\">candidates,\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#FFAB70\">        top_k\u003C/span>\u003Cspan style=\"color:#F97583\">=\u003C/span>\u003Cspan style=\"color:#E1E4E8\">req.max_results\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">    )\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#6A737D\">    # 3. Formatage en Schema.org\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">    results \u003C/span>\u003Cspan style=\"color:#F97583\">=\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> []\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">    for\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> doc \u003C/span>\u003Cspan style=\"color:#F97583\">in\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> ranked:\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">        results.append({\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#9ECBFF\">            \"@context\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">: \u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"https://schema.org\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">,\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#9ECBFF\">            \"@type\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">: \u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"Product\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">,\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#9ECBFF\">            \"name\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">: doc.metadata[\u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"name\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">],\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#9ECBFF\">            \"description\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">: doc.metadata[\u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"description\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">],\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#9ECBFF\">            \"offers\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">: {\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#9ECBFF\">                \"@type\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">: \u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"Offer\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">,\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#9ECBFF\">                \"price\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">: doc.metadata[\u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"price\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">],\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#9ECBFF\">                \"priceCurrency\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">: \u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"EUR\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">,\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#9ECBFF\">                \"availability\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">: doc.metadata[\u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"availability\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">],\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#9ECBFF\">                \"url\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">: doc.metadata[\u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"canonical_url\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">]\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">            }\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">        })\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">    return\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> NLWebResponse(\u003C/span>\u003Cspan style=\"color:#FFAB70\">results\u003C/span>\u003Cspan style=\"color:#F97583\">=\u003C/span>\u003Cspan style=\"color:#E1E4E8\">results)\u003C/span>\u003C/span>\u003C/code>\u003C/pre>\n\u003Cp>Le trade-off est clair : NLWeb est plus facile à adopter si vous avez déjà un balisage Schema.org solide, mais il nécessite une infrastructure de recherche vectorielle et un accès LLM — ce qui représente un coût d'exploitation non négligeable.\u003C/p>\n\u003Ch2>AGENTS.md : le robots.txt pour les agents IA\u003C/h2>\n\u003Ch3>Le chaînon manquant\u003C/h3>\n\u003Cp>Les trois protocoles précédents définissent \u003Cstrong>comment\u003C/strong> les agents interagissent avec vos services. AGENTS.md définit \u003Cstrong>ce qu'ils ont le droit de faire\u003C/strong> — et c'est peut-être le standard le plus immédiatement actionable pour les équipes SEO.\u003C/p>\n\u003Cp>AGENTS.md est un fichier texte placé à la racine de votre site (comme \u003Ccode>robots.txt\u003C/code>) qui déclare des permissions et des contraintes spécifiquement pour les agents IA. Là où \u003Ccode>robots.txt\u003C/code> gère les crawlers HTTP, AGENTS.md gère les agents qui veulent \u003Cstrong>agir\u003C/strong> sur ou avec votre contenu.\u003C/p>\n\u003Ch3>Structure et syntaxe\u003C/h3>\n\u003Cp>Le format est délibérément simple — markdown structuré avec des sections conventionnelles :\u003C/p>\n\u003Cpre class=\"shiki github-dark\" style=\"background-color:#24292e;color:#e1e4e8\" tabindex=\"0\">\u003Ccode>\u003Cspan class=\"line\">\u003Cspan style=\"color:#79B8FF;font-weight:bold\"># AGENTS.md\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#79B8FF;font-weight:bold\">## Identity\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">Name: ExempleStore\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">Description: E-commerce de matériel outdoor, 14 500 produits actifs\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">Contact: tech-seo@exemple-store.fr\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#79B8FF;font-weight:bold\">## Permissions\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#FFAB70\">-\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> READ: /api/products/\u003C/span>\u003Cspan style=\"color:#E1E4E8;font-style:italic\">*, /api/categories/*\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#FFAB70\">-\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> SEARCH: /nlweb/ask\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#FFAB70\">-\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> ACTION: /api/cart/add (requires authentication)\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#FFAB70\">-\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> DENY: /api/admin/\u003C/span>\u003Cspan style=\"color:#E1E4E8;font-style:italic\">*, /api/users/*\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#79B8FF;font-weight:bold\">## Rate Limits\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#FFAB70\">-\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> Default: 60 requests/minute per agent\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#FFAB70\">-\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> Authenticated: 300 requests/minute per agent\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#FFAB70\">-\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> Burst: 10 requests/second max\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#79B8FF;font-weight:bold\">## Data Usage\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#FFAB70\">-\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> Caching: allowed for 3600 seconds\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#FFAB70\">-\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> Training: not permitted\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#FFAB70\">-\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> Attribution: required (link to source URL)\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#79B8FF;font-weight:bold\">## Preferred Protocols\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#FFAB70\">-\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> MCP: https://exemple-store.fr/mcp\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#FFAB70\">-\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> A2A: https://exemple-store.fr/.well-known/agent.json\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#FFAB70\">-\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> NLWeb: https://exemple-store.fr/nlweb/ask\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#79B8FF;font-weight:bold\">## Human Escalation\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#FFAB70\">-\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> For orders > 500€, redirect to human support\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#FFAB70\">-\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> Contact: support@exemple-store.fr\u003C/span>\u003C/span>\u003C/code>\u003C/pre>\n\u003Cp>Plusieurs points méritent attention :\u003C/p>\n\u003Cp>\u003Cstrong>La directive \"Training: not permitted\"\u003C/strong> est la plus débattue. Elle exprime l'intention du site de ne pas voir son contenu utilisé pour l'entraînement de modèles IA. Contrairement à \u003Ccode>robots.txt\u003C/code> dont le respect est quasi universel par les moteurs majeurs, AGENTS.md n'a aujourd'hui aucune force contraignante. Son respect dépend entièrement de la bonne volonté des développeurs d'agents.\u003C/p>\n\u003Cp>\u003Cstrong>Les rate limits\u003C/strong> sont déclaratifs, pas impératifs. Vous devez toujours implémenter un vrai rate limiting côté serveur (via Nginx, Cloudflare, votre API gateway). AGENTS.md informe les agents bien intentionnés de vos limites pour qu'ils s'auto-régulent — exactement comme \u003Ccode>Crawl-delay\u003C/code> dans robots.txt, que Googlebot ignore d'ailleurs.\u003C/p>\n\u003Cp>\u003Cstrong>La section \"Preferred Protocols\"\u003C/strong> crée un point d'entrée centralisé. Un agent qui découvre votre AGENTS.md sait immédiatement quels protocoles vous supportez et où trouver les endpoints correspondants.\u003C/p>\n\u003Ch2>Scénario concret : migration d'un e-commerce vers le web agentique\u003C/h2>\n\u003Ch3>Le contexte\u003C/h3>\n\u003Cp>Prenons \u003Cstrong>OutdoorPro\u003C/strong>, un e-commerce français de matériel outdoor : 14 500 pages produit, 850 pages catégorie, 200 pages de contenu éditorial. Stack technique : Next.js 14 en SSR, PostgreSQL, hébergé sur AWS. Trafic organique : 180 000 sessions/mois. Le site a déjà un balisage Schema.org Product sur toutes les fiches produit et utilise un \u003Ca href=\"/blog/sitemap-xml-bonnes-pratiques-pour-l-indexation\">sitemap XML bien structuré\u003C/a>.\u003C/p>\n\u003Cp>L'équipe constate dans ses logs serveur une augmentation de 340% des requêtes provenant de user-agents identifiés comme des agents IA (ClaudeBot, GPTBot, PerplexityBot, etc.) sur les 6 derniers mois. Le crawl budget est sous pression, et certaines pages catégories critiques sont crawlées moins fréquemment par Googlebot — un symptôme d'\u003Ca href=\"/blog/index-bloat-quand-trop-de-pages-nuisent-a-votre-seo\">index bloat combiné à une surcharge de crawl\u003C/a>.\u003C/p>\n\u003Ch3>Plan d'implémentation en 4 phases\u003C/h3>\n\u003Cp>\u003Cstrong>Phase 1 (semaine 1-2) : AGENTS.md et mise à jour robots.txt\u003C/strong>\u003C/p>\n\u003Cp>Déployer un AGENTS.md qui définit clairement les permissions et les rate limits. En parallèle, mettre à jour robots.txt pour gérer les bots IA spécifiques :\u003C/p>\n\u003Cpre class=\"shiki github-dark\" style=\"background-color:#24292e;color:#e1e4e8\" tabindex=\"0\">\u003Ccode>\u003Cspan class=\"line\">\u003Cspan style=\"color:#6A737D\"># Extrait de la config Nginx — rate limiting par catégorie de bot\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">map\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> $\u003C/span>\u003Cspan style=\"color:#FFAB70\">http_user_agent\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> $agent_category {\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#79B8FF\">    default\u003C/span>\u003Cspan style=\"color:#9ECBFF\">          \"human\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">;\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#9ECBFF\">    \"~*googlebot\"\u003C/span>\u003Cspan style=\"color:#9ECBFF\">    \"search_crawler\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">;\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#9ECBFF\">    \"~*bingbot\"\u003C/span>\u003Cspan style=\"color:#9ECBFF\">      \"search_crawler\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">;\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#9ECBFF\">    \"~*claudebot\"\u003C/span>\u003Cspan style=\"color:#9ECBFF\">    \"ai_agent\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">;\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#9ECBFF\">    \"~*gptbot\"\u003C/span>\u003Cspan style=\"color:#9ECBFF\">       \"ai_agent\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">;\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#9ECBFF\">    \"~*perplexitybot\"\u003C/span>\u003Cspan style=\"color:#9ECBFF\"> \"ai_agent\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">;\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">}\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">limit_req_zone \u003C/span>\u003Cspan style=\"color:#E1E4E8\">$agent_category zone=ai_agents:10m rate=30r/m;\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">limit_req_zone \u003C/span>\u003Cspan style=\"color:#E1E4E8\">$agent_category zone=search_crawlers:10m rate=120r/m;\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">server\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> {\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">    location\u003C/span>\u003Cspan style=\"color:#B392F0\"> /api/ \u003C/span>\u003Cspan style=\"color:#E1E4E8\">{\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">        limit_req \u003C/span>\u003Cspan style=\"color:#E1E4E8\">zone=ai_agents burst=10 nodelay;\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">        proxy_pass \u003C/span>\u003Cspan style=\"color:#E1E4E8\">http://backend;\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">    }\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">    location\u003C/span>\u003Cspan style=\"color:#B392F0\"> / \u003C/span>\u003Cspan style=\"color:#E1E4E8\">{\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">        limit_req \u003C/span>\u003Cspan style=\"color:#E1E4E8\">zone=search_crawlers burst=20;\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">        proxy_pass \u003C/span>\u003Cspan style=\"color:#E1E4E8\">http://frontend;\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">    }\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">}\u003C/span>\u003C/span>\u003C/code>\u003C/pre>\n\u003Cp>\u003Cstrong>Phase 2 (semaine 3-4) : Endpoint NLWeb\u003C/strong>\u003C/p>\n\u003Cp>Le balisage Schema.org Product existe déjà. L'équipe indexe les 14 500 fiches produit dans Qdrant (base vectorielle open source) et expose un endpoint NLWeb. Coût d'infrastructure estimé : une instance Qdrant à ~80€/mois + coût LLM pour le re-ranking (~200€/mois pour le volume anticipé).\u003C/p>\n\u003Cp>\u003Cstrong>Phase 3 (semaine 5-8) : Serveur MCP\u003C/strong>\u003C/p>\n\u003Cp>Implémentation d'un serveur MCP exposant trois outils : \u003Ccode>search_products\u003C/code>, \u003Ccode>check_availability\u003C/code>, \u003Ccode>get_shipping_estimate\u003C/code>. Ce serveur est accessible via HTTP SSE (Server-Sent Events) et nécessite une API key pour les opérations d'écriture (ajout au panier).\u003C/p>\n\u003Cp>\u003Cstrong>Phase 4 (semaine 9-12) : Agent Card A2A\u003C/strong>\u003C/p>\n\u003Cp>Publication de l'Agent Card à \u003Ccode>/.well-known/agent.json\u003C/code> décrivant les capacités du service. Cette phase est la moins urgente car l'écosystème A2A est encore naissant — peu d'agents consommateurs utilisent le protocole en production à la date de publication de cet article.\u003C/p>\n\u003Ch3>Résultats attendus et métriques\u003C/h3>\n\u003Cp>Après 3 mois de déploiement, les métriques à surveiller :\u003C/p>\n\u003Cul>\n\u003Cli>\u003Cstrong>Crawl budget Googlebot\u003C/strong> : le rate limiting des bots IA devrait libérer de la bande passante pour le crawl organique. Vérifiable dans Google Search Console > Paramètres > Statistiques d'exploration.\u003C/li>\n\u003Cli>\u003Cstrong>Requêtes agents\u003C/strong> : volume, taux de succès, latence. Un agent qui reçoit des réponses structurées via MCP/NLWeb ne retente pas — contrairement à un agent qui scrape du HTML et échoue sur du \u003Ca href=\"/blog/javascript-seo-ce-que-google-peut-et-ne-peut-pas-crawler\">JavaScript non rendu\u003C/a>.\u003C/li>\n\u003Cli>\u003Cstrong>Trafic de référence\u003C/strong> : les agents qui citent vos produits comme source génèrent potentiellement du trafic qualifié via les liens d'attribution.\u003C/li>\n\u003C/ul>\n\u003Ch2>Ce qui change pour le SEO technique dès maintenant\u003C/h2>\n\u003Cp>Ne vous y trompez pas : ces quatre protocoles sont à des stades de maturité très différents. MCP est le plus avancé en adoption réelle (Anthropic, OpenAI et Google l'ont tous intégré ou annoncé un support). NLWeb et A2A sont fonctionnels mais peu déployés hors des early adopters. AGENTS.md est encore au stade de proposition communautaire.\u003C/p>\n\u003Cp>Pourtant, trois actions sont pertinentes dès aujourd'hui :\u003C/p>\n\u003Cp>\u003Cstrong>Auditer vos logs serveur pour quantifier le trafic agent.\u003C/strong> Si vous ne distinguez pas les requêtes GPTBot/ClaudeBot/PerplexityBot de votre trafic crawler classique, vous pilotez à l'aveugle. Screaming Frog peut analyser vos log files pour isoler ces user-agents. Un outil de monitoring comme Seogard permet de détecter automatiquement les variations anormales de crawl qui pourraient être causées par l'afflux d'agents IA.\u003C/p>\n\u003Cp>\u003Cstrong>Consolider votre balisage Schema.org.\u003C/strong> C'est le dénominateur commun entre le SEO classique et le web agentique. Un balisage Product, \u003Ca href=\"/blog/faq-schema-augmenter-sa-visibilite-serp\">FAQ\u003C/a>, \u003Ca href=\"/blog/article-schema-pour-les-blogs-et-medias\">Article\u003C/a> ou \u003Ca href=\"/blog/breadcrumblist-ameliorer-la-navigation-serp\">BreadcrumbList\u003C/a> propre aujourd'hui sera directement exploitable par NLWeb demain. L'investissement est le même, le ROI est doublé.\u003C/p>\n\u003Cp>\u003Cstrong>Rédiger un AGENTS.md dès maintenant.\u003C/strong> Même si aucun agent ne le respecte encore systématiquement, vous posez un cadre. Quand les standards se stabiliseront, vous serez déjà en place. Le coût est littéralement un fichier texte à la racine de votre site.\u003C/p>\n\u003Cp>Le web agentique ne remplace pas le SEO — il le prolonge. Vos \u003Ca href=\"/blog/donnees-structurees-guide-pratique-json-ld\">données structurées\u003C/a>, votre architecture technique, votre \u003Ca href=\"/blog/migration-de-site-checklist-seo-des-redirections\">gestion des redirections\u003C/a> et votre performance serveur restent les fondations. Mais les consommateurs de ces fondations ne sont plus uniquement des crawlers et des navigateurs. Ce sont des agents autonomes, et ils ont besoin de protocoles pour dialoguer avec votre infrastructure. MCP, A2A, NLWeb et AGENTS.md sont les premiers candidats sérieux pour ce rôle — suivez leur évolution dans la \u003Ca href=\"https://modelcontextprotocol.io/\">documentation officielle MCP\u003C/a>, les \u003Ca href=\"https://google.github.io/A2A/\">specs A2A de Google\u003C/a> et le \u003Ca href=\"https://github.com/microsoft/NLWeb\">repo NLWeb de Microsoft\u003C/a>.\u003C/p>\n\u003Cpre>\u003Ccode>\u003C/code>\u003C/pre>",null,12,[18,19,20,21,22,23],"nlweb","agents","agentic web","standards","MCP","A2A","MCP, A2A, NLWeb, AGENTS.md : les protocoles du web agentique","Sun Apr 05 2026 18:14:39 GMT+0000 (Coordinated Universal Time)",[27,41,55],{"_id":28,"slug":29,"__v":6,"author":7,"canonical":30,"category":10,"createdAt":31,"date":12,"description":32,"image":15,"imageAlt":15,"readingTime":16,"tags":33,"title":39,"updatedAt":40},"69cf3d0750ec067ac27cb851","why-your-content-doesn-t-appear-in-ai-overviews-even-if-it-ranks-in-the-top-10","https://seogard.io/blog/why-your-content-doesn-t-appear-in-ai-overviews-even-if-it-ranks-in-the-top-10","2026-04-03T04:07:35.039Z","Être en top 10 ne suffit plus. Découvrez comment optimiser structure, balisage et récupération pour apparaître dans les AI Overviews de Google.",[34,35,36,37,38],"AI Overviews","SEO technique","structured data","Google SGE","content optimization","AI Overviews : pourquoi votre contenu n'y apparaît pas","Sun Apr 05 2026 01:40:52 GMT+0000 (Coordinated Universal Time)",{"_id":42,"slug":43,"__v":6,"author":7,"canonical":44,"category":10,"createdAt":45,"date":12,"description":46,"image":15,"imageAlt":15,"readingTime":16,"tags":47,"title":53,"updatedAt":54},"69d038ee3c1c869cea8ff0e6","google-is-fixing-a-search-console-bug-that-inflated-impression-counts","https://seogard.io/blog/google-is-fixing-a-search-console-bug-that-inflated-impression-counts","2026-04-03T22:02:22.423Z","Google corrige un bug GSC qui gonflait les impressions depuis le 13 mai 2025. Analyse technique, impact réel et scripts pour auditer vos données.",[48,49,50,51,52],"google search console","bug impressions","données SEO","monitoring","search performance","Bug Search Console : impressions gonflées depuis mai 2025","Sun Apr 05 2026 01:33:24 GMT+0000 (Coordinated Universal Time)",{"_id":56,"slug":57,"__v":6,"author":7,"canonical":58,"category":10,"createdAt":59,"date":12,"description":60,"image":15,"imageAlt":15,"readingTime":16,"tags":61,"title":69,"updatedAt":70},"69d1b8e1c84600c5cb80079e","google-core-update-crawl-limits-gemini-traffic-data-seo-pulse-via-sejournal-mattgsouthern","https://seogard.io/blog/google-core-update-crawl-limits-gemini-traffic-data-seo-pulse-via-sejournal-mattgsouthern","2026-04-05T01:20:33.461Z","Analyse technique du core update de mars, de l'architecture de crawl de Googlebot expliquée par Illyes, et du doublement du trafic referral Gemini.",[62,63,64,65,66,67,68],"google","core","update","crawl","limits","gemini","googlebot","Core Update, crawl limits et Gemini : décryptage technique","Sun Apr 05 2026 01:28:42 GMT+0000 (Coordinated Universal Time)"]