Skip to content
Conduit

skill

zoho-cli

CLI for Zoho REST APIs (CRM, Projects, WorkDrive, Writer, Cliq)

flyingbits/zoho-clicommunitylistedunreviewed

Set up

Skills are installed by placing their folder where your agent loads skills.

The download comes from github.com/flyingbits/zoho-cli itself, not from our server, so what you get is exactly what its author published.

Install instructions come from the README

Skills do not use an MCP config. Follow the steps in the README below.

README

synced Oct 23, 2026

zoho-cli

CLI for Zoho's REST APIs. Covers CRM, Projects, WorkDrive, Writer, Cliq, Expense, Invoice, Inventory, and Mail — single binary, JSON to stdout — 797 commands total (added 679 commands for Mail/Expense/Invoice/Inventory).

No other tool does this. Zoho's own CLIs (ZET, Catalyst) are for building extensions, not talking to the API. Their Python SDK covers CRM only and requires MySQL for token storage.

Getting started

You'll need two things: the binary and a Zoho API app. Takes about five minutes.

Install

From source (Go 1.22+):

go install github.com/omin8tor/zoho-cli/cmd/zoho@latest

Or grab a prebuilt binary from releases — unpack it, put it on your PATH.

Set up a Zoho API app

Go to api-console.zoho.com and create a "Self Client" app. You'll get a client ID and secret.

Authenticate

If you're a human at a terminal, use device flow:

zoho auth login --client-id YOUR_ID --client-secret YOUR_SECRET

This opens your browser, you approve the scopes, and you're done. Tokens are saved to ~/.config/zoho-cli/config.json and auto-refresh.

If you're a script or agent, use env vars:

export ZOHO_CLIENT_ID=1000.ABC123
export ZOHO_CLIENT_SECRET=xyz789
export ZOHO_REFRESH_TOKEN=1000.refresh_token_here
export ZOHO_DC=com

(You can also use zoho auth self-client to exchange a code from the API Console.)

Check that it works:

zoho auth status

Tutorial: your first queries

Everything below assumes you've authenticated. Output is always JSON to stdout, errors to stderr. Pipe into jq for filtering.

CRM: look up contacts

List contacts, pulling specific fields:

zoho crm records list Contacts --fields "Full_Name,Email,Phone"

Get one contact by ID:

zoho crm records get Contacts 5551234000000012345 --fields "Full_Name,Email"

Search by criteria — find closed-won deals:

zoho crm records search Deals --criteria "(Stage:equals:Closed Won)" --fields "Deal_Name,Amount"

Create a lead:

zoho crm records create Leads --json '{"Last_Name":"Ochoa","Company":"Acme"}'

CRM v8 requires the --fields param on most read endpoints. If you forget it, the API returns empty records. That's Zoho, not us.

CRM: search across everything

zoho crm search-global --searchword "Ochoa" --fields "Full_Name,Email"

CRM: COQL queries

If criteria-based search isn't flexible enough, use COQL (Zoho's SQL-like query language):

zoho crm coql --query "SELECT Full_Name, Email FROM Contacts WHERE Email LIKE '%@acme.com' LIMIT 10"

This needs the ZohoCRM.coql.READ scope — it's separate from the general CRM scopes.

Projects: find your tasks

You need a portal ID. List your portals first:

zoho projects core list

Grab the portal ID from the output, then:

zoho projects tasks my --portal 12345

List all tasks in a project:

zoho projects tasks list --portal 12345 --project 67890

Filter open tasks with jq:

zoho projects tasks my --portal 12345 | jq '[.[] | select(.status.name == "Open")]'

WorkDrive: navigate and download

Find your team:

zoho drive teams me

List top-level folders:

zoho drive folders list --team TEAM_ID

List files in a folder:

zoho drive files list --folder FOLDER_ID

Download a file:

zoho drive download FILE_ID --output ./report.pdf

Upload a file:

zoho drive upload ./quarterly.xlsx --folder FOLDER_ID

Writer: work with documents

List documents:

zoho writer list --limit 10

Get document details:

zoho writer details DOC_ID

Merge data into a template and export as PDF:

