Skip to content

Connect Zoho CRM to Claude: Query records and automate workflows

Learn how to build a secure, managed MCP server to connect Zoho CRM to Claude. Automate lead conversion, pipeline updates, and COQL queries using AI agents.

Uday Gajavalli Uday Gajavalli · · 9 min read
Connect Zoho CRM to Claude: Query records and automate workflows

If you need to connect Zoho CRM to Claude to automate sales pipelines, orchestrate lead conversion, or query complex organizational data, you need a Model Context Protocol (MCP) server. This server acts as the translation layer between Claude's LLM tool calls and Zoho CRM's native REST API. You can either build and maintain this infrastructure yourself, or use a managed integration platform like Truto to dynamically generate a secure, authenticated MCP server URL.

If your team uses ChatGPT, check out our guide on connecting Zoho CRM to ChatGPT or explore our broader architectural overview on connecting Zoho CRM to AI Agents.

Giving a Large Language Model (LLM) read and write access to an enterprise CRM is a major engineering challenge. You have to handle OAuth 2.0 token lifecycles, manage dynamic custom field schemas, and navigate vendor-specific API quirks. Every time the integration vendor deprecates a field, you must update your server code, redeploy, and test.

This guide breaks down exactly how to use Truto to generate a secure, managed MCP server for Zoho CRM, connect it natively to Claude, and execute complex workflows using natural language.

The Engineering Reality of the Zoho CRM API

A custom MCP server is a self-hosted integration layer. While the open MCP standard provides a predictable way for models to discover tools, the reality of implementing it against Zoho CRM's APIs is complicated. Zoho CRM is a powerful, highly customizable enterprise platform, and its API reflects that complexity.

If you decide to build a custom MCP server for Zoho CRM, you own the entire API lifecycle. Here are the specific challenges you will face:

Polymorphic Associations and System Fields Zoho CRM relies heavily on polymorphic associations for related records. For example, when adding an event or a note, you cannot simply link it to a generic record_id. You must specify the $se_module (the parent module API name), Parent_Id, What_Id, and Who_Id. Exposing this raw relational model directly to Claude often results in hallucinated module names or misaligned ID associations.

The COQL vs. Search Dilemma Zoho CRM offers standard REST search endpoints (/search), but these are limited in criteria complexity. For advanced queries, Zoho provides COQL (CRM Object Query Language) - a SQL-like dialect for querying records. If you want an AI agent to execute advanced multi-condition searches (e.g., "find all deals closing this month over $50k owned by Sarah"), exposing COQL is powerful but dangerous if not strictly defined. You have to carefully map the schemas so the LLM understands when to use standard search criteria versus when to construct a valid COQL statement.

Strict API Credit Limits and Concurrency Zoho CRM enforces a strict API credit system rather than simple concurrency caps. Different operations consume different amounts of credits. When you exhaust your limits or hit concurrency thresholds, Zoho returns an HTTP 429 Too Many Requests error. It is critical to understand that Truto does not retry, throttle, or apply backoff on rate limit errors. When the upstream API returns an HTTP 429, Truto passes that error directly to the caller. Truto normalizes the upstream rate limit information into standardized IETF headers (ratelimit-limit, ratelimit-remaining, ratelimit-reset). The caller (your agent or application) is fully responsible for handling the backoff logic. Do not expect the integration layer to silently absorb these errors.

How to Generate a Zoho CRM MCP Server with Truto

Truto dynamically derives MCP tools directly from the integration's documented endpoints. When you connect a Zoho CRM account, Truto parses the available resources and documentation schemas to construct an MCP server on the fly.

You can create an MCP server for Zoho CRM in two ways: via the Truto UI or programmatically via the REST API.

Method 1: Via the Truto UI

If you are configuring this for an internal workspace, the UI is the fastest path.

  1. Navigate to the Integrated Accounts page in your Truto dashboard.
  2. Select your connected Zoho CRM account.
  3. Click the MCP Servers tab.
  4. Click Create MCP Server.
  5. Select your desired configuration. You can filter the tools by methods (e.g., read, write) or by tags (e.g., sales, admin).
  6. Copy the generated MCP server URL (e.g., https://api.truto.one/mcp/a1b2c3d4e5f6...).

Method 2: Via the API

For automated deployments or multi-tenant architectures, you can generate the MCP server programmatically. Truto validates the configuration, generates a cryptographically hashed token, stores it in a distributed key-value store for fast reverse lookups, and returns the endpoint.

Make a POST request to /integrated-account/:id/mcp:

curl -X POST https://api.truto.one/integrated-account/zohocrm_acc_123/mcp \
  -H "Authorization: Bearer <YOUR_TRUTO_API_KEY>" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "Zoho CRM Deal Analyst AI",
    "config": {
      "methods": ["read", "update", "create"],
      "tags": ["deals", "leads", "contacts"]
    },
    "expires_at": "2025-12-31T23:59:59Z"
  }'

The API returns the server URL and its configuration:

