RecruitMCP
RecruitMCP为AI代理和开发者提供招聘数据:通过REST API或MCP搜索人员和公司、丰富档案,并查找电子邮件和电话。
托管 MCP 服务器
npx add-mcp 'https://mcp.recruitmcp.com/mcp'可安装到 Claude Code、Codex、Cursor 等客户端
文档
MCP setup
Clients that speak MCP call this server over Streamable HTTP.
Endpoint
Production URL, and the same server on this origin at /mcp and /api/mcp.
https://mcp.recruitmcp.com/mcp
Auth
- API key header:
Authorization: Bearer rmcp_live_…. Olderrapi_live_keys still work. - claude.ai uses OAuth. Paste the API key on the consent page.
- For a customer, send
RecruitMCP-Customer: cus_…. - A key bound to that customer does the same job.
Clients
A client that speaks Streamable HTTP uses the MCP URL and an API key. A client that does not speak MCP uses the REST API at https://api.recruitmcp.com with the same key. The prices, scopes, and errors match. These notes name the URL and the header. They do not describe a product's screens.
Never put the API key in browser code or in version control. Keep it in a server-side environment variable or a secret store. Config files below are for the local machine only.
Pick your app.
Add a custom connector, then approve it with your key on the RecruitMCP page.
- In Claude, open Customize > Connectors. Open connector settings
- Click + Add, then Add custom connector.
- Name:
RecruitMCP. MCP server URL:https://mcp.recruitmcp.com/mcp. Click Continue. Copy - Under Authentication, choose Sign in now. If Claude asks how it identifies itself, choose Register automatically. Leave request headers empty, then click Add.
- Click Connect. On the Connect to RecruitMCP page, paste your API key, keep the permissions and click Approve. Claude gets a short-lived token, never your key.
- In a chat, click +, open Connectors and switch RecruitMCP on. Then ask:
CopyUse RecruitMCP to run a free dry run of a search for backend engineers in London. Show me the estimate, and don't run the live search.
A connector you add works on claude.ai and in Claude Desktop. On the Free plan you can add one custom connector. On Team and Enterprise, an Owner adds it once in Organization settings > Connectors, then each member clicks Connect.
Full setup and troubleshooting
Claude
claude.ai and Claude Desktop add a custom connector and sign in with OAuth. Claude Code takes one command in the terminal.
claude.ai and Claude Desktop
- In Claude, open Customize > Connectors. Open connector settings
- Click + Add, then Add custom connector.
- Name:
RecruitMCP. MCP server URL:https://mcp.recruitmcp.com/mcp. Click Continue. - Under Authentication, choose Sign in now. If Claude asks how it identifies itself, choose Register automatically. Leave request headers empty, then click Add.
- Click Connect. On the Connect to RecruitMCP page, paste your API key, keep the permissions and click Approve. Claude gets a short-lived token, never your key. Permissions your key doesn't hold are left out of the connection.
- In a chat, click +, open Connectors and switch RecruitMCP on.
A connector you add works on claude.ai and in Claude Desktop. On the Free plan you can add one custom connector. On Team and Enterprise, an Owner adds it once in Organization settings > Connectors, then each member clicks Connect.
Claude Desktop config file
Without a connector, Claude Desktop can start mcp-remote from claude_desktop_config.json. -y lets npx install it without a prompt.
{
"mcpServers": {
"recruitmcp": {
"command": "npx",
"args": [
"-y",
"mcp-remote",
"https://mcp.recruitmcp.com/mcp",
"--header",
"Authorization:${AUTH_HEADER}"
],
"env": {
"AUTH_HEADER": "Bearer YOUR_API_KEY"
}
}
}
}
Replace YOUR_API_KEY in AUTH_HEADER with your API key. Claude Desktop does not expand a variable. The first start of mcp-remote can take 10 to 15 seconds.
Claude Code
Put the key in an environment variable in your terminal, then add the server. The single quotes save a reference to the variable, so the key stays out of the Claude Code config.
export RECRUITMCP_KEY='rmcp_live_...'
claude mcp add --transport http recruitmcp https://mcp.recruitmcp.com/mcp --scope user --header 'Authorization: Bearer ${RECRUITMCP_KEY}'
Or write .mcp.json in the project:
{
"mcpServers": {
"recruitmcp": {
"type": "http",
"url": "https://mcp.recruitmcp.com/mcp",
"headers": {
"Authorization": "Bearer ${RECRUITMCP_KEY}"
}
}
}
}
ChatGPT
Custom MCP servers in ChatGPT work on the web. ChatGPT's help pages list full support on Business, Enterprise and Edu. Pro connects read and fetch tools only. On Business, only admins and owners can add one.
- In ChatGPT on the web, go to Plugins.
- Select the plus button, then Add custom MCP server.
- Name:
RecruitMCP. Under Connection, enterhttps://mcp.recruitmcp.com/mcp. - For authentication, choose OAuth.
- Tick I understand and want to continue, then select Create as a plugin.
- On the Connect to RecruitMCP page, paste your API key, keep the permissions and click Approve.
- Install the plugin, start a new chat, type @, pick RecruitMCP and ask your question.
Without a custom MCP server, call the REST API at https://api.recruitmcp.com with the same key.
Cursor
Cursor MCP settings, or .cursor/mcp.json in a project. The URL is remote Streamable HTTP, so the entry is url plus headers. Remote servers do not use env or envFile. The header is Bearer ${env:RECRUITMCP_KEY}. Cursor reads the variable from its own environment, so open Cursor from a terminal where RECRUITMCP_KEY is set, or paste the key into the header. A shell $RECRUITMCP_KEY in this file is left as text.
{
"mcpServers": {
"recruitmcp": {
"url": "https://mcp.recruitmcp.com/mcp",
"headers": {
"Authorization": "Bearer ${env:RECRUITMCP_KEY}"
}
}
}
}
Codex
- Put your key in an environment variable in your terminal:
To keep it for new terminals, add the same line to ~/.zshrc or ~/.bashrc. On Windows, runexport RECRUITMCP_KEY='rmcp_live_...'setx RECRUITMCP_KEY "rmcp_live_..."and open a new terminal. - Add RecruitMCP:
Codex saves only the variable name in ~/.codex/config.toml, never your key. Or add this to ~/.codex/config.toml yourself:codex mcp add recruitmcp --url https://mcp.recruitmcp.com/mcp --bearer-token-env-var RECRUITMCP_KEY[mcp_servers.recruitmcp] url = "https://mcp.recruitmcp.com/mcp" bearer_token_env_var = "RECRUITMCP_KEY" - Start
codexin the same terminal and type/mcpto check that recruitmcp is listed. Then ask:Use RecruitMCP to run a free dry run of a search for backend engineers in London. Show me the estimate, and don't run the live search.
The Codex IDE extension reads the same ~/.codex/config.toml, so there is nothing to add twice. Open your editor from the terminal where RECRUITMCP_KEY is set (for example code .), so the extension sees the key. In the extension, open the gear menu, then MCP servers, to check that recruitmcp is on.
Codex troubleshooting
- "Environment variable RECRUITMCP_KEY for MCP server 'recruitmcp' is not set": Codex started without the variable. Set it in your terminal, quit Codex, and start it again from that terminal. For the IDE extension, quit the editor completely and open it from that terminal.
codex mcp listshows recruitmcp with "Bearer token", but tools don't appear:codex mcp listreads your config only and doesn't connect. Use/mcpinsidecodexto see the live connection.- A 401 from the server: the variable holds a revoked or mistyped key. Use a live key that starts with
rmcp_live_. Lost your key? Create a new one at https://recruitmcp.com/app/keys. - To start over:
codex mcp remove recruitmcp, then add it again. - Project setup: put the same TOML block in
.codex/config.tomlin the project. Codex reads it in trusted projects only. It holds only the variable name, so it is safe to commit.
Lovable
When a Lovable project can attach a remote MCP server, use https://mcp.recruitmcp.com/mcp and paste the header Authorization: Bearer plus the key. When it cannot, call the REST API at https://api.recruitmcp.com with the same key.
Base44
Base44's AI chat can call a custom MCP server while you build (Builder plan or higher). In Base44, open Account preferences, then Builder, then MCP Connections, and choose Add custom MCP. Enter a name and the URL https://mcp.recruitmcp.com/mcp. Under Authentication, add a custom header named Authorization with the value Bearer plus the key. Click Test, then Test & add. These connections are for the editor chat only: a published Base44 app does not call MCP servers. For live data in a published app, call the REST API at https://api.recruitmcp.com with the same key from server-side code, never from the browser.
Perplexity
The Perplexity app and the Agent API can call this remote server. In the app, add a custom remote connector. The MCP server URL is https://mcp.recruitmcp.com/mcp. Transport is Streamable HTTP. Authentication is API key: paste the key. The header this server accepts is Authorization: Bearer plus the key. Perplexity does not expand a shell variable. OAuth is also offered in that form. This server publishes the protected-resource metadata.
Local MCP in the Mac app runs a command on that Mac and does not use this URL. Comet's help pages do not document a remote MCP connector.
On the Agent API, set authorization to the key. Perplexity passes that token to this server.
curl https://api.perplexity.ai/v1/agent \
-H "Authorization: Bearer $PERPLEXITY_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "openai/gpt-5.6-sol",
"input": "Find backend engineers in New York.",
"tools": [{
"type": "mcp",
"server_label": "recruitmcp",
"server_url": "https://mcp.recruitmcp.com/mcp",
"authorization": "<key>"
}]
}'
Replit
When Replit can attach a remote MCP server, use https://mcp.recruitmcp.com/mcp and paste the header Authorization: Bearer plus the key. When it cannot, call the REST API at https://api.recruitmcp.com with the same key.
Grok Bot
When a Grok bot can call a remote MCP server, use https://mcp.recruitmcp.com/mcp and paste the header Authorization: Bearer plus the key. When it cannot, call the REST API at https://api.recruitmcp.com with the same key.
LangChain and LangGraph
The langchain-recruitmcp package loads these tools as LangChain tools and reads the key from RECRUITMCP_KEY. Options and a tool listing example are on LangChain and LangGraph.
pip install "langchain>=1.0" langchain-openai langchain-recruitmcp
import asyncio
from langchain.agents import create_agent
from langchain_recruitmcp import RecruitMCPToolkit
async def main():
tools = await RecruitMCPToolkit().aget_tools()
agent = create_agent("openai:gpt-4.1-mini", tools=tools)
result = await agent.ainvoke({"messages": [{"role": "user", "content": "Find backend engineers in Berlin, Germany. Dry run only."}]})
print(result["messages"][-1].content)
asyncio.run(main())
Tools
An unset key uses 500 credits as the MCP approval threshold. A call above that returns approval_required and a confirm token, and charges nothing. Read Execution, preview and approval before the first live search.
Tools are grouped by the job they do. Each one links to the HTTP endpoint it calls. Search, profile, company, and contact tools run when the key allows them. confirm does not change those calls. Sends still need confirm=true. A repeated call with the same arguments replays the first answer.
| Task | MCP tool | REST | Scope | Cost and side effect |
|---|---|---|---|---|
| Search people | search_people | POST /v1/people/search | sourcing:spend | Up to limit × 1 credit per profile returned. Default limit is 25. A profile already billed in this workspace is free. An empty result is free. dry_run spends nothing, and its credits_max equals limit. Runs when the key allows it. Charges for what comes back. confirm is accepted and ignored. |
| Match a person by name and company | match_person | POST /v1/people:match | sourcing:spend | 1 credit when exactly one person matches, the first time only. Ambiguous and no-match results are free. Runs when the key allows it. Charges for what comes back. confirm is accepted and ignored. |
| Resolve a place | resolve_location | GET /v1/lookups/locations | sourcing:read | Free. A place this server has not seen before is looked up and cached, and this call never charges. Reads. No charge. |
| Resolve an area | resolve_area | GET /v1/lookups/areas | sourcing:read | Free. Reads. No charge. |
| Resolve companies | resolve_companies | POST /v1/companies:resolve | sourcing:spend | 1 credit when a company is found live, unless the profile source marks that lookup free. A lookup with no result, a cache hit, or a built-in company is free. Runs when the key allows it. Charges for what comes back. confirm is accepted and ignored. |
| List filter values | list_filter_values | GET /v1/lookups/industries, GET /v1/lookups/seniorities, GET /v1/lookups/experience-ranges, GET /v1/lookups/functions, GET /v1/lookups/languages, GET /v1/lookups/headcounts | sourcing:read | Free. Reads. No charge. |
| Enrich profiles | enrich_profiles | POST /v1/people:enrich | sourcing:spend | 2 credits per live profile that is found. The profile does not include email or phone. Cached profiles, missing profiles, and suppressed people are free. Runs when the key allows it. Charges for what comes back. confirm is accepted and ignored. |
| Enrich profiles (older alias) | lookup_people | POST /v1/people:enrich | sourcing:spend | 2 credits per live profile that is found. The profile does not include email or phone. Cached profiles, missing profiles, and suppressed people are free. Runs when the key allows it. Charges for what comes back. confirm is accepted and ignored. |
| Get a profile enrich job | get_people_job | GET /v1/jobs/{job_id} | sourcing:read | Free. Reads. No charge. |
| Find email and phone | find_contact_details | POST /v1/people/contacts:fetch | contacts:spend | A found contact costs 25 credits. A miss is free. dry_run=true returns the estimate and charges nothing. Runs when the key allows it. Charges for what comes back. confirm is accepted and ignored. |
| Save people to a list | save_to_list | POST /v1/lists, POST /v1/lists/{list_id}/items | lists:write, sourcing:spend | Free. Writes workspace data. No credits. |
| List saved lists | list_lists | GET /v1/lists | sourcing:read | Free. Reads. No charge. |
| Get a list | get_list | GET /v1/lists/{list_id}, GET /v1/lists/{list_id}/items, GET /v1/lists/{list_id}/export | sourcing:read | Free. Reads. No charge. |
| Record candidate status | set_candidate_status | POST /v1/seen | lists:write, sourcing:spend | Free. Writes workspace data. No credits. |
| Check the seen register | check_candidates | POST /v1/seen:check | sourcing:read | Free. Reads. No charge. |
| Account overview | get_account_overview | GET /v1/billing/balance, GET /v1/usage | account:read | Free. Reads. No charge. |
| Billing history | list_billing_transactions | GET /v1/billing/transactions | account:read | Free. Reads. No charge. |
| Auto-refill settings | get_auto_refill | GET /v1/billing/auto-refill | account:read | Free. Reads. No charge. |
| Set auto-refill | set_auto_refill | PUT /v1/billing/auto-refill, DELETE /v1/billing/auto-refill | billing:manage | Free. Writes workspace data. No credits. |
| Read the guide | get_guide | No HTTP call | Reads. No charge. | |
| Suppress a person | add_suppression | POST /v1/suppressions | privacy:write | Free. Writes a suppression. Needs privacy:write. No credits. |
| List events | list_events | GET /v1/events | account:read | Free. Reads. No charge. |
Discovery and search
search_people
Search people
Profiles for a filter set. limit is how many to return, from 1 to 100, default 25. Pass next_cursor back as cursor to continue. Runs when the key allows it and charges one credit per profile returned, once per workspace. Profiles not returned are not charged. A search that does not finish in time returns 504 and charges nothing. confirm is accepted and ignored. dry_run previews the cost and charges nothing. The search field is free text over headline, current title, and skills, with OR, AND, NOT, and quotes. skills is not a filter. Several geo_ids are interleaved. Above the key's approval threshold the response is approval_required with an estimate and confirm_token; send that token to run the same filters. Suppressed people are always removed and counted in omitted.suppressed. People already seen are marked already_seen; exclude_seen drops them. An empty result costs nothing. profile_id is the search id. alternate_id is the other profile id for the same person, and it is null until that person has been enriched. total_elements is an estimate from before the location filter.
match_person
Match a person by name and company
Find one person by name and current company. Runs when the key allows it. Charged one lead credit only when exactly one person matches, and only the first time; ambiguous and no-match outcomes are free. confirm is accepted and ignored. Above the key's approval threshold the response is approval_required with confirm_token.
resolve_location
Resolve a place
Free. Free text to numeric location ids for people search, including a place this server has not seen before. "UK" is the United Kingdom. prefer_area returns the metropolitan area for radius searches. This call never charges.
resolve_area
Resolve an area
Free. Anchor places and radius_km become at most 12 location ids. Under 20 km only the anchor city is used. The search index has no radius: pass geo_ids as the location filter.
resolve_companies
Resolve companies
Company names to company URLs for people search. Runs when the key allows it. A cache hit, a company on the built-in list, and a lookup with no result are free. A company found live costs 1 credit, unless the profile source marks that lookup free. confirm is accepted and ignored. Above the key's approval threshold the response is approval_required with confirm_token.
Profile and contact enrichment
lookup_people
Enrich profiles (older alias)
Deprecated alias of enrich_profiles. Same arguments and the same result. Prefer enrich_profiles. Does not return email or phone.
get_people_job
Get a profile enrich job
Free. Status of an enrich_profiles job. wait_seconds waits up to 25 seconds for it to finish. When completed, data holds the profiles.
find_contact_details
Find email and phone
Email and phone, with a confidence score, for up to 100 people you already fetched. Each email includes type work or personal when the lookup provides it. Each result includes best_email and best_phone. best_email prefers personal, then an unlabeled address, then work. prefer is personal or work and defaults to personal. best_phone prefers a mobile number. The emails and phones lists stay complete. A flagged entry stays in the list with flagged true and flag_reason, and is left out of best_email and best_phone. Runs when the key allows it. 25 credits per person where an email or phone is found; a miss is free. One charge covers both email and phone. confirm is accepted and ignored. Above the key's approval threshold the response is approval_required with confirm_token, and nothing is looked up until you send that token. idempotency_key matches the REST Idempotency-Key header: the same key returns the current result and does not look up or charge again. A replay has cost.credits 0 and charged_this_request 0, like every replay; per-person credits still show what that lookup charged. The reserved id test_miss_0000 always returns not_found and charges 0.
Lists
save_to_list
Save people to a list
Free. Add people to a named list, created when the name is new. Send items. The same person is not added twice.
list_lists
List saved lists
Free. Lists in this workspace with their size.
get_list
Get a list
Free. A list and a page of its people. format csv returns the whole list as CSV text, not a JSON string.
set_candidate_status
Record candidate status
Free. Write candidate status on the seen register: seen, shortlisted, contacted, rejected, or do_not_contact, with optional tags and a note. Searches return those people with already_seen true unless exclude_seen is true. Default is false on REST and MCP.
check_candidates
Check the seen register
Free. For each person (profile_url, profile_id, or full_name with current_employer), whether they are in the seen register and with which status, in input order.
Account and billing
get_account_overview
Account overview
Free. Balance by source, next expiries, spend over the last 30 days by purpose, the key's scopes and daily cap, and the selected customer.
list_billing_transactions
Billing history
Free. Credit grants, purchases, usage, and expiries, newest first. Pass next_cursor as cursor.
get_auto_refill
Auto-refill settings
Free. Whether auto-refill is on, the balance threshold, the monthly caps, and whether a card is on file. Account keys only.
set_auto_refill
Set auto-refill
Turns auto-refill on or off. When the balance is below threshold_credits, the worker buys the €99 pack of 7,500 credits off-session, up to max_refills_per_month and max_eur_per_month. A card must already be on file from a pack checkout. Credits land only after the payment succeeds. Account keys with billing access only.
get_guide
Read the guide
Free. Rules, prices, recipes, and filters. Read overview before the first search and costs before spending.
Reads recruitmcp://guide. It does not call an HTTP endpoint.
Example prompt
Find senior backend engineers in London who list Go and have at least 5 years of experience.
Use resolve_location for London, then search_people.
The search runs. Show the people and cost.credits.
If the tool returns approval_required, show the estimate and wait.
List initials, current title, company, and city. Do not invent a score.
Check the connection
A tools/list call should include search_people and save_to_list when the key has those scopes. tools/list omits a tool the key or token cannot run. The Accept header below is required; without it the server answers 406.
curl -sS -X POST https://mcp.recruitmcp.com/mcp \
-H "authorization: Bearer $RECRUITMCP_KEY" \
-H "content-type: application/json" \
-H "accept: application/json, text/event-stream" \
-d '{"jsonrpc":"2.0","id":1,"method":"tools/list","params":{}}'
Troubleshooting
- 401 unauthorized. The bearer key is missing, expired, or not a workspace key.
- 402 insufficient_credits. Stop and add credits. Do not retry the same spend.
- approval_required. The estimate is above the key's approval threshold. Nothing was charged. Send confirm_token to run the same call. Outreach sends still need confirm=true.
- 409 idempotency_key_reused. The same key was sent with a different body. Use a new key for a new request.
- A tool you expected is missing. tools/list returns only tools this key or token has a scope for, and only the toolsets on the URL. set_auto_refill needs billing:manage, which OAuth does not grant.
- 406. Send Accept: application/json, text/event-stream.
- 429 rate_limited. Wait for Retry-After. The default limit is 120 requests per minute.