Model Context Protocol

WhyEva MCP Server

Let your AI agents interact with WhyEva — manage vacancies, questions, and candidates directly from Claude, Cursor, VS Code Copilot, and any other MCP-compatible client.

Overview #

The WhyEva MCP server implements the Model Context Protocol over Streamable HTTP. It exposes tools that AI agents can invoke to read and write data in your WhyEva account — without writing a single line of integration code.

The server uses the JSON-RPC 2.0 transport over a single POST /mcp endpoint. Authentication is performed via a standard JWT Bearer token.

📋
16 Vacancy tools
Create, update, publish, analyse and manage vacancies
6 Question tools
Build interview question sets and handle responses
👤
7 Candidate tools
Review candidates, summaries, videos and feedback

Endpoint #

All MCP requests are sent to a single endpoint:

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

The server supports only the POST method. GET and DELETE return 405 Method Not Allowed.

Protocol version: The server advertises 2024-11-05 during the initialize handshake and assigns a unique Mcp-Session-Id response header per session.

Authentication #

The MCP endpoint requires a valid JWT Bearer token. Obtain one by logging in through the WhyEva API and pass it with every request.

1

Obtain a token

Log in to the WhyEva API to get a JWT access token:

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

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

The response contains an accessToken field.

2

Pass the token in headers

Include the token as a Bearer token in the Authorization header:

HTTP
Authorization: Bearer <your-access-token>
Note: Tokens are short-lived. Most MCP clients support setting a static token in the configuration (see Quick Connect below). Refresh the token when your client reports a 401 Unauthorized.

Quick Connect #

Add the WhyEva MCP server to your AI client by pasting the configuration below. Replace with the Bearer token obtained from the step above.

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

Config file location: ~/Library/Application Support/Claude/claude_desktop_config.json (macOS) or %APPDATA%\Claude\claude_desktop_config.json (Windows).

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

VS Code will prompt for the token on first use and store it securely.

~/.codeium/windsurf/mcp_config.json
{
  "mcpServers": {
    "whyeva": {
      "serverUrl": "https://my.whyeva.com/mcp",
      "headers": {
        "Authorization": "Bearer <YOUR_TOKEN>"
      }
    }
  }
}
cURL – initialize
curl -X POST https://my.whyeva.com/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" }
    }
  }'

Tools #

The server exposes 29 tools grouped into three categories. Call tools/list to retrieve the full list with JSON Schema definitions at runtime.

Vacancies  16 tools

Tool nameDescriptionParams
createVacancyCreate a new vacancy
1 param
NameTypeDescription
contractreqobjectVacancy creation details
updateVacancyUpdate an existing vacancy
1 param
NameTypeDescription
contractreqobjectUpdated vacancy details
deleteVacancyDelete a vacancy
1 param
NameTypeDescription
vacancyIdreqstringVacancy identifier (GUID)
getVacancyGet a vacancy by ID
1 param
NameTypeDescription
vacancyIdreqstringVacancy identifier (GUID)
getVacanciesCollectionGet vacancies list with optional filters
1 param
NameTypeDescription
contractreqobjectFilter criteria for vacancies
publishVacancyPublish a draft vacancy
1 param
NameTypeDescription
vacancyIdreqstringVacancy identifier (GUID)
prolongVacancyProlong an active vacancy
1 param
NameTypeDescription
vacancyIdreqstringVacancy identifier (GUID)
deactivateVacancyDeactivate a vacancy
1 param
NameTypeDescription
vacancyIdreqstringVacancy identifier (GUID)
checkVacancyCheck vacancy status
1 param
NameTypeDescription
vacancyIdreqstringVacancy identifier (GUID)
getInterviewVacancyGet interview vacancy details
1 param
NameTypeDescription
vacancyIdreqstringVacancy identifier (GUID)
analyzeVacancyContentAnalyze vacancy content via AI
1 param
NameTypeDescription
vacancyIdreqstringVacancy identifier (GUID)
getVacancySummaryGet vacancy summary
1 param
NameTypeDescription
vacancyIdreqstringVacancy identifier (GUID)
updateVacancySummaryUpdate vacancy summary
1 param
NameTypeDescription
contractreqobjectUpdated vacancy summary details
getVacancyContentFilenamesGet uploaded content filenames for a vacancy
1 param
NameTypeDescription
vacancyIdreqstringVacancy identifier (GUID)
deleteVacancyContentDelete vacancy content by ID
1 param
NameTypeDescription
vacancyContentIdreqstringVacancy content identifier (GUID)
getVacancyContentUrlGet presigned URL for viewing vacancy content
1 param
NameTypeDescription
vacancyContentIdreqstringVacancy content identifier (GUID)

