Ajouter la recherche web à Claude Code, Cursor et Codex avec un seul serveur MCP

Un seul serveur MCP distant donne 15 outils à un agent de code : recherche web, scraping de pages en markdown, cartes, Amazon, transcriptions YouTube. Configuration testée pour trois clients.

Un agent de code qui ne peut pas lire le web devine les versions des bibliothèques et invente des flags d’API. La solution n’est pas un outil sur mesure par projet : c’est un serveur MCP distant, ajouté une fois par client, que l’agent peut appeler pour chercher et pour lire des pages.

FastAF en fait tourner un sur https://api.fastaf.co/mcp (Streamable HTTP, sans état, spec 2026-07-28), authentifié avec la même clé Bearer que l’API REST. Vous trouverez ci-dessous la configuration pour trois clients, le protocole brut et le coût d’une session. Tous les appels ont été faits le 19 octobre 2026.

Qu’est-ce que l’agent obtient du serveur ?

tools/list renvoie 15 outils : scrape_page, search_web, search_places, search_amazon, search_news, search_shopping, get_trends, search_scholar, search_jobs, ask_google_ai, search_walmart, search_x, search_youtube, youtube_transcript, get_linkedin_profile. Chacun est marqué readOnlyHint: true et possède un schéma d’entrée strict avec une description pour chaque paramètre, si bien que le modèle sait ce qu’il peut passer.

Les coûts sont ceux de l’API REST : search_web coûte 5 crédits, scrape_page 1 (5 avec render_js: true), search_amazon et youtube_transcript 1, get_linkedin_profile 60. La liste complète se trouve sur les pages des API et dans la documentation MCP.

Placez d’abord la clé dans une variable d’environnement, pour qu’elle ne se retrouve jamais dans un fichier de configuration que vous pourriez commiter :

export FASTAF_API_KEY="..."   # dans ~/.zshrc ou ~/.bashrc

Comment l’ajouter à Claude Code ?

D’après la documentation MCP de Claude Code (code.claude.com/docs/en/mcp, consultée le 19 octobre 2026), les serveurs distants utilisent --transport http et un en-tête :

claude mcp add --transport http fastaf https://api.fastaf.co/mcp \
  --header "Authorization: Bearer $FASTAF_API_KEY"

C’est votre shell qui développe la variable, donc la clé finit stockée dans ~/.claude.json. Pour partager le serveur avec une équipe, utilisez un .mcp.json de projet : Claude Code développe ${VAR} à l’intérieur de headers, et le fichier ne contient donc aucun secret.

{
  "mcpServers": {
    "fastaf": {
      "type": "http",
      "url": "https://api.fastaf.co/mcp",
      "headers": { "Authorization": "Bearer ${FASTAF_API_KEY}" }
    }
  }
}

claude mcp list indique si la connexion a réussi. Nous avons utilisé exactement ce fichier avec Claude Code 2.1.197 en mode headless ; le modèle a bien reçu le JSON de l’outil (text, truncated, total_chars, credits_used, credits_remaining).

Comment l’ajouter à Cursor ?

La documentation de Cursor (cursor.com/docs/context/mcp, consultée le 19 octobre 2026) indique qu’il lit ~/.cursor/mcp.json au niveau global ou .cursor/mcp.json par projet, et qu’il résout ${env:NAME} dans url et headers :

{
  "mcpServers": {
    "fastaf": {
      "url": "https://api.fastaf.co/mcp",
      "headers": { "Authorization": "Bearer ${env:FASTAF_API_KEY}" }
    }
  }
}

Nous n’avons pas lancé Cursor pour cet article ; la configuration suit sa documentation.

Comment l’ajouter à Codex CLI ?

La documentation MCP de Codex (developers.openai.com/codex/mcp, consultée le 19 octobre 2026) utilise bearer_token_env_var, qui nomme la variable au lieu de contenir le token. Dans ~/.codex/config.toml :

[mcp_servers.fastaf]
url = "https://api.fastaf.co/mcp"
bearer_token_env_var = "FASTAF_API_KEY"

Ou bien codex mcp add fastaf --url https://api.fastaf.co/mcp --bearer-token-env-var FASTAF_API_KEY (flag présent dans codex-cli 0.159.2). codex mcp list, ou /mcp dans la TUI, l’affiche. Une exécution codex exec avec cette configuration a appelé search_web et renvoyé trois résultats pour 5 crédits.

À quoi ressemble un appel MCP brut ?

