# Curriculo ATS MCP server

> Connect Curriculo ATS to Claude, ChatGPT, Cursor or any MCP client. Setup, OAuth and personal access token auth, scopes, and a reference for all 25 ATS tools.

**Source:** /docs/mcp/ (Curriculo Docs)  
**Updated:** 29 October 2026  
**Contact:** hello@curriculo.me

Connect your Curriculo ATS to Claude, Cursor and any MCP client that speaks Streamable HTTP, or to ChatGPT through a Custom GPT. Ask in plain language to review candidates, move pipelines, reply to applicants, schedule interviews and pull analytics. Your AI client does the work directly in your ATS.

| Endpoint | Transport | Auth | Scopes | Tools |
|---|---|---|---|---|
| `https://mcp.curriculo.me/mcp` | Streamable HTTP | OAuth 2.1, or a personal access token | `ats:read`, `ats:write` | 25 |

The server is remote and hosted, so there is nothing to install or run locally. Point any MCP client at the endpoint, authenticate once, and the client gains tools that read and act on your hiring data in real time.

> [!WARNING]
> **A different product from the public API, with different authentication.** MCP talks to Curriculo ATS and the user signs in. A public API `key_` does not reach these tools, and the public API does not reach your ATS.

## What is the Curriculo ATS MCP server?

The Curriculo ATS MCP server is a hosted endpoint, `https://mcp.curriculo.me/mcp`, that lets Claude, ChatGPT, Cursor and other MCP clients read and act on your Curriculo ATS. You sign in once with OAuth or a personal access token, then ask in plain language to review candidates, move stages, reply to applicants or schedule interviews.

## Quickstart

Use this endpoint in every MCP client:

```text
https://mcp.curriculo.me/mcp
```

The fastest path is Claude's connector flow:

1. Open **Claude**, then **Customize**, then **Connectors**.
2. Click **Add custom connector** and paste the server URL above.
3. Complete the **OAuth sign-in** when prompted. Claude connects to your organization.
4. Start a chat and ask, for example, "What's sitting in each stage of my open roles?"

> [!TIP]
> New here? Follow the step-by-step [tutorial: run your ATS in Claude](/mcp/run-your-ats-in-claude/), which walks through connecting, ranking candidates by AI fit and scheduling interviews from a chat.

<figure class="mcp-yt yt-video">
<button type="button" class="yt-facade" data-yt-id="qtnTMhgGESo" data-yt-title="You just talk, and your ATS does the work. That&#39;s the Curriculo ATS MCP" aria-label="Play video: You just talk, and your ATS does the work. That&#39;s the Curriculo ATS MCP">
<picture>
<source type="image/webp" srcset="/media/2026/10/mcp/video-poster-v2.webp">
<img src="/media/2026/10/mcp/video-poster-v2.png" alt="Claude chat beside Curriculo ATS dashboard; analytics reply shows 5 active jobs and 153 applicants" width="1920" height="1080" loading="lazy" decoding="async">
</picture>
<svg class="yt-play" viewBox="0 0 68 48" width="68" height="48" aria-hidden="true"><path d="M66.5 7.7a8.5 8.5 0 0 0-6-6C55.3.3 34 .3 34 .3s-21.3 0-26.5 1.4a8.5 8.5 0 0 0-6 6C.1 13 .1 24 .1 24s0 11 1.4 16.3a8.5 8.5 0 0 0 6 6C12.7 47.7 34 47.7 34 47.7s21.3 0 26.5-1.4a8.5 8.5 0 0 0 6-6C67.9 35 67.9 24 67.9 24s0-11-1.4-16.3z" fill="#f00"/><path d="M45 24 27 14v20z" fill="#fff"/></svg>
</button>
<noscript><p><a href="https://www.youtube.com/watch?v=qtnTMhgGESo">Watch on YouTube: You just talk, and your ATS does the work. That's the Curriculo ATS MCP</a></p></noscript>
</figure>

