Zoho Books MCP server for AI agents

Live

OAUTH 2.0

ACCOUNTING

Accounting & Finance

Zoho Books gives your agent accounting operations in each user's Zoho Books organization: create and email invoices and estimates, record bills, expenses, and payments, post journals, and read the chart of accounts and bank transactions.

  • 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 Books
agent · Acme Q3
Run
Which invoices are overdue for Acme Corp?
S
zohobooks_invoices_list
131ms
Accounting agent
Acme Corp has 3 overdue invoices for $8,420 in total. The oldest, INV-00412, is 38 days past due.
Sources: Zoho Books invoices, 3 overdue
zohobooks
3 invoices
18:29
Message Claude...

Tools your accounting agent reaches for on Zoho Books, scoped per user.

CALL ANY TOOL
119 tools for accounting in Zoho Books: create and email invoices and estimates, record bills, expenses, and payments, post manual journals, and read bank transactions and the chart of accounts.
zohobooks_bank_account_get
Get bank account
Get one bank or credit card account by ID, including its balance and bank details. Returns a bankaccount object with account_id, account_name, account_code, currency_id, currency_code, currency_symbol. Use this when you have an account_id. Use bank_accounts_list to find accounts. Requires an organization_id from zohobooks_organizations_list.
Parameters
Name
Type
Required
Description
account_id
string
Required
Unique identifier of the bank account. Example: 460000000050127
organization_id
string
Required
ID of the Zoho Books organization to act on. Get it from zohobooks_organizations_list (organization_id field). Example: 10234695
zohobooks_bank_accounts_list
List bank accounts
zohobooks_bank_transaction_create
Create bank transaction
zohobooks_bill_mark_open
Open bill mark
zohobooks_bill_update
Update bill
zohobooks_contact_create
Create contact
zohobooks_contact_get
Get contact
zohobooks_contact_mark_inactive
Contact mark inactive
zohobooks_contact_persons_list
List contact persons
zohobooks_credit_note_update
Update credit note
zohobooks_estimate_create
Create estimate
zohobooks_estimate_get
Get estimate
zohobooks_estimate_mark_accepted
Estimate mark accepted
zohobooks_expenses_list
List expenses
zohobooks_invoice_comment_add
Add invoice comment
zohobooks_invoice_email
Invoice email
zohobooks_invoice_payment_reminder_send
Send invoice payment reminder
zohobooks_invoice_update
Update invoice
zohobooks_item_mark_active
Item mark active
zohobooks_journal_create
Create journal
zohobooks_journal_publish
Publish journal
zohobooks_organization_get
Get organization
zohobooks_organizations_list
List organizations
zohobooks_purchase_order_mark_open
Open purchase order mark
zohobooks_purchase_order_update
Update purchase order
zohobooks_recurring_invoice_stop
Stop recurring invoice
zohobooks_retainer_invoice_get
Get retainer invoice
zohobooks_sales_orders_list
List sales orders
zohobooks_sales_receipt_create
Create sales receipt
zohobooks_time_entry_get
Get time entry

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 Books tools scoped to this user
const { tools } = await sk.tools.listScopedTools("user_123", {
  filter: { connectionNames: ["zohobooks"], toolNames: [
    "zohobooks_invoices_list",
    "zohobooks_invoice_payment_reminder_send",
    "zohobooks_customer_payment_create"] },
  pageSize: 100,
});

const agent = createReactAgent({ llm, tools });
await agent.invoke({ messages: [{ role: "user", content: "Send payment reminders for every overdue invoice from Acme Corp" }] });
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: ["zohobooks"] }, pageSize: 100,
});

const res = await openai.chat.completions.create({
  model: "gpt-5",
  messages: [{ role: "user", content: "Send payment reminders for every overdue invoice from Acme Corp" }],
  tools,
});

// Execute the tool call with the user's vaulted Zoho Books OAuth 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: ["zohobooks"] }, pageSize: 100,
});

const msg = await anthropic.messages.create({
  model: "claude-sonnet-5",
  max_tokens: 1024,
  messages: [{ role: "user", content: "Send payment reminders for every overdue invoice from Acme Corp" }],
  tools,
});