{
  "id": "mcp_abc123",
  "name": "Zoho CRM Deal Analyst AI",
  "config": {
    "methods": ["read", "update", "create"],
    "tags": ["deals", "leads", "contacts"]
  },
  "expires_at": "2025-12-31T23:59:59.000Z",
  "url": "https://api.truto.one/mcp/a1b2c3d4e5f67890"
}

How to Connect the MCP Server to Claude

Because Truto embeds authentication and scope directly into the URL token, the MCP server is completely self-contained. You just need to hand the URL to Claude.

Method A: Via the Claude UI

If you are using Claude Desktop or an enterprise workspace with UI-based connector management:

  1. Open Claude and navigate to Settings → Integrations (or Connectors).
  2. Click Add MCP Server.
  3. Paste the Truto MCP URL into the Server URL field.
  4. Name the connection (e.g., "Zoho CRM (Truto)") and click Add.
  5. Claude will immediately handshake with the initialize endpoint and pull the tool inventory.

Method B: Via Manual Config File

For local development with Claude Desktop, you can add the server directly to your configuration file. Truto provides an open-source SSE proxy to handle the Server-Sent Events transport required by Claude.

Edit your claude_desktop_config.json file (typically located at ~/Library/Application Support/Claude/claude_desktop_config.json on macOS or %APPDATA%\Claude\claude_desktop_config.json on Windows):

{
  "mcpServers": {
    "zoho_crm": {
      "command": "npx",
      "args": [
        "-y",
        "@modelcontextprotocol/server-sse",
        "https://api.truto.one/mcp/a1b2c3d4e5f67890"
      ]
    }
  }
}

Restart Claude Desktop. The tools will now be available in the chat interface.

Hero Tools for Zoho CRM

Truto automatically generates a massive inventory of tools based on the Zoho CRM API specification. To prevent context window bloat, the MCP router dynamically flattens query and body schemas into a single input namespace for the LLM.

Here are six high-leverage "hero" tools your AI agent can use to automate Zoho CRM operations.

list_all_zoho_crm_search_deals

This tool allows the LLM to search for deal records using specific criteria, keywords, or associated emails. It is critical for pipeline analysis.

"Find all deals in Zoho CRM that are closing this month with an amount greater than 50000. Give me a summary of the deal names, stages, and owners."

update_a_zoho_crm_deal_by_id

Enables the agent to update existing pipeline records. Because Truto passes the native schema through to the proxy API, custom fields defined on your Deal object are fully supported.

"Update deal ID 11223344. Change the stage to 'Closed Won', set the closing date to today, and update the custom field 'Executive Sponsor' to 'Jane Doe'."

zoho_crm_leads_convert

A highly complex operation simplified into a single tool call. This allows the AI to execute the standard CRM workflow of converting a qualified lead into a Contact, Account, and optionally a Deal.

"Convert lead ID 99887766. Create a new contact and account from this lead, and also generate a new deal called 'Q3 Enterprise Expansion' associated with the account."

create_a_zoho_crm_notes_note

Allows the LLM to append contextual notes to any parent record in Zoho CRM. It requires the LLM to supply the parent_record_module and parent_record_id.

"Add a note to Contact ID 55443322. The title should be 'Discovery Call Summary' and the content should summarize our discussion about migrating off their legacy ERP system."

list_all_zoho_crm_coql

The ultimate power tool. Allows advanced AI agents to execute CRM Object Query Language (COQL) queries against Zoho CRM, retrieving highly specific data sets across modules using SQL-like syntax.

"Run a COQL query to select the Last_Name, Email, and Lead_Source from the Leads module where the Lead_Status is 'Not Contacted' and the Lead_Source is 'Trade Show'."

list_all_zoho_crm_users

Retrieves the directory of users configured in the Zoho CRM organization. This is primarily used by the agent to lookup owner IDs before assigning records or executing transfers.

"List all active users in the Zoho CRM directory. Find the user ID for 'Marcus Johnson' so we can assign these newly converted deals to his pipeline."

For the complete inventory of available Zoho CRM tools and their required schemas, visit the Zoho CRM integration page.

Workflows in Action

Connecting tools is just the prerequisite. The real power of MCP is enabling Claude to autonomously string together multi-step operations. Here is how Claude executes real-world Zoho CRM workflows.

Scenario 1: The Sales Triage and Conversion Agent

Persona: Sales Development Representative (SDR)

"Check our recent leads from the 'Webinar' source. If you find the lead for 'TechCorp Solutions', convert them into an Account and Contact, create a Deal for $15,000, and leave a note on the new Contact record saying I will reach out tomorrow."

How Claude executes this:

  1. Calls list_all_zoho_crm_search_leads with the criteria Lead_Source:equals:Webinar and Company:equals:TechCorp Solutions to find the lead ID.
  2. Calls zoho_crm_leads_convert passing the lead ID, triggering the creation of the Account, Contact, and the $15,000 Deal. Claude parses the response to get the new Contact ID.
  3. Calls create_a_zoho_crm_notes_note passing parent_record_module="Contacts" and the newly acquired Contact ID to attach the follow-up context.
