Model Context Protocol

WhyEva MCP Server

Permettez à vos agents IA d'interagir avec WhyEva — gérez les offres, questions et candidats depuis Claude, Cursor, VS Code Copilot et tout client MCP.

Aperçu #

Le serveur MCP WhyEva implémente le Model Context Protocol via Streamable HTTP. Il expose des outils pour les agents IA afin de lire et écrire des données dans votre compte WhyEva — sans écrire de code d'intégration.

Le serveur utilise le transport JSON-RPC 2.0 via un seul endpoint POST /mcp. L'authentification s'effectue via un token JWT Bearer standard.

📋
16 outils pour les offres
Créez, mettez à jour, publiez, analysez et gérez les offres d'emploi
6 outils pour les questions
Créez des ensembles de questions d'entretien et traitez les réponses
👤
7 outils pour les candidats
Examinez les candidats, les résumés, les vidéos et les retours

Endpoint #

Toutes les requêtes MCP sont envoyées à un seul endpoint :

POST https://my.whyeva.fr/mcp

Le serveur prend en charge uniquement la méthode POST. GET et DELETE retournent 405 Method Not Allowed.

Version du protocole : Le serveur annonce 2024-11-05 lors du handshake initialize et attribue un en-tête Mcp-Session-Id unique par session.

Authentification #

Le point de terminaison MCP nécessite un token JWT Bearer valide. Obtenez-en un via l'API WhyEva et transmettez-le avec chaque requête.

1

Obtenir un token

Connectez-vous à l'API WhyEva pour obtenir un token d'accès JWT :

HTTP
POST https://my.whyeva.fr/api/account/login
Content-Type: application/json

{
  "email": "user@example.com",
  "password": "your-password"
}

La réponse contient un champ accessToken.

2

Transmettre le token dans les en-têtes

Incluez le token en tant que Bearer dans l'en-tête Authorization :

HTTP
Authorization: Bearer <your-access-token>
Remarque : Les tokens ont une courte durée de vie. La plupart des clients MCP prennent en charge un token statique (voir Connexion rapide). Actualisez le token en cas d'erreur 401 Unauthorized.

Connexion rapide #

Ajoutez le serveur MCP WhyEva à votre client IA en collant la configuration ci-dessous. Remplacez par le token Bearer obtenu ci-dessus.

~/.cursor/mcp.json
{
  "mcpServers": {
    "whyeva": {
      "url": "https://my.whyeva.fr/mcp",
      "headers": {
        "Authorization": "Bearer <YOUR_TOKEN>"
      }
    }
  }
}
claude_desktop_config.json
{
  "mcpServers": {
    "whyeva": {
      "type": "http",
      "url": "https://my.whyeva.fr/mcp",
      "headers": {
        "Authorization": "Bearer <YOUR_TOKEN>"
      }
    }
  }
}

Emplacement du fichier : ~/Library/Application Support/Claude/claude_desktop_config.json (macOS) ou %APPDATA%\Claude\claude_desktop_config.json (Windows).

.vscode/mcp.json
{
  "servers": {
    "whyeva": {
      "type": "http",
      "url": "https://my.whyeva.fr/mcp",
      "headers": {
        "Authorization": "Bearer ${input:whyevaToken}"
      }
    }
  },
  "inputs": [
    {
      "id": "whyevaToken",
      "type": "promptString",
      "description": "WhyEva JWT Bearer Token",
      "password": true
    }
  ]
}

VS Code demandera le token à la première utilisation et le stockera de manière sécurisée.

~/.codeium/windsurf/mcp_config.json
{
  "mcpServers": {
    "whyeva": {
      "serverUrl": "https://my.whyeva.fr/mcp",
      "headers": {
        "Authorization": "Bearer <YOUR_TOKEN>"
      }
    }
  }
}
cURL – initialize
curl -X POST https://my.whyeva.fr/mcp \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer <YOUR_TOKEN>" \
  -d '{
    "jsonrpc": "2.0",
    "id": 1,
    "method": "initialize",
    "params": {
      "protocolVersion": "2024-11-05",
      "capabilities": {},
      "clientInfo": { "name": "my-agent", "version": "1.0" }
    }
  }'

Outils #

Le serveur expose 29 outils en trois catégories. Appelez tools/list pour récupérer la liste complète avec les définitions JSON Schema.

Offres d'emploi  16 tools

Nom de l'outilDescriptionParamètres
createVacancyCréer une nouvelle offre
1 param
NameTypeDescription
contractreqobjectVacancy creation details
updateVacancyMettre à jour une offre existante
1 param
NameTypeDescription
contractreqobjectUpdated vacancy details
deleteVacancySupprimer une offre
1 param
NameTypeDescription
vacancyIdreqstringVacancy identifier (GUID)
getVacancyObtenir une offre par ID
1 param
NameTypeDescription
vacancyIdreqstringVacancy identifier (GUID)
getVacanciesCollectionObtenir la liste des offres avec filtres
1 param
NameTypeDescription
contractreqobjectFilter criteria for vacancies
publishVacancyPublier une offre en brouillon
1 param
NameTypeDescription
vacancyIdreqstringVacancy identifier (GUID)
prolongVacancyProlonger une offre active
1 param
NameTypeDescription
vacancyIdreqstringVacancy identifier (GUID)
deactivateVacancyDésactiver une offre
1 param
NameTypeDescription
vacancyIdreqstringVacancy identifier (GUID)
checkVacancyVérifier le statut d'une offre
1 param
NameTypeDescription
vacancyIdreqstringVacancy identifier (GUID)
getInterviewVacancyObtenir les détails de l'offre d'entretien
1 param
NameTypeDescription
vacancyIdreqstringVacancy identifier (GUID)
analyzeVacancyContentAnalyser le contenu de l'offre via IA
1 param
NameTypeDescription
vacancyIdreqstringVacancy identifier (GUID)
getVacancySummaryObtenir le résumé de l'offre
1 param
NameTypeDescription
vacancyIdreqstringVacancy identifier (GUID)
updateVacancySummaryMettre à jour le résumé de l'offre
1 param
NameTypeDescription
contractreqobjectUpdated vacancy summary details
getVacancyContentFilenamesObtenir les noms des fichiers téléchargés
1 param
NameTypeDescription
vacancyIdreqstringVacancy identifier (GUID)
deleteVacancyContentSupprimer le contenu de l'offre par ID
1 param
NameTypeDescription
vacancyContentIdreqstringVacancy content identifier (GUID)
getVacancyContentUrlObtenir l'URL présignée pour le contenu de l'offre
1 param
NameTypeDescription
vacancyContentIdreqstringVacancy content identifier (GUID)