<script type="application/ld+json">{"@context":"https://schema.org","@type":"VideoObject","@id":"https://curriculo.me/docs/mcp/#video","name":"You just talk, and your ATS does the work. That's the Curriculo ATS MCP","description":"Demo of Curriculo ATS MCP: manage hiring from Claude and other MCP clients.","thumbnailUrl":"https://curriculo.me/media/2026/10/mcp/video-poster-v2.webp","uploadDate":"2026-06-30T12:44:05-07:00","duration":"PT3M23S","contentUrl":"https://www.youtube.com/watch?v=qtnTMhgGESo","embedUrl":"https://www.youtube-nocookie.com/embed/qtnTMhgGESo","publisher":{"@type":"Organization","@id":"https://curriculo.me/#organization","name":"Curriculo","url":"https://curriculo.me/"}}</script>

<script>(function(){function loadYt(b){if(!b||!b.dataset.ytId)return;var f=document.createElement('iframe');f.src='https://www.youtube-nocookie.com/embed/'+encodeURIComponent(b.dataset.ytId)+'?autoplay=1&rel=0';f.title=b.dataset.ytTitle||'YouTube video';f.allow='accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture';f.allowFullscreen=true;f.setAttribute('referrerpolicy','strict-origin-when-cross-origin');b.replaceChildren(f);b.removeAttribute('data-yt-id');b.setAttribute('aria-label','Playing video');}document.querySelectorAll('.yt-facade[data-yt-id]').forEach(function(b){b.addEventListener('click',function(){loadYt(b);});b.addEventListener('keydown',function(e){if(e.key==='Enter'||e.key===' '){e.preventDefault();loadYt(b);}});});})();</script>

## Connect a client

Any client that speaks Streamable HTTP works. Authenticate with OAuth 2.1 or with a personal access token sent in an `Authorization: Bearer` header. Setup for common clients follows.

### Claude

In Claude (web or desktop), go to **Customize**, **Connectors**, **Add custom connector**, then enter:

```text
https://mcp.curriculo.me/mcp
```

Click **Add**, complete the OAuth sign-in, then open the connector to enable the specific tools you want Claude to use.

<figure class="mcp-shot">
<picture>
<source type="image/webp" srcset="/media/2026/10/mcp/step1-add-connector-v2.webp">
<img src="/media/2026/10/mcp/step1-add-connector-v2.png" alt="Claude chat composer open to Connectors; Curriculo ATS listed among connectors with Add connector" width="1148" height="817" loading="lazy" decoding="async">
</picture>
<figcaption>Add the Curriculo connector in Claude: Customize → Connectors → Add custom connector.</figcaption>
</figure>

### Claude Code

Add the server with a single command. OAuth opens in your browser via `/mcp`:

```bash
claude mcp add --transport http curriculo https://mcp.curriculo.me/mcp
```

Or pass a personal access token directly with a header:

```bash
claude mcp add --transport http curriculo https://mcp.curriculo.me/mcp \
  --header "Authorization: Bearer YOUR_CURRICULO_PAT"
```

Run `/mcp` inside Claude Code to check status or trigger the OAuth login.

### Cursor

Open **Customize** in Cursor's sidebar and add this to `mcp.json`:

```json
{
  "mcpServers": {
    "curriculo": {
      "url": "https://mcp.curriculo.me/mcp"
    }
  }
}
```

Cursor shows **Needs login**. Click it to run the OAuth consent flow, and the tools turn green.

### VS Code and other clients

Any client without native remote MCP support can use the `mcp-remote` bridge:

```json
{
  "mcpServers": {
    "curriculo": {
      "command": "npx",
      "args": ["-y", "mcp-remote", "https://mcp.curriculo.me/mcp"]
    }
  }
}
```

To authenticate headlessly, append a header argument:

```json
"args": ["-y", "mcp-remote", "https://mcp.curriculo.me/mcp",
         "--header", "Authorization: Bearer YOUR_CURRICULO_PAT"]
```

### ChatGPT (Custom GPT Actions)

ChatGPT connects through a Custom GPT with Actions, using a REST surface that mirrors the 25 MCP tools.

1. In ChatGPT, create a GPT and open **Configure**, then **Actions**, then **Create new action**.
2. Import the schema from this URL:

   ```text
   https://mcp.curriculo.me/api/v2/mcp/openapi.json
   ```

