Overview
The MCP server is a stateless remote server at https://mcp.cazvid.com/mcp. Point any MCP client at it (Claude Code, Claude.ai custom connectors, ChatGPT developer mode, Cursor, VS Code) and the agent gets fifteen tools that wrap CazVid's public Job Builder, Candidate Search, Webhooks, Job Search, and CRM APIs. The server holds no secrets: it forwards your CazVid API key to the upstream API, and all quota and plan enforcement happens upstream.
One endpoint, Streamable HTTP only
All traffic is a POST to the single /mcp endpoint using the Streamable HTTP transport. GET /mcp returns 405 (the server opens no server-initiated stream). There is no SSE-only or stdio transport.
Connect a client
Provide your CazVid API key one of two ways. Both hit the same validation path; pick the one your client supports.
Header auth (Claude Code, Cursor, VS Code)
Clients that can set request headers send the key as Authorization: Bearer <key> or x-api-key: <key> on POST /mcp. This is the primary form.
Authorization: Bearer cazvid_jb_...
x-api-key: cazvid_jb_...Claude Code (CLI)
claude mcp add --transport http cazvid https://mcp.cazvid.com/mcp \
--header "Authorization: Bearer cazvid_jb_YOUR_KEY"Cursor (~/.cursor/mcp.json)
{
"mcpServers": {
"cazvid": {
"url": "https://mcp.cazvid.com/mcp",
"headers": { "Authorization": "Bearer cazvid_jb_YOUR_KEY" }
}
}
}VS Code (.vscode/mcp.json)
{
"servers": {
"cazvid": {
"type": "http",
"url": "https://mcp.cazvid.com/mcp",
"headers": { "Authorization": "Bearer cazvid_jb_YOUR_KEY" }
}
}
}URL path form (Claude.ai connectors, ChatGPT)
Connector UIs that expose only a URL field and cannot set headers use the path-key form POST /mcp/<key>. In Claude.ai add it under Settings > Connectors > Add custom connector; in ChatGPT enable developer mode, add a connector with authentication set to No authentication, and paste the URL.
https://mcp.cazvid.com/mcp/cazvid_jb_YOUR_KEY- The URL then contains your credential. Keep it private - anyone with the URL can spend your quota.
- Rotate or revoke it anytime in the CazVid app under Profile > Developer API; the old URL stops working immediately.
- The server sets
Referrer-Policy: no-referreron every response and never logs URLs, headers, or keys.
Query-string keys (for example ?key=...) are ignored - the call proceeds keyless. Use a header or the path segment.
Tools
Every family's tools are exposed as one flat list. preview_job and create_job cover job posting; search_candidates covers candidate search; list_webhook_endpoints covers webhooks; search_jobs covers job search; the nine crm_* tools cover the CRM; list_api_usage reports all five families' quotas.
| Tool | What it does | Quota |
|---|---|---|
| preview_job | Generate a job draft (title, work mode, salary, optional description) from a prompt. Nothing is saved. | Job Builder: 1 of 10/day |
| create_job | Create a real job. Defaults to a reviewable draft; publishes for CazVid's normal review only on explicit instruction. Content-derived idempotency makes retries safe. | Job Builder: 1 of 10/day |
| list_api_usage | Report all five families' quotas (used, remaining, reset time). Consumes nothing. | Free |
| search_candidates | Read-only search of the candidate pool with a plain-language query plus optional filters. Results carry no contact details. | Candidate Search: 1 of 100/day |
| list_webhook_endpoints | Read-only list of the organization's webhook endpoints, with each one's URL, status, subscribed events, and timestamps. Never returns signing secrets. | Free |
| search_jobs | Read-only search of public CazVid job posts with a plain-language query plus optional filters. Each result carries an applyUrl and no hiring-manager contact details. | Job Search: 1 of 500/day |
| crm_search_contacts | Read-only list or search of your CRM contacts, returning compact rows plus the contact id. Emails and phones are withheld here; paginated on a hasMore flag. | CRM: 1 of 500/day |
| crm_get_contact | Read-only full detail of one CRM contact by id, including every email and phone with its label, tags, and resume state. | CRM: 1 of 500/day |
| crm_upsert_contact | Create a CRM contact; only a name is required. De-duplicates by email or phone within the workspace, so a repeat call that carries one of those returns the existing contact and a retry is safe. A name-only create has no de-duplication key, so retrying it can produce a second contact. | CRM: 1 of 500/day |
| crm_update_contact | Update fields on an existing CRM contact. Send only what changes; emails and phones are capped to one each and replace the primary slot rather than appending. | CRM: 1 of 500/day |
| crm_delete_contact | Soft-delete a CRM contact. Archives it and removes its interactions and list memberships. Destructive, so call it only on an explicit request. | CRM: 1 of 500/day |
| crm_log_interaction | Append a timeline entry (email, call, interview, note) to a CRM contact, using a type name from the fixed taxonomy. Never de-duplicated, so do not blindly retry. | CRM: 1 of 500/day |
| crm_list_interactions | Read-only timeline of one CRM contact's interactions, newest first, each with its type, date, note, and tags. Paginated on a hasMore flag. | CRM: 1 of 500/day |
| crm_list_interaction_types | Read-only list of the valid interaction-type names for `crm_log_interaction`, grouped by category. The taxonomy is a fixed global list. | CRM: 1 of 500/day |
| crm_upload_resume | Attach a PDF, DOC, or DOCX resume (inline base64, up to 10 MB) to a CRM contact and queue it for parsing. Parsing is asynchronous and fills only the contact's empty fields. | CRM: 1 of 500/day, plus 1 of 50/key/day uploads |
create_job defaults to a reviewable draft and publishes only when you explicitly ask it to. Its idempotency key is derived from the request content, so retrying with identical arguments within 24 hours returns the already-created job instead of a duplicate. search_candidates is read-only and returns no contact details. list_webhook_endpoints is read-only and never returns signing secrets; endpoints are created, verified, rotated, and deleted in the CazVid app or the REST API. search_jobs is read-only and returns public job posts, each with an applyUrl and never any hiring-manager contact details. In the CRM, crm_upsert_contact de-duplicates by email or phone within the workspace, so a retry that carries one of those returns the existing contact rather than a duplicate (a name-only create has no de-duplication key, so retrying it can produce a second contact); crm_log_interaction is never de-duplicated, so do not blindly retry a call that may already have succeeded; and crm_delete_contact is a soft delete that archives the contact along with its interactions and list memberships.
Quotas and keys
The MCP server uses the same CazVid Developer API key and the same per-organization daily quotas as the REST APIs. There is nothing new to provision.
- Job Builder: 10 successful
preview_joborcreate_jobcalls per organization per UTC day. - Candidate Search: 100
search_candidatescalls per organization per UTC day, plus a 20-per-minute burst limit. - Webhooks:
list_webhook_endpointsconsumes no quota. The webhook family's cap is on event deliveries, not on this tool - up to 5,000 deliveries per organization per day. - Job Search: 500
search_jobscalls per organization per UTC day, plus a 30-per-minute burst limit. - CRM: 500
crm_*calls per organization per UTC day, plus a 30-per-minute burst limit. This is a separate quota from the other families, and every metered call counts, reads included.crm_upload_resumealso consumes 1 of a separate resume-upload quota of 50 per API key per UTC day. list_api_usageconsumes no quota and reports all five families' used, remaining, and reset times.- All quotas reset at UTC midnight. A rate-limited tool call returns the reset time and points you at
list_api_usage. - Keys come from Profile > Developer API in the CazVid app. The job-search scope is free - any registered CazVid account can mint a key for it. The job-builder, candidate-search, and crm scopes require a Platinum, Diamond, or Enterprise plan, and webhooks require a Platinum plan or higher. One key can carry every scope your plan allows.
For the full request and response contracts, see the Job Builder API docs, the Candidate Search API docs, the Webhooks API docs, the Job Search API docs, and the CRM API docs.
Connecting without a key
Connecting and listing tools works without a key so connector setup never breaks. Calling a tool without a key does not error hard - it returns clear guidance on how to add your key.
- The handshake (
initialize) andtools/listsucceed with no key, so a client can complete setup and show the fifteen tools. - A tool call made without a key returns a readable message explaining how to connect, not a protocol error.
- Once a key is supplied (header or path form), the same tool call runs against your organization's quota.