Getting Started
Step 1 — generate your API key
Nothing works until your SignalHire account has an API key. Generate it once:Open your profile
Open the Integrations section
Generate the key
- An active SignalHire account (see the account rules under Authentication)
- Contact credits, if you plan to reveal emails and phone numbers
Starter prompts
Once connected, paste one of these to get a real result on the first try. None of them spends a Contact Credit:Connection Details
Authentication
The server is a stateless proxy — it stores no global key and forwards your credential per request. It detects the token type automatically.https://signalhire.eu.auth0.com/). When you add the connector, the client (Claude or ChatGPT) discovers the authorization server via RFC 9728 metadata, you log in and consent on the SignalHire/Auth0 screen, and the client receives a token — no API key is entered by hand. Expired tokens return 401 and the client refreshes them automatically.Connecting via JSON (API key)
There are two JSON connection types depending on whether your client can talk to a remote server directly.Type 1 — Direct HTTP (Claude Code, Cursor, Windsurf, VS Code)
Type 1 — Direct HTTP (Claude Code, Cursor, Windsurf, VS Code)
Type 2 — mcp-remote bridge (Claude Desktop and stdio-only clients)
Type 2 — mcp-remote bridge (Claude Desktop and stdio-only clients)
npx mcp-remote runs locally and bridges stdio to the remote HTTP endpoint. Requires Node.js installed.- macOS:
~/Library/Application Support/Claude/claude_desktop_config.json - Windows:
%APPDATA%\Claude\claude_desktop_config.json
Which type do I use?
Claude.ai / Claude Desktop — Custom Connector (OAuth)
Open Connectors settings
Enter the endpoint URL
https://mcp.signalhire.services/mcpConnect
ChatGPT — app directory
Open the directory listing
Connect
Authenticate
Verify the tools
Authorization: Bearer YOUR_SIGNALHIRE_API_KEY).Codex — TOML config (API key)
Codex speaks Streamable HTTP to remote MCP servers and reads its config from~/.codex/config.toml (or a project-scoped .codex/config.toml). Get your key from the API integrations page.
bearer_token_env_var makes Codex send Authorization: Bearer <value> — exactly what this server expects, and it keeps the key out of the config file. To register the server from the CLI instead of editing TOML:
codex mcp login — SignalHire’s authorization server issues OAuth clients for the Claude and ChatGPT directory listings, not for arbitrary clients registering themselves.n8n — MCP Client Tool node
Add the node
Set the transport
HTTP Streamable.Enter the endpoint
https://mcp.signalhire.services/mcpAuthenticate
Bearer Auth and paste your SignalHire API key as the token. If your n8n version only offers Header Auth, use header name Authorization and value Bearer YOUR_SIGNALHIRE_API_KEY — both produce the same request.Wire it up
Any other MCP client
Not on the list above? Anything that speaks MCP over Streamable HTTP will work — there is nothing client-specific on our side. Point it at:mcp-remote bridge from Type 2 above.
Claude Code — CLI
Python SDK (programmatic)
- MCP client directly
- Anthropic SDK (MCP connector)
Available Tools
Once connected, your AI assistant can call the following tools and decides which to use based on your prompt.search_candidates_query, scroll_search, retrieve_person_no_contacts, retrieve_person_profile, get_company_info — accept a response_format parameter (default "markdown"); set it to "csv" or "json" as needed. find_company, the two balance tools and the three dictionary tools do not take it.Credits: the remaining balance is automatically appended to the tool’s response — no separate balance check is needed after each call.Search & Discovery
(Software AND Engineer)). Parameters: current_title, current_past_title, location, current_company, current_past_company, full_name, keywords, industry, industries, department (Enum), level (Enum), years_experience_from, years_experience_to, years_current_past_experience_from, years_current_past_experience_to, open_to_work, exclude_revealed, exclude_watched, exclude_in_lists, exclude_in_progress, exclude_emailed, size (default: 10), response_format.Credit cost: Uses daily search quota. No contact credits.request_id, scroll_id, response_format.Credit cost: Uses daily search quota.Profile Retrieval
items (array of UIDs), response_format.Credit cost: Uses daily search quota. No contact credits.items (array of UIDs, LinkedIn URLs, or emails), spend_credits_confirmed (boolean), response_format.Credit cost: ⚠️ 1 Contact Credit per successful match.Company
company_id_or_slug. This tool takes no response_format.Credit cost: Free.company_id (numeric ID), spend_credits_confirmed (boolean), response_format.Credit cost: ⚠️ 1 Company Credit.Utility
retrieve_person_no_contacts only.Credit cost: Free.Searching effectively
Boolean syntax
The text fields —keywords, current_title, current_past_title, current_company, current_past_company — accept boolean expressions:
industry vs industries
Two different filters, easy to confuse:
industry— free-text match on a single industry (e.g."Software"). Use it when you’re describing the sector in words.industries— a list of exact industry IDs. Use it when you already know the IDs, fromget_available_industries(146 categories).
Why the assistant asks you to pick from a list
When you search by department, level or industry, the assistant is instructed to first fetch the valid options, show them to you, and let you choose — rather than guessing a value that doesn’t exist. That extra step is deliberate and costs nothing. To skip it, name a value from these lists directly.Departments (15)
Departments (15)
Marketing · Sales · Product & Project · Engineering / Development · Data & Analytics · Design / UX · HR & Recruitment · Finance & Accounting · Legal / Compliance · Customer Support / Success · Health, Beauty & Hospitality · Education & Training · Operations & Admin · Facility Services · Entertainment / ProductionSeniority levels (11)
Seniority levels (11)
Intern / Entry Level · Junior · Mid-Level · Senior · Lead · Head · VP · C-Level · Founder / Owner · Board / Advisory · Directorsget_available_industries.
Getting more results: raise size, don’t paginate
search_candidates_query takes size up to 100 (default 10). Pagination via scroll_search exists, but the scrollId expires after 15 seconds — too short for a conversational back-and-forth. If you need more results, ask for a bigger batch up front (“find me 50 …”) instead of asking for the next page.
Credits & confirmation
Three separate pools are consumed, and each is reported on its own:search_candidates_query and scroll_search do not consume the daily search quota — they use a separate internal quota that is not visible via any utility tool. Their responses still report a remaining balance for it.check_balance covers Contact Credits only. Check it in your SignalHire account before a run that needs company data.Example Prompts
search_candidates_query → retrieve_person_no_contacts
retrieve_person_profile
find_company → get_company_info
keywords
open_to_work filter
years_experience_from / years_experience_to
exclude_emailed / exclude_revealed
check_balance
Troubleshooting
The connector option isn't there at all
The connector option isn't there at all
Tools don't show up in the client
Tools don't show up in the client
The wrong auth header
The wrong auth header
Authorization: Bearer <key>. A bare key with no Bearer prefix, a different header name (apikey, x-api-key), or the key in the URL as ?token=... are all ignored and come back as 401.Resource not found when paginating
Resource not found when paginating
scrollId expired (15-second TTL). Run a new search_candidates_query with a larger size (up to 100) instead of paginating.mcp-remote keeps failing after a config change
mcp-remote keeps failing after a config change
npm i -g mcp-remote.The assistant asks for permission before revealing contacts
The assistant asks for permission before revealing contacts
No credits remaining or daily quota exceeded
No credits remaining or daily quota exceeded
401 on every call right after connecting, including through OAuth
401 on every call right after connecting, including through OAuth
The OAuth flow never completes
The OAuth flow never completes
The balances look wrong, or results aren't the ones I expect
The balances look wrong, or results aren't the ones I expect
check_balance and compare it with the balance shown in the SignalHire web app; if they disagree, disconnect the connector, sign in to the correct account in your browser, and connect again. On the API-key paths, re-copy the key from the right account.With a social login this is the usual cause: the provider silently used a different one of your accounts. Redo the flow, and on the provider’s screen pick the identity your SignalHire account is actually linked to instead of accepting the default.429 Rate limit exceeded
429 Rate limit exceeded
403 Connection Denied
403 Connection Denied
https://mcp.signalhire.services/mcp — the server filters traffic by the Host header.TLS / certificate errors
TLS / certificate errors
pip install -U certifi for Python). Do not disable TLS verification.Security
- The MCP server is a stateless proxy — your API key is never stored server-side. Each request forwards your credential to the SignalHire API and discards it.
- Prefer OAuth (Claude.ai, Claude Desktop, ChatGPT) where it’s available — there’s no key to manage or leak.
- Store API keys in a secure credential store — your OS keychain, a password manager, or your editor’s secrets manager. Don’t hardcode them into config files you share.
- For team setups, pass the key through an environment variable (as in the Codex config above) instead of committing it to version control. In n8n, use the built-in Credentials system rather than pasting the key into a node field.
- Rotate your API key at signalhire.com/apiIntegrations periodically, and immediately if you suspect it has been exposed.
- Remove connectors and MCP entries you no longer use, and expose only the tools your use case needs.