Zoho Crm

io.github.asklokeshPublished by GitHub account asklokeshv0.1.0Updated Oct 24, 2026

MCP server for Zoho CRM API integration

Overview

AI-generated overview

Lets an assistant read and create Zoho CRM leads, contacts, and deals, and search records across CRM modules.

What you can do
This local MCP server connects an assistant to Zoho CRM. It exposes tools to retrieve leads and contacts with pagination, get deals, create new leads, and search records across any module with custom criteria. It handles OAuth token refresh, rate limiting, retries with backoff, and error logging.
When to use it
Use it when an assistant needs to look up or add CRM records in Zoho CRM, for example pulling leads or deals for review, or creating a lead from a conversation. It suits teams already using Zoho CRM as their system of record.
Requirements
Runs locally as a Python package (Python 3.8+) via uvx or pip. Needs Zoho OAuth credentials: a client ID, client secret, and refresh token with ZohoCRM.modules.ALL and ZohoCRM.settings.ALL scopes, plus the API key environment variable ZOHO_CRM_API_KEY and optional ZOHO_CRM_API_URL. Network access to Zoho APIs is required.
Before you install
Requires sensitive Zoho OAuth credentials (client ID, client secret, refresh token) and the ZOHO_CRM_API_KEY secret; store them in environment variables, not in shared files. The create_lead tool writes new records into your live CRM, and search_records can read across modules, so scope the refresh token narrowly and review writes before enabling them.

Installation

In SourceWeft

  1. Open Zoho Crm in the dashboard and add it to a workspace.
  2. Enable the server for the chats that should use its tools.

Desktop only via STDIO. STDIO servers start a local process, so they need the SourceWeft desktop host.

Other MCP clients

Follow the launch instructions in the repository.

README

Zoho CRM MCP Server

A Model Context Protocol (MCP) server for integrating Zoho CRM with GenAI applications.

Overview

This MCP server provides seamless integration with Zoho CRM, enabling AI assistants and applications to interact with your CRM data through a standardized interface.

Features

  • 🔐 OAuth 2.0 Authentication - Secure authentication with automatic token refresh
  • 📊 Comprehensive CRM Operations - Full support for Leads, Contacts, Deals, and more
  • ⚡ Rate Limiting - Built-in rate limiting to respect API quotas
  • 🔄 Automatic Retry Logic - Intelligent retry mechanism with exponential backoff
  • 🛡️ Error Handling - Robust error handling and logging
  • 🎯 MCP Protocol Compliance - Full compliance with Model Context Protocol specification
  • 🚀 Async Support - Asynchronous operations for better performance

Available Tools

The server exposes the following MCP tools:

  1. get_leads - Retrieve leads from Zoho CRM with pagination
  2. create_lead - Create new leads in Zoho CRM
  3. get_contacts - Fetch contacts with pagination support
  4. get_deals - Get deals from Zoho CRM
  5. search_records - Search across any module with custom criteria

Installation

From PyPI (when published)

bash
pip install zoho-crm-mcp-server

From Source

bash
git clone https://github.com/asklokesh/zoho-crm-mcp-server.gitcd zoho-crm-mcp-serverpip install -e .

Development Installation

bash
pip install -e ".[dev]"

Configuration

1. Set Up Zoho OAuth Credentials

  1. Go to Zoho API Console
  2. Create a new Self Client application
  3. Note your Client ID and Client Secret
  4. Generate a refresh token with required scopes:
    • ZohoCRM.modules.ALL
    • ZohoCRM.settings.ALL

2. Create Environment Configuration

Copy the example configuration:

bash
cp .env.example .env

Edit .env with your credentials:

env
ZOHO_CLIENT_ID=your_client_id_hereZOHO_CLIENT_SECRET=your_client_secret_hereZOHO_REFRESH_TOKEN=your_refresh_token_here
# Optional configurationsZOHO_API_DOMAIN=https://www.zohoapis.comRATE_LIMIT_REQUESTS=100RATE_LIMIT_PERIOD=60MAX_RETRIES=3LOG_LEVEL=INFO

Usage

As a Standalone Server

bash
zoho-crm-mcp

In Python Code

python
from zoho_crm_mcp import ZohoCRMMCPServerimport asyncio
async def main():    server = ZohoCRMMCPServer()    await server.run()
if __name__ == "__main__":    asyncio.run(main())

Using the Zoho CRM Client

python
from zoho_crm_mcp import ZohoCRMClient, Configimport 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": "[email protected]",        "Company": "Acme Corp"    })        # Search for records    results = await client.search_records(        "Leads",        "(Email:equals:[email protected])"    )        await client.close()
if __name__ == "__main__":    asyncio.run(main())

Development

Running Tests

bash
pytest tests/ -v --cov=zoho_crm_mcp

Linting

bash
ruff check src/ tests/ruff format src/ tests/

Building

bash
python -m build

CI/CD

This project includes GitHub Actions workflows for:

  • ✅ Automated testing across Python 3.8-3.12
  • 🔍 Code quality checks with Ruff
  • 📦 Package building and validation
  • 📊 Code coverage reporting

Architecture

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

Error Handling

The server includes comprehensive error handling:

  • Token Expiry: Automatic token refresh when tokens expire
  • Rate Limiting: Respects API rate limits with intelligent backoff
  • Network Errors: Automatic retry with exponential backoff
  • Validation Errors: Clear error messages for invalid configurations

Logging

The server uses Python's built-in logging module. Configure log level via environment variable:

bash
export LOG_LEVEL=DEBUG  # Options: DEBUG, INFO, WARNING, ERROR, CRITICAL

Contributing

Contributions are welcome! Please feel free to submit a Pull Request.

  1. Fork the repository
  2. Create your feature branch (git checkout -b feature/AmazingFeature)
  3. Commit your changes (git commit -m 'Add some AmazingFeature')
  4. Push to the branch (git push origin feature/AmazingFeature)
  5. Open a Pull Request

Troubleshooting

Common Issues

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

Requirements

  • Python 3.8+
  • requests >= 2.25.0
  • mcp >= 1.0.0
  • python-dotenv >= 0.19.0

License

MIT License - see LICENSE file for details

Support

For issues, questions, or contributions, please visit:

Acknowledgments


Made with ❤️ for the MCP community

Source: README.md at commit 1405998

Tools

0
SourceWeft has not started this package in its sandbox yet, so its tools are not known.

Version history

1
  1. v0.1.0LatestSep 16, 2026

Score

50% of the applicable checks met

How complete this listing is, computed from the registry entry, the endpoint and public sources. Not a rating of the server and not a statement that it is safe or working today: reachability is a dated check, and no installs or reviews go into the score.

  • Reached in the last 30 days25 pts

    Keep the endpoint answering the MCP handshake; SourceWeft probes it every 30 days.

  • Auth declared10 pts

    Declare the credential headers in the registry entry, or keep the endpoint answering the probe so its auth can be classified.

  • Tools listed15 pts

    Answer tools/list without a credential, or ship a package that starts in a sandbox without one.

  • DescriptionRequired15 pts
  • Logo10 pts
  • Documentation15 pts
  • License10 pts