Recettes MCP

Recettes MCP

Cinq prompts prêts à être collés 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 orchestre un ou plusieurs outils parmi foura_single, foura_proxy, foura_browser pour une tâche de scraping courante. Deux façons de les utiliser :

  1. Invoquer le prompt intégré (chaque client MCP présente les prompts fournis par le serveur sous forme de commande slash ou de panneau /prompts). Choisissez le prompt, renseignez les arguments, exécutez. Le serveur MCP renvoie le workflow modélisé, le LLM l'exécute avec les bons outils.
  2. Copier la prose ci-dessous dans votre propre chat. Même effet, moins découvrable.

Le serveur MCP livre ces prompts de manière native : scrape_product_page, extract_article, monitor_pricing, check_endpoint_health, bulk_fetch_urls.

Note sur les pages volumineuses (v0.2.0+) : par défaut, les corps de response reviennent inline dans structuredContent quelle que soit leur taille, cela fonctionne dans tous les clients MCP, y compris Claude Desktop. Si vous utilisez un client qui prend en charge MCP resources/read ET que vous souhaitez économiser des tokens sur les grandes pages, passez offload_large: true dans l'appel de l'outil. Les responses >= 50 Ko arrivent alors 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).

1. Scraper une page produit

Pour les pages de détails de produits e-commerce, y compris les sites d'applications monopages (SPA) et les pages derrière des défis anti-bots.

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": "..."}

Quand utiliser cette recette : 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 de presse, les articles de blog, la documentation technique, tout ce pour quoi vous souhaitez un texte de lecture propre sans navigation, publicités ni bruit de pied de page.

Intégré : extract_article(url)

Prompt manuel :

Fetch <URL> using foura_single with unblocker:true. Most news and blog sites are server-rendered, so HTTP is fastest (200ms-2s).

If foura_single returns a 403, captcha 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 utiliser cette recette : un synthétiseur de recherche, un flux RSS pour un site unique, un condensé quotidien de l'actualité.

3. Surveiller un prix

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

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

Prompt manuel :

Use foura_proxy with maxTries:5 and unblocker:true 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"}

Quand utiliser cette recette : un agent d'alerte d'économies, un observateur de tarifs de voyage, un outil de suivi des prix des concurrents B2B.

4. Vérifier la santé d'un endpoint

Pour les sondes de disponibilité (uptime) et la validation d'endpoint 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 (from the total_time field)
- 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}

Quand utiliser cette recette : un moniteur de disponibilité externe, un test de fumée (smoke test) de déploiement, un chien de garde d'API tierce.

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

Pour les tâches par lots où vous souhaitez des métadonnées sur de nombreuses URLs sans intégrer leurs corps en ligne.

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, captcha 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 utiliser cette recette : un balayage de l'accessibilité d'un sitemap, un audit des liens brisés (link-rot), une vérification de type « lesquelles de ces 50 URLs de produits existent encore ».

6. Verrouiller une IP de proxy sur plusieurs appels (multi-outils)

Lorsque vous avez besoin que des appels consécutifs semblent provenir du même client (par exemple, pour scraper un tunnel d'achat en plusieurs étapes, ou pour récupérer les ressources JS d'une page après son rendu), choisissez un proxy fonctionnel et réutilisez son ID.

Prompt manuel :

First, call foura_proxy with maxTries:5 and a quick probe URL (httpbin.org/ip is fine) to find a working proxy. Capture the returned `proxy` ID (looks like "4DZ3VE").

Then for every follow-up call:
- HTTP request: foura_single with the SAME `proxy` value — same exit IP, you preserve any IP-based session.
- Rendered page: foura_browser with the SAME `proxy` value — the browser exits through the same pool IP.

If a specific proxy ID starts failing mid-workflow, call foura_proxy again with ignoreProxies:["<failed_id>"] to get a fresh one.

Quand utiliser cette recette : le scraping de pages où l'état de la session est lié à l'IP, la récupération de sous-ressources CSS/JS après le rendu, l'A/B testing du comportement d'un site depuis un pays spécifique, ou tout flux multi-appels où vous souhaitez une sortie prévisible.

7. Chaîne de défis WAF (tier-1 : Vercel / Cloudflare / Akamai)

Le modèle canonique pour les sites derrière un défi WAF de tier-1 (Vercel Security Checkpoint, Cloudflare « Just a moment », Akamai Bot Manager). Appeler foura_browser directement sur ces cibles capture généralement la page de défi plutôt que le contenu post-défi, car la capture d'écran se déclenche avant la fin du rechargement différé du défi. Résolvez d'abord via foura_proxy (qui élimine le défi en essayant de nombreuses IP de sortie jusqu'à ce que l'une d'elles passe), puis chaînez l'ID de proxy renvoyé dans foura_browser.

Prompt manuel :

Step 1 — find an exit IP that clears the challenge:
  foura_proxy({
    maxTries: 30,               // tier-1 WAFs typically need this range
    request: { method: "GET", url: "<TARGET_URL>", unblocker: true }
  })
On success the response carries `proxy: "<BASE36_ID>"`. Capture it.

Step 2 — render the post-challenge page through the same IP:
  foura_browser({
    url: "<TARGET_URL>",
    proxy: "<BASE36_ID>"        // reuse the cleared exit
  })

If foura_proxy still fails after 30 attempts with the same block,
the gate is likely a country / ASN allowlist (country-licensed
bookmakers, government sites). Rotation will never help — pivot
strategy (different data source, partner agreement, etc.).

Déclencheurs qui devraient vous orienter vers cette recette :

  • foura_single renvoie le statut 429 avec le header x-vercel-mitigated: challenge ou cf-mitigated: challenge
  • Le titre du corps correspond à Vercel Security Checkpoint / Just a moment / Attention Required / We're verifying your browser
  • foura_browser capture directement un minuscule HTML de défi au lieu du contenu réel

Quand utiliser cette recette : les SPA hébergées sur Vercel/Netlify derrière le WAF Vercel (iqair.com, de nombreux sites marketing rendus avec React), les boutiques protégées par Cloudflare pendant les périodes de mode d'attaque, les sites de vente au détail à fort trafic protégés par Akamai.

Conseils applicables aux sept recettes

  • Commencez par foura_single. C'est l'outil le plus rapide (200 ms à 2 s) et il fonctionne pour la majorité des sites publics. Passez à foura_proxy en cas de 403/captcha, et à foura_browser en cas de contenu JavaScript manquant.
  • unblocker:true est peu coûteux. Il ajoute des headers de navigateur réalistes au niveau du réseau ; les sites qui bloquent sur la base du User-Agent ou de la détection de l'accept-encoding laisseront passer votre request.
  • Les règles de validation évitent les tentatives inutiles. Définissez validate.data.fail:["captcha", "blocked"] pour qu'une response manifestement bloquée soit considérée comme un échec et déclenche une escalade de tentative/proxy, plutôt que d'être analysée comme un succès.
  • Les corps volumineux sont inline par défaut (v0.2.0+). Passez offload_large: true dans n'importe quel appel d'outil pour basculer vers resource_link + resources/read afin d'économiser des tokens sur les grandes pages (utile uniquement dans les clients qui prennent en charge resources/read, ce que Claude Desktop ne fait pas actuellement).

Vous voulez une recette qui n'est pas ici ?

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

Mis à jour : 1 juillet 2026