Connects Claude to your Zoho CRM instance via OAuth 2.0, exposing five main operations: get_leads, create_lead, get_contacts, get_deals, and search_records with custom criteria. Built in Python with async support, automatic token refresh, and rate limiting that respects API quotas. You'd reach for this when you want Claude to pull lead lists, create contacts on the fly, or search across CRM modules without switching contexts. Includes retry logic with exponential backoff and works through stdio transport. Requires a Zoho Self Client app with refresh token and the usual CRM scopes.
A Model Context Protocol (MCP) server for integrating Zoho CRM with GenAI applications.
This MCP server provides seamless integration with Zoho CRM, enabling AI assistants and applications to interact with your CRM data through a standardized interface.
The server exposes the following MCP tools:
pip install zoho-crm-mcp-server
git clone https://github.com/asklokesh/zoho-crm-mcp-server.git
cd zoho-crm-mcp-server
pip install -e .
pip install -e ".[dev]"
ZohoCRM.modules.ALLZohoCRM.settings.ALLCopy the example configuration:
cp .env.example .env
Edit .env with your credentials:
ZOHO_CLIENT_ID=your_client_id_here
ZOHO_CLIENT_SECRET=your_client_secret_here
ZOHO_REFRESH_TOKEN=your_refresh_token_here
# Optional configurations
ZOHO_API_DOMAIN=https://www.zohoapis.com
RATE_LIMIT_REQUESTS=100
RATE_LIMIT_PERIOD=60
MAX_RETRIES=3
LOG_LEVEL=INFO
zoho-crm-mcp
from zoho_crm_mcp import ZohoCRMMCPServer
import asyncio
async def main():
server = ZohoCRMMCPServer()
await server.run()
if __name__ == "__main__":
asyncio.run(main())
from zoho_crm_mcp import ZohoCRMClient, Config
import asyncio
async def main():
config = Config()
client = ZohoCRMClient(config)
await client.initialize()
# Get leads
leads = await client.get_leads(page=1, per_page=50)
print(f"Found {len(leads['data'])} leads")
# Create a new lead
new_lead = await client.create_lead({
"Last_Name": "Doe",
"First_Name": "John",
"Email": "john.doe@example.com",
"Company": "Acme Corp"
})
# Search for records
results = await client.search_records(
"Leads",
"(Email:equals:john.doe@example.com)"
)
await client.close()
if __name__ == "__main__":
asyncio.run(main())
pytest tests/ -v --cov=zoho_crm_mcp
ruff check src/ tests/
ruff format src/ tests/
python -m build
This project includes GitHub Actions workflows for:
zoho-crm-mcp-server/
├── src/zoho_crm_mcp/
│ ├── __init__.py # Package initialization
│ ├── server.py # MCP server implementation
│ ├── zoho_client.py # Zoho CRM API client
│ └── config.py # Configuration management
├── tests/ # Comprehensive test suite
├── .github/workflows/ # CI/CD pipelines
└── pyproject.toml # Project configuration
The server includes comprehensive error handling:
The server uses Python's built-in logging module. Configure log level via environment variable:
export LOG_LEVEL=DEBUG # Options: DEBUG, INFO, WARNING, ERROR, CRITICAL
Contributions are welcome! Please feel free to submit a Pull Request.
git checkout -b feature/AmazingFeature)git commit -m 'Add some AmazingFeature')git push origin feature/AmazingFeature)Issue: ModuleNotFoundError: No module named 'mcp'
Solution: Install the MCP SDK: pip install mcp
Issue: Token refresh fails Solution: Verify your refresh token is valid and has the required scopes
Issue: Rate limit errors
Solution: Adjust RATE_LIMIT_REQUESTS and RATE_LIMIT_PERIOD in your .env file
MIT License - see LICENSE file for details
For issues, questions, or contributions, please visit:
Made with ❤️ for the MCP community
ZOHO_CRM_API_KEY*secretAPI Key for ZOHO_CRM
ZOHO_CRM_API_URLAPI URL for ZOHO_CRM
explorium-ai/vibeprospecting-mcp
io.github.compuute/lead-enrichment
dev.workers.selbyventurecap.cf-worker/apollo-salesforce-mapper
io.github.br0ski777/company-enrichment
com.mcparmory/apollo
mambalabsdev/mcp-gtm-tech-stack-signal-scraper