zoho-bookkeeper-mcp
Provides integration with Zoho Books for bookkeeping workflows, including full CRUD operations for journals, expenses, bills, and invoices; file attachments with multipart upload support; chart of accounts management; bank account integration; contact management; and OAuth 2.0 authentication with automatic token refresh.
Click on "Install Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@zoho-bookkeeper-mcpCreate a new expense for office supplies"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
Zoho Bookkeeper MCP Server
A Model Context Protocol (MCP) server for Zoho Books integration, designed for bookkeeping workflows with AI agents.
Why This Exists
The official Zoho MCP service (zohomcp.com) has limitations:
Cannot upload file attachments - The MCP schema incorrectly maps binary file parameters as query strings
Too many tools - 100+ tools exhaust AI tool limits quickly
Difficult control over tool selection - The mcp.zoho.com interface is troublesome and cannot be used by agents
This custom MCP server provides:
Proper multipart/form-data file uploads for attachments
Curated set of 49 tools for bookkeeping workflows
Auto-refreshing OAuth tokens (1-hour lifetime with 5-minute buffer)
Both stdio (CLI) and HTTP stream transports
Related MCP server: Zoho CRM + Books MCP Server
Features
Full CRUD operations for journals, expenses, bills, and invoices
File attachments with proper multipart upload support (PDF, images, Office documents)
Chart of accounts management and transaction queries
Bank account integration and transaction listing
Contact management for customers and vendors
OAuth 2.0 with automatic token refresh
Health checks for container orchestration
Available Tools (49 total)
Category | Tools | Description |
Organizations | 2 | List orgs, get org details |
Chart of Accounts | 4 | List/get/create accounts, list transactions |
Journals | 9 | Full CRUD + publish + attachments |
Expenses | 6 | Full CRUD + receipt attachments |
Bills | 6 | Full CRUD + attachments |
Invoices | 5 | List/get + attachments |
Contacts | 2 | List/get customers and vendors |
Vendors | 4 | Vendor-specific list/get/create/update workflows |
Bank Accounts | 11 | List accounts/transactions + matching + categorization workflows |
Prerequisites
Node.js 20+
Zoho Books account with API access
Zoho OAuth 2.0 credentials (see Configuration)
Installation
Option 1: Run with npx (Recommended for Desktop Agents)
npx zoho-bookkeeper-mcpOption 2: Install globally
npm install -g zoho-bookkeeper-mcp
zoho-bookkeeper-mcpOption 3: Docker
docker build -t zoho-bookkeeper-mcp .
docker run -p 8004:8004 \
-e ZOHO_CLIENT_ID=your_client_id \
-e ZOHO_CLIENT_SECRET=your_client_secret \
-e ZOHO_REFRESH_TOKEN=your_refresh_token \
zoho-bookkeeper-mcpOption 4: From source
git clone https://github.com/bu5hm4nn/zoho-bookkeeper-mcp.git
cd zoho-bookkeeper-mcp
pnpm install
pnpm buildConfiguration
Run the interactive setup:
pnpm setupThis will guide you through:
Creating a Zoho Self-Client application
Entering your Client ID and Secret
Generating and exchanging an authorization code
Saving credentials to
.env
Manual Configuration
If you prefer manual setup, copy .env.example to .env and follow the Zoho OAuth Documentation to obtain:
ZOHO_CLIENT_ID- from Zoho API ConsoleZOHO_CLIENT_SECRET- from Zoho API ConsoleZOHO_REFRESH_TOKEN- obtained via OAuth authorization code flow with scopeZohoBooks.fullaccess.all
Environment Variables
The .env file should contain:
# Required
ZOHO_CLIENT_ID=1000.xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
ZOHO_CLIENT_SECRET=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
ZOHO_REFRESH_TOKEN=1000.xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx.xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
# Optional
ZOHO_API_URL=https://www.zohoapis.com/books/v3 # Default (US datacenter)
ZOHO_ORGANIZATION_ID=123456789 # Default org ID (optional)
PORT=8004 # HTTP server port
HOST=0.0.0.0 # HTTP server hostRegional API URLs:
US (default):
https://www.zohoapis.com/books/v3EU:
https://www.zohoapis.eu/books/v3IN:
https://www.zohoapis.in/books/v3AU:
https://www.zohoapis.com.au/books/v3
Integration with Chat Agents
Claude Desktop
Add to your Claude Desktop configuration (~/Library/Application Support/Claude/claude_desktop_config.json on macOS):
{
"mcpServers": {
"zoho-bookkeeper": {
"command": "npx",
"args": ["zoho-bookkeeper-mcp"],
"env": {
"ZOHO_CLIENT_ID": "your_client_id",
"ZOHO_CLIENT_SECRET": "your_client_secret",
"ZOHO_REFRESH_TOKEN": "your_refresh_token"
}
}
}
}Or if installed globally:
{
"mcpServers": {
"zoho-bookkeeper": {
"command": "zoho-bookkeeper-mcp",
"env": {
"ZOHO_CLIENT_ID": "your_client_id",
"ZOHO_CLIENT_SECRET": "your_client_secret",
"ZOHO_REFRESH_TOKEN": "your_refresh_token"
}
}
}
}LibreChat
Add to your librechat.yaml:
mcpServers:
zoho-bookkeeper:
type: streamable-http
url: http://mcp-zoho-bookkeeper:8004/mcp
timeout: 30000And to your docker-compose.yml:
services:
mcp-zoho-bookkeeper:
build:
context: ./path/to/zoho-bookkeeper-mcp
container_name: mcp-zoho-bookkeeper
restart: unless-stopped
environment:
PORT: 8004
ZOHO_CLIENT_ID: ${ZOHO_CLIENT_ID}
ZOHO_CLIENT_SECRET: ${ZOHO_CLIENT_SECRET}
ZOHO_REFRESH_TOKEN: ${ZOHO_REFRESH_TOKEN}
ports:
- "8004:8004"
healthcheck:
test: ["CMD", "wget", "--quiet", "--tries=1", "--spider", "http://localhost:8004/health"]
interval: 30s
timeout: 10s
retries: 3
start_period: 30sGeneric MCP Client (HTTP)
Start the HTTP server:
# Using pnpm
pnpm serve
# Or directly
node dist/server.jsConnect to http://localhost:8004/mcp using streamable-http transport.
Generic MCP Client (stdio)
# Using pnpm
pnpm start
# Or directly
node dist/bin.jsUsage Examples
Get Organization ID (Required First Step)
Most tools require an organization_id. Get it first:
Use the list_organizations tool to get your Zoho organization IDCreate a Journal Entry
Create a journal entry dated 2025-01-15 with:
- Debit Office Supplies (account_id: 123456) for $150
- Credit Business Checking (account_id: 789012) for $150
Reference: "Office supplies purchase"Attach a Receipt
Upload the file /path/to/receipt.pdf to journal 4567890123456List Recent Expenses
List all expenses from the last 30 daysDevelopment
Setup
git clone https://github.com/bu5hm4nn/zoho-bookkeeper-mcp.git
cd zoho-bookkeeper-mcp
pnpm installCommands
pnpm build # Build TypeScript to dist/
pnpm dev # Run with hot reload (HTTP server)
pnpm serve:dev # Same as dev
pnpm start # Run stdio transport
pnpm serve # Run HTTP server
pnpm test # Run all tests
pnpm test:unit # Run unit tests only
pnpm test:watch # Run tests in watch mode
pnpm test:coverage # Run tests with coverage
pnpm lint # Check for linting errors
pnpm lint:fix # Fix linting errors
pnpm format # Format code with Prettier
pnpm format:check # Check formattingProject Structure
zoho-bookkeeper-mcp/
├── src/
│ ├── index.ts # Main MCP server setup
│ ├── server.ts # HTTP server entry point
│ ├── bin.ts # CLI entry point (stdio)
│ ├── config.ts # Configuration management
│ ├── api/
│ │ ├── client.ts # Zoho API client helpers
│ │ └── types.ts # TypeScript type definitions
│ ├── auth/
│ │ └── oauth.ts # OAuth token management
│ ├── tools/
│ │ ├── organizations.ts
│ │ ├── chart-of-accounts.ts
│ │ ├── journals.ts
│ │ ├── expenses.ts
│ │ ├── bills.ts
│ │ ├── invoices.ts
│ │ ├── contacts.ts
│ │ └── bank-accounts.ts
│ ├── utils/
│ │ ├── errors.ts
│ │ ├── mime-types.ts
│ │ └── response-parser.ts
│ └── __tests__/ # Test files
├── dist/ # Compiled JavaScript
├── Dockerfile
├── package.json
└── tsconfig.jsonAPI Endpoints
When running as HTTP server:
Endpoint | Description |
| Health check (returns JSON status) |
| MCP protocol endpoint (streamable-http) |
Troubleshooting
"Invalid OAuth token" errors
Verify your refresh token is valid
Check that your Zoho app has the
ZohoBooks.fullaccess.allscopeEnsure the correct regional API URL is set
"Organization not found" errors
Use
list_organizationsfirst to get valid org IDsSet
ZOHO_ORGANIZATION_IDenv var for default org
Attachment upload fails
Verify the file path is accessible to the server
Check file type is supported (PDF, PNG, JPG, GIF, DOC, DOCX, XLS, XLSX)
Ensure file size is within Zoho's limits
Rate limiting
This server uses ~3k tokens per request vs ~30k for the hosted Zoho MCP (100+ tools). If you still hit rate limits, add delays between requests.
Tech Stack
Runtime: Node.js 20+
Framework: FastMCP
Language: TypeScript
Auth: OAuth 2.0 with refresh token flow
Build: tsup
Testing: Vitest
Linting: ESLint + Prettier
License
MIT License - see LICENSE for details.
Contributing
Contributions are welcome! Please open an issue or submit a pull request.
Related Projects
Model Context Protocol - The protocol specification
FastMCP - The MCP framework used by this server
Zoho Books API - Official Zoho Books API documentation
Available Tools
49 toolsadd_bill_attachmentA
Upload a file attachment to a bill. Supported file types: PDF, PNG, JPG, JPEG, GIF, DOC, DOCX, XLS, XLSX. Use this to attach vendor invoices or supporting documents.
| Name | Required | Description | Default |
|---|---|---|---|
| organization_id | No | Zoho org ID (uses ZOHO_ORGANIZATION_ID env var if not provided) | |
| bill_id | Yes | Bill ID to attach file to | |
| file_path | Yes | Full local file path to the attachment |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate a mutation (readOnlyHint=false). The description adds supported file types but omits other behavioral details such as file size limits, overwrite behavior, error conditions (e.g., file not found), or permission requirements. It provides moderate additional context beyond annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is three sentences with no fluff. The first sentence states the core purpose, the second lists file types, and the third gives usage context. It is well-structured and front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description covers file types and a common use case, but it lacks information about return values (e.g., attachment ID), potential failure modes, or how it differs from similar tools (e.g., add_invoice_attachment). Given the absence of an output schema, more detail on what the agent can expect after invocation would improve completeness.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, and the schema describes each parameter adequately (including env var fallback for organization_id). The description adds no parameter-specific information beyond what the schema provides, meeting the baseline.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action ('Upload a file attachment to a bill') and identifies the resource. It lists supported file types and suggests use cases ('vendor invoices or supporting documents'). However, it does not explicitly differentiate from sibling tools like add_invoice_attachment, which also attach files to documents.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description includes 'Use this to attach vendor invoices or supporting documents,' providing some context. But it does not advise when not to use it (e.g., for invoice attachments) or compare with sibling tools. Usage guidance is implicit rather than explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
add_expense_receiptA
Upload a receipt attachment to an expense. Supported file types: PDF, PNG, JPG, JPEG, GIF, DOC, DOCX, XLS, XLSX. Use this to attach scanned receipts or invoice images. Files must be in allowed directories and under 10MB.
| Name | Required | Description | Default |
|---|---|---|---|
| organization_id | No | Zoho org ID (uses ZOHO_ORGANIZATION_ID env var if not provided) | |
| expense_id | Yes | Expense ID to attach receipt to | |
| file_path | Yes | Full local file path to the receipt |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description discloses file type restrictions, size limit, and directory constraints, adding context beyond the annotations. It does not contradict annotations and clarifies the write nature of the tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise with three sentences, front-loading the main purpose, then providing file types and usage guidance. No redundant information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description adequately covers file types, size, and allowed directories for an upload tool. It lacks details on error handling or duplicate behavior, but this is acceptable given the tool's simplicity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so parameters are described in the schema. The description adds general context (file types, size) but does not enhance individual parameter meanings beyond what the schema provides.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's action ('Upload a receipt attachment to an expense') and lists supported file types, distinguishing it from sibling tools that handle attachments for bills, invoices, and journals.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides explicit use cases ('attach scanned receipts or invoice images') and constraints (file types, size limit), but does not explicitly state when not to use this tool or mention alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
add_invoice_attachmentA
Upload a file attachment to an invoice. Supported file types: PDF, PNG, JPG, JPEG, GIF, DOC, DOCX, XLS, XLSX. Use this to attach supporting documents to invoices.
| Name | Required | Description | Default |
|---|---|---|---|
| organization_id | No | Zoho org ID (uses ZOHO_ORGANIZATION_ID env var if not provided) | |
| invoice_id | Yes | Invoice ID to attach file to | |
| file_path | Yes | Full local file path to the attachment |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations indicate readOnlyHint=false and openWorldHint=true. The description adds file type restrictions and a usage hint, but does not elaborate on side effects, permissions, or behavior beyond upload.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two efficient sentences: purpose first, then file types, then usage hint. No wasted words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple upload tool with three parameters and no output schema, the description covers purpose, file type constraints, and usage context. It could mention what happens on success (e.g., attachment ID) but is adequate.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%; each parameter already has a description. The tool description does not add any additional parameter-specific information beyond what the schema provides.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states it uploads a file attachment to an invoice, with supported file types. It distinguishes from siblings like add_bill_attachment and add_expense_receipt by specifying 'invoice'.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description says 'Use this to attach supporting documents to invoices', providing clear context for when to use it. It does not explicitly mention alternatives or when not to use, but the sibling list implies other tools for different resources.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
add_journal_attachmentA
Upload a file attachment to a journal entry. Supported file types: PDF, PNG, JPG, JPEG, GIF, DOC, DOCX, XLS, XLSX. Use this to attach invoices, receipts, or supporting documents to journal entries. Files must be in allowed directories and under 10MB.
| Name | Required | Description | Default |
|---|---|---|---|
| organization_id | No | Zoho org ID (uses ZOHO_ORGANIZATION_ID env var if not provided) | |
| journal_id | Yes | Journal ID to attach file to | |
| file_path | Yes | Full local file path to the attachment |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations indicate this is a write operation (readOnlyHint=false) and may have side effects (openWorldHint=true). The description adds useful behavioral details: supported file types, 10MB size limit, and directory restrictions, which go beyond annotations and help the agent understand constraints.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise (4 sentences), front-loaded with the main action, and provides details in a logical order. Every sentence adds value, though it could be slightly tighter.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description covers file constraints and use cases but does not mention return values or what happens after upload (e.g., success message, attachment ID). Given no output schema and modest complexity, it is adequate but has gaps.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 100% schema description coverage, the schema already clearly documents parameters. The description does not add new semantic meaning beyond what is in the schema (e.g., env var fallback for organization_id is mentioned in schema). Baseline score of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool uploads a file attachment to a journal entry, listing supported file types and use cases. It distinguishes from siblings by specifying 'journal entry' but does not explicitly contrast with other add_attachment tools like add_bill_attachment or add_invoice_attachment.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives usage context: attaching invoices/receipts to journal entries, and provides constraints (file types, size, directories). However, it lacks explicit when-not-to-use guidance or alternatives such as using add_bill_attachment for bills.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
categorize_bank_transaction_as_customer_paymentA
Categorize an uncategorized bank transaction as a customer payment. Use this when the bank line represents receipt of payment for one or more invoices. Prefer matching when the bank line should be linked to an existing Zoho transaction, and use manual journals only for exception cases that cannot be matched or categorized cleanly.
| Name | Required | Description | Default |
|---|---|---|---|
| organization_id | No | Zoho org ID (uses ZOHO_ORGANIZATION_ID env var if not provided) | |
| transaction_id | Yes | Uncategorized bank transaction ID | |
| customer_id | Yes | Customer ID | |
| invoices | Yes | Invoices to apply the payment against | |
| amount | Yes | Total customer payment amount | |
| date | Yes | Payment date (YYYY-MM-DD) | |
| account_id | Yes | Bank account ID receiving the payment | |
| payment_mode | No | Optional payment mode such as Cash or Cheque | |
| description | No | Optional payment description | |
| reference_number | No | Optional reference number | |
| exchange_rate | No | Optional exchange rate | |
| bank_charges | No | Optional bank charges |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate non-read-only (readOnlyHint=false). The description adds context by mentioning linking to invoices, but lacks explicit details about side effects or required permissions.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, front-loaded with purpose, no wasted words. Efficient and to the point.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema, but for a mutation tool this is acceptable. Description covers purpose, usage context, and alternatives. Sibling tools like match_bank_transaction are referenced, providing broader context.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so baseline is 3. The description adds minimal parameter guidance beyond the schema; it mentions prefer matching vs. categories but doesn't elaborate on specific parameter usage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb 'categorize' and the resource 'bank transaction as customer payment', distinguishing it from siblings like categorize_bank_transaction_as_expense by specifying it applies to receipt of payment for invoices.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly states when to use this tool (bank line represents receipt for invoices) and provides alternatives: 'Prefer matching' for existing transactions and 'manual journals' for exceptions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
categorize_bank_transaction_as_expenseA
Categorize an uncategorized bank transaction as an expense. Use this for routine spending that should become a new expense record. Prefer matching when the bank line should be linked to an existing Zoho transaction, and use manual journals only for exception cases that cannot be matched or categorized cleanly.
| Name | Required | Description | Default |
|---|---|---|---|
| organization_id | No | Zoho org ID (uses ZOHO_ORGANIZATION_ID env var if not provided) | |
| transaction_id | Yes | Uncategorized bank transaction ID | |
| account_id | Yes | Expense account ID | |
| paid_through_account_id | Yes | Bank or credit account the payment was made through | |
| date | Yes | Expense date (YYYY-MM-DD) | |
| amount | Yes | Expense amount | |
| description | No | Optional expense description | |
| reference_number | No | Optional reference number | |
| customer_id | No | Optional customer ID | |
| vendor_id | No | Optional vendor ID | |
| is_billable | No | Whether the expense is billable | |
| exchange_rate | No | Optional exchange rate |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate readOnlyHint=false and openWorldHint=true. The description adds that it creates a new expense record, but does not disclose other behavioral traits like transaction status changes, potential side effects on bank transaction categorization, or error conditions. It adds some value beyond annotations but is not fully transparent.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences total, each sentence serves a clear purpose: first describes the action, second specifies the use case, third provides decision guidance. No superfluous words, front-loaded with the main verb.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given 12 parameters, no output schema, and moderate complexity, the description provides adequate purpose and usage guidance. However, it does not mention return value or what happens after categorization (e.g., success/error response). With high schema coverage, the description is minimally complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% with all 12 parameters described well. The description does not add additional meaning to the parameters, so baseline score of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb 'categorize' and resource 'uncategorized bank transaction', explicitly stating the outcome 'expense'. It distinguishes from sibling tools like 'match_bank_transaction' and 'categorize_bank_transaction_as_customer_payment' by naming alternatives and usage preferences.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It clearly states when to use this tool ('routine spending that should become a new expense record') and when not to ('Prefer matching when...', 'use manual journals only for exception cases'), providing explicit context for alternative tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
categorize_bank_transaction_as_vendor_paymentA
Categorize an uncategorized bank transaction as a vendor payment. Use this when the bank line represents payment of one or more vendor bills. Prefer matching when the bank line should be linked to an existing Zoho transaction, and use manual journals only for exception cases that cannot be matched or categorized cleanly.
| Name | Required | Description | Default |
|---|---|---|---|
| organization_id | No | Zoho org ID (uses ZOHO_ORGANIZATION_ID env var if not provided) | |
| transaction_id | Yes | Uncategorized bank transaction ID | |
| vendor_id | Yes | Vendor ID | |
| bills | Yes | Bills to apply the payment against | |
| amount | Yes | Total vendor payment amount | |
| date | Yes | Payment date (YYYY-MM-DD) | |
| paid_through_account_id | Yes | Bank or credit account the payment was made through | |
| payment_mode | No | Optional payment mode such as Cash or Cheque | |
| description | No | Optional payment description | |
| reference_number | No | Optional reference number | |
| exchange_rate | No | Optional exchange rate | |
| is_paid_via_print_check | No | Whether the payment was made via printed check |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare readOnlyHint=false and openWorldHint=true, so the agent knows it modifies data and may create entities. The description adds context about preferring matching over journals but does not detail what the tool actually does (e.g., creates a payment record, changes transaction status). For a tool with no output schema, more explicit behavioral description would be helpful.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is four sentences, each serving a distinct purpose: stating the action, specifying usage context, and giving priority guidance. No fluff, front-loaded with the core purpose.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description adequately covers purpose, usage context, and guidance on alternatives. However, it does not mention the output or side effects (e.g., whether it returns a success indicator or the ID of the created payment). Given no output schema, a brief note on return value would improve completeness.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
All 12 parameters have descriptions in the input schema (100% coverage), so baseline is 3. The tool description adds no additional parameter-level meaning beyond what the schema already provides.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool categorizes an uncategorized bank transaction as a vendor payment. It distinguishes from siblings like categorize_bank_transaction_as_customer_payment and categorize_bank_transaction_as_expense by specifying 'payment of one or more vendor bills'.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly advises when to use this tool ('when the bank line represents payment of one or more vendor bills') and provides a decision hierarchy: prefer matching, then this categorization, and manual journals as exception. This guides the agent away from alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
categorize_bank_transaction_genericA
Categorize an uncategorized bank transaction into a general Zoho bank transaction. Use this for deposits, transfers, owner contributions/drawings, interest income, other income, sales without invoices, expense refunds, sales returns, and similar bank-native bookkeeping flows. Prefer matching or expense/vendor/customer payment categorization when those are a better fit than a generic bank transaction.
| Name | Required | Description | Default |
|---|---|---|---|
| organization_id | No | Zoho org ID (uses ZOHO_ORGANIZATION_ID env var if not provided) | |
| transaction_id | Yes | Uncategorized bank transaction ID | |
| transaction_type | Yes | Generic bank transaction type to create | |
| from_account_id | Yes | Source account ID for the transaction | |
| to_account_id | Yes | Destination account ID for the transaction | |
| amount | Yes | Transaction amount | |
| date | Yes | Transaction date (YYYY-MM-DD) | |
| payment_mode | No | Optional payment mode such as Cash or Cheque | |
| exchange_rate | No | Optional exchange rate | |
| reference_number | No | Optional reference number | |
| description | No | Optional description or memo | |
| customer_id | No | Optional customer ID | |
| currency_id | No | Optional currency ID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare readOnlyHint=false (mutation) and openWorldHint=true. The description doesn't contradict these, but it adds little beyond saying 'Categorize.' It doesn't describe side effects (e.g., whether the original transaction status changes, if new records are created, or any constraints). The behavioral transparency is adequate but not enriched beyond the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences long, front-loaded with the primary action, and every sentence adds value. There is no redundancy or unnecessary detail.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with 13 parameters (6 required) and no output schema, the description covers the main context: what the tool does, when to use it, and how it differs from siblings. It could mention expected return values or success indicators, but the overall completeness is high given the simplicity of the task and the rich schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema has 100% description coverage for all 13 parameters, so the schema itself documents the parameters well. The tool description does not add further meaning to the parameters; it only lists use cases. Baseline 3 is appropriate given full schema coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's purpose: 'Categorize an uncategorized bank transaction into a general Zoho bank transaction.' It lists specific transaction types (deposits, transfers, etc.) and distinguishes itself from sibling tools like categorize_bank_transaction_as_customer_payment by using 'generic' and advising when to prefer alternatives.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides explicit guidance on when to use this tool: 'Use this for deposits, transfers, owner contributions/drawings, interest income, other income, sales without invoices, expense refunds, sales returns, and similar bank-native bookkeeping flows.' It also tells when not to use it: 'Prefer matching or expense/vendor/customer payment categorization when those are a better fit.'
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_accountA
Create a new account in the chart of accounts. Account types: income, expense, cost_of_goods_sold, other_income, other_expense, asset (bank, other_current_asset, fixed_asset, other_asset, cash, accounts_receivable), liability (other_current_liability, credit_card, long_term_liability, other_liability, accounts_payable), equity (equity, retained_earnings).
| Name | Required | Description | Default |
|---|---|---|---|
| organization_id | No | Zoho org ID (uses ZOHO_ORGANIZATION_ID env var if not provided) | |
| account_name | Yes | Name for the new account | |
| account_type | Yes | Account type (e.g., expense, income, bank, accounts_receivable) | |
| account_code | No | Optional account code for reference | |
| description | No | Description of the account | |
| currency_id | No | Currency ID for the account | |
| parent_account_id | No | Parent account ID for sub-accounts |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Description indicates mutation ('Create'), consistent with readOnlyHint=false. However, no additional behavioral context like permission needs or side effects beyond the creation act.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Description is direct and informative, though the list of account types adds length. No redundant information, but could be slightly more concise.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with 7 parameters and no output schema, the description covers account types but omits mention of optional organization_id fallback or return behavior. Adequate but incomplete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Description adds a comprehensive list of allowed account_type values beyond the schema's example, which enhances understanding. Schema descriptions cover 100% of parameters, so baseline is 3; the added enum list raises the score.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states 'Create a new account in the chart of accounts' with specific verb and resource. It lists all account types, distinguishing this tool from siblings like create_bill or create_expense.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No explicit guidance on when to use versus alternatives (e.g., when to create vs update an account, or prerequisites). The description only states what it does, not context or exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_billA
Create a new bill (accounts payable). Use list_contacts to find vendor_id values. Use list_accounts to find account_id values for line items.
| Name | Required | Description | Default |
|---|---|---|---|
| organization_id | No | Zoho org ID (uses ZOHO_ORGANIZATION_ID env var if not provided) | |
| vendor_id | Yes | Vendor ID | |
| bill_number | No | Bill/Invoice number from vendor | |
| date | Yes | Bill date (YYYY-MM-DD) | |
| due_date | No | Payment due date (YYYY-MM-DD) | |
| reference_number | No | Reference number | |
| notes | No | Notes | |
| line_items | Yes | Array of line items |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations indicate readOnlyHint=false and openWorldHint=true, consistent with creation. However, the description does not discuss potential side effects, idempotency, or validation (e.g., duplicate bill numbers). With annotations present, the bar is lower, but some behavioral detail is missing.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is three sentences: one defining purpose and two providing usage hints. No extraneous words, front-loaded, and efficient.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description covers purpose and prerequisite calls but does not mention the required line_items structure or that account_id and amount are required within line items. The schema covers this, but a brief mention would improve completeness for an 8-parameter tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, but the description adds value by telling the agent to use other tools to obtain vendor_id and account_id. This provides meaningful guidance beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action ('Create a new bill') and the resource ('accounts payable'), differentiating it from sibling tools like create_account, create_expense, etc. It explicitly specifies the bill type and provides context for prerequisites.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides explicit guidance on using list_contacts and list_accounts to find required IDs, which helps the agent understand prerequisites. It does not explicitly mention when not to use this tool, but the context is clear from the sibling set.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_expenseA
Create a new expense record. Requires account_id (expense account) and paid_through_account_id (payment account). Use list_accounts to find valid account IDs.
| Name | Required | Description | Default |
|---|---|---|---|
| organization_id | No | Zoho org ID (uses ZOHO_ORGANIZATION_ID env var if not provided) | |
| account_id | Yes | Expense account ID | |
| paid_through_account_id | Yes | Payment account ID (bank/cash/credit card) | |
| date | Yes | Expense date (YYYY-MM-DD) | |
| amount | Yes | Expense amount (max 999,999,999.99, 2 decimal places) | |
| description | No | Description of the expense | |
| reference_number | No | Reference number | |
| customer_id | No | Customer ID if billable | |
| vendor_id | No | Vendor ID | |
| is_billable | No | Whether expense is billable to a customer |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate a write operation (readOnlyHint=false) and open-world behavior. The description adds no additional behavioral context such as side effects, validation failures, or rate limits. It meets a baseline but does not enhance beyond annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is extremely concise with only two sentences. It frontloads the purpose, then provides requirements and a helpful suggestion, with no redundant information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool has 10 parameters and no output schema, the description does not explain the return value or the role of optional parameters like customer_id or reference_number. While the schema covers them, the description could summarize usage conditions for completeness.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3. The description adds value by emphasizing two critical required parameters and linking to a relevant helper tool (list_accounts), which aids understanding beyond the schema alone.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action 'Create a new expense record' with a specific verb and resource. It is distinct from sibling tools like add_expense_receipt or get_expense, making the purpose unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description highlights required parameters (account_id, paid_through_account_id) and suggests using list_accounts to find valid IDs. While it doesn't explicitly exclude other scenarios, it provides clear context for when to use the tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_journalA
Create a new manual journal entry. Line items must balance (total debits = total credits). Use list_accounts to find valid account_id values.
| Name | Required | Description | Default |
|---|---|---|---|
| organization_id | No | Zoho org ID (uses ZOHO_ORGANIZATION_ID env var if not provided) | |
| journal_date | Yes | Journal date (YYYY-MM-DD) | |
| reference_number | No | Reference number for the journal | |
| notes | No | Notes or memo for the journal | |
| line_items | Yes | Array of line items (min 2, must balance) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare readOnlyHint=false and openWorldHint=true, aligning with the creation action. The description adds value by stating the balancing requirement and the need to look up accounts, which are not covered by annotations. It does not contradict annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, front-loaded with purpose, no waste. Every sentence provides essential guidance (balancing constraint and account lookup). Concise and well-structured.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a creation tool with 100% schema coverage and no output schema, the description covers the core constraint and external dependency. Missing details like return behavior, error handling, or draft/pending status, but overall adequate for the complexity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so baseline is 3. The description adds marginal value beyond the schema: the balancing rule is already in the line_items schema description, and the account lookup hint is additive. No syntax or format details are provided.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool creates a new manual journal entry, with 'Create' as a specific verb and 'journal entry' as the resource. It distinguishes itself from sibling tools like update_journal, get_journal, delete_journal, and list_journals by focusing on creation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides a key constraint (line items must balance) and a prerequisite hint (use list_accounts for valid account IDs). While it lacks explicit when-not or alternatives, the context is clear enough for basic usage.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_vendorA
Create a new vendor contact. Use this when expense, bill, or vendor-payment workflows need a vendor_id that does not exist yet in Zoho Books.
| Name | Required | Description | Default |
|---|---|---|---|
| organization_id | No | Zoho org ID (uses ZOHO_ORGANIZATION_ID env var if not provided) | |
| contact_name | No | Optional Zoho contact_name value | |
| display_name | No | Optional vendor display name alias; used as Zoho contact_name if provided | |
| company_name | No | Optional legal or company name | |
| No | Optional vendor email | ||
| phone | No | Optional vendor phone number | |
| currency_id | No | Optional currency ID | |
| payment_terms | No | Optional payment terms in days | |
| billing_address | No | Optional billing address | |
| notes | No | Optional internal notes for the vendor |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare readOnlyHint=false, confirming a write operation. The description confirms creation but adds no additional behavioral traits beyond the annotations. No mention of side effects, error handling, or return behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise and front-loaded with the main purpose ('Create a new vendor contact'), followed by a specific use-case. Two sentences, no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the complexity of 10 parameters (all optional, nested object) and no output schema, the description could be more complete. It does not mention return value, required parameters for success, or error scenarios. Adequate but has gaps.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% with detailed parameter descriptions. The tool description does not add any parameter-level information, but the schema already provides sufficient meaning. Baseline score of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool creates a new vendor contact and specifies when to use it. It distinguishes from sibling tools like update_vendor by focusing on creation when no vendor_id exists.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly says 'Use this when expense, bill, or vendor-payment workflows need a vendor_id that does not exist yet', providing clear context. It implicitly suggests not to use if vendor exists, but does not explicitly exclude alternative tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_bill_attachmentC
Delete attachment from a bill. Removes the file association from the bill.
| Name | Required | Description | Default |
|---|---|---|---|
| organization_id | No | Zoho org ID (uses ZOHO_ORGANIZATION_ID env var if not provided) | |
| bill_id | Yes | Bill ID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations indicate readOnlyHint=false and openWorldHint=true. The description adds minimal behavioral detail beyond 'delete' and 'removes association', lacking clarity on side effects (e.g., whether the file itself is deleted) or required permissions.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is very short but contains redundancy ('Delete attachment' and 'removes file association' are essentially the same). While concise, it could be more efficient with a single focused sentence.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the simple nature of the tool (2 parameters, no output schema), the description is minimally complete. However, it omits details like the requirement for the bill to exist or error states, which would improve completeness.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% with descriptions for both parameters, so the description does not need to add semantics. It does not provide additional context beyond what the schema already offers.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states 'Delete attachment from a bill' and 'Removes the file association', providing a specific verb and resource. However, it does not explicitly differentiate from sibling tools like delete_expense_receipt or delete_invoice_attachment, though the tool name itself distinguishes them.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides no guidance on when to use this tool versus alternatives, nor does it mention prerequisites or conditions. It only states the action without context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_expense_receiptA
Delete receipt/attachment from an expense. Removes the file association from the expense.
| Name | Required | Description | Default |
|---|---|---|---|
| organization_id | No | Zoho org ID (uses ZOHO_ORGANIZATION_ID env var if not provided) | |
| expense_id | Yes | Expense ID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations indicate readOnlyHint=false (write operation), but description does not disclose potential side effects (e.g., irreversibility, permission requirements) beyond confirming deletion.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two concise sentences with no extraneous information, efficiently conveying the tool's purpose.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Adequate for a simple delete operation, but lacks information on idempotency, error handling, or whether the deletion is reversible.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so description adds no additional meaning beyond what the schema already provides for the two parameters.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action (delete) and the resource (receipt/attachment from an expense), distinguishing it from sibling tools like add_expense_receipt or delete_bill_attachment.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance on when to use this tool versus alternatives, or any prerequisites or conditions for deletion.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_invoice_attachmentA
Delete attachment from an invoice. Removes the file association from the invoice.
| Name | Required | Description | Default |
|---|---|---|---|
| organization_id | No | Zoho org ID (uses ZOHO_ORGANIZATION_ID env var if not provided) | |
| invoice_id | Yes | Invoice ID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description clarifies that the action removes the file association, not necessarily the underlying file. Annotations indicate readOnlyHint=false, so the description adds nuance without contradicting annotations. However, it does not disclose irreversibility, required permissions, or error behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short, direct sentences with no extraneous information. Every word adds value.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple delete tool, the description is adequate but missing return value information (e.g., whether it returns success or the deleted attachment). Without an output schema, the agent might need to know if the operation is successful.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% with descriptions for both parameters (organization_id and invoice_id). The description does not add extra meaning beyond the schema, meeting the baseline.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action (delete) and the resource (attachment from an invoice), and additionally explains that it removes the file association. This distinguishes it from sibling tools that delete attachments from other entities (e.g., delete_bill_attachment).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance is provided on when to use this tool versus alternatives like delete_bill_attachment or get_invoice_attachment first. There is no mention of prerequisites or conditions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_journalA
Delete a journal entry. This action cannot be undone. The journal will be permanently removed.
| Name | Required | Description | Default |
|---|---|---|---|
| organization_id | No | Zoho org ID (uses ZOHO_ORGANIZATION_ID env var if not provided) | |
| journal_id | Yes | Journal ID to delete |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description clearly states the irreversible nature of the deletion, which adds context beyond the annotations (readOnlyHint=false, openWorldHint=true). The permanence is important behavioral information.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is extremely concise, with two short sentences that front-load the purpose and key behavior. No wasted words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
While the description covers the core action and permanence, there is no mention of response format or error handling (no output schema). For a delete tool, this is adequate but not fully complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema has 100% description coverage for both parameters. The tool description does not add any additional meaning beyond what the schema already provides.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states 'Delete a journal entry', which is a specific verb and resource. It distinguishes from siblings like update_journal and create_journal.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description mentions that the action cannot be undone and is permanent, implying use when certain. However, it does not explicitly state when not to use or suggest alternatives like update_journal for modification.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_journal_attachmentA
Delete attachment from a journal entry. Removes the file association from the journal.
| Name | Required | Description | Default |
|---|---|---|---|
| organization_id | No | Zoho org ID (uses ZOHO_ORGANIZATION_ID env var if not provided) | |
| journal_id | Yes | Journal ID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate mutation (readOnlyHint=false) and open-world behavior. The description adds only 'removes the file association,' offering no new behavioral context like irreversibility, permissions, or error handling.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two concise sentences, front-loaded with the action, no redundant information. Every word serves a purpose.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a straightforward delete operation with two parameters and no output schema, the description is adequate but could benefit from mentioning what happens on success/failure or permission requirements.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% with clear descriptions for both parameters (organization_id default via env, journal_id pattern). The description adds no further parameter details, matching the baseline expectation.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Clearly states the action (delete) and the resource (attachment from a journal entry), effectively distinguishing it from sibling tools like add_journal_attachment and get_journal_attachment.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage (when you need to delete a journal attachment) but does not provide explicit guidance on when not to use or mention alternatives, relying on the tool's name and context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_accountARead-only
Get detailed information about a specific account. Returns account details including balance, currency, and parent account info.
| Name | Required | Description | Default |
|---|---|---|---|
| organization_id | No | Zoho org ID (uses ZOHO_ORGANIZATION_ID env var if not provided) | |
| account_id | Yes | Account ID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint and openWorldHint. The description adds value by specifying what data is returned (balance, currency, parent account info), which provides behavioral context beyond the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, front-loaded with purpose and followed by specifics. No redundant or extraneous information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple read operation with no output schema, the description sufficiently covers what the tool returns and its purpose. It meets the needs for an agent to use it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% with clear descriptions for both parameters. The description does not add additional meaning beyond the schema, such as format or constraints, so baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb 'Get' and resource 'account', and lists returned fields like balance, currency, and parent account info. It clearly distinguishes from sibling get_* tools by specifying account-specific details.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance on when to use this tool versus alternatives (e.g., get_bank_account, list_accounts). It does not provide context for appropriate usage or exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_bank_accountARead-only
Get detailed information about a specific bank account. Returns full bank account details including routing number and balance.
| Name | Required | Description | Default |
|---|---|---|---|
| organization_id | No | Zoho org ID (uses ZOHO_ORGANIZATION_ID env var if not provided) | |
| account_id | Yes | Bank account ID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already provide readOnlyHint=true and openWorldHint=true. Description adds specific return fields ('routing number and balance'), which is helpful context beyond annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two concise sentences that immediately convey the tool's purpose and key return fields. No unnecessary words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's simplicity (2 params, read-only, no output schema), the description is fairly complete. It could mention the optional nature of organization_id, but schema covers that.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% with descriptions for both parameters. Description does not add additional meaning beyond 'specific bank account' and 'details'; baseline score of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action 'get detailed information' and the resource 'specific bank account'. It distinguishes from siblings like 'list_bank_accounts' (list) and 'get_account' (general account).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No explicit guidance on when to use this tool vs alternatives like 'get_account' or 'list_bank_accounts'. Usage is implied from the resource type but lacks explicit comparisons.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_bank_transaction_matchesARead-only
Get candidate Zoho transactions that can be matched to an uncategorized bank transaction. Use this before match_bank_transaction to inspect possible matches. Zoho may return direct bank transactions and also invoices, bills, or credit notes that can be reconciled via derived payment/refund entries.
| Name | Required | Description | Default |
|---|---|---|---|
| organization_id | No | Zoho org ID (uses ZOHO_ORGANIZATION_ID env var if not provided) | |
| account_id | Yes | Bank account ID | |
| transaction_id | Yes | Uncategorized bank transaction ID | |
| transaction_type | No | Optional transaction type filter for candidate matches | |
| date_start | No | Filter matches on or after this date (YYYY-MM-DD) | |
| date_end | No | Filter matches on or before this date (YYYY-MM-DD) | |
| amount_start | No | Minimum match amount | |
| amount_end | No | Maximum match amount | |
| reference_number | No | Reference number filter | |
| show_all_transactions | No | If true, return all candidates instead of only Zoho's best suggestions | |
| page | No | ||
| per_page | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations indicate readOnlyHint=true and openWorldHint=true. The description adds that candidates may include invoices, bills, or credit notes, providing useful behavioral context beyond annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three concise sentences. First states purpose, second gives usage guidance, third adds behavioral nuance. No wasted words, front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a list tool with 12 parameters and no output schema, the description covers purpose, usage, and behavioral aspects adequately. Lacks details on pagination or ordering, but overall sufficient.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 83% with parameter descriptions already present. The description does not add specific guidance on parameter usage, so it meets the baseline but does not exceed it.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool retrieves candidate Zoho transactions for matching to uncategorized bank transactions, distinguishing it from the sibling match_bank_transaction tool by specifying it is used beforehand.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly instructs to use this tool before match_bank_transaction to inspect possible matches, providing clear context for when to use this tool versus alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_billARead-only
Get detailed information about a specific bill. Returns full bill details including line items and vendor info.
| Name | Required | Description | Default |
|---|---|---|---|
| organization_id | No | Zoho org ID (uses ZOHO_ORGANIZATION_ID env var if not provided) | |
| bill_id | Yes | Bill ID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=true. The description adds value by specifying that it returns full bill details including line items and vendor info, which goes beyond the annotations. No contradictions or negative behaviors are mentioned, but the description is sufficient for a read operation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is extremely concise, consisting of two short sentences. The first sentence clearly states the tool's purpose, and the second adds relevant detail about the return content. No extraneous information is present.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the simplicity of the tool (a basic get by ID), the description together with the annotations and input schema provides complete information. The description compensates for the lack of an output schema by specifying that it returns line items and vendor info.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema has 100% description coverage for both parameters (organization_id and bill_id). The tool description does not add additional explanation about parameter usage beyond what the schema already provides. Therefore, a baseline score of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action ('get detailed information') and the resource ('a specific bill'), and distinguishes it from sibling tools that deal with other entities (e.g., get_account, get_expense). It also specifies the return content ('full bill details including line items and vendor info').
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies that this tool is for retrieving a single bill's details, which is evident from the name and context, but it does not explicitly state when to use it versus alternatives like list_bills or get_bill_attachment. No when-not-to-use guidance is provided.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_bill_attachmentARead-only
Get attachment information for a bill. Returns details about any files attached to the bill.
| Name | Required | Description | Default |
|---|---|---|---|
| organization_id | No | Zoho org ID (uses ZOHO_ORGANIZATION_ID env var if not provided) | |
| bill_id | Yes | Bill ID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, so the description's 'Returns details' is consistent. It adds no behavioral context beyond what annotations provide (e.g., no mention of pagination, errors, or auth requirements).
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two concise sentences, front-loaded with the purpose. No unnecessary words or repetition.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema is provided, so the description should clarify what 'details' means (e.g., file name, size). It is vague but not misleading. Addressing this would improve completeness.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% (both parameters documented). The tool description adds no parameter info beyond the schema, so baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action ('Get attachment information') and the resource ('a bill'), and specifies it returns 'details about any files attached'. This distinguishes it from sibling tools like add_bill_attachment or delete_bill_attachment.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No explicit guidance on when to use this tool vs. alternatives like get_invoice_attachment or get_journal_attachment. However, the resource-specific name implicitly indicates it is for bills only, which is minimally adequate.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_contactARead-only
Get detailed information about a specific contact. Returns full contact details including payment terms and currency settings.
| Name | Required | Description | Default |
|---|---|---|---|
| organization_id | No | Zoho org ID (uses ZOHO_ORGANIZATION_ID env var if not provided) | |
| contact_id | Yes | Contact ID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations already declare readOnlyHint=true, so the safety profile is clear. The description adds value by specifying the exact return fields (payment terms, currency settings), which is useful context beyond the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two concise sentences with no unnecessary words. It front-loads the purpose and then specifies what the tool returns, making it easy to scan.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple read-only tool with one required parameter and no output schema, the description adequately explains the return value. It could mention error scenarios or edge cases (e.g., contact not found), but given the tool's simplicity, it is sufficiently complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema has 100% description coverage for both parameters (organization_id and contact_id). The description does not add additional semantic meaning beyond what the schema already provides, so a score of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb 'get' and the resource 'contact', and specifies that it returns detailed information including payment terms and currency settings. This distinguishes it from sibling tools like list_contacts which lists contacts, and other get tools for different entities.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage for retrieving a single contact's full details, but does not explicitly state when to use or not use alternatives. No guidance on prerequisites or contrast with list_contacts or other get tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_expenseARead-only
Get detailed information about a specific expense. Returns full expense details including account, vendor, and billable status.
| Name | Required | Description | Default |
|---|---|---|---|
| organization_id | No | Zoho org ID (uses ZOHO_ORGANIZATION_ID env var if not provided) | |
| expense_id | Yes | Expense ID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=true. The description adds specific return fields, which informs the agent of expected output shape. It does not contradict annotations (readOnly matches). However, it does not disclose any potential errors or limitations beyond the schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, front-loaded with the main action, no fluff. Every word adds value.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's simplicity (2 params, no output schema, strong annotations), the description covers the key return information. It could mention that expense_id is required (though schema indicates it), or that the tool might return an error if the expense doesn't exist, but overall it is adequate.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and both parameters are well-described in the schema (including env var fallback for organization_id). The description does not add additional semantic meaning to the parameters beyond the schema, but also does not repeat it unnecessarily.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action ('Get detailed information') and the resource ('specific expense'), and enumerates specific return fields (account, vendor, billable status). This distinguishes it from sibling tools like list_expenses (list) and create_expense (create).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance on when to use this tool versus alternatives. For example, it does not mention that this is for retrieving a single known expense versus listing or searching, or that it should be used when full details are needed.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_expense_receiptARead-only
Get receipt/attachment information for an expense. Returns details about any files attached to the expense.
| Name | Required | Description | Default |
|---|---|---|---|
| organization_id | No | Zoho org ID (uses ZOHO_ORGANIZATION_ID env var if not provided) | |
| expense_id | Yes | Expense ID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, so the agent knows it's safe. The description adds that it returns 'details about any files attached,' which is minimal extra context beyond annotations. No contradictions.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences that efficiently state purpose and what it returns. No redundant words. Front-loaded with the action.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple read-only 'get' tool with two parameters (one optional) and a clear purpose, the description is complete enough. It tells the agent what it does and what it returns, and sibling tools are diverse enough that the name and description suffice.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% with both parameters well-described. The description adds no additional meaning beyond what the schema provides for parameters, so baseline score is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Clearly states it gets receipt/attachment information for an expense. The verb 'get' and resource 'expense receipt' are specific, and the name distinguishes from sibling tools like add_expense_receipt, delete_expense_receipt, and get_bill_attachment.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No explicit guidance on when to use this tool vs alternatives. It is implied that it should be used when needing receipt info for an expense, but no exclusions or context for when to use other attachment getters (e.g., get_bill_attachment) is provided.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_invoiceARead-only
Get detailed information about a specific invoice. Returns full invoice details including line items and customer info.
| Name | Required | Description | Default |
|---|---|---|---|
| organization_id | No | Zoho org ID (uses ZOHO_ORGANIZATION_ID env var if not provided) | |
| invoice_id | Yes | Invoice ID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=true, so the description does not need to reiterate safety. It adds value by specifying the return includes line items and customer info, but does not disclose other behavioral traits like pagination or performance.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two concise sentences with no wasted words. First sentence clearly states action and target, second clarifies return content. Information is front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Without an output schema, the description adequately compensates by stating it returns full invoice details including line items and customer info. For a read-only tool with annotated safety, this is nearly complete. Could mention related tools or prerequisites, but is sufficient for its simplicity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%—both parameters are described in the schema. The description does not add any new meaning beyond what the schema provides, so baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description clearly uses verb 'Get' and specific resource 'invoice', stating it returns full invoice details with line items and customer info. This distinguishes it from sibling list_invoices which returns a list, and other get tools like get_invoice_attachment.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No explicit guidance on when to use this tool versus alternatives such as list_invoices or get_invoice_attachment. The description implies it's for retrieving a single invoice's full details, but does not state when not to use it or mention other related tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_invoice_attachmentARead-only
Get attachment information for an invoice. Returns details about any files attached to the invoice.
| Name | Required | Description | Default |
|---|---|---|---|
| organization_id | No | Zoho org ID (uses ZOHO_ORGANIZATION_ID env var if not provided) | |
| invoice_id | Yes | Invoice ID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description mentions it 'returns details about any files attached', but does not elaborate on what those details are. Annotations already declare readOnlyHint=true, so the description adds limited behavioral context beyond stating the return type.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences, directly stating the purpose and what it returns. Every word is necessary, and it is front-loaded with the key action.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool lacks an output schema, and the description does not explain what 'details' are returned (e.g., file names, URLs, metadata). This incompleteness leaves the agent guessing about the response structure, which is critical for a retrieval tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% with descriptions for both parameters. The description does not add additional meaning or examples beyond what the schema provides, such as clarifying the format of invoice_id or organization_id defaults.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states 'Get attachment information for an invoice' which identifies the verb and resource. It distinguishes from sibling tools like add_invoice_attachment and delete_invoice_attachment by focusing on retrieval.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies the tool is for retrieving attachment details but does not provide explicit guidance on when to use it versus alternatives, nor does it mention when not to use it. The context of being a read-only tool is minimally suggested.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_journalARead-only
Get detailed information about a specific journal entry. Returns full journal details including all line items.
| Name | Required | Description | Default |
|---|---|---|---|
| organization_id | No | Zoho org ID (uses ZOHO_ORGANIZATION_ID env var if not provided) | |
| journal_id | Yes | Journal ID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds that it includes 'line items', but annotations already declare readOnlyHint=true and openWorldHint=true. No additional behavioral details (e.g., error handling, performance) are provided beyond what annotations cover.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two terse sentences, front-loaded with the primary action and value. No redundant or unnecessary content; every sentence serves a purpose.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple get-by-ID tool with readOnlyHint and no output schema, the description covers the key return content (line items). Minor gap: no mention of permissions or idempotency, but annotations cover safety.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, with organization_id described as using an env var and journal_id as a simple ID. The description does not add significant meaning beyond the schema; it only restates the purpose.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states 'Get detailed information about a specific journal entry' with 'Returns full journal details including all line items.' This provides a specific verb and resource, distinguishing it from create, update, delete, and list journal tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage for retrieving details by ID but lacks explicit guidance on when to use vs alternatives like list_journals or when not to use. No exclusion criteria or alternative suggestions are provided.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_journal_attachmentARead-only
Get attachment information for a journal entry. Returns details about any files attached to the journal.
| Name | Required | Description | Default |
|---|---|---|---|
| organization_id | No | Zoho org ID (uses ZOHO_ORGANIZATION_ID env var if not provided) | |
| journal_id | Yes | Journal ID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description confirms the read-only nature consistent with the readOnlyHint annotation. It adds context about returning 'details about any files attached,' which complements the annotation. No contradictions or omissions found.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences with no wasted words. Front-loaded with the action and resource, then provides a brief elaboration. Highly concise.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description is adequate for a simple read tool with full schema coverage, but it does not specify what 'details' are returned (e.g., file name, size, type). Given no output schema, adding return field examples would improve completeness.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% with clear parameter descriptions. The description adds no additional meaning beyond the schema, so a baseline score of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool retrieves attachment information for a journal entry, with a verb ('Get') and a specific resource ('attachment information for a journal entry'). It distinguishes from sibling tools like add_journal_attachment and delete_journal_attachment by implying a read-only operation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage for reading attachment details, but it does not explicitly state when to use this tool over alternatives (e.g., add_journal_attachment, delete_journal_attachment, or get_invoice_attachment). No guidance on prerequisites or context is provided.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_organizationARead-only
Get detailed information about a specific organization. Returns full organization details including address, contact info, and settings.
| Name | Required | Description | Default |
|---|---|---|---|
| organization_id | No | Zoho org ID (uses ZOHO_ORGANIZATION_ID env var if not provided) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already provide readOnlyHint=true and openWorldHint=true. The description adds specific details about the return content (address, contact info, settings) beyond what annotations convey, which is valuable for understanding the tool's behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences with no wasted words. It front-loads the key action and then specifies return fields. Every sentence adds value.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple get tool with a single optional parameter and good annotations, the description adequately explains the return content (address, contact info, settings) despite no output schema. No missing context.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 100% schema description coverage, the schema already documents the parameter well. The description does not add any additional meaning or syntax guidance beyond what is in the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states 'Get detailed information about a specific organization', specifying the verb and resource. It distinguishes from sibling tools like list_organizations (which lists multiple) and other get tools for different entities.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description does not provide explicit guidance on when to use this tool versus alternatives, nor when not to use it. Usage is implied by the name and context, but no exclusions or alternative suggestions are given.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_vendorARead-only
Get detailed information about a specific vendor. Use this to confirm a vendor_id before creating expenses, bills, or vendor-payment categorizations.
| Name | Required | Description | Default |
|---|---|---|---|
| organization_id | No | Zoho org ID (uses ZOHO_ORGANIZATION_ID env var if not provided) | |
| vendor_id | Yes | Vendor ID (contact_id in Zoho Books) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=true. The description adds that it returns 'detailed information' and its intended use, further clarifying behavior without contradiction.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, front-loaded with purpose and usage guidance. Every sentence earns its place with no redundancy or fluff.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only retrieval tool with simple parameters, the description provides sufficient context. It lacks specifics about return fields or errors, but the usage guidance and schema compensate.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% (all parameters have descriptions). The description does not add new semantic information beyond the schema, so baseline of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's purpose: 'Get detailed information about a specific vendor.' It distinguishes from siblings like list_vendors (which lists) and get_contact (which is for contacts), and provides specific use cases.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly says when to use the tool: 'Use this to confirm a vendor_id before creating expenses, bills, or vendor-payment categorizations.' This gives clear context for invocation.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_accountsARead-only
List all accounts in the chart of accounts. Supports filtering by account type (e.g., income, expense, asset, liability, equity). Use this to find account_id values for journal entries and transactions.
| Name | Required | Description | Default |
|---|---|---|---|
| organization_id | No | Zoho org ID (uses ZOHO_ORGANIZATION_ID env var if not provided) | |
| filter_by | No | Filter accounts by type | |
| sort_column | No | Column to sort by |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=true, so the description's mention of listing accounts and filtering aligns with these. It adds no new behavioral traits beyond what annotations provide, but does not contradict them.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences long, front-loaded with the core action, and every sentence earns its place—no wasted words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a list tool with no output schema, the description covers the action, filtering, and a practical use case. However, it omits details like pagination, sorting behavior, or response structure, which are important for complete understanding.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, with all parameters having descriptions. The description adds the usage tip about finding account_id but does not significantly enhance understanding beyond the schema's descriptions of organization_id, filter_by, and sort_column.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states 'List all accounts in the chart of accounts' with specific verb and resource, and distinguishes from sibling tools like 'create_account' and 'get_account' by noting it lists all accounts and supports filtering.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly says 'Use this to find account_id values for journal entries and transactions,' which gives clear context for when to use it. However, it lacks explicit guidance on when not to use it or direct comparisons to alternatives like 'get_account' for single accounts.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_account_transactionsARead-only
List transactions for a specific account. Returns all transactions (journals, invoices, bills, etc.) affecting this account. Useful for account reconciliation and analysis.
| Name | Required | Description | Default |
|---|---|---|---|
| organization_id | No | Zoho org ID (uses ZOHO_ORGANIZATION_ID env var if not provided) | |
| account_id | Yes | Account ID to get transactions for | |
| date_start | No | Start date (YYYY-MM-DD) | |
| date_end | No | End date (YYYY-MM-DD) | |
| sort_column | No | Column to sort by |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate read-only and open world. The description adds that it returns all transaction types affecting the account, but does not clarify pagination, limits, or default ordering. openWorldHint suggests incomplete results, but the description doesn't address this.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, direct and to the point. No fluff, front-loaded with the core action.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the parameter count and lack of output schema, the description covers the tool's purpose and return type effectively. Could mention date range or sorting capabilities, but schema already covers those.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so parameters are well-documented structurally. The description does not add additional semantic details about parameters beyond what is in the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states it lists transactions for a specific account, specifies the types (journals, invoices, bills, etc.), and mentions a use case (reconciliation and analysis). It distinguishes from sibling tools that focus on specific transaction types.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides a use case ('reconciliation and analysis') but lacks explicit guidance on when to use this tool over siblings (e.g., list_bills, list_invoices) or when not to use it. No alternatives mentioned.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_bank_accountsARead-only
List all bank accounts in Zoho Books. Returns bank account details with name, type, and balance. These are the accounts linked in Zoho Books, not live bank data.
| Name | Required | Description | Default |
|---|---|---|---|
| organization_id | No | Zoho org ID (uses ZOHO_ORGANIZATION_ID env var if not provided) | |
| filter_by | No | Filter by status | |
| sort_column | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, so description adds value by specifying return fields and the 'not live' distinction. However, it does not disclose pagination, rate limits, or other behavioral traits.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, front-loaded purpose, no wasted words. Essential information is efficiently presented.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given 3 parameters and no output schema, the description could be more complete by mentioning pagination, default sorting, or how org_id defaults. It adequately covers core purpose but lacks operational details.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Description adds no parameter-level details despite schema having 3 parameters (one with no description). It misses the opportunity to clarify sort_column or filter behavior, leaving gaps for 33% of parameters.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states it lists all bank accounts, returns specific fields (name, type, balance), and distinguishes from live bank data. This differentiates it from sibling tools like list_accounts.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies it should be used for internal linked accounts, not live data, but does not explicitly compare to alternatives like list_accounts or get_bank_account. Guidelines are implied but not directive.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_bank_transactionsARead-only
List bank transactions in Zoho Books. Returns transactions recorded in Zoho Books for bank reconciliation. These are transactions imported/entered in Zoho, not live bank feeds. Bank transaction status is a reconciliation status and is separate from journal creation.
| Name | Required | Description | Default |
|---|---|---|---|
| organization_id | No | Zoho org ID (uses ZOHO_ORGANIZATION_ID env var if not provided) | |
| account_id | Yes | Bank account ID | |
| date_start | No | Start date (YYYY-MM-DD) | |
| date_end | No | End date (YYYY-MM-DD) | |
| status | No | ||
| sort_column | No | ||
| page | No | ||
| per_page | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds context beyond annotations by clarifying these are not live bank feeds and explaining status represents reconciliation status, not journal creation. This complements the readOnlyHint and openWorldHint annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is four sentences, efficiently conveying purpose and key distinctions without unnecessary words. Each sentence adds value.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
While explaining data nature, the description omits pagination, sorting, and filtering details. For a list tool with 8 parameters, more completeness is expected despite good annotations.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With schema description coverage at 50%, the description does not add meaning for parameters like status, sort_column, page, or per_page. It relies on schema enums but lacks explanation of values or usage guidance.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states 'List bank transactions in Zoho Books', specifies they are for bank reconciliation, and distinguishes from live bank feeds. This differentiates from sibling tools like categorize_bank_transaction_* and list_account_transactions.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies the tool is for listing transactions for reconciliation but does not explicitly state when to use it versus alternatives like list_account_transactions or match_bank_transaction. No 'when to use' or 'when not to use' guidance is provided.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_billsARead-only
List all bills (accounts payable). Supports filtering by date, vendor, and status. Returns bill details with vendor, amount, and due date.
| Name | Required | Description | Default |
|---|---|---|---|
| organization_id | No | Zoho org ID (uses ZOHO_ORGANIZATION_ID env var if not provided) | |
| date_start | No | Start date (YYYY-MM-DD) | |
| date_end | No | End date (YYYY-MM-DD) | |
| vendor_id | No | Filter by vendor | |
| status | No | Filter by status | |
| sort_column | No | ||
| page | No | ||
| per_page | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, so the tool is safe. The description adds that it returns bill details with vendor, amount, and due date, but omits behavioral details like pagination (page/per_page) and ordering, which are present in the schema but not explained.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences efficiently convey the purpose and main filters. Could be improved by structuring with bullet points or including pagination context, but overall concise and front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With 8 parameters and no output schema, the description covers the main purpose and key filters but misses important details about pagination, sorting, and the full scope of returned data. Adequate for basic use but not comprehensive.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 63%, and the description adds meaning for date, vendor, and status filters, but does not cover sort_column, page, or per_page. Since coverage is moderate, the description partially compensates but not fully.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb 'list' and the resource 'bills (accounts payable)', distinguishing it from siblings like 'get_bill' (individual) and 'create_bill', as well as other list tools such as 'list_invoices'.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description mentions filtering options but provides no explicit guidance on when to use this tool versus alternatives (e.g., 'get_bill' for a single bill). No exclusions or context about pagination or performance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_contactsARead-only
List all contacts (customers and vendors). Supports filtering by contact type (customer or vendor). Use this to find contact_id values for bills, invoices, and expenses.
| Name | Required | Description | Default |
|---|---|---|---|
| organization_id | No | Zoho org ID (uses ZOHO_ORGANIZATION_ID env var if not provided) | |
| contact_type | No | Filter by contact type | |
| status | No | Filter by status | |
| search_text | No | Search by name or company | |
| sort_column | No | ||
| page | No | ||
| per_page | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, so the description adds little beyond stating it lists contacts. It mentions filtering support but does not detail pagination or other behavioral traits. With annotations present, the description's value is moderate.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences, each serving a purpose: stating the function and providing a use case. No unnecessary information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given 7 parameters and no output schema, the description explains basic purpose and one use case but does not cover other parameters like status, search_text, or pagination. It is adequate but not complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 57%, between the thresholds. The description reinforces that contact_type can filter but does not add new meaning beyond the schema. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states it lists all contacts (customers and vendors), which is specific. However, it does not explicitly distinguish this from sibling tools like list_vendors, so it does not fully satisfy the 'distinguishes from siblings' criterion.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides a clear use case: 'Use this to find contact_id values for bills, invoices, and expenses.' This gives context but lacks explicit when-not-to-use or alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_expensesBRead-only
List all expenses. Supports filtering by date, status, and customer. Returns expense details with account, amount, and vendor info.
| Name | Required | Description | Default |
|---|---|---|---|
| organization_id | No | Zoho org ID (uses ZOHO_ORGANIZATION_ID env var if not provided) | |
| date_start | No | Start date (YYYY-MM-DD) | |
| date_end | No | End date (YYYY-MM-DD) | |
| status | No | Filter by status | |
| customer_id | No | Filter by customer | |
| vendor_id | No | Filter by vendor | |
| sort_column | No | ||
| page | No | ||
| per_page | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare readOnlyHint=true, so the description's statement about listing expenses is consistent. The description adds filtering capability but does not disclose pagination or scope; with annotations handling safety, this is adequate.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, front-loaded with purpose. Every sentence adds value without fluff. Highly concise and well-structured.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description mentions return fields (account, amount, vendor info) but lacks mention of pagination or that it returns all expenses in the organization. With 9 parameters and no output schema, it is adequate but not fully complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 67%, and the description explains date, status, and customer filters, adding meaning to those parameters. However, it does not explain other parameters like page, per_page, or vendor_id, leaving gaps.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description specifically states the tool lists expenses and supports filtering, which is clear. However, it does not differentiate from sibling list tools like list_bills or list_invoices, so it scores a 4.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance on when to use this tool versus alternatives. The description does not mention when to prefer list_expenses over other list or search tools, leaving the agent without context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_invoicesARead-only
List all customer invoices (accounts receivable). Supports filtering by date, customer, and status. Returns invoice details with customer, amount, and due date.
| Name | Required | Description | Default |
|---|---|---|---|
| organization_id | No | Zoho org ID (uses ZOHO_ORGANIZATION_ID env var if not provided) | |
| date_start | No | Start date (YYYY-MM-DD) | |
| date_end | No | End date (YYYY-MM-DD) | |
| customer_id | No | Filter by customer | |
| status | No | Filter by status | |
| sort_column | No | ||
| page | No | ||
| per_page | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already provide readOnlyHint and openWorldHint. The description adds no new behavioral details such as pagination behavior, rate limits, or authentication requirements. The presence of pagination parameters (page, per_page) is not reflected in the description.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short, focused sentences. First sentence states the primary purpose immediately. No redundant or unnecessary text. Highly efficient.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given 8 parameters and no output schema, the description explains core functionality (list with filters, key return fields) but omits pagination and sorting behavior. Adequate for basic use but incomplete for advanced scenarios.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The description covers main filtering parameters (date_start, date_end, customer_id, status) and mentions return fields (customer, amount, due_date). With 63% schema description coverage, the description adds some context (e.g., organization_id fallback to env var) but omits sort_column, page, per_page. Baseline at moderate coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool lists customer invoices (accounts receivable) with filtering support, distinguishing it from single-invoice retrieval (get_invoice) and other list tools (list_bills, list_expenses).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description mentions filtering by date, customer, and status, but does not explicitly guide when to use this tool over alternatives like list_bills or when not to use it. No exclusions or prerequisites are stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_journalsARead-only
List all manual journal entries. Returns journal entries with date, reference number, and total. Use date filters to narrow down results.
| Name | Required | Description | Default |
|---|---|---|---|
| organization_id | No | Zoho org ID (uses ZOHO_ORGANIZATION_ID env var if not provided) | |
| date_start | No | Start date (YYYY-MM-DD) | |
| date_end | No | End date (YYYY-MM-DD) | |
| sort_column | No | ||
| page | No | Page number | |
| per_page | No | Items per page (max 200) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare readOnlyHint=true and openWorldHint=true, so the description's claim of listing is consistent. The description adds that it returns specific fields, but does not discuss pagination or limitations, which are partially covered by schema annotations. The bar is lower due to annotations, but the description adds moderate value.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences: core purpose, return data, usage tip. No wasted words, information is front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With 6 parameters and no output schema, the description does not explain sorting or pagination behavior. It mentions date filters but could be more complete about output fields and paging. Adequate but not rich.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is high (83%), so the schema already documents most parameters. The description only generically mentions 'date filters' without adding new semantics or usage details beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states it lists manual journal entries and specifies the returned fields (date, reference number, total). It distinguishes from sibling tools like create_journal, get_journal, etc., which have different verbs.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description advises using date filters, which is a helpful usage hint. However, it does not explicitly state when to use this versus alternatives like get_journal for a single entry, but the context implies it for listing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_organizationsARead-only
List all Zoho organizations the user has access to. Use this tool first to get organization_id for all other tools. Returns organization name, ID, currency, and timezone.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint and openWorldHint. Description adds value by specifying it returns all accessible organizations and the exact fields (name, ID, currency, timezone), which annotations do not cover.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three focused sentences: purpose, usage instruction, then return fields. No filler, front-loaded with critical information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given zero parameters and no output schema, the description provides all necessary context: what the tool does, when to use it, and what it returns. Completely adequate for agent use.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Tool has no parameters; schema coverage is 100%. Description does not need to add parameter details. Baseline 4 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Clearly states it lists Zoho organizations and provides organization IDs. Distinguishes itself from siblings (e.g., get_organization) by being the list/initial tool.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly instructs to use this tool first to obtain organization_id for all other tools, leaving no ambiguity about when to invoke it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_vendorsARead-only
List vendor contacts only. Use this to find vendor_id values for expenses, bills, and vendor-payment bank categorization workflows.
| Name | Required | Description | Default |
|---|---|---|---|
| organization_id | No | Zoho org ID (uses ZOHO_ORGANIZATION_ID env var if not provided) | |
| status | No | Filter by status | |
| search_text | No | Search by vendor name or company | |
| sort_column | No | ||
| page | No | ||
| per_page | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already provide readOnlyHint and openWorldHint, indicating safe read behavior. The description adds minimal behavioral detail beyond that (e.g., no mention of pagination or data freshness). No contradictions.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, front-loaded with the core action and purpose. Every word is necessary, no fluff.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Tool has 6 parameters and no output schema. Description does not explain return fields or pagination behavior, leaving gaps for a full understanding. Adequate but incomplete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 50%, but the description adds no meaning to parameters (e.g., does not explain filters or sorting). Baseline 3 is not justified because the description fails to compensate for the missing schema descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb 'List' and resource 'vendor contacts only'. It explicitly mentions the use case: finding vendor_id values for expenses, bills, and vendor-payment bank categorization workflows, distinguishing it from sibling tools like list_contacts or list_bills.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides a clear context for use: to find vendor_id values for specific workflows. It does not explicitly state when not to use or mention alternatives, but the purpose is specific enough to guide the agent.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
match_bank_transactionA
Match an uncategorized bank transaction to one or more existing Zoho transactions. Use get_bank_transaction_matches first to inspect candidates. This updates bank reconciliation status; creating a journal alone does not mark imported bank transactions as matched.
| Name | Required | Description | Default |
|---|---|---|---|
| organization_id | No | Zoho org ID (uses ZOHO_ORGANIZATION_ID env var if not provided) | |
| account_id | Yes | Bank account ID | |
| transaction_id | Yes | Uncategorized bank transaction ID to reconcile | |
| transactions_to_be_matched | Yes | Existing Zoho transactions to match against this bank transaction |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations indicate a write operation (readOnlyHint=false) and openWorldHint=true. The description adds that the tool updates bank reconciliation status, providing behavioral context beyond annotations. No contradictions.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is three sentences, each serving a distinct purpose: main action, prerequisite hint, and behavioral note. No unnecessary words, well-structured and front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity (array parameter with required subfields), the description provides enough context: prerequisite tool, effect on reconciliation status, and a common misunderstanding. No output schema is present, but the description sufficiently conveys the action's impact.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3. The description does not add meaningful details about each parameter beyond what the schema already provides. It mentions 'one or more' existing transactions, but this is implicit in the schema's minItems:1.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action 'Match' and the resource 'uncategorized bank transaction to one or more existing Zoho transactions'. It distinguishes from sibling tools like categorize_bank_transaction_* and unmatch_bank_transaction, and mentions a prerequisite tool.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly advises to use get_bank_transaction_matches first to inspect candidates. It also warns that creating a journal alone does not mark imported bank transactions as matched, guiding correct usage. It lacks explicit when-not-to-use but provides strong contextual cues.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
publish_journalA
Publish (mark as posted) a draft journal entry. Published journals are finalized and affect account balances.
| Name | Required | Description | Default |
|---|---|---|---|
| organization_id | No | Zoho org ID (uses ZOHO_ORGANIZATION_ID env var if not provided) | |
| journal_id | Yes | Journal ID to publish |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description discloses key behavioral traits: journals become finalized and affect account balances. Annotations only provide readOnlyHint=false and openWorldHint=true, so the description adds meaningful context beyond annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two concise sentences with no wasted words. The critical information (action, effect) is front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool has 2 parameters with full schema coverage, no output schema, and simple behavior, the description adequately covers the essential context (finalization, balance impact). It could be improved by noting irreversibility or required permissions, but overall it is sufficient.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, with clear descriptions for both parameters. The tool description reinforces the purpose but does not add significant new meaning beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action 'Publish (mark as posted)' on 'a draft journal entry' and explains the effect 'finalized and affect account balances'. This distinguishes it from siblings like create_journal or update_journal.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage when finalizing a draft journal entry but does not explicitly state when not to use or mention alternatives. Given siblings like create_journal and delete_journal, the context is implied but not explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
uncategorize_bank_transactionA
Uncategorize a previously categorized bank transaction and return it to uncategorized status. Use this to reverse an incorrect categorization and reprocess the bank line correctly. After uncategorizing, decide whether the bank line should be matched to an existing Zoho transaction, recategorized, or handled with a manual journal only in exception cases.
| Name | Required | Description | Default |
|---|---|---|---|
| organization_id | No | Zoho org ID (uses ZOHO_ORGANIZATION_ID env var if not provided) | |
| account_id | Yes | Bank account ID | |
| transaction_id | Yes | Categorized bank transaction ID to uncategorize |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations indicate readOnlyHint=false (mutation) and openWorldHint=true. The description adds that it 'reverses categorization' and 'returns to uncategorized status', which is the core behavioral effect. However, it does not disclose permissions required, reversibility of the action itself, or potential side effects beyond the stated change.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is three sentences, each serving a distinct purpose: action, usage, and post-action guidance. No redundant or extraneous information, making it concise and well-structured.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple mutation tool with no output schema, the description covers purpose, usage, and aftercare. It is mostly complete but could mention error conditions or prerequisites (e.g., transaction must be categorized) to be fully comprehensive.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, and the schema descriptions adequately explain each parameter. The tool description does not add significant additional meaning beyond what the schema provides, so a baseline score of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action (uncategorize) and the resource (bank transaction), and it distinguishes from sibling tools that categorize or match transactions. The verb 'uncategorize' is specific and unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly says to use this to reverse an incorrect categorization and provides guidance on next steps (match, recategorize, journal). It implies the context of correction but does not explicitly state when not to use it or name alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
unmatch_bank_transactionA
Unmatch a previously matched bank transaction and return it to uncategorized status. Use this when the wrong Zoho transaction was reconciled to a statement line.
| Name | Required | Description | Default |
|---|---|---|---|
| organization_id | No | Zoho org ID (uses ZOHO_ORGANIZATION_ID env var if not provided) | |
| account_id | Yes | Bank account ID | |
| transaction_id | Yes | Matched bank transaction ID to unmatch |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Discloses that the transaction returns to uncategorized status, which is beyond the readOnlyHint false annotation. Could mention potential side effects like loss of categories, but the openWorldHint true annotation is not contradicted.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short, front-loaded sentences with no wasted words. Perfectly concise.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Adequately covers purpose and usage for a simple tool. Could mention that transaction_id must correspond to a matched transaction or any error conditions, but it's sufficient.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3. The description does not add extra parameter-specific meaning beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action (unmatch) and the resource (previously matched bank transaction), with a specific outcome (return to uncategorized status). It distinguishes from sibling tools like match_bank_transaction and uncategorize_bank_transaction.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly says 'Use this when the wrong Zoho transaction was reconciled to a statement line,' providing clear context. However, it does not mention alternatives or when not to use it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_journalA
Update an existing journal entry. Can update date, reference, notes, and line items. Line items must still balance after update.
| Name | Required | Description | Default |
|---|---|---|---|
| organization_id | No | Zoho org ID (uses ZOHO_ORGANIZATION_ID env var if not provided) | |
| journal_id | Yes | Journal ID to update | |
| journal_date | No | New journal date (YYYY-MM-DD) | |
| reference_number | No | New reference number | |
| notes | No | New notes | |
| line_items | No | New line items (replaces existing) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already confirm it is a write operation (readOnlyHint=false). The description adds the important constraint that line items must balance after update, but does not disclose other potential side effects (openWorldHint=true) or error conditions. The added value is moderate.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences with clear front-loading of purpose. No redundant information. Every sentence adds value: action, what can be updated, and a crucial constraint.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema is provided, and the description does not indicate what the tool returns (e.g., updated journal object). Given the complexity (6 parameters, nested arrays) and the balancing constraint, the description is adequate but leaves expected outcomes unspecified.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so each parameter is documented. The description summarizes the updatable parameters and adds the balancing constraint for line items, which is not in the schema. This adds meaningful context beyond the raw schema descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool updates an existing journal entry and lists the updatable fields (date, reference, notes, line items). It distinguishes itself from sibling tools like create_journal, delete_journal, and publish_journal by specifying 'update' on an existing entry.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage for modifying an existing journal entry, but does not explicitly state when to avoid this tool (e.g., for creating, use create_journal; for deleting, use delete_journal). Context from sibling tools helps, but direct guidance is missing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_vendorA
Update an existing vendor contact. Use this to correct or enrich vendor details needed for expenses, bills, and vendor-payment workflows.
| Name | Required | Description | Default |
|---|---|---|---|
| organization_id | No | Zoho org ID (uses ZOHO_ORGANIZATION_ID env var if not provided) | |
| vendor_id | Yes | Vendor ID (contact_id in Zoho Books) | |
| contact_name | No | New Zoho contact_name value | |
| display_name | No | Optional vendor display name alias; used as Zoho contact_name if provided | |
| company_name | No | New legal or company name | |
| No | New vendor email | ||
| phone | No | New vendor phone number | |
| currency_id | No | New currency ID | |
| payment_terms | No | New payment terms in days | |
| billing_address | No | New billing address | |
| notes | No | New internal notes for the vendor |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate mutation (readOnlyHint=false). Description adds 'existing' qualifier and purpose but does not detail behavioral traits like partial vs full update, idempotency, or return value. Adequate but not rich.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, front-loaded with action, no redundant words. Every sentence adds value, including the usage context.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the rich schema (11 params, nested objects) and no output schema, description covers purpose and usage adequately. Could mention behavior when optional params are omitted (likely unchanged) but not essential.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema provides 100% coverage with detailed descriptions for all 11 parameters. Description adds no additional meaning beyond 'update an existing vendor contact'. Baseline score applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description clearly states 'Update an existing vendor contact' and specifies use for correcting/enriching vendor details needed for expense/bill/payment workflows. Differentiates from sibling create_vendor and get_vendor.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly says 'Use this to correct or enrich vendor details' and ties to specific workflows (expenses, bills, vendor-payments). Does not explicitly mention when not to use or alternatives like create_vendor, but context is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
TDQS
Each tool targets a distinct entity and action, with clear separation even for similar operations like categorizing bank transactions. Attachment tools are differentiated by entity type.
All tool names follow a consistent verb_noun pattern in snake_case, using standard verbs like create, list, get, update, delete, add, categorize, match.
With 49 tools, the count is high but justified given the comprehensive coverage required for Zoho Books' accounting operations. The tools are well-scoped and non-redundant.
Basic CRUD is present for most entities, but missing update operations for bills, invoices, expenses, and accounts, and no delete for those entities. Bank reconciliation tools are thorough.
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Connectors
Hosted MCP server connecting AI assistants to 9,000+ apps and 40,000+ actions via Zapier.
AI for Tally Prime and Tally ERP 9. Hosted MCP server to ask your accounts in any language.
MCP server unifying ERPs, CRMs, APIs and knowledge base for Claude, ChatGPT and Gemini.
MCP server connecting AI agents to 100+ apps (Gmail, Slack, Notion, GitHub) via one-click OAuth.
Related MCP Servers
- AlicenseNot gradedqualityNot gradedmaintenanceAn MCP server that enables AI agents to interact with QuickBooks Online accounts to manage invoices, customers, payments, and financial reports. It provides 20 tools to automate accounting workflows and retrieve financial data through natural language interfaces.
- FlicenseCqualityDmaintenanceA unified MCP server that integrates Zoho CRM and Zoho Books, enabling AI assistants to manage CRM records, Books customers/invoices, synchronize data, and search across both systems.1002
- AlicenseNot gradedqualityDmaintenanceMCP server enabling AI assistants to manage invoices, contacts, products, and other accounting data through the Bukku API.5MIT
- AlicenseBqualityDmaintenanceAn enhanced MCP server for Zoho Projects API integration, enabling AI assistants to manage projects, tasks, issues, milestones, comments, attachments, and more with automatic OAuth token refresh.39MIT
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/bu5hm4nn/zoho-bookkeeper-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server