zoho writer merge DOC_ID --json '{"name":"Alice","date":"2025-01-15"}' --format pdf --output ./letter.pdf

Cliq: send messages

List channels:

zoho cliq channels list

Send a DM:

zoho cliq buddies message someone@company.com --text "quarterly report is ready"

Mail: send messages

Send an email (user-level account API):

zoho mail messages send --account ZOHO_MAIL_ACCOUNT_ID --json '{"fromAddress":"a@x.com","toAddress":"b@x.com","subject":"Test","content":"Hello"}'

Piping and composition

The whole point is composability. Everything is JSON, so chain with jq, xargs, whatever:

# Get all emails from contacts
zoho crm records list Contacts --fields "Email" | jq -r '.[].Email'

# Download every file in a folder
zoho drive files list --folder FOLDER_ID | jq -r '.[].id' | xargs -I{} zoho drive download {} --output ./downloads/

# Find overdue tasks
zoho projects tasks my --portal 12345 | jq '[.[] | select(.end_date < "2025-01-01")]'

Default IDs via environment

If you use the same portal or team repeatedly, set these env vars to skip the flags:

export ZOHO_PORTAL_ID=12345        # default for --portal (Projects commands)
export ZOHO_TEAM_ID=abc123         # default for --team (WorkDrive commands)
export ZOHO_INVOICE_ORG_ID=...    # default for --org (Invoice commands)
export ZOHO_EXPENSE_ORG_ID=...    # default for --org (Expense commands)
export ZOHO_INVENTORY_ORG_ID=...  # default for --org (Inventory commands)
export ZOHO_MAIL_ORG_ID=...       # default for --org (Mail org-level APIs)
export ZOHO_MAIL_ACCOUNT_ID=...  # default for --account (Mail account-level APIs)

The flag always overrides the env var. If neither is set, the command fails with a clear error.

Data centers

Zoho runs in 9 data centers. Set via ZOHO_DC env var or --dc flag on auth commands:

com (US, default) · eu · in · com.au · jp · ca · sa · uk · com.cn

Supported products

ProductStatusCommands
CRMSupported29
ProjectsSupported39
WorkDriveSupported26
WriterSupported8
CliqSupported12
DeskPlanned—
BooksPlanned—
PeoplePlanned—
RecruitPlanned—
AnalyticsPlanned—
SignPlanned—
CampaignsPlanned—
MailSupported172
CalendarPlanned—
SheetSupported97
ShowPlanned—
InventorySupported160
InvoiceSupported267
ExpenseSupported80
BillingPlanned—
FormsPlanned—
SalesIQPlanned—
BookingsPlanned—
SocialPlanned—
SurveyPlanned—
MeetingPlanned—
ConnectPlanned—
FlowPlanned—
CreatorPlanned—
SprintsPlanned—
BugTrackerPlanned—
BiginPlanned—
VoicePlanned—
CommercePlanned—
BackstagePlanned—
Marketing AutomationPlanned—
FSMPlanned—
AssistPlanned—
DirectoryPlanned—
ShiftsPlanned—
ContractsPlanned—
PracticePlanned—
CheckoutPlanned—
LensPlanned—
LearnPlanned—
ZeptoMailPlanned—
NotebookPlanned—
TeamInboxPlanned—
Office IntegratorPlanned—
ToDoPlanned—
PDF EditorPlanned—
IoTPlanned—
DataPrepPlanned—
AppticsPlanned—
VaultPlanned—
CatalystPlanned—
WebinarPlanned—
PageSensePlanned—
LandingPagePlanned—
CommunitySpacesPlanned—
ThrivePlanned—
SitesPlanned—
RouteIQPlanned—
WorkerlyPlanned—
SoloPlanned—
ProcurementPlanned—

Want a product prioritized? Open an issue.

Run zoho --help-all for the full command reference with every flag.

Agent Skill

This repo ships as an Agent Skill so LLM agents can discover and use it. The skill definition is in SKILL.md with detailed references in references/.

Development

go build -o zoho ./cmd/zoho/
go test ./...
go vet ./...

Or with mise:

mise run build    # build binary
mise run test     # unit tests
mise run lint     # go vet

License

GPL-3.0

↑↓ navigate openesc close