Curriculo ATS MCP server
On this page
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.
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 everywhere:
https://mcp.curriculo.me/mcpThe fastest path is Claude's connector flow:
- Open Claude, then Settings, then Connectors.
- Click Add custom connector and paste the server URL above.
- Complete the OAuth sign-in when prompted. Claude connects to your organization.
- Start a chat and ask, for example, "What's sitting in each stage of my open roles?"
New here? Follow the step-by-step tutorial: run your ATS in Claude, with screenshots that walk through connecting, ranking candidates by AI fit and scheduling interviews from a chat.
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 Settings, Connectors, Add custom connector, then enter:
https://mcp.curriculo.me/mcpClick Add, complete the OAuth sign-in, then open the connector to enable the specific tools you want Claude to use.
Claude Code
Add the server with a single command. OAuth opens in your browser via /mcp:
claude mcp add --transport http curriculo https://mcp.curriculo.me/mcpOr pass a personal access token directly with a header:
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 Cursor Settings, Tools & MCP, New MCP Server and add this to mcp.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:
{
"mcpServers": {
"curriculo": {
"command": "npx",
"args": ["-y", "mcp-remote", "https://mcp.curriculo.me/mcp"]
}
}
}To authenticate headlessly, append a header argument:
"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.
In ChatGPT, create a GPT and open Configure, then Actions, then Create new action.
Import the schema from this URL:
https://mcp.curriculo.me/api/v2/mcp/openapi.jsonSet Authentication to OAuth, with these values from the schema:
Setting Value Authorization URL https://mcp.curriculo.me/api/v2/ats/oauth/authorizeToken URL https://mcp.curriculo.me/api/v2/ats/oauth/tokenScope ats:read ats:write(or onlyats:read)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 with scoped permissions.
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. 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:
- Sign in at ats.curriculo.me.
- Go to Settings, API & Integrations, Personal Access Tokens.
- Create a token, choose its scopes, and copy it. It is shown once.
- Pass it as
Authorization: Bearer <token>, as shown in the setup steps above.
Scopes
Tokens carry one or both scopes. Grant only what you need.
| Scope | Allows |
|---|---|
ats:read | List and read jobs, applicants, inbox, interviews and analytics. |
ats:write | Create and change data: move stages, send email, schedule interviews, update jobs. |
Not sure who a token is acting as? Call the
whoamitool. 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 six Write+ tools have outside consequences, and the assistant confirms intent before using them. No tool deletes anything.
Jobs
| Tool | Access | What it does | Params |
|---|---|---|---|
list_jobs | Read | Lists jobs in your organization, most recently updated 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, type, headcount, must_have_skills, preferred_skills, salary_min, salary_max, salary_currency |
update_job_status | Write+ | Changes a job's status (DRAFT, OPEN, PAUSED, CLOSED, ARCHIVED). Closing or pausing can email candidates who have not reached Offer, when candidate notices are enabled; unsubscribed and live-interview applicants are skipped. 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 the whole candidate pool. Returns ranked matches with the CV passages 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 gaps. | applicantId (required) |
reprocess_resume | Write+ | Re-runs the full AI pipeline on a CV (parse, evaluate, index). 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 | Unread 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 is stored as a label only and generates no 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, period-over-period change, stage breakdown, top jobs and source mix. Last 30 days by default. | 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: per-file status 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 and reports that invites were 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?"
Write tools have real side effects: sending email, changing pipelines, closing jobs. Keep tool approvals on for write actions until you trust a workflow, and grant only
ats:readif you just want analysis.
Security
- Scoped access. Every token is bound to one user and organization and carries explicit
ats:readorats:writescopes. Everything the assistant sees is limited to your own organization. - Least privilege. Grant the narrowest scope that does the job; prefer read-only tokens for analysis.
- Revoke anytime. Personal access tokens can be revoked in Settings, API & Integrations. 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, which links the setup guides, the tools reference and the connector docs.
Next steps
- Slack through MCP: use these tools from Slack.
- Email Agent setup guide: connect your hiring inbox and calendar.
- Curriculo ATS MCP hub: 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?
Issue a token with only ats:read for analysis-only access, and 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.
Updated