3. Set **Authentication** to **OAuth**, with a client ID and secret from `https://mcp.curriculo.me/api/v2/ats/oauth/register` and these values from the schema:

   | Setting | Value |
   |---|---|
   | Authorization URL | `https://mcp.curriculo.me/api/v2/ats/oauth/authorize` |
   | Token URL | `https://mcp.curriculo.me/api/v2/ats/oauth/token` |
   | Scope | `ats:read ats:write` |

4. Save, then sign in to Curriculo ATS and approve access when the GPT first calls an action.

## Authentication

Two ways to authenticate. Both resolve to a user in one organization.

### OAuth 2.1 (recommended)

Interactive clients (Claude, Cursor, ChatGPT) use OAuth 2.1 with the authorization code flow. Dynamic client registration is supported, PKCE (S256) is required for public clients, and redirect URIs must be https. You sign in to Curriculo ATS, approve the connection, and the client stores a short-lived token it refreshes automatically. With Claude and Cursor there are no secrets to copy or rotate by hand. Server metadata is published at `https://mcp.curriculo.me/.well-known/oauth-authorization-server`.

### Personal access token

For CLI or headless setups, generate a token in the ATS and send it as a bearer header:

1. Sign in at [ats.curriculo.me](https://ats.curriculo.me).
2. Go to **Settings**, **Developers**, **Personal Access Tokens**.
3. Create a token, choose its expiry, and copy it. It is shown once.
4. Pass it as `Authorization: Bearer <token>`, as shown in the setup steps above.

### Scopes

Tokens carry one or both scopes.

| Scope | Allows |
|---|---|
| `ats:read` | List and read jobs, applicants, inbox, interviews and analytics (not enforced yet: any token can use every tool). |
| `ats:write` | Create and change data: move stages, send email, schedule interviews, update jobs. |

> [!TIP]
> Not sure who a token is acting as? Call the `whoami` tool. It returns the authenticated user, organization, auth method and granted scopes.

## Tools reference

Twenty-five tools. The access type tells you the risk:

- **Read** only looks.
- **Write** changes ATS data.
- **Write+** changes data and reaches outside: an email leaves, an invite is sent, or an AI job starts.

Seventeen of the twenty-five tools are read-only. The seven Write+ tools have outside consequences; whether the assistant confirms intent before using them depends on your client. No tool deletes a record, but `reprocess_resume` overwrites the stored AI evaluation.

### Jobs

| Tool | Access | What it does | Params |
|---|---|---|---|
| `list_jobs` | Read | Lists jobs in your organization, newest first. Optional status filter. | `status`, `page`, `limit` |
| `get_job` | Read | Full detail for one job, including its funnel stages and applicant count. | `jobId` (required) |
| `create_job` | Write+ | Creates a job and opens it immediately: it is live and accepting applications, not a draft. Default stages are Leads + Applications, Screening, Interview, Offer. Only a title is required. | `title` (required), `description`, `location`, `locations`, `location_ack_required`, `type`, `work_mode`, `headcount`, `must_have_skills`, `preferred_skills`, `salary_min`, `salary_max`, `salary_currency`, `salary_period`, `salary_public`, `ask_salary`, `experience_min`, `experience_max`, `experience_public`, `ask_experience` |
| `update_job_status` | Write+ | Changes a job's status (DRAFT, OPEN, PAUSED, CLOSED, ARCHIVED). It does not email candidates. Use it deliberately. | `jobId`, `status` (both required) |

### Applicants

| Tool | Access | What it does | Params |
|---|---|---|---|
| `list_applicants` | Read | Lists applicants, optionally for one job, with starred, rejected and archived filters. | `jobId`, `starred`, `rejected`, `archived`, `page`, `limit` |
| `get_applicant` | Read | One applicant in full: current stage, job link, notes and activity history. | `applicantId` (required) |
| `search_candidates` | Read | Plain-language search across your active candidates. Returns ranked matches with the matched skills and facts and reasoning behind each. | `query` (required), `jobId`, `timestamp`, `page`, `limit` |
| `move_applicant_stage` | Write+ | Moves someone to another stage. Triggers that stage's automations; reaching Offer may auto-close the job once headcount is met. | `applicantId`, `funnelId` (required), `reason` |
| `add_applicant_note` | Write | Adds a note, optionally tagged with a PASS or FAIL decision and the round it belongs to. Private by default. | `applicantId`, `content` (required), `noteType`, `decisionFlag`, `roundName` |
| `get_applicant_resume_text` | Read | The parsed CV content as text and fields, with no file attached. | `applicantId` (required) |
| `get_applicant_evaluation` | Read | The AI assessment: suitability score, tags, summary and gap status. | `applicantId` (required) |
| `reprocess_resume` | Write+ | Re-runs the AI pipeline on a CV (evaluate, index; parses only if not yet parsed). Runs in the background. | `applicantId` (required) |

### Inbox and email

| Tool | Access | What it does | Params |
|---|---|---|---|
| `get_applicant_email_thread` | Read | The complete conversation with one candidate, both directions. | `applicantId` (required) |
| `list_inbox_emails` | Read | Lists inbound mail, filtered by job, status or text search. | `jobId`, `status`, `search`, `page`, `limit` |
| `get_inbox_stats` | Read | Processing counts and totals. | none |
| `reply_to_applicant_email` | Write+ | Replies on the existing thread, from Curriculo's sending mailbox or from your organization's mailbox that received the conversation. No mailbox connection is needed. | `applicantId`, `body` (required), `subject` |
| `send_bulk_email` | Write+ | Sends one message to one or many candidates, for outreach or status updates, from Curriculo's sending mailbox. No mailbox connection is needed. | `applicantIds`, `subject`, `messageBody` (all required) |

### Interviews

| Tool | Access | What it does | Params |
|---|---|---|---|
| `list_interviews` | Read | Lists interviews by job, applicant, status, type or date range. | `jobId`, `applicantId`, `status`, `type`, `dateFrom`, `dateTo`, `page`, `limit` |
| `schedule_interview` | Write+ | Books the interview, adds interviewers and creates feedback links. With a calendar connected, it also creates the event, invites the candidate and generates the video link: Google Meet through a Google calendar, Microsoft Teams through a Microsoft calendar. `meetingProvider: ZOOM` generates no Zoom link. The interview is saved either way. | `applicantId`, `jobId`, `title`, `scheduledStart`, `scheduledEnd` (required), `type`, `location`, `meetingProvider`, `participantIds`, `externalInterviewers`, `timezone`, `instructions` |

### Analytics

| Tool | Access | What it does | Params |
|---|---|---|---|
| `get_analytics` | Read | Totals, stage breakdown, top jobs and source mix (all time), plus period-over-period change for a date range that defaults to month to date. | `dateFrom`, `dateTo` |
| `get_dashboard` | Read | Inbox plus a per-job funnel breakdown of everyone currently active. | none |

### Automations and imports

| Tool | Access | What it does | Params |
|---|---|---|---|
| `list_job_automations` | Read | Lists the automations configured on a job: email, interview scheduling, tagging and notifications. | `jobId` (required) |
| `get_automation_executions` | Read | Run history for an automation. | `automationId` (required), `page`, `limit` |
| `get_import_batch` | Read | Progress of a candidate import: counts and any errors. | `batchId` (required) |

### Account

| Tool | Access | What it does | Params |
|---|---|---|---|
| `whoami` | Read | Confirms which user and organization the assistant is acting as, with auth method and granted scopes. Worth running first in any session. | none |

Email tools send from Curriculo's sending mailbox, so they work without a connected mailbox. Interview scheduling also works without a calendar: it still saves the interview, but a video interview gets no meeting link and its invitations are not sent.

## Example prompts

Once connected, ask in plain language. The client picks the right tools.

- "Show me what's sitting in each stage of my open roles, and flag anything stalled."
- "Find senior React engineers with team-lead experience and summarize the top five."
- "Move Priya to Second Interview and draft a reply asking for her availability next week."
- "Schedule a 45-minute video interview with this candidate on Thursday at 2pm ET and add a Google Meet link."
- "How did applicant volume change vs last month, and which job is converting best?"

<figure class="mcp-shot mcp-shot--scroll">
<picture>
<source type="image/webp" srcset="/media/2026/10/mcp/step2-ask-counts.webp">
<img src="/media/2026/10/mcp/step2-ask-counts.png" alt="Claude reply with hiring analytics: 5 open jobs, 153 applicants by stage" width="1148" height="1890" loading="lazy" decoding="async">
</picture>
<figcaption>Ask for pipeline counts; the client calls analytics tools on your ATS.</figcaption>
</figure>

<figure class="mcp-shot mcp-shot--scroll">
<picture>
<source type="image/webp" srcset="/media/2026/10/mcp/step3-summary.webp">
<img src="/media/2026/10/mcp/step3-summary.png" alt="Claude summarizing ten Senior Frontend applicants with parsed roles and experience" width="1148" height="1656" loading="lazy" decoding="async">
</picture>
<figcaption>Summarize today's applicants for a role before you dig into resumes.</figcaption>
</figure>

<figure class="mcp-shot mcp-shot--scroll">
<picture>
<source type="image/webp" srcset="/media/2026/10/mcp/step4-screening-email.webp">
<img src="/media/2026/10/mcp/step4-screening-email.png" alt="Claude confirms two candidates moved to Screening and shows a draft screening invite email" width="1148" height="1418" loading="lazy" decoding="async">
</picture>
<figcaption>Move candidates to Screening and draft an invite - send only after you confirm addresses. Interview scheduling needs a connected Google or Microsoft calendar.</figcaption>
</figure>

<figure class="mcp-shot mcp-shot--scroll">
<picture>
<source type="image/webp" srcset="/media/2026/10/mcp/step5-questions.webp">
<img src="/media/2026/10/mcp/step5-questions.png" alt="Claude proposes three screening questions grounded in one candidate's resume projects" width="1148" height="1300" loading="lazy" decoding="async">
</picture>
<figcaption>Generate screening questions from the resume already in the ATS.</figcaption>
</figure>

> [!WARNING]
> Write tools have real side effects: sending email, changing pipelines, closing jobs. Keep tool approvals on for write actions until you trust a workflow.

## Security

- **Scoped access.** Every token is bound to one user and organization. Everything the assistant sees is limited to your own organization.
- **Least privilege.** Scopes are not enforced yet; turn off write tools in your client's tool settings for analysis.
- **Revoke anytime.** Personal access tokens can be revoked in **Settings**, **Developers**. OAuth connections can be removed from your client's connector settings.
- **Transport security.** All traffic is HTTPS over Streamable HTTP. Never paste a token into untrusted clients or share it in plain text.

Part of the [Curriculo ATS MCP hub](/mcp/), which links the setup guides, the tools reference and the connector docs.

## Next steps

- [Slack through MCP](/docs/slack/): use these tools from Slack.
- [Email Agent setup guide](/docs/email-agent/): connect your hiring inbox and calendar.
- [Curriculo ATS MCP hub](/mcp/): setup guides and the connector docs.

## FAQ and troubleshooting

### Do I need to install or host anything?

No. The server is fully hosted at https://mcp.curriculo.me/mcp. Point your client at the URL and authenticate.

### Which clients are supported?

Any MCP client that supports remote servers over Streamable HTTP, with OAuth 2.1 or a personal access token: Claude (web and desktop), Claude Code, Cursor, VS Code and others. Clients without native remote support can use the mcp-remote bridge. ChatGPT connects through a Custom GPT with Actions.

### My tools show Needs login or will not connect.

Re-run the OAuth flow (in Claude Code, type /mcp; in Cursor, click Needs login). If you use a personal access token, confirm the header is exactly Authorization: Bearer <token> and the token has not been revoked or expired.

### Do email tools need a connected mailbox?

No. send_bulk_email and reply_to_applicant_email send from Curriculo's sending mailbox. A reply goes out from your organization's mailbox when that mailbox received the conversation. To send from your own address in general, see the Email Agent setup guide.

### Does schedule_interview create Zoom links?

No. Video links come from a connected calendar: Google Meet with Google, Microsoft Teams with Microsoft. Without a calendar, the interview is saved with no link.

### How do I limit what the AI can do?

Use your client's per-tool permission settings to disable specific write tools.

### Which organization does it act on?

The one tied to your token. Call whoami to confirm the user, organization and scopes at any time.
