# CATS MCP by usefulapi (remote · cats-ats.usefulapi.io)

Read CATS candidates, jobs and pipelines, and make explicitly confirmed recruiting changes.

- Trust score: 18/100 (low)
- Registry status: active
- Liveness: live
- Owner verified: no
- Last scored: 2026-11-05

## Components

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

## Channel facts

- Endpoint: `https://cats-ats.usefulapi.io/mcp`
- Transports: `streamable-http`
- Auth: `none`
- Version: `1.7.3`

## 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-11-05.

- **Endpoint Security**: 46/100
  - The endpoint's TLS certificate is valid, in date, and uses a strong key.
  - Authorisation not yet verified: we couldn't confirm whether this endpoint requires it.
  - HTTPS enforcement could not be verified: the plaintext port redirected somewhere other than https, so enforcement is unproven.
  - HSTS check failed: the Strict-Transport-Security header is absent.
  - DNSSEC check failed: this domain isn't protected by DNSSEC.
- **Transport & Reachability**: 0/100
  - Transport check failed: declared streamable-http, but the endpoint redirected instead of responding directly.
- **Schema Quality & AI Usability**: 0/100
  - Schema not yet verified: we couldn't read the endpoint's schema, or could read only part of its tool list.
- **Stability & Change Management**: 0/100
  - Stability not yet verified: not enough scan history yet (needs a 30-day window).
- **Tool Coverage**: 0/100
  - Tool coverage not yet verified: we couldn't read the endpoint's tools, or could read only part of the list.
- **Tool Safety**: 0/100
  - Tool safety not yet verified: we couldn't read the endpoint's tools, or could read only part of the list.
- **Capabilities**: 0/100
  - Capabilities not yet verified: we couldn't read the endpoint's capabilities.

**Unverified: 5 categories.** Categories scored 0 because we could not verify them: 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 CATS MCP by usefulapi server?

