Serveur MCP RecrutAuto
Le Model Context Protocol (MCP) est un standard ouvert qui permet aux assistants IA comme Claude d'accéder à vos outils et données en toute sécurité. Recrut'Auto expose un serveur MCP qui donne à votre assistant IA l'accès à vos campagnes, candidats, messages et templates.
En pratique : vous parlez en langage naturel à Claude, et il exécute les actions dans Recrut'Auto pour vous.
Pourquoi utiliser le MCP ?
- Rapidité — « Liste les candidats qui ont répondu cette semaine sur la campagne Dev Python » plutôt que filtrer dans l'UI.
- Analyse — Claude peut croiser plusieurs campagnes, identifier des patterns, proposer des priorités.
- Rédaction — génération de messages de relance personnalisés à partir du profil candidat.
- Création rapide — créez une campagne en décrivant votre besoin en une phrase.
Quel token utiliser ?
Le serveur MCP s'authentifie avec un Personal Access Token (ra_…) généré depuis Tokens d'accès. Claude agit alors en votre nom : il voit exactement les mêmes campagnes, candidats et messages que vous, avec vos permissions.
Les clés d'API d'organisation (ra_live_…, créées dans Organisation › Développeurs) sont destinées aux intégrations serveur-à-serveur (CI/CD, synchronisation ATS, SCIM) via l'API REST. Elles ne sont pas acceptées par le serveur MCP, qui exige d'agir au nom d'un membre identifié. Pour Claude, utilisez toujours un token personnel.
Endpoint
| Endpoint SSE (environnement actuel) | https://mcp.recrutauto.fr/sse |
Toutes les requêtes exigent l'en-tête Authorization: Bearer ra_<token>. Une requête sans token valide reçoit un 401.
Prérequis
- Un Personal Access Token au format
ra_…— voir Tokens d'accès. - Node.js ≥ 20 — requis par le pont
mcp-remotequ'utilisent les applications graphiques (Claude Desktop). - L'un des clients suivants : Claude Desktop, Claude Code (CLI), Cursor ou VS Code (extension Claude).
Configuration par client
Claude Desktop (Mac / Windows)
C'est le moyen le plus simple d'utiliser RecrutAuto avec Claude dans une application graphique.
Le bouton Settings › Connectors › Add custom connector de Claude Desktop n'accepte qu'une URL (ou un connecteur OAuth) : il ne permet pas de fournir un en-tête Authorization statique. Pour un serveur protégé par token Bearer comme RecrutAuto, on passe donc par le fichier de configuration et le pont mcp-remote (qui nécessite Node.js ≥ 20).
- Ouvrez Settings › Developer › Edit Config.
- Ajoutez le serveur dans
claude_desktop_config.json:
{
"mcpServers": {
"recrutauto": {
"command": "npx",
"args": [
"-y",
"mcp-remote",
"https://mcp.recrutauto.fr/sse",
"--header",
"Authorization:${RECRUTAUTO_MCP_TOKEN}"
],
"env": {
"RECRUTAUTO_MCP_TOKEN": "Bearer ra_VOTRE_TOKEN"
}
}
}
}
env, pas dans argsOn place « Bearer ra_… » dans la variable d'environnement et Authorization:${RECRUTAUTO_MCP_TOKEN} dans args. Cela contourne un bug connu de Claude Desktop / Cursor (notamment sous Windows) où l'espace de « Bearer ra_… » est mal échappé lorsqu'il est écrit directement dans args.
- Quittez complètement Claude Desktop (menu → Quit, pas seulement Cmd/Ctrl+W) puis relancez-le. Les outils RecrutAuto apparaissent dans le sélecteur d'outils.
claude.ai (application web)
claude.ai prend en charge RecrutAuto comme connecteur personnalisé via OAuth 2.0 — aucun token à coller : vous vous authentifiez avec votre compte RecrutAuto habituel.
- Dans claude.ai : Paramètres › Connecteurs › Ajouter un connecteur personnalisé.
- Renseignez l'URL du serveur MCP :
https://mcp.recrutauto.fr/sse. - Validez : claude.ai vous redirige vers la page de connexion RecrutAuto (Keycloak). Connectez-vous et autorisez l'accès. Les outils RecrutAuto apparaissent alors dans claude.ai.
Vous devez déjà avoir un compte RecrutAuto — connectez-vous au moins une fois sur console.recrutauto.fr avant. L'autorisation OAuth agit en votre nom, avec exactement vos permissions (comme un token personnel). Aucune clé d'organisation n'est utilisée ici.
Claude Code (CLI)
L'URL est un argument positionnel (Claude Code ≥ 2.1), pas un flag --url :
claude mcp add recrutauto \
--transport sse \
https://mcp.recrutauto.fr/sse \
--header "Authorization: Bearer ra_VOTRE_TOKEN" \
--scope user
Le flag --scope user écrit la config dans ~/.claude.json → disponible dans tous vos projets. Les autres valeurs sont project (commit dans ./.claude/settings.json — à éviter pour un token) et local (par défaut, limité au répertoire courant).
Vérification :
claude mcp list
# → recrutauto: https://mcp.recrutauto.fr/sse (SSE) - ✓ Connected
Dans une session Claude Code, les outils apparaissent sous mcp__recrutauto__* (ex : mcp__recrutauto__list_campaigns).
Les anciennes versions de la doc mentionnaient --url <URL> — c'est incorrect. La CLI renvoie error: unknown option '--url'. Utilisez l'URL en argument positionnel.
Cursor / VS Code (extension Claude)
Settings → MCP Servers → Add → type SSE :
| Champ | Valeur |
|---|---|
| Name | recrutauto |
| URL | https://mcp.recrutauto.fr/sse |
| Header | Authorization: Bearer ra_VOTRE_TOKEN |
Outils disponibles
Le serveur MCP expose 18 outils et 5 prompts, regroupés par domaine.
Recherche
| Outil | Description |
|---|---|
search_candidates | Rechercher des candidats dans tout le vivier enrichi (base de sourcing globale, comme à la création d'une campagne). Filtres structurés : skills (résolues en IDs canoniques ; require_all_skills pour « ET »), location/geo_urn, seniority_min/max (séniorité totale ; seuil explicite = filtre dur), et filtres d'intention company, past_company, excluded_company, industry, languages, school, contract_types, keywords_title, has_email/has_phone, query (pertinence). interpret_only=true = dry-run : renvoie seulement interpreted (filtres résolus, dont skill_ids/skills_unmatched), total et facets (top compétences/lieux) — pour faire valider l'interprétation avant la vraie recherche. Réponse : {results, total, facets, interpreted}. |
suggest_locations | Autocomplétion de lieux (annuaire géo global) → options typées {geo_urn, name, type: city/region/country}. Sert à lever l'ambiguïté ville/département/région avant search_candidates (passer le geo_urn choisi). |
search_companies | Rechercher des entreprises par nom. Requiert l'authentification (catalogue global). |
Candidats
| Outil | Description |
|---|---|
get_candidate | Profil complet d'un candidat avec expériences, formations, compétences, et statut dans les campagnes. |
get_messages | Historique complet des messages LinkedIn avec un candidat. |
get_conversations | Conversations récentes (dernier message par candidat), triées par date. |
Campagnes
| Outil | Description |
|---|---|
list_campaigns | Lister les campagnes avec le nombre de candidats et la répartition par étape du workflow. Filtre status optionnel. |
list_projects | Alias B2B de list_campaigns (« Project » est le nom public B2B des campagnes). Mêmes filtres. |
get_campaign | Détails complets d'une campagne (filtres, tags, configuration, offre). |
create_campaign | Créer une nouvelle campagne (statut draft par défaut — jamais d'exécution n8n automatique). |
update_campaign | Modifier les paramètres d'une campagne existante (merge partiel). |
Pipeline
| Outil | Description |
|---|---|
get_campaign_candidates | Candidats d'une campagne avec statut workflow, score et notes. Paginé. |
get_pipeline_stats | Statistiques : taux de connexion, de réponse, de conversion, répartition par étape. |
add_candidate | Ajouter un candidat à une campagne par son URL LinkedIn (unicité par abonnement). |
update_candidate_notes | Mettre à jour les notes et tags d'un candidat dans une campagne. |
evaluate_candidates | Lancer l'évaluation et le scoring (11 filtres + score 0-10). Paramètre preview: bool — si true, calcule les changements projetés et les reverte sans persister. Utile pour visualiser l'impact avant d'appliquer. |
Templates
| Outil | Description |
|---|---|
list_message_templates | Lister les templates de messages d'une campagne. |
update_message_template | Modifier le contenu ou la clé d'un template (syntaxe Jinja2). |
- Les campagnes créées via MCP sont en statut draft : activez-les manuellement depuis l'interface pour lancer l'exécution n8n.
- Un candidat ne peut être que dans une seule campagne par abonnement.
- Chaque écriture émet un événement d'audit structuré (
recrutauto.mcp.audit.*) avec l'outil invoqué et les champs modifiés. - Les templates utilisent Jinja2 avec les variables :
{{candidate.firstname}},{{candidate.lastname}},{{candidate.title}},{{candidate.company}},{{recruiter.firstname}},{{offer.title}},{{booking_url}},{{politeness}},{{period}}.
Prompts pré-configurés
5 prompts MCP prêts à l'emploi — invoquez-les via / dans Claude Desktop ou Cursor, ou demandez-les explicitement dans Claude Code.
find_candidates
Recherche de candidats dans le vivier à partir d'une demande en langage naturel, en clarifiant les ambiguïtés avant de chercher : séniorité vague (« expérimenté » → demande le seuil en années, en précisant qu'on ne filtre que la séniorité totale, pas les années sur une compétence), lieu ambigu (Paris ville/département/région → suggest_locations puis geo_urn). Chaîne suggest_locations + search_candidates.
Paramètre : request (la demande en langage naturel).
campaign_summary
Résumé complet d'une campagne avec stats et candidats clés. Chaîne get_campaign + get_pipeline_stats + get_campaign_candidates.
Paramètre : campaign_id
candidate_profile
Analyse du profil complet d'un candidat et de son historique d'interactions. Chaîne get_candidate + get_messages.
Paramètre : candidate_id
pipeline_review
Revue globale de toutes les campagnes actives et identification des actions prioritaires. Chaîne list_campaigns + get_pipeline_stats pour chaque.
Aucun paramètre.
draft_message
Rédaction d'un message personnalisé pour un candidat. Chaîne get_candidate + get_messages + rédaction contextuelle.
Paramètres :
candidate_idmessage_type—reconnect(relance),hunt(première approche),meet(proposition RDV),not_interested(réponse polie à un refus).
Exemples de conversation
Vous : « Liste mes 3 dernières campagnes actives et donne-moi leurs taux de réponse »
Claude appelle list_campaigns(status="en cours") puis get_pipeline_stats(campaign_id=X) pour chaque.
Vous : « Crée une campagne Dev Go Senior, 5 à 10 ans d'expérience, sur Paris ou Remote, avec tutoiement »
Claude appelle :
create_campaign(
name="Dev Go Senior",
tags="Go,Backend,Senior",
experience_min=5,
experience_max=10,
locations="Paris,Remote",
politeness="cool"
)
Vous : « Simule le scoring de la campagne 42 sans rien modifier pour voir l'impact »
Claude appelle evaluate_candidates(campaign_id=42, preview=True) — retourne un diff before/after par candidat sans toucher la base.
Vous : « Pour le candidat 42, rédige un message de relance qui fait référence à son expérience chez Datadog »
Claude appelle get_candidate(42) puis get_messages(42), puis rédige un message personnalisé.
Validation rapide
Après configuration, deux tests pour confirmer que tout marche :
1. Connectivité réseau (doit renvoyer 401 avec un JSON d'erreur propre)
curl -s -o - -w "\nHTTP %{http_code}\n" https://mcp.recrutauto.fr/sse
# → {"error":"unauthorized","detail":"missing Bearer token"}
# HTTP 401
2. Authentification (stream SSE ouvert, Ctrl+C pour couper)
curl -N -H "Authorization: Bearer ra_VOTRE_TOKEN" https://mcp.recrutauto.fr/sse
# → event: endpoint
# data: /messages/?session_id=...
Si vous voyez event: endpoint, votre token est valide et le stream est ouvert. Depuis Claude Code, claude mcp list doit afficher recrutauto … ✓ Connected.
Sécurité
Modèle d'authentification
Le serveur expose le protocole MCP sur un transport SSE (Server-Sent Events). Chaque requête entrante doit porter un en-tête Authorization: Bearer ra_… ; le token est validé à chaque appel (hash SHA-256, vérification d'expiration et d'état actif). Toute requête sans token valide est rejetée par un HTTP 401 avant d'atteindre le moteur MCP. Il n'existe aucun mode « sans authentification » : l'instance est strictement multi-locataire.
Garanties
- Isolation par périmètre — votre token n'accède qu'à vos campagnes, candidats et messages. Chaque service filtre explicitement sur votre périmètre : impossible d'accéder aux données d'un autre locataire, même en forgeant l'identifiant d'un objet.
- Audit trail — chaque écriture (création/modification de campagne, ajout/mise à jour de candidat, évaluation, mise à jour de template) émet un événement structuré sous le logger
recrutauto.mcp.audit. Le modepreview=Truesurevaluate_candidatesémet un événement distinct. - Révocation instantanée — révoquer un token coupe immédiatement l'accès du client MCP correspondant. Un flux
GET /ssedéjà ouvert reste connecté mais ne peut plus invoquer d'outils. - Rate-limit — les appels sont plafonnés à 30 req/s par IP au niveau de l'ingress.
- Chiffrement en transit — TLS sur tous les endpoints publics.
- Dry-run disponible —
evaluate_candidates(preview=True)renvoie la projection sans persister aucune modification.
Troubleshooting
| Symptôme | Cause probable | Remède |
|---|---|---|
error: unknown option '--url' | Syntaxe CLI obsolète | L'URL est un argument positionnel : claude mcp add <name> --transport sse <URL> --header "..." |
HTTP 401 invalid or expired token | Token révoqué, expiré ou mal collé | Regénérer via console.recrutauto.fr → Mon Compte → Tokens d'accès |
HTTP 401 missing Bearer token | En-tête mal formaté | Vérifier la casse de Bearer et l'espace unique après |
Timeout ou HTTP 000 sur curl | DNS ou firewall sortant bloqué | Vérifier votre résolution DNS et un éventuel proxy d'entreprise |
HTTP 502 / 503 | Service momentanément indisponible | Réessayez dans quelques instants ; si ça persiste, contactez le support |
claude mcp list ne montre pas recrutauto | Mauvais scope ou config non rechargée | claude mcp list --scope user / --scope project ; relancer Claude Code |
| Outils répondent mais tout est vide | Périmètre sans données | Vérifiez que vous utilisez le bon token (Mon Compte → Tokens d'accès) |
| Claude ne propose pas les outils MCP | Permissions pas accordées | Autorisez le serveur recrutauto ou redémarrez la session |
| Token leaké dans une conversation | Incident sécurité | Révoquez immédiatement (Mon Compte → Tokens → corbeille) et régénérez |
Commandes de diagnostic
# Version CLI Claude Code
claude --version
# Config effective (tous scopes)
claude mcp list
# Supprimer une entrée problématique
claude mcp remove recrutauto --scope user
# Tester la connectivité brute (401 attendu sans token)
curl -i https://mcp.recrutauto.fr/sse
# Tester avec token
curl -N -H "Authorization: Bearer ra_VOTRE_TOKEN" https://mcp.recrutauto.fr/sse
Ressources externes
- Spécification MCP — le standard ouvert.
- Anthropic MCP documentation — guide officiel côté client.
mcp-remote— bridge stdio ↔ SSE/HTTP pour Claude Desktop.