[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"$fMQEbvaO2cPx4lAmb_8jNCEJUW3rtENFYXr1Vb2yfx4Q":3,"$fBwf-9tePgmVNpy5YSw1M5D7UptZcNmq73_Yp3htP4bM":25},{"_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":23,"updatedAt":24},"6a0840dbaa6b273b0cb2d70a","why-now-is-the-time-to-prepare-for-webmcp",0,"Equipe Seogard","Schema.org a mis 5 ans à devenir incontournable. Les rich snippets ont récompensé les early adopters pendant des années avant que la majorité ne s'y mette. WebMCP suit exactement la même trajectoire — sauf que cette fois, le délai sera compressé par la vitesse d'adoption des agents IA.\n\n## Ce qu'est WebMCP et pourquoi ce n'est pas \"juste un autre standard\"\n\nMCP — Model Context Protocol — est un protocole ouvert initié par Anthropic fin 2024 pour standardiser la communication entre les LLM et les sources de données externes. WebMCP en est la déclinaison web : un mécanisme qui permet à un agent IA de découvrir, comprendre et exécuter les actions disponibles sur un site web, sans scraping ni reverse-engineering du DOM.\n\nLa différence fondamentale avec ce qui existe déjà (schema.org, OpenAPI, sitemaps) : WebMCP ne décrit pas des données statiques. Il expose des **capacités**. Un agent IA qui arrive sur un site e-commerce via WebMCP ne lit pas une fiche produit — il sait qu'il peut chercher un produit par catégorie, filtrer par prix, vérifier la disponibilité en stock, et ajouter au panier. Il comprend les actions possibles et leurs paramètres.\n\nPensez-y comme la différence entre un fichier `sitemap.xml` (voici mes pages) et un fichier `webmcp.json` (voici ce que vous pouvez faire sur mon site, et comment).\n\n### Le parallèle avec schema.org est instructif, mais incomplet\n\nSchema.org décrit des entités. WebMCP décrit des interfaces d'interaction. Les deux sont complémentaires :\n\n- Schema.org dit : \"Cette page contient un produit, prix 49€, en stock\"\n- WebMCP dit : \"Vous pouvez rechercher des produits (paramètres : query, category, price_range), consulter un produit (paramètre : product_id), et passer commande (paramètres : product_id, quantity, shipping_address)\"\n\nLe premier est une annotation passive. Le second est un contrat d'API lisible par une machine. C'est cette différence qui rend WebMCP critique pour l'ère des agents IA : ces agents ne se contentent pas de lire du contenu, ils **agissent**.\n\n### Pourquoi les agents IA ont besoin de ce standard\n\nAujourd'hui, un agent IA comme ceux construits sur GPT-4, Claude ou Gemini qui veut interagir avec un site a trois options :\n\n1. **Scraping du HTML** — fragile, dépendant du DOM, casse à chaque redesign\n2. **API documentée** — nécessite une intégration custom par site\n3. **Simulation de navigation** — lent, coûteux en tokens, peu fiable\n\nAucune de ces options ne scale. WebMCP résout ce problème en fournissant un contrat standardisé que n'importe quel agent peut consommer sans intégration spécifique.\n\n## La spécification technique : anatomie d'un fichier WebMCP\n\nÀ ce stade, le standard est encore en phase de draft, mais les éléments structurels sont suffisamment stables pour commencer à prototyper. Un fichier WebMCP se place à la racine du site (convention : `/.well-known/webmcp.json`) et décrit les \"tools\" — les capacités exposées par le site.\n\nVoici un exemple concret pour un site e-commerce de mobilier avec 15 000 références :\n\n```json\n{\n  \"schema_version\": \"0.1.0\",\n  \"name\": \"MaisonDeco\",\n  \"description\": \"Mobilier et décoration d'intérieur - 15 000 produits\",\n  \"url\": \"https://www.maisondeco.fr\",\n  \"authentication\": {\n    \"type\": \"none\",\n    \"note\": \"Les actions de consultation sont publiques. L'ajout au panier nécessite un session token.\"\n  },\n  \"tools\": [\n    {\n      \"name\": \"search_products\",\n      \"description\": \"Recherche de produits par mot-clé, catégorie, fourchette de prix et disponibilité\",\n      \"parameters\": {\n        \"type\": \"object\",\n        \"properties\": {\n          \"query\": {\n            \"type\": \"string\",\n            \"description\": \"Termes de recherche en langage naturel\"\n          },\n          \"category\": {\n            \"type\": \"string\",\n            \"enum\": [\"canape\", \"table\", \"chaise\", \"luminaire\", \"rangement\", \"decoration\"],\n            \"description\": \"Catégorie principale du produit\"\n          },\n          \"price_min\": {\n            \"type\": \"number\",\n            \"description\": \"Prix minimum en euros\"\n          },\n          \"price_max\": {\n            \"type\": \"number\",\n            \"description\": \"Prix maximum en euros\"\n          },\n          \"in_stock_only\": {\n            \"type\": \"boolean\",\n            \"default\": true,\n            \"description\": \"Filtrer uniquement les produits disponibles\"\n          }\n        },\n        \"required\": [\"query\"]\n      },\n      \"endpoint\": \"/api/mcp/search\",\n      \"method\": \"GET\"\n    },\n    {\n      \"name\": \"get_product_details\",\n      \"description\": \"Détails complets d'un produit : specs, avis, délai de livraison, produits similaires\",\n      \"parameters\": {\n        \"type\": \"object\",\n        \"properties\": {\n          \"product_id\": {\n            \"type\": \"string\",\n            \"description\": \"Identifiant unique du produit (format: MD-XXXXX)\"\n          }\n        },\n        \"required\": [\"product_id\"]\n      },\n      \"endpoint\": \"/api/mcp/product/{product_id}\",\n      \"method\": \"GET\"\n    },\n    {\n      \"name\": \"check_delivery\",\n      \"description\": \"Vérifie le délai et le coût de livraison pour un code postal donné\",\n      \"parameters\": {\n        \"type\": \"object\",\n        \"properties\": {\n          \"product_id\": { \"type\": \"string\" },\n          \"postal_code\": { \"type\": \"string\", \"pattern\": \"^[0-9]{5}$\" }\n        },\n        \"required\": [\"product_id\", \"postal_code\"]\n      },\n      \"endpoint\": \"/api/mcp/delivery\",\n      \"method\": \"GET\"\n    }\n  ]\n}\n```\n\nPlusieurs points méritent attention dans cette structure :\n\n**Les descriptions en langage naturel sont critiques.** Un agent LLM choisit quel tool utiliser en se basant sur la sémantique des descriptions, pas sur les noms de champs. Une description vague comme \"Cherche des trucs\" vs. \"Recherche de produits par mot-clé, catégorie, fourchette de prix et disponibilité\" changera radicalement le taux de sélection correcte par l'agent.\n\n**Les enums guident l'agent.** Sans le champ `enum` sur `category`, l'agent devrait deviner les catégories disponibles. Avec, il peut proposer des choix pertinents à l'utilisateur humain qu'il assiste.\n\n**L'authentification est explicite.** L'agent sait immédiatement quelles actions sont accessibles sans friction et lesquelles nécessitent un contexte de session.\n\n## Scénario concret : MaisonDeco, 15 000 pages, migration vers WebMCP\n\nPrenons un cas réaliste. MaisonDeco.fr est un e-commerce de mobilier :\n\n- **15 000 pages produit**, 200 pages catégorie, 50 pages guide d'achat\n- Stack : Next.js 14 avec SSR, API REST existante, données produit dans un PIM (Akeneo)\n- Trafic organique : 180 000 sessions/mois, dont ~12 000 déjà attribuées à des réponses IA (AI Overviews, Bing Chat)\n- Le site a déjà du schema.org Product sur toutes les fiches\n\n### Phase 1 : Audit de ce qui est déjà exposable\n\nAvant d'écrire une ligne de code WebMCP, l'équipe inventorie les capacités existantes du site qui ont de la valeur pour un agent IA :\n\n1. **Recherche produit** — le moteur de recherche interne existe déjà en API\n2. **Filtrage par catégorie/prix/marque** — les facettes existent côté Elasticsearch\n3. **Vérification stock** — endpoint API existant utilisé par le front\n4. **Calcul livraison** — déjà exposé pour le checkout\n5. **Consultation avis clients** — agrégés dans le PIM\n\nL'audit révèle que 4 de ces 5 capacités ont déjà un endpoint API interne. Le travail n'est pas de recréer une API — c'est de créer une couche de description standardisée par-dessus l'existant, et éventuellement un proxy qui adapte les paramètres.\n\n### Phase 2 : Implémentation du endpoint MCP\n\nL'équipe crée un middleware Next.js qui sert le fichier de déclaration et route les appels MCP vers les API internes :\n\n```typescript\n// app/api/mcp/search/route.ts\nimport { NextRequest, NextResponse } from 'next/server';\nimport { searchProducts } from '@/lib/elasticsearch';\nimport { validateMCPRequest, rateLimitMCP } from '@/lib/mcp-middleware';\n\nexport async function GET(request: NextRequest) {\n  // Rate limiting spécifique aux agents MCP\n  const rateLimitResult = await rateLimitMCP(request, {\n    windowMs: 60_000,\n    maxRequests: 30, // 30 requêtes/min par agent\n    keyExtractor: (req) => req.headers.get('x-mcp-agent-id') || req.ip || 'unknown'\n  });\n\n  if (!rateLimitResult.allowed) {\n    return NextResponse.json(\n      { error: 'Rate limit exceeded', retryAfter: rateLimitResult.retryAfter },\n      { status: 429 }\n    );\n  }\n\n  const { searchParams } = new URL(request.url);\n  const query = searchParams.get('query');\n  const category = searchParams.get('category');\n  const priceMin = searchParams.get('price_min') ? Number(searchParams.get('price_min')) : undefined;\n  const priceMax = searchParams.get('price_max') ? Number(searchParams.get('price_max')) : undefined;\n  const inStockOnly = searchParams.get('in_stock_only') !== 'false';\n\n  if (!query) {\n    return NextResponse.json(\n      { error: 'Parameter \"query\" is required' },\n      { status: 400 }\n    );\n  }\n\n  const results = await searchProducts({\n    query,\n    category,\n    priceRange: priceMin || priceMax ? { min: priceMin, max: priceMax } : undefined,\n    inStockOnly,\n    limit: 10 // On limite la réponse pour contrôler le coût en tokens côté agent\n  });\n\n  // Format de réponse enrichi pour les agents\n  return NextResponse.json({\n    results: results.map(product => ({\n      id: product.sku,\n      name: product.title,\n      price: product.price,\n      currency: 'EUR',\n      url: `https://www.maisondeco.fr/produit/${product.slug}`,\n      image: product.mainImage,\n      availability: product.inStock ? 'InStock' : 'OutOfStock',\n      rating: product.averageRating,\n      reviewCount: product.reviewCount,\n      delivery_estimate: product.deliveryDays ? `${product.deliveryDays} jours ouvrés` : null\n    })),\n    total: results.totalCount,\n    query_understood_as: query // Utile pour le debug et la transparence\n  });\n}\n```\n\nNotez les choix de design :\n\n- **Rate limiting par agent** : vous ne voulez pas qu'un agent mal configuré DDOS votre API produit. Le header `x-mcp-agent-id` permettra d'identifier et de bloquer les agents abusifs.\n- **Limite de résultats** : 10 résultats par requête. Un agent IA paie en tokens chaque donnée reçue. Envoyer 500 produits est un anti-pattern.\n- **URL canonique dans chaque résultat** : l'agent peut renvoyer l'utilisateur vers votre site. C'est le mécanisme d'attribution du trafic.\n\n### Phase 3 : Découvrabilité\n\nLe fichier `webmcp.json` à `/.well-known/` ne suffit pas. Il faut aussi signaler son existence dans le HTML, à la manière d'un lien `rel=\"alternate\"` pour les flux RSS :\n\n```html\n\u003C!-- Dans le \u003Chead> de toutes les pages -->\n\u003Clink rel=\"webmcp\" href=\"/.well-known/webmcp.json\" type=\"application/json\" />\n\n\u003C!-- Optionnel mais recommandé : dans robots.txt -->\n\u003C!-- Ajout en fin de robots.txt -->\n```\n\nEt dans le `robots.txt` :\n\n```\nUser-agent: *\nAllow: /\n\n# WebMCP discovery\nWebMCP: https://www.maisondeco.fr/.well-known/webmcp.json\n```\n\nCette double déclaration (HTML + robots.txt) maximise les chances de découverte, quel que soit le point d'entrée de l'agent.\n\n### Résultats projetés\n\nL'équipe de MaisonDeco estime que si les agents IA de type assistant shopping (Google Shopping AI, ChatGPT plugins, Perplexity Shopping) adoptent WebMCP au S2 2026, le site pourrait capter entre 5 000 et 15 000 sessions mensuelles supplémentaires via ce canal — soit 3 à 8 % de trafic incrémental. L'hypothèse repose sur le fait que les agents préféreront les sites avec WebMCP (réponses structurées, fiables, rapides) aux sites qu'ils doivent scraper (lent, fragile, données partielles).\n\n## Ce que WebMCP change pour le SEO technique\n\n### Le crawl budget est complété par un \"agent budget\"\n\nGooglebot crawle vos pages HTML. Un agent IA appelle vos tools MCP. Les deux consomment des ressources serveur, mais de manière radicalement différente.\n\nUn crawl classique de 15 000 pages par Googlebot génère ~15 000 requêtes HTTP sur plusieurs jours. Un agent MCP qui répond à une requête utilisateur (\"trouve-moi un canapé en velours vert à moins de 800€\") génère 1 à 3 appels API ciblés. Le ratio signal/bruit est incomparable.\n\nMais cela crée une nouvelle surface à monitorer. Si votre endpoint `/api/mcp/search` renvoie une 500, aucun agent IA ne recommandera vos produits. C'est l'équivalent d'un site entier qui retourne des 500 à Googlebot — sauf que personne dans votre équipe ne surveille ces endpoints aujourd'hui.\n\nC'est exactement le type de régression qu'un outil de monitoring comme Seogard peut détecter : un endpoint MCP qui passe de 200 à 500, un temps de réponse qui explose, un fichier `webmcp.json` qui disparaît après un déploiement.\n\n### Les meta descriptions deviennent les tool descriptions\n\nEn SEO classique, la meta description n'impacte pas le ranking mais influence le CTR dans les SERP. En WebMCP, la `description` de chaque tool est l'équivalent : elle n'affecte pas directement l'indexation, mais elle détermine si l'agent choisit votre tool plutôt que celui d'un concurrent.\n\nLa qualité rédactionnelle de ces descriptions devient un avantage compétitif direct. Comparez :\n\n```json\n// Mauvais : vague, n'aide pas l'agent à décider\n{\n  \"name\": \"search\",\n  \"description\": \"Search for things on our website\"\n}\n\n// Bon : précis, informatif, mentionne les capacités spécifiques\n{\n  \"name\": \"search_furniture\",\n  \"description\": \"Search 15,000+ furniture products by keyword, category (sofa, table, chair, lighting, storage, decor), price range (EUR), brand, material, and color. Returns availability, delivery estimates, and customer ratings.\"\n}\n```\n\nL'agent LLM, face à 10 sources MCP possibles pour une requête \"canapé velours vert\", choisira celle dont la description indique clairement qu'on peut filtrer par matière et couleur.\n\n### Le lien entre schema.org existant et WebMCP\n\nSi vous avez déjà du schema.org bien implémenté, vous avez un avantage : la structure de vos données est déjà formalisée. Vos types Product, Offer, AggregateRating mappent directement vers les champs de réponse de vos tools MCP.\n\nMais attention au piège : schema.org décrit ce qui **est** sur une page. WebMCP décrit ce qu'un agent peut **faire**. Avoir du schema.org impeccable ne vous dispense pas de WebMCP — cela accélère simplement son implémentation parce que le modèle de données existe déjà.\n\n## Les risques d'une implémentation précipitée\n\n### Exposer trop de surface d'attaque\n\nChaque tool WebMCP est un endpoint API accessible publiquement. Si vous exposez un tool `create_order` sans authentification robuste, vous ouvrez une surface d'attaque massive. Règle de base : ne commencez qu'avec des tools en lecture seule. Recherche, consultation, vérification de stock — rien qui modifie l'état de votre système.\n\n### Le coût serveur invisible\n\nUn agent populaire comme ChatGPT, s'il intègre votre WebMCP, peut générer des milliers d'appels par heure. Contrairement au crawl de Googlebot (que vous pouvez throttler via `Crawl-delay`), les appels MCP d'agents multiples sont plus difficiles à prévoir.\n\nLa réponse technique : un rate limiting par agent-id, un cache agressif sur les réponses (les prix et stocks changent, mais pas à la seconde), et un monitoring des coûts d'infrastructure dédiés au trafic MCP.\n\n```nginx\n# nginx rate limiting pour les endpoints MCP\nlimit_req_zone $http_x_mcp_agent_id zone=mcp_agents:10m rate=30r/m;\n\nlocation /api/mcp/ {\n    limit_req zone=mcp_agents burst=10 nodelay;\n    limit_req_status 429;\n\n    # Cache de 5 minutes pour les recherches produit\n    proxy_cache mcp_cache;\n    proxy_cache_valid 200 5m;\n    proxy_cache_key \"$request_uri|$args\";\n\n    # Headers de traçabilité\n    add_header X-MCP-Cache-Status $upstream_cache_status;\n    add_header X-MCP-Rate-Remaining $limit_req_status;\n\n    proxy_pass http://nextjs_upstream;\n}\n```\n\n### Le standard n'est pas finalisé\n\nC'est le trade-off majeur. WebMCP est encore un draft. La structure du fichier de déclaration, les conventions d'authentification, le mécanisme de découverte — tout peut encore évoluer. Implémenter aujourd'hui signifie accepter de potentiellement refactorer dans 6 mois.\n\nC'est un risque calculé. Les early adopters de schema.org en 2011 ont aussi dû adapter leur markup à mesure que le vocabulaire évoluait. Ceux qui avaient déjà la discipline de structurer leurs données ont eu un avantage durable sur ceux qui ont attendu la version \"stable\".\n\n## Comment vous préparer sans sur-investir\n\nLa stratégie optimale n'est pas d'implémenter un WebMCP complet en production demain. C'est de préparer les fondations pour que l'implémentation soit triviale quand le standard se stabilisera.\n\n### Étape 1 : Inventorier vos capacités exposables\n\nListez toutes les actions qu'un utilisateur peut faire sur votre site. Pour chaque action, notez :\n\n- Les paramètres d'entrée\n- Le format de sortie\n- L'endpoint API existant (ou à créer)\n- Le niveau d'authentification requis\n\nSi vous n'avez pas d'API interne pour votre recherche ou votre catalogue produit, c'est le moment de la construire — elle servira aussi pour votre front-end headless, vos applications mobiles, et vos intégrations partenaires.\n\n### Étape 2 : Structurer vos API existantes en mode \"agent-friendly\"\n\nUn endpoint conçu pour un front-end React renvoie souvent trop de données (HTML partials, état du composant, données de layout). Un endpoint MCP doit renvoyer des données denses et structurées, sans bruit.\n\nCréez un layer API dédié (`/api/mcp/*`) qui formate les réponses pour des consommateurs machines : JSON pur, champs explicitement nommés, URLs canoniques incluses dans chaque objet.\n\n### Étape 3 : Monitorer la découverte par les agents IA dès maintenant\n\nLes agents IA commencent déjà à chercher des fichiers de type `/.well-known/` et à parser les sitemaps de manière non conventionnelle. Surveillez vos logs serveur pour détecter les user-agents des bots IA — [GPTBot, ClaudeBot, PerplexityBot](/blog/your-managed-wordpress-might-be-blocking-ai-bots-and-you-can-t-see-it) — et ce qu'ils demandent.\n\nSi vous voyez des requêtes vers `/.well-known/mcp.json` ou `/.well-known/webmcp.json` dans vos logs, c'est que les agents cherchent déjà. Ne pas répondre, c'est comme ne pas avoir de `sitemap.xml` en 2010.\n\n### Étape 4 : Aligner votre stack SEO existante\n\nVotre schema.org, vos sitemaps, votre SSR — tout cela reste critique. Un agent IA qui ne trouve pas de WebMCP retombera sur le scraping HTML classique, et là, [votre JavaScript rendering doit être impeccable](/blog/5-javascript-seo-lessons-from-top-ecommerce-sites).\n\nWebMCP n'est pas un remplacement du SEO technique existant. C'est une couche additionnelle. Un site avec un SSR cassé, des canonical en bazar et pas de schema.org ne sera pas sauvé par un fichier WebMCP. À l'inverse, un site dont les [fondations SEO sont solides](/blog/the-tech-seo-audit-for-the-ai-search-era-how-to-maximize-your-ai-visibility-via-sejournal-jetoctopus) n'a besoin que de cette couche supplémentaire pour être prêt pour l'ère des agents.\n\n## WebMCP dans l'écosystème plus large de l'AI discovery\n\nWebMCP ne vit pas dans le vide. Il s'inscrit dans un mouvement plus large où chaque moteur de recherche et chaque fournisseur d'IA construit sa propre couche d'interaction avec les sites web.\n\nGoogle teste de [nouveaux standards d'autorisation pour les bots](/blog/google-is-testing-new-bot-authorization-standard-via-sejournal-martinibuster). Bing travaille sur des mécanismes de [grounding qui diffèrent fondamentalement de l'indexation classique](/blog/bing-reveals-what-grounding-means-for-ai-search-visibility-via-sejournal-mattgsouthern). Les [AI Overviews de Google intègrent de plus en plus de liens](/blog/google-updates-links-within-ai-overviews-ai-mode), ce qui signifie que la visibilité dans les réponses IA se monétise déjà.\n\nWebMCP pourrait devenir le standard qui unifie ces approches fragmentées. Plutôt que d'implémenter une intégration spécifique pour chaque agent IA, vous déclarez vos capacités une fois, et chaque agent les consomme selon le même protocole.\n\nC'est exactement ce qu'a fait schema.org pour les moteurs de recherche traditionnels : un vocabulaire unique compris par Google, Bing, Yahoo et Yandex. La promesse de WebMCP est la même, mais pour les agents IA.\n\nLe pipeline de visibilité IA ne se résume plus au contenu bien ranké dans les SERP classiques. Il inclut désormais la [capacité à être sélectionné comme source par un agent IA](/blog/the-10-gate-ai-search-pipeline-find-where-your-content-fails), et WebMCP est le mécanisme qui rend cette sélection explicite plutôt qu'implicite.\n\n## Les signaux qui montrent que le momentum est réel\n\nTrois indicateurs concrets suggèrent que WebMCP n'est pas un énième standard voué à l'oubli :\n\n**L'adoption côté tooling.** Les SDK MCP d'Anthropic sont open source et activement maintenus. La documentation officielle est disponible sur [modelcontextprotocol.io](https://modelcontextprotocol.io/). OpenAI et Google ont exprimé leur intérêt pour des protocoles d'interaction standardisés — même s'ils n'ont pas encore officiellement adopté MCP, la pression du marché pousse vers la convergence.\n\n**L'usage en production.** Des entreprises comme Replit, Notion, et Zapier ont déjà implémenté des serveurs MCP. Ce ne sont pas des proof-of-concepts — ce sont des intégrations en production utilisées par des millions d'utilisateurs.\n\n**Le comportement des bots dans les logs.** Si vous analysez vos logs serveur sur les 3 derniers mois, vous constaterez probablement une augmentation des requêtes provenant d'agents IA. Ces agents testent déjà ce qu'ils peuvent faire sur vos sites. WebMCP formalise ce qu'ils font déjà de manière informelle.\n\n---\n\nLe SEO a toujours récompensé ceux qui structurent l'information avant que ce ne soit obligatoire. WebMCP est au croisement de cette discipline et de la nouvelle réalité des agents IA comme couche de découverte. Préparez vos API, inventoriez vos capacités, et mettez en place le monitoring qui détectera les régressions sur cette nouvelle surface — Seogard surveille déjà les signaux qui comptent pour cette transition.\n```","https://seogard.io/blog/why-now-is-the-time-to-prepare-for-webmcp","Actualités SEO","2026-05-16T10:03:07.522Z","2026-05-16","WebMCP s'annonce comme le schema markup pour agents IA. Guide technique pour préparer vos sites avant que le standard ne s'impose.","\u003Cp>Schema.org a mis 5 ans à devenir incontournable. Les rich snippets ont récompensé les early adopters pendant des années avant que la majorité ne s'y mette. WebMCP suit exactement la même trajectoire — sauf que cette fois, le délai sera compressé par la vitesse d'adoption des agents IA.\u003C/p>\n\u003Ch2>Ce qu'est WebMCP et pourquoi ce n'est pas \"juste un autre standard\"\u003C/h2>\n\u003Cp>MCP — Model Context Protocol — est un protocole ouvert initié par Anthropic fin 2024 pour standardiser la communication entre les LLM et les sources de données externes. WebMCP en est la déclinaison web : un mécanisme qui permet à un agent IA de découvrir, comprendre et exécuter les actions disponibles sur un site web, sans scraping ni reverse-engineering du DOM.\u003C/p>\n\u003Cp>La différence fondamentale avec ce qui existe déjà (schema.org, OpenAPI, sitemaps) : WebMCP ne décrit pas des données statiques. Il expose des \u003Cstrong>capacités\u003C/strong>. Un agent IA qui arrive sur un site e-commerce via WebMCP ne lit pas une fiche produit — il sait qu'il peut chercher un produit par catégorie, filtrer par prix, vérifier la disponibilité en stock, et ajouter au panier. Il comprend les actions possibles et leurs paramètres.\u003C/p>\n\u003Cp>Pensez-y comme la différence entre un fichier \u003Ccode>sitemap.xml\u003C/code> (voici mes pages) et un fichier \u003Ccode>webmcp.json\u003C/code> (voici ce que vous pouvez faire sur mon site, et comment).\u003C/p>\n\u003Ch3>Le parallèle avec schema.org est instructif, mais incomplet\u003C/h3>\n\u003Cp>Schema.org décrit des entités. WebMCP décrit des interfaces d'interaction. Les deux sont complémentaires :\u003C/p>\n\u003Cul>\n\u003Cli>Schema.org dit : \"Cette page contient un produit, prix 49€, en stock\"\u003C/li>\n\u003Cli>WebMCP dit : \"Vous pouvez rechercher des produits (paramètres : query, category, price_range), consulter un produit (paramètre : product_id), et passer commande (paramètres : product_id, quantity, shipping_address)\"\u003C/li>\n\u003C/ul>\n\u003Cp>Le premier est une annotation passive. Le second est un contrat d'API lisible par une machine. C'est cette différence qui rend WebMCP critique pour l'ère des agents IA : ces agents ne se contentent pas de lire du contenu, ils \u003Cstrong>agissent\u003C/strong>.\u003C/p>\n\u003Ch3>Pourquoi les agents IA ont besoin de ce standard\u003C/h3>\n\u003Cp>Aujourd'hui, un agent IA comme ceux construits sur GPT-4, Claude ou Gemini qui veut interagir avec un site a trois options :\u003C/p>\n\u003Col>\n\u003Cli>\u003Cstrong>Scraping du HTML\u003C/strong> — fragile, dépendant du DOM, casse à chaque redesign\u003C/li>\n\u003Cli>\u003Cstrong>API documentée\u003C/strong> — nécessite une intégration custom par site\u003C/li>\n\u003Cli>\u003Cstrong>Simulation de navigation\u003C/strong> — lent, coûteux en tokens, peu fiable\u003C/li>\n\u003C/ol>\n\u003Cp>Aucune de ces options ne scale. WebMCP résout ce problème en fournissant un contrat standardisé que n'importe quel agent peut consommer sans intégration spécifique.\u003C/p>\n\u003Ch2>La spécification technique : anatomie d'un fichier WebMCP\u003C/h2>\n\u003Cp>À ce stade, le standard est encore en phase de draft, mais les éléments structurels sont suffisamment stables pour commencer à prototyper. Un fichier WebMCP se place à la racine du site (convention : \u003Ccode>/.well-known/webmcp.json\u003C/code>) et décrit les \"tools\" — les capacités exposées par le site.\u003C/p>\n\u003Cp>Voici un exemple concret pour un site e-commerce de mobilier avec 15 000 références :\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\">  \"schema_version\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">: \u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"0.1.0\"\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\">\"MaisonDeco\"\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\">\"Mobilier et décoration d'intérieur - 15 000 produits\"\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://www.maisondeco.fr\"\u003C/span>\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\">    \"type\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">: \u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"none\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">,\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#79B8FF\">    \"note\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">: \u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"Les actions de consultation sont publiques. L'ajout au panier nécessite un session token.\"\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">  },\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#79B8FF\">  \"tools\"\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\">      \"name\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">: \u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"search_products\"\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\">\"Recherche de produits par mot-clé, catégorie, fourchette de prix et disponibilité\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">,\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#79B8FF\">      \"parameters\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">: {\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#79B8FF\">        \"type\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">: \u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"object\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">,\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#79B8FF\">        \"properties\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">: {\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#79B8FF\">          \"query\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">: {\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#79B8FF\">            \"type\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">: \u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"string\"\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\">\"Termes de recherche en langage naturel\"\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">          },\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#79B8FF\">          \"category\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">: {\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#79B8FF\">            \"type\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">: \u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"string\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">,\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#79B8FF\">            \"enum\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">: [\u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"canape\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">, \u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"table\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">, \u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"chaise\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">, \u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"luminaire\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">, \u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"rangement\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">, \u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"decoration\"\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\">\"Catégorie principale du produit\"\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">          },\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#79B8FF\">          \"price_min\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">: {\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#79B8FF\">            \"type\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">: \u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"number\"\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\">\"Prix minimum en euros\"\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">          },\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#79B8FF\">          \"price_max\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">: {\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#79B8FF\">            \"type\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">: \u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"number\"\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\">\"Prix maximum en euros\"\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">          },\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#79B8FF\">          \"in_stock_only\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">: {\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#79B8FF\">            \"type\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">: \u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"boolean\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">,\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#79B8FF\">            \"default\"\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\">            \"description\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">: \u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"Filtrer uniquement les produits disponibles\"\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\">        \"required\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">: [\u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"query\"\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\">      \"endpoint\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">: \u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"/api/mcp/search\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">,\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#79B8FF\">      \"method\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">: \u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"GET\"\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\">      \"name\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">: \u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"get_product_details\"\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\">\"Détails complets d'un produit : specs, avis, délai de livraison, produits similaires\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">,\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#79B8FF\">      \"parameters\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">: {\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#79B8FF\">        \"type\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">: \u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"object\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">,\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#79B8FF\">        \"properties\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">: {\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#79B8FF\">          \"product_id\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">: {\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#79B8FF\">            \"type\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">: \u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"string\"\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\">\"Identifiant unique du produit (format: MD-XXXXX)\"\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\">        \"required\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">: [\u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"product_id\"\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\">      \"endpoint\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">: \u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"/api/mcp/product/{product_id}\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">,\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#79B8FF\">      \"method\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">: \u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"GET\"\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\">      \"name\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">: \u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"check_delivery\"\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\">\"Vérifie le délai et le coût de livraison pour un code postal donné\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">,\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#79B8FF\">      \"parameters\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">: {\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#79B8FF\">        \"type\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">: \u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"object\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">,\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#79B8FF\">        \"properties\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">: {\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#79B8FF\">          \"product_id\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">: { \u003C/span>\u003Cspan style=\"color:#79B8FF\">\"type\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">: \u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"string\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> },\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#79B8FF\">          \"postal_code\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">: { \u003C/span>\u003Cspan style=\"color:#79B8FF\">\"type\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">: \u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"string\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">, \u003C/span>\u003Cspan style=\"color:#79B8FF\">\"pattern\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">: \u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"^[0-9]{5}$\"\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\">        \"required\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">: [\u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"product_id\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">, \u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"postal_code\"\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\">      \"endpoint\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">: \u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"/api/mcp/delivery\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">,\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#79B8FF\">      \"method\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">: \u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"GET\"\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>\u003C/code>\u003C/pre>\n\u003Cp>Plusieurs points méritent attention dans cette structure :\u003C/p>\n\u003Cp>\u003Cstrong>Les descriptions en langage naturel sont critiques.\u003C/strong> Un agent LLM choisit quel tool utiliser en se basant sur la sémantique des descriptions, pas sur les noms de champs. Une description vague comme \"Cherche des trucs\" vs. \"Recherche de produits par mot-clé, catégorie, fourchette de prix et disponibilité\" changera radicalement le taux de sélection correcte par l'agent.\u003C/p>\n\u003Cp>\u003Cstrong>Les enums guident l'agent.\u003C/strong> Sans le champ \u003Ccode>enum\u003C/code> sur \u003Ccode>category\u003C/code>, l'agent devrait deviner les catégories disponibles. Avec, il peut proposer des choix pertinents à l'utilisateur humain qu'il assiste.\u003C/p>\n\u003Cp>\u003Cstrong>L'authentification est explicite.\u003C/strong> L'agent sait immédiatement quelles actions sont accessibles sans friction et lesquelles nécessitent un contexte de session.\u003C/p>\n\u003Ch2>Scénario concret : MaisonDeco, 15 000 pages, migration vers WebMCP\u003C/h2>\n\u003Cp>Prenons un cas réaliste. MaisonDeco.fr est un e-commerce de mobilier :\u003C/p>\n\u003Cul>\n\u003Cli>\u003Cstrong>15 000 pages produit\u003C/strong>, 200 pages catégorie, 50 pages guide d'achat\u003C/li>\n\u003Cli>Stack : Next.js 14 avec SSR, API REST existante, données produit dans un PIM (Akeneo)\u003C/li>\n\u003Cli>Trafic organique : 180 000 sessions/mois, dont ~12 000 déjà attribuées à des réponses IA (AI Overviews, Bing Chat)\u003C/li>\n\u003Cli>Le site a déjà du schema.org Product sur toutes les fiches\u003C/li>\n\u003C/ul>\n\u003Ch3>Phase 1 : Audit de ce qui est déjà exposable\u003C/h3>\n\u003Cp>Avant d'écrire une ligne de code WebMCP, l'équipe inventorie les capacités existantes du site qui ont de la valeur pour un agent IA :\u003C/p>\n\u003Col>\n\u003Cli>\u003Cstrong>Recherche produit\u003C/strong> — le moteur de recherche interne existe déjà en API\u003C/li>\n\u003Cli>\u003Cstrong>Filtrage par catégorie/prix/marque\u003C/strong> — les facettes existent côté Elasticsearch\u003C/li>\n\u003Cli>\u003Cstrong>Vérification stock\u003C/strong> — endpoint API existant utilisé par le front\u003C/li>\n\u003Cli>\u003Cstrong>Calcul livraison\u003C/strong> — déjà exposé pour le checkout\u003C/li>\n\u003Cli>\u003Cstrong>Consultation avis clients\u003C/strong> — agrégés dans le PIM\u003C/li>\n\u003C/ol>\n\u003Cp>L'audit révèle que 4 de ces 5 capacités ont déjà un endpoint API interne. Le travail n'est pas de recréer une API — c'est de créer une couche de description standardisée par-dessus l'existant, et éventuellement un proxy qui adapte les paramètres.\u003C/p>\n\u003Ch3>Phase 2 : Implémentation du endpoint MCP\u003C/h3>\n\u003Cp>L'équipe crée un middleware Next.js qui sert le fichier de déclaration et route les appels MCP vers les API internes :\u003C/p>\n\u003Cpre class=\"shiki github-dark\" style=\"background-color:#24292e;color:#e1e4e8\" tabindex=\"0\">\u003Ccode>\u003Cspan class=\"line\">\u003Cspan style=\"color:#6A737D\">// app/api/mcp/search/route.ts\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">import\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> { NextRequest, NextResponse } \u003C/span>\u003Cspan style=\"color:#F97583\">from\u003C/span>\u003Cspan style=\"color:#9ECBFF\"> 'next/server'\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\"> { searchProducts } \u003C/span>\u003Cspan style=\"color:#F97583\">from\u003C/span>\u003Cspan style=\"color:#9ECBFF\"> '@/lib/elasticsearch'\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\"> { validateMCPRequest, rateLimitMCP } \u003C/span>\u003Cspan style=\"color:#F97583\">from\u003C/span>\u003Cspan style=\"color:#9ECBFF\"> '@/lib/mcp-middleware'\u003C/span>\u003Cspan style=\"color:#E1E4E8\">;\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">export\u003C/span>\u003Cspan style=\"color:#F97583\"> async\u003C/span>\u003Cspan style=\"color:#F97583\"> function\u003C/span>\u003Cspan style=\"color:#B392F0\"> GET\u003C/span>\u003Cspan style=\"color:#E1E4E8\">(\u003C/span>\u003Cspan style=\"color:#FFAB70\">request\u003C/span>\u003Cspan style=\"color:#F97583\">:\u003C/span>\u003Cspan style=\"color:#B392F0\"> NextRequest\u003C/span>\u003Cspan style=\"color:#E1E4E8\">) {\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#6A737D\">  // Rate limiting spécifique aux agents MCP\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">  const\u003C/span>\u003Cspan style=\"color:#79B8FF\"> rateLimitResult\u003C/span>\u003Cspan style=\"color:#F97583\"> =\u003C/span>\u003Cspan style=\"color:#F97583\"> await\u003C/span>\u003Cspan style=\"color:#B392F0\"> rateLimitMCP\u003C/span>\u003Cspan style=\"color:#E1E4E8\">(request, {\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">    windowMs: \u003C/span>\u003Cspan style=\"color:#79B8FF\">60_000\u003C/span>\u003Cspan style=\"color:#E1E4E8\">,\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">    maxRequests: \u003C/span>\u003Cspan style=\"color:#79B8FF\">30\u003C/span>\u003Cspan style=\"color:#E1E4E8\">, \u003C/span>\u003Cspan style=\"color:#6A737D\">// 30 requêtes/min par agent\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#B392F0\">    keyExtractor\u003C/span>\u003Cspan style=\"color:#E1E4E8\">: (\u003C/span>\u003Cspan style=\"color:#FFAB70\">req\u003C/span>\u003Cspan style=\"color:#E1E4E8\">) \u003C/span>\u003Cspan style=\"color:#F97583\">=>\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> req.headers.\u003C/span>\u003Cspan style=\"color:#B392F0\">get\u003C/span>\u003Cspan style=\"color:#E1E4E8\">(\u003C/span>\u003Cspan style=\"color:#9ECBFF\">'x-mcp-agent-id'\u003C/span>\u003Cspan style=\"color:#E1E4E8\">) \u003C/span>\u003Cspan style=\"color:#F97583\">||\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> req.ip \u003C/span>\u003Cspan style=\"color:#F97583\">||\u003C/span>\u003Cspan style=\"color:#9ECBFF\"> 'unknown'\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\">  if\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> (\u003C/span>\u003Cspan style=\"color:#F97583\">!\u003C/span>\u003Cspan style=\"color:#E1E4E8\">rateLimitResult.allowed) {\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">    return\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> NextResponse.\u003C/span>\u003Cspan style=\"color:#B392F0\">json\u003C/span>\u003Cspan style=\"color:#E1E4E8\">(\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">      { error: \u003C/span>\u003Cspan style=\"color:#9ECBFF\">'Rate limit exceeded'\u003C/span>\u003Cspan style=\"color:#E1E4E8\">, retryAfter: rateLimitResult.retryAfter },\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">      { status: \u003C/span>\u003Cspan style=\"color:#79B8FF\">429\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\">  const\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> { \u003C/span>\u003Cspan style=\"color:#79B8FF\">searchParams\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> } \u003C/span>\u003Cspan style=\"color:#F97583\">=\u003C/span>\u003Cspan style=\"color:#F97583\"> new\u003C/span>\u003Cspan style=\"color:#B392F0\"> URL\u003C/span>\u003Cspan style=\"color:#E1E4E8\">(request.url);\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">  const\u003C/span>\u003Cspan style=\"color:#79B8FF\"> query\u003C/span>\u003Cspan style=\"color:#F97583\"> =\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> searchParams.\u003C/span>\u003Cspan style=\"color:#B392F0\">get\u003C/span>\u003Cspan style=\"color:#E1E4E8\">(\u003C/span>\u003Cspan style=\"color:#9ECBFF\">'query'\u003C/span>\u003Cspan style=\"color:#E1E4E8\">);\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">  const\u003C/span>\u003Cspan style=\"color:#79B8FF\"> category\u003C/span>\u003Cspan style=\"color:#F97583\"> =\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> searchParams.\u003C/span>\u003Cspan style=\"color:#B392F0\">get\u003C/span>\u003Cspan style=\"color:#E1E4E8\">(\u003C/span>\u003Cspan style=\"color:#9ECBFF\">'category'\u003C/span>\u003Cspan style=\"color:#E1E4E8\">);\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">  const\u003C/span>\u003Cspan style=\"color:#79B8FF\"> priceMin\u003C/span>\u003Cspan style=\"color:#F97583\"> =\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> searchParams.\u003C/span>\u003Cspan style=\"color:#B392F0\">get\u003C/span>\u003Cspan style=\"color:#E1E4E8\">(\u003C/span>\u003Cspan style=\"color:#9ECBFF\">'price_min'\u003C/span>\u003Cspan style=\"color:#E1E4E8\">) \u003C/span>\u003Cspan style=\"color:#F97583\">?\u003C/span>\u003Cspan style=\"color:#B392F0\"> Number\u003C/span>\u003Cspan style=\"color:#E1E4E8\">(searchParams.\u003C/span>\u003Cspan style=\"color:#B392F0\">get\u003C/span>\u003Cspan style=\"color:#E1E4E8\">(\u003C/span>\u003Cspan style=\"color:#9ECBFF\">'price_min'\u003C/span>\u003Cspan style=\"color:#E1E4E8\">)) \u003C/span>\u003Cspan style=\"color:#F97583\">:\u003C/span>\u003Cspan style=\"color:#79B8FF\"> undefined\u003C/span>\u003Cspan style=\"color:#E1E4E8\">;\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">  const\u003C/span>\u003Cspan style=\"color:#79B8FF\"> priceMax\u003C/span>\u003Cspan style=\"color:#F97583\"> =\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> searchParams.\u003C/span>\u003Cspan style=\"color:#B392F0\">get\u003C/span>\u003Cspan style=\"color:#E1E4E8\">(\u003C/span>\u003Cspan style=\"color:#9ECBFF\">'price_max'\u003C/span>\u003Cspan style=\"color:#E1E4E8\">) \u003C/span>\u003Cspan style=\"color:#F97583\">?\u003C/span>\u003Cspan style=\"color:#B392F0\"> Number\u003C/span>\u003Cspan style=\"color:#E1E4E8\">(searchParams.\u003C/span>\u003Cspan style=\"color:#B392F0\">get\u003C/span>\u003Cspan style=\"color:#E1E4E8\">(\u003C/span>\u003Cspan style=\"color:#9ECBFF\">'price_max'\u003C/span>\u003Cspan style=\"color:#E1E4E8\">)) \u003C/span>\u003Cspan style=\"color:#F97583\">:\u003C/span>\u003Cspan style=\"color:#79B8FF\"> undefined\u003C/span>\u003Cspan style=\"color:#E1E4E8\">;\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">  const\u003C/span>\u003Cspan style=\"color:#79B8FF\"> inStockOnly\u003C/span>\u003Cspan style=\"color:#F97583\"> =\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> searchParams.\u003C/span>\u003Cspan style=\"color:#B392F0\">get\u003C/span>\u003Cspan style=\"color:#E1E4E8\">(\u003C/span>\u003Cspan style=\"color:#9ECBFF\">'in_stock_only'\u003C/span>\u003Cspan style=\"color:#E1E4E8\">) \u003C/span>\u003Cspan style=\"color:#F97583\">!==\u003C/span>\u003Cspan style=\"color:#9ECBFF\"> 'false'\u003C/span>\u003Cspan style=\"color:#E1E4E8\">;\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">  if\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> (\u003C/span>\u003Cspan style=\"color:#F97583\">!\u003C/span>\u003Cspan style=\"color:#E1E4E8\">query) {\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">    return\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> NextResponse.\u003C/span>\u003Cspan style=\"color:#B392F0\">json\u003C/span>\u003Cspan style=\"color:#E1E4E8\">(\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">      { error: \u003C/span>\u003Cspan style=\"color:#9ECBFF\">'Parameter \"query\" is required'\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> },\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">      { status: \u003C/span>\u003Cspan style=\"color:#79B8FF\">400\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\">  const\u003C/span>\u003Cspan style=\"color:#79B8FF\"> results\u003C/span>\u003Cspan style=\"color:#F97583\"> =\u003C/span>\u003Cspan style=\"color:#F97583\"> await\u003C/span>\u003Cspan style=\"color:#B392F0\"> searchProducts\u003C/span>\u003Cspan style=\"color:#E1E4E8\">({\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">    query,\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">    category,\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">    priceRange: priceMin \u003C/span>\u003Cspan style=\"color:#F97583\">||\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> priceMax \u003C/span>\u003Cspan style=\"color:#F97583\">?\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> { min: priceMin, max: priceMax } \u003C/span>\u003Cspan style=\"color:#F97583\">:\u003C/span>\u003Cspan style=\"color:#79B8FF\"> undefined\u003C/span>\u003Cspan style=\"color:#E1E4E8\">,\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">    inStockOnly,\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">    limit: \u003C/span>\u003Cspan style=\"color:#79B8FF\">10\u003C/span>\u003Cspan style=\"color:#6A737D\"> // On limite la réponse pour contrôler le coût en tokens côté agent\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\">  // Format de réponse enrichi pour les agents\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">  return\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> NextResponse.\u003C/span>\u003Cspan style=\"color:#B392F0\">json\u003C/span>\u003Cspan style=\"color:#E1E4E8\">({\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">    results: results.\u003C/span>\u003Cspan style=\"color:#B392F0\">map\u003C/span>\u003Cspan style=\"color:#E1E4E8\">(\u003C/span>\u003Cspan style=\"color:#FFAB70\">product\u003C/span>\u003Cspan style=\"color:#F97583\"> =>\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> ({\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">      id: product.sku,\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">      name: product.title,\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">      price: product.price,\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">      currency: \u003C/span>\u003Cspan style=\"color:#9ECBFF\">'EUR'\u003C/span>\u003Cspan style=\"color:#E1E4E8\">,\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">      url: \u003C/span>\u003Cspan style=\"color:#9ECBFF\">`https://www.maisondeco.fr/produit/${\u003C/span>\u003Cspan style=\"color:#E1E4E8\">product\u003C/span>\u003Cspan style=\"color:#9ECBFF\">.\u003C/span>\u003Cspan style=\"color:#E1E4E8\">slug\u003C/span>\u003Cspan style=\"color:#9ECBFF\">}`\u003C/span>\u003Cspan style=\"color:#E1E4E8\">,\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">      image: product.mainImage,\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">      availability: product.inStock \u003C/span>\u003Cspan style=\"color:#F97583\">?\u003C/span>\u003Cspan style=\"color:#9ECBFF\"> 'InStock'\u003C/span>\u003Cspan style=\"color:#F97583\"> :\u003C/span>\u003Cspan style=\"color:#9ECBFF\"> 'OutOfStock'\u003C/span>\u003Cspan style=\"color:#E1E4E8\">,\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">      rating: product.averageRating,\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">      reviewCount: product.reviewCount,\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">      delivery_estimate: product.deliveryDays \u003C/span>\u003Cspan style=\"color:#F97583\">?\u003C/span>\u003Cspan style=\"color:#9ECBFF\"> `${\u003C/span>\u003Cspan style=\"color:#E1E4E8\">product\u003C/span>\u003Cspan style=\"color:#9ECBFF\">.\u003C/span>\u003Cspan style=\"color:#E1E4E8\">deliveryDays\u003C/span>\u003Cspan style=\"color:#9ECBFF\">} jours ouvrés`\u003C/span>\u003Cspan style=\"color:#F97583\"> :\u003C/span>\u003Cspan style=\"color:#79B8FF\"> null\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">    })),\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">    total: results.totalCount,\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">    query_understood_as: query \u003C/span>\u003Cspan style=\"color:#6A737D\">// Utile pour le debug et la transparence\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>Notez les choix de design :\u003C/p>\n\u003Cul>\n\u003Cli>\u003Cstrong>Rate limiting par agent\u003C/strong> : vous ne voulez pas qu'un agent mal configuré DDOS votre API produit. Le header \u003Ccode>x-mcp-agent-id\u003C/code> permettra d'identifier et de bloquer les agents abusifs.\u003C/li>\n\u003Cli>\u003Cstrong>Limite de résultats\u003C/strong> : 10 résultats par requête. Un agent IA paie en tokens chaque donnée reçue. Envoyer 500 produits est un anti-pattern.\u003C/li>\n\u003Cli>\u003Cstrong>URL canonique dans chaque résultat\u003C/strong> : l'agent peut renvoyer l'utilisateur vers votre site. C'est le mécanisme d'attribution du trafic.\u003C/li>\n\u003C/ul>\n\u003Ch3>Phase 3 : Découvrabilité\u003C/h3>\n\u003Cp>Le fichier \u003Ccode>webmcp.json\u003C/code> à \u003Ccode>/.well-known/\u003C/code> ne suffit pas. Il faut aussi signaler son existence dans le HTML, à la manière d'un lien \u003Ccode>rel=\"alternate\"\u003C/code> pour les flux RSS :\u003C/p>\n\u003Cpre class=\"shiki github-dark\" style=\"background-color:#24292e;color:#e1e4e8\" tabindex=\"0\">\u003Ccode>\u003Cspan class=\"line\">\u003Cspan style=\"color:#6A737D\">&#x3C;!-- Dans le &#x3C;head> de toutes les pages -->\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">&#x3C;\u003C/span>\u003Cspan style=\"color:#85E89D\">link\u003C/span>\u003Cspan style=\"color:#B392F0\"> rel\u003C/span>\u003Cspan style=\"color:#E1E4E8\">=\u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"webmcp\"\u003C/span>\u003Cspan style=\"color:#B392F0\"> href\u003C/span>\u003Cspan style=\"color:#E1E4E8\">=\u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"/.well-known/webmcp.json\"\u003C/span>\u003Cspan style=\"color:#B392F0\"> type\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\">\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#6A737D\">&#x3C;!-- Optionnel mais recommandé : dans robots.txt -->\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#6A737D\">&#x3C;!-- Ajout en fin de robots.txt -->\u003C/span>\u003C/span>\u003C/code>\u003C/pre>\n\u003Cp>Et dans le \u003Ccode>robots.txt\u003C/code> :\u003C/p>\n\u003Cpre>\u003Ccode>User-agent: *\nAllow: /\n\n# WebMCP discovery\nWebMCP: https://www.maisondeco.fr/.well-known/webmcp.json\n\u003C/code>\u003C/pre>\n\u003Cp>Cette double déclaration (HTML + robots.txt) maximise les chances de découverte, quel que soit le point d'entrée de l'agent.\u003C/p>\n\u003Ch3>Résultats projetés\u003C/h3>\n\u003Cp>L'équipe de MaisonDeco estime que si les agents IA de type assistant shopping (Google Shopping AI, ChatGPT plugins, Perplexity Shopping) adoptent WebMCP au S2 2026, le site pourrait capter entre 5 000 et 15 000 sessions mensuelles supplémentaires via ce canal — soit 3 à 8 % de trafic incrémental. L'hypothèse repose sur le fait que les agents préféreront les sites avec WebMCP (réponses structurées, fiables, rapides) aux sites qu'ils doivent scraper (lent, fragile, données partielles).\u003C/p>\n\u003Ch2>Ce que WebMCP change pour le SEO technique\u003C/h2>\n\u003Ch3>Le crawl budget est complété par un \"agent budget\"\u003C/h3>\n\u003Cp>Googlebot crawle vos pages HTML. Un agent IA appelle vos tools MCP. Les deux consomment des ressources serveur, mais de manière radicalement différente.\u003C/p>\n\u003Cp>Un crawl classique de 15 000 pages par Googlebot génère ~15 000 requêtes HTTP sur plusieurs jours. Un agent MCP qui répond à une requête utilisateur (\"trouve-moi un canapé en velours vert à moins de 800€\") génère 1 à 3 appels API ciblés. Le ratio signal/bruit est incomparable.\u003C/p>\n\u003Cp>Mais cela crée une nouvelle surface à monitorer. Si votre endpoint \u003Ccode>/api/mcp/search\u003C/code> renvoie une 500, aucun agent IA ne recommandera vos produits. C'est l'équivalent d'un site entier qui retourne des 500 à Googlebot — sauf que personne dans votre équipe ne surveille ces endpoints aujourd'hui.\u003C/p>\n\u003Cp>C'est exactement le type de régression qu'un outil de monitoring comme Seogard peut détecter : un endpoint MCP qui passe de 200 à 500, un temps de réponse qui explose, un fichier \u003Ccode>webmcp.json\u003C/code> qui disparaît après un déploiement.\u003C/p>\n\u003Ch3>Les meta descriptions deviennent les tool descriptions\u003C/h3>\n\u003Cp>En SEO classique, la meta description n'impacte pas le ranking mais influence le CTR dans les SERP. En WebMCP, la \u003Ccode>description\u003C/code> de chaque tool est l'équivalent : elle n'affecte pas directement l'indexation, mais elle détermine si l'agent choisit votre tool plutôt que celui d'un concurrent.\u003C/p>\n\u003Cp>La qualité rédactionnelle de ces descriptions devient un avantage compétitif direct. Comparez :\u003C/p>\n\u003Cpre class=\"shiki github-dark\" style=\"background-color:#24292e;color:#e1e4e8\" tabindex=\"0\">\u003Ccode>\u003Cspan class=\"line\">\u003Cspan style=\"color:#6A737D\">// Mauvais : vague, n'aide pas l'agent à décider\u003C/span>\u003C/span>\n\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\">\"search\"\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\">\"Search for things on our website\"\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\">// Bon : précis, informatif, mentionne les capacités spécifiques\u003C/span>\u003C/span>\n\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\">\"search_furniture\"\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\">\"Search 15,000+ furniture products by keyword, category (sofa, table, chair, lighting, storage, decor), price range (EUR), brand, material, and color. Returns availability, delivery estimates, and customer ratings.\"\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">}\u003C/span>\u003C/span>\u003C/code>\u003C/pre>\n\u003Cp>L'agent LLM, face à 10 sources MCP possibles pour une requête \"canapé velours vert\", choisira celle dont la description indique clairement qu'on peut filtrer par matière et couleur.\u003C/p>\n\u003Ch3>Le lien entre schema.org existant et WebMCP\u003C/h3>\n\u003Cp>Si vous avez déjà du schema.org bien implémenté, vous avez un avantage : la structure de vos données est déjà formalisée. Vos types Product, Offer, AggregateRating mappent directement vers les champs de réponse de vos tools MCP.\u003C/p>\n\u003Cp>Mais attention au piège : schema.org décrit ce qui \u003Cstrong>est\u003C/strong> sur une page. WebMCP décrit ce qu'un agent peut \u003Cstrong>faire\u003C/strong>. Avoir du schema.org impeccable ne vous dispense pas de WebMCP — cela accélère simplement son implémentation parce que le modèle de données existe déjà.\u003C/p>\n\u003Ch2>Les risques d'une implémentation précipitée\u003C/h2>\n\u003Ch3>Exposer trop de surface d'attaque\u003C/h3>\n\u003Cp>Chaque tool WebMCP est un endpoint API accessible publiquement. Si vous exposez un tool \u003Ccode>create_order\u003C/code> sans authentification robuste, vous ouvrez une surface d'attaque massive. Règle de base : ne commencez qu'avec des tools en lecture seule. Recherche, consultation, vérification de stock — rien qui modifie l'état de votre système.\u003C/p>\n\u003Ch3>Le coût serveur invisible\u003C/h3>\n\u003Cp>Un agent populaire comme ChatGPT, s'il intègre votre WebMCP, peut générer des milliers d'appels par heure. Contrairement au crawl de Googlebot (que vous pouvez throttler via \u003Ccode>Crawl-delay\u003C/code>), les appels MCP d'agents multiples sont plus difficiles à prévoir.\u003C/p>\n\u003Cp>La réponse technique : un rate limiting par agent-id, un cache agressif sur les réponses (les prix et stocks changent, mais pas à la seconde), et un monitoring des coûts d'infrastructure dédiés au trafic MCP.\u003C/p>\n\u003Cpre class=\"shiki github-dark\" style=\"background-color:#24292e;color:#e1e4e8\" tabindex=\"0\">\u003Ccode>\u003Cspan class=\"line\">\u003Cspan style=\"color:#6A737D\"># nginx rate limiting pour les endpoints MCP\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">limit_req_zone \u003C/span>\u003Cspan style=\"color:#E1E4E8\">$http_x_mcp_agent_id zone=mcp_agents:10m rate=30r/m;\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\"> /api/mcp/ \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=mcp_agents burst=10 nodelay;\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">    limit_req_status \u003C/span>\u003Cspan style=\"color:#79B8FF\">429\u003C/span>\u003Cspan style=\"color:#E1E4E8\">;\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#6A737D\">    # Cache de 5 minutes pour les recherches produit\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">    proxy_cache \u003C/span>\u003Cspan style=\"color:#E1E4E8\">mcp_cache;\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">    proxy_cache_valid \u003C/span>\u003Cspan style=\"color:#79B8FF\">200\u003C/span>\u003Cspan style=\"color:#79B8FF\"> 5m\u003C/span>\u003Cspan style=\"color:#E1E4E8\">;\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">    proxy_cache_key \u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"$\u003C/span>\u003Cspan style=\"color:#E1E4E8\">request_uri\u003C/span>\u003Cspan style=\"color:#9ECBFF\">|$\u003C/span>\u003Cspan style=\"color:#E1E4E8\">args\u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">;\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#6A737D\">    # Headers de traçabilité\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">    add_header \u003C/span>\u003Cspan style=\"color:#E1E4E8\">X-MCP-Cache-Status $upstream_cache_status;\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">    add_header \u003C/span>\u003Cspan style=\"color:#E1E4E8\">X-MCP-Rate-Remaining $limit_req_status;\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">    proxy_pass \u003C/span>\u003Cspan style=\"color:#E1E4E8\">http://nextjs_upstream;\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">}\u003C/span>\u003C/span>\u003C/code>\u003C/pre>\n\u003Ch3>Le standard n'est pas finalisé\u003C/h3>\n\u003Cp>C'est le trade-off majeur. WebMCP est encore un draft. La structure du fichier de déclaration, les conventions d'authentification, le mécanisme de découverte — tout peut encore évoluer. Implémenter aujourd'hui signifie accepter de potentiellement refactorer dans 6 mois.\u003C/p>\n\u003Cp>C'est un risque calculé. Les early adopters de schema.org en 2011 ont aussi dû adapter leur markup à mesure que le vocabulaire évoluait. Ceux qui avaient déjà la discipline de structurer leurs données ont eu un avantage durable sur ceux qui ont attendu la version \"stable\".\u003C/p>\n\u003Ch2>Comment vous préparer sans sur-investir\u003C/h2>\n\u003Cp>La stratégie optimale n'est pas d'implémenter un WebMCP complet en production demain. C'est de préparer les fondations pour que l'implémentation soit triviale quand le standard se stabilisera.\u003C/p>\n\u003Ch3>Étape 1 : Inventorier vos capacités exposables\u003C/h3>\n\u003Cp>Listez toutes les actions qu'un utilisateur peut faire sur votre site. Pour chaque action, notez :\u003C/p>\n\u003Cul>\n\u003Cli>Les paramètres d'entrée\u003C/li>\n\u003Cli>Le format de sortie\u003C/li>\n\u003Cli>L'endpoint API existant (ou à créer)\u003C/li>\n\u003Cli>Le niveau d'authentification requis\u003C/li>\n\u003C/ul>\n\u003Cp>Si vous n'avez pas d'API interne pour votre recherche ou votre catalogue produit, c'est le moment de la construire — elle servira aussi pour votre front-end headless, vos applications mobiles, et vos intégrations partenaires.\u003C/p>\n\u003Ch3>Étape 2 : Structurer vos API existantes en mode \"agent-friendly\"\u003C/h3>\n\u003Cp>Un endpoint conçu pour un front-end React renvoie souvent trop de données (HTML partials, état du composant, données de layout). Un endpoint MCP doit renvoyer des données denses et structurées, sans bruit.\u003C/p>\n\u003Cp>Créez un layer API dédié (\u003Ccode>/api/mcp/*\u003C/code>) qui formate les réponses pour des consommateurs machines : JSON pur, champs explicitement nommés, URLs canoniques incluses dans chaque objet.\u003C/p>\n\u003Ch3>Étape 3 : Monitorer la découverte par les agents IA dès maintenant\u003C/h3>\n\u003Cp>Les agents IA commencent déjà à chercher des fichiers de type \u003Ccode>/.well-known/\u003C/code> et à parser les sitemaps de manière non conventionnelle. Surveillez vos logs serveur pour détecter les user-agents des bots IA — \u003Ca href=\"/blog/your-managed-wordpress-might-be-blocking-ai-bots-and-you-can-t-see-it\">GPTBot, ClaudeBot, PerplexityBot\u003C/a> — et ce qu'ils demandent.\u003C/p>\n\u003Cp>Si vous voyez des requêtes vers \u003Ccode>/.well-known/mcp.json\u003C/code> ou \u003Ccode>/.well-known/webmcp.json\u003C/code> dans vos logs, c'est que les agents cherchent déjà. Ne pas répondre, c'est comme ne pas avoir de \u003Ccode>sitemap.xml\u003C/code> en 2010.\u003C/p>\n\u003Ch3>Étape 4 : Aligner votre stack SEO existante\u003C/h3>\n\u003Cp>Votre schema.org, vos sitemaps, votre SSR — tout cela reste critique. Un agent IA qui ne trouve pas de WebMCP retombera sur le scraping HTML classique, et là, \u003Ca href=\"/blog/5-javascript-seo-lessons-from-top-ecommerce-sites\">votre JavaScript rendering doit être impeccable\u003C/a>.\u003C/p>\n\u003Cp>WebMCP n'est pas un remplacement du SEO technique existant. C'est une couche additionnelle. Un site avec un SSR cassé, des canonical en bazar et pas de schema.org ne sera pas sauvé par un fichier WebMCP. À l'inverse, un site dont les \u003Ca href=\"/blog/the-tech-seo-audit-for-the-ai-search-era-how-to-maximize-your-ai-visibility-via-sejournal-jetoctopus\">fondations SEO sont solides\u003C/a> n'a besoin que de cette couche supplémentaire pour être prêt pour l'ère des agents.\u003C/p>\n\u003Ch2>WebMCP dans l'écosystème plus large de l'AI discovery\u003C/h2>\n\u003Cp>WebMCP ne vit pas dans le vide. Il s'inscrit dans un mouvement plus large où chaque moteur de recherche et chaque fournisseur d'IA construit sa propre couche d'interaction avec les sites web.\u003C/p>\n\u003Cp>Google teste de \u003Ca href=\"/blog/google-is-testing-new-bot-authorization-standard-via-sejournal-martinibuster\">nouveaux standards d'autorisation pour les bots\u003C/a>. Bing travaille sur des mécanismes de \u003Ca href=\"/blog/bing-reveals-what-grounding-means-for-ai-search-visibility-via-sejournal-mattgsouthern\">grounding qui diffèrent fondamentalement de l'indexation classique\u003C/a>. Les \u003Ca href=\"/blog/google-updates-links-within-ai-overviews-ai-mode\">AI Overviews de Google intègrent de plus en plus de liens\u003C/a>, ce qui signifie que la visibilité dans les réponses IA se monétise déjà.\u003C/p>\n\u003Cp>WebMCP pourrait devenir le standard qui unifie ces approches fragmentées. Plutôt que d'implémenter une intégration spécifique pour chaque agent IA, vous déclarez vos capacités une fois, et chaque agent les consomme selon le même protocole.\u003C/p>\n\u003Cp>C'est exactement ce qu'a fait schema.org pour les moteurs de recherche traditionnels : un vocabulaire unique compris par Google, Bing, Yahoo et Yandex. La promesse de WebMCP est la même, mais pour les agents IA.\u003C/p>\n\u003Cp>Le pipeline de visibilité IA ne se résume plus au contenu bien ranké dans les SERP classiques. Il inclut désormais la \u003Ca href=\"/blog/the-10-gate-ai-search-pipeline-find-where-your-content-fails\">capacité à être sélectionné comme source par un agent IA\u003C/a>, et WebMCP est le mécanisme qui rend cette sélection explicite plutôt qu'implicite.\u003C/p>\n\u003Ch2>Les signaux qui montrent que le momentum est réel\u003C/h2>\n\u003Cp>Trois indicateurs concrets suggèrent que WebMCP n'est pas un énième standard voué à l'oubli :\u003C/p>\n\u003Cp>\u003Cstrong>L'adoption côté tooling.\u003C/strong> Les SDK MCP d'Anthropic sont open source et activement maintenus. La documentation officielle est disponible sur \u003Ca href=\"https://modelcontextprotocol.io/\">modelcontextprotocol.io\u003C/a>. OpenAI et Google ont exprimé leur intérêt pour des protocoles d'interaction standardisés — même s'ils n'ont pas encore officiellement adopté MCP, la pression du marché pousse vers la convergence.\u003C/p>\n\u003Cp>\u003Cstrong>L'usage en production.\u003C/strong> Des entreprises comme Replit, Notion, et Zapier ont déjà implémenté des serveurs MCP. Ce ne sont pas des proof-of-concepts — ce sont des intégrations en production utilisées par des millions d'utilisateurs.\u003C/p>\n\u003Cp>\u003Cstrong>Le comportement des bots dans les logs.\u003C/strong> Si vous analysez vos logs serveur sur les 3 derniers mois, vous constaterez probablement une augmentation des requêtes provenant d'agents IA. Ces agents testent déjà ce qu'ils peuvent faire sur vos sites. WebMCP formalise ce qu'ils font déjà de manière informelle.\u003C/p>\n\u003Chr>\n\u003Cp>Le SEO a toujours récompensé ceux qui structurent l'information avant que ce ne soit obligatoire. WebMCP est au croisement de cette discipline et de la nouvelle réalité des agents IA comme couche de découverte. Préparez vos API, inventoriez vos capacités, et mettez en place le monitoring qui détectera les régressions sur cette nouvelle surface — Seogard surveille déjà les signaux qui comptent pour cette transition.\u003C/p>\n\u003Cpre>\u003Ccode>\u003C/code>\u003C/pre>",null,12,[18,19,20,21,22],"webmcp","ai-agents","seo-technique","mcp","structured-data","WebMCP : pourquoi préparer votre site maintenant","Sat May 16 2026 10:03:07 GMT+0000 (Coordinated Universal Time)",[26,40,56],{"_id":27,"slug":28,"__v":6,"author":7,"canonical":29,"category":10,"createdAt":30,"date":12,"description":31,"image":15,"imageAlt":15,"readingTime":16,"tags":32,"title":38,"updatedAt":39},"6a080899aa6b273b0c846ac0","google-s-product-packs-are-now-a-primary-sales-channel-here-s-what-the-data-shows","https://seogard.io/blog/google-s-product-packs-are-now-a-primary-sales-channel-here-s-what-the-data-shows","2026-05-16T06:03:05.137Z","Analyse de 63 000+ marchands : structured data, feed optimization et monitoring pour dominer les product packs Google en 2026.",[33,34,35,36,37],"product packs","structured data","Google Shopping","e-commerce SEO","merchant feed","Product Packs Google : canal de vente primaire en 2026","Sat May 16 2026 06:03:05 GMT+0000 (Coordinated Universal Time)",{"_id":41,"slug":42,"__v":6,"author":7,"canonical":43,"category":10,"createdAt":44,"date":45,"description":46,"image":15,"imageAlt":15,"readingTime":16,"tags":47,"title":54,"updatedAt":55},"6a075fc8aa6b273b0cf91f12","google-publishes-guide-on-optimizing-for-generative-ai-features","https://seogard.io/blog/google-publishes-guide-on-optimizing-for-generative-ai-features","2026-05-15T18:02:48.402Z","2026-05-15","Analyse technique du nouveau guide Google sur l'optimisation pour l'IA générative : GEO vs SEO, contenu commodity, agents IA et actions concrètes.",[48,49,50,51,52,53],"google","generative AI","GEO","AEO","AI Overviews","SEO technique","Guide Google pour l'IA générative : ce que ça change en SEO technique","Fri May 15 2026 18:02:48 GMT+0000 (Coordinated Universal Time)",{"_id":57,"slug":58,"__v":6,"author":7,"canonical":59,"category":10,"createdAt":60,"date":61,"description":62,"image":15,"imageAlt":15,"readingTime":16,"tags":63,"title":69,"updatedAt":70},"6a041412aa6b273b0c40f181","how-to-build-local-pages-that-win-in-ai-powered-search-via-sejournal-lorenbaker","https://seogard.io/blog/how-to-build-local-pages-that-win-in-ai-powered-search-via-sejournal-lorenbaker","2026-05-13T06:02:58.743Z","2026-05-13","Guide technique pour construire des pages locales qui performent dans les AI Overviews et AI Mode. Schema, SSR, contenu structuré.",[64,65,66,67,68],"local SEO","AI search","pages locales","schema markup","SSR","Pages locales pour l'AI Search : architecture technique","Wed May 13 2026 06:02:58 GMT+0000 (Coordinated Universal Time)"]