Recettes MCP

Recettes MCP

Neuf prompts prêts à l'emploi que vous pouvez exécuter dans n'importe quel client compatible MCP (Claude Desktop, Claude Code, Cursor, Windsurf, VS Code) après avoir installé le serveur MCP FourA.

Chaque recette utilise foura_auto (l'option par défaut intelligente) ou un ou plusieurs outils de niveau inférieur comme foura_single, foura_proxy, foura_browser pour une tâche de scraping courante. Deux façons de les utiliser :

  1. Appeler le prompt intégré : chaque client MCP expose les prompts fournis par le serveur sous forme de commande slash ou de panneau /prompts. Choisissez le prompt, renseignez les arguments, puis exécutez. Le serveur MCP renvoie le workflow basé sur modèle ; le LLM l'exécute avec les bons outils.
  2. Copier le texte ci-dessous dans votre propre chat. Le résultat est identique, mais moins découvrable.

Le serveur MCP fournit nativement ces prompts : smart_fetch, scrape_product_page, extract_article, monitor_pricing, check_endpoint_health, bulk_fetch_urls.

Remarque sur les pages volumineuses (v0.2.0+) : par défaut, les corps de response sont renvoyés inline dans structuredContent quelle que soit leur taille. Cela fonctionne dans tous les clients MCP, y compris Claude Desktop. Si vous utilisez un client compatible avec MCP resources/read ET que vous souhaitez économiser des tokens sur les pages volumineuses, passez offload_large: true dans l'appel d'outil. Les responses >= 50 KB sont alors renvoyées sous forme de resource_link que votre client récupère à la demande. Les prompts intégrés ci-dessous supposent le comportement par défaut (inline).

Open source sur GitHub ; disponible sur npm sous @fouradata/mcp.

Smart fetch (auto) : commencez ici

La recette la plus simple : transmettez une URL à foura_auto et laissez-le effectuer des tentatives limitées à travers les méthodes de request disponibles. Utilisez-la dès que vous voulez le contenu sans avoir à choisir le premier outil vous-même.

Intégré : smart_fetch(url, must_contain?, extract?)

Prompt manuel :

Fetch <URL> using foura_auto.

Pass validate.data.accept:["<a string the real page must contain>"] so only the real page counts as success. Auto makes bounded attempts and returns an error if none satisfies the validation.

For a plain follow-up, call foura_single with session.proxy as proxy, session.cookies serialized as a Cookie header, and session.userAgent as a User-Agent header. For JavaScript, pass the session values to the matching foura_browser fields.

Return the content, or extract the requested fields as JSON.

Cas d'usage idéal : une première tentative où FourA doit choisir la méthode, en particulier lorsque la validation du contenu permet de distinguer une vraie page d'une page de refus.

1. Scraper une page produit

Pour les pages de détails de produits e-commerce, y compris les sites monopages (SPA) et les pages avec vérification de site.

Intégré : scrape_product_page(url)

Prompt manuel :

Fetch the product page at <URL> using foura_browser - most product pages are single-page apps and need JavaScript to render.

From the response body extract:
- product title
- price (with currency)
- primary product image URL (absolute, not relative)
- availability / stock status
- product SKU or ID if visible

Return as JSON: {"title": "...", "price": 0, "currency": "USD", "image_url": "...", "in_stock": true, "sku": "..."}

Cas d'utilisation adaptes : un agent de comparaison de prix, un notificateur de retour en stock, une feuille de calcul d'analyse concurrentielle.

2. Extraire un article

Pour les articles d'actualite, les articles de blog, la documentation technique, tout contenu dont vous souhaitez extraire un texte lisible et propre, sans navigation, publicites ni elements parasites de bas de page.

Integre : extract_article(url)

Prompt manuel :

Fetch <URL> using foura_single with unblocker:true. Use plain HTTP first when the article is present in the server-rendered response.

If foura_single returns a 403, a verification page, or empty content, retry the same URL with foura_proxy (maxTries:3) - it routes through a rotating proxy pool.

From the response, extract:
- headline (the main H1, not the page title bar)
- author byline (may be inside .author, [rel=author], itemprop)
- publication date (look for <time>, .published, or JSON-LD)
- main article body (strip navigation, ads, related-content, footer, comments)
- canonical URL (rel=canonical or og:url)

Return as JSON: {"title": "...", "author": "...", "date_published": "ISO8601", "body": "...", "canonical_url": "..."}

Quand cette méthode convient : résumés de recherche, flux RSS pour un site unique, synthèse quotidienne d'actualités.

3. Surveiller un prix

Pour les pages de tarification et les offres de produits, avec comparaison optionnelle par rapport à un prix cible.

Intégré : monitor_pricing(url, target_price?)

Prompt manuel :

Use foura_proxy with maxTries:5 to fetch <URL>. Pricing pages often have aggressive bot detection, so go through the proxy pool from the start.

Extract the current price (look for visible $/€/£ amounts, JSON-LD Offer schema, [itemprop=price]).

If a target price is provided, compare: report whether current is below/at/above target and the absolute difference.

Return as JSON: {"url": "...", "current_price": 0.00, "currency": "USD", "target_price": 0, "difference": 0, "status": "below|at|above"}

Cas d'usage adaptés : agent d'alerte sur les prix, suivi des tarifs de voyage, veille tarifaire concurrentielle B2B.

4. Vérifier l'état de l'endpoint

Pour les sondes de disponibilité et la validation d'endpoints API.

Intégré : check_endpoint_health(url, expected_text?)

Prompt manuel :

Use foura_single with GET on <URL>, timeout_ms:5000, and validate.status.accept:[200]. If an expected substring is provided, also set validate.data.accept:["<EXPECTED>"] so the request only counts as success when the body contains it.

Report:
- reachable (true if any response came back, false on connection error/timeout)
- status_code (HTTP code from target)
- total_time_ms (the total_time field is in seconds: multiply by 1000)
- validation_passed (true if status + body validation conditions were met)

Return as JSON: {"url": "...", "reachable": true, "status_code": 200, "total_time_ms": 0, "validation_passed": true}

Cas d'usage recommandés : un moniteur de disponibilité externe, un smoke test de déploiement, une surveillance d'API tierce.

5. Récupérer une liste d'URLs en parallèle

Pour les traitements par lots où vous souhaitez obtenir des métadonnées sur plusieurs URLs sans inclure leurs corps.

Intégré : bulk_fetch_urls(urls)

Prompt manuel :

Parse the following comma-separated URLs and fetch each one concurrently using foura_single (unblocker:true).

URLs: <COMMA_SEPARATED>

For any URL that returns 403, a verification page, or empty body - retry that single URL with foura_proxy (maxTries:3).

Return a JSON array, one entry per URL in input order:
[{"url": "...", "status": 200, "success": true, "body_size_bytes": 0, "via": "single|proxy", "error": null}, ...]

Do NOT inline full response bodies in the output - only metadata. If you need body content, call foura_single individually after this report.

Quand cette recette est appropriée : une vérification d'accessibilité de sitemap, un audit de liens morts, une vérification de type « lesquelles de ces 50 URL de produits existent encore ».

6. Choisir et réutiliser une sortie ciblée par pays

Utilisez cette méthode lorsque la cible doit recevoir la request depuis un pays spécifique parmi une liste définie, y compris pour les pages JavaScript où la sélection du proxy doit avoir lieu avant le rendu du navigateur.

Prompt manuel :

First call foura_proxy for the actual target:
{
  "maxTries": 5,
  "exitCountries": ["FR", "GB"],
  "request": { "method": "GET", "url": "<TARGET_URL>" }
}

Treat exitCountries as a strict allowlist. On success, verify that exitCountry is FR or GB and capture the returned proxy ID.

If the page then needs JavaScript, call foura_browser with the returned proxy ID in foura_browser.proxy. Do not start a new proxy selection, because that may choose a different exit.

If foura_proxy returns no_eligible_proxy, preserve the requested country scope and retry later. Change or widen the list only after the user explicitly changes the requirement. Never retry silently without exitCountries.

Quand utiliser cette recette : contenu régional, marchés sous licence, tarification géolocalisée, ou tout workflow nécessitant un pays cible visible vérifié puis réutilisant la sortie sélectionnée. Le ciblage par pays est inclus à partir du forfait Startup ; sur les autres forfaits, foura_proxy renvoie plan_limit_feature, qu'aucune nouvelle tentative ne peut résoudre.

7. Page protégée : proxy d'abord, navigateur si JavaScript est requis

Utilisez une tentative de proxy limitée avec validation du contenu lorsqu'une requête directe renvoie une page de refus. Si la réponse validée réussit mais que le contenu souhaité nécessite toujours JavaScript, réutilisez cet ID de proxy exact dans le navigateur. La présence visible d'un fournisseur de protection ne garantit pas le succès d'une méthode.

Invite manuelle :

Step 1 - call foura_proxy for <TARGET_URL>. Put a string unique to the real page in request.validate.data.accept. If the user supplied an allowed country list, pass it as exitCountries; do not guess country codes.

Step 2 - if the response passes validation and JavaScript is still required, call foura_browser with the returned proxy ID in the proxy field.

Do not call foura_proxy again after a successful selection, because the new call may choose a different exit. If the bounded attempt fails, report the failure honestly instead of claiming support for the target's protection vendor.

Quand utiliser cette recette : une cible protégée où HTTP peut sélectionner une sortie fonctionnelle, mais où le contenu final nécessite un rendu JavaScript.

8. Bloqué sur une page statique : changer le navigateur présenté

Utilisez cette option lorsqu'une cible statique renvoie un blocage ou une page de défi et que JavaScript n'est pas le problème. La request présente Google Chrome dans sa version la plus récente par défaut; certaines cibles acceptent un navigateur ou une plateforme différente.

Prompt manuel :

Step 1 - call foura_single for <TARGET_URL> with request validation: put a string unique to the real page in validate.data.accept.

Step 2 - if the response is a refusal page, or defense comes back with solved false, call foura_single again with a different presented browser, for example {"browser": "Firefox"} or {"browser": "Chrome", "os": "Android"}. Keep the same validation.

If the tool answers that the combination does not exist, pick one from the list it returns. Do not retry the same impossible combination, and do not assume another browser was used instead: the request was refused, not substituted.

Step 3 - if changing the presented browser does not help, escalate to foura_proxy for a different exit, and to foura_browser only when the content genuinely needs JavaScript.

Quand utiliser cette recette : une cible avec rendu côté serveur qui filtre selon le client détecté plutôt que selon l'adresse de sortie. Modifier le navigateur présenté ne coûte rien de plus et mérite d'être testé avant la rotation de proxy.

Conseils applicables à tous les cas

  • Vous hésitez sur l'outil à utiliser ? Utilisez foura_auto. Il choisit la méthode et gère l'escalade à votre place. Utilisez un outil spécifique uniquement si vous voulez un contrôle explicite.
  • Commencez par foura_single quand une simple requête HTTP suffit. Passez à foura_proxy lorsque la requête directe est bloquée et à foura_browser quand le contenu souhaité nécessite JavaScript.
  • Les en-têtes de requête de type navigateur sont activés par défaut (unblocker). Conservez la validation du contenu pour éviter qu'une page de refus ne soit considérée comme un succès, et modifiez le navigateur présenté avec browser, os ou version lorsqu'une cible refuse la configuration par défaut.
  • Les règles de validation évitent des tentatives superflues. Définissez validate.data.fail:["captcha", "blocked"] pour qu'une réponse manifestement bloquée soit comptabilisée comme un échec et déclenche une nouvelle tentative ou une escalade de proxy, au lieu d'être traitée comme un succès.
  • Le ciblage géographique est strict. Un résultat no_eligible_proxy ne vous autorise pas à réessayer sans exitCountries ; conservez l'exigence ou demandez confirmation à l'utilisateur avant de la modifier.
  • Les corps de réponse volumineux sont intégrés par défaut (v0.2.0+). Transmettez offload_large: true pour basculer vers resource_link + resources/read sur les clients prenant en charge ces fonctionnalités.

Vous cherchez une recette absente de cette liste ?

Envoyez un e-mail à support@foura.ai en décrivant votre cas d'usage. Le serveur MCP intègre de nouveaux prompts au même rythme que les versions de l'API REST.

Mis à jour : 27 septembre 2026