Questions  6 tools

Tool nameDescriptionParams
createQuestionCreate a new question for a vacancy
1 param
NameTypeDescription
contractreqobjectQuestion creation details
updateQuestionUpdate an existing question
1 param
NameTypeDescription
contractreqobjectUpdated question details
deleteQuestionDelete a question
1 param
NameTypeDescription
questionIdreqstringQuestion identifier (GUID)
getQuestionsCollectionGet questions collection for a vacancy
1 param
NameTypeDescription
vacancyIdstringVacancy identifier (GUID)
getInterviewQuestionsCollectionGet interview questions for a vacancy
1 param
NameTypeDescription
vacancyIdstringVacancy identifier (GUID)
skipInterviewQuestionSkip an interview question (by candidate)
4 params
NameTypeDescription
questionIdreqstringQuestion identifier (GUID)
candidateFirstNamereqstringCandidate first name
candidateLastNamereqstringCandidate last name
candidateEmailreqstringCandidate email address

Candidates  7 tools

Tool nameDescriptionParams
getVacancyCandidateGet a candidate for a specific vacancy
2 params
NameTypeDescription
candidateIdreqstringCandidate identifier (GUID)
vacancyIdreqstringVacancy identifier (GUID)
getCandidatesCollectionGet candidates collection for a vacancy
3 params
NameTypeDescription
vacancyIdreqstringVacancy identifier (GUID)
lastFinishedDateFromstringStart date filter (ISO 8601)
lastFinishedDateTostringEnd date filter (ISO 8601)
getVideoPresignedUrlGet a presigned URL for candidate video
1 param
NameTypeDescription
analysisDataIdreqstringAnalysis data identifier (GUID)
getCandidateSummaryGet candidate summary
2 params
NameTypeDescription
candidateIdreqstringCandidate identifier (GUID)
vacancyIdreqstringVacancy identifier (GUID)
createCandidateSummaryCreate candidate summary via AI analysis
2 params
NameTypeDescription
candidateIdreqstringCandidate identifier (GUID)
vacancyIdreqstringVacancy identifier (GUID)
updateCandidateReviewUpdate candidate review status or comment
4 params
NameTypeDescription
candidateIdreqstringCandidate identifier (GUID)
vacancyIdreqstringVacancy identifier (GUID)
candidateStatusTypestringCandidate status enum value
recruiterCommentstringRecruiter comment text
getCandidateReviewGet candidate review
2 params
NameTypeDescription
candidateIdreqstringCandidate identifier (GUID)
vacancyIdreqstringVacancy identifier (GUID)

JSON-RPC Methods #

The server implements MCP Streamable HTTP transport using JSON-RPC 2.0.

initialize

Performs the MCP handshake and returns server capabilities.

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" }
  }
}
The response includes an Mcp-Session-Id header with a unique session UUID.

tools/list

Returns all available tools with their JSON Schema definitions.

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

tools/call

Invokes a specific tool by name, passing arguments as a JSON object.

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

notifications/initialized

Sent by the client after a successful initialize. The server returns 200 OK with no body.


Error Codes #

HTTP StatusRPC CodeMeaning
401Missing or invalid JWT Bearer token
200-32700Parse error — request body could not be parsed as JSON
200-32601Method not found — unknown JSON-RPC method
200-32602Invalid params — missing required arguments or unknown tool name
200-32603Internal error — unhandled server exception
405Method not allowed — GET/DELETE are not supported
Tool execution errors are returned as a successful JSON-RPC response with "isError": true inside the result.content array.
English