CATS MCP by usefulapi is a hosted endpoint at https://cats-ats.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-cats-ats 'https://cats-ats.usefulapi.io/mcp'
```

### Cursor

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

### VS Code

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

### Codex

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

### opencode

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

### OpenClaw

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

### Hermes

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

### Netclaw

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

### Vellum

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

### Other

```json
{
  "mcpServers": {
    "io-usefulapi-cats-ats": {
      "type": "http",
      "url": "https://cats-ats.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-11-01 (score 18, −47)

- [security regression] Endpoint reachability: reachable → not serving MCP
- [security regression] Tool safety: pass → unverified
- [security regression] Authorization: pass → unverified
- [functional regression] Schema quality: 100 → unverified
- [functional regression] Capabilities: pass → unverified
- [functional regression] Tool coverage: 100 → unverified

### 2026-10-31 (score 65)

First indexed and scored.

## MCP tools (34)

### `cats_get_site` (~40 tokens)

Get CATS site

The CATS site (account) this API key belongs to: id, mode (recruiter or employer) and subdomain. GET /site.

### `cats_list_users` (~87 tokens)

List users

List the CATS users (recruiters) with id, name, title and access level. Use the ids as owner or assignee. GET /users.

Input parameters:

- `page` (integer): Page number, from 1 (default 1). Pass the previous reply's next_page.
- `per_page` (integer): Results per page, 1-100 (default 25).

### `cats_list_candidates` (~102 tokens)

List candidates

List candidates (personal data: name, emails, address, employer, skills, notes), one page at a time, max 100 per page. Use cats_search_candidates or cats_filter_candidates to find specific people. GET /candidates.

Input parameters:

- `page` (integer): Page number, from 1 (default 1). Pass the previous reply's next_page.
- `per_page` (integer): Results per page, 1-100 (default 25).

### `cats_get_candidate` (~36 tokens)

Get candidate

One candidate by id (personal data). GET /candidates/{id}.

Input parameters:

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

### `cats_search_candidates` (~90 tokens)

Search candidates

Free-text search over candidates (name, email, skills, resume text...), paged. GET /candidates/search?query=.

Input parameters:

- `page` (integer): Page number, from 1 (default 1). Pass the previous reply's next_page.
- `per_page` (integer): Results per page, 1-100 (default 25).
- `query` (string, required): Search text.

### `cats_filter_candidates` (~188 tokens)

Filter candidates

Filter candidates by fields (read-only, although it is a POST): first_name, last_name, title, emails.primary, address.city/state/postal_code, country_code, current_employer, key_skills, notes, dates (date_created, date_modified), owner_id, is_hot... Each condition is {field, filter, value}; filters: exactly, contains, between {gte,lte}, greater_than, less_than, is_empty, geo_distance. Paged. POST /candidates/search.

Input parameters:

- `conditions` (array, required): One or more conditions.
- `match` (string): How several conditions combine: all = AND (default), any = OR.
- `page` (integer): Page number, from 1 (default 1). Pass the previous reply's next_page.
- `per_page` (integer): Results per page, 1-100 (default 25).

### `cats_list_candidate_pipelines` (~97 tokens)

List a candidate's pipelines

The jobs a candidate is in the pipeline for, with rating, workflow and current status id. GET /candidates/{id}/pipelines.

Input parameters:

- `candidate_id` (integer, required): CATS candidate id.
- `page` (integer): Page number, from 1 (default 1). Pass the previous reply's next_page.
- `per_page` (integer): Results per page, 1-100 (default 25).

### `cats_list_candidate_activities` (~96 tokens)

List a candidate's activities

The activity log of a candidate (calls, meetings, notes, pipeline changes), paged. GET /candidates/{id}/activities.

Input parameters:

- `candidate_id` (integer, required): CATS candidate id.
- `page` (integer): Page number, from 1 (default 1). Pass the previous reply's next_page.
- `per_page` (integer): Results per page, 1-100 (default 25).

### `cats_list_candidate_tasks` (~82 tokens)

List a candidate's tasks

Tasks attached to a candidate. GET /candidates/{id}/tasks.

Input parameters:

- `candidate_id` (integer, required): CATS candidate id.
- `page` (integer): Page number, from 1 (default 1). Pass the previous reply's next_page.
- `per_page` (integer): Results per page, 1-100 (default 25).

### `cats_list_candidate_attachments` (~104 tokens)

List a candidate's attachments (metadata)

File names, sizes and whether each file is a resume, for a candidate's attachments. Metadata only: file contents are never downloaded. GET /candidates/{id}/attachments.

Input parameters:

- `candidate_id` (integer, required): CATS candidate id.
- `page` (integer): Page number, from 1 (default 1). Pass the previous reply's next_page.
- `per_page` (integer): Results per page, 1-100 (default 25).

### `cats_list_jobs` (~80 tokens)

List jobs

List job orders with title, location, company, recruiter, status and workflow ids, dates. Paged. GET /jobs.

Input parameters:

- `page` (integer): Page number, from 1 (default 1). Pass the previous reply's next_page.
- `per_page` (integer): Results per page, 1-100 (default 25).

### `cats_get_job` (~37 tokens)

Get job

One job order by id, with its description. GET /jobs/{id}.

Input parameters:

- `job_id` (integer, required): CATS job id.

### `cats_search_jobs` (~81 tokens)

Search jobs

Free-text search over job orders, paged. GET /jobs/search?query=.

Input parameters:

- `page` (integer): Page number, from 1 (default 1). Pass the previous reply's next_page.
- `per_page` (integer): Results per page, 1-100 (default 25).
- `query` (string, required): Search text.

### `cats_list_job_pipelines` (~101 tokens)

List a job's pipeline

The candidates in the pipeline of a job: pipeline id, candidate id, rating and current status id. Paged. GET /jobs/{id}/pipelines.

Input parameters:

- `job_id` (integer, required): CATS job id.
- `page` (integer): Page number, from 1 (default 1). Pass the previous reply's next_page.
- `per_page` (integer): Results per page, 1-100 (default 25).

### `cats_list_job_statuses` (~77 tokens)

List job statuses

The statuses a job order can have (Active, OnHold, Closed...). GET /jobs/statuses.

Input parameters:

- `page` (integer): Page number, from 1 (default 1). Pass the previous reply's next_page.
- `per_page` (integer): Results per page, 1-100 (default 25).

### `cats_list_pipelines` (~83 tokens)

List pipelines

List candidate-to-job pipelines (candidate id, job id, rating, workflow id, status id), paged. GET /pipelines.

Input parameters:

- `page` (integer): Page number, from 1 (default 1). Pass the previous reply's next_page.
- `per_page` (integer): Results per page, 1-100 (default 25).

### `cats_get_pipeline` (~40 tokens)

Get pipeline

One pipeline (a candidate on a job) by id. GET /pipelines/{id}.

Input parameters:

- `pipeline_id` (integer, required): CATS pipeline id.

### `cats_filter_pipelines` (~137 tokens)

Filter pipelines

Filter pipelines by id, candidate_id, job_id, status_id, rating, date_created or date_modified (read-only, although it is a POST). Each condition is {field, filter, value}. Paged. POST /pipelines/search.

Input parameters:

- `conditions` (array, required): One or more conditions.
- `match` (string): How several conditions combine: all = AND (default), any = OR.
- `page` (integer): Page number, from 1 (default 1). Pass the previous reply's next_page.
- `per_page` (integer): Results per page, 1-100 (default 25).

### `cats_get_pipeline_status_history` (~92 tokens)

Get pipeline status history

The status changes of a pipeline over time (status, who, when). GET /pipelines/{id}/statuses.

Input parameters:

- `page` (integer): Page number, from 1 (default 1). Pass the previous reply's next_page.
- `per_page` (integer): Results per page, 1-100 (default 25).
- `pipeline_id` (integer, required): CATS pipeline id.

### `cats_list_workflows` (~79 tokens)

List pipeline workflows

The pipeline workflows (sets of statuses such as Contacted, Interviewing, Offered). GET /pipelines/workflows.

Input parameters:

- `page` (integer): Page number, from 1 (default 1). Pass the previous reply's next_page.
- `per_page` (integer): Results per page, 1-100 (default 25).

### `cats_list_workflow_statuses` (~114 tokens)

List workflow statuses

The statuses of one pipeline workflow (id, title, prerequisites, triggers). Use the ids with cats_change_pipeline_status. GET /pipelines/workflows/{id}/statuses.

Input parameters:

- `page` (integer): Page number, from 1 (default 1). Pass the previous reply's next_page.
- `per_page` (integer): Results per page, 1-100 (default 25).
- `workflow_id` (integer, required): Workflow id, from cats_list_workflows or a pipeline's workflow_id.

### `cats_list_companies` (~74 tokens)

List companies

List client companies (name, address, website, owner), paged. GET /companies.

Input parameters:

- `page` (integer): Page number, from 1 (default 1). Pass the previous reply's next_page.
- `per_page` (integer): Results per page, 1-100 (default 25).

### `cats_get_company` (~32 tokens)

Get company

One company by id. GET /companies/{id}.

Input parameters:

- `company_id` (integer, required): CATS company id.

### `cats_search_companies` (~81 tokens)

Search companies

Free-text search over companies, paged. GET /companies/search?query=.

Input parameters:

- `page` (integer): Page number, from 1 (default 1). Pass the previous reply's next_page.
- `per_page` (integer): Results per page, 1-100 (default 25).
- `query` (string, required): Search text.

### `cats_list_contacts` (~76 tokens)

List contacts

List client contacts (personal data: name, title, emails, company), paged. GET /contacts.

Input parameters:

- `page` (integer): Page number, from 1 (default 1). Pass the previous reply's next_page.
- `per_page` (integer): Results per page, 1-100 (default 25).

### `cats_get_contact` (~36 tokens)

Get contact

One client contact by id (personal data). GET /contacts/{id}.

Input parameters:

- `contact_id` (integer, required): CATS contact id.

### `cats_search_contacts` (~81 tokens)

Search contacts

Free-text search over client contacts, paged. GET /contacts/search?query=.

Input parameters:

- `page` (integer): Page number, from 1 (default 1). Pass the previous reply's next_page.
- `per_page` (integer): Results per page, 1-100 (default 25).
- `query` (string, required): Search text.

### `cats_list_tasks` (~86 tokens)

List tasks

List tasks (description, priority 1-5, due date, assignee, completion, the record it is about), paged. GET /tasks.

Input parameters:

- `page` (integer): Page number, from 1 (default 1). Pass the previous reply's next_page.
- `per_page` (integer): Results per page, 1-100 (default 25).

### `cats_get_task` (~32 tokens)

Get task

One task by id. GET /tasks/{id}.

Input parameters:

- `task_id` (integer, required): CATS task id.

### `cats_list_activities` (~84 tokens)

List activities

The site-wide activity log (calls, emails logged, meetings, notes) with the record each is about, paged. GET /activities.

Input parameters:

- `page` (integer): Page number, from 1 (default 1). Pass the previous reply's next_page.
- `per_page` (integer): Results per page, 1-100 (default 25).

### `cats_add_candidate_activity` (~178 tokens)

Add an activity (note) to a candidate

WRITE: Requires confirm:true. log an activity (a call, meeting, note...) on a candidate's record. It only records the entry in CATS: no email/SMS-send request is made, even for type 'email' or 'text_message'. Creates a new entry each time (not idempotent). POST /candidates/{id}/activities.

Input parameters:

- `candidate_id` (integer, required): CATS candidate id.
- `confirm` (boolean, required): Confirm this change to the CATS account.
- `date` (string): When it happened (ISO 8601); default now.
- `notes` (string, required): The note text.
- `regarding_job_id` (integer): The job order this activity is about; omit for a general activity.
- `type` (string, required): Activity type; use 'other' for a plain note.

### `cats_create_task` (~182 tokens)

Create a task

WRITE: Requires confirm:true. create a task in CATS, optionally about a candidate, contact, company or job and assigned to a user. Creates a new task each time (not idempotent); CATS may notify the assignee. POST /tasks.

Input parameters:

- `about_id` (integer): Id of that record.
- `about_type` (string): Kind of record the task is about; omit for a general task. Needs about_id.
- `assigned_to_id` (integer): CATS user id of the assignee (see cats_list_users).
- `confirm` (boolean, required): Confirm this change to the CATS account.
- `date_due` (string): Due date (ISO 8601); omit for ASAP.
- `description` (string, required): What has to be done.
- `priority` (integer): 1 (lowest) to 5.

### `cats_change_pipeline_status` (~188 tokens)

Move a candidate to another pipeline status

WRITE: Requires confirm:true. change the status of a pipeline (move a candidate to another stage of a job's workflow, e.g. Interviewing, Offered, Rejected). Get the pipeline id from cats_list_candidate_pipelines and the status id from cats_list_workflow_statuses. Requires confirm:true. Requests that status triggers (which can e-mail people or change records) be suppressed: every trigger attached to the target status is sent with fire=false. CATS remains responsible for enforcing its trigger semantics; independently configured webhooks may still run. The change is recorded in the pipeline's status history. POST /pipelines/{id}/status.

Input parameters:

- `confirm` (boolean, required): Confirm this change to the CATS account.
- `pipeline_id` (integer, required): CATS pipeline id.
- `status_id` (integer, required): The status to move to; must belong to the pipeline's workflow.

### `cats_create_candidate` (~273 tokens)

Create a candidate

WRITE: Requires confirm:true. create one candidate record (personal data) with name, optional contact details and notes. Refuses when CATS finds a duplicate (check_duplicate=true, the default). Creates a new record each time (not idempotent); no email-send request is made to the candidate and no login is created. POST /candidates.

Input parameters:

- `check_duplicate` (boolean): Refuse to create when a duplicate exists (default true).
- `city` (string)
- `confirm` (boolean, required): Confirm this change to the CATS account.
- `country_code` (string): ISO 3166 two-letter country code.
- `current_employer` (string)
- `email` (string): Primary e-mail address (stored only, never mailed).
- `first_name` (string, required)
- `key_skills` (string)
- `last_name` (string, required)
- `notes` (string)
- `owner_id` (integer): CATS user id of the record owner.
- `phone` (string): Phone number with country code.
- `phone_type` (string): Phone type (default mobile).
- `postal_code` (string)
- `source` (string): Where the candidate came from.
- `state` (string)
- `title` (string): Current job title.

## Diagnostics

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

## Score history

- 2026-11-05: 18
- 2026-11-04: 18
- 2026-11-03: 18
- 2026-11-02: 18
- 2026-11-01: 18
- 2026-10-31: 65

## Common questions

### What is the CATS MCP by usefulapi server?

CATS MCP by usefulapi is listed in the public MCP registry as io.usefulapi/cats-ats. Read CATS candidates, jobs and pipelines, and make explicitly confirmed recruiting changes. This page covers its hosted endpoint (https://cats-ats.usefulapi.io/mcp).

### Is the CATS MCP by usefulapi server safe to use?

CATS MCP by usefulapi scores 18 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 CATS MCP by usefulapi server expose?

CATS MCP by usefulapi exposes 34 tools: cats_get_site, cats_list_users, cats_list_candidates, cats_get_candidate, cats_search_candidates, and 29 more. Their descriptions and schemas cost roughly 3,246 tokens of context every time the server is loaded.

### Does the CATS MCP by usefulapi server require authentication?

Its publisher declares no required credentials for CATS MCP by usefulapi. We have not been able to confirm that against the live endpoint, and a server can require authorisation without declaring it here.

### Is the CATS MCP by usefulapi server still maintained?

CATS MCP by usefulapi is still listed as active in the MCP registry. We last reached this channel on 5 November 2026. Those dates come from our own scans of the registry and the channel itself, not from anything the publisher announced.

### What did VerifyMCP test on the CATS MCP by usefulapi server?

VerifyMCP ran 4 checks on CATS MCP by usefulapi, covering TLS certificate, HSTS header, DNSSEC and Transport. 7 items could not be completed, a gap on our side rather than a finding about CATS MCP by usefulapi: Authorization, HTTPS, Schema quality, Stability and 3 more. 5 categories score 0 for that reason, because we only credit what we can confirm. Supply Chain Security and Provenance & Transparency do not apply to a hosted endpoint, so they were not tested. The score does not measure everything, and the scoring documentation lists what it leaves out.

## Links

- Remote endpoint: https://cats-ats.usefulapi.io/mcp
- Repository: https://github.com/m190/usefulapi-mcp
- Website: https://usefulapi.io/cats-ats/
- Changelog RSS feed: https://verifymcp.io/servers/io-usefulapi-cats-ats/cats-ats.xml
- Changelog JSON feed: https://verifymcp.io/servers/io-usefulapi-cats-ats/cats-ats/changelog.json
- Trust report (JSON): https://verifymcp.io/servers/io-usefulapi-cats-ats/cats-ats.json
- HTML version of this page: https://verifymcp.io/servers/io-usefulapi-cats-ats/cats-ats
