Integrations
Connect HuntSales to your AI
HuntSales speaks MCP (Model Context Protocol), the open standard for connecting tools to AI assistants. Connect Claude Code, Claude Desktop on Mac or another MCP client that sends your API key with each request (set up below) and your AI can answer questions about your contacts, your pipeline, your campaigns, your calls and new prospects that match a profile. If your role allows it, the same AI can act on your CRM: add prospects, build lists and campaigns, and launch them. Everything is scoped to your organisation by your key, and your AI works within your role's permissions, through the tools below.
Endpoint
https://huntsales.io/api/mcpTransport: Streamable HTTP (JSON-RPC 2.0). Auth: your API key, as Authorization: Bearer, or in an X-API-Key header. Limit: 120 requests a minute per key (the REST API counts its own 120); a 429 carries Retry-After, the seconds to wait.
Daily read limit: each member can read a set number of contacts a day through the API, MCP and connected AI apps, counted together. The plan sets it: Free 200, Scout 1,000, Hunter 5,000 and Apex 20,000 contacts a day per member, and one limit of that size shared by all of a workspace's workspace keys. It resets at midnight Singapore time. Past it, a contact read is refused with the time it resets; reading in the app is not limited.
Create your API key
In HuntSales, open Admin, then Developer, name your key and click Create key. Any member whose role includes the API Keys & MCP permission can create their own key. The key can use the tools your role permits, never more, and follows your role if it changes. The one choice is Allow this key to launch campaigns, off by default: without it the key can build and fill draft campaigns but cannot launch or resume one, or add contacts to or change a live one (see What a key can do below). Copy the key when shown; it is only displayed once. It starts with hs_live_. Keep it private, it is scoped to your workspace, and you can revoke it from the same page any time (admins can see and revoke every key in the workspace).
Workspace keys. For an integration that must keep working when staff change, a Super Admin can create a workspace key under Admin, then Developer, Workspace keys. It belongs to the workspace, not a person, and is bound to a role the Super Admin chooses (never the Super Admin role): every call is capped by that role's current permissions (except API Keys & MCP, which a workspace key ignores, since a Super Admin made it), and it acts as a member of the role who owns nothing. It reads and changes contacts, companies, deals, notes and the Suppression List as the role allows; it cannot search for or add prospects, build lists or campaigns, send email, work on tasks or manage webhooks, because those belong to a member. All workspace keys share one daily read limit, the same as one member's. Every Super Admin can see and revoke it, and its creation is recorded in the activity log and emailed to them.
Older keys. A key the Developer page marks as a legacy key was made for the whole workspace before keys became personal and held every permission. It no longer works: revoke it, and create a workspace key bound to a role instead.
Connect your AI client
Works with a key today: Claude Code and Claude Desktop on Mac, which we have run end to end, and, following each maker's documentation and not yet tested by us, Cursor, VS Code, n8n's MCP Client Tool, Gemini CLI and your own agent on the OpenAI or Claude API. Each lets you add a remote MCP server with your key in a header.
Pick the app you use. Replace hs_live_YOUR_KEY with the key from step 1.
Claude Code (the CLI)
Run this one command in your terminal. It is a single line, so it works as it is in PowerShell, Command Prompt and macOS or Linux terminals:
claude mcp add --transport http --scope user huntsales https://huntsales.io/api/mcp --header "Authorization: Bearer hs_live_YOUR_KEY"Check it worked with claude mcp list (HuntSales should show ✓ Connected). It is available in new Claude Code sessions.
Claude Desktop (follows the mcp-remote documentation, not yet tested by us in this form)
Go to Settings → Developer → Edit Config (this opens a file called claude_desktop_config.json; if Windows asks which app to open it with, choose Notepad or VS Code). Add HuntSales inside mcpServers. Desktop launches local commands, so we use the mcp-remote bridge to reach the hosted server (you need Node.js installed):
{
"mcpServers": {
"huntsales": {
"command": "npx",
"args": [
"-y", "mcp-remote", "https://huntsales.io/api/mcp",
"--header", "Authorization:${AUTH_HEADER}"
],
"env": {
"AUTH_HEADER": "Bearer hs_live_YOUR_KEY"
}
}
}
}Copy it exactly: your key goes in env, and the header line has no space after Authorization:. Claude Desktop on Windows breaks any argument that contains a space, so the key travels in AUTH_HEADER instead, the workaround the mcp-remote documentation gives. We connected Claude Desktop on Mac with the key written directly in the header argument; we have not yet run this env form ourselves, on Mac or Windows. If you already have other servers, just add the huntsales block alongside them. Save the file and fully restart Claude Desktop (quit it, do not just close the window). HuntSales then appears under Settings → Developer, which also shows the server's status and its log if it does not connect.
Cursor (follows Cursor's documentation, not yet tested by us)
Add HuntSales to ~/.cursor/mcp.json (every project) or .cursor/mcp.json in one project. Cursor connects to the hosted server directly, so no bridge is needed:
{
"mcpServers": {
"huntsales": {
"url": "https://huntsales.io/api/mcp",
"headers": {
"Authorization": "Bearer hs_live_YOUR_KEY"
}
}
}
}The file holds your key, so keep a project's .cursor/mcp.json out of version control.
VS Code (follows VS Code's documentation, not yet tested by us)
Run MCP: Open User Configuration from the Command Palette (or create .vscode/mcp.json in a project) and add:
{
"inputs": [
{
"type": "promptString",
"id": "huntsales-key",
"description": "HuntSales API key",
"password": true
}
],
"servers": {
"huntsales": {
"type": "http",
"url": "https://huntsales.io/api/mcp",
"headers": {
"Authorization": "Bearer ${input:huntsales-key}"
}
}
}
}VS Code asks for your key the first time the server starts and keeps it out of the file, so paste just the key, starting hs_live_.
claude.ai, the Claude mobile app and ChatGPT
These apps connect by OAuth sign-in instead of a key. Add a custom connector with the URL https://huntsales.io/api/mcp (exactly, no trailing slash), sign in to HuntSales when the app asks, and choose what it may do:
- Reading is always included.
- Adding prospects, which uses credits, is ticked by default; untick it if you like.
- Launching campaigns, which sends real email, stays off unless you tick it.
Only what your role allows is offered, and every call still follows your role, which needs API Keys & MCP, as a key does. The app's contact reads count toward your daily read limit. A connection lasts up to 90 days, then you sign in again. See or disconnect your apps under Admin, then Developer, Connected apps; to change what an app may do, disconnect it and connect again. In a managed workspace only the Super Admin can connect an app. We have not yet tested these sign-ins end to end ourselves.
Ask your AI about your CRM
Once connected, you can ask things like:
- How many contacts are at the Follow-up stage?
- What is my pipeline breakdown right now?
- Which of my campaigns got the most replies?
- How many calls did the team make yesterday?
- How many HR managers in Singapore could I add to my CRM?
- How many HuntSales credits do I have left?
If your role includes the write permissions, you can ask it to do the work too. See the end-to-end example below.
Your own agent on the OpenAI API
The OpenAI Responses API can use HuntSales as a remote MCP tool and send your key in its headers. The request below is an example to adapt, written from OpenAI's documentation and not yet tested by us: check that documentation for the current request fields and pick the model you use. Send it from your own server with your OpenAI key, never from a web page, so your HuntSales key stays private.
POST https://api.openai.com/v1/responses
{
"model": "YOUR_OPENAI_MODEL",
"input": "How many contacts are at the Follow-up stage?",
"tools": [
{
"type": "mcp",
"server_label": "huntsales",
"server_url": "https://huntsales.io/api/mcp",
"headers": {
"Authorization": "Bearer hs_live_YOUR_KEY"
},
"require_approval": "always"
}
]
}With require_approval set to always, the API asks your code to approve each HuntSales tool call before it runs. HuntSales' own previews still apply on top: the tools that add prospects or start sending do a dry run first.
What a key can do
Keys are personal and inherit their owner's role. Every call re-checks the owner's current role permissions, so a key can never do more than the member who created it, and your AI only sees the tools your role permits. If an admin changes that member's role, the key follows immediately. A removed member's keys stop working entirely. Superadmin keys can use every tool.
A member's key also acts only on what that member could touch in the app: their own campaigns, the lists they created or that are shared with them, and, when the workspace limits prospects to their assignee and the role lacks View All Contacts, only the contacts assigned or co-assigned to them plus unassigned ones. What the key creates (contacts, lists and campaigns) is saved as its owner's, so it shows up for them in the app. API keys are not available in a workspace managed by HuntSales, except a superadmin's own.
- Reading your pipeline, contact lists, connected mailboxes, and credit balance works for every member's key while their role includes API Keys & MCP; without it, a member's keys stop working. Listing contacts needs View All Contacts or View Assigned Contacts, as the Contacts page does, and returns one page a call (20 by default, up to 50), with the same visibility as search in the app. Pipeline counts follow the Dashboard: the whole workspace with View All Contacts, otherwise your own and shared contacts. Reading campaigns and their engagement needs Campaigns & Email Setup or View All Campaigns, or a campaign shared with you, as the Campaigns page does. Call statistics follow the Call Log: See all calls reads the whole team, Calling reads the owner's own calls, and a key whose owner has neither is refused.
- Counting new prospects that match a profile works for every member's key, as in the app (counting is free).
- Adding those prospects to your CRM needs Add Prospects to the CRM (this spends 2 People Search credits per contact added with an email, with a mailbox check included; no email, no charge).
- Creating contacts needs Edit Contacts, moving a contact's stage needs Manage Leads, and creating lists or adding contacts to them needs Manage Lists, as in the app.
- Building, enrolling, and launching campaigns needs Campaigns & Email Setup. Launching or resuming a campaign, and adding contacts to or changing a live one, also need a key made with Allow this key to launch campaigns ticked.
- Managing webhook endpoints over the REST API is for the Super Admin, as in the app. Only a Super Admin's key manages webhook endpoints, every endpoint in the workspace; any other key is refused.
- Companies, deals, tasks, notes and the Suppression List follow their pages in the app. Listing companies needs View All Contacts; one company opens as its panel does. Every member reads, logs, changes and deletes their own deals, and every deal with View All Deals. Tasks are the ones you created, are assigned or watch; creating, editing and deleting them needs Tasks, except moving your own assigned task through its statuses. Notes are read and added on a contact you can open. The Suppression List needs Campaigns & Email Setup: only a Super Admin's key adds to it directly (anyone else's add goes to the Super Admin for approval on Edit Requests), and only a Super Admin's key removes an entry that makes someone Do Not Call.
How writes stay safe
- The tools that add prospects, spend credits, or start real sending preview first and wait for an explicit confirm, so the AI shows you what it is about to do before it happens: claim_prospects, create_list_from_filter, enroll_list, launch_campaign, delete_deal, delete_task, add_to_suppression and remove_from_suppression, plus enroll_contacts into a live (active or scheduled) campaign, resuming a paused campaign, and editing a live campaign's steps. Creating a contact, a list or a draft campaign, adding contacts to a list, and editing a draft or paused campaign apply straight away, because none of them sends anything.
- Per-call caps protect you: claim_prospects adds at most 500 prospects per call, and enroll_contacts and add_contacts_to_list take at most 2,000 contacts per call. enroll_list has no per-call cap: it enrols the whole list once you confirm its preview. When enroll_contacts stops at 2,000 it says so (truncated), and your AI calls again with the rest.
- Writes do what the same action in the app does: a new contact fires your Contact created automations and webhooks, a stage move fires Stage changed, and a launch fires Campaign launched.
- Mailbox credentials never leave HuntSales. The AI can list your connected mailboxes, but connecting one (Microsoft sign-in, the Gmail app-password setup or SMTP) stays a manual step you do in Email Setup.
- Launching a campaign only flips it live. Mailbox daily limits, warmup (if you have switched it on), the Free plan's send caps and your send window still pace the actual sending, exactly as they do in the app.
- Every write is audit-logged against the key and, for a personal key, its owner, and you can revoke a key from Admin, then Developer, the moment you want to cut access.
Read tools
The server offers 37 tools in all. Your AI sees the ones your role permits.
get_creditsany memberYour HuntSales credit balance.
query_contactsView All or View Assigned ContactsSearch your CRM contacts by name, email, or job title; filter by stage. One page a call, as the Contacts page shows: 20 by default, up to 50. Each contact returned counts toward your daily read limit.
get_pipeline_summaryany memberCount of your contacts in each pipeline stage, as the Dashboard counts them.
get_call_statsCalling or See all callsCalls for any period in Singapore time (today, yesterday, last week, this month, or your own dates): total calls, placed and received, answered and answer rate, conversations, talk time, outcomes and appointments set, for the team and per agent. The same softphone figures as the Call Log. Without See all calls, a key reads only its owner's own calls.
count_prospectsany memberCount prospects not yet in your CRM that match a profile. Free. It counts the people in our shared contact database, which covers part of the market, not all of it. Returns matched; the count stops at 10,000, and matched_capped true means more than that match.
list_campaignsCampaigns & Email Setup, View All Campaigns or a shareYour campaigns, newest first: id, name, status, created date, and how many emails were sent and replied to. The other campaign tools take the id it returns.
get_campaign_engagementCampaigns & Email Setup, View All Campaigns or a shareRead opens, clicks, and replies for a campaign.
list_mailboxesany memberYour connected sending mailboxes: address, provider, status, and daily limit. Credentials are never returned.
list_contact_listsany memberYour contact lists with member counts: the lists you created and the ones shared with you.
list_companiesView All ContactsYour companies, newest first, as the Companies page shows them: name, industry, headcount, location, website, office number, UEN and owner. Search by part of the name or location (3 characters or more), or list one member's.
get_companyany memberOne company, as its panel shows it. In a workspace that keeps prospects to their assignee, another member's company shows only its name and owner unless you hold people there.
list_dealsany memberLogged deals with value, status, close date, company and contact. Without View All Deals, only the deals you logged.
list_tasksany memberThe tasks you created, are assigned or watch: open by default, or completed, all, or only overdue ones.
list_notesView All or View Assigned Contacts, or the WorkspaceThe notes on a contact's timeline, newest first, for a contact you can open.
list_suppressionCampaigns & Email SetupThe Suppression List a page at a time, with each entry's reason and whether you may remove it. Each address returned counts toward your daily read limit.
check_suppressionCampaigns & Email SetupWhether up to 50 addresses are blocked from campaigns, and why.
Write / operate tools
Available when your role includes the permission shown on each tool.
claim_prospectsAdd Prospects to the CRM (uses credits)Add prospects that match a profile into your CRM. Previews first with a dry run, then adds on your explicit confirm. Spends 2 People Search credits per contact added with an email, including a mailbox check on the address; a contact added with no email is free. Capped at 500 per call.
create_contactEdit ContactsAdd a new contact to your CRM.
update_contact_stageManage LeadsMove a contact to a different pipeline stage.
create_listManage ListsCreate a contact list to organise prospects.
add_contacts_to_listManage ListsAdd contacts to one of your lists by contact id (the ids query_contacts returns). Contacts already in the list are skipped. Capped at 2,000 per call.
create_list_from_filterManage ListsBuild a list from a contact filter (stage, job title pattern, email status). Previews the match count first, then creates on your explicit confirm.
create_campaignCampaigns & Email SetupCreate a draft campaign with its sequence steps, sending mailbox, and send window. Drafts never send until launched.
update_campaignCampaigns & Email SetupRename a campaign, change its mailbox or send window, or pause and resume it. Resuming a paused campaign previews first and waits for your explicit confirm.
set_sequence_stepCampaigns & Email SetupAdd or edit a sequence step: subject, body, and delay before it sends. On a live (active or scheduled) campaign it previews first and waits for your explicit confirm.
enroll_contactsCampaigns & Email SetupEnrol contacts, by id or a list's members, into a campaign. On a live (active or scheduled) campaign it previews how many would be enrolled first, because those contacts are then sent its emails, and enrols on your explicit confirm. Capped at 2,000 per call.
enroll_listCampaigns & Email SetupEnrol a whole contact list into a campaign, with no per-call cap. Previews how many would be enrolled first, then enrols on your explicit confirm.
launch_campaignCampaigns & Email SetupFlip a draft campaign live so it starts sending. Checks it has steps, a mailbox, and enrolled contacts, previews first with a dry run, then launches on your explicit confirm. Only for a key made with Allow this key to launch campaigns ticked.
create_dealany memberLog a deal, optionally on a contact (one you may work) and a company. Fires Deal created, and Deal won when logged as won.
update_dealany memberChange a deal you logged (any deal with View All Deals): value, status, close date, comments, contact or company. A move to won fires Deal won.
delete_dealany memberDelete a deal you logged (any deal with View All Deals). Previews first, deletes on your explicit confirm.
create_taskTasksCreate a task with a due date, priority, assignee (a teammate's id or email) and a linked contact or company. The assignee is notified.
update_taskTasks, or your own task's statusChange a task you created, are assigned or watch. Without Tasks you can still move a task assigned to you through its statuses, as My Day allows.
delete_taskTasksDelete a task you created, are assigned or watch. Previews first, deletes on your explicit confirm.
add_noteView All or View Assigned Contacts, or the WorkspaceAdd a note to the timeline of a contact you can open.
add_to_suppressionCampaigns & Email SetupBlock up to 100 addresses from every campaign. A Super Admin's key adds them directly; anyone else's goes to the Super Admin for approval on Edit Requests. Previews first, acts on your explicit confirm.
remove_from_suppressionCampaigns & Email SetupRemove entries so campaigns may email those addresses again. Only a Super Admin's key removes an entry that makes someone Do Not Call. Previews first, acts on your explicit confirm.
End-to-end example
With a key whose owner holds the People Search, Add Prospects to the CRM and campaign permissions, paste a prompt like this to your connected AI and let it drive:
Find HR managers in Singapore who are not in my CRM yet. Add up to
200 of them to a new list called "SG HR managers". Then draft a
2-step email campaign for that list. Show me a dry-run preview of
the launch, and once I confirm, launch it.Your AI uses count_prospects to size the audience, claim_prospects (dry run, then your confirm) to add them into the list, create_campaign to build the draft with its steps and mailbox, enroll_list (dry run, then your confirm) to enrol the list, and launch_campaign (dry run, then your confirm) to flip it live. From there your mailbox limits and send window pace the sending.
New to MCP? Read how to connect your CRM to Claude with MCP for what the protocol does and how to keep a key safe.
Prefer plain REST? See the HuntSales API reference. It covers people search, adding people to your CRM, your credit balance, webhook endpoints, companies, deals, tasks, notes and the Suppression List; contacts, lists and campaigns are available over MCP only.