Aller au contenu principal

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.

Token personnel, pas clé d'organisation

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

  1. Un Personal Access Token au format ra_… — voir Tokens d'accès.
  2. Node.js ≥ 20 — requis par le pont mcp-remote qu'utilisent les applications graphiques (Claude Desktop).
  3. 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.

Pourquoi un fichier de configuration ?

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).

  1. Ouvrez Settings › Developer › Edit Config.
  2. 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"
}
}
}
}
Le token va dans env, pas dans args

On 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.

  1. 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.

  1. Dans claude.ai : Paramètres › Connecteurs › Ajouter un connecteur personnalisé.
  2. Renseignez l'URL du serveur MCP : https://mcp.recrutauto.fr/sse.
  3. 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.
Compte requis

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).

Syntaxe obsolète

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 ServersAdd → type SSE :

ChampValeur
Namerecrutauto
URLhttps://mcp.recrutauto.fr/sse
HeaderAuthorization: Bearer ra_VOTRE_TOKEN

Outils disponibles

Le serveur MCP expose 18 outils et 5 prompts, regroupés par domaine.

Recherche

OutilDescription
search_candidatesRechercher 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_locationsAutocomplé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_companiesRechercher des entreprises par nom. Requiert l'authentification (catalogue global).

Candidats

OutilDescription
get_candidateProfil complet d'un candidat avec expériences, formations, compétences, et statut dans les campagnes.
get_messagesHistorique complet des messages LinkedIn avec un candidat.
get_conversationsConversations récentes (dernier message par candidat), triées par date.

Campagnes

OutilDescription
list_campaignsLister les campagnes avec le nombre de candidats et la répartition par étape du workflow. Filtre status optionnel.
list_projectsAlias B2B de list_campaigns (« Project » est le nom public B2B des campagnes). Mêmes filtres.
get_campaignDétails complets d'une campagne (filtres, tags, configuration, offre).
create_campaignCréer une nouvelle campagne (statut draft par défaut — jamais d'exécution n8n automatique).
update_campaignModifier les paramètres d'une campagne existante (merge partiel).

Pipeline

OutilDescription
get_campaign_candidatesCandidats d'une campagne avec statut workflow, score et notes. Paginé.
get_pipeline_statsStatistiques : taux de connexion, de réponse, de conversion, répartition par étape.
add_candidateAjouter un candidat à une campagne par son URL LinkedIn (unicité par abonnement).
update_candidate_notesMettre à jour les notes et tags d'un candidat dans une campagne.
evaluate_candidatesLancer 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

OutilDescription
list_message_templatesLister les templates de messages d'une campagne.
update_message_templateModifier le contenu ou la clé d'un template (syntaxe Jinja2).
Règles importantes
  • 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_id
  • message_typereconnect (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 mode preview=True sur evaluate_candidates émet un événement distinct.
  • Révocation instantanéerévoquer un token coupe immédiatement l'accès du client MCP correspondant. Un flux GET /sse dé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 disponibleevaluate_candidates(preview=True) renvoie la projection sans persister aucune modification.

Troubleshooting

SymptômeCause probableRemède
error: unknown option '--url'Syntaxe CLI obsolèteL'URL est un argument positionnel : claude mcp add <name> --transport sse <URL> --header "..."
HTTP 401 invalid or expired tokenToken révoqué, expiré ou mal colléRegénérer via console.recrutauto.fr → Mon Compte → Tokens d'accès
HTTP 401 missing Bearer tokenEn-tête mal formatéVérifier la casse de Bearer et l'espace unique après
Timeout ou HTTP 000 sur curlDNS ou firewall sortant bloquéVérifier votre résolution DNS et un éventuel proxy d'entreprise
HTTP 502 / 503Service momentanément indisponibleRéessayez dans quelques instants ; si ça persiste, contactez le support
claude mcp list ne montre pas recrutautoMauvais scope ou config non rechargéeclaude mcp list --scope user / --scope project ; relancer Claude Code
Outils répondent mais tout est videPérimètre sans donnéesVérifiez que vous utilisez le bon token (Mon Compte → Tokens d'accès)
Claude ne propose pas les outils MCPPermissions pas accordéesAutorisez le serveur recrutauto ou redémarrez la session
Token leaké dans une conversationIncident 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