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
Tools (28)
Contacts (6)
Companies (5)
Deals (7)
Activities (3)
Pipelines (2)
Notes (2)
Associations (3)
Backends
Backend Capabilities
API Mapping
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
# Default: HubSpot + Pipedrive (lightest, token-based auth)
cargo install mcp-crm
# All backends
cargo install mcp-crm --features all-backends
# Specific 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 [email protected]"
→ create_contact(first_name: "Sarah", last_name: "Chen", email: "[email protected]")
"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_LOGenv-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
rmcp and MCP compatibility
This server is built with rmcp 3.1.2 and requires Rust 1.94.1 or newer. The rmcp 3 rollout retains legacy MCP initialization compatibility and targets MCP protocol revisions 2025-11-25 and 2026-07-28.
MCP 2026-07-28 rollout (P4 workflow/business)
This server uses rmcp 3.1.2 and adk-mcp-sdk 0.2 with a minimum supported
Rust version of 1.94.1. It accepts stateless MCP 2026 requests with
per-request protocol, client identity, and capability metadata while retaining
the legacy MCP 2025-11-25 initialize flow for ordinary tools.
- Tasks: None; this server's operations are short-lived and execute directly.
- MRTR approvals:
delete_contact,delete_deal - Discovery and routing: rmcp serves on-demand discovery and validates the
per-request protocol envelope; HTTP deployments can route with
Mcp-MethodandMcp-Name. The packaged binary currently uses stdio. - Caching:
tools/listreturns a publicttlMsof 60,000 for MCP 2026; rmcp omits the cache fields for legacy clients. - Deprecated extensions: this server does not add new Roots, Sampling, or dynamic client-registration dependencies.
Protected tools require MCP_REQUEST_STATE_KEY with at least 32 high-entropy
bytes. All replicas must share that key so sealed approval state can resume on
another instance. Approval state is bound to the client identity, tool, and
arguments and expires after two minutes. Missing identity, invalid state,
rejection, or legacy protocol use fails closed. Task records are process-local
for the current stdio runtime; use a durable task store before deploying the
server behind scale-to-zero HTTP infrastructure.