# io.usefulapi/recruitee (remote · recruitee.usefulapi.io)

Search Recruitee candidates, jobs, pipelines and interviews, and add notes, tags and tasks.

- Trust score: 75/100 (medium)
- Registry status: active
- Liveness: live
- Owner verified: no
- Last scored: 2026-10-04

## Components

- remote · `recruitee.usefulapi.io`: 75/100 (this document), [markdown](https://verifymcp.io/servers/io-usefulapi-recruitee/recruitee.md), [page](https://verifymcp.io/servers/io-usefulapi-recruitee/recruitee)

## Channel facts

- Endpoint: `https://recruitee.usefulapi.io/mcp`
- Transports: `streamable-http`
- Auth: `none`
- Version: `1.0.0`

## Trust breakdown

How this component scores in each security and reliability category. Every signal is checked automatically against the live server, and we only credit what we can confirm. Scores are 0–100 per category. Scoring method: https://verifymcp.io/docs/scoring (what has changed: https://verifymcp.io/docs/scoring/changelog)

Scored 2026-10-04.

- **Endpoint Security**: 89/100
  - The endpoint's TLS certificate is valid, in date, and uses a strong key.
  - Authorisation is enforced on tool calls, advertised via RFC 9728 protected-resource metadata. Discovery is public, which costs nothing: no tool can be invoked without a token.
  - HTTPS is enforced; there's no plaintext access path.
  - HSTS check failed: the Strict-Transport-Security header is absent.
  - DNSSEC check failed: this domain isn't protected by DNSSEC.
  - The authorisation server offers only Dynamic Client Registration (RFC 7591), which MCP 2026-07-28 deprecated in favour of Client ID Metadata Documents.
- **Transport & Reachability**: 100/100
  - Verified streamable-http transport via a live MCP handshake.
- **Schema Quality & AI Usability**: 74/100
  - AI-judged instruction clarity (excellent).
  - Context-footprint check failed: tool/resource definitions use about 3004 tokens (~136/item across 22 items; 22 tools + 0 resources), over budget; trim descriptions and params.
  - Usage-examples check failed: none of the tools include examples.
- **Stability & Change Management**: 0/100
  - Stability not yet verified: not enough scan history yet (needs a 30-day window).
- **Tool Coverage**: 100/100
  - 100% of tools have a non-trivial description (not blank, and not just the tool's name).
  - 100% of tool parameters carry a description.
- **Tool Safety**: 100/100
  - No prompt-injection markers were found in the server instructions, tool names or descriptions we captured.
  - We read all 22 captured tool definition(s), and no name or description among them implies an irreversible operation.
  - An AI judge read all 22 captured unit(s) of tool text and found none that tries to manipulate the model reading it.
- **Capabilities**: 60/100
  - Spec-recency check failed: implements MCP spec 2025-06-18; the latest is 2026-07-28.

**Unverified: 1 category.** A category scored 0 because we could not verify it: authentication we do not have, an unreachable endpoint, or not enough scan history. We only credit what we can confirm.

## Install

### How do I install the io.usefulapi/recruitee MCP server?

io.usefulapi/recruitee is a hosted endpoint at https://recruitee.usefulapi.io/mcp, so there is nothing to install locally. Ready-made configuration for Claude, Cursor, VS Code, Codex and 5 more is on this page, copied from each client's own documentation.

### Claude

```bash
claude mcp add --transport http io-usefulapi-recruitee 'https://recruitee.usefulapi.io/mcp'
```

### Cursor

```json
{
  "mcpServers": {
    "io-usefulapi-recruitee": {
      "url": "https://recruitee.usefulapi.io/mcp"
    }
  }
}
```

### VS Code

```json
{
  "servers": {
    "io-usefulapi-recruitee": {
      "type": "http",
      "url": "https://recruitee.usefulapi.io/mcp"
    }
  }
}
```

### Codex

```toml
[mcp_servers.io-usefulapi-recruitee]
url = "https://recruitee.usefulapi.io/mcp"
```

### opencode

```json
{
  "$schema": "https://opencode.ai/config.json",
  "mcp": {
    "io-usefulapi-recruitee": {
      "type": "remote",
      "url": "https://recruitee.usefulapi.io/mcp",
      "enabled": true
    }
  }
}
```

### OpenClaw

```bash
openclaw mcp add io-usefulapi-recruitee --url 'https://recruitee.usefulapi.io/mcp' --transport streamable-http
```

### Hermes

```yaml
mcp_servers:
  io-usefulapi-recruitee:
    url: "https://recruitee.usefulapi.io/mcp"
```

### Netclaw

```json
{
  "McpServers": {
    "io-usefulapi-recruitee": {
      "Transport": "http",
      "Url": "https://recruitee.usefulapi.io/mcp"
    }
  }
}
```

### Vellum

```bash
assistant mcp add io-usefulapi-recruitee -t streamable-http -u 'https://recruitee.usefulapi.io/mcp'
```

### Other

```json
{
  "mcpServers": {
    "io-usefulapi-recruitee": {
      "type": "http",
      "url": "https://recruitee.usefulapi.io/mcp"
    }
  }
}
```

The mcpServers block is a cross-client convention. Remote transports vary, so check your client's docs.

## Changelog

Every change recorded for this component, newest first. Days that predate change tracking, or that we cannot explain, say so: "we were watching and nothing happened" and "we were not watching" are different claims.

### 2026-10-04 (score 75, +42)

- [security improvement] Authorization: unverified → pass
- [security improvement] Injection markers: unverified → pass
- [security] First check of Judged manipulation: pass
- [security] First check of Authorization: partial
- [functional regression] MCP protocol: unverified → fail
- [functional improvement] Endpoint reachability: not serving MCP → reachable
- [functional improvement] Tool coverage: unverified → 100
- [functional] First check of Schema quality: fail
- [functional] First check of Schema quality: excellent
- [functional] First check of Destructive annotations: pass
- [functional] First check of Schema quality: fail
- [functional] First check of Tool coverage: 100
- [functional] This server's schema is too large to store in full, so we cannot compare its tools day to day

### 2026-10-03 (score 33, −2)

- [security regression] Endpoint reachability: reachable → not serving MCP
- [functional regression] Capabilities: fail → unverified

### 2026-10-02 (score 35, +2)

- [security] Tool safety: Tool safety not yet verified: we couldn't read the endpoint's tools, or could read only part of the list.
- [functional regression] MCP protocol: unverified → fail
- [functional] Tool coverage: Tool coverage not yet verified: we couldn't read the endpoint's tools, or could read only part of the list.
- [functional] Schema quality: Schema not yet verified: we couldn't read the endpoint's schema, or could read only part of its tool list.

### 2026-10-01 (score 33, +5)

- [security improvement] HTTPS: unverified → pass
- [security] Tool safety: Tool safety blocked by authentication: the endpoint requires auth we don't have to read its tools.
- [functional] Tool coverage: Tool coverage blocked by authentication: the endpoint requires auth we don't have to read its tools.
- [functional] Schema quality: Schema blocked by authentication: the endpoint requires auth we don't have to read it.
- [functional] Capabilities: Capabilities blocked by authentication: the endpoint requires auth we don't have to read them.

### 2026-09-30 (score 28, +10)

- [security improvement] Transport: fail → pass
- [security] Authorization: Authorisation not fully verified: no authorisation is required to connect, but we couldn't read the whole tool list to see what that exposes.

### 2026-09-29 (score 18)

First indexed and scored.

## MCP tools (22)

### `recruitee_get_current_user` (~64 tokens)

Get the current user

Fetch the Recruitee user the API token belongs to — name, email, role, role abilities and company id. A cheap way to confirm the token and company id are right. Recruitee: GET /c/{company_id}/admin.

### `recruitee_list_team_members` (~157 tokens)

List team members

List the company's team members (memberships): admin_id, role, whether they are a recruiter or hiring manager, and the jobs they can access. Use admin_id values for task assignees and filters. User names/emails are in the `references` array. Recruitee: GET /c/{company_id}/memberships.

Input parameters:

- `limit` (integer): Results per page.
- `page` (integer): Page number, starting at 1.
- `query` (string): Search by name or email.
- `role_id` (integer): Only members with this role id.
- `sort_by` (string): Sort field (default name).
- `sort_order` (string): Sort direction (default asc).

### `recruitee_search_candidates` (~286 tokens)

Search candidates

Search the company's candidates with Recruitee's candidate search (the same engine as the app's filters). `query` is a free-text search across name, emails, phones, tags, sources, job assignments, current stage, cover letter and CV content. `filters` accepts Recruitee filter objects verbatim, e.g. {"field":"created_at","gte":1548975600} (Unix seconds), {"field":"has_cv","eq":true}, {"filter":"tags","id":{"in":[12]}}, {"filter":"stages","name":{"in":["Phone interview"]}}. Returns `hits` (with each candidate's placements: job + current stage) and `total`. Recruitee: GET /c/{company_id}/search/new/candidates.

Input parameters:

- `filters` (array): Additional Recruitee search filter objects, sent as filters_json.
- `limit` (integer): Candidates per page (default 60).
- `page` (integer): Page number, starting at 1.
- `query` (string): Free-text search (adds a {"field":"all","query":...} filter).
- `sort_by` (string): Sort key with _asc or _desc suffix, e.g. created_at_desc (default), relevance_desc, candidate_name_asc, candidate_rating_desc, candidate_stage_name_asc.

### `recruitee_list_candidates` (~202 tokens)

List candidates

List candidates, newest first, optionally narrowed to one job, a name/job search, qualified or disqualified only, specific ids, or those created after a date. Paginate with limit + offset (next offset = offset + limit). Recruitee: GET /c/{company_id}/candidates.

Input parameters:

- `created_after` (string): Only candidates created after this date (ISO 8601).
- `disqualified` (boolean): true = only disqualified candidates.
- `ids` (array): Only these candidate ids.
- `limit` (integer): Candidates per page (default 100, max 1000).
- `offer_id` (integer): Only candidates on this job/talent pool.
- `offset` (integer): Number of candidates to skip.
- `qualified` (boolean): true = only qualified candidates.
- `query` (string): Search by candidate name or job.
- `sort` (string): Sort order (default by_date).

### `recruitee_get_candidate` (~98 tokens)

Get one candidate

Fetch one candidate's full profile: contact details, sources, tags, cover letter, CV URL, custom fields, ratings, and `placements` — one per job they are on, each with its placement id and current stage. The placement id is what recruitee_move_candidate_stage needs. Recruitee: GET /c/{company_id}/candidates/{id}.

Input parameters:

- `candidate_id` (integer, required): The candidate id.

### `recruitee_list_candidate_notes` (~61 tokens)

List a candidate's notes

List the notes on a candidate's profile, with replies, author admin_id and visibility. Recruitee: GET /c/{company_id}/candidates/{candidate_id}/notes.

Input parameters:

- `candidate_id` (integer, required): The candidate id.

### `recruitee_list_offers` (~330 tokens)

List jobs

List the company's jobs (Recruitee calls them offers) with id, title, status, slug, department_id, recruiter_id, hiring_manager_id and pipeline_template_id. Filter by status, department, location, recruiter, hiring manager, tag and more; add heavy fields with `include` (e.g. counters for candidate counts, description, salary, location_ids). Paginated with limit + page (default 1000 per page); `meta.total_count` gives the total. Recruitee: GET /c/{company_id}/offers.

Input parameters:

- `categories` (array): Only these job categories, e.g. information_technology.
- `department_ids` (array): Only jobs in these departments.
- `employment_types` (array): Only these employment types, e.g. fulltime.
- `hiring_manager_ids` (array): Only jobs with these hiring managers (admin ids).
- `include` (array): Extra field groups to return.
- `lang_codes` (array): Only jobs in these languages, e.g. en.
- `limit` (integer): Jobs per page (default 1000).
- `location_ids` (array): Only jobs at these locations.
- `offer_ids` (array): Only these job ids.
- `page` (integer): Page number, starting at 1.
- `priorities` (array): Only jobs with these priorities.
- `recruiter_ids` (array): Only jobs with these recruiters (admin ids).
- `statuses` (array): Only jobs in these statuses.
- `tag_ids` (array): Only jobs with these job tags.

### `recruitee_get_offer` (~72 tokens)

Get one job

Fetch one job or talent pool by id with its full details: description, requirements, location, salary, employment type, candidate counters and pipeline_template_id. Recruitee: GET /c/{company_id}/offers/{id}.

Input parameters:

- `offer_id` (integer, required): The job (offer) id.

### `recruitee_get_pipeline_template` (~100 tokens)

Get a hiring pipeline

Fetch a pipeline template with its ordered stages (id, name, group, category). A job's `pipeline_template_id` (from recruitee_list_offers / recruitee_get_offer) names its pipeline; the stage ids here are what recruitee_move_candidate_stage takes. Recruitee: GET /c/{company_id}/pipeline_templates/{id}.

Input parameters:

- `pipeline_template_id` (integer, required): The pipeline template id.

### `recruitee_list_departments` (~38 tokens)

List departments

List the company's departments with their ids and job counts. Recruitee: GET /c/{company_id}/departments.

### `recruitee_list_tags` (~82 tokens)

List candidate tags

List the company's candidate tags with ids and usage counts. Tag ids are used in recruitee_search_candidates filters. Recruitee: GET /c/{company_id}/tags.

Input parameters:

- `query` (string): Search tags by name.
- `sort_by` (string): Sort field.
- `sort_order` (string): Sort direction (default asc).

### `recruitee_list_disqualify_reasons` (~56 tokens)

List disqualify reasons

List the company's configured disqualification reasons (id, name, position). Useful for reading why candidates were disqualified. Recruitee: GET /c/{company_id}/disqualify_reasons.

### `recruitee_list_tasks` (~205 tokens)

List tasks

List recruiting tasks (title, description, due date, completed, candidate_id). With candidate_id, lists that candidate's tasks (Recruitee: GET /c/{company_id}/candidates/{candidate_id}/tasks — only `status` applies). Otherwise lists company tasks with scope, assignee, sorting and paging (Recruitee: GET /c/{company_id}/tasks).

Input parameters:

- `admin_ids` (array): Only tasks assigned to these admin ids (company list only).
- `candidate_id` (integer): Only this candidate's tasks.
- `limit` (integer): Tasks per page (company list only).
- `page` (integer): Page number, starting at 1.
- `scope` (string): Whose tasks (company list only).
- `sort_by` (string): Sort field (company list only).
- `sort_order` (string): Sort direction (company list only).
- `status` (string): Completed or open tasks only.

### `recruitee_list_interview_events` (~201 tokens)

List interviews

List scheduled interview events (candidate_id, offer_id, stage_id, start time, duration, location, attendees). Defaults to upcoming events for the whole company; narrow by candidate, date range or interviewer. Recruitee: GET /c/{company_id}/interview/events.

Input parameters:

- `admin_ids` (array): Only events assigned to these admin ids.
- `candidate_id` (integer): Only this candidate's interviews.
- `end_date` (string): Range end, YYYY-MM-DD.
- `limit` (integer): Events per page (default unlimited).
- `page` (integer): Page number; only used together with limit.
- `scope` (string): Only mine, or all (default all).
- `start_date` (string): Range start, YYYY-MM-DD.
- `status` (string): Which events (default upcoming).
- `timezone` (string): Timezone for the date range, e.g. Europe/Amsterdam.

### `recruitee_list_evaluations` (~135 tokens)

List evaluations

List interview results — evaluations (rating + note) and questionnaire scorecards — optionally for one candidate or by selected reviewers. Recruitee: GET /c/{company_id}/interview/results.

Input parameters:

- `admin_ids` (array): Only results by these admin ids.
- `candidate_id` (integer): Only this candidate's evaluations.
- `kind` (string): Result kind (default all).
- `limit` (integer): Results per page (default unlimited).
- `page` (integer): Page number; only used together with limit.
- `scope` (string): Only mine, or all (default all).

### `recruitee_create_candidate` (~197 tokens)

Create a candidate

WRITE: add a candidate manually (as if a recruiter added them in the app — no auto-confirmation email is sent), optionally assigning them straight to one or more jobs in the job's default stage. Recruitee: POST /c/{company_id}/candidates.

Input parameters:

- `cover_letter` (string): Cover letter text.
- `emails` (array): Email addresses.
- `links` (array): Other links (portfolio, website).
- `name` (string, required): Candidate's full name (required).
- `offer_ids` (array): Jobs/talent pools to assign the candidate to (default stage).
- `phones` (array): Phone numbers.
- `remote_cv_url` (string): Public URL of the CV file for Recruitee to fetch.
- `social_links` (array): Social profile URLs (e.g. LinkedIn).
- `sources` (array): Source tags, e.g. ["Referral"].

### `recruitee_update_candidate` (~155 tokens)

Update a candidate

WRITE: update a candidate's name or contact details. Only the fields you pass change; list fields (emails, phones, links) REPLACE the existing list, so pass the full list you want. Recruitee: PATCH /c/{company_id}/candidates/{id}.

Input parameters:

- `candidate_id` (integer, required): The candidate id.
- `cover_letter` (string): Cover letter text.
- `emails` (array): Full replacement list of email addresses.
- `links` (array): Full replacement list of other links.
- `name` (string): New full name.
- `phones` (array): Full replacement list of phone numbers.
- `social_links` (array): Full replacement list of social profile URLs.

### `recruitee_add_candidate_note` (~69 tokens)

Add a note to a candidate

WRITE: add a note to a candidate's profile, visible to the team. Recruitee: POST /c/{company_id}/candidates/{candidate_id}/notes.

Input parameters:

- `body` (string, required): The note text.
- `candidate_id` (integer, required): The candidate id.

### `recruitee_add_candidate_tags` (~86 tokens)

Tag a candidate

WRITE: add one or more tags to a candidate (existing tags are reused by name; new names create new tags). Recruitee: POST /c/{company_id}/candidates/{candidate_id}/tags.

Input parameters:

- `candidate_id` (integer, required): The candidate id.
- `tags` (array, required): Tag names to add, e.g. ["Python developer"].

### `recruitee_assign_candidate_to_offer` (~98 tokens)

Add a candidate to a job

WRITE: put an existing candidate on a job (or talent pool) — creates a placement in the pipeline's first stage. Pass exactly one of offer_id or talent_pool_id. Recruitee: POST /c/{company_id}/placements.

Input parameters:

- `candidate_id` (integer, required): The candidate id.
- `offer_id` (integer): The job id.
- `talent_pool_id` (integer): The talent pool id.

### `recruitee_move_candidate_stage` (~168 tokens)

Move a candidate to another stage

WRITE: move a candidate to another stage of a job's pipeline. Takes the PLACEMENT id (from recruitee_get_candidate → placements[].id, one per job) and the destination stage id (from recruitee_get_pipeline_template). Moving to a 'hired' stage also requires work_location_id. Stage automations configured in Recruitee may run. Undo by moving back. Recruitee: PATCH /c/{company_id}/placements/{id}/change_stage.

Input parameters:

- `placement_id` (integer, required): The placement id (candidate-on-job), not the candidate id.
- `stage_id` (integer, required): Destination stage id.
- `work_location_id` (integer): Location id — required by Recruitee when the destination is a hired stage.

### `recruitee_create_task` (~144 tokens)

Create a task

WRITE: create a recruiting task, optionally about a candidate, assigned to team members (admin ids from recruitee_list_team_members), with an optional due date. Recruitee: POST /c/{company_id}/tasks.

Input parameters:

- `admin_ids` (array): Assignees (admin ids).
- `candidate_id` (integer): Candidate the task is about.
- `description` (string): Task details.
- `due_date` (string): Due date/time (ISO 8601). Requires timezone.
- `timezone` (string): Timezone of the due date, e.g. Europe/Amsterdam.
- `title` (string, required): Task title (required).

## Diagnostics

Captured diagnostic sections: TLS, DNSSEC, Authorisation, Transports. The full working is on the page: https://verifymcp.io/servers/io-usefulapi-recruitee/recruitee#diagnostics

## Score history

- 2026-10-04: 75
- 2026-10-03: 33
- 2026-10-02: 35
- 2026-10-01: 33
- 2026-09-30: 28
- 2026-09-29: 18

## Common questions

### What is the io.usefulapi/recruitee MCP server?

io.usefulapi/recruitee is an MCP server listed in the public MCP registry as io.usefulapi/recruitee. Search Recruitee candidates, jobs, pipelines and interviews, and add notes, tags and tasks. This page covers its hosted endpoint (https://recruitee.usefulapi.io/mcp).

### Is the io.usefulapi/recruitee MCP server safe to use?

io.usefulapi/recruitee scores 75 out of 100 on VerifyMCP. That is a record of what we were able to check automatically, not an endorsement. The category breakdown on this page shows every signal behind the number, including the ones we could not confirm.

### What tools does the io.usefulapi/recruitee MCP server expose?

io.usefulapi/recruitee exposes 22 tools: recruitee_get_current_user, recruitee_list_team_members, recruitee_search_candidates, recruitee_list_candidates, recruitee_get_candidate, and 17 more. Their descriptions and schemas cost roughly 3,004 tokens of context every time the server is loaded.

### Does the io.usefulapi/recruitee MCP server require authentication?

Yes. io.usefulapi/recruitee asked us for credentials when we connected, so you will need to authorise it in your MCP client before it can do anything.

### Is the io.usefulapi/recruitee MCP server still maintained?

io.usefulapi/recruitee is still listed as active in the MCP registry. We last reached this channel on 4 October 2026. Those dates come from our own scans of the registry and the channel itself, not from anything the publisher announced.

## Links

- Remote endpoint: https://recruitee.usefulapi.io/mcp
- Repository: https://github.com/m190/usefulapi-mcp
- Changelog RSS feed: https://verifymcp.io/servers/io-usefulapi-recruitee/recruitee.xml
- Changelog JSON feed: https://verifymcp.io/servers/io-usefulapi-recruitee/recruitee.json
- HTML version of this page: https://verifymcp.io/servers/io-usefulapi-recruitee/recruitee
