CRM MCP Server

Unified CRM MCP server with 28 tools across 4 backends — Salesforce, HubSpot, Zoho CRM, and Pipedrive. Unified contacts, companies, deals, activities, pipelines, and notes with associations, search, and lifecycle management. Single Rust binary with feature-flagged backends and enterprise governance.
Architecture
Key Principles
- Unified schema — agents see consistent types (Contact, Company, Deal, Activity, Pipeline, Note) regardless of backend
- Feature-flagged backends — compile only what you need (
--features salesforce,hubspot)
- Full CRM lifecycle — search contacts, manage deals through pipeline stages, log activities, attach notes
- No credential exposure — tokens stay in env vars, never reach LLM context
- Single binary — no Node.js, no Python, no runtime dependencies
Comparison
| Feature |
Generic REST |
Zapier |
mcp-crm |
| Multi-backend (4 CRMs) |
❌ |
Partial |
✅ |
| Unified schema |
❌ |
❌ |
✅ |
| Pipeline stage management |
❌ |
❌ |
✅ |
| Contact search |
❌ |
❌ |
✅ |
| Activity logging |
❌ |
Partial |
✅ |
| Risk classification |
❌ |
❌ |
✅ |
| Agent-native (MCP) |
❌ |
❌ |
✅ |
| Single binary |
❌ |
❌ |
✅ |
Tools (28)
Contacts (6)
| Tool |
Purpose |
Risk Class |
list_contacts |
List contacts with optional limit |
Read-only |
get_contact |
Get a contact by ID |
Read-only |
create_contact |
Create a new contact |
Internal write |
update_contact |
Update an existing contact |
Internal write |
search_contacts |
Search by name, email, or query |
Read-only |
delete_contact |
Delete a contact by ID |
External write |
Companies (5)
| Tool |
Purpose |
Risk Class |
list_companies |
List companies/accounts |
Read-only |
get_company |
Get a company by ID |
Read-only |
create_company |
Create a new company |
Internal write |
update_company |
Update an existing company |
Internal write |
search_companies |
Search companies by name or domain |
Read-only |
Deals (7)
| Tool |
Purpose |
Risk Class |
list_deals |
List deals/opportunities |
Read-only |
get_deal |
Get a deal with stage, value, probability |
Read-only |
create_deal |
Create a new deal |
Internal write |
update_deal |
Update deal (stage, value, close date) |
Internal write |
move_deal_stage |
Move a deal to a different pipeline stage |
Internal write |
search_deals |
Search deals by name, stage, or value |
Read-only |
delete_deal |
Delete a deal by ID |
External write |
Activities (3)
| Tool |
Purpose |
Risk Class |
list_activities |
List activities for a contact or deal |
Read-only |
create_activity |
Log a call, email, meeting, task, or note |
Internal write |
update_activity |
Update an activity (mark done, change subject) |
Internal write |
Pipelines (2)
| Tool |
Purpose |
Risk Class |
list_pipelines |
List sales pipelines and their stages |
Read-only |
get_pipeline_summary |
Get deal counts and values per stage |
Read-only |
Notes (2)
| Tool |
Purpose |
Risk Class |
list_notes |
List notes for a contact, company, or deal |
Read-only |
create_note |
Add a note to a record |
Internal write |
Associations (3)
| Tool |
Purpose |
Risk Class |
associate_contact_company |
Link a contact to a company |
Internal write |
associate_deal_contact |
Link a deal to a contact |
Internal write |
list_deal_contacts |
List contacts associated with a deal |
Read-only |
Backends
| Backend |
Protocol |
Auth |
Default Feature |
| Salesforce |
REST v59.0 + SOQL |
OAuth2 |
❌ |
| HubSpot |
CRM API v3 |
Private App Token |
✅ |
| Zoho CRM |
REST API v2 |
OAuth2 |
❌ |
| Pipedrive |
REST API v1 |
API Token |
✅ |
Backend Capabilities
| Capability |
Salesforce |
HubSpot |
Zoho CRM |
Pipedrive |
| Contacts CRUD |
✅ |
✅ |
✅ |
✅ |
| Contact search |
✅ (SOQL) |
✅ (native) |
✅ (criteria) |
✅ (term) |
| Contact delete |
✅ |
✅ |
✅ |
✅ |
| Companies CRUD |
✅ |
✅ |
✅ |
✅ |
| Company search |
✅ (SOQL) |
✅ (native) |
✅ (criteria) |
✅ (term) |
| Deals CRUD |
✅ |
✅ |
✅ |
✅ |
| Deal search |
✅ (SOQL) |
✅ (native) |
✅ (criteria) |
✅ (term) |
| Deal delete |
✅ |
✅ |
✅ |
✅ |
| Pipeline stages |
✅ |
✅ |
✅ |
✅ (with counts) |
| Activities |
✅ (Task) |
✅ (Engagement) |
✅ (Task) |
✅ (Activity) |
| Activity update |
✅ |
✅ |
✅ |
✅ |
| Notes |
✅ |
✅ |
✅ |
✅ |
| Associations |
✅ (ContactRole) |
✅ (v3 assoc) |
✅ (lookup) |
✅ (participants) |
API Mapping
| Entity |
Salesforce |
HubSpot |
Zoho CRM |
Pipedrive |
| Contact |
Contact |
contacts |
Contacts |
persons |
| Company |
Account |
companies |
Accounts |
organizations |
| Deal |
Opportunity |
deals |
Deals |
deals |
| Activity |
Task |
tasks/engagements |
Tasks |
activities |
| Note |
Note |
notes |
Notes |
notes |
| Pipeline |
OpportunityStage |
pipelines |
settings/pipeline |
pipelines + stages |
Installation
cargo install mcp-crm --features all-backends
Or build from source:
git clone https://github.com/zavora-ai/mcp-crm
cd mcp-crm
cargo build --release --features all-backends
Feature flags
cargo install mcp-crm
cargo install mcp-crm --features all-backends
cargo install mcp-crm --no-default-features --features salesforce
cargo install mcp-crm --no-default-features --features "hubspot,zoho-crm"
Configuration
Salesforce
export SALESFORCE_INSTANCE_URL="https://yourorg.my.salesforce.com"
export SALESFORCE_TOKEN="00D..."
HubSpot
export HUBSPOT_TOKEN="pat-na1-xxxxxxxx"
Zoho CRM
export ZOHO_CRM_TOKEN="1000.xxxxxxxx"
Pipedrive
export PIPEDRIVE_TOKEN="xxxxxxxxxxxxxxxx"
Client Configuration
Claude Desktop
{
"mcpServers": {
"crm": {
"command": "mcp-crm",
"args": [],
"env": {
"HUBSPOT_TOKEN": "pat-na1-xxxx"
}
}
}
}
Kiro
Add to .kiro/settings/mcp.json:
{
"mcpServers": {
"crm": {
"command": "mcp-crm",
"args": [],
"env": {
"PIPEDRIVE_TOKEN": "xxxx"
}
}
}
}
Cursor
Add to .cursor/mcp.json:
{
"mcpServers": {
"crm": {
"command": "mcp-crm",
"args": [],
"env": {
"SALESFORCE_INSTANCE_URL": "https://yourorg.my.salesforce.com",
"SALESFORCE_TOKEN": "00D..."
}
}
}
}
Windsurf
Add to ~/.codeium/windsurf/mcp_config.json:
{
"mcpServers": {
"crm": {
"command": "mcp-crm",
"args": [],
"env": {
"ZOHO_CRM_TOKEN": "1000.xxxx"
}
}
}
}
Usage Examples
Contact management
"List my top 10 contacts"
→ list_contacts(limit: 10)
"Search for contacts at Acme Corp"
→ search_contacts(query: "Acme")
"Create a contact for Sarah Chen at Acme, email sarah@acme.com"
→ create_contact(first_name: "Sarah", last_name: "Chen", email: "sarah@acme.com")
"Link Sarah to the Acme company"
→ associate_contact_company(contact_id: "sarah-id", company_id: "acme-id")
"Delete the test contact"
→ delete_contact(id: "test-id")
Deal pipeline
"Show me all open deals"
→ list_deals(limit: 50)
"Search for deals related to enterprise"
→ search_deals(query: "enterprise")
"Create a $50k deal for the Acme enterprise contract"
→ create_deal(name: "Acme Enterprise", amount: 50000, stage: "Negotiation")
"Link Sarah to the Acme deal"
→ associate_deal_contact(deal_id: "deal-123", contact_id: "sarah-id")
"Who's involved in the Acme deal?"
→ list_deal_contacts(id: "deal-123")
"Move the Acme deal to Closed Won"
→ move_deal_stage(id: "deal-123", stage: "closedwon")
"What does our pipeline look like?"
→ get_pipeline_summary()
Companies
"Search for companies in fintech"
→ search_companies(query: "fintech")
Activity logging
"Log a call with Sarah about the proposal"
→ create_activity(activity_type: "call", subject: "Proposal discussion", contact_id: "sarah-id")
"Mark that task as done"
→ update_activity(id: "activity-id", done: true)
"Show all activities for the Acme deal"
→ list_activities(deal_id: "deal-123")
Notes
"Add a note to the Acme deal: 'Budget approved by CFO'"
→ create_note(content: "Budget approved by CFO", deal_id: "deal-123")
Documentation
Registry Compliance
This server implements the ADK MCP SDK contract:
- HealthCheck — verifies backend connectivity on startup
- mcp-server.toml — manifest with 28 tools, risk classes, and credential bindings
- Manifest validation — startup fails fast on invalid manifest (SDK 0.1.3+)
- Structured tracing —
RUST_LOG env-filter for observability
Contributors
License
Apache-2.0 — see LICENSE for details.
Part of the ADK-Rust Enterprise MCP server ecosystem.
Built with ❤️ by Zavora AI