La spec 2026-07-28 est sans état : il n’y a pas de handshake, et initialize renvoie -32601 Method not found. Chaque requête porte la version dans un en-tête et dans _meta, plus un en-tête Mcp-Method (sans lui, le serveur répond -32020, en-têtes et corps en désaccord) :

curl -s https://api.fastaf.co/mcp \
  -H "Authorization: Bearer $FASTAF_API_KEY" \
  -H "Content-Type: application/json" \
  -H "MCP-Protocol-Version: 2026-07-28" \
  -H "Mcp-Method: tools/call" -H "Mcp-Name: search_web" \
  -d '{"jsonrpc":"2.0","id":1,"method":"tools/call","params":{
       "name":"search_web","arguments":{"query":"python 3.14 free-threaded","results":3},
       "_meta":{"io.modelcontextprotocol/protocolVersion":"2026-07-28",
                "io.modelcontextprotocol/clientCapabilities":{}}}}'

Sortie réelle, abrégée :

{"results":[
  {"title":"Python support for free threading ...",
   "url":"https://docs.python.org/3/howto/free-threading-python.html","position":1},
  {"title":"Python Free-Threading Guide","url":"https://py-free-threading.github.io/","position":3}],
 "credits_used":5,"credits_remaining":937}

Le même appel avec scrape_page sur cette URL et max_chars: 4000 a renvoyé "truncated":true,"total_chars":20229,"credits_used":1.

Pourquoi du markdown plafonné plutôt que du HTML brut ?

Le contexte est le vrai budget. La page « What’s new » de Python 3.14 pèse 554 786 octets de HTML récupérés avec curl. scrape_page l’a transformée en 266 828 caractères de markdown et a renvoyé les 12 000 premiers (la valeur par défaut de max_chars, réglable de 1 000 à 30 000), en 1,3 seconde pour 1 crédit. Le guide free-threading, plus petit, est passé de 41 838 octets de HTML à 20 229 caractères.

À environ quatre caractères par token, 12 000 caractères représentent à peu près 3 000 tokens. La documentation de Claude Code indique qu’il avertit au-delà de 10 000 tokens de sortie d’outil et plafonne à 25 000 par défaut : du HTML brut serait coupé ou enregistré dans un fichier avant que le modèle n’y voie quoi que ce soit d’utile. truncated et total_chars signalent à l’agent qu’il y a davantage, pour qu’il puisse redemander avec un plafond plus élevé.

Les résultats de recherche sont tout aussi compacts : titre, url, snippet et position, rien d’autre.

Combien coûte une session de code ?

Une session de recherche intensive de 10 recherches et 10 lectures de pages coûte 10 x 5 + 10 x 1 = 60 crédits. Les 500 crédits gratuits en couvrent huit ; le pack prépayé Starter à 10 $ (20 000 crédits) en couvre 333, environ 3 centimes chacune. Voir les tarifs.

Le plafond strict, c’est le solde du compte. Chaque résultat indique credits_remaining, et à zéro les outils cessent de facturer et renvoient une erreur. Utilisez une clé par machine pour pouvoir révoquer seule la clé d’un portable perdu, mais le solde est partagé par toutes les clés du compte : il n’y a pas de budget par clé. L’article sur le plafond de dépense traite des limites par exécution.

Qu’est-ce qui peut mal tourner, et comment y remédier ?

  • HTTP 401, -32001 Authentication required : l’en-tête manque ou la variable est vide dans l’environnement du client. Les applications graphiques ne lisent souvent pas votre profil shell.
  • Plus de crédits (402 en REST) : l’outil renvoie INSUFFICIENT_CREDITS avec credits_used: 0. Rechargez ; rien n’a été facturé.
  • Trop d’appels à la fois (429 en REST) : les résultats d’outil reviennent en RATE_LIMITED quand l’agent lance plus d’appels parallèles que la concurrence de votre pack (1 en Free, 5 en Starter). Notre exécution Codex l’a rencontré deux fois avant de réussir. Une rafale sur l’endpoint lui-même renvoie HTTP 429 avec Retry-After: 10.

En bref

Exportez FASTAF_API_KEY, ajoutez https://api.fastaf.co/mcp avec un en-tête Bearer dans Claude Code, Cursor ou Codex, et l’agent dispose de la recherche, de la lecture de pages en markdown plafonné et de 13 autres outils, avec le solde comme plafond. Obtenez une clé avec 500 crédits gratuits.