Zoho Mail

Live

OAUTH 2.0

EMAIL

Communication

Zoho Mail gives your agent authenticated access to email: search and read messages, send and reply, organize folders and labels, and manage tasks, notes, and organization settings as the signed-in user.

  • Per-user credentials: each call uses the actual user's token, never a shared bot.
  • Encrypted per-tenant vault: AES-256, resolved at request time, never in LLM context.
  • Scoped before every call: pre-call scope check, 90-day SIEM-exportable audit chain.
Zoho Mail
agent · Acme Q3
Run
Find unread emails from acme.com this week that mention invoices.
S
zohomail_message_list_search_results
109ms
Inbox agent
6 unread emails from acme.com this week. 2 mention invoices: INV-2231 from billing and INV-2240 from Dana in finance.
Sources: Inbox search, 6 emails
zohomail
6 emails
18:29
Message Claude...

Tools your inbox agent reaches for on Zoho Mail, scoped per user.

CALL ANY TOOL
245 tools for email in Zoho Mail: search, read, send, and reply to messages, organize folders, labels, and threads, and manage tasks, notes, bookmarks, users, domains, and policies.
zohomail_account_add_email_forwarding
Account add email forwarding
Add one or more email forwarding destinations to a Zoho Mail account, so incoming mail is automatically forwarded to those addresses. Returns a status object with a code and description confirming the forwarding addresses were added. Use this to configure where incoming mail is forwarded; pass multiple addresses to forward to more than one recipient at once. Requires the numeric account_id from zohomail_account_list_user.
Parameters
Name
Type
Required
Description
account_id
string
Required
Numeric Zoho Mail account ID identifying the mailbox to add email forwarding to. This is a Zoho-generated internal identifier, not the user's email address, and it is typically a large integer such as 6000000012345. Obtain it from zohomail_account_list_user first.
forward_to_addresses
array
Required
One or more email addresses that incoming mail for this account should be forwarded to. Example: ["assistant@example.com", "archive@example.com"].
is_user_forward
boolean
Optional
Whether this forwarding rule is being set up by the account's own user (true) rather than by an administrator acting on the user's behalf (false). Optional; if omitted, Zoho uses its own default.
zohomail_account_delete_zoho_mail_copy_email_forwarding
Account delete zoho mail copy email forwarding
zohomail_account_disable_email_forwarding
Account disable email forwarding
zohomail_account_get
Get account
zohomail_account_list_user
Account list user
zohomail_account_remove_email_forwarding
Account remove email forwarding
zohomail_account_update_display_name
Account update display name
zohomail_antispam_update_dmarc_fail_option
Antispam update dmarc fail option
zohomail_bookmark_create
Create bookmark
zohomail_bookmark_edit
Bookmark edit
zohomail_bookmark_list_shared
Bookmark list shared
zohomail_domain_add_organization
Domain add organization
zohomail_domain_set_dkim_default
Domain set dkim default
zohomail_domain_verify_mx_record
Domain verify mx record
zohomail_folder_delete
Delete folder
zohomail_folder_mark_read
Read folder mark
zohomail_group_get
Get group
zohomail_group_update_name
Group update name
zohomail_message_archive_email
Message archive email
zohomail_message_get_email_headers
Message get email headers
zohomail_message_mark_email_not_spam
Message mark email not spam
zohomail_message_send_email
Message send email
zohomail_note_delete_book
Note delete book
zohomail_note_list
List note
zohomail_policy_assign_forward_restriction
Policy assign forward restriction
zohomail_policy_get_groups
Policy get groups
zohomail_policy_list_account_restrictions
Policy list account restrictions
zohomail_signature_add_user
Signature add user
zohomail_task_list_groups
Task list groups
zohomail_thread_move
Move thread

For more tools, view docs.

Build your Agent
Same auth pattern across LangChain, OpenAI, Anthropic, and Google ADK.
Python · LlamaIndex
import { ScalekitClient } from "@scalekit-sdk/node";
import { createReactAgent } from "@langchain/langgraph/prebuilt";

const sk = new ScalekitClient(env.SCALEKIT_ENV_URL, env.SCALEKIT_CLIENT_ID, env.SCALEKIT_CLIENT_SECRET);

// Zoho Mail tools scoped to this user
const { tools } = await sk.tools.listScopedTools("user_123", {
  filter: { connectionNames: ["zohomail"], toolNames: [
    "zohomail_message_list_search_results",
    "zohomail_message_get_email_content",
    "zohomail_message_send_email"] },
  pageSize: 100,
});

