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.
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