Skip to content

Your CRM, open to your tools and your agents.

One API token unlocks three doors: an MCP server for AI agents, a JSON API for scripts and integrations, and a command line client. Each sees exactly what you see, nothing more.

ContactHero sales hero protecting customer information

Get a token

Open your account page, generate an API token, and keep it like a password. Revoke it there at any time.

Send the token on every request:

Authorization: Bearer YOUR_TOKEN

Tokens only work in the header. Requests that put a token in the URL are refused so it never lands in a log.

Connect an agent

ContactHero speaks the Model Context Protocol over HTTP. Any MCP client can discover the tools and call them.

From Claude Code:

claude mcp add --transport http contacthero https://www.contacthero.com/mcp \
  --header "Authorization: Bearer YOUR_TOKEN"

Then ask in plain language: "Who have I not talked to in 90 days?", "Log the meeting with Dana and schedule a follow-up next Tuesday", or "Move the Acme renewal to Proposal."

From the Claude API, pass the same endpoint as an MCP server with your token as the authorization token.

The tools an agent gets

Every tool is scoped to the account behind the token, and every write goes through the same rules as the app.

Contacts

search_contacts get_contact create_contact update_contact set_contact_status merge_contacts find_duplicates add_note

Activities

create_task complete_task schedule_call log_activity complete_call agenda

Lists

list_lists list_contacts create_list add_to_list remove_from_list

Deals

list_deals get_deal create_deal update_deal move_deal pipeline_summary

Use the JSON API

The same filters the contacts page uses, plus lists, deals, stages, and calls.

GET  /api_v2/contacts?status=customer&inactive_days=90
GET  /api_v2/contacts/:id
POST /api_v2/contacts            {"contact": {"first_name": "Dana", "last_name": "Dealer"}}
POST /api_v2/contacts/:id/merge  {"duplicate_id": 42}
GET  /api_v2/lists               POST /api_v2/lists/:id/contacts {"contact_ids": [1, 2]}
GET  /api_v2/deals?status=open   POST /api_v2/deals/:id/move {"outcome": "won"}
GET  /api_v2/deal_stages         GET  /api_v2/calls?upcoming=1

Or stay in the terminal

The ch client ships in the repository and talks to the MCP endpoint, so every new tool is a command without an update.

export CONTACTHERO_URL=https://www.contacthero.com CONTACTHERO_TOKEN=YOUR_TOKEN
bin/ch tools
bin/ch search "acme"
bin/ch call create_task contact_id=42 description="Send proposal" due="friday 9am"
bin/ch agenda overdue

Give your assistant a CRM it can actually use.

Start a free trial, mint a token on your account page, and connect in a minute.

Start free trial