Recettes MCP
Recettes MCP
Six prompts prêts à coller 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 (le choix par défaut intelligent) ou un ou plusieurs des outils de bas niveau foura_single, foura_proxy, foura_browser pour une tâche de scraping courante. Deux façons de les utiliser :
- Invoquez 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, remplissez les arguments, exécutez. Le serveur MCP retourne le flux de travail modélisé, le LLM l'exécute avec les bons outils. - Copiez le texte ci-dessous dans votre propre chat. Même effet, moins facile à découvrir.
Le serveur MCP les intègre comme prompts natifs : smart_fetch, 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 réponse reviennent en ligne dans
structuredContentquelle que soit leur taille (cela fonctionne dans tous les clients MCP, y compris Claude Desktop). Si vous utilisez un client qui supporte MCPresources/readET que vous souhaitez économiser des tokens sur les grandes pages, passezoffload_large: truedans l'appel d'outil. Les réponses >= 50 KB arrivent alors sous forme deresource_linkque votre client récupère à la demande. Les prompts intégrés ci-dessous supposent le comportement par défaut (en ligne).
Open source sur GitHub; sur npm en tant que @fouradata/mcp.
Récupération intelligente (auto) : commencez ici
La recette la plus simple : donnez une URL à foura_auto et laissez-le effectuer des tentatives limitées parmi les méthodes de requête disponibles. Utilisez-la chaque fois que vous voulez le contenu et que vous n'avez pas besoin de 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.
Quand cette recette est la bonne : 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 bloquée.
1. Scraper une page produit
Pour les pages de détails de produits e-commerce, y compris les sites single-page-app et les pages protégées par des défis anti-bot.
Intégré : scrape_product_page(url)
Invite manuelle :
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 cette recette est la bonne : 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'actualité, les articles de blog, la documentation technique, tout ce pour quoi vous souhaitez un texte de lecture propre sans bruit de navigation, de publicités et de pied de page.
Intégré : 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, 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 cette recette est adaptée : un synthétiseur de recherche, le flux RSS d'un seul site, une revue de presse quotidienne.
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 cette recette est la bonne : un agent d'alerte d'économies, un outil de surveillance des tarifs de voyage, un outil de suivi des prix des concurrents B2B.
4. Vérifier l'état de l'endpoint
Pour les sondes de disponibilité et la validation des endpoints d'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 smoke test de déploiement, un moniteur d'API tierce.
5. Récupérer une liste d'URL en parallèle
Pour les traitements par lots où vous souhaitez obtenir les métadonnées de plusieurs URL 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, 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 méthode : un balayage d'accessibilité de sitemap, un audit de liens morts, une vérification du type "lesquelles de ces 50 URLs de produits existent encore".
6. Choisir et réutiliser une sortie ciblée par pays
Utilisez ceci lorsque la cible doit voir la requête provenant d'un ensemble spécifique de pays, y compris les pages JavaScript où la sélection du proxy doit avoir lieu avant le rendu du navigateur.
Invite manuelle :
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 cette recette est la bonne : contenu régional, marchés sous licence, tarification géographique, ou tout workflow qui nécessite un pays vérifié visible par la cible et réutilise ensuite la sortie sélectionnée.
7. Page protégée : proxy d'abord, navigateur quand JavaScript est nécessaire
Utilisez une tentative de proxy limitée avec validation de contenu lorsqu'une requête directe renvoie une page de blocage. 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. Un fournisseur de protection visible ne garantit pas la réussite d'une méthode.
Prompt manuel :
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 cette recette est la bonne : 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 : modifiez le navigateur que vous présentez
Utilisez ceci lorsqu'une cible statique renvoie une page de blocage ou de défi et que JavaScript n'est pas le problème. La request présente le dernier Google Chrome par défaut ; certaines cibles acceptent un navigateur ou une plateforme différente.
Invite manuelle :
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 block 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 rendue côté serveur qui filtre selon le client qu'elle voit plutôt que selon l'adresse de sortie. Changer le navigateur présenté ne coûte rien de plus et vaut la peine d'être essayé avant la rotation de proxy.
Conseils applicables à tous
- Vous ne savez pas quel outil choisir ? Utilisez foura_auto. Il choisit la méthode et gère l'escalade pour vous. N'utilisez un outil spécifique que si vous souhaitez un contrôle explicite.
- Commencez avec
foura_singlelorsque le HTTP simple suffit. Passez àfoura_proxylorsque la request directe est bloquée et àfoura_browserlorsque le contenu souhaité nécessite JavaScript. - Les headers de request de type navigateur sont activés par défaut (
unblocker). Maintenez la validation de contenu en place pour qu'une page de blocage ne soit pas considérée comme un succès, et modifiez le navigateur présenté avecbrowser,osouversionlorsqu'une cible refuse le défaut. - Les règles de validation évitent les nouvelles tentatives. Définissez
validate.data.fail:["captcha", "blocked"]pour qu'une response manifestement bloquée soit comptée comme un échec et déclenche une nouvelle tentative ou une escalade de proxy, plutôt que d'être analysée comme un succès. - La portée par pays est stricte. Un résultat
no_eligible_proxyn'est pas une autorisation de réessayer sansexitCountries; conservez l'exigence ou demandez à l'utilisateur avant de la modifier. - Les corps de réponse volumineux sont inline par défaut (v0.2.0+). Transmettez
offload_large: truepour passer àresource_link+resources/readsur les clients qui prennent en charge ces capacités.
Vous cherchez une recette qui ne figure pas ici ?
Envoyez un e-mail à support@foura.ai avec votre cas d'utilisation. Le serveur MCP publie de nouveaux prompts à la même fréquence que les versions de l'API REST.