sequenceDiagram
    participant User
    participant Claude as "Claude AI"
    participant MCP as "Truto MCP Server"
    participant Zoho as "Zoho CRM API"

    User->>Claude: "Find lead TechCorp, convert to Deal, add note"
    Claude->>MCP: Call list_all_zoho_crm_search_leads
    MCP->>Zoho: GET /crm/v7/Leads/search?criteria=...
    Zoho-->>MCP: Returns Lead ID 12345
    MCP-->>Claude: Lead data
    Claude->>MCP: Call zoho_crm_leads_convert (id: 12345)
    MCP->>Zoho: POST /crm/v7/Leads/12345/actions/convert
    Zoho-->>MCP: Returns Contact ID 9876, Deal ID 5555
    MCP-->>Claude: Conversion successful
    Claude->>MCP: Call create_a_zoho_crm_notes_note
    MCP->>Zoho: POST /crm/v7/Contacts/9876/Notes
    Zoho-->>MCP: Note created
    MCP-->>Claude: Success
    Claude-->>User: "Lead converted. Deal created. Note added."

Scenario 2: The Deal Pipeline Auditor

Persona: Revenue Operations (RevOps) Manager

"Use a COQL query to find all deals in the 'Negotiation/Review' stage that haven't been modified in over 30 days. For each deal you find, add a note flagging it for management review, and update the deal stage to 'Stalled'."

How Claude executes this:

  1. Calls list_all_zoho_crm_coql with a structured select_query to query the Deals module using the required date arithmetic and stage filtering.
  2. Loops through the returned deal IDs.
  3. Calls create_a_zoho_crm_notes_note for each deal, setting parent_record_module="Deals".
  4. Calls update_a_zoho_crm_deal_by_id for each deal, changing the Stage field to 'Stalled'.
graph TD
    A["User Prompt:<br>Audit stale deals in Negotiation"] --> B["Call tool:<br>list_all_zoho_crm_coql"]
    B --> C{"Deals found?"}
    C -->|Yes| D["Loop over Deal IDs"]
    D --> E["Call tool:<br>create_a_zoho_crm_notes_note"]
    E --> F["Call tool:<br>update_a_zoho_crm_deal_by_id"]
    F --> G{"More deals?"}
    G -->|Yes| D
    G -->|No| H["Return summary<br>to user"]
    C -->|No| H

Security and Access Control

Exposing an enterprise CRM to an AI model requires strict governance. Truto's MCP architecture provides multiple layers of security at the token level, ensuring agents only access what they explicitly need.

  • Method Filtering: When creating the MCP server, you can restrict access entirely to read-only operations (methods: ["read"]). This prevents the model from accidentally deleting or mutating CRM records.
  • Tag Filtering: Limit the server's scope by functional area. If an agent only handles pipeline analytics, you can filter tools using tags: ["deals", "reporting"], entirely hiding the users or settings tools.
  • Extra Authentication: By enabling require_api_token_auth, Truto applies a conditional middleware check. The caller must provide a valid Truto API session token in the Authorization header in addition to possessing the MCP URL, ensuring that leaked URLs cannot be exploited.
  • Automatic Expiration: For temporary agent access, set the expires_at property. Truto utilizes a distributed cleanup task to automatically purge the token from the key-value store and database when the timestamp is reached, ensuring no stale access remains.

Stop Building Boilerplate Integration Code

Connecting Claude to Zoho CRM shouldn't require weeks of reverse-engineering COQL schemas, building OAuth refresh logic, or wrestling with polymorphic note associations.

By leveraging an auto-generated MCP server, you abstract the protocol translation entirely. Truto normalizes the pagination cursors, handles the security token lifecycle, and surfaces Zoho CRM's native data model directly to the LLM. Your engineering team can focus on orchestrating intelligent workflows, not maintaining API wrappers.

FAQ

How does Truto handle Zoho CRM rate limits during AI agent execution?
Truto does not absorb, throttle, or automatically retry on rate limit errors. When Zoho CRM returns an HTTP 429, Truto passes that error directly to the caller. Truto normalizes the upstream rate limit information into standardized IETF headers (`ratelimit-limit`, `ratelimit-remaining`, `ratelimit-reset`), leaving the retry and backoff logic to the caller.
Does this integration support Zoho CRM custom modules and fields?
Yes. Truto's proxy API architecture delegates MCP tool execution directly to the underlying integration. AI agents operate on the native schemas, meaning any custom fields or custom modules configured in your Zoho CRM instance are accessible to Claude.
Can I restrict Claude to read-only access in Zoho CRM?
Yes. When creating the MCP server via Truto, you can use method filtering (e.g., `methods: ["read"]`) to restrict the server to only expose `get` and `list` operations, completely blocking write operations like `create`, `update`, and `delete`.

More from our Blog