Summary
Let your AI work in Zoho Books: look up and manage customers, vendors and items, create, email, mark as sent and void invoices, create estimates, record customer payments, bills and expenses, and read the chart of accounts, account ledgers and bank transactions. Any Zoho data center, Zoho OAuth sign-in.
Guided setup
Connect Zoho Books to Microsoft Copilot in 2 minutes
Start a free trial on AnythingMCP Cloud, connect Zoho Books in the guided setup, then add your MCP URL to Microsoft Copilot. No code and no server to run.
No credit card · 7-day trial · Self-host alternative available
Try asking
Example prompts for Zoho Books
Click any prompt to copy it. Paste into Claude, ChatGPT, Cursor, Gemini, Copilot or OpenClaw to run it against this connector.
Claude is AI and can make mistakes. Please double-check responses.
💡 No install? Use cloud.anythingmcp.com directly. Sign in, click Connectors → Zoho Books, paste your credentials, mint an MCP API key and you're done. No Docker, no
git clone, no local server.
Zoho Books + Microsoft Copilot
Let your AI work in Zoho Books: look up and manage customers, vendors and items, create, email, mark as sent and void invoices, create estimates, record customer payments, bills and expenses, and read the chart of accounts, account ledgers and bank transactions. Any Zoho data center, Zoho OAuth sign-in.
Prerequisites
See the full setup instructions baked into the connector (visible in the in-app store when you select the connector). The required environment variables for this connector are:
ZOHO_BOOKS_CLIENT_ID, ZOHO_BOOKS_CLIENT_SECRET, ZOHO_BOOKS_ORGANIZATION_ID, ZOHO_BOOKS_ACCOUNTS_URL, ZOHO_BOOKS_API_URL
Step 1 — Get credentials
- Find your Zoho data center: it shows in the address bar when you use Zoho Books (for example books.zoho.eu or books.zoho.com). Set
ZOHO_BOOKS_ACCOUNTS_URLandZOHO_BOOKS_API_URLto that data center, without a trailing slash:https://accounts.zoho.euandhttps://www.zohoapis.eufor the EU,https://accounts.zoho.comandhttps://www.zohoapis.comfor the US. India, Australia, Japan, Saudi Arabia, the UAE and China follow the same pattern (.in,.com.au,.jp,.sa,.ae,.com.cn); Canada useshttps://accounts.zohocloud.caandhttps://www.zohoapis.ca. - Open the Zoho API Console at api-console.zoho.com, signed in with your Zoho account, and choose Add Client → Server-based Applications.
- Give the client a name (for example AnythingMCP), your company site as homepage URL and
https://cloud.anythingmcp.com/api/mcp-oauth/callbackas Authorized Redirect URI. If you host AnythingMCP yourself, enterhttps://your-anythingmcp-host/api/mcp-oauth/callbackinstead. Create the client. - On the Client Secret tab, copy the Client ID (it starts with
1000.) and the Client Secret intoZOHO_BOOKS_CLIENT_IDandZOHO_BOOKS_CLIENT_SECRET. If your Books organization lives in another data center than the one the console opened in, enable that data center on the client's Settings tab (Multi-DC) and use the client secret shown there for it. - Find the organization ID: in Zoho Books, click the organization name (top right) and open Manage Organizations; the ID is shown next to each organization. Paste the digits into
ZOHO_BOOKS_ORGANIZATION_ID. One connector works with one organization; install it again for a second one. - Install the connector, click Authorize with Provider on the connector page, sign in to Zoho and approve the requested access.
- Run
zoho_books_list_organizationsand check that your organization ID is listed, thenzoho_books_get_organizationto confirm the name and base currency before the AI reads or writes anything.
Staying signed in: access tokens last an hour and are renewed automatically with the stored refresh token, which does not expire unless it is revoked. Zoho keeps at most 20 refresh tokens per user and client: authorizing the same client a 21st time, in AnythingMCP or elsewhere, silently revokes the oldest one. If the connector loses its sign-in, click Authorize with Provider again.
Permissions and read-only setup: the connector asks for ZohoBooks.settings.ALL, ZohoBooks.contacts.ALL, ZohoBooks.invoices.ALL, ZohoBooks.estimates.ALL, ZohoBooks.customerpayments.ALL, ZohoBooks.bills.ALL, ZohoBooks.expenses.ALL, ZohoBooks.accountants.READ, ZohoBooks.banking.READ. Items, taxes and organization settings fall under ZohoBooks.settings, the chart of accounts under ZohoBooks.accountants. It works as the Zoho user who authorized it, within that user's role. For a read-only setup, change every .ALL to .READ in the connector's OAuth settings, authorize again and switch off zoho_books_create_contact, zoho_books_update_contact, zoho_books_mark_contact_inactive, zoho_books_create_item, zoho_books_update_item, zoho_books_mark_item_inactive, zoho_books_create_invoice, zoho_books_email_invoice, zoho_books_mark_invoice_sent, zoho_books_void_invoice, zoho_books_mark_invoice_draft, zoho_books_create_estimate, zoho_books_create_customer_payment, zoho_books_create_bill and zoho_books_create_expense.
Switched off at install: the delete tools zoho_books_delete_contact, zoho_books_delete_invoice, zoho_books_delete_estimate, zoho_books_delete_customer_payment, zoho_books_delete_bill and zoho_books_delete_expense. A deleted record cannot be restored, so turn one on only if the AI should really delete that kind of record.
Writes are real: zoho_books_email_invoice emails the customer from your organization, zoho_books_mark_invoice_sent and zoho_books_void_invoice change the books, and zoho_books_create_customer_payment, zoho_books_create_bill and zoho_books_create_expense post to the ledger. The AI says what it is about to book or send and waits for your yes. Recording a customer payment is bookkeeping only: no money is collected.
Invoices and corrections: a new invoice is a draft numbered by your organization's auto-numbering, and it is only emailed if you ask for it to go out at once. Zoho refuses to delete a sent invoice: void it with zoho_books_void_invoice instead. A void invoice stays on record, as bookkeeping rules such as Germany's GoBD expect, and zoho_books_mark_invoice_draft turns it back into an editable draft to correct and reissue.
Totals and balances: Zoho does not document a reports API for Books. For totals the AI reads balances from the chart of accounts, the bookings of one account with zoho_books_list_account_transactions, or lists filtered by date.
Limits: 100 requests per minute per organization and, per day, 1,000 on Free, 2,000 on Standard, 5,000 on Professional and 10,000 on Premium and above. Over a limit Zoho answers 429 (code 44 per minute, 45 per day): wait a minute, or until the next day.
Common errors: invalid_client at sign-in or an empty organization list means the two URLs are not your data center. 401 code 57 ("You are not authorized to perform this operation") or invalid_oauthtoken means the sign-in lacks a scope, was revoked, or ZOHO_BOOKS_API_URL is the wrong data center: check both URLs, then click Authorize with Provider again. 400 or 404 naming the organization means ZOHO_BOOKS_ORGANIZATION_ID is wrong or not visible to this user: compare it with zoho_books_list_organizations. Other 400 errors name the field (a duplicate name, an invalid value, a missing required field). Code 4529 means a sent invoice cannot be deleted: void it. Code 3000 when deleting a contact means invoices or payments still refer to it: use zoho_books_mark_contact_inactive.
The connector does not handle sales orders, purchase orders, credit notes, vendor payments, journals, projects, recurring invoices, attachments or PDFs.
Step 2 — Install the adapter
curl -fsSL https://raw.githubusercontent.com/HelpCode-ai/anythingmcp/main/docker-compose.quickstart.yml -o docker-compose.yml
printf 'JWT_SECRET=%s\nENCRYPTION_KEY=%s\n' "$(openssl rand -hex 32)" "$(openssl rand -hex 32)" > .env
docker compose up -d
Step 3 — Add the connector in Microsoft Copilot
Your server URL: in AnythingMCP, open MCP Servers → the server this connector is on, and copy its URL (
https://cloud.anythingmcp.com/mcp/…). Use it wherever this guide showsYOUR_SERVER_ID.
Microsoft Copilot uses MCP servers through agents built in Copilot Studio: you add AnythingMCP to an agent as a tool, then publish the agent to Microsoft 365 Copilot and Teams. Copilot Studio connects from Microsoft's cloud over Streamable HTTP, which AnythingMCP supports.
- In Copilot Studio, open your agent (or create one), go to Tools and choose Add a tool → New tool → Model Context Protocol.
- Enter a Server name (for example
AnythingMCP), a Server description that says what the connector does, and the Server URLhttps://cloud.anythingmcp.com/mcp/YOUR_SERVER_ID. Copilot Studio uses the description to decide when to call the server. - Under authentication, choose API key, set Type to Header and the header name to
X-API-Key, then select Create. - In Add tool, choose Create a new connection, paste an MCP API key from AnythingMCP (MCP Servers → your server → API keys) and select Add to agent.
- Try it in the agent's Test pane: ask for something that needs the
Zoho Bookstools. - Select Publish, then Channels → Microsoft 365 and Microsoft Teams, keep Make agent available in Microsoft Copilot selected and choose Add channel. See agent in Teams installs it for you; in Microsoft 365 Copilot, type @ and pick the agent.
Prefer per-user sign-in? Choose OAuth 2.0 → Dynamic discovery instead of an API key: each user then signs in to AnythingMCP the first time the agent calls it.
Self-hosting? Use your instance's public HTTPS address instead of https://cloud.anythingmcp.com. Copilot Studio connects from Microsoft's cloud, so localhost does not work.
Available tools
| Tool | What it does |
|---|---|
zoho_books_list_organizations | List the Zoho Books organizations this sign-in can reach: organization_id, name, country, currency, time zone and whether it is the default |
zoho_books_get_organization | Read the connected organization: name, address, base currency, fiscal year start, time zone, tax settings and contact details |
zoho_books_list_contacts | List contacts (customers and vendors) with contact_id, name, company, email, status and outstanding receivables or payables |
zoho_books_get_contact | Read one contact with addresses, contact persons, payment terms, currency, balances and custom fields |
zoho_books_create_contact | Create a customer or vendor |
zoho_books_update_contact | Update a contact |
zoho_books_mark_contact_inactive | Mark a contact inactive: it stays in the books but is hidden from lists and cannot be used on new transactions |
zoho_books_delete_contact | Delete a contact for good |
zoho_books_list_items | List items (products and services) with item_id, name, SKU, rate, unit, tax and status |
zoho_books_get_item | Read one item with selling and purchase prices, accounts, tax, unit and stock details |
zoho_books_create_item | Create an item (product or service) |
zoho_books_update_item | Update an item |
zoho_books_mark_item_inactive | Mark an item inactive so it can no longer be added to new documents |
zoho_books_list_invoices | List invoices with invoice_id, number, customer, status, date, due date, total and balance |
zoho_books_get_invoice | Read one invoice with line items, taxes, totals, balance, payments, customer and status |
zoho_books_create_invoice | Create an invoice (a draft, unless send is true, which also emails it to the customer: confirm that with the user first) |
zoho_books_email_invoice | Email an invoice to the customer from the organization, with the invoice attached |
zoho_books_mark_invoice_sent | Mark a draft invoice as sent without emailing it (for invoices delivered another way) |
zoho_books_void_invoice | Void an invoice: it stays on record with status void but no longer counts as receivable or revenue |
zoho_books_mark_invoice_draft | Turn a void invoice back into a draft, for example to correct and reissue it |
zoho_books_delete_invoice | Delete an invoice for good: only a draft without recorded payments |
zoho_books_list_estimates | List estimates (quotes) with estimate_id, number, customer, status, date, expiry date and total |
zoho_books_get_estimate | Read one estimate with line items, taxes, totals and status |
zoho_books_create_estimate | Create an estimate (quote) as a draft |
zoho_books_delete_estimate | Delete an estimate (quote) for good; it cannot be restored |
zoho_books_list_customer_payments | List payments received from customers with payment_id, customer, date, amount, payment mode and the invoices they paid |
zoho_books_get_customer_payment | Read one customer payment with the invoices it was applied to |
zoho_books_create_customer_payment | Record a payment received from a customer and apply it to invoices (bookkeeping only; no money is collected) |
zoho_books_delete_customer_payment | Delete a recorded customer payment; the invoices become unpaid again |
zoho_books_list_bills | List bills (vendor invoices) with bill_id, number, vendor, status, date, due date, total and balance |
zoho_books_get_bill | Read one bill with line items, accounts, taxes, totals, balance and payments |
zoho_books_create_bill | Record a bill received from a vendor (it posts to the ledger as payable) |
zoho_books_delete_bill | Delete a bill for good (only without recorded payments) |
zoho_books_list_expenses | List expenses with expense_id, date, account, amount, vendor, customer and status (billable, invoiced, ...) |
zoho_books_get_expense | Read one expense with account, paid-through account, tax, vendor, customer and receipts |
zoho_books_create_expense | Record an expense paid from a bank, cash or credit card account (it posts to the ledger) |
zoho_books_delete_expense | Delete an expense for good; its ledger postings are removed |
zoho_books_list_chart_of_accounts | List the chart of accounts: account_id, name, code, type (asset, liability, equity, income, expense, bank, cash, ...), active flag and… |
zoho_books_get_account | Read one account of the chart of accounts: name, code, type, currency, description and balance |
zoho_books_list_account_transactions | List the transactions booked on one account (invoices, payments, bills, expenses, journals) with date, debit, credit and reference: a… |
zoho_books_list_bank_accounts | List bank, cash and credit card accounts with account_id, name, type, currency, balance and bank name |
zoho_books_get_bank_account | Read one bank or credit card account with balance and bank details |
zoho_books_list_bank_transactions | List bank transactions (deposits, withdrawals, transfers and feed lines) with date, amount, type, status (categorized, uncategorized… |
zoho_books_get_bank_transaction | Read one bank transaction with its accounts, amounts and the documents it is matched to |
zoho_books_list_taxes | List the organization's taxes and tax groups with tax_id, name, percentage and type, for line items and expenses |
Example prompts
- "Which invoices are overdue, and how much does each customer still owe?"
- "Show me the balance of our Office Supplies expense account and every booking on it in September."
- "Create a draft invoice for Acme Ltd: 12 hours of Consulting at 95 EUR, due in 14 days. Don't send it yet."
- "Record today's bank transfer of 1,140 EUR from Acme Ltd as a payment against invoice INV-000123."
FAQ
Which Copilot is this for? Microsoft 365 Copilot at work, through agents built in Copilot Studio. The Microsoft Copilot app for personal accounts has no option to add your own MCP server.
What do I need? A work account with access to Copilot Studio (a license or a trial) to build the agent. People who use it in Microsoft 365 Copilot or Teams need access to the agent: share it with them, or ask an admin to publish it to the organization. If your organization applies data policies to Power Platform connectors, they cover MCP servers too.
The agent doesn't call the tools. Check that the header name is exactly X-API-Key and that the key belongs to the same MCP server as the URL, and make the server description specific: Copilot Studio uses it to decide when to call the server. Publish the agent again after each change; in an open chat, type "start over" to get the new version.
Next steps
- Connector landing page
- Connect to Claude
- Connect to ChatGPT
- Connect to Cursor
- Connect to Gemini
- Connect to Meta Muse
Was this guide helpful?