MCP Server
NEWcrmzero includes a Model Context Protocol (MCP) server that lets AI agents like Claude, Cursor, and other MCP-compatible tools interact with your CRM data directly. Search contacts, create deals, log activities, and more — all through natural language.
1. Get an API Key
You need an active API key. Get one from your CRM administrator via Admin → API Keys. The key's scopes decide which tools you see: a tool you may not use is simply not listed. A read-only key sees only read tools, and a key with no scopes sees none. Claude.ai connectors are tied to the key they were authorized with; deactivating or deleting the key disconnects them.
2. Claude.ai Custom Connector
Connect your hosted CRM directly to Claude.ai — no local setup needed. Authentication is handled via OAuth 2.1 with PKCE.
Step 1: Open Connector Settings
In Claude.ai, click your profile icon → Settings → Connectors → Add Custom Connector
Step 2: Enter Connector Details
crmzerohttps://crmzero.ai/api/mcpStep 3: Authorize
Click Connect. Claude will open an authorization page where you enter your CRM API key. Once authorized, Claude can search contacts, create deals, log activities, and more — directly from the chat.
Note: Access tokens expire after 1 hour. When they expire, Claude will re-prompt you to authorize. Your API key remains securely stored — only the short-lived token needs refreshing.
3. Claude Desktop (local)
Add to ~/Library/Application Support/Claude/claude_desktop_config.json:
{
"mcpServers": {
"crmzero": {
"command": "npx",
"args": ["tsx", "mcp/server.ts"],
"cwd": "/path/to/crmzero",
"env": {
"CRM_API_KEY": "crm_XXXXXXXXXXXX",
"DATABASE_URL": "postgresql://..."
}
}
}
}4. Cursor (local)
Add to .cursor/mcp.json in your project root:
{
"mcpServers": {
"crmzero": {
"command": "npx",
"args": ["tsx", "mcp/server.ts"],
"cwd": "/path/to/crmzero",
"env": {
"CRM_API_KEY": "crm_XXXXXXXXXXXX",
"DATABASE_URL": "postgresql://..."
}
}
}
}5. Command Line
CRM_API_KEY=crm_XXXX npm run mcpEvery tool, with the API-key scopes it needs (a tool needs all of its scopes). A key only sees the tools its scopes allow, so your list may be shorter.
| Area | Tool | Description | Scopes |
|---|---|---|---|
| Contacts and accounts | add_social_profile | Add a social profile (such as LinkedIn) to a contact. | contacts:write |
batch_create_contacts | Create or merge many contacts in one call (up to 200 by default). | contacts:write | |
batch_merge_accounts | Merge many duplicate accounts in one call; reports partial success. Supports dry_run. | contacts:write | |
batch_merge_contacts | Merge many duplicate contacts in one call; reports partial success. Supports dry_run. | contacts:write | |
batch_set_account_domain | Set or correct the primary domain on many accounts in one call. | contacts:write | |
batch_set_account_parent | Set or clear the parent on many accounts in one call. | contacts:write | |
batch_set_email_status | Record email deliverability for many addresses in one call. | contacts:write | |
batch_update_accounts | Update many accounts in one call (up to 200 by default). | contacts:write | |
batch_update_contacts | Update many contacts in one call (up to 200 by default). | contacts:write | |
clear_canonical_account | Remove the explicit canonical-account choice for a shared domain so the default rule applies again. | contacts:write | |
create_account | Find-or-create a company account. | contacts:write | |
create_contact | Create a contact, or merge into the existing one when the email or LinkedIn profile already matches. | contacts:write | |
delete_contact | Delete a contact from the CRM. | contacts:write | |
get_account | Get detailed account info including contacts, deals, and domain enrichment data. | contacts:read | |
get_contact | Get detailed information about a specific contact including all emails, phones, social profiles, companies, and tags. | contacts:read | |
list_account_views | List all saved account views visible to the caller - their own personal views plus any org-wide views. | contacts:read | |
list_accounts_by_view | Load a saved account view and return its accounts with the view's sort and filters applied. | contacts:read | |
list_contact_views | List all saved contact views visible to the caller - their own personal views plus any org-wide views. | contacts:read | |
list_contacts_by_view | Load a saved contact view and return its contacts with the view's sort and filters applied. | contacts:read | |
list_custom_fields | List the custom field definitions for this CRM, so you can map data to the correct field keys before writing. | contacts:read | |
list_social_profiles | List all social profiles for a contact. | contacts:read | |
merge_accounts | Merge a duplicate account into a survivor: contacts, deals, activities and tags move over, and the duplicate is deleted. Irreversible; supports dry_run. | contacts:write | |
merge_contacts | Merge a duplicate contact into a survivor: emails, phones, socials, tags and activities move over, and the duplicate is deleted. Supports dry_run. | contacts:write | |
remove_social_profile | Remove a social profile from a contact by its social profile ID. | contacts:write | |
search_accounts | Search company accounts by name, domain or tag. | contacts:read | |
search_contacts | Search contacts by name, email, company, job title, tag, or any combination. | contacts:read | |
set_account_domain | Set or correct an account's primary domain, and manage alias domains. | contacts:write | |
set_account_parent | Set or clear an account's parent (for example an acquirer and its portfolio company); rejects cycles. | contacts:write | |
set_canonical_account | Choose which account a shared domain resolves to for capture, import and create_contact. | contacts:write | |
set_email_status | Record the deliverability of one email address on a contact and/or make it the default. | contacts:write | |
update_account | Update an existing company account's name, industry, and custom fields. | contacts:write | |
update_contact | Update an existing contact's fields. | contacts:write | |
| Domains | get_domain | Get detailed domain info with enrichment data and linked accounts. | contacts:read |
search_domains | Search domains with enrichment data (industry, employee count, revenue). | contacts:read | |
| Tags | add_tag | Assign an existing tag to a contact, account, deal, or job post. | contacts:write |
create_tag | Define a new tag in a named category for contacts, accounts, or deals. | contacts:write | |
list_tags | List tags in the CRM, grouped by category, with usage counts. | tags:read | |
remove_tag | Remove a tag from a contact, account, deal, or job post. | contacts:write | |
update_tag | Move a tag to a different category, rename it, or change its color - for contacts, accounts, or deals. | contacts:write | |
| Deals and forecasting | batch_create_deals | Create many deals in one call (up to 200 by default). | deals:write |
batch_update_deals | Update many deals in one call (up to 200 by default). | deals:write | |
create_deal | Create a new deal in the pipeline. | deals:write | |
delete_deal | Delete a deal from the pipeline. | deals:write | |
get_deal | Get detailed information about a specific deal. | deals:read | |
get_deal_qualification | Get a deal's qualification values and health for its funnel stage. | deals:read | |
get_deal_stats | Get pipeline statistics: deal count and total value grouped by funnel and stage. | deals:read | |
get_forecast_deals | Get the individual deals contributing to a specific forecast category for a given quarter. | deals:read | |
get_forecast_summary | Quarterly forecast summary: pipeline, best case, commit and closed-won totals by deal owner. | deals:read | |
list_deal_views | List all saved deal views visible to the caller - their own personal views plus any org-wide views. | deals:read | |
list_deals_by_view | Load a saved deal view and return its deals with the view's sort and filters applied. | deals:read | |
list_funnels | List all sales funnels with their stages and probabilities. | deals:read | |
reset_forecast_override | Remove a manual forecast override for a deal, reverting it to the stage-based default category for that quarter. | deals:write | |
search_deals | Search deals by title, account, contact, or tag. | deals:read | |
set_forecast_override | Override the forecast category for a specific deal in a given quarter. | deals:write | |
update_deal | Update an existing deal. | deals:write | |
update_deal_qualification | Set qualification criterion values on a deal. | deals:write | |
| Activities | create_activity | Log a new activity (call, email, meeting, note, or task) against contacts, deals, or accounts. | activities:write |
delete_activity | Delete an activity you created. | activities:write | |
search_activities | Search activities (calls, emails, meetings, notes, tasks) with filters. | activities:read | |
update_activity | Edit an existing activity. | activities:write | |
| Products | add_deal_line_item | Add a product as a line item to a deal. | products:write |
get_deal_line_items | Get all line items (products) attached to a deal. | products:read | |
get_product | Get detailed information about a specific product by ID, including pricing, SKU, category, and custom fields. | products:read | |
remove_line_item | Remove a line item from a deal. | products:write | |
search_products | Search or list the product catalog. | products:read | |
update_line_item | Update an existing line item on a deal. | products:write | |
| Introductions | create_intro | Log an introduction between two contacts in this workspace. | introductions:write |
delete_intro | Delete an introduction. | introductions:write | |
list_intros | List introductions in this workspace. | introductions:read | |
set_intro_company | Correct the company recorded for ONE side of an introduction. | introductions:write | |
update_intro | Update an existing introduction's notes, intro date, monetary value, value date, label, or linked deal. | introductions:write | |
| Funding events | create_funding_event | Create a single funding event for a given company. | enrichment:write |
dedupe_funding_events | Find duplicate funding events and optionally merge them; dry_run previews without merging. | enrichment:write | |
ingest_funding_events | Bulk-ingest raw funding event records and match them to accounts by exact name. | enrichment:write | |
link_funding_event_to_account | Set or update the linked account on an existing funding event. | enrichment:write | |
list_funding_event_views | List all saved funding event views visible to the caller - their own personal views plus any org-wide views. | enrichment:read | |
list_funding_events | List paginated funding events. | enrichment:read | |
| Job posts | count_account_job_posts | Count how much an account was hiring in a date range. | job-posts:read |
get_job_post | Get one job post in full, including the description markdown, your organization's tags, custom fields and account link. | job-posts:read | |
ingest_job_posts | Import job postings into your organization (idempotent). | job-posts:write | |
list_job_post_views | List saved job post views visible to you - your own personal views plus any organization-wide views. | job-posts:read | |
list_job_posts_by_view | List job posts through a saved view, with its filters and sort applied. | job-posts:read | |
search_job_posts | Search job posts visible to your organization: your own imports plus the shared pool. | job-posts:read | |
update_job_post | Update your organization's tags, custom fields and hidden flag on a job post (and the facts of a posting you imported). | job-posts:write | |
| Reports | create_report | Save a new report. | contacts:write + deals:write |
delete_report | Delete a saved report and its charts. | contacts:write + deals:write | |
describe_report_fields | List the fields a report can group by and aggregate for an entity, including custom fields. | contacts:read + deals:read | |
get_report | Get one saved report's full definition, including its pivot config and any charts. | contacts:read + deals:read | |
list_reports | List the saved reports and folders you can see: your private reports and those shared with the organization. | contacts:read + deals:read | |
run_report | Run a saved report, or an ad-hoc pivot config, and return the table. | contacts:read + deals:read | |
update_report | Change a saved report. | contacts:write + deals:write |