// Tool call runs with the user's vaulted Zoho Books OAuth 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: ["zohobooks"] }, pageSize: 100,
});

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

await agent.run("Send payment reminders for every overdue invoice from Acme Corp");
Try these prompts
Copy any prompt into your agent. Each maps directly to a Zoho Books tool. Click to copy, paste into your agent, done.
Invoicing
Copy the prompt
Copied
Create an invoice for Acme Corp for 20 hours of consulting at $150.
Copy the prompt
Copied
Send a payment reminder for every overdue invoice from Acme Corp.
Copy the prompt
Copied
Record a $3,000 payment from Acme Corp against INV-00412.
Payables
Copy the prompt
Copied
Record a $1,240 bill from Northwind Hosting due on the 30th.
Copy the prompt
Copied
List unpaid bills due this week.
Copy the prompt
Copied
Log an $86 team lunch expense against Meals and Entertainment.
Ledger and projects
Copy the prompt
Copied
Show the transactions posted to the Office Supplies account last month.
Copy the prompt
Copied
Create a manual journal to accrue $5,000 of December rent.
Copy the prompt
Copied
Log 3 hours on the Website Redesign project for today.
SEE HOW AUTH WORKS
Each user signs in to Zoho Books once, and Scalekit stores and refreshes their tokens. Credentials stay vaulted, every call is scope checked, and every action is logged.
1
Authorize
Your user connects
Zoho Books
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 Books
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 Books
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 Books
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 accounting and finance connectors.
GTM and RevOps Teams
Revenue forecast commentary
Pulls open pipeline from Salesforce and HubSpot, calculates coverage against quota, flags at-risk stages, posts commentary to Slack, and logs every snapshot to Google Sheets.
GTM and RevOps Teams
CRM AI agent
Reads the Granola transcript after every call, extracts next steps and updates the HubSpot record, drafts the follow-up in Gmail, and confirms in Slack, all on the rep's own delegated OAuth.
Test other agents
See the same per-user auth pattern across other accounting and finance connectors.
GTM
Revenue forecast agent
Score pipeline coverage against quota across Salesforce and HubSpot, post forecast commentary to Slack, log snapshots to Sheets.
GTM
CRM AI agent
Turn each Granola call transcript into a HubSpot record update, a drafted Gmail follow-up, and a Slack recap.
Why Scalekit
Secure your agent's access. Connectors ship in minutes
01.
Shared tokens break per-user analytics
A shared Zoho Books token looks fine in a demo. In production every invoice, payment, and journal entry 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 token
audit → bot_service_account

// scalekit
audit → user_abc ✓
02.
Authentication is not authorization
03.
Multi-tenancy is architectural
04.
Zoho Books 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 Books as the user or through a shared service account?
As the user. Each user signs in to Zoho Books once, and Scalekit stores and refreshes their tokens. Invoices, payments, and journal entries the agent records are attributed to that user in your audit trail, not a shared service account.
Where is the Zoho Books 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 Books?
Yes. Filter by tool name in listScopedTools to expose only what you want, for example the list and get tools without zohobooks_invoice_email or zohobooks_invoice_mark_void, which send or void customer invoices. Scalekit also enforces scope checks before every API call.
What happens when a user revokes Zoho Books 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.
Which Zoho Books organization does the agent work in?
A Zoho Books user can belong to more than one organization. zohobooks_organizations_list returns the organizations the connected user belongs to, and the agent works in the one you pick, with that user's own Zoho Books role.
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"": {
""zohobooks"": {
""url"": ""https://mcp.scalekit.com/zohobooks"",
""headers"": { ""Authorization"": ""Bearer $SCALEKIT_TOKEN"" }
}
}
}
Codex Code REPL
# ~/.codex/config.toml
[mcp_servers.zohobooks]
url = ""https://mcp.scalekit.com/zohobooks""
auth_env = ""SCALEKIT_TOKEN""
Copilot Code REPL
# .vscode/mcp.json
{
""servers"": {
""zohobooks"": {
""url"": ""https://mcp.scalekit.com/zohobooks"",
""type"": ""http""
}
}
}