Zoho CRM MCP Server

April 18, 2026 ยท View on GitHub

A Model Context Protocol (MCP) server that exposes the Zoho CRM v6 REST API as structured tools for LLM agents. Built on FastMCP with async httpx, pydantic v2 configuration, and an OAuth2 refresh-token flow.

Features

  • OAuth2 refresh-token exchange with in-memory access-token caching (1 hour TTL)
  • Automatic retry once on HTTP 401 after forcing a token refresh
  • Typed errors (AuthenticationError, NotFoundError, RateLimitError, APIError)
  • Region-aware endpoints: com, eu, in, com.au, jp
  • Full CRUD for any CRM module, plus search, COQL, module metadata, user listing, and related-list traversal

Requirements

  • Python 3.10+
  • mcp>=1.27,<2
  • httpx>=0.27.1,<1.0.0
  • pydantic>=2.12, pydantic-settings>=2.5.2

Install

python3 -m venv .venv
source .venv/bin/activate
pip install -e ".[dev]"

Configuration

All settings use the ZOHO_ env prefix (or a .env file):

VariableDefaultDescription
ZOHO_CLIENT_ID-OAuth2 client id
ZOHO_CLIENT_SECRET-OAuth2 client secret
ZOHO_REFRESH_TOKEN-OAuth2 refresh token
ZOHO_REGIONcomOne of com, eu, in, com.au, jp
ZOHO_TIMEOUT30HTTP timeout in seconds

Run

zoho-crm-mcp

Or register it in an MCP-capable client with the stdio command above.

Tools

ToolZoho CRM endpoint
list_recordsGET /crm/v6/{module}
get_recordGET /crm/v6/{module}/{id}
create_recordPOST /crm/v6/{module}
update_recordPUT /crm/v6/{module}/{id}
delete_recordDELETE /crm/v6/{module}/{id}
search_recordsGET /crm/v6/{module}/search
list_modulesGET /crm/v6/settings/modules
get_moduleGET /crm/v6/settings/modules/{module}
list_usersGET /crm/v6/users
coql_queryPOST /crm/v6/coql
list_related_recordsGET /crm/v6/{module}/{id}/{related_list}

Test

pytest -x --tb=short

License

MIT