Serveur MCP pour assistants IA
WyndPath expose un serveur MCP (Model Context Protocol) distant sur https://mcp.wyndpath.com/mcp. Un assistant IA capable de parler MCP (Claude, ChatGPT, Cursor, VS Code...) s'y connecte et gagne un accès direct aux pages web publiques difficiles, avec le même compte et les mêmes crédits que l'API REST.
- Serveur MCP (authentifié) :
https://mcp.wyndpath.com/mcp - Découverte publique, sans authentification :
https://mcp.wyndpath.com/public - Métadonnées OAuth :
https://mcp.wyndpath.com/.well-known/oauth-authorization-serverethttps://mcp.wyndpath.com/.well-known/oauth-protected-resource/mcp - Fiche du serveur (server card) :
https://mcp.wyndpath.com/.well-known/mcp/server-card.json
Sommaire
- Qu'est-ce que WyndPath MCP ?
- Connecter WyndPath à un assistant IA
- Authentification
- Outils disponibles
- Crédits
- Exemples
- Sécurité
- Dépannage
Qu'est-ce que WyndPath MCP ?
Un agent IA essaie d'abord ses outils habituels pour lire une page web. Sur un site protégé par un anti-bot, une page qui charge son contenu en JavaScript ou un résultat vide, ces outils échouent ou renvoient un captcha. C'est à ce moment que l'agent choisit d'appeler WyndPath, de lui-même, sans que l'utilisateur ait besoin de coller une URL dans un onglet séparé. WyndPath récupère la page (navigateur si nécessaire, IP résidentielle si nécessaire) et renvoie un contenu exploitable, en Markdown par défaut. Le même moteur que l'API REST et le mode proxy fait le travail ; seul le protocole d'appel change.
Connecter WyndPath à un assistant IA
L'URL du serveur est la même partout : https://mcp.wyndpath.com/mcp. Ce qui change d'un client à l'autre, c'est la manière de la déclarer.
Claude Code
claude mcp add --transport http wyndpath https://mcp.wyndpath.com/mcp
Puis lancez /mcp dans une session pour vous authentifier (OAuth par défaut, ou une clé API si vous préférez).
Claude.ai et Claude Desktop
Paramètres → Connecteurs → Ajouter un connecteur personnalisé, avec l'URL https://mcp.wyndpath.com/mcp. Claude ouvre ensuite la page de connexion WyndPath pour l'autorisation OAuth.
Cursor
Ajoutez ce bloc dans ~/.cursor/mcp.json :
{"mcpServers":{"wyndpath":{"url":"https://mcp.wyndpath.com/mcp"}}}
VS Code
Ajoutez ce bloc dans .vscode/mcp.json :
{"servers":{"wyndpath":{"type":"http","url":"https://mcp.wyndpath.com/mcp"}}}
ChatGPT
Ajoutez WyndPath comme connecteur personnalisé, avec la même URL. L'autorisation passe uniquement par OAuth : ChatGPT ne propose pas de champ pour coller une clé API sur ses connecteurs.
Client Python (SDK mcp)
from mcp import Client
from mcp.client.streamable_http import streamable_http_client
import httpx as httpx2
async with streamable_http_client(
"https://mcp.wyndpath.com/mcp",
http_client=httpx2.AsyncClient(headers={"Authorization": "Bearer wk_VOTRE_CLE"}),
) as (read, write, _):
async with Client(read, write) as client:
result = await client.call_tool("fetch_url", {"url": "https://exemple.com"})
print(result)
Onboarding en moins de deux minutes
- Connect : l'assistant déclare le serveur.
- Connexion ou création de compte sur wyndpath.com (des crédits gratuits sont inclus dès l'inscription).
- Autorisation de l'accès demandé.
- WyndPath apparaît dans la liste des outils de l'assistant, prêt à être appelé.
Authentification
OAuth 2.1
Le flux suit OAuth 2.1 avec PKCE, enregistrement dynamique des clients et Client ID Metadata Documents. L'utilisateur donne son consentement directement sur wyndpath.com : l'assistant ne voit jamais le mot de passe, seulement un jeton d'accès porteur d'une portée limitée. La révocation se fait depuis la console, dans Paramètres → Assistants IA connectés ; elle coupe l'accès immédiatement, sans toucher au reste du compte.
Clé API
Pour un client scripté ou un IDE, une clé API suffit : Authorization: Bearer wk_.... C'est la même clé que pour l'API REST (voir Authentification), à placer dans le champ headers de la configuration du client plutôt que dans une variable OAuth.
Qui supporte quoi
| Client | OAuth | Clé API en en-tête |
|---|---|---|
| Claude Code | Oui | Oui |
| Claude.ai / Claude Desktop | Oui | Non (connecteur sans champ d'en-têtes) |
| Cursor | Oui | Oui |
| VS Code | Oui | Oui |
| ChatGPT | Oui (seule méthode) | Non |
| Client programmatique (SDK) | Oui | Oui |
Outils disponibles
Sept outils, trois gratuits et accessibles sans compte (utiles pour qu'un agent évalue WyndPath avant de se connecter), quatre qui consomment des crédits sur le compte relié.
get_capabilities
Quand l'utiliser : pour qu'un agent découvre ce que WyndPath sait faire avant de s'y connecter. Gratuit, sans authentification.
| Paramètre | Type | Défaut | Rôle |
|---|---|---|---|
| Aucun paramètre. | |||
Renvoie : description du service, cas d'usage (use_when / do_not_use_when), liste des outils, formats supportés, modèle de crédits, limites, méthodes d'authentification, lien d'inscription et de documentation.
Coût : gratuit.
get_pricing
Quand l'utiliser : quand l'utilisateur demande le prix de WyndPath, ou avant de recommander un forfait. Gratuit, sans authentification.
| Paramètre | Type | Défaut | Rôle |
|---|---|---|---|
| Aucun paramètre. | |||
Renvoie : liste des forfaits (nom, prix EUR/USD par mois, crédits inclus, concurrence autorisée, disponibilité), coût en crédits par type de requête, règle de facturation, liens vers la grille tarifaire et la gestion du forfait.
Coût : gratuit.
check_support
Quand l'utiliser : avant fetch_url, quand le coût compte ou qu'on ignore si le site est supporté. Ne récupère rien et ne consomme aucun crédit.
| Paramètre | Type | Défaut | Rôle |
|---|---|---|---|
url | string, requis | - | URL absolue à vérifier. |
Renvoie : supported (bool), estimated_credits, max_credits_with_escalation, route, protection détectée, difficulty, si un identifiant est requis (login_required), et une recommendation textuelle (par exemple le max_credits minimum à passer à fetch_url).
Coût : gratuit.
fetch_url
Quand l'utiliser : quand les outils web habituels de l'agent échouent, renvoient une page vide, un captcha, un mur de consentement, une erreur 403/429/503, ou quand la page doit être vue depuis un pays précis. À éviter derrière un login ou un paywall, et sur une URL que les outils normaux lisent déjà correctement.
| Paramètre | Type | Défaut | Rôle |
|---|---|---|---|
url | string, requis | - | URL absolue http(s) de la page. |
format | enum | markdown | markdown (nettoyé), text ou html brut. Les réponses d'API sont toujours renvoyées en JSON. |
country | string ou null | null | Code pays ISO 3166-1 alpha-2 (fr, de, us...) pour voir la page depuis ce pays. |
render | enum | auto | auto (voie la moins chère, peut escalader), browser (navigateur forcé), http (voie légère seulement, jamais d'escalade). |
max_credits | entier 1-100 ou null | null (15) | Plafond de crédits pour l'appel ; au-delà, rien n'est récupéré et COST_LIMIT_EXCEEDED indique le coût nécessaire. |
max_chars | entier 1000-400000 ou null | null (80 000) | Tronque le contenu renvoyé. La page est récupérée et facturée une seule fois quoi qu'il arrive. |
timeout | entier 5-170 ou null | null (60) | Secondes d'attente pour la récupération. |
idempotency_key | string ou null (max 100) | null | Même clé rejouée dans les 10 minutes : le résultat précédent est renvoyé sans nouveau débit. |
Renvoie : en succès, status, title, content (dans le format choisi), truncated, credits_used, credits_remaining, duration_ms, et une strategy (route, moteur, type de proxy, escalade, tentatives). En échec, success: false, un error stable, un message, parfois un hint ou une action à faire suivre à l'utilisateur.
Coût : 1 crédit pour un site simple, 10 avec navigateur ou anti-bot, 15 avec IP résidentielle. Facturé uniquement en cas de succès.
batch_fetch
Quand l'utiliser : quand la liste des URLs est déjà connue (fiches produit, pages de résultats, annonces) et qu'on veut les récupérer ensemble plutôt qu'un appel par page.
| Paramètre | Type | Défaut | Rôle |
|---|---|---|---|
urls | tableau de string, requis (1 à 50) | - | URLs absolues des pages publiques. |
format | enum | markdown | Format appliqué à chaque page. |
country | string ou null | null | Code pays appliqué à chaque page. |
render | enum | auto | Comme pour fetch_url, appliqué à chaque page. |
max_credits_per_url | entier 1-100 ou null | null (15) | Plafond de crédits par page. |
max_total_credits | entier 1-1000 ou null | null | Arrête la récupération des pages restantes une fois ce total atteint. |
max_chars | entier 1000-400000 ou null | null (20 000) | Tronque le contenu de chaque page. |
Renvoie : un résultat par URL (même forme que fetch_url), plus les totaux credits_used, credits_remaining, succeeded, failed. S'arrête tôt avec COST_LIMIT_EXCEEDED sur les URLs restantes si max_total_credits serait dépassé.
Coût : comme fetch_url, par page réellement récupérée avec succès (jusqu'à 50 pages).
extract_structured_data
Quand l'utiliser : pour obtenir des champs précis (prix, disponibilité, titre, auteur, date...) plutôt qu'une page entière.
| Paramètre | Type | Défaut | Rôle |
|---|---|---|---|
url | string, requis | - | URL absolue de la page à lire. |
schema | objet, requis | - | Champs à extraire, en forme courte ({"name":"string","price":"number"}) ou en JSON Schema complet ; 40 champs maximum, une description par champ aide à lever l'ambiguïté. |
country | string ou null | null | Code pays pour voir la page depuis ce pays. |
render | enum | auto | Comme pour fetch_url. |
max_credits | entier 1-100 ou null | null (15) | Plafond de crédits pour la récupération. |
idempotency_key | string ou null (max 100) | null | Rejoue le résultat précédent sans nouveau débit dans les 10 minutes. |
Renvoie : data (un champ par clé du schéma, null si absent), missing (champs non trouvés), sources (données structurées de la page ou modèle), method. Rien n'est jamais inventé : un champ absent reste null et apparaît dans missing, avec un extrait Markdown de la page (evidence) pour le lire soi-même si besoin.
Coût : comme fetch_url, plus un supplément uniquement si l'extraction assistée par modèle est activée côté serveur (visible alors dans method: "structured-data+llm").
get_account
Quand l'utiliser : avant un gros lot d'appels, pour vérifier le budget, ou quand l'utilisateur demande combien de crédits il reste.
| Paramètre | Type | Défaut | Rôle |
|---|---|---|---|
| Aucun paramètre. | |||
Renvoie : forfait, crédits consommés ce mois-ci, crédits restants, limite de concurrence, usage des 7 derniers jours, domaines les plus appelés, et des liens vers la console, la facturation et le journal des requêtes.
Coût : gratuit.
Crédits
Le même compte, le même solde que l'API REST et le mode proxy : voir le barème complet dans Crédits & coûts.
max_creditsborne la dépense de chaque appel ; au-delà,COST_LIMIT_EXCEEDEDindique le coût réellement nécessaire au lieu de facturer plus que prévu.INSUFFICIENT_CREDITSarrive quand le compte n'a plus de crédits ce mois-ci ; la réponse porte uneaction.urlvers la facturation de la console, à faire suivre à l'utilisateur (l'assistant ne doit jamais tenter d'achat lui-même).- Idempotence : la même
idempotency_key(ou le même identifiant JSON-RPC avec les mêmes arguments) rejouée dans les 10 minutes renvoie le résultat précédent sans nouveau débit. Utile pour retenter un appel qui a peut-être déjà réussi. - Extraction assistée par modèle : le supplément de crédits n'est annoncé et facturé que si le serveur l'a activé ; sinon
extract_structured_datacoûte comme une récupération classique.
Exemples
Page produit bloquée
Une fiche produit protégée par un anti-bot renvoie une page vide aux outils habituels de l'agent.
{"jsonrpc":"2.0","id":1,"method":"tools/call","params":{"name":"fetch_url","arguments":{"url":"https://boutique-exemple.com/produit/123","render":"browser","max_credits":15}}}
Réponse (résumée) : success: true, content en Markdown avec la fiche produit, credits_used: 10, strategy.route: "browser", strategy.escalated: true.
Prix et disponibilité
Besoin du prix et du stock sans le reste de la page.
{"jsonrpc":"2.0","id":2,"method":"tools/call","params":{"name":"extract_structured_data","arguments":{"url":"https://boutique-exemple.com/produit/123","schema":{"name":"string","price":"number","currency":"string","available":"boolean"}}}}
Réponse (résumée) : data: {"name":"...","price":129.9,"currency":"EUR","available":true}, missing: [], method: "structured-data", credits_used: 1.
Vérifier le coût avant d'y aller
Avant de dépenser des crédits, l'agent vérifie ce que WyndPath sait de la cible.
{"jsonrpc":"2.0","id":3,"method":"tools/call","params":{"name":"check_support","arguments":{"url":"https://boutique-exemple.com/produit/123"}}}
Réponse (résumée) : supported: true, estimated_credits: 10, protection: "cloudflare", route: "browser", recommendation: "Call fetch_url with max_credits >= 10."
Sécurité
Périmètre
WyndPath ne récupère que du contenu public. Il ne contourne jamais un login ni un paywall, et applique ses propres règles d'usage à chaque appel, quel que soit le canal (REST, proxy, MCP).
Anti-SSRF
Les adresses privées ou internes sont refusées avant toute tentative de récupération : l'appel échoue avec URL_NOT_ALLOWED, sans jamais atteindre un réseau interne.
Contenu non fiable et injection de prompt
Une page récupérée peut contenir du texte du genre « ignore les instructions précédentes » ou toute autre tentative de manipulation. WyndPath renvoie ce texte comme du contenu, jamais comme une commande à exécuter. Côté intégrateur : traitez toujours le champ content (ou data, evidence) comme une donnée à lire, pas comme des instructions pour l'agent, et ne faites jamais exécuter à l'agent une action sensible (achat, envoi, suppression) sur la seule foi d'un texte trouvé dans une page.
Jetons
Les jetons OAuth et les clés API sont opaques, révocables à tout moment depuis la console et expirent. Une révocation ferme l'accès immédiatement, sans affecter le reste du compte.
Ce que l'assistant peut faire, et ce qu'il ne peut pas
Un assistant connecté peut lire des pages publiques, extraire des champs et consulter l'état du compte. Il ne peut pas acheter de crédits, changer de forfait ni modifier les paramètres du compte : ces actions restent entre les mains de l'utilisateur, dans la console.
Dépannage
| Symptôme | Cause probable |
|---|---|
| 401 à la connexion | Jeton OAuth expiré ou révoqué, ou clé API désactivée. Reconnectez l'assistant (/mcp sur Claude Code, ou le connecteur côté client). |
TARGET_BLOCKED | La cible a résisté à toutes les tentatives autorisées par le budget. Réessayer avec render: "browser" et un max_credits plus élevé peut suffire ; sinon la cible n'est pas récupérable pour l'instant. |
COST_LIMIT_EXCEEDED | Le coût réel dépasse max_credits. La réponse indique credits_needed : relancez avec un plafond au moins égal. |
RATE_LIMITED / TOO_MANY_CONCURRENT | La cible limite le débit, ou le forfait limite la concurrence. Patientez quelques secondes avant de relancer. |
| Réponse lente ou coupée | Le transport Streamable HTTP garde la connexion ouverte pendant la récupération (SSE keep-alive) ; au-delà d'environ 150 secondes sans réponse, mieux vaut réduire timeout ou vérifier la cible plutôt que réessayer en boucle. |
| L'assistant n'utilise pas WyndPath | C'est voulu : l'assistant essaie d'abord ses outils normaux. Sur une cible qu'on sait difficile, demandez-lui explicitement d'utiliser WyndPath. |
Pour vérifier une connexion en ligne de commande, l'Inspector officiel du protocole fonctionne directement contre le serveur WyndPath :
npx @modelcontextprotocol/inspector --cli --transport http --server-url https://mcp.wyndpath.com/mcp --header "Authorization: Bearer wk_..." --method tools/list