Questions  6 tools

Nom de l'outilDescriptionParamètres
createQuestionCréer une nouvelle question pour une offre
1 param
NameTypeDescription
contractreqobjectQuestion creation details
updateQuestionMettre à jour une question existante
1 param
NameTypeDescription
contractreqobjectUpdated question details
deleteQuestionSupprimer une question
1 param
NameTypeDescription
questionIdreqstringQuestion identifier (GUID)
getQuestionsCollectionObtenir la collection de questions pour une offre
1 param
NameTypeDescription
vacancyIdstringVacancy identifier (GUID)
getInterviewQuestionsCollectionObtenir les questions d'entretien pour une offre
1 param
NameTypeDescription
vacancyIdstringVacancy identifier (GUID)
skipInterviewQuestionIgnorer une question d'entretien (par le candidat)
4 params
NameTypeDescription
questionIdreqstringQuestion identifier (GUID)
candidateFirstNamereqstringCandidate first name
candidateLastNamereqstringCandidate last name
candidateEmailreqstringCandidate email address

Candidats  7 tools

Nom de l'outilDescriptionParamètres
getVacancyCandidateObtenir un candidat pour une offre spécifique
2 params
NameTypeDescription
candidateIdreqstringCandidate identifier (GUID)
vacancyIdreqstringVacancy identifier (GUID)
getCandidatesCollectionObtenir la collection de candidats pour une offre
3 params
NameTypeDescription
vacancyIdreqstringVacancy identifier (GUID)
lastFinishedDateFromstringStart date filter (ISO 8601)
lastFinishedDateTostringEnd date filter (ISO 8601)
getVideoPresignedUrlObtenir une URL présignée pour la vidéo du candidat
1 param
NameTypeDescription
analysisDataIdreqstringAnalysis data identifier (GUID)
getCandidateSummaryObtenir le résumé du candidat
2 params
NameTypeDescription
candidateIdreqstringCandidate identifier (GUID)
vacancyIdreqstringVacancy identifier (GUID)
createCandidateSummaryCréer un résumé du candidat via IA
2 params
NameTypeDescription
candidateIdreqstringCandidate identifier (GUID)
vacancyIdreqstringVacancy identifier (GUID)
updateCandidateReviewMettre à jour le statut ou commentaire du candidat
4 params
NameTypeDescription
candidateIdreqstringCandidate identifier (GUID)
vacancyIdreqstringVacancy identifier (GUID)
candidateStatusTypestringCandidate status enum value
recruiterCommentstringRecruiter comment text
getCandidateReviewObtenir l'évaluation du candidat
2 params
NameTypeDescription
candidateIdreqstringCandidate identifier (GUID)
vacancyIdreqstringVacancy identifier (GUID)

Méthodes JSON-RPC #

Le serveur implémente le transport MCP Streamable HTTP en utilisant JSON-RPC 2.0.

initialize

Effectue le handshake MCP et retourne les capacités du serveur.

Request
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "initialize",
  "params": {
    "protocolVersion": "2024-11-05",
    "capabilities": {},
    "clientInfo": { "name": "my-agent", "version": "1.0" }
  }
}
Response
{
  "jsonrpc": "2.0",
  "id": 1,
  "result": {
    "protocolVersion": "2024-11-05",
    "capabilities": { "tools": { "listChanged": false } },
    "serverInfo": { "name": "WhyEva-MCP", "version": "1.0.0" }
  }
}
La réponse inclut un en-tête Mcp-Session-Id avec un UUID de session unique.

tools/list

Retourne tous les outils disponibles avec leurs définitions JSON Schema.

Request
{ "jsonrpc": "2.0", "id": 2, "method": "tools/list" }

tools/call

Invoque un outil spécifique par nom, en passant des arguments sous forme d'objet JSON.

Request – example: getVacancy
{
  "jsonrpc": "2.0",
  "id": 3,
  "method": "tools/call",
  "params": {
    "name": "getVacancy",
    "arguments": {
      "vacancyId": "3fa85f64-5717-4562-b3fc-2c963f66afa6"
    }
  }
}

notifications/initialized

Envoyé par le client après un initialize réussi. Le serveur retourne 200 OK sans corps.


Codes d'erreur #

Statut HTTPCode RPCSignification
401Token JWT Bearer manquant ou invalide
200-32700Erreur d'analyse — le corps de la requête n'a pas pu être analysé en JSON
200-32601Méthode introuvable — méthode JSON-RPC inconnue
200-32602Paramètres invalides — arguments requis manquants ou nom d'outil inconnu
200-32603Erreur interne — exception de serveur non gérée
405Méthode non autorisée — GET/DELETE ne sont pas pris en charge
Les erreurs d'exécution des outils sont retournées comme une réponse JSON-RPC réussie avec "isError": true dans le tableau result.content.
Français