MCP Server

NEW

crmzero 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

Name:crmzero
MCP Server URL:https://crmzero.ai/api/mcp

Step 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:

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:

json
{
  "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

bash
CRM_API_KEY=crm_XXXX npm run mcp

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

AreaToolDescriptionScopes
Contacts and accountsadd_social_profileAdd a social profile (such as LinkedIn) to a contact.contacts:write
batch_create_contactsCreate or merge many contacts in one call (up to 200 by default).contacts:write
batch_merge_accountsMerge many duplicate accounts in one call; reports partial success. Supports dry_run.contacts:write
batch_merge_contactsMerge many duplicate contacts in one call; reports partial success. Supports dry_run.contacts:write
batch_set_account_domainSet or correct the primary domain on many accounts in one call.contacts:write
batch_set_account_parentSet or clear the parent on many accounts in one call.contacts:write
batch_set_email_statusRecord email deliverability for many addresses in one call.contacts:write
batch_update_accountsUpdate many accounts in one call (up to 200 by default).contacts:write
batch_update_contactsUpdate many contacts in one call (up to 200 by default).contacts:write
clear_canonical_accountRemove the explicit canonical-account choice for a shared domain so the default rule applies again.contacts:write
create_accountFind-or-create a company account.contacts:write
create_contactCreate a contact, or merge into the existing one when the email or LinkedIn profile already matches.contacts:write
delete_contactDelete a contact from the CRM.contacts:write
get_accountGet detailed account info including contacts, deals, and domain enrichment data.contacts:read
get_contactGet detailed information about a specific contact including all emails, phones, social profiles, companies, and tags.contacts:read
list_account_viewsList all saved account views visible to the caller - their own personal views plus any org-wide views.contacts:read
list_accounts_by_viewLoad a saved account view and return its accounts with the view's sort and filters applied.contacts:read
list_contact_viewsList all saved contact views visible to the caller - their own personal views plus any org-wide views.contacts:read
list_contacts_by_viewLoad a saved contact view and return its contacts with the view's sort and filters applied.contacts:read
list_custom_fieldsList the custom field definitions for this CRM, so you can map data to the correct field keys before writing.contacts:read
list_social_profilesList all social profiles for a contact.contacts:read
merge_accountsMerge 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_contactsMerge 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_profileRemove a social profile from a contact by its social profile ID.contacts:write
search_accountsSearch company accounts by name, domain or tag.contacts:read
search_contactsSearch contacts by name, email, company, job title, tag, or any combination.contacts:read
set_account_domainSet or correct an account's primary domain, and manage alias domains.contacts:write
set_account_parentSet or clear an account's parent (for example an acquirer and its portfolio company); rejects cycles.contacts:write
set_canonical_accountChoose which account a shared domain resolves to for capture, import and create_contact.contacts:write
set_email_statusRecord the deliverability of one email address on a contact and/or make it the default.contacts:write
update_accountUpdate an existing company account's name, industry, and custom fields.contacts:write
update_contactUpdate an existing contact's fields.contacts:write
Domainsget_domainGet detailed domain info with enrichment data and linked accounts.contacts:read
search_domainsSearch domains with enrichment data (industry, employee count, revenue).contacts:read
Tagsadd_tagAssign an existing tag to a contact, account, deal, or job post.contacts:write
create_tagDefine a new tag in a named category for contacts, accounts, or deals.contacts:write
list_tagsList tags in the CRM, grouped by category, with usage counts.tags:read
remove_tagRemove a tag from a contact, account, deal, or job post.contacts:write
update_tagMove a tag to a different category, rename it, or change its color - for contacts, accounts, or deals.contacts:write
Deals and forecastingbatch_create_dealsCreate many deals in one call (up to 200 by default).deals:write
batch_update_dealsUpdate many deals in one call (up to 200 by default).deals:write
create_dealCreate a new deal in the pipeline.deals:write
delete_dealDelete a deal from the pipeline.deals:write
get_dealGet detailed information about a specific deal.deals:read
get_deal_qualificationGet a deal's qualification values and health for its funnel stage.deals:read
get_deal_statsGet pipeline statistics: deal count and total value grouped by funnel and stage.deals:read
get_forecast_dealsGet the individual deals contributing to a specific forecast category for a given quarter.deals:read
get_forecast_summaryQuarterly forecast summary: pipeline, best case, commit and closed-won totals by deal owner.deals:read
list_deal_viewsList all saved deal views visible to the caller - their own personal views plus any org-wide views.deals:read
list_deals_by_viewLoad a saved deal view and return its deals with the view's sort and filters applied.deals:read
list_funnelsList all sales funnels with their stages and probabilities.deals:read
reset_forecast_overrideRemove a manual forecast override for a deal, reverting it to the stage-based default category for that quarter.deals:write
search_dealsSearch deals by title, account, contact, or tag.deals:read
set_forecast_overrideOverride the forecast category for a specific deal in a given quarter.deals:write
update_dealUpdate an existing deal.deals:write
update_deal_qualificationSet qualification criterion values on a deal.deals:write
Activitiescreate_activityLog a new activity (call, email, meeting, note, or task) against contacts, deals, or accounts.activities:write
delete_activityDelete an activity you created.activities:write
search_activitiesSearch activities (calls, emails, meetings, notes, tasks) with filters.activities:read
update_activityEdit an existing activity.activities:write
Productsadd_deal_line_itemAdd a product as a line item to a deal.products:write
get_deal_line_itemsGet all line items (products) attached to a deal.products:read
get_productGet detailed information about a specific product by ID, including pricing, SKU, category, and custom fields.products:read
remove_line_itemRemove a line item from a deal.products:write
search_productsSearch or list the product catalog.products:read
update_line_itemUpdate an existing line item on a deal.products:write
Introductionscreate_introLog an introduction between two contacts in this workspace.introductions:write
delete_introDelete an introduction.introductions:write
list_introsList introductions in this workspace.introductions:read
set_intro_companyCorrect the company recorded for ONE side of an introduction.introductions:write
update_introUpdate an existing introduction's notes, intro date, monetary value, value date, label, or linked deal.introductions:write
Funding eventscreate_funding_eventCreate a single funding event for a given company.enrichment:write
dedupe_funding_eventsFind duplicate funding events and optionally merge them; dry_run previews without merging.enrichment:write
ingest_funding_eventsBulk-ingest raw funding event records and match them to accounts by exact name.enrichment:write
link_funding_event_to_accountSet or update the linked account on an existing funding event.enrichment:write
list_funding_event_viewsList all saved funding event views visible to the caller - their own personal views plus any org-wide views.enrichment:read
list_funding_eventsList paginated funding events.enrichment:read
Job postscount_account_job_postsCount how much an account was hiring in a date range.job-posts:read
get_job_postGet one job post in full, including the description markdown, your organization's tags, custom fields and account link.job-posts:read
ingest_job_postsImport job postings into your organization (idempotent).job-posts:write
list_job_post_viewsList saved job post views visible to you - your own personal views plus any organization-wide views.job-posts:read
list_job_posts_by_viewList job posts through a saved view, with its filters and sort applied.job-posts:read
search_job_postsSearch job posts visible to your organization: your own imports plus the shared pool.job-posts:read
update_job_postUpdate your organization's tags, custom fields and hidden flag on a job post (and the facts of a posting you imported).job-posts:write
Reportscreate_reportSave a new report.contacts:write + deals:write
delete_reportDelete a saved report and its charts.contacts:write + deals:write
describe_report_fieldsList the fields a report can group by and aggregate for an entity, including custom fields.contacts:read + deals:read
get_reportGet one saved report's full definition, including its pivot config and any charts.contacts:read + deals:read
list_reportsList the saved reports and folders you can see: your private reports and those shared with the organization.contacts:read + deals:read
run_reportRun a saved report, or an ad-hoc pivot config, and return the table.contacts:read + deals:read
update_reportChange a saved report.contacts:write + deals:write