const agent = createReactAgent({ llm, tools });
await agent.invoke({ messages: [{ role: "user", content: "Find unread emails from acme.com this week that mention invoices" }] });
import OpenAI from "openai";
import { ScalekitClient } from "@scalekit-sdk/node";

const sk = new ScalekitClient(env.SCALEKIT_ENV_URL, env.SCALEKIT_CLIENT_ID, env.SCALEKIT_CLIENT_SECRET);
const openai = new OpenAI();

const { tools } = await sk.tools.listScopedTools("user_123", {
  filter: { connectionNames: ["zohomail"] }, pageSize: 100,
});

const res = await openai.chat.completions.create({
  model: "gpt-5",
  messages: [{ role: "user", content: "Find unread emails from acme.com this week that mention invoices" }],
  tools,
});

// Execute the tool call with the user's vaulted Zoho Mail token
await sk.tools.executeTool(res.choices[0].message.tool_calls[0], "user_123");
import Anthropic from "@anthropic-ai/sdk";
import { ScalekitClient } from "@scalekit-sdk/node";

const sk = new ScalekitClient(env.SCALEKIT_ENV_URL, env.SCALEKIT_CLIENT_ID, env.SCALEKIT_CLIENT_SECRET);
const anthropic = new Anthropic();

const { tools } = await sk.tools.listScopedTools("user_123", {
  filter: { connectionNames: ["zohomail"] }, pageSize: 100,
});

const msg = await anthropic.messages.create({
  model: "claude-sonnet-5",
  max_tokens: 1024,
  messages: [{ role: "user", content: "Find unread emails from acme.com this week that mention invoices" }],
  tools,
});

// Tool call runs with the user's vaulted Zoho Mail token
await sk.tools.executeTool(msg.content, "user_123");
import { Agent } from "@google/adk/agents";
import { ScalekitClient } from "@scalekit-sdk/node";

const sk = new ScalekitClient(env.SCALEKIT_ENV_URL, env.SCALEKIT_CLIENT_ID, env.SCALEKIT_CLIENT_SECRET);

const { tools } = await sk.tools.listScopedTools("user_123", {
  filter: { connectionNames: ["zohomail"] }, pageSize: 100,
});

const agent = new Agent({
  name: "inbox_agent",
  model: "gemini-2.5-pro",
  instruction: "Zoho Mail tools scoped to this user",
  tools,
});

await agent.run("Find unread emails from acme.com this week that mention invoices");
Try these prompts
Copy any prompt into your agent. Each maps directly to a Zoho Mail tool. Click to copy, paste into your agent, done.
Inbox
Copy the prompt
Copied
Find unread emails from acme.com this week.
Copy the prompt
Copied
Reply to the latest email from Dana confirming the Thursday call.
Copy the prompt
Copied
Move all newsletters from this week into the Reading folder.
Tasks and notes
Copy the prompt
Copied
List the tasks assigned to me.
Copy the prompt
Copied
Create a personal task to follow up on INV-2231 by Friday.
Copy the prompt
Copied
Search my notes for the vendor pricing comparison.
Admin
Copy the prompt
Copied
List the users in my Zoho Mail organization.
Copy the prompt
Copied
Set a vacation reply for next week.
Copy the prompt
Copied
Show login history for this account.
SEE HOW AUTH WORKS
Each user signs in to Zoho Mail once; Scalekit stores and refreshes their tokens. Tokens stay vaulted, every call is scope checked, and every action is logged.
1
Authorize
Your user connects
Zoho Mail
once. We tie it to their identity and the meetings they approved — no shared bot account, no org-wide access
Who:
user ‘A’
when:
Once per user
access:
Limited to user
2
Store
Their
Zoho Mail
token lives in a vault scoped to them. User A's meetings are never reachable by an agent acting for user B, even on the same connection
vault:
encrypted
scope:
per-user
tokens:
auto-refreshed
3
Resolve
When your agent calls a
Zoho Mail
tool, we fetch the right token server-side. It never touches your agent, never appears in the LLM context, never shows up in your logs
speed:
~40ms
check:
before every call
seen by:
nobody
4
Audit
Every
Zoho Mail
tool call is logged — who triggered it, which meeting was fetched, what came back. 90 days of history, tied to the user who authorized it
history:
90 days
export:
SIEM-ready
logged:
every call
Test other agents
See the same per-user auth pattern across other email and communication connectors.
Support and Ops Teams
Email-to-calendar agent
Reads scheduling intent out of Gmail threads, resolves the times everyone actually has free, and creates the event on the user's own Google Calendar. No shared service account.
Support and Ops Teams
Support triage agent
Fetches new Zendesk tickets, classifies them by type and urgency, searches the Notion knowledge base for an answer, and routes what it cannot resolve to Slack. Every call runs on the support agent's own delegated OAuth.
GTM and RevOps Teams
Outbound prospecting agent
Searches Apollo for prospects matching your ICP, scores and ranks them, drafts personalized outreach in Gmail, and logs every send to Google Sheets. Mail goes out as the rep, not from a shared inbox.
Support and Ops Teams
Meeting prep
Pulls agenda, participant context, and open action items before every meeting.
Test other agents
See the same per-user auth pattern across other email and communication connectors.
OPS
Email-to-calendar scheduling agent
Read scheduling intent out of Gmail threads, resolve mutual free time, and create the Google Calendar event.
SUPPORT
Support triage agent
Classify new Zendesk tickets, search the Notion knowledge base for an answer, and route what it cannot resolve to Slack.
SALES
Outbound prospecting agent
Search Apollo for ICP matches, rank them, draft personalised Gmail outreach, and log every send to Google Sheets.
OPS
Meeting prep agent
Assemble the agenda, HubSpot attendee history, and open action items from Gmail before every meeting on the calendar.
Why Scalekit
Secure your agent's access. Connectors ship in minutes
01.
Shared tokens break per-user analytics
A shared Zoho Mail token looks fine in a demo. In production every sent email looks like one service account, and you cannot tell which user triggered it. Scalekit resolves the credential of the actual user who triggered the agent, never a shared bot.
// shared key
audit → bot_service_account

// scalekit
audit → user_abc ✓
02.
Authentication is not authorization
03.
Multi-tenancy is architectural
04.
Zoho Mail today. Ten connectors tomorrow.
“Our agents act across Salesforce, Gong, Google Drive, and more, on behalf of every customer. Scalekit behind the scenes meant we can keep adding tools without ever rebuilding how credentials or tool calling work.”
Venu Madhav Kattagoni
Head of Engineering / Von
FAQs
Frequently Asked Questions
Does the agent access Zoho Mail as the user or as a shared key?
As the user. Each user signs in to Zoho Mail once, and Scalekit stores and refreshes their tokens. Audit logs attribute every action to that user, not a shared service account.
Where is the Zoho Mail OAuth token stored?
In Scalekit's managed AES-256 token vault, namespaced per tenant. Refresh is automatic. Revocation is a single dashboard action. Credentials never appear in prompts, logs, or LLM context.
Can I limit what the agent does in Zoho Mail?
Yes. Filter by tool name in listScopedTools to expose only what you want, for example message search and read tools without send, delete, or admin tools. Scalekit also enforces scope checks before every API call.
What happens when a user revokes Zoho Mail access?
The connection is invalidated on the next tool call. Subsequent requests for that user fail closed with a clear error. Other users in the tenant remain unaffected. The event is logged for audit.
What can the agent do in Zoho Mail?
245 tools across messages, threads, folders, labels, tasks, notes, bookmarks, signatures, accounts, users, groups, domains, anti-spam settings, policies, and audit logs. Of those, 74 read data, 145 write, and 26 delete or remove.
Start in your coding agent
Up and running in one command
Install the Scalekit skill in your editor of choice. Connector, auth, tools, prompt, all wired up
Claude Code REPL
/plugin marketplace add scalekit-inc/claude-code-authstack
/plugin install agentkit@scalekit-auth-stack
Cursor Code REPL
# ~/.cursor/mcp.json
{
""mcpServers"": {
""zohomail"": {
""url"": ""https://mcp.scalekit.com/zohomail"",
""headers"": { ""Authorization"": ""Bearer $SCALEKIT_TOKEN"" }
}
}
}
Codex Code REPL
# ~/.codex/config.toml
[mcp_servers.zohomail]
url = ""https://mcp.scalekit.com/zohomail""
auth_env = ""SCALEKIT_TOKEN""
Copilot Code REPL
# .vscode/mcp.json
{
""servers"": {
""zohomail"": {
""url"": ""https://mcp.scalekit.com/zohomail"",
""type"": ""http""
}
}
}