Storno CLI
OfficialClick on "Deploy 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., "@Storno CLIShow me my latest invoices"
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.
Storno CLI — MCP Server
A Model Context Protocol (MCP) server that exposes the entire Storno.ro e-invoicing API as AI-callable tools. Enables Claude Code, Cursor, Windsurf, and any MCP-compatible AI assistant to manage invoices, clients, companies, ANAF e-Factura, and more.
Features
237 tools covering all Storno.ro API endpoints
Full invoice lifecycle: create, issue, submit to ANAF, email, download PDF/XML
Proforma invoices, recurring invoices, delivery notes, credit notes
Client & product catalog, payment tracking, VAT rates
ANAF e-Factura integration (sync, token management, message retrieval)
Multi-company support with company switching
Automatic JWT token refresh
Webhooks, API keys, team member management
Exchange rates (BNR), reports, exports
Related MCP server: SuperFaktura MCP Server
Quick Start
Hosted Server (recommended)
Storno hosts a public MCP server at https://mcp.storno.ro/mcp with OAuth authentication — no API keys or tokens to manage.
Visit mcp.storno.ro for setup instructions and a one-click "Add to Claude" button.
Claude (claude.ai):
Copy the URL:
https://mcp.storno.ro/mcpClick "Add" and paste the URL
Authorize via OAuth
Claude Code:
claude mcp add storno --transport http https://mcp.storno.ro/mcpCursor / Windsurf:
{
"mcpServers": {
"storno": {
"url": "https://mcp.storno.ro/mcp"
}
}
}Claude Desktop:
{
"mcpServers": {
"storno": {
"command": "npx",
"args": ["-y", "mcp-remote", "https://mcp.storno.ro/mcp"]
}
}
}Self-hosted / Token-based Setup
If you prefer to use a JWT token directly (e.g. for self-hosted Storno instances):
1. Install
npm install -g storno-cliOr use directly with npx — no install needed.
2. Configure for Claude Code
Add to your project's .claude/settings.json or global ~/.claude/settings.json:
{
"mcpServers": {
"storno": {
"command": "npx",
"args": ["-y", "storno-cli"],
"env": {
"STORNO_TOKEN": "your-jwt-token",
"STORNO_COMPANY_ID": "your-company-uuid"
}
}
}
}3. Configure for Cursor
Add to .cursor/mcp.json:
{
"mcpServers": {
"storno": {
"command": "npx",
"args": ["-y", "storno-cli"],
"env": {
"STORNO_TOKEN": "your-jwt-token",
"STORNO_COMPANY_ID": "your-company-uuid"
}
}
}
}4. Configure for Claude Desktop
Add to ~/Library/Application Support/Claude/claude_desktop_config.json (macOS) or %APPDATA%\Claude\claude_desktop_config.json (Windows):
{
"mcpServers": {
"storno": {
"command": "npx",
"args": ["-y", "storno-cli"],
"env": {
"STORNO_TOKEN": "your-jwt-token",
"STORNO_COMPANY_ID": "your-company-uuid"
}
}
}
}Environment Variables
Variable | Required | Default | Description |
| No |
| API base URL |
| No* | — | JWT access token |
| No | — | JWT refresh token (for auto-renewal) |
| No* | — | Default company UUID |
| No | — | Email for auto-login (if no token) |
| No | — | Password for auto-login (if no token) |
| No | — | If set, starts Streamable HTTP transport on this port |
| No |
| HTTP bind address (used with |
* You can authenticate at runtime using the auth_login tool instead.
Authentication
Three ways to authenticate:
Option A: Pre-configured token (recommended for production)
Set STORNO_TOKEN in your MCP server environment config.
Option B: Auto-login on startup
Set STORNO_EMAIL and STORNO_PASSWORD. The server will automatically log in when it starts and keep the token refreshed.
Option C: Interactive login via AI
Ask the AI: "Log me in to Storno with email user@example.com and password mypassword"
The AI will call the auth_login tool, which stores the token in memory for the session.
Multi-Company Support
All company-scoped tools require a company context. Three ways to provide it:
Environment variable: Set
STORNO_COMPANY_IDin your MCP configSelect command: Ask the AI to call
companies_selectwith a company UUIDPer-request override: Every company-scoped tool accepts an optional
companyIdparameter
Example AI conversation:
You: List my companies
AI: [calls companies_list] You have 2 companies:
- ABC SRL (uuid: 550e8400...)
- XYZ SRL (uuid: 661f9500...)
You: Switch to XYZ SRL
AI: [calls companies_select with uuid] Done, now using XYZ SRL
You: Show me recent invoices
AI: [calls invoices_list — automatically uses XYZ SRL context]Tool Reference
See TOOLS.md for the complete reference of all 237 tools with descriptions and parameters.
Tool Categories
Category | Tools | Description |
| 7 | Login, register, refresh tokens, profile management |
| 8 | Company CRUD + context switching + ANAF settings |
| 32 | Full invoice lifecycle (create → issue → submit → email → PDF/XML) |
| 10 | Client management (synced from e-Factura) |
| 2 | Product catalog |
| 3 | Payment recording and tracking |
| 12 | Proforma lifecycle (create → send → accept/reject → convert) |
| 10 | Recurring invoice schedules |
| 18 | Delivery note lifecycle + status management |
| 13 | Fiscal receipts (bonuri fiscale) + conversion to invoices |
| 4 | VAT rate CRUD |
| 4 | Bank account CRUD |
| 5 | Invoice number series management |
| 8 | Supplier management |
| 2 | BNR exchange rates + currency conversion |
| 4 | Email template CRUD |
| 8 | ANAF token management + e-Factura sync + validation |
| 2 | e-Factura message retrieval |
| 6 | Multi-country e-invoicing (EU-wide) |
| 1 | Dashboard statistics |
| 1 | Invoice defaults (currencies, units, VAT rates) |
| 3 | Organization team members |
| 4 | Team invitations |
| 6 | Notification management + preferences |
| 10 | Webhook CRUD + testing + delivery logs |
| 5 | API token management |
| 7 | VAT reports + financial reports |
| 1 | Export file downloads |
| 8 | CSV/XLSX/XML import for clients, products, invoices |
| 8 | Bank reconciliation (borderou) |
| 6 | Backup creation + restore |
| 3 | System administration (requires admin role) |
| 4 | License key management |
| 4 | PDF invoice template customization |
| 5 | File storage configuration |
| 3 | Export to accounting formats |
| 2 | Company registry lookups |
| 1 | CPV code lookup |
| 1 | NC code lookup |
| 2 | System health + version info |
Common AI Workflows
Create and send an invoice
You: Create an invoice for client Acme SRL, 10 hours web development at 100 RON/hour, due in 30 days
AI: [calls clients_list to find Acme SRL]
[calls invoices_create with clientId, lines, dates]
[calls invoices_issue to mark as issued]
[calls invoices_email to send to client]
Invoice FAC-2024-042 created, issued, and emailed to contact@acme.roCheck ANAF sync status
You: What's the ANAF sync status for my company?
AI: [calls anaf_status]
Last sync: 2 hours ago, 156 invoices synced, token valid until March 16Generate a monthly report
You: Show me all invoices from January 2024
AI: [calls invoices_list with from=2024-01-01, to=2024-01-31]
Found 23 invoices, total: 45,230 RON
- 18 issued, 3 paid, 2 overdueHTTP Transport
By default, storno-cli uses stdio transport for local MCP clients. Set STORNO_HTTP_PORT to enable Streamable HTTP transport for remote access.
# Start HTTP server on port 3000
STORNO_TOKEN=your-token STORNO_COMPANY_ID=your-company-uuid \
STORNO_HTTP_PORT=3000 node dist/index.js
# Bind to all interfaces (for production behind a reverse proxy)
STORNO_HTTP_PORT=3000 STORNO_HTTP_HOST=0.0.0.0 node dist/index.jsThe server exposes a single /mcp endpoint supporting POST, GET, and DELETE per the MCP Streamable HTTP spec. Each client connection creates an isolated stateful session.
Initialize a session:
curl -X POST http://127.0.0.1:3000/mcp \
-H "Content-Type: application/json" \
-d '{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2025-03-26","capabilities":{},"clientInfo":{"name":"test","version":"1.0"}}}'
# Response includes mcp-session-id headerCall a tool:
curl -X POST http://127.0.0.1:3000/mcp \
-H "Content-Type: application/json" \
-H "mcp-session-id: <session-id>" \
-d '{"jsonrpc":"2.0","id":2,"method":"tools/call","params":{"name":"system_health","arguments":{}}}'Development
npm run dev # Watch mode (recompile on changes)
npm run build # Production build
npm run start # Start MCP server (stdio)Architecture
storno-cli/
├── src/
│ ├── index.ts # Entry point — dispatches to stdio or HTTP transport
│ ├── server.ts # McpServer factory (creates server + registers all tools)
│ ├── http-server.ts # Streamable HTTP transport with session management
│ ├── config.ts # Environment configuration
│ ├── client.ts # HTTP client with JWT auth + auto-refresh
│ ├── tools/ # 40 tool domain files (237 tools total)
│ │ ├── auth.ts
│ │ ├── invoices.ts # Largest: 32 tools for full invoice lifecycle
│ │ ├── companies.ts
│ │ └── ... # 37 more domain files
│ └── utils/
│ ├── errors.ts # AI-readable error formatting
│ └── pagination.ts # Pagination helpers
├── dist/ # Compiled JavaScript output
├── package.json
├── tsconfig.json
├── README.md # This file
└── TOOLS.md # Complete tool referenceRequirements
Node.js >= 20.0.0
npm
License
Tool annotations
All tools carry explicit MCP annotations (title, readOnlyHint, destructiveHint, idempotentHint, openWorldHint), so a client can tell reads from writes and writes from deletes before calling anything. See the Tool annotations section of TOOLS.md; npm run check:annotations -- --table prints the table.
Available Tools
374 toolsaccounting_export_settings_getARead-onlyIdempotent
Get the accounting export configuration for the active company. Returns settings for Saga, Winmentor, and Ciel accounting software integrations including account codes, journal mappings, and export preferences.
| Name | Required | Description | Default |
|---|---|---|---|
| companyId | No | Company UUID override (uses active company if not set) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, destructiveHint=false, and openWorldHint=false, so the safety profile is fully covered. The description adds that it scopes to the active company and lists the returned settings categories, but says nothing about permissions, error behavior, or what happens if no config exists.
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 tight sentences with zero filler; the core action and scope come first, followed by a compact enumeration of the return payload. Nothing is redundant.
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 parameterless read-only getter with full schema coverage and no output schema, the description supplies the one thing that would otherwise be missing: what the response actually contains (account codes, journal mappings, export preferences per integration). Minor residual gap is the absence of any note about unconfigured companies.
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 the single optional companyId already documented as a UUID override that defaults to the active company. The description's mention of 'active company' is consistent with, but not additive to, the schema, so the baseline 3 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?
States a specific verb ('Get') and precise resource ('accounting export configuration for the active company'), and enumerates the target integrations (Saga, Winmentor, Ciel). It is clearly distinguishable from accounting_export_settings_update by its read semantics, though it never names the sibling tools explicitly.
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?
Usage is implied by the read-only 'get configuration' framing and the mention of account codes/journal mappings, but there is no explicit when-to-use guidance, no statement of prerequisites, and no pointer to accounting_export_settings_update or accounting_export_zip as alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
accounting_export_settings_updateAIdempotent
Update accounting export configuration for the active company. Settings are merged with existing config. Configure account codes, journal mappings, and export preferences for Saga, Winmentor, or Ciel.
| Name | Required | Description | Default |
|---|---|---|---|
| settings | Yes | Accounting export settings object to merge with existing config | |
| companyId | No | Company UUID override (uses active company if not set) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare idempotent=true, destructive=false, and closed-world, so the safety profile is covered. The description adds genuinely valuable context beyond that: settings are MERGED with existing config (partial update semantics) rather than replaced, and it names which export targets are configurable. It stops short of describing error behavior or permission 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?
Three short sentences, front-loaded with the action and scope, followed by the merge semantics and then the content categories. No filler; only minor cost is that the provider list trails rather than being integrated with the settings 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 a nested, opaque settings object and no output schema, the description does a reasonable job but does not state what a successful response contains or what happens on conflicting keys during merge. For a mutation with a free-form payload, an agent would still benefit from knowing whether unknown keys are rejected or ignored.
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% but the key parameter 'settings' is an untyped free-form object with additionalProperties {}, so the schema itself says almost nothing about valid content. The description compensates by naming the categories of settings (account codes, journal mappings, export preferences) and the provider targets, which meaningfully constrains what the agent should put in that object.
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 names a specific verb (Update), resource (accounting export configuration), and scope (active company), and identifies the supported providers (Saga, Winmentor, Ciel). An agent can distinguish this from accounting_export_settings_get and accounting_export_zip without reading the schema.
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?
Usage is implied by the 'Update' verb and the existence of accounting_export_settings_get, but the description never explicitly says when to use this versus the getter or the zip export tool. No prerequisites or exclusions are stated, leaving routing to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
accounting_export_zipA
Export accounting data as a ZIP archive for import into accounting software (Saga, Winmentor, or Ciel). The ZIP contains XML files for clients, suppliers, products, invoices, receipts, and payments. Filter by date range. For SAGA you may override the chart-of-accounts at export time (e.g. card analytic 5125.2) via accounts.{cash,bank,card,clients,suppliers}; values fall back to the company’s stored settings.
| Name | Required | Description | Default |
|---|---|---|---|
| dateTo | No | End date filter (YYYY-MM-DD) | |
| target | Yes | Target accounting software format | |
| accounts | No | SAGA only: per-export chart-of-accounts overrides; missing keys fall back to stored settings | |
| dateFrom | No | Start date filter (YYYY-MM-DD) | |
| companyId | No | Company UUID override (uses active company if not set) | |
| exportBnr | No | SAGA only: include curs_bnr file with current exchange rates | |
| exportAccounts | No | SAGA only: include conturi_cli/conturi_frn files (default true) | |
| includeDiscount | No | SAGA only: include invoice-level discount in <Antet> | |
| currencyAccounts | No | SAGA only: per-currency account overrides keyed by ISO 4217 code (USD, EUR, ...). Receipts/payments are split into one SAGA XML file per currency when more than one currency is present. Missing per-currency fields fall back to the RON defaults. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds useful behavioral context by listing the archive contents and explaining SAGA chart-of-accounts overrides with fallback to stored settings. However, it does not disclose important export mechanics such as how the ZIP is returned, whether the operation is asynchronous, or any permission/rate-limit constraints, leaving meaningful gaps beyond the safety 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 front-loaded with the tool's purpose and then adds archive contents, filtering, and SAGA-specific override behavior. Every sentence contributes useful context without repetition or 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 9 parameters, nested account structures, and no output schema, the description gives an adequate high-level picture: what is exported, which formats are targeted, and how SAGA overrides work. It omits some lower-level SAGA flags and delivery details, but the rich schema covers those parameter specifics.
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 already 100%, so the schema documents parameters including target, date filters, accounts, currencyAccounts, and SAGA-only flags. The description adds only limited parameter context: date filtering, the accounts override syntax, and SAGA-only behavior, but does not explain currencyAccounts or the other SAGA-specific flags.
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 states a specific verb and resource: export accounting data as a ZIP archive for import into named accounting systems. It also scopes the archive contents, distinguishing it from narrower sibling exports such as invoices_export_zip or clients_export_saga_xml.
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 establishes the intended use case: import into Saga, Winmentor, or Ciel, with optional date filtering. It does not explicitly compare against sibling export tools or state when not to use it, which keeps it below a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
admin_activityARead-onlyIdempotent
Per-user platform activity over the last N days, aggregated from the audit log: actions, active days, invoices created, invoices issued, last activity, organizations. SUPER_ADMIN only. Use to find who uses the platform regularly and who issues invoices continuously; sorted by invoices issued, then invoices created and active days.
| Name | Required | Description | Default |
|---|---|---|---|
| days | No | Window in days (default: 30, max: 365) | |
| limit | No | Max users returned (default: 25, max: 100) | |
| exclude | No | Comma-separated user emails to leave out, e.g. the admin's own account |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnly, idempotent, non-destructive, closed-world), and the description adds real value beyond them: the SUPER_ADMIN authorization requirement, the audit-log data source, the exact metric set, and the full sort ordering (invoices issued, then created, then active days).
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?
Front-loaded with the purpose and scope, then the permission gate, then the use case and sort order. Dense but every clause carries information; the metric enumeration is slightly listy but justified for a report tool with no output schema.
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 no output schema, the description compensates by naming the returned dimensions (actions, active days, invoices created/issued, last activity, organizations) and the ordering, plus the auth gate and data source. An agent has everything needed to call it and interpret the result set.
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 schema already documents days (default 30, max 365), limit, and exclude with an example. The description only restates the day-window concept as 'last N days' and adds no syntax or default detail beyond the schema, so baseline 3 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?
States a specific resource and scope: per-user activity aggregated from the audit log over a day window, plus the exact metrics returned. An agent can distinguish it from admin_audit_logs (raw log) or admin_stats (platform-wide) by the 'per-user, aggregated' framing, though no sibling is named explicitly.
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?
'Use to find who uses the platform regularly and who issues invoices continuously' gives a concrete selection context, and 'SUPER_ADMIN only' states the access prerequisite. It stops short of explicitly excluding alternatives (e.g. when to prefer admin_audit_logs or admin_users instead).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
admin_audit_logsARead-onlyIdempotent
List platform audit log entries (create/update/delete/impersonate actions on invoices, clients, companies, users...). SUPER_ADMIN only. Supports excluding known users (e.g. the admin's own account) and system actors so real customer activity stands out.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | Page number (default: 1) | |
| limit | No | Items per page (default: 25, max: 100) | |
| action | No | Filter by action | |
| search | No | Partial match on entity type, entity id or user email | |
| exclude | No | Comma-separated user emails to hide, plus the keyword "system" to hide rows without a user (workers, webhooks, CLI). Example: "contact@example.com,system" | |
| entityType | No | Filter by entity short name, e.g. Invoice, Client, Company, User |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint and destructiveHint=false, so the safety profile is covered by structured data. The description adds the privilege requirement (SUPER_ADMIN) and the semantic effect of the exclude filter, which annotations cannot convey; return ordering and pagination behavior are left unstated.
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 sentences, front-loaded with purpose, then the access constraint, then the filtering rationale. No filler and nothing repeated.
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, fully documented 6-parameter list tool with no output schema, the description covers scope, privilege, and filtering intent. Only the absence of any tie-breaker against sibling admin/admin audit tools leaves a small gap.
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 every parameter is already documented in the schema with defaults and an example. The description reinforces the purpose of `exclude` ("so real customer activity stands out") but adds no syntax or constraints beyond what the schema states, so the baseline 3 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?
States a specific verb and resource ("List platform audit log entries") and enumerates the action and entity scope an agent needs to recognize the data it returns. It does not distinguish itself from the closest sibling, admin_activity, which an agent could plausibly pick instead.
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?
"SUPER_ADMIN only" gives an explicit access precondition, and the note about excluding known users explains the intended investigative use case. It stops short of naming when to prefer admin_activity or admin_users over this tool, so the routing guidance is clear but not exclusionary.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
admin_email_logARead-onlyIdempotent
List lifecycle email log entries with filtering and pagination. SUPER_ADMIN only. Returns sent/skipped/failed lifecycle emails across all categories (re_engagement, trial_ended, feature_drip, account_without_login, first_company_created, first_invoice_created, dunning, trial_expiration). Use to audit delivery, debug suppressions, or check drip cadence.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | Page number (default: 1) | |
| limit | No | Items per page (default: 25, max: 100) | |
| dateTo | No | Filter entries sent on or before this ISO 8601 date, e.g. 2026-05-31 | |
| status | No | Filter by delivery status | |
| userId | No | Filter by sender/associated user UUID | |
| category | No | Filter by email category, e.g. re_engagement, trial_ended, feature_drip | |
| dateFrom | No | Filter entries sent on or after this ISO 8601 date, e.g. 2026-05-01 | |
| recipientEmail | No | Filter by recipient email (partial match) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true and destructiveHint=false, so safety is covered. The description adds a genuinely useful behavioral constraint not in annotations — that the tool is SUPER_ADMIN only — plus the paginated nature and the outcome states returned. No rate limits or ordering behavior is mentioned.
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 the operation and scope, then the access restriction, then the use cases. No filler and nothing repeated from the annotations.
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 an eight-optional-parameter read tool with no output schema, the description covers purpose, auth requirement, returned content and use cases. It omits result ordering and whether a total count is returned, which keeps it from being 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 100%, so the baseline is 3; the description earns above baseline by expanding the category enumeration to all eight lifecycle categories where the schema only lists three examples. It still says nothing about the date-range pair or recipientEmail partial matching, but those are documented 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 states a specific verb and resource ('List lifecycle email log entries with filtering and pagination') and pins down the exact scope by enumerating the lifecycle categories, which separates it from nearby siblings like admin_audit_logs and invoices_email_history. An agent can identify the resource without opening the schema.
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 gives concrete when-to-use context ('audit delivery, debug suppressions, or check drip cadence') and states the access precondition (SUPER_ADMIN only). It does not name when-not-to-use or point to an alternative log tool, so it stops short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
admin_organizationsARead-onlyIdempotent
List all organizations on the platform with pagination and filtering. SUPER_ADMIN only. Returns organization details including owner info, subscription plan, member/company/invoice counts, and ANAF token status.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | Page number for pagination (default: 1) | |
| plan | No | Filter by subscription plan type | |
| limit | No | Items per page (default: 50, max: 200) | |
| search | No | Search by organization name or owner name/email | |
| status | No | Filter by organization status: active, trial, or suspended |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/non-destructive, so safety is covered; the description adds genuinely new context: the required SUPER_ADMIN role and the shape of the payload (owner info, plan, member/company/invoice counts, ANAF token status). It omits operational traits such as rate limits or whether pagination metadata includes a total, keeping it short of a 5.
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 sentences, front-loaded with the operation and scope, then the auth gate, then the return payload. No redundancy with the title and nothing wasted.
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 full schema coverage and read-only annotations, the description covers auth scope and return contents, which is what an agent needs to select and invoke it. The remaining gap is paging behavior (whether a total count or cursor is returned) for an unbounded, filterable list.
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 page, limit, search, plan and status are all documented in the schema itself. The description only gestures at 'pagination and filtering' and hints at the plan field through 'subscription plan', adding no syntax or behavioral detail beyond the schema. Baseline 3 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?
States a specific verb and resource ('List all organizations on the platform') plus the scope (pagination and filtering) and the privilege boundary (SUPER_ADMIN only). An agent can immediately tell this is the platform-wide org listing, distinct from admin_users or admin_stats in the sibling set.
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 'SUPER_ADMIN only' clause gives a hard eligibility gate that tells the agent when this tool is callable and when it must route elsewhere. It doesn't enumerate alternatives, but no sibling overlaps enough to require an explicit exclusion.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
admin_statsARead-onlyIdempotent
Get platform-wide statistics including user counts, organization metrics, company sync status, invoice totals, and system info. SUPER_ADMIN only. Results are typically cached for 5 minutes.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, non-destructive, so safety is covered. The description adds two pieces of genuine behavioral context beyond them: the SUPER_ADMIN authorization requirement and the ~5 minute cache staleness window, which matters if the agent is reporting fresh numbers.
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 compact sentences with what-it-returns front-loaded, then the auth gate, then the caching caveat. No filler and no repetition of the annotations.
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 zero-param, no-output-schema tool the description covers the scope of the payload by enumerating the statistic categories, plus the access requirement and freshness caveat. Exact field names and structure remain unspecified, which is the only real gap.
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?
Zero parameters, so there is nothing to disambiguate and the baseline of 4 applies. The description correctly implies a no-argument, single-shot call.
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?
Specific verb plus resource ('Get platform-wide statistics') with the contents enumerated: user counts, org metrics, company sync status, invoice totals, system info. The 'platform-wide' scope implicitly separates it from dashboard_stats and from narrow siblings like admin_users or admin_organizations, though none are named explicitly.
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 'SUPER_ADMIN only' line is an eligibility constraint, not a when-to-use rule. It never states when an agent should pick this over dashboard_stats, admin_users, or system_health; the agent must infer that from the 'platform-wide' wording.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
admin_usersARead-onlyIdempotent
List all users on the platform with pagination and filtering. SUPER_ADMIN only. Returns user account details, verification status, role, last login timestamp, and organization memberships.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | Page number for pagination (default: 1) | |
| role | No | Filter by user system role | |
| limit | No | Items per page (default: 50, max: 200) | |
| search | No | Search by user name or email address | |
| status | No | Filter by user status: active, inactive, verified, or unverified |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and destructiveHint=false, so the safety profile is covered. The description adds genuinely non-schema information: the SUPER_ADMIN authorization requirement and the shape of what is returned (verification status, role, last login, memberships).
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 compact sentences, front-loading the core action, then the authorization gate, then the payload. Nothing is repeated and nothing is wasted.
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 no output schema, the description's enumeration of returned fields does real work, and the auth constraint plus pagination/filtering note cover the remaining unknowns. An agent has enough to decide and invoke 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 description coverage is 100%, with every parameter documented including the status enum and the limit maximum, so the description only echoes 'pagination and filtering' generically. Baseline 3 is appropriate since the schema carries all parameter meaning.
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?
States a specific verb and resource plus platform-wide scope ('List all users on the platform with pagination and filtering'), which implicitly separates it from org-scoped siblings like members_list. It never names a sibling outright, so differentiation is inferential rather than explicit.
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?
'SUPER_ADMIN only' gives a clear precondition for use, which is exactly the kind of context an agent needs before calling an admin endpoint. It stops short of stating when to prefer members_list or admin_organizations instead, so no explicit exclusions are provided.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
admin_version_overridesARead-onlyIdempotent
List the per-platform version-gate overrides for the mobile app. SUPER_ADMIN only. Returns one entry per supported platform (ios/android/huawei) with the deploy-time YAML defaults, the live DB override (if any), and the merged effective values that drive /api/v1/version. Use admin_version_override_update to flip the kill switch.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, non-destructive behavior, but the description adds substantial context beyond them: the SUPER_ADMIN authorization requirement, the return shape (one entry per ios/android/huawei with YAML defaults, live DB override, merged effective values), and the downstream consumer (/api/v1/version). This is exactly the kind of behavioral detail an agent needs.
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 the action and scope, followed by authorization, return structure, and the sibling alternative. Every sentence earns its place with no repetition of structured fields.
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 no output schema, the description compensates by explaining the return payload in detail. Combined with annotations covering safety and the explicit SUPER_ADMIN gate, an agent has everything needed to call this tool correctly and interpret its output.
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?
Zero parameters, so the schema has nothing to document and the baseline is 4. The description correctly does not waste space discussing parameters, though it also does not need to.
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?
States a specific verb and resource: 'List the per-platform version-gate overrides for the mobile app.' It distinguishes itself from the sibling mutation tool by naming admin_version_override_update and its role (flip the kill switch), so an agent can route correctly without opening schemas.
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?
Gives a clear precondition ('SUPER_ADMIN only') and explicitly points to admin_version_override_update for the mutation case. It implies this tool is for inspection but does not spell out a 'when not to use' beyond the update alternative, so it falls just short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
admin_version_override_updateAIdempotent
Set or clear per-field version-gate overrides for one mobile platform. SUPER_ADMIN only. Each override field is independent — set a string to override, set null to clear, omit to leave as-is. Audit-logged. Bumping minOverride to a value above the live install ratchets the in-app blocker on instantly without a redeploy.
| Name | Required | Description | Default |
|---|---|---|---|
| notify | No | When true, fan out an in-app notification + push to every active user on the platform whose last reported version is below the new effective min/latest. Default off — pass true for ratchets, leave false for silent corrections. | |
| platform | Yes | Mobile platform to override. | |
| minOverride | No | Lowest supported semver, e.g. "1.4.5". null clears, omit to leave as-is. | |
| latestOverride | No | Latest published semver. Bumping this promotes clients to the recommended-update prompt. | |
| messageOverride | No | Locale-keyed message shown under the prompt, e.g. {"ro": "Critical security update.", "en": "Critical security update."}. {} or null clears. | |
| storeUrlOverride | No | Override the deep link the Update button opens (rare — only when a store URL changes mid-incident). | |
| releaseNotesUrlOverride | No | Optional "what's new" URL shown next to the Update button. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Adds substantial context beyond annotations: SUPER_ADMIN auth requirement, audit logging, the independent per-field set/null/omit semantics, and the instant-ratchet effect of raising minOverride. These are real behavioral facts not in the schema or annotations, and are consistent with idempotentHint=true and destructiveHint=false.
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?
Tight and front-loaded; each sentence adds a distinct operational fact.
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 no-output-schema mutation tool, the description covers who can call it, what each field does, side effects (notification fan-out, blocker ratchet), and audit implications — enough for an agent to invoke 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%, so the baseline is 3, but the description reinforces the cross-parameter tri-state contract (string overrides, null clears, omit leaves as-is) and explains notify's ratchet-vs-silent-correction intent, adding genuine value.
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?
States a specific verb (set/clear), resource (per-field version-gate overrides) and scope (one mobile platform), which cleanly distinguishes it from the sibling admin_version_overrides listter.
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?
Gives clear usage context: SUPER_ADMIN only, and the per-field tri-state semantics. It doesn't explicitly route to a sibling alternative (e.g. admin_version_overrides for reading), but the mutation-vs-read distinction is obvious from the verb.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
agent_certificatesARead-onlyIdempotent
Qualified certificates the local Storno Agent can use (USB tokens, Keychain / Windows store identities, cloud certificates such as Trans Sped EasySign on Windows): id, subject, issuer, expiry and kind (token = PIN required; cloud = the vendor app approves each operation, no PIN; software = no PIN). The id is what agent_sign_pdf and the submission tools need.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the read-only and idempotent annotations, the description explains that certificates are local to the Storno Agent and distinguishes token certificates requiring a PIN from cloud certificates approved by a vendor app and software certificates requiring no PIN. This adds meaningful operational context, though it does not cover behavior when the local agent is unavailable or how an empty result should be interpreted.
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 compact and front-loads the resource and returned fields before explaining certificate-kind semantics and downstream id use. Despite dense parenthetical detail, every clause carries useful information and there is 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?
With no output schema and no parameters, the description supplies the relevant return fields and their meanings, plus the downstream use of id. It is nearly complete, but it does not state the response container shape or error/empty-state behavior.
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 tool has zero parameters, so there are no parameter semantics to clarify; the baseline for zero-parameter tools applies. The description appropriately does not invent parameter 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 identifies a specific resource, qualified certificates usable by the local Storno Agent, and enumerates certificate kinds and returned fields. It also distinguishes the tool from signing/submission siblings by pointing to agent_sign_pdf and the submission tools as consumers of the returned id.
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 final sentence clearly establishes when the returned id is needed: before calling agent_sign_pdf or the submission tools. It gives strong context but does not include explicit exclusions or alternatives, so it stops short of a full when/when-not guideline.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
agent_sign_pdfA
Sign one or many PDF files with the qualified certificate through the local Storno Agent (PAdES/CMS signature embedded in the PDF), e.g. declarations produced by DUKIntegrator, contracts, any document ANAF or a partner wants signed. Pass file paths and/or directories (all *.pdf inside); each signed copy is written next to the original as .signed.pdf (or into outDir). Requires the certificate PIN (pin, STORNO_AGENT_PIN, or the PIN remembered on this computer by the agent); the batch stops at the first PIN error to protect the token.
| Name | Required | Description | Default |
|---|---|---|---|
| pin | No | Token PIN; defaults to STORNO_AGENT_PIN, or to the PIN the agent remembers for this certificate | |
| files | Yes | PDF paths and/or directories | |
| outDir | No | Directory for the signed copies (default: next to each file) | |
| visible | No | Draw a visible signature box in the footer of the last page ("Semnat digital de …", date, issuer). Default: invisible signature (still verifiable in Adobe Reader / ANAF) | |
| signerName | No | Name shown in the visible box (default: the certificate subject) | |
| certificateId | Yes | Certificate id from agent_certificates |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations, it discloses that the original is untouched and a new <name>.signed.pdf copy is written next to it (or into outDir), that directories are expanded to all *.pdf inside, that PIN resolution follows a fallback chain (pin → STORNO_AGENT_PIN → remembered PIN), and that the batch aborts at the first PIN error to protect the token from lockout. Those are exactly the operational facts an agent cannot infer from the schema or the readOnly/destructive hints.
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?
Everything is packed into one dense paragraph, but it is front-loaded with the verb and purpose, and each clause carries information (mechanism, examples, input shape, output location, PIN requirements, failure semantics). Slightly long and unsegmented, but no filler sentences.
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 6-parameter mutation tool with no output schema, the description covers both the effect (a signed copy alongside the original or in outDir) and the failure mode (stop at first PIN error), which substitutes for the missing return documentation. An agent has everything needed to call it correctly and anticipate the results.
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 adds real value by stating the output naming convention, that directories are accepted for files, and the PIN precedence order. It still leaves the interaction between visible/signerName and the default (certificate subject) largely to the schema, so it is good rather than exceptional.
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 opens with a specific verb and resource ('Sign one or many PDF files') plus the mechanism (qualified certificate via the local Storno Agent, PAdES/CMS embedded). It is clearly distinguishable from siblings such as agent_submit_declaration_pdf or agent_certificates because it names the input (arbitrary PDF paths/directories) and the output artifact.
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 gives concrete usage context ('declarations produced by DUKIntegrator, contracts, any document ANAF or a partner wants signed') and states the certificateId must come from agent_certificates, which is effectively a prerequisite. It does not explicitly say when to prefer the sibling agent_submit_declaration_pdf for declaration flows, so it falls short of a full when/when-not/alternatives answer.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
agent_statusARead-onlyIdempotent
Is the local Storno Agent running, which version, and is an update available. The agent lives on the user's computer and holds the qualified certificate (USB token) used for ANAF declarations, SPV and PDF signing.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, non-destructive and openWorld, so the safety profile is covered. The description adds genuinely useful context beyond that: the agent is local to the user's machine and holds the qualified certificate on a USB token, which explains why probing its state matters and implies no server-side side effects. It says nothing about failure modes (what is returned when the agent is offline), which keeps it from a 5.
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 direct question the tool answers, followed by only the context needed to understand what the agent is. No filler, nothing repeated from annotations.
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 zero-param status probe with full annotation coverage and no output schema, the description adequately covers what the call reports and what the agent represents. The remaining gap is the offline case — an agent would benefit from knowing what a negative result looks like or what to do next, but nothing essential is missing.
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 tool takes zero parameters, so there is nothing to disambiguate and the baseline is 4. The description correctly frames the call as a simple query requiring no input.
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 states a precise purpose: checking whether the local Storno Agent is running, its version, and update availability — three concrete answers from one call. The second sentence distinguishes the local desktop agent from the cloud backend, which is the key conceptual split against siblings like system_version or agent_certificates, though it never names an alternative explicitly.
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?
Usage is only implied: an agent would infer this is the pre-flight check before agent-dependent operations (agent_sign_pdf, declarations_file_via_agent), since the description explains the agent holds the signing certificate. There is no explicit when-to-use, when-not-to-use, or pointer to sibling tools such as agent_certificates for certificate details.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
agent_submit_declaration_pdfA
File a declaration PDF (made by DUKIntegrator, XML embedded, e.g. from Storno's declarations or a C168/D212 built with the public tools) at ANAF: the local agent signs it with the certificate and uploads it to the e-guvernare declarations portal (WAS6DUS), then returns ANAF's upload index. Track it with anaf_declaration_status (index + CUI/CNP); the recipisa arrives in the SPV inbox and on StareD112. Requires the PIN (pin, STORNO_AGENT_PIN, or the PIN remembered on this computer by the agent).
| Name | Required | Description | Default |
|---|---|---|---|
| pin | No | ||
| file | Yes | Path to the DUK-generated PDF | |
| fileName | No | Name sent to ANAF (default: the file name) | |
| certificateId | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (write, non-idempotent, open-world, non-destructive). The description adds meaningful behavior beyond that: the local agent signs with the certificate, uploads to the portal, returns the ANAF upload index, and the recipisa lands in the SPV inbox and on StareD112. This gives the agent real workflow context that the annotations cannot express.
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 definition is dense but well front-loaded: the action, the artifact, the signing/upload mechanics, the return value, and the prerequisites all appear in order with no filler sentences. It is longer than average but each clause carries 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 write tool with no output schema, the description explains the lifecycle well: what is returned (upload index), how to track it (anaf_declaration_status with CUI/CNP), and where the recipisa appears. The main omission is that certificateId semantics are never touched, and error/auth failure modes are unmentioned.
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 50%: file and fileName are documented in the schema, but pin and certificateId are not. The description compensates partially by explaining the three PIN sources (pin argument, STORNO_AGENT_PIN, or the remembered PIN on this machine), which is genuinely useful. It says nothing extra about certificateId, so half the parameters still rely on bare 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 states a specific verb and resource: it files a DUK-generated declaration PDF at ANAF, signed locally with a certificate and uploaded to WAS6DUS. This clearly distinguishes it from generic siblings like declaration_pdf (a generator) or agent_sign_pdf (signing only). It does not explicitly contrast with declarations_submit or declarations_file_via_agent, so it falls short of a 5.
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?
Implicit usage is clear — you need a DUKIntegrator PDF and want it filed. It also names anaf_declaration_status as the follow-up tool for tracking, which is helpful. However, with close siblings such as declarations_submit and declarations_file_via_agent present, it never states when to use this one instead of those, leaving a real routing gap.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
anaf_create_token_linkA
Create a device-based authentication token link for completing the ANAF OAuth flow. Returns a unique URL that can be opened in a browser to complete ANAF authentication. Maximum 5 active links per user. Link expires after a short period.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Adds real context beyond annotations: max 5 active links per user and short expiry duration, which are operational constraints the agent cannot get from the schema. It does not say what happens when the limit is hit or whether links can be revoked early.
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?
Four short sentences, front-loaded with purpose then return value then limits. Every sentence carries information an agent needs; 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?
For a zero-param, no-output-schema tool, it covers purpose, return shape (unique URL), quota, and expiry. Only the failure mode at the quota limit and the link's one-time-use semantics are missing.
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?
Zero parameters, so there is nothing to document; the description correctly does not pad with parameter talk. Baseline 4 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?
Specific verb+resource: 'Create a device-based authentication token link for completing the ANAF OAuth flow.' This clearly separates it from auth_* siblings (login/register/refresh) and from anaf_tokens/anaf_delete_token, though it does not explicitly name those siblings.
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 implies usage ('opened in a browser to complete ANAF authentication') but never states prerequisites or when to prefer this over anaf_tokens or the auth_* family. The agent must infer the workflow position.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
anaf_declaration_statusARead-onlyIdempotent
Processing status of a declaration filed on the ANAF e-guvernare portal (after agent_submit_declaration_pdf or any upload that returned an index): ANAF's public StareD112 by upload index and the taxpayer's CUI/CNP. States: ok (accepted), nok (validation errors, see recipisa), processing, unknown (not indexed yet). Storno asks the three StareD112 hosts in turn (www.anaf.ro, stare.anaf.ro, epatrim.anaf.ro), so an outage of one does not hide the state. Returns the recipisa PDF URL when available. Public, no account.
| Name | Required | Description | Default |
|---|---|---|---|
| cui | Yes | CUI or CNP the declaration was filed for | |
| index | Yes | Upload index returned by the portal, or the registration number from the counter (with ghiseu: true) | |
| ghiseu | No | true when the number is the registration number given at the ANAF counter, not an online upload index |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations, it explains the host fallback behavior across three StareD112 hosts, the meaning of each status value, and that it returns the recipisa PDF URL when available. It also clarifies that the service is public and needs no account.
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 front-loaded with the core purpose and then adds only useful operational context: status meanings, host fallback, and the recipisa return. There is no filler, and the single dense sentence remains readable.
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 no output schema, the description still explains the possible statuses and the optional recipisa PDF URL. Combined with complete parameter coverage and annotations, it gives the agent enough context to call and interpret the tool 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%, so the parameter meanings are already documented in the schema. The description reinforces that the index is the upload index and that CUI/CNP identifies the taxpayer, but it does not add materially new parameter semantics, 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 names a specific operation and resource: checking ANAF declaration processing status via StareD112 using an upload index and CUI/CNP. It also ties the tool to the preceding upload/submission action, making it easy to distinguish from general declaration 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?
It clearly states when to use the tool: after agent_submit_declaration_pdf or any upload that returned an index. It does not explicitly name alternatives or when-not conditions, but the triggering context is unambiguous.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
anaf_delete_tokenADestructiveIdempotent
Delete an ANAF OAuth token. This revokes e-Factura synchronization access for the CIF associated with this token. The token ID is an integer obtained from anaf_tokens.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | The ANAF token ID to delete (integer ID from anaf_tokens) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true and idempotentHint=true, so the safety profile is covered. The description adds genuine value beyond them by naming the actual side effect — revocation of e-Factura synchronization for the CIF tied to the token — which an agent cannot infer from structured fields.
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 sentences with no filler; the core action is front-loaded, the consequence second, and the parameter hint last. Every sentence carries distinct 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 single-parameter deletion with rich annotations and no output schema, this covers action, consequence, and parameter provenance. It could say more about failure modes (unknown ID, already-revoked token) but nothing essential is missing.
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 description already says 'integer ID from anaf_tokens', so the description's note about the integer ID and its source restates structured data rather than extending it. 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?
States a specific verb (delete) and resource (ANAF OAuth token), plus the concrete consequence for e-Factura sync. This distinguishes it cleanly from anaf_tokens (listing) and anaf_create_token_link (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?
It makes clear when you'd call it (to revoke e-Factura sync for a CIF) and tells you where the required ID comes from (anaf_tokens). It stops short of explicit exclusions such as what to do if the token is in use or how to re-establish access afterward.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
anaf_nomenclator_judeteARead-onlyIdempotent
ANAF county nomenclator (cod judet as used in declaration XSDs: 40 = Municipiul Bucuresti, 13 = Constanta …) with the fiscal offices (organe fiscale, ufisc codes) of each county. Public, served from Storno's local mirror of ANAF's nomenclators, no account needed.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/non-destructive, so the bar is lower, and the description still adds genuinely useful behavior: it is served from Storno's local mirror (implying cached/possibly non-live data) and is public with no account needed. Missing only whether the mirror has a refresh cadence or staleness caveat.
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 tight sentences: the first front-loads the resource and its two content axes with illustrative codes; the second covers sourcing and access. No filler, no restatement of the tool name.
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 zero-param lookup with no output schema, the description covers what is returned (county codes and their fiscal offices) and access conditions. It is slightly thin on return shape (flat list of counties with nested office arrays?) and on whether the whole nomenclator is returned at once.
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 tool takes zero parameters, so there is nothing for the description to disambiguate; baseline 4 applies. The description correctly does not invent parameters and instead explains the shape of the returned data.
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 names the resource precisely and glosses the Romanian term ('cod judet as used in declaration XSDs'), plus concretely illustrates the payload with '40 = Municipiul Bucuresti, 13 = Constanta'. It also states the second content axis, fiscal offices (organe fiscale, ufisc codes). It does not differentiate from closely named siblings like anaf_nomenclator_localitati or anaf_nomenclator_strazi, so it stops short of 5.
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?
'as used in declaration XSDs' implies the use case (filling county/office codes in declarations), and 'no account needed' removes a prerequisite. But there is no explicit when-to-use statement, no when-not, and no routing to the localitati/strazi nomenclators it sits beside in the sibling list.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
anaf_nomenclator_localitatiARead-onlyIdempotent
ANAF locality nomenclator for a county: cod_localit (as required by declaration XSDs, e.g. C168 cod_localit_L), SIRUTA and town-hall codes. Optional q filters by name, diacritics-insensitive ("sector 6", "cluj"). Public, local mirror.
| Name | Required | Description | Default |
|---|---|---|---|
| q | No | Name filter | |
| judet | Yes | County code, e.g. 40 for Bucuresti |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safe read-only, idempotent profile. The description adds genuinely useful context beyond them: the data is public (no auth) and served from a local mirror, which hints at possible staleness and avoids unnecessary auth attempts.
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 dense sentences front-load the resource and returned fields, then the filtering behavior. Nothing is wasted, though the parenthetical XSD reference makes the opening slightly heavy.
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 no output schema, the description names the returned fields and clarifies locality vs county scope, which is enough for correct invocation. It could be more explicit about sibling choice, but no critical information is missing.
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%, but the description still adds meaning: it clarifies that q matches by name, is diacritics-insensitive, and gives concrete examples ('sector 6', 'cluj'), which the bare 'Name filter' schema description does not. County parameter semantics are left to the schema, which already has an example.
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?
States a specific resource (locality nomenclator for a county) and names the exact fields returned (cod_localit, SIRUTA, town-hall codes), so its output is identifiable. Sibling differentiation is implicit rather than explicit, but 'locality' versus 'judete' and 'strazi' is clear enough from the name and first clause.
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 use case is implied by 'as required by declaration XSDs, e.g. C168 cod_localit_L', which tells the agent when this data is needed. It does not say when to prefer this over anaf_nomenclator_judete or anaf_nomenclator_strazi, so the routing guidance is incomplete.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
anaf_nomenclator_straziARead-onlyIdempotent
ANAF street nomenclator for a locality: cod_strada + name (e.g. C168 cod_strada_C). q filters by word prefix, diacritics-insensitive ("maniu" finds "Bld. Iuliu Maniu"). Streets are cached locally on first use per locality. Public.
| Name | Required | Description | Default |
|---|---|---|---|
| q | No | Street name filter | |
| judet | Yes | County code, e.g. 40 | |
| limit | No | ||
| localitate | Yes | Locality code from anaf_nomenclator_localitati, e.g. 6 for Sector 6 |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, non-destructive, and open-world. Beyond that the description adds real value: diacritics-insensitive prefix matching, local caching per locality, and public accessibility. No return-format or rate-limit details, but for a cached read-only lookup this is solid.
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 dense sentences, front-loaded with the tool's identity and return shape, followed by the filter semantics and caching note. Every clause carries information; no repetition of the title.
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 no output schema, the description does supply the return shape (cod_strada + name), which matters. Required-vs-optional and the limit cap are left to the schema. For a simple read-only lookup it is complete enough to call 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?
At 75% schema coverage the schema documents judet and localitate; the description adds the crucial semantics of q (word-prefix, diacritics-insensitive, with an example) and ties localitate to the naming/caching behaviour. The limit parameter remains undocumented in both places, a minor gap.
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?
States a specific resource (ANAF street nomenclator for a locality) with a concrete return shape (cod_strada + name) and an example value. This clearly distinguishes it from the sibling nomenclator tools (anaf_nomenclator_judete, anaf_nomenclator_localitati), which cover county and locality levels.
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?
Explains that streets are cached per locality on first use and marked public, and describes the q filter's prefix/diacritics behaviour, which tells an agent how to use it efficiently. It does not explicitly state that localitate must come from anaf_nomenclator_localitati (the schema carries that), nor state 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.
anaf_statusARead-onlyIdempotent
Check the current ANAF integration status for the authenticated user. Returns token count, overall validity, and per-token details including CIF, expiry, and validity for each saved ANAF token.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, openWorldHint, and destructiveHint=false, so the safety profile is covered. The description adds useful return behavior beyond annotations: token count, overall validity, and per-token CIF, expiry, and validity details. It does not explain open-world dependency behavior or rate limits, so it stops short of a 5.
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 text. The purpose is front-loaded, and the second sentence efficiently describes the return payload.
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 no output schema, the description adequately explains what is returned for a zero-parameter read-only status check. It could be stronger by explicitly relating this overview to anaf_tokens and anaf_validate_cif, but it is otherwise complete for invocation.
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 tool has zero parameters, and the schema is empty, so there are no parameter semantics to document. Baseline for a zero-parameter tool is 4.
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?
States a specific verb and resource: checking the current ANAF integration status for the authenticated user. It also previews the returned status data, but does not explicitly distinguish itself from sibling tools such as anaf_tokens or anaf_validate_cif.
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?
Usage is implied by “Check the current ANAF integration status,” so an agent can infer it is for status inspection. However, there is no explicit when-to-use guidance, no exclusions, and no named alternative for listing tokens or validating CIFs.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
anaf_sync_logARead-onlyIdempotent
Retrieve the recent e-Factura sync activity log showing the last 50 synced invoices. Each entry shows the invoice ID, company CIF, sync timestamp, and status (success, failed, or skipped).
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/non-destructive, so the bar is lower, but the description still adds real value: the hard cap of 50 entries (implying no pagination) and the enumerated status values (success, failed, skipped). Missing is any statement about ordering or whether the log is scoped to the caller's organization.
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, zero filler. The scope ('last 50 synced invoices') is front-loaded and the second sentence enumerates the return fields without restating the first.
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 no input parameters and no output schema, the description carries the return-value burden and does so by naming the four fields and the status enum. Minor gaps: ordering of entries and whether results are org-scoped.
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 tool takes zero parameters, so there is nothing for the description to disambiguate and the baseline applies. The statement that it always returns the last 50 entries usefully explains why no filtering parameters exist.
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?
States a specific verb ('Retrieve') and resource ('recent e-Factura sync activity log') with an explicit scope of the last 50 entries, plus the shape of each record. It does not, however, differentiate itself from nearby siblings such as anaf_sync_status or efactura_messages_list, which an agent must infer from names alone.
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?
Usage is only implied: an agent can guess this is for inspecting what happened during ANAF e-Factura sync. There is no explicit 'use this when you need X, use anaf_sync_status instead when Y' and no stated prerequisites or failure conditions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
anaf_sync_statusARead-onlyIdempotent
Get the current e-Factura synchronization status and configuration. Returns whether sync is enabled, the last successful sync timestamp, token validity, and the sync frequency interval.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish that this is a read-only, idempotent, non-destructive operation, so the safety profile is covered. The description adds useful transparency by naming the exact status information returned: sync enabled state, last successful sync timestamp, token validity, and sync frequency interval. It does not mention auth needs or company scoping, but for a read-only status tool this is relatively complete.
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 focused sentences with no wasted language. The purpose is front-loaded, and the second sentence efficiently lists the concrete return fields.
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 compensates for the absence of an output schema by listing the key returned fields, so an agent knows what information it will get. It is slightly incomplete because it does not clarify company scoping or how it relates to nearby ANAF status and sync-log tools.
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?
There are zero parameters, and the schema is empty, so there is no parameter semantics to explain. The baseline for a parameterless tool is 4, and the description appropriately avoids inventing parameter details.
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 states a clear verb and resource: get current e-Factura synchronization status and configuration. It also enumerates the returned status fields, which makes the tool's scope concrete. It does not explicitly distinguish itself from siblings such as anaf_status, anaf_sync_log, or companies_toggle_sync, so it stops short of a 5.
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 what the tool retrieves but gives no guidance on when to use it versus related tools like anaf_status, anaf_sync_log, anaf_sync_trigger, or companies_toggle_sync. There are no exclusions or prerequisites, leaving the agent to infer usage from the name and purpose.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
anaf_sync_triggerA
Manually trigger e-Factura synchronization for all companies with valid ANAF tokens. Validates token availability and subscription plan rate limits, then dispatches an async sync job to fetch new invoices from ANAF SPV.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare non-read-only, non-idempotent, open-world and non-destructive, so the safety profile is covered. The description adds real value beyond that: it discloses the validation gates (token availability, subscription rate limits) and that the job is dispatched asynchronously to fetch invoices — behavior an agent cannot get from the annotations alone.
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 action and scope, then the internal behavior. Every clause carries information; nothing is redundant or padded.
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 no output schema, the description should indicate what the caller gets back. It says an async job is dispatched, which implies an immediate acknowledgement rather than results, but it does not point the agent to anaf_sync_status or anaf_sync_log for follow-up, leaving the post-call flow slightly 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?
Zero parameters, so the baseline is 4; the schema is empty and fully covered. The description does add the meaningful semantic that the operation is unscoped — it applies to all companies with valid tokens — which is exactly the kind of information a parameterless tool needs.
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?
States a specific verb (trigger) and resource (e-Factura/ANAF SPV sync) with an explicit scope: 'for all companies with valid ANAF tokens'. This scope implicitly separates it from per-client siblings like invoices_sync_client or companies_toggle_sync, but it never names an alternative, so an agent must infer the distinction.
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?
'Manually trigger' signals this is the on-demand path versus scheduled sync, which is useful implied guidance. However, there is no explicit statement of when to prefer this over anaf_sync_status, spv_sync_prepare, or invoices_sync_client, and no stated preconditions or exclusions beyond 'valid ANAF tokens'.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
anaf_tokensARead-onlyIdempotent
List all ANAF OAuth tokens associated with the authenticated user. Each token enables e-Factura synchronization for a specific company CIF. Returns token ID, CIF, expiry, and validity status.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, openWorldHint=true, and destructiveHint=false, so the safety profile is covered. The description adds useful context beyond annotations by explaining what each token represents and what fields are returned (token ID, CIF, expiry, validity status); it does not contradict 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 three sentences with no wasted language. It front-loads the primary purpose, then explains token meaning, then documents return fields in a natural order.
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 zero-parameter list tool with rich safety annotations and no output schema, the description is complete. It says what is listed, the scope, what a token represents, and which fields are returned, leaving no significant ambiguity for an agent.
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 tool has zero parameters and the schema is empty, so the baseline is 4. The description does not need to compensate for parameter documentation and appropriately focuses on the resource and return fields instead.
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 states a specific verb ('List') and resource ('ANAF OAuth tokens') along with scope ('authenticated user') and business meaning ('enables e-Factura synchronization for a specific company CIF'). It does not explicitly name or differentiate itself from sibling tools such as anaf_status or anaf_create_token_link, which keeps it just below the top score.
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 by explaining that tokens enable e-Factura sync, so an agent can infer this is the tool to inspect existing tokens. However, it gives no explicit when-to-use guidance, no exclusions, and no mention of alternatives like anaf_create_token_link or anaf_delete_token.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
anaf_validate_cifARead-onlyIdempotent
Validate that an ANAF token has proper access to e-Factura for a specific CIF. Checks organization ownership, ANAF registry, and e-Factura access permissions. Returns validation result with any error messages.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | The ANAF token ID to validate (integer ID from anaf_tokens) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, openWorld and non-destructive, so the safety profile is covered; the description adds genuine value by disclosing that external ANAF registry and permission lookups are performed and that failures surface as returned error messages rather than exceptions. It does not mention latency, rate limits, or auth prerequisites for those external calls, leaving some behavioral gaps.
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 tight sentences with the core action front-loaded and the checks enumerated immediately after. No filler, though the trailing 'for a specific CIF' clause could be reworded to remove the parameter ambiguity without adding length.
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 one-parameter, read-only validation tool with full schema coverage and annotations, the description supplies what is missing: which external checks run and that error messages come back in the result. Without an output schema, a bit more on the shape of the validation result (boolean flag vs. structured error list) would make it 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%, so the single parameter is fully documented as 'the ANAF token ID to validate' — baseline 3 applies. However the description's 'for a specific CIF' wording could send an agent looking for a CIF parameter that does not exist and does not explain that the CIF is derived from the token, which is a missed opportunity rather than a schema gap.
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?
States a specific verb and resource: validating that an ANAF token has e-Factura access, and names the three checks performed (organization ownership, ANAF registry, e-Factura permissions). It reads distinctly from siblings like anaf_tokens (listing) or anaf_status. The phrase 'for a specific CIF' slightly muddies it since the only input is a token ID, so it is not fully 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?
Usage is only implied — an agent can infer this is a pre-flight check before submitting invoices via e-Factura. There is no explicit 'use this when...' statement, no mention of alternatives such as anaf_status or anaf_tokens, and no note about when this check is unnecessary.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
api_keys_listARead-onlyIdempotent
List all API tokens for the authenticated user within the current organization. Returns both active and revoked tokens sorted by creation date, newest first. The raw token value is never included — only the tokenPrefix for identification.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes beyond the readOnly/idempotent annotations by disclosing content details an agent would otherwise have to guess: revoked tokens are included, ordering is newest-first by creation date, and the raw secret is never returned (only tokenPrefix). Pagination or result limits are not mentioned.
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 sentences, each front-loaded with new information (scope, contents/ordering, secret-safety). Nothing is repeated from the annotations or the schema.
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 no output schema, the description carries the burden of describing the return shape, and it does so well (active + revoked, sorted, tokenPrefix). Only pagination/volume behavior is missing, a minor gap for a list 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?
Zero parameters, so there is no parameter semantics to explain and the baseline of 4 applies; the description correctly implies no filtering inputs are available.
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?
States a specific verb and resource ('List all API tokens') plus scope ('for the authenticated user within the current organization'), which is enough for an agent to distinguish it from api_keys_scopes and the oauth2_clients_* siblings without opening a schema.
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?
Usage is implied by the name and the listing behavior, but there is no explicit 'use this when...' guidance, no mention of alternatives such as api_keys_scopes, and no prerequisites stated (e.g. admin role requirement).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
api_keys_scopesARead-onlyIdempotent
List all permission scopes available to the current user, grouped by category. Only scopes the user already holds are returned — useful for inspecting what permissions a token can be granted.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations already establish that this is a safe, read-only, idempotent, closed-world operation. The description adds meaningful behavior beyond that by noting that only scopes the user already holds are returned and that results are grouped by category.
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 tight sentences with the core resource and filtering behavior front-loaded. There is no redundant or filler text.
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 no parameters, no output schema, and rich annotations, the description is nearly complete: it states what is returned, how it is grouped, and that results are limited to held scopes. The main remaining gap is explicit differentiation from the similarly named OAuth client scopes 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?
The tool takes zero parameters, so there are no parameter semantics to explain. The empty schema and description are consistent, and the baseline for a no-parameter tool 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?
The description gives a specific verb and resource: list permission scopes for the current user, grouped by category. It is clear what the tool returns, but it does not explicitly distinguish itself from the similar sibling oauth2_clients_scopes or api_keys_list.
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 provides a clear usage context: inspecting what permissions a token can be granted. It does not state when to prefer it over sibling tools such as oauth2_clients_scopes, so it falls short of full alternative guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
auth_forgot_passwordA
Request a password reset email. Always returns success to prevent user enumeration — the email is only sent if the account exists. The reset link is valid for 1 hour.
| Name | Required | Description | Default |
|---|---|---|---|
| Yes | Email address associated with the account |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Adds substantial behavior beyond annotations: it always returns success to prevent user enumeration, the email is only sent if the account exists, and the reset link is valid for 1 hour. These are exactly the non-obvious operational traits an agent needs. The annotations (readOnlyHint=false, openWorldHint=true, destructiveHint=false) are consistent with this 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?
Two tight sentences, front-loaded with the action, followed immediately by the critical behavioral caveat about the always-success response and token validity. 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 one-parameter tool with no output schema, the description covers the essential behavior completely: what it does, why the response is always success, when the email is actually sent, and how long the link is valid. Nothing material is missing.
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?
Only one parameter (email) with 100% schema description coverage, so the schema already fully documents it. The description does not add syntax or format details beyond the schema, which is the expected baseline when schema coverage is high.
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?
States a specific verb and resource: request a password reset email. It is distinguishable from the sibling auth_reset_password by implication (requesting the email vs performing the reset), but it does not explicitly name or contrast with that sibling.
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 purpose implies the usage context (a user forgot their password), but there is no explicit when-to-use guidance, no mention of the natural follow-up tool auth_reset_password, and no exclusions or prerequisites.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
auth_loginA
Authenticate with the Storno.ro API using email and password. Returns JWT access and refresh tokens, and stores them in the session config for all subsequent requests. Must be called before any other tool if STORNO_TOKEN is not set.
| Name | Required | Description | Default |
|---|---|---|---|
| Yes | User email address | ||
| password | Yes | User password |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds important behavior beyond the annotations: it returns JWT access and refresh tokens, stores them in session config for subsequent requests, and establishes the authentication prerequisite. Since there is no output schema, this return-value context is especially valuable.
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 focused sentences: purpose first, then return/session behavior, then the precondition. Every sentence contributes actionable information with 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?
For a two-parameter authentication tool with no output schema, the description covers what the tool does, what it returns, the session side effect, and when it must be called. That is sufficient 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?
The schema already fully documents both required parameters, including email format and password purpose. The description repeats email/password at a high level but adds no format, validation, or credential requirements 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 gives a specific verb and resource: authenticate with the Storno.ro API using email and password. It clearly separates this from sibling auth tools by naming the credential type and the initial-token prerequisite, making it distinct from register, refresh, and profile operations.
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 explicitly states when this tool is required: before any other tool if STORNO_TOKEN is not set. It does not name alternatives such as auth_refresh for expired tokens, so it stops short of full when/when-not/alternative routing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
auth_meARead-onlyIdempotent
Get the current authenticated user profile including organization memberships and subscription plan. Returns flat JSON with user, organization, memberships, and subscription.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, destructiveHint=false and openWorldHint=false, so the safety profile is covered. The description adds genuine value beyond them by disclosing the response shape ('flat JSON with user, organization, memberships, and subscription'), which matters since no output schema exists. It stops short of saying what happens when unauthenticated (401/redirect), which would be the one remaining behavioral detail.
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, zero filler, with the identity purpose front-loaded and the return shape immediately after. Every clause carries information an agent would otherwise have to guess.
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 zero-param read tool with full annotation coverage, the description supplies both purpose and return structure, and the absent output schema is compensated for. The only gap is the unauthenticated/error behavior, which is a minor omission 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?
The tool takes zero parameters, so there is nothing to disambiguate; the baseline of 4 applies. The description correctly avoids inventing parameter 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?
States a specific verb and resource — 'Get the current authenticated user profile' — and enumerates the included payload (organization memberships, subscription plan). This is unambiguously distinguishable from auth_update_profile, auth_login, and members_list without opening any schema.
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?
Usage is implied by 'current authenticated user' — an agent can infer this is the identity/who-am-I call — but the description never states when to prefer it over members_list or companies_get, nor any preconditions. Adequate but leaves routing to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
auth_refreshA
Refresh an expired JWT access token using the refresh token. Both tokens are rotated. The new tokens are stored in the session config. Use when the current token has expired.
| Name | Required | Description | Default |
|---|---|---|---|
| refreshToken | No | Refresh token to use. If omitted, uses the token stored in session config (STORNO_REFRESH_TOKEN). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes meaningfully beyond the annotations: it discloses that both tokens are rotated (so the old refresh token becomes unusable and retries with it will fail) and that new tokens land in session config rather than being surfaced. That rotation detail is the single most important non-obvious behavior for this call. It stops short of describing failure modes (expired/revoked refresh token → re-login required).
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?
Four short sentences, front-loaded with the action, then the side effect, then the storage location, then the trigger condition. No filler and no repetition of the tool name.
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 one-parameter auth tool with annotations covering the safety profile, this is nearly complete: action, rotation side effect, and storage destination are all covered. The only real gap is whether the new tokens are also returned in the response, which matters for an agent that needs to use them without relying on session state.
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 already explains that an omitted refreshToken falls back to STORNO_REFRESH_TOKEN. The description only says 'using the refresh token' and adds no format, precedence, or override semantics beyond what the schema states. Baseline 3 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?
States a specific verb (refresh) and resource (expired JWT access token), plus the mechanism (refresh token). It is clearly distinct from auth_login and auth_me, though it never names those siblings explicitly, so the differentiation is implicit rather than stated.
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?
"Use when the current token has expired" gives a clear triggering condition, which is the main decision an agent faces here. It does not state the inverse case (e.g., when no refresh token exists, fall back to auth_login), so the alternative path is left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
auth_registerA
Create a new Storno.ro user account. A default organization is automatically created. Returns JWT tokens on success.
| Name | Required | Description | Default |
|---|---|---|---|
| Yes | Email address for the new account (must be unique) | ||
| lastName | No | User's last name | |
| password | Yes | Password (minimum 8 characters) | |
| firstName | No | User's first name |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare the mutation profile (readOnly=false, idempotent=false, destructive=false). The description adds genuine value beyond that: a default organization is created as a side effect and JWT tokens are returned on success — both important for an agent to know after a write. It does not say what happens on duplicate email or auth failures, leaving a small gap.
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 sentences with zero filler, and the core action is front-loaded. The side-effect and return-value notes each earn their place.
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 no output schema, the description usefully states that JWT tokens come back and that an organization is provisioned, which is exactly the post-call context an agent needs. Error behavior (duplicate email, weak password) is left unstated, keeping it from a 5.
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 schema already documents email uniqueness, password minLength 8, and the optional name fields. The description adds no parameter-level detail beyond that, making the baseline 3 correct.
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 opens with a specific verb+resource ('Create a new Storno.ro user account'), which clearly separates it from auth_login/auth_refresh/auth_me siblings. It stops short of naming which alternative an agent should choose when it already has credentials, so it is clear but not fully differentiated.
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?
Usage is only implied by the verb 'create' – an agent can infer this is for new accounts rather than existing ones. It never states when to use auth_register vs auth_login or what to do if the user already exists, and there are no prerequisites or exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
auth_reset_passwordAIdempotent
Reset a user password using the token received via email from auth_forgot_password. The token is single-use and expires after 1 hour. All existing sessions are revoked on success.
| Name | Required | Description | Default |
|---|---|---|---|
| token | Yes | Password reset token received via email link (from URL query parameter) | |
| password | Yes | New password (minimum 8 characters) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes beyond annotations by disclosing token lifetime (1 hour), single-use semantics, and the side effect of revoking all existing sessions on success — genuinely useful mutation context. Minor tension with idempotentHint=true since a second call with the same single-use token will fail, but the underlying end state is stable, so this is not a true 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?
Three short sentences, no redundancy, with the source of the token front-loaded and the consequences (expiry, session revocation) following. Every sentence carries a distinct piece of 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?
With no output schema, the description adequately explains the flow and side effects. It omits failure behavior (expired or already-used token) and whether authentication is required to call it, which would be useful for a credential-mutating endpoint.
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 both 'token' and 'password' (with the 8-character minimum) are already documented. The description adds only the token's provenance, which is largely covered by the schema text; baseline 3 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?
States a specific verb and resource ('Reset a user password') and explicitly ties the token origin to the sibling tool auth_forgot_password. An agent can distinguish it from auth_update_profile without opening either schema.
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?
Makes the precondition clear: the tool requires a token obtained from auth_forgot_password via email. It does not explicitly exclude the other password-change sibling (auth_update_profile for logged-in users), so the when-not is only inferred.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
auth_update_profileB
Update the authenticated user's profile. Can update name, phone, timezone, quiet-hours preference, preferences, or change password (requires currentPassword when changing password).
| Name | Required | Description | Default |
|---|---|---|---|
| phone | No | Phone number (E.164 format recommended, e.g., +40721234567) | |
| lastName | No | User's last name | |
| password | No | New password (requires currentPassword to also be provided) | |
| timezone | No | Timezone in IANA format (e.g., Europe/Bucharest) | |
| firstName | No | User's first name | |
| preferences | No | User preferences object (language, theme, notifications, etc.) | |
| currentPassword | No | Current password (required when changing password) | |
| respectQuietHours | No | Mute push notifications between 22:00 and 08:00 local time (defaults to true) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false, idempotentHint=false, destructiveHint=false, so the safety profile is covered externally. The description adds only the conditional requirement that currentPassword be supplied with password, which is already in the schema; it says nothing about whether omitted fields are preserved (partial update semantics), whether a password change invalidates sessions, or what permissions/auth state are required.
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 action and object, followed by the updatable surface and the one conditional rule. Tight and readable, though the field enumeration duplicates schema content rather than adding new 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 an 8-parameter mutation with a nested object and no output schema, the description covers what can be changed but not the important semantics: whether this is a partial or full replace, what happens to unlisted fields, or what is returned. Adequate as a pointer, incomplete as a contract.
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 every one of the 8 parameters is already documented, including the currentPassword/password pairing and the quiet-hours default. The description's field list largely restates the schema, and it says nothing about the nested preferences object's expected keys or merge behavior. Baseline 3 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?
States a specific verb and resource: updating the authenticated user's own profile, and enumerates which fields can change. It implicitly disambiguates from members_update (other users) and notification_preferences_update, but never names those siblings explicitly, so an agent must infer the boundary.
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 phrase 'authenticated user's profile' implies it should be used for self-service edits rather than admin edits of other members. There is no explicit when-to-use/when-not guidance and no mention of the alternative tools, leaving the choice to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
backup_createA
Create a new backup job for the active company. The backup is processed asynchronously and includes all company data (invoices, clients, products, settings). Optionally include uploaded files (PDFs, XMLs). Returns a job ID to check status.
| Name | Required | Description | Default |
|---|---|---|---|
| companyId | No | Company UUID override (uses active company if not set) | |
| includeFiles | No | Include uploaded files (PDFs, XMLs) in backup (default: true) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare this as a non-read-only, non-destructive, non-idempotent write, so the bar is lower, yet the description still adds real value: asynchronous processing, the full data scope (invoices, clients, products, settings), and the job-ID return contract. It omits what happens to previous backups or any retention/overwrite behavior, which for a non-idempotent create would be the remaining useful detail.
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 sentences, front-loaded with the action, then scope, then return contract. Nothing is repeated and nothing extraneous is included.
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 no output schema, the description correctly states what is returned (a job ID) and that processing is async, which is the key agent-facing fact. Minor gaps remain around retention, permissions, and interaction with existing backups, but nothing blocks a correct call.
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 both parameters are already documented; the description adds only the framing that files are optional, and its word "Optionally" is slightly at odds with the schema's default of true. It also describes the target as "the active company" without acknowledging the companyId override.
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 opens with a specific verb and resource ("Create a new backup job") and scopes it to the active company, with a parenthetical listing exactly what data is captured. It doesn't explicitly name the sibling tools (backup_status, backup_restore, backup_history), but the create semantics are unambiguous against 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 line "Returns a job ID to check status" implies that backup_status is the follow-up tool, but the description never states when to create a backup versus when to use a restore or history tool, nor any prerequisites. Usage is inferable rather than stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
backup_downloadARead-onlyIdempotent
Download a completed backup as a ZIP file. Returns base64-encoded binary data. The backup must be in "completed" status.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Backup job ID | |
| companyId | No | Company UUID override (uses active company if not set) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint/idempotentHint/destructiveHint=false, so safety is covered; the description adds genuinely new context: the payload is base64-encoded binary data and the call fails unless the backup is completed. It does not mention size limits, expiry of the download link, or error behavior for non-completed backups, which would be the remaining useful detail.
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 sentences with the action, the return format, and the precondition in that order. No filler, no restating of the tool name.
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 no output schema, the description correctly takes on the return-value burden by stating the response is base64-encoded ZIP data, and it covers the blocking precondition. Minor gaps remain around how to poll for completed status and any size/encoding caveats, but an agent can call this correctly from what's given.
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 both 'id' and 'companyId' are already documented in the schema. The description adds nothing about parameter semantics — notably it doesn't clarify whether 'id' is a backup job ID vs. an organization ID, or when to override companyId — so baseline 3 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?
States a specific verb+resource ('Download a completed backup') and the artifact produced (ZIP file), which separates it cleanly from backup_create/backup_restore/backup_history in the sibling set. It stops short of naming backup_status as the companion call, so the differentiation is implied rather than explicit.
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?
Gives an explicit precondition — the backup must be in "completed" status — which is the key gating condition for calling this tool. It does not name the alternative tools (backup_status to poll, backup_history to locate a backup), leaving the routing to the agent's inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
backup_historyARead-onlyIdempotent
List recent backup jobs for the active company. Returns job ID, status, creation date, file size, and whether files were included.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Number of results (max 50, default: 20) | |
| companyId | No | Company UUID override (uses active company if not set) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations already declare readOnlyHint, idempotentHint, and destructiveHint=false, so the description does not need to repeat the safety profile. It adds real value with the 'active company' scoping and an explicit list of returned fields: job ID, status, creation date, file size, and whether files were included.
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?
It is two sentences with zero waste. The core action and scope come first, and the return fields follow immediately.
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 list tool with full schema coverage and strong annotations, this is nearly complete. It covers scope and return shape. The only minor gap is that ordering or recency semantics for 'recent' and the relationship to backup_status are left implicit.
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 both parameters, namely limit and companyId, are fully documented in the schema. The description reinforces the active-company default, but it adds no detail about limit behavior or result ordering 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 states a specific verb and resource: it lists recent backup jobs for the active company. That is clearly distinguishable from backup_create, backup_restore, and backup_download, but it never explicitly says how it differs from the sibling backup_status, so it stops short of full sibling differentiation.
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 word 'List' and the phrase 'recent backup jobs' imply that this is the history-listing call, but the description never states when to choose this tool over backup_status or backup_download. The usage is inferable, not stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
backup_restoreADestructive
Upload a backup ZIP file to restore company data. The restore runs asynchronously. Use backup_restore_status to check progress. WARNING: if purgeExisting is true, all current company data will be deleted before restoring.
| Name | Required | Description | Default |
|---|---|---|---|
| filePath | Yes | Absolute path to the backup ZIP file to restore | |
| companyId | No | Company UUID override (uses active company if not set) | |
| purgeExisting | No | Delete all existing company data before restoring (default: false) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true and readOnlyHint=false, but the description adds real value beyond them: async execution, the follow-up status tool, and the precise condition (purgeExisting=true) under which all company data is deleted. It stops short of stating whether the restore is reversible or which permissions are required.
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?
Four short sentences, no filler, each carrying distinct information (action, async behavior, follow-up tool, destructive caveat). Placing the destructive warning last rather than first slightly weakens front-loading of the most critical fact.
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 no output schema, the description should explain what the call returns so the agent can poll backup_restore_status (e.g., a job or backup identifier). It names the status tool but not how to use its result, leaving a meaningful gap for an async operation.
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 filePath, companyId, and purgeExisting are already documented. The description's warning about purgeExisting largely restates the schema's own 'Delete all existing company data before restoring' text, so it adds little new parameter meaning.
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?
Names a specific verb+resource pair ('restore company data' from an uploaded backup ZIP), which is unambiguous against sibling tools like backup_create and backup_download. It does not explicitly contrast with those siblings, but the destructive restore semantics make the distinction obvious.
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?
Gives clear operating context: the restore is asynchronous and progress should be polled via backup_restore_status, which is the correct alternative tool for status. It lacks explicit exclusions (e.g., when to use backup_create instead, or prerequisites like a completed upload).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
backup_restore_statusARead-onlyIdempotent
Get the status of a restore job. Returns progress percentage and current step. Same as backup_status but specifically for restore jobs.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Restore job ID | |
| companyId | No | Company UUID override (uses active company if not set) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint and non-destructive, so the safety profile is covered. The description adds value beyond them by disclosing what is returned (progress percentage and current step) — important since no output schema exists. It stops short of describing terminal states or failure reporting.
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 sentences, front-loaded with the action and followed by return content and sibling differentiation. Every sentence carries information; nothing is redundant.
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 two-parameter read-only poll it covers action, return shape and sibling routing, and annotations carry the safety semantics. The one gap is how completion or failure is signaled, which matters given there is no output 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?
Schema description coverage is 100%, with both `id` (restore job ID) and `companyId` (active-company override) documented in the schema. The description adds no parameter-level detail, so the baseline 3 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?
States a specific verb and resource (get status of a restore job) and explicitly contrasts itself with the sibling backup_status, which is the closest confusion risk. It does not mention the backup_restore sibling that produces the job IDs, so routing is slightly less complete than it could be.
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?
"Same as backup_status but specifically for restore jobs" gives an explicit alternative and the condition that selects between them. It does not say when to poll versus wait, or whether the job is asynchronous, but the core use-vs-alternative guidance is present.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
backup_statusARead-onlyIdempotent
Get the status of a backup job. Returns progress percentage, current step, and download URL when complete. Statuses: pending, processing, completed, failed.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Backup job ID | |
| companyId | No | Company UUID override (uses active company if not set) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, non-destructive, closed-world, so the safety profile is covered. The description still adds genuine value by disclosing the return payload (progress percentage, current step, download URL) and the full status lifecycle (pending, processing, completed, failed) — information the annotations cannot convey and that is essential for a polling 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?
Three short sentences, zero filler, front-loaded with the core action and immediately followed by the return shape and status values. Nothing redundant with the name or title.
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?
There is no output schema, so the description carries the return-value burden and does it well by naming the fields and enumerating statuses. It stops short of the one operational detail a polling tool needs — whether to re-invoke until 'completed' and whether backup_download should follow — but overall it is sufficient to call 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 description coverage is 100%, so both the backup job ID and the companyId override are documented in the schema. The description says nothing about either parameter and offers no syntax or format guidance; with full schema coverage the 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?
States a specific verb and resource ('Get the status of a backup job'), which is materially clearer than the bare name. However, it never distinguishes itself from the sibling status/read tools in this family (backup_history, backup_restore_status, backup_download), so an agent must infer which one to call for a given job type.
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?
Usage is implied by the required job ID and by 'download URL when complete', which hints the agent should poll until completion and then fetch the artifact. There is no explicit when-to-use, when-not-to-use, or pointer to backup_restore_status/backup_history as alternatives, which matters given four similarly named backup tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
balance_analysisARead-onlyIdempotent
Get balance analysis (Analiza Balante) for a year. Returns the standard indicator bag (revenue, expenses, profit, turnover, salaries, etc.), monthly evolution, top expenses, year-over-year comparison, plus 8 grouped financial-ratio sections: balanceSheet (raw figures), liquidity (current/quick/cash ratio + working capital + NFR + net cash), solvency (debt-to-equity, financial autonomy, debt ratio, general solvency, interest coverage), profitabilityRatios (gross/operating/EBITDA/net margins, ROA/ROE/ROCE, EBIT, EBITDA), efficiency (asset/fixed-asset/inventory turnover, DSO/DPO/CCC), fiscal (VAT payable, salary debts, state-budget debts, micro-enterprise EUR threshold, VAT RON threshold), cashflow (cash runway in months, burn rate, break-even, contribution rate, operating leverage), aging (receivables aging buckets 0-30/31-60/61-90/90+ with IFRS 9 simplified provision), concentration (top 5/10 client revenue share, top clients list), profitTaxEstimate (information only, from invoices alone: per quarter and year to date, revenue from issued invoices and expenses from received invoices in RON — invoice rate, else BNR monthly average — gross profit, 16% profit tax and the 1%/3% micro tax for comparison; salaries, payment fees and non-invoiced costs are missing, so the real tax is lower; with tips[] — sponsorship headroom, reinvested-profit lever for the running quarter, missing-expenses warning, dividends after taxes, employee benefits, R&D, advance payments). Each ratio carries status: normal|warning|critical|na. Trial-balance sections show hasData=false until balances are uploaded; aging, concentration and profitTaxEstimate come from invoice data. Requires X-Company header.
| Name | Required | Description | Default |
|---|---|---|---|
| year | Yes | Analysis year (e.g. 2025) | |
| companyId | No | Company UUID (overrides STORNO_COMPANY_ID env var) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, non-destructive, and closed-world behavior. The description adds valuable context beyond that: it explains data availability (trial-balance sections show hasData=false until balances are uploaded; aging, concentration, and profitTaxEstimate come from invoice data) and discloses limitations of profitTaxEstimate (information only, from invoices alone, real tax lower), plus the X-Company header requirement.
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 main purpose is front-loaded in the first sentence. However, the description is a single dense run-on sentence with semicolons that could be better structured into sections for readability. While the extensive enumeration is justified by the lack of an output schema, the delivery is not optimally 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?
Given the tool's complexity (many computed financial ratios) and the absence of an output schema, the description is remarkably complete. It covers all major output sections, caveats about data sources, the X-Company header requirement, and limitations of profitTaxEstimate. An agent has enough information to call the tool 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 description coverage is 100%, so the schemas already document both parameters (year and companyId) with descriptions. The tool description adds no additional meaning about parameter formats, constraints, or behavior beyond what the schema provides, so the baseline of 3 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?
States a specific verb (Get) and resource (balance analysis), and enumerates the returned indicators in detail. The purpose is unmistakable, but it does not explicitly contrast with sibling tools like balance_list or balance_rows, so it lacks sibling differentiation.
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 by stating it returns analysis for a year, but it offers no explicit when-to-use guidance, no when-not-to-use conditions, and no named alternatives. The prerequisite of X-Company header is noted but is not usage guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
balance_deleteADestructiveIdempotent
Delete an uploaded trial balance by ID. This soft-deletes the balance and its parsed account rows.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Trial balance UUID to delete | |
| companyId | No | Company UUID (overrides STORNO_COMPANY_ID env var) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true, idempotentHint=true and readOnlyHint=false, so the safety profile is covered. The description still adds real value beyond them by disclosing that this is a SOFT delete and that the parsed account rows are deleted alongside the balance — cascade and recoverability context an agent cannot get from 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 short sentences, zero filler, with the core action front-loaded and the cascade consequence immediately after it.
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 two-parameter delete with no output schema and fully-covered annotations, the description supplies everything an agent needs: what is removed, that the removal is soft, and that dependent rows go with it. Nothing material is left unstated.
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 both the id and companyId semantics (including the env-var override) are already documented in the schema. The description only echoes "by ID" and adds no format, scope or edge-case detail beyond that 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?
States a specific verb and resource ("Delete an uploaded trial balance by ID") and scopes it to uploaded balances, which separates it from balance_list, balance_rows, balance_reprocess and balance_analysis by name alone. It does not explicitly contrast itself with any sibling, so it stops short of a 5.
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?
There is no when-to-use / when-not-to-use guidance and no alternative named (e.g., reprocess vs. delete-and-reupload). The phrase "uploaded trial balance" only weakly implies the precondition that the balance must already exist from an upload.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
balance_listBRead-onlyIdempotent
List uploaded trial balances (Balante de verificare) for a year. Shows upload status (pending/processing/completed/failed), month, account count, and source software for each uploaded balance.
| Name | Required | Description | Default |
|---|---|---|---|
| year | Yes | Year to list balances for (e.g. 2025) | |
| companyId | No | Company UUID (overrides STORNO_COMPANY_ID env var) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true and destructiveHint=false, so safety is covered. The description adds some context by enumerating the status values (pending/processing/completed/failed) and returned fields, but says nothing about ordering, pagination, or how pending/processing uploads behave when listed.
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, both front-loaded with the essential fact (what is listed, what each entry shows). No filler and no repetition of schema content.
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 no output schema, the description usefully compensates by naming the fields returned. It is nearly complete for a read-only list tool; only ordering/pagination behavior and the relationship to balance_rows are left unstated.
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 only two parameters, so the baseline is 3. The description's phrase 'for a year' corroborates the required year parameter but adds no format or range detail, and it is silent on companyId (which the schema already documents as an env-var override).
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?
States a specific verb and resource ('List uploaded trial balances') scoped to a year, and even names the returned fields. It does not, however, distinguish itself from close siblings like balance_rows or balance_analysis, so the agent must infer the boundary.
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?
There is no explicit when-to-use statement, no prerequisites, and no routing to alternatives such as balance_rows (rows of a balance) or balance_analysis. The agent must guess that this is the enumeration/entry point versus the detail tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
balance_reprocessAIdempotent
Reprocess a trial balance PDF. Re-parses the PDF file and updates the account rows. Useful after parser improvements.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Trial balance UUID to reprocess | |
| companyId | No | Company UUID (overrides STORNO_COMPANY_ID env var) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare idempotentHint=true and destructiveHint=false, so the safety profile is covered. The description adds real value beyond that by disclosing the actual side effect — the PDF is re-parsed and existing account rows are updated — which is more than the annotations say. It stops short of saying whether manually adjusted rows are overwritten, which is the main residual risk for a mutation.
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 sentences, zero waste, with the operation stated first and the rationale last. Every sentence carries distinct information: action, mechanics, trigger.
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 2-parameter mutation with full schema coverage and no output schema, this covers what the tool does and why you'd run it. The one meaningful omission is what happens to previously edited or manually corrected account rows on reprocess, which the agent would want before invoking.
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 both parameters (id, companyId) are already documented in the schema, including the env-var override behavior. The description contributes nothing about parameter meaning; baseline 3 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?
Specific verb+resource: 'Reprocess a trial balance PDF', followed by the concrete mechanics ('re-parses the PDF file and updates the account rows'). An agent can distinguish this from balance_rows/balance_list (reads) and balance_delete without opening a schema, though it never names those siblings explicitly.
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?
'Useful after parser improvements' gives a clear triggering condition for when to reach for this instead of a plain read. It does not state when NOT to use it (e.g. after manual row edits, or if the PDF is unavailable) or name an alternative tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
balance_rowsARead-onlyIdempotent
Get the parsed account rows for a trial balance. Returns all account codes, names, and 10 numeric columns (initial/previous/current/total/final debit & credit). Useful for verifying PDF parsing results.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Trial balance UUID | |
| companyId | No | Company UUID (overrides STORNO_COMPANY_ID env var) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint/idempotent/non-destructive, so the safety profile is covered. The description adds real value beyond that by describing the payload shape (all account codes, names, and 10 debit/credit numeric columns), which is the only return-value documentation since no output schema exists. It omits any mention of row count limits or pagination.
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 followed by the return contents, with zero filler. Every sentence earns its place.
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, closed-world lookup with fully documented parameters, the description is nearly complete: it covers action, output contents, and a verification use case. The remaining gap is its relationship to the other balance_* tools and any row-volume caveats.
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 id and companyId fully documented in the schema including the env-var override behavior. The description adds nothing about either parameter, so the baseline of 3 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?
States a specific verb and resource: retrieves the parsed account rows of a trial balance, and even enumerates the returned fields. It does not, however, differentiate itself from nearby siblings like balance_list or balance_analysis, leaving the agent to infer that this is the raw-row view rather than the aggregate.
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?
"Useful for verifying PDF parsing results" implies a verification use case, but there is no explicit when-to-use vs. balance_analysis and no statement that the required id must first be obtained via balance_list. Usage is implied rather than stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
bank_accounts_createA
Add a new bank account to the active company. For type=bank, IBAN is required and must be unique within the company. For type=cash (the till that backs POS / cash-register reports), IBAN is optional and openingBalance/openingBalanceDate enable cash-register tracking. A company can have at most one cash account. If isDefault is true, any existing default account for that currency is demoted.
| Name | Required | Description | Default |
|---|---|---|---|
| iban | No | International Bank Account Number in valid IBAN format (e.g., "RO49AAAA1B31007593840000"). Required for type=bank, optional for type=cash. | |
| type | No | Account type. "bank" (default) for IBAN-backed accounts; "cash" for the physical till that backs POS / cash-register reports. | |
| bankName | No | Name of the bank (e.g., "BCR", "Banca Transilvania", "ING Bank") | |
| currency | No | Currency code ISO 4217 (default: "RON"). Use "EUR" for Euro accounts. | |
| companyId | No | Company UUID override (uses active company if not set) | |
| isDefault | No | Set as default account for this currency (default: false) | |
| openingBalance | No | Initial cash-on-hand. Required to enable cash-register reporting on cash accounts. Once set, locks and can only be modified via forward-going cash movements. Must be >= 0. | |
| openingBalanceDate | No | Date the opening balance was taken (YYYY-MM-DD). Required when openingBalance is supplied. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only flag non-readOnly, non-idempotent, non-destructive. The description adds the non-obvious side effects an agent needs: per-company IBAN uniqueness, a hard limit of one cash account per company, openingBalance locking after set, and demotion of an existing default account for the same currency when isDefault is true.
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?
Four tight sentences, front-loaded with the action, then the type-specific constraints, then the singleton cash rule, then the default-demotion side effect. No sentence is redundant with the schema or annotations.
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 an 8-param mutation with no output schema, the description covers the business invariants well, but it never says what the call returns (e.g., created account id) or whether any permission/role is required. Those are modest gaps rather than blockers.
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, but the description adds conditional meaning the schema states only per-field: IBAN required only for type=bank, and the default-demotion consequence of isDefault, which the schema's "Set as default account for this currency" does not convey. It leaves companyId override behavior and currency interaction to 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?
Opening sentence gives a precise verb+resource+scope: "Add a new bank account to the active company." The create semantics and the two account variants (bank vs cash) are unambiguous, so an agent can distinguish it from bank_accounts_update/list/delete without opening the schema.
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 clearly conditions usage on type: IBAN required for bank, optional for cash, and cash accounts exist to back POS/cash-register reports. It stops short of naming alternatives (e.g., bank_accounts_update for modifying an existing account) or stating exclusions, but the when-to-use context is explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
bank_accounts_deleteADestructiveIdempotent
Permanently delete a bank account. Cannot delete the last bank account for a company or the default account (set another as default first). Existing invoices that referenced this account retain the IBAN in their stored data.
| Name | Required | Description | Default |
|---|---|---|---|
| uuid | Yes | Bank account UUID to delete | |
| companyId | No | Company UUID override (uses active company if not set) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true and idempotentHint=true; the description adds real value beyond them by naming the two refusal conditions (last account, default account) and the side effect on invoices (IBAN retained in stored data). It does not say what error/sentinel is returned when deletion is blocked, nor whether any restore path exists.
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 sentences, front-loaded with the action and its permanence, then the blocking rules, then the data-retention consequence. Nothing is repeated from the schema and no sentence is 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?
With no output schema, the description covers the essentials an agent needs before mutating: irreversibility, two blocking conditions, and downstream effects on invoices. It stops short of documenting failure/error behavior and whether the deleted account can be recreated identically.
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% for both parameters, so the uuid and companyId semantics are already carried by the schema. The description only gestures at company scoping ('for a company') and adds no format, identifier, or override detail beyond the structured fields.
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?
States a specific verb and resource ('Permanently delete a bank account') with the destructive permanence made explicit, which instantly separates it from bank_accounts_update/create/list. The added constraints and downstream data note further pin down its scope.
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?
Gives clear preconditions and implicitly the alternative path: if the account is the default, 'set another as default first' (i.e., use bank_accounts_update). Missing an explicit statement of when to prefer a sibling such as listing accounts to verify, but the blocking conditions effectively define when-not-to-call.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
bank_accounts_listARead-onlyIdempotent
List all bank accounts configured for the active company. Returns IBAN, bank name, currency, and which account is the default per currency. Bank accounts appear on invoices as payment instructions.
| Name | Required | Description | Default |
|---|---|---|---|
| companyId | No | Company UUID override (uses active company if not set) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, non-destructive, and closed-world. The description adds useful context beyond that: it specifies returned fields (IBAN, bank name, currency, default per currency) and business meaning ('appear on invoices as payment instructions'), which helps the agent understand the data's role.
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 sentences, front-loaded with the action and scope, followed by return fields and business context. No filler 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?
For a simple read-only list with one optional parameter, no output schema, and rich annotations, the description is complete: it clarifies scope, returned fields, and domain relevance. Nothing essential is missing.
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 single parameter has 100% schema description coverage ('Company UUID override (uses active company if not set)'), so the schema carries the detail. The description's phrase 'active company' reinforces the default but adds no new syntax or format information.
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?
States a specific verb and resource ('List all bank accounts') with clear scope: configured for the active company. An agent can immediately distinguish it from bank_accounts_create, update, and delete without needing the schema.
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?
Usage is implied by 'List all bank accounts configured for the active company', but the description does not explicitly say when to use this versus bank_accounts_create/update/delete or mention any exclusions. Adequate but not directive.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
bank_accounts_updateAIdempotent
Update an existing bank account. Can update type, IBAN, bank name, currency, default status, or initial opening balance. Once openingBalance has been persisted with a value > 0 it locks — further changes are rejected and corrections must be made via cash movements. At least one field must be provided.
| Name | Required | Description | Default |
|---|---|---|---|
| iban | No | New IBAN (must be valid and unique within company). Pass null to clear (only valid for cash accounts). | |
| type | No | Account type. Switching after creation is allowed but should be avoided once movements exist. | |
| uuid | Yes | Bank account UUID to update | |
| bankName | No | Bank name (pass null to clear) | |
| currency | No | Currency code ISO 4217 | |
| companyId | No | Company UUID override (uses active company if not set) | |
| isDefault | No | Set as default account for this currency | |
| openingBalance | No | Initial cash-on-hand. Locks once set; correct via cash movements thereafter. | |
| openingBalanceDate | No | Date the opening balance was taken (YYYY-MM-DD). Required when openingBalance is being set for the first time. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare non-read-only, idempotent, non-destructive, so the safety bar is lower. The description still adds genuine behavioral value: the one-way lock on openingBalance once persisted >0 and the redirect of corrections to cash movements — a non-obvious irreversible-effect warning not captured by 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 tight sentences: purpose first, then the lock constraint, then the minimum-input rule. Every sentence carries decision-relevant information with no padding.
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 9-parameter mutation tool with full schema coverage and no output schema, the description covers preconditions and the irreversible lock. It could note the return shape or confirm idempotent re-application semantics, but nothing critical to correct invocation is missing.
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 schema already documents every parameter including the null-clearing semantics and the openingBalanceDate requirement. The description's field list largely restates the schema and adds little format/validation detail beyond it, so baseline 3 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?
States a specific verb+resource ('Update an existing bank account') and enumerates the mutable fields (type, IBAN, bank name, currency, default status, opening balance), which lets an agent distinguish it from bank_accounts_create or cash_register_movements_update. It stops short of naming those siblings explicitly, so no explicit differentiation is given.
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?
'At least one field must be provided' gives a clear invocation precondition, and the statement that corrections must go through cash movements after openingBalance is locked effectively routes the agent to an alternative tool. It does not explicitly cover when to prefer create vs update or company-scoping choice, but the operational context is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
borderou_providersARead-onlyIdempotent
List available borderou (bank statement) providers. Returns supported banks and file formats for bank statement import and reconciliation.
| Name | Required | Description | Default |
|---|---|---|---|
| companyId | No | Company UUID override (uses active company if not set) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint and destructiveHint=false, so the safety profile is covered. The description adds that the payload contains supported banks and file formats, which is genuinely useful return context given there is no output schema, but it says nothing about whether the catalog is global or company-scoped despite the companyId parameter.
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, front-loaded with the action and resource, with zero filler. The parenthetical gloss on 'borderou' earns its place by disambiguating a domain term.
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 trivial read-only catalog lookup with one optional parameter and no output schema, the description is nearly sufficient — only the company-scoping behavior of the result is unstated. Annotations carry the rest.
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 single optional companyId is documented in the schema, so the baseline of 3 applies. The description does not mention companyId at all, adding no 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?
Uses a specific verb (List) plus resource (borderou/bank statement providers) and even decodes the domain term 'borderou' for readers. It distinguishes itself from the mutation siblings (borderou_upload, borderou_transactions_save) by being purely a catalog listing, though it never names those siblings explicitly.
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 phrase 'for bank statement import and reconciliation' implies this is a discovery step before uploading or matching statements, but there is no explicit when-to-use statement, no prerequisites, and no named alternative among the many borderou_* siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
borderou_transaction_available_invoicesARead-onlyIdempotent
Get invoices or proforma invoices available to match against a borderou transaction. Search by number, client name, or amount.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Transaction ID | |
| type | No | Filter by document type (default: both) | |
| search | No | Search by invoice number, client name, or amount | |
| companyId | No | Company UUID override (uses active company if not set) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the safety profile is covered. The description adds that this is a filtered candidate-lookup, but says nothing about return size, pagination, or result caps that would matter for a search endpoint.
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, with the searchable fields given second. 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 read-only lookup with fully documented schema and safety annotations, the description is sufficient to call it correctly. Missing only result-size/pagination expectations, which is a minor gap given the simple read-only nature.
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 all four parameters are already documented, including the type enum and companyId override. The description's 'search by number, client name, or amount' merely restates the search param description, adding no new semantics; baseline 3 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?
States a specific verb (Get) and resource (invoices or proforma invoices available to match against a borderou transaction). The matching context distinguishes it from generic siblings like invoices_list and proforma_invoices_list, though it does not name those siblings directly.
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 phrase 'available to match against a borderou transaction' implies the usage context (finding candidates during a borderou reconciliation), but there is no explicit when-to-use/when-not guidance and no named alternative such as invoices_list for general listing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
borderou_transaction_getARead-onlyIdempotent
Get detailed information about a specific borderou transaction including matched invoice/proforma details.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Transaction ID | |
| companyId | No | Company UUID override (uses active company if not set) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare this as a safe, idempotent, read-only, closed-world operation, so the description needn't cover safety. It does add useful response context by mentioning matched invoice/proforma details, but says nothing about error behavior, missing records, or company scoping effects.
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?
A single front-loaded sentence with no filler. It is appropriately terse for a simple getter, though it could spend one more clause on the companyId override or return shape without becoming bloated.
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 with full schema coverage and annotations covering safety, the description is nearly complete. The one gap is not explaining how the companyId override affects resolution, but that is minor given the schema documents it.
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 both the required id and optional companyId override are documented in the schema. The description adds no syntax or semantic detail beyond that, so the baseline 3 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?
States a specific verb (Get) and resource (a specific borderou transaction), and adds that it returns matched invoice/proforma details. The word 'specific' implicitly contrasts with the list-style sibling borderou_transactions, though no sibling is named explicitly.
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?
Usage is only implied: an agent can infer this is for fetching one transaction by ID versus the list tool. There is no explicit when-to-use/when-not-to-use guidance or named alternative.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
borderou_transactionsBRead-onlyIdempotent
List borderou transactions with pagination. Returns imported bank statement transactions with matching status, amounts, and linked invoice/proforma references.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | Page number (default: 1) | |
| limit | No | Items per page (default: 20) | |
| companyId | No | Company UUID override (uses active company if not set) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, non-destructive and closed-world, so the safety profile is covered. The description adds what the records represent (imported bank statement transactions with matching status, amounts, and linked invoice/proforma references), which is genuine value beyond annotations, but it says nothing about ordering, page-size limits, or total counts.
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 compact sentences, front-loaded with the operation and followed by what the records contain. Nothing is redundant, though the second sentence could be tightened into the first.
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 no output schema, the description responsibly covers the returned record shape (status, amounts, linked invoice/proforma references). Combined with full schema parameter docs and read-only annotations, an agent has enough to call it correctly; only ordering/result-size behavior is left unstated.
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% for all three parameters (page, limit, companyId), so the schema carries the semantics. 'With pagination' in the description only loosely corroborates page/limit and adds no format or constraint detail 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?
States a specific verb+resource ('List borderou transactions') and clarifies these are imported bank statement transactions, which distinguishes it from the singular borderou_transaction_get. It does not explicitly name a sibling, but the resource noun and 'List ... with pagination' make the collection-vs-single split reasonably obvious.
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 statement of when to use this versus borderou_transaction_get, borderou_transaction_update, or borderou_transactions_rematch. The only usage-adjacent hint is 'with pagination', which implies a paged listing but says nothing about prerequisites or alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
borderou_transactions_rematchAIdempotent
Re-run the automatic matching algorithm on selected borderou transactions. Useful after adding new invoices or updating client data.
| Name | Required | Description | Default |
|---|---|---|---|
| companyId | No | Company UUID override (uses active company if not set) | |
| transactionIds | Yes | Array of transaction IDs to re-match |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare non-destructive, idempotent, closed-world behavior, so the description needn't repeat safety. It adds that the tool recomputes matches, but does not explain what happens to existing/manual matches or what is returned, leaving key side-effect detail unspecified.
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, front-loaded with the action and followed by one useful trigger condition. No repetitive or irrelevant text.
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 2-parameter mutation, the description covers purpose and a usage scenario, while annotations and schema cover safety and parameters. It omits return/response behavior, which is not covered by an output schema, so it is nearly complete but not fully.
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 companyId and transactionIds documented in the schema. The description only implies selecting transactions via 'selected borderou transactions' and adds no format or constraint detail beyond the schema, so baseline 3.
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?
States a specific verb ('Re-run') and resource ('automatic matching algorithm on selected borderou transactions'), clearly separating it from sibling update/save/list tools. It does not explicitly name a sibling alternative, so it is clear but not fully differentiated.
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?
Provides a concrete usage context: after adding new invoices or updating client data. It does not state exclusions or name alternatives, so it is clear context without full routing guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
borderou_transactions_saveA
Save and persist selected borderou transaction matches. Creates payment records for matched transactions and updates invoice payment status.
| Name | Required | Description | Default |
|---|---|---|---|
| companyId | No | Company UUID override (uses active company if not set) | |
| transactionIds | Yes | Array of transaction IDs to save |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare a non-readonly, non-destructive, non-idempotent write. The description adds real value beyond that by disclosing the side effects — payment records are created and invoice payment status is mutated — but says nothing about repeat-call behavior (relevant given idempotentHint=false) or permission 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 short sentences, front-loaded with the action and immediately followed by the effects. 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?
There is no output schema, so the description should indicate what a successful save returns (payment IDs? count?), and for a non-idempotent write it should warn about duplicate saves. The disclosed side effects partially compensate but leave meaningful 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 description coverage is 100%, so both parameters (companyId override, transactionIds array) are fully documented in the schema. The description adds no additional parameter meaning, so the baseline of 3 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?
States a specific verb and resource ("Save and persist selected borderou transaction matches") and adds the concrete consequence (payment records created, invoice payment status updated). It does not name how it differs from close siblings like borderou_transactions_rematch or borderou_transaction_update, so an agent must infer the boundary.
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?
Usage is only implied: "selected borderou transaction matches" suggests this runs after match selection, but there is no explicit when-to-use vs. borderou_transaction_update/rematch guidance and no statement about what happens to unmatched transactions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
borderou_transaction_updateAIdempotent
Update a borderou transaction match. Link or unlink the transaction to an invoice or proforma invoice for reconciliation.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Transaction ID | |
| amount | No | Override matched amount | |
| clientId | No | Client UUID to match | |
| companyId | No | Company UUID override (uses active company if not set) | |
| invoiceId | No | Invoice UUID to match | |
| documentType | No | Document type for matching | |
| proformaInvoiceId | No | Proforma invoice UUID to match |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false, idempotentHint=true, and destructiveHint=false, so the description need not repeat the safety profile. It adds useful link/unlink semantics, but does not disclose prerequisites, side effects beyond matching, or what happens to prior links.
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 operation and followed by the reconciliation purpose. There is no wasted text, and the description is appropriately sized.
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 full schema coverage and annotations covering safety and idempotency, the description is largely complete for invoking the tool. It could go further in distinguishing this update path from save/rematch siblings, but the essential behavior and inputs are available.
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 all seven parameters are already documented in the input schema. The description reinforces the invoice/proforma linking purpose but does not add 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 states a specific verb and resource: 'Update a borderou transaction match', and clarifies the action as linking or unlinking to an invoice or proforma invoice. It is clear, though it does not explicitly differentiate itself from siblings such as borderou_transactions_save or borderou_transactions_rematch.
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 reconciliation context implies when this tool is useful, but there is no explicit guidance on when to use it versus alternatives like borderou_transactions_rematch or borderou_transaction_available_invoices. The operation is described, but selection criteria are left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
borderou_uploadA
Upload a bank statement or borderou file (CSV, XLSX, XLS, or the original bank PDF) for transaction import and reconciliation. PDF statements are recognised automatically for Banca Transilvania, BRD, ING, CEC, Raiffeisen, UniCredit, BCR, Revolut, Garanti, Libra, Patria, Intesa Sanpaolo, Citi, Vista, Wise, myPOS, Viva, Nexent and Trezoreria Statului (pick the matching provider or generic_bank). Parses the file, creates transactions, and runs automatic matching against existing invoices.
| Name | Required | Description | Default |
|---|---|---|---|
| currency | No | Currency code (default: RON) | |
| filePath | Yes | Absolute path to the file to upload (CSV, XLSX, XLS, or PDF) | |
| provider | Yes | Bank or provider name (from borderou_providers) | |
| companyId | No | Company UUID override (uses active company if not set) | |
| sourceType | Yes | Type of upload: "borderou" for payment lists, "bank_statement" for bank exports | |
| bankAccountId | No | Bank account UUID (for bank_statement type) | |
| bordereauNumber | No | Borderou reference number |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare non-readOnly and non-destructive; the description adds materially more by stating the tool parses the file, creates transactions, and runs automatic invoice matching. It does not address duplicate/re-upload behavior, which matters given idempotentHint=false.
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 purpose and outcome are front-loaded in the first sentence, and the second and third add useful format/provider/behavior detail. The long provider enumeration is justified by parameter guidance, though slightly dense.
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 non-idempotent, side-effecting import tool with no output schema, the description covers formats, provider selection, and the create-and-match side effects. It stops short of describing what happens on partial parse failures or how re-uploads are handled.
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 adds real value beyond the schema by enumerating the recognized bank providers and noting the generic_bank fallback, which the provider parameter's schema text only gestures at via 'borderou_providers'.
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 gives a specific verb (upload), concrete resource types (borderou / bank statement files) and the downstream outcome (transaction import and reconciliation). It never names the generic import_upload sibling, so an agent cannot fully tell which import path to choose without inspecting both.
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 supplies clear context that this is the route for CSV/XLSX/XLS/PDF statement imports and tells the agent to pick the matching provider or generic_bank for PDFs. However it offers no exclusions or explicit comparison against the sibling import_upload / import_preview flow, so 'when not to use this' is left implied.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
calendar_feed_disableAIdempotent
Turn off the calendar subscription: every link stops working and subscribed calendars stop updating. Returns { enabled: false }.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare non-readonly, idempotent, non-destructive behavior, so the bar is lower; the description adds real value by disclosing the blast radius ('every link stops working', calendars stop updating) and the return payload. It stops short of saying whether the change is reversible via calendar_feed_enable or what permissions are needed.
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, effect stated first and return value second, with 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?
For a zero-parameter toggle with a known return shape and full annotation coverage, the definition covers what happens and what comes back. Only the reversibility/permission story is left implicit, which is a minor gap given calendar_feed_enable is a visible sibling.
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 tool takes zero parameters, so there is nothing for the description to disambiguate; the baseline applies and no misleading parameter talk is present.
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?
States a specific verb and resource ('Turn off the calendar subscription') and immediately describes the concrete effect on links and subscribed calendars, which distinguishes it unambiguously from calendar_feed_enable, calendar_feed_update, and calendar_feed_get.
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?
Usage is only implied by the name and effect; the description never states when to prefer this over calendar_feed_enable/update or what precondition (an enabled feed) is required. An agent can infer the route, but nothing is spelled out.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
calendar_feed_enableAIdempotent
Turn on the calendar subscription (idempotent: an existing one keeps its link). Events are all-day with alarms at 09:00: expiries at their remindDaysBefore threshold and the day before, fiscal deadlines 3 days and 1 day before; filed declarations and renewed items drop out at the next refresh. regenerate=true issues a new link and every older link stops working. Returns { enabled, url (https iCalendar link), webcalUrl (opens the Subscribe sheet on iPhone / macOS), googleCalendarUrl, outlookUrl, includeExpiries, includeFiscal, canSeeExpiries, canSeeFiscal, createdAt, lastFetchedAt }, or { enabled: false, canSeeExpiries, canSeeFiscal } when off. The link is the credential (anyone holding it can read the deadlines): show it only to the user.
| Name | Required | Description | Default |
|---|---|---|---|
| regenerate | No | Issue a new link; the old one stops working | |
| includeFiscal | No | Include fiscal deadlines (default true) | |
| includeExpiries | No | Include expiries: vehicle documents, contracts, certificates (default true) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the annotations: it discloses the exact event model (all-day events, 09:00 alarms, remindDaysBefore and fiscal 3-day/1-day thresholds), that filed declarations and renewed items drop out at refresh, and that regenerate invalidates older links. It also flags the critical security trait — the link is a bearer credential that must only be shown to the user — which no annotation conveys.
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?
Front-loaded with the action and idempotency note, then behavior, then return contract, then the safety warning — a sensible ordering. The long inline enumeration of return fields is justified because there is no output schema, though it is denser than ideal.
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 no output schema, the description fully carries the return contract (both enabled and disabled shapes, all field names) and covers event behavior, invalidation, and credential handling. An agent has everything needed to call it and relay results safely.
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, but the description adds real meaning about consequences: regenerate kills every older link, and the include flags determine the event populations plus the drop-out behavior at refresh. It stops short of stating defaults explicitly (those live only 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?
States a specific verb and resource ('Turn on the calendar subscription') and immediately scopes it with the idempotency behavior. The enable-vs-regenerate distinction makes it clearly separable from the get/update/disable siblings.
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?
Explains when the default path applies (existing subscription keeps its link) and gives an explicit condition for the alternative (regenerate=true when a new link is wanted, invalidating old ones). It never names the sibling tools (calendar_feed_update, calendar_feed_get), so routing between tools is implied rather than stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
calendar_feed_getARead-onlyIdempotent
The user's calendar subscription in the current organization. Returns { enabled, url (https iCalendar link), webcalUrl (opens the Subscribe sheet on iPhone / macOS), googleCalendarUrl, outlookUrl, includeExpiries, includeFiscal, canSeeExpiries, canSeeFiscal, createdAt, lastFetchedAt }, or { enabled: false, canSeeExpiries, canSeeFiscal } when off. The link is the credential (anyone holding it can read the deadlines): show it only to the user.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnly/idempotent annotations, it discloses the exact success response shape and the distinct disabled-state response shape. It also clearly warns that the URL is a credential granting deadline access and should only be shown to the user.
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 front-loaded with the resource and efficiently enumerates return fields despite the lack of an output schema. The security warning earns its place, though the long field list makes it dense rather than elegant.
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 no parameters, no output schema, and simple read-only annotations, the description supplies the missing return-value information and the off-state shape. It also covers the key security caveat, leaving no important behavioral gap for an agent to call this 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?
The tool has zero parameters, so there is no parameter semantics to explain. Per the calibration rule for 0 params, the baseline is 4.
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 identifies the specific resource: the user's calendar subscription in the current organization. It does not explicitly say "get" or name sibling tools such as calendar_feed_enable/update/disable, but the returned fields make the retrieval purpose clear.
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?
Usage is implied: read the current subscription and its feed URLs. The only explicit guidance is security-oriented ("show it only to the user"), with no when-to-use comparison against calendar_feed_enable, calendar_feed_update, or calendar_feed_disable.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
calendar_feed_updateAIdempotent
Change what the calendar subscription contains. Fails with NOT_ENABLED when it is off. Returns { enabled, url (https iCalendar link), webcalUrl (opens the Subscribe sheet on iPhone / macOS), googleCalendarUrl, outlookUrl, includeExpiries, includeFiscal, canSeeExpiries, canSeeFiscal, createdAt, lastFetchedAt }, or { enabled: false, canSeeExpiries, canSeeFiscal } when off. The link is the credential (anyone holding it can read the deadlines): show it only to the user.
| Name | Required | Description | Default |
|---|---|---|---|
| includeFiscal | No | Include fiscal deadlines | |
| includeExpiries | No | Include expiries: vehicle documents, contracts, certificates |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds substantial context beyond the annotations: it documents the NOT_ENABLED failure mode, describes the exact return shape for enabled and disabled states, and warns that the generated link is a credential that must only be shown to the user. These details are highly relevant for safe invocation and handling of the response.
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 front-loaded with purpose, then failure behavior, return shape, and credential warning. The return-object enumeration is long but justified because no output schema exists; overall the structure is efficient and each sentence carries useful 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 low parameter count, full schema coverage, and absence of an output schema, the description is nearly complete: it explains return values, failure conditions, and security handling. The only notable gap is that it does not say whether omitted optional booleans leave existing settings unchanged.
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 already documents both boolean parameters at 100% coverage, including what includeFiscal and includeExpiries mean. The description mentions these fields only as return values and does not add additional parameter semantics such as whether omitted values preserve existing settings.
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 states a specific verb and resource: 'Change what the calendar subscription contains.' It makes clear this is an update to feed content, not a get/enable/disable operation, but it does not explicitly differentiate from the sibling calendar_feed_* 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 precondition 'Fails with NOT_ENABLED when it is off' gives implied usage guidance because the agent learns the feed must already be enabled. However, it never explicitly names calendar_feed_enable as the alternative or says when to use this versus calendar_feed_get/disable.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
cash_register_balanceARead-onlyIdempotent
Live snapshot of the till — opening balance, cash in/out since opening, manual movements, and current balance. Returns { configured: false } if no cash-type bank account exists or its opening balance is not set.
| Name | Required | Description | Default |
|---|---|---|---|
| companyId | No | Company UUID override (uses active company if not set) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish this as a read-only, idempotent, non-destructive, closed-world read. The description adds genuine value beyond that by documenting a failure/degenerate return: '{ configured: false }' when no cash-type bank account exists or its opening balance is unset, which an agent would otherwise misinterpret as an error or empty result. It stops short of describing pagination or freshness/latency guarantees.
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 tight sentences: the payload contents come first, the degenerate-case return second. Every clause carries information an agent would otherwise have to discover by calling the tool.
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 no output schema, the description bears the burden of explaining return values, and it does so by enumerating the returned fields and spelling out the { configured: false } shape. It does not cover units/currency of the amounts, which is the main remaining gap for a monetary 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?
There is only one optional parameter and schema coverage is 100%, so the schema already fully documents companyId as a UUID override defaulting to the active company. The description adds nothing about the override or its fallback behavior, so the baseline of 3 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?
The description names a concrete resource (the till / cash register) and precisely enumerates what the snapshot contains: opening balance, cash in/out since opening, manual movements, current balance. This clearly separates it from the movement-listing siblings (cash_register_movements_list) and the ledger tool, though it never names those siblings explicitly.
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 word 'live snapshot' implies a point-in-time read as opposed to a historical listing, which hints at when to prefer this over cash_register_ledger or cash_register_movements_list. However, there is no explicit statement of when to use this tool, when not to, or which sibling to pick for historical detail.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
cash_register_ledgerARead-onlyIdempotent
Daily cash ledger across the requested date range. Each day bucket includes opening balance, chronological entries (receipts, cash payments, manual movements), totals, and closing balance. Range capped at 366 days.
| Name | Required | Description | Default |
|---|---|---|---|
| to | No | End date YYYY-MM-DD (defaults to today) | |
| from | No | Start date YYYY-MM-DD (defaults to the cash account opening date or 30 days ago) | |
| companyId | No | Company UUID override (uses active company if not set) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, non-destructive and closed-world, so the safety profile is covered. The description adds genuinely new behavioral context: the exact shape of each day bucket and the 366-day range cap, a constraint not expressed in the schema. It stops short of saying what happens for days with no activity.
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 tight sentences, front-loaded with the primary purpose, then return shape, then the constraint. No filler; each sentence carries a distinct fact.
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 no output schema, the description must explain returns, and it does so at the bucket level. It also discloses the range limit and the zero-required-params defaults. The remaining gap is how this differs from the sibling cash-register read tools, which matters in a family this dense.
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%, including defaults for 'from' and 'to' and the companyId override, so the baseline is 3. The description only refers generically to 'the requested date range' and adds no format or boundary semantics beyond the 366-day cap already counted under behavior.
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?
Concrete verb+resource: returns a daily cash ledger over a date range, and it enumerates exactly what each day bucket contains (opening balance, entries, totals, closing balance). It never names the sibling tools that retrieve similar data (cash_register_balance, cash_register_movements_list), so the agent must infer the distinction itself.
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?
Usage is implied by 'daily cash ledger across the requested date range', which suggests periodic reconciliation over a span rather than a point balance. However, no when-to-use/when-not and no alternatives are offered, leaving the agent to guess whether to call this or cash_register_movements_list for transaction-level data.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
cash_register_movements_createA
Record a manual cash movement (deposit, withdrawal, or miscellaneous). Direction is auto-set for deposits (out) and withdrawals (in); for kind=other, direction must be supplied. movementDate cannot be earlier than the cash account opening date.
| Name | Required | Description | Default |
|---|---|---|---|
| kind | Yes | deposit (cash leaves the till), withdrawal (cash put into the till), or other (miscellaneous; direction required) | |
| amount | Yes | Positive amount, >= 0.01 | |
| companyId | No | Company UUID override (uses active company if not set) | |
| direction | No | Cash flow direction. Required only when kind=other; ignored otherwise. | |
| description | No | Free-form note shown in the ledger | |
| movementDate | Yes | YYYY-MM-DD. Cannot be earlier than the cash account opening date. | |
| documentNumber | No | Reference number (e.g., bank slip / expense receipt) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare this is a non-read-only, non-idempotent, non-destructive creation operation. The description adds useful business behavior: direction is auto-set for deposit/withdrawal, required for other, and movementDate is constrained by the cash account opening date.
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 tight sentences, front-loaded with the main action and followed by the two key rules an agent must apply. There is no wasted wording.
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 the core invocation rules for a 7-parameter creation tool with annotations and no output schema. It does not mention permissions or the shape of the created result, but those are secondary for correct invocation.
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 would be 3, but the description adds meaning beyond the schema by stating that direction is auto-set for deposits and withdrawals. The movementDate constraint is repeated from the schema, but the auto-direction rule is useful additional semantics.
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 gives a specific verb and resource: "Record a manual cash movement," and names the three movement types. It is clearly distinguishable from cash_register_movements_list/update/delete, though it does not explicitly reference those siblings.
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 explains field-level rules for direction and movementDate, including when direction must be supplied. However, it does not explicitly say when to choose this create tool over cash_register_ledger, cash_register_balance, or update operations.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
cash_register_movements_deleteADestructiveIdempotent
Permanently delete a manual cash movement. Receipts and invoice payments cannot be deleted via this endpoint — use their respective resources.
| Name | Required | Description | Default |
|---|---|---|---|
| uuid | Yes | Movement UUID | |
| companyId | No | Company UUID override (uses active company if not set) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true and idempotentHint=true; the description reinforces permanence ('Permanently delete') and adds the meaningful constraint that only manual movements qualify. It does not mention effects on the cash register balance or error behavior for non-manual movements, keeping it below a 5.
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, front-loaded with the action and scope, with the exclusion following immediately. No filler 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?
For a two-parameter destructive tool with full annotation coverage and no output schema, this covers what is needed. Minor gaps remain: permission requirements and side effects on register balance are unstated, and the excluded cases don't point to concrete tools.
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 both uuid and the companyId override are already documented. The description adds no syntax, format, or semantic detail about either parameter, which meets the baseline for a fully covered 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?
States a specific verb (delete) and resource (manual cash movement) with a scope qualifier ('manual') that separates it from receipts_delete and payments_delete. It doesn't name those sibling tools, only 'their respective resources', so routing is left slightly implicit.
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 gives a when-not condition: receipts and invoice payments cannot be deleted here. However it never names the actual alternatives (receipts_delete, payments_delete), leaving the agent to infer which sibling to call.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
cash_register_movements_listARead-onlyIdempotent
List manual cash movements (deposits, withdrawals, miscellaneous) in a date range. Receipts and invoice payments are NOT returned here — use cash_register_ledger for the full picture.
| Name | Required | Description | Default |
|---|---|---|---|
| to | No | End date YYYY-MM-DD (defaults to today) | |
| from | No | Start date YYYY-MM-DD (defaults to the cash account opening date or 30 days ago) | |
| companyId | No | Company UUID override (uses active company if not set) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint and destructiveHint=false, so safety is covered. The description adds real behavioral content beyond that: the result set is deliberately partial, excluding receipts and invoice payments. It doesn't mention pagination, ordering, or result shape, which keeps it from a 5.
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, zero filler. The positive scope comes first and the exclusion/alternative routing follows immediately, so the key selection signal 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?
For a read-only, zero-required-parameter list tool with fully documented parameters and no output schema, the description covers scope and the main look-alike alternative. It stops short of describing what a movement record contains or how results are ordered, which would help an agent interpret output.
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 all three parameters (from, to, companyId) are self-documented including defaults, so the baseline applies. The description only reinforces that filtering is by date range; it adds no syntax or edge-case detail 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?
States a specific verb and resource ('List manual cash movements') and enumerates the covered subtypes (deposits, withdrawals, miscellaneous) with a date-range scope. It explicitly distinguishes itself from the sibling cash_register_ledger, so an agent can choose between them without opening either schema.
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 what is NOT returned (receipts and invoice payments) and names the alternative (cash_register_ledger) for 'the full picture.' This is a clear when-to-use / when-not-to-use rule with the alternative tool named inline.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
cash_register_movements_updateAIdempotent
Update a manual cash movement. All fields optional; omitted fields keep their current value. Currency cannot be changed. Changing kind between deposit/withdrawal re-applies auto-direction.
| Name | Required | Description | Default |
|---|---|---|---|
| kind | No | ||
| uuid | Yes | Movement UUID | |
| amount | No | ||
| companyId | No | Company UUID override (uses active company if not set) | |
| direction | No | ||
| description | No | Pass null to clear | |
| movementDate | No | YYYY-MM-DD | |
| documentNumber | No | Pass null to clear |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish idempotency, non-destructiveness, and non-read-only behavior, while the description adds useful mutation semantics: omitted fields preserve current values, currency is immutable, and changing kind re-applies auto-direction. It still omits permissions, validation behavior, and response details.
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 sentences front-load the purpose, then state the key update constraints with no wasted text.
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 an update tool with a modest schema and annotations covering safety traits, the description provides the essential behavioral constraints. It could still mention prerequisites, error behavior, or what the update returns.
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 meaningful semantics for partial updates and the kind/direction interaction. However, "All fields optional" conflicts with the schema's required uuid, and it does not explain several individual parameters such as amount or direction.
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 and resource: "Update a manual cash movement." It clearly identifies the operation and the manual-movement subtype, though it does not explicitly route the agent away from create/delete/list siblings.
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?
Usage is implied by "Update a manual cash movement" and by the note that omitted fields keep their current value, which suggests partial updates. However, it does not state when to use this instead of creating a new movement, deleting one, or listing movements.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
clients_anaf_lookupARead-onlyIdempotent
Look up company details by CUI in the ANAF public registry without creating a client. Returns pre-filled form data (name, address, VAT status, registration number, etc.) that can be used to populate a clients_create call.
| Name | Required | Description | Default |
|---|---|---|---|
| cui | Yes | Company tax ID / CUI to look up in ANAF | |
| companyId | No | Company UUID override (uses active company if not set) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, open-world and non-destructive, so safety is covered. The description adds genuine context beyond them: the data comes from an external public registry and no client record is persisted, plus it enumerates the returned field categories.
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, zero waste — the action and the non-persistence constraint come first, followed by the return payload and intended follow-up. Nothing redundant.
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 two-param read-only lookup, the description covers purpose, the external source, and the return shape in lieu of an output schema. It omits the companyId override and any caveats about external-registry failures or rate limits, which would round it out.
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 both parameters are already documented by the schema. The description reinforces that CUI is the lookup key but says nothing about the companyId override, so it adds no meaning beyond the schema. Baseline 3 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?
States a specific verb and resource — look up company details by CUI in the ANAF public registry — and explicitly contrasts with client creation. It does not name the nearest sibling lookups (clients_from_registry, clients_vies_lookup), so an agent must still infer which lookup source fits.
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?
"Without creating a client" plus "can be used to populate a clients_create call" gives clear context for when this tool is the right choice and what to do next. There is no explicit when-not guidance or routing to the VIES/registry alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
clients_bulk_deleteADestructiveIdempotent
Delete multiple clients in a single request. Accepts up to 100 client UUIDs. Clients with existing documents will be skipped or cause an error depending on server configuration.
| Name | Required | Description | Default |
|---|---|---|---|
| ids | Yes | Array of client UUIDs to delete (max 100) | |
| companyId | No | Company UUID override (uses active company if not set) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true, idempotentHint=true and readOnlyHint=false, so the safety profile is covered. The description adds genuine value beyond that: the 100-item ceiling and the non-deterministic skip-or-error outcome for clients with documents, which is exactly the kind of partial-failure risk an agent needs to know.
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 tight sentences with the operation front-loaded and the risk caveat second. No filler and nothing repeated from annotations.
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 destructive bulk mutation with annotations covering safety, the description supplies the essential partial-failure warning and size limit. It stops short of saying whether the response reports which IDs were skipped, which would close the loop for an agent deciding on follow-up.
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 both `ids` and `companyId` are already documented in the schema. The description reinforces the 100-item cap and failure semantics for `ids` but adds no format or override guidance beyond the schema, so baseline 3 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?
States a specific verb and resource with scope ('Delete multiple clients in a single request'), which implicitly separates it from the single-record clients_delete sibling. It never names the alternative explicitly, so differentiation requires a small inference.
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?
Gives the batch limit (up to 100) and the document-attachment caveat, which imply when the tool applies, but there is no explicit guidance on choosing this over repeated clients_delete calls or on preconditions such as permissions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
clients_createA
Create a new client manually. Supports both company and individual client types. Company details (address, VAT, bank account, etc.) can be auto-filled using clients_anaf_lookup or clients_from_registry before calling this tool.
| Name | Required | Description | Default |
|---|---|---|---|
| cnp | No | Personal numeric code / CNP (for individual type) | |
| cui | No | Company tax ID / CUI (for company type) | |
| city | No | City | |
| name | Yes | Client name (company or individual full name) | |
| type | No | Client type: "company" (default) or "individual" | |
| No | Client email address | ||
| notes | No | Internal notes about the client | |
| phone | No | Client phone number | |
| county | No | County / state | |
| status | No | Partner rule: active (default), warning (a notice is shown when the client is picked on an invoice) or blocked (the client cannot be invoiced — issue is refused) | |
| address | No | Street address | |
| country | No | ISO 3166-1 alpha-2 country code (default: RO) | |
| vatCode | No | VAT registration code (e.g., RO12345678) | |
| bankName | No | Bank name | |
| currency | No | Preferred currency for this client (ISO 4217, e.g., EUR, USD, RON) | |
| idNumber | No | Client identification number (personal ID, passport, etc.) | |
| companyId | No | Company UUID override (uses active company if not set) | |
| affiliated | No | Affiliated party — D394 sets prsAfiliat = 1 when an affiliated partner appears on an invoice of the period | |
| isVatPayer | No | Whether the client is registered for VAT | |
| postalCode | No | Postal / ZIP code | |
| bankAccount | No | IBAN or bank account number | |
| creditLimit | No | Partner rule: maximum outstanding balance in the company currency; issuing an invoice that would exceed it returns a `warning` (never a refusal). null removes the limit | |
| contactPerson | No | Name of the primary contact person | |
| registrationNumber | No | Trade registry number (e.g., J40/1234/2020) | |
| defaultPaymentTermDays | No | Default payment term in days for invoices issued to this client |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare this is a non-read-only, non-destructive, non-idempotent mutation, and the description's 'Create' matches that. The description adds useful workflow context about manual creation and data prefill, but it does not disclose duplicate handling, validation behavior, permission requirements, or side effects beyond what annotations and schema provide.
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 tight sentences with no filler. It is front-loaded with the core action and then provides the most relevant workflow detail: client type support and prefill alternatives.
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 100%-covered schema and present annotations, the description covers the essential purpose and prefill workflow for a complex create tool. It is slightly incomplete because it does not mention return behavior, duplicate-name handling, or other post-creation effects, and there is no output schema to cover those aspects.
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 all 25 parameters are already well documented in the input schema. The description only adds high-level context that company fields can be pre-filled via lookup tools and that both company and individual types are supported, which is helpful but does not add detailed parameter-level semantics 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 states a specific verb and resource: create a new client manually. It also distinguishes supported client types and names the lookup tools used for auto-filling company details, so an agent can identify its role among siblings.
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 gives clear usage context: use this tool to create manually, and use clients_anaf_lookup or clients_from_registry beforehand to populate company details. It does not explicitly state when not to use it or mention bulk/import alternatives, so it stops short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
clients_deleteADestructiveIdempotent
Permanently delete a client by UUID. Clients with existing invoices or documents cannot be deleted.
| Name | Required | Description | Default |
|---|---|---|---|
| uuid | Yes | Client UUID to delete | |
| companyId | No | Company UUID override (uses active company if not set) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true and idempotentHint=true, so the safety profile is covered; the description adds real value beyond that by stressing permanence and naming the blocking dependency (invoices/documents) that causes refusal. It does not describe the error behaviour or what happens to linked records, which keeps it below a 5.
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 with zero filler; the destructive action is front-loaded and the failure condition follows immediately. Every clause carries 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 two-parameter destructive mutation with no output schema, the description covers the essential facts: what is deleted, how it is identified, and the blocking condition. It stops short of describing the failure response or the remediation path, which would fully round it out.
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 documented in the schema, so the description does not need to restate them. It mentions the UUID role implicitly but adds nothing about the companyId override or UUID format, leaving this at the baseline for a fully documented 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?
States a specific verb and resource ('Permanently delete a client by UUID'), so the agent knows exactly what is affected and how it is addressed. It does not name a sibling such as clients_bulk_delete, so the single-vs-bulk distinction must be inferred from 'by UUID'.
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 precondition 'Clients with existing invoices or documents cannot be deleted' usefully implies when the call will fail, but there is no explicit guidance on alternatives (e.g. clients_bulk_delete for many records, or removing dependent documents first). Usage is therefore implied rather than directed.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
clients_export_csvARead-onlyIdempotent
Export all clients for the active company as a CSV file. Returns base64-encoded binary data representing the CSV file contents.
| Name | Required | Description | Default |
|---|---|---|---|
| companyId | No | Company UUID override (uses active company if not set) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint and non-destructive, so the safety profile is covered. The description adds genuinely non-derivable behavior: the result is base64-encoded binary rather than a normal JSON payload, which materially changes how an agent must handle the response. It stops short of mentioning payload size or whether output is ever truncated.
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 tight sentences, zero filler, with the resource scope front-loaded and the return encoding stated immediately after. Nothing could be removed without losing 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?
With no output schema, the description correctly covers the one thing an agent could not otherwise know: the response is base64 binary. For a single optional parameter, read-only export this is close to sufficient; only size/limits and the XML alternative are unaddressed.
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 companyId already documents the active-company fallback, so the schema does the heavy lifting. The description's phrase 'for the active company' reinforces the default but adds no format or constraint detail beyond the schema; baseline 3 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?
States a specific verb and resource ('Export all clients ... as a CSV file') with a clear scope ('for the active company'). It implicitly separates itself from clients_list, but never names the close sibling clients_export_saga_xml, which serves the same data in XML, so the agent must infer the format split from the name alone.
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?
Usage is only implied: the word 'Export' and 'CSV file' suggest bulk-download use, and the schema note about active-company override hints at scope. There is no explicit when-to-use, no when-not, and no pointer to the sibling XML export or clients_list for paginated reads.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
clients_export_saga_xmlARead-onlyIdempotent
Export clients in Saga XML format for import into Saga accounting software. Returns the XML document as text.
| Name | Required | Description | Default |
|---|---|---|---|
| companyId | No | Company UUID override (uses active company if not set) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/non-destructive and closed-world, so the safety profile is covered. The description adds genuinely new information by stating the return shape (an XML document as text), which matters since there is no output schema; it does not discuss response size or pagination for large client sets.
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: what it produces first, then what it returns. No filler, nothing to trim.
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 zero-required-param read-only export, the description covers purpose, target system and return type, and the schema covers the only parameter. The lack of any note about output volume for large client lists is the only real gap.
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?
There is a single optional parameter with 100% schema description coverage explaining the companyId override and the active-company default. The description adds nothing about it, which is acceptable at full coverage, earning the baseline 3.
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?
Names the exact resource (clients), the output format (Saga XML) and the downstream consumer (Saga accounting software). This distinguishes it cleanly from clients_export_csv and from the invoices/suppliers Saga exports.
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 by naming the Saga import use case, but it never states when to pick this over clients_export_csv or accounting_export_zip, nor any preconditions (e.g. that exports require configured company data).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
clients_from_registryA
Create a client by looking up a CUI in the ANAF registry and auto-filling all available details (name, address, VAT status, registration number, etc.). Use this instead of clients_create when you only have a CUI and want the company details resolved automatically.
| Name | Required | Description | Default |
|---|---|---|---|
| cui | Yes | Company tax ID / CUI to look up and create a client from | |
| name | No | Fallback name if ANAF does not return one | |
| companyId | No | Company UUID override (uses active company if not set) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnlyHint=false, destructiveHint=false, idempotentHint=false), and the description adds that details come from an external ANAF registry with auto-fill of name/address/VAT/registration number. It does not say what happens when the CUI is unknown or ANAF is unavailable, nor does it warn that repeat calls will create duplicate clients despite idempotentHint=false. Note also a mild tension: the description implies an external network dependency while openWorldHint is declared false.
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, zero waste: the action and auto-filled field list come first, and the disambiguation rule follows. Nothing is repeated from the annotations or schema.
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?
There is no output schema, so the description is the only place to learn what a successful call yields (e.g., the created client record, or a partial record when ANAF returns nothing), and it stays silent on this. Combined with no failure-mode guidance, the definition is serviceable but leaves real gaps for a mutating, network-dependent creation 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%, so all three parameters (cui, name, companyId) are already documented, including the fallback/override intent. The description reinforces that the CUI drives the lookup but adds no format, validation, or override-precedence detail beyond the schema. Baseline 3 applies when the schema does the heavy lifting.
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?
States a concrete verb chain (look up CUI in ANAF registry → create client) and enumerates the auto-filled fields, so the effect is unmistakable. It distinguishes itself from clients_create by name, but not from the much closer sibling clients_anaf_lookup, which an agent could easily confuse with a lookup that only resolves 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?
Explicit routing rule: 'Use this instead of clients_create when you only have a CUI and want the company details resolved automatically' — a clear when-to-use with a named alternative. It omits the important when-not cases: no guidance about checking for an existing client first, and no mention of clients_anaf_lookup as the read-only alternative when the caller does not actually want a client created.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
clients_getARead-onlyIdempotent
Get detailed information about a specific client by UUID, including invoice summary statistics (total count, unpaid amount, overdue amount, total revenue) and a list of the 10 most recent invoices.
| Name | Required | Description | Default |
|---|---|---|---|
| uuid | Yes | Client UUID | |
| companyId | No | Company UUID override (uses active company if not set) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, destructiveHint=false, and openWorldHint=false, so the safety profile is covered. The description adds useful behavioral detail by specifying the returned data shape, including invoice summary statistics and a capped list of 10 recent invoices.
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 a single front-loaded sentence that states the operation and the returned content without filler. Every clause contributes to tool selection or expectation setting.
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 get tool with two fully documented parameters and no output schema, the description provides enough context to select and invoke it. It explains the main return contents, though it does not describe error behavior when the UUID is not found or the full set of client fields returned.
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 both the required 'uuid' and optional 'companyId' parameters are already documented in the schema. The description reinforces that lookup is by UUID but does not add syntax, format, or meaning beyond what the schema provides, so the baseline of 3 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?
The description names a specific verb and resource ('Get detailed information about a specific client') and scopes it by UUID. It also enumerates what is returned (invoice summary statistics and the 10 most recent invoices), which clearly distinguishes it from list or mutation siblings such as clients_list and clients_update.
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 by stating that a specific client is fetched by UUID, but it does not explicitly contrast this tool with clients_list or state when not to use it. The intended use is inferable, but there is no explicit routing guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
clients_listARead-onlyIdempotent
List clients for the active company. Results are grouped alphabetically by name and can be filtered by type (company/individual) or searched by name, CUI/CNP, or email.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | Page number (default: 1) | |
| type | No | Filter by client type: "company" or "individual" | |
| limit | No | Items per page, max 200 (default: 50) | |
| search | No | Search term to filter by name, CUI/CNP, or email | |
| companyId | No | Company UUID override (uses active company if not set) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare this to be a safe, idempotent read operation, so the bar is lower. The description adds useful behavioral detail beyond annotations by disclosing alphabetical grouping and the exact searchable fields (name, CUI/CNP, email).
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 the core operation and scope front-loaded before the filtering and ordering details. No sentence is wasted.
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 list tool with full schema coverage and annotations covering safety, the description is nearly complete. It could have explicitly mentioned the companyId override and pagination behavior, but those are adequately handled in the 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?
Schema description coverage is 100%, so the parameters are already well documented. The description reinforces the type and search semantics but does not add syntax, defaults, or edge-case behavior 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 states a specific verb and resource ("List clients") and scopes it to "the active company," which distinguishes it from clients_get and other client-related siblings. An agent can identify the operation without opening the schema.
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 implies usage through the available filters and active-company scope, but it does not explicitly say when to use this tool versus clients_get, clients_from_registry, or clients_anaf_lookup. The guidance is adequate but leaves sibling routing to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
clients_sync_invoicesAIdempotent
Resync all unsent invoices with the client's current profile data (name, CUI, tax details). Unlike the automatic propagation on client update (current month only), this also rewrites older invoices, as long as they were not uploaded to ANAF and are not cancelled. Cached XML/PDF files are invalidated so they regenerate with the new data. Returns the number of invoices updated.
| Name | Required | Description | Default |
|---|---|---|---|
| uuid | Yes | Client UUID whose unsent invoices should be resynced | |
| companyId | No | Company UUID override (uses active company if not set) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the annotations by disclosing what actually changes (name, CUI, tax details written into older invoices), the exclusion boundary (ANAF-uploaded and cancelled invoices are untouched), and the side effect that cached XML/PDF are invalidated and regenerated. It also states the return value (count of invoices updated), which the absence of an output schema makes necessary. No contradiction with destructiveHint=false, since only unsubmitted, non-cancelled drafts are rewritten and the operation is idempotent.
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 tight sentences, front-loaded with the action and scope, then the differentiation, then side effects and return value. Every sentence carries distinct information with no repetition of the name or title.
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 two-parameter mutation tool with annotations and no output schema, the description covers scope, preconditions, side effects, and the return value. An agent has everything needed to decide whether to call it and what to expect.
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 both uuid and companyId documented inline including the active-company fallback behavior. The description adds no parameter-level detail beyond schema, so the baseline 3 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?
States a specific verb and resource with precise scope: resync all unsent invoices with the client's current profile data (name, CUI, tax details). It also contrasts with the automatic propagation path on client update. The one gap is that the near-identically named sibling invoices_sync_client is never addressed, so an agent must still guess between the two.
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?
Gives concrete eligibility conditions: only invoices not uploaded to ANAF and not cancelled, and explains that it reaches older invoices that automatic propagation does not. Missing is an explicit statement of when to prefer invoices_sync_client or clients_update instead.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
client_statementARead-onlyIdempotent
Customer statement (situație clienți) for one client: the unpaid outgoing invoices as of a date (number, issue/due date, total, paid, outstanding, days overdue), totals, the client balance and the outstanding amount split into aging bands (current, 1–30, 31–60, 61–90, 91–120, 121–180, over 180 days overdue), plus the company bank accounts. Storno/credit documents are listed as credits and reduce the balance; invoices in other currencies than the company default are listed but summarised separately.
| Name | Required | Description | Default |
|---|---|---|---|
| asOf | No | Reference date (YYYY-MM-DD). Invoices issued after it are ignored and days overdue are counted up to it. Default: today. | |
| uuid | Yes | Client UUID | |
| companyId | No | Company UUID override (uses active company if not set) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/non-destructive, so safety is covered; the description adds real behavioral detail beyond that: storno/credit documents are listed as credits and reduce the balance, and foreign-currency invoices are shown but summarised separately. It could still mention whether the statement includes paid invoices (it says unpaid only) or output format, but the added context is substantial.
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?
A single dense sentence that front-loads the resource and then enumerates the output; every clause (aging bands, credit handling, currency split) carries information, though it is close to overloaded.
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 exists, so the description carries the burden of describing return values — and it does so thoroughly (invoice fields, totals, balance, aging-band breakdown, bank accounts). An agent knows exactly what it will get.
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 all three parameters are documented in the schema, including the asOf default of today. The description adds little beyond the schema on parameter semantics — 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?
States a specific verb/resource pair — customer statement for one client — and enumerates exactly what the output contains (unpaid invoices, totals, balance, aging bands, bank accounts). It is clearly distinguishable from the plural sibling client_statements.
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 a per-client reporting use case (given a uuid and an asOf date) but never explicitly says when to prefer this over client_statements or emailing it via client_statement_email. Usage is inferable, not stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
client_statement_emailA
E-mail the statement of unpaid invoices ("Facturi neachitate {company}") with the PDF attached. Pass uuid to send to one client (to its e-mail, or to — which must be an address of one of your clients), or omit it to send to every client with a balance of at least minBalance and an e-mail address. Use dryRun: true first: it returns who would receive the statement and who is skipped (no e-mail, below the minimum balance, unsubscribed) without sending anything. Requires the invoice-sending permission and a plan with e-mail sending. The bulk send stops at the plan's daily/burst e-mail limit and reports stoppedReason.
| Name | Required | Description | Default |
|---|---|---|---|
| to | No | Recipient override for a single client (defaults to the client e-mail) | |
| asOf | No | Reference date (YYYY-MM-DD). Invoices issued after it are ignored and days overdue are counted up to it. Default: today. | |
| uuid | No | Client UUID. Omit to e-mail all clients with a balance. | |
| dryRun | No | Do not send; return the recipients and the skip reasons. For a single client it returns the statement that would be sent. | |
| message | No | Optional message appended to the standard Romanian body (plain text) | |
| companyId | No | Company UUID override (uses active company if not set) | |
| minBalance | No | Bulk only: minimum balance a client must owe to receive the statement (default 0.01) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only say non-readonly, non-destructive, non-idempotent, open-world. The description adds substantive behavior beyond that: the bulk send halts at the plan's daily/burst e-mail limit and reports `stoppedReason`, and dry run reveals skipped recipients (no e-mail, below minimum balance, unsubscribed). That is exactly the context annotations can't convey.
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?
Front-loaded with the action and subject, then the single-vs-bulk branching, then the dry-run recommendation, then prerequisites and limits — no filler sentence. It is dense and long-ish, but every sentence contributes operational 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?
No output schema exists, yet the description explains what dry run returns (recipients plus skip reasons) and that bulk sends surface `stoppedReason`. Combined with the permission and plan prerequisites, an agent has everything needed to call this safely without surprises.
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 already 100%, so baseline is 3; the description earns extra by explaining cross-parameter relationships the schema states only individually — `to` must be an address of one of your clients, `minBalance` applies only in bulk mode, and `dryRun` returns the statement itself for a single client. It doesn't cover `asOf` or `companyId` semantics, but those are adequately 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?
States a specific verb and resource ("E-mail the statement of unpaid invoices ... with the PDF attached") plus the literal subject line, which distinguishes it from generic siblings like invoices_email or client_statement. An agent can tell exactly what artifact leaves the system.
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 branches usage: pass `uuid` for one client (with `to` constrained to one of your client addresses), omit it for a bulk send gated by `minBalance`, and recommends `dryRun: true` first to preview recipients and skip reasons. It also states prerequisites (invoice-sending permission, plan with e-mail sending), which is stronger than most sibling tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
client_statementsARead-onlyIdempotent
Customer statements for every client of the company with a positive balance, sorted by balance descending, with company-wide totals and aging bands. Use it to see who owes money and how old the debt is before sending reminders with client_statement_email.
| Name | Required | Description | Default |
|---|---|---|---|
| asOf | No | Reference date (YYYY-MM-DD). Invoices issued after it are ignored and days overdue are counted up to it. Default: today. | |
| companyId | No | Company UUID override (uses active company if not set) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/non-destructive, lowering the bar. The description adds real value beyond them: it discloses the positive-balance filter, the descending sort, and that aging bands and company-wide totals are included, which shapes how an agent interprets the output.
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, zero filler, with the core behavior front-loaded and the usage recommendation compactly appended.
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 aggregation tool with no output schema, the description conveys enough about returned content (per-client statements, totals, aging bands) and filtering for correct invocation. Only a small gap remains around output shape 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?
Schema coverage is 100%, so both parameters (asOf, companyId) are already fully documented in the schema. The description's reference to debt age hints at the asOf semantics but adds no format or default detail beyond what the schema provides, making the baseline 3 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?
States a specific resource (customer statements) with precise scope ('every client of the company with a positive balance'), ordering ('sorted by balance descending'), and content (totals, aging bands). This clearly distinguishes it from the singular sibling client_statement.
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 frames the use case ('see who owes money and how old the debt is') and points to the natural follow-up tool client_statement_email. It does not explicitly contrast with the singular client_statement sibling, so it falls just short of a full when/when-not guide.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
clients_updateAIdempotent
Update an existing client by UUID. All fields are optional — only the provided fields will be updated.
| Name | Required | Description | Default |
|---|---|---|---|
| cnp | No | Personal numeric code / CNP (for individual type) | |
| cui | No | Company tax ID / CUI (for company type) | |
| city | No | City | |
| name | No | Client name (company or individual full name) | |
| type | No | Client type: "company" or "individual" | |
| uuid | Yes | Client UUID to update | |
| No | Client email address | ||
| notes | No | Internal notes about the client | |
| phone | No | Client phone number | |
| county | No | County / state | |
| status | No | Partner rule: active (default), warning (a notice is shown when the client is picked on an invoice) or blocked (the client cannot be invoiced — issue is refused) | |
| address | No | Street address | |
| country | No | ISO 3166-1 alpha-2 country code | |
| vatCode | No | VAT registration code (e.g., RO12345678) | |
| bankName | No | Bank name | |
| currency | No | Preferred currency for this client (ISO 4217, e.g., EUR, USD, RON) | |
| idNumber | No | Client identification number (personal ID, passport, etc.) | |
| companyId | No | Company UUID override (uses active company if not set) | |
| affiliated | No | Affiliated party — D394 sets prsAfiliat = 1 when an affiliated partner appears on an invoice of the period | |
| isVatPayer | No | Whether the client is registered for VAT | |
| postalCode | No | Postal / ZIP code | |
| bankAccount | No | IBAN or bank account number | |
| creditLimit | No | Partner rule: maximum outstanding balance in the company currency; issuing an invoice that would exceed it returns a `warning` (never a refusal). null removes the limit | |
| contactPerson | No | Name of the primary contact person | |
| registrationNumber | No | Trade registry number (e.g., J40/1234/2020) | |
| defaultPaymentTermDays | No | Default payment term in days for invoices issued to this client |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare idempotentHint=true and destructiveHint=false, so the safety profile is already covered. The description's real contribution is the partial-update semantic ("All fields are optional — only the provided fields will be updated"), which is a meaningful behavioral trait beyond the structured fields. It omits what happens on an unknown UUID or whether the updated client is returned.
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, zero waste, with the target resource front-loaded and the key partial-update rule second. Nothing is redundant or padded.
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 26-parameter mutation the description covers the essentials an agent needs to call it, and the schema is fully documented. It does not address failure modes (invalid/unknown UUID, type conflicts between cnp and cui), nor what the call yields, which matters somewhat given there is no output 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?
Schema coverage is 100%, so every one of the 26 parameters carries its own description, including enum values and domain notes for status/creditLimit. The description adds only the global optionality rule and no field-level meaning beyond the schema, which is the correct baseline-3 outcome when the schema does the heavy lifting.
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+resource ("Update an existing client") and names the lookup key (UUID), so the agent knows exactly what the tool operates on. It doesn't explicitly contrast with siblings like clients_create or clients_get, but the 'existing' qualifier makes the update path 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?
Usage is only implied: 'existing client' versus creating a new one, and 'only the provided fields will be updated' hints that this is the tool for incremental edits. There is no explicit statement about when to prefer this over clients_create, clients_sync_invoices, or what to do when a field needs clearing rather than setting.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
clients_vies_lookupARead-onlyIdempotent
Validate a VAT code against the EU VIES system. Returns whether the VAT number is valid and the registered company name/address. Use this to verify EU intra-community VAT numbers before applying reverse charge.
| Name | Required | Description | Default |
|---|---|---|---|
| vatCode | Yes | Full EU VAT code including country prefix (e.g., DE123456789, FR12345678901) | |
| companyId | No | Company UUID override (uses active company if not set) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint and openWorldHint, so the safety profile is covered. The description adds value by saying what is returned (validity plus registered name/address) and that results come from an external system, but it does not disclose failure modes such as VIES being unavailable or unregistered numbers, which matter for an external lookup.
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 sentences, front-loaded with the action and followed by the return value and the use case. Nothing is redundant.
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 no output schema, the description correctly explains the return value (validity flag plus registered company details). It is nearly complete for a lookup tool; only external-service failure behavior is left implicit.
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%: vatCode format (country prefix, examples) and the companyId override are fully documented in the schema. The description adds no parameter-level information beyond that, so the baseline 3 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?
States a specific verb and resource ('Validate a VAT code against the EU VIES system'), and the mention of EU VIES implicitly distinguishes it from the Romanian ANAF siblings (anaf_validate_cif, clients_anaf_lookup). It never names a sibling explicitly, so it stops short of full differentiation.
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?
Gives a concrete use case ('verify EU intra-community VAT numbers before applying reverse charge'), which tells the agent when this tool is appropriate. It does not state when to prefer clients_anaf_lookup or anaf_validate_cif instead, leaving the EU-vs-national choice to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
companies_createA
Add a company or an individual person to the organization. Company: give the CIF (with or without RO); ANAF supplies name, address and VAT status. Individual person (persoană fizică, the landlord who files D212 / C168 as a person): type "individual" with the CNP, full name, city and county (address optional); nothing is fetched from ANAF and the CNP is checked (13 digits, control digit). Never invent a CNP.
| Name | Required | Description | Default |
|---|---|---|---|
| cif | No | Romanian tax identification number / CIF (e.g., "12345678" or "RO12345678") — companies only | |
| cnp | No | The person's CNP (13 digits) — individuals only | |
| city | No | City / localitate — individuals only (required) | |
| name | No | Full name — individuals only | |
| type | No | "individual" for an individual person identified by CNP (default company) | |
| No | |||
| phone | No | ||
| state | No | County / județ — individuals only (required) | |
| address | No | Street and number — individuals only | |
| country | No | ISO country, default RO |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations cover the safety profile (readOnly=false, destructive=false), and the description adds substantive behavior beyond them: ANAF enrichment supplies name/address/VAT for companies, nothing is fetched for individuals, and the CNP is validated with a 13-digit control-digit check plus a "Never invent a CNP" guardrail. It omits what happens on duplicate CIF/CNP or what the call returns, which keeps it off a 5.
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?
Dense but well partitioned: the company path, the individual path, and the validation warning each get their own clause. Slightly overloaded as a single paragraph, and the Romanian domain terms add reading cost, but every sentence carries 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 10-parameter creation tool with no output schema, the description covers both modes, required inputs, external lookups, validation rules and a safety caveat. Missing only return-value expectations and duplicate-handling behavior, which are minor relative to what is present.
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 80%, but the schema declares zero required parameters, so the description is what actually tells the agent that city and county are required for individuals, address is optional, and cif/cnp are mode-exclusive. That is genuine semantic value the structured fields do not provide.
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?
Opens with a specific verb and resource ("Add a company or an individual person to the organization") and immediately splits the tool into its two distinct operating modes. An agent can distinguish this from companies_get / companies_update / clients_create without opening the schema.
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 which data to supply under each mode (CIF for companies, type="individual" + CNP/name/city/county for persons) and what each mode does internally. It stops short of naming alternatives such as companies_update for existing records or clients_create for customers, so it lacks true when-not/alternative routing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
companies_deleteADestructiveIdempotent
Permanently delete a company and all associated data (invoices, clients, products, ANAF tokens). This triggers an asynchronous cascade deletion. Only Owner or Admin roles can delete companies. This action cannot be undone.
| Name | Required | Description | Default |
|---|---|---|---|
| uuid | Yes | Company UUID to delete |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the destructiveHint annotation, the description explains that deletion cascades asynchronously to specific associated entities and that the action cannot be undone. It also discloses the authorization constraint, giving an agent substantial behavioral context for a destructive 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 four short sentences, front-loads the permanent deletion and scope, then adds async behavior, role restriction, and irreversibility. Every sentence contributes useful decision or safety 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 destructive cascade-delete tool with a simple one-parameter schema and no output schema, the description covers what is deleted, async behavior, authorization requirements, and irreversibility. It is complete enough for an agent to call correctly and safely.
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 already documents the single uuid parameter at 100% coverage, including its meaning as the company UUID. The description adds no additional parameter-level syntax, format, or validation detail 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 states a specific verb and resource ("Permanently delete a company") and immediately scopes the impact with named associated data (invoices, clients, products, ANAF tokens). This clearly distinguishes it from siblings like companies_update or companies_delete_logo.
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 provides a clear prerequisite ("Only Owner or Admin roles can delete companies") and emphasizes the irreversible nature, which helps an agent decide when this tool is appropriate. However, it does not explicitly contrast with safer alternatives such as companies_set_active or list when deletion should be preferred.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
companies_delete_logoADestructiveIdempotent
Remove the logo from a company. PDFs will no longer include the company logo.
| Name | Required | Description | Default |
|---|---|---|---|
| uuid | Yes | Company UUID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true, idempotentHint=true, and readOnlyHint=false. The description adds real value beyond that by disclosing the downstream consequence: generated PDFs will stop including the company logo. It stops short of saying whether the old logo asset is recoverable or whether any error occurs when there is no logo.
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, zero waste, with the action stated first and the observable effect second. Nothing is padded or repeated from the title.
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 one-parameter delete operation with annotations covering the safety profile and no output schema, the description supplies the key consequence an agent needs. Minor gap: no note on behavior when the company has no logo or on failure modes.
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?
One parameter (uuid) with 100% schema description coverage ('Company UUID'), so the schema already carries the semantics. The description adds nothing about the identifier format or scoping, which is acceptable at baseline 3.
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?
States a specific verb+resource ('Remove the logo from a company') and pairs it with a concrete effect. It is clearly distinct from companies_upload_logo and companies_update, though it doesn't name the sibling explicitly.
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?
Usage is only implied — an agent can infer it applies when a company should no longer carry a logo, but there is no statement of prerequisites (permissions, ownership) or what to do if no logo exists. No alternative tool is referenced.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
companies_getARead-onlyIdempotent
Get detailed information for a specific company by UUID. Returns all configuration settings, bank info, sync settings, and ANAF token validity status.
| Name | Required | Description | Default |
|---|---|---|---|
| uuid | Yes | Company UUID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent and non-destructive, so safety is covered. The description adds real value beyond that by naming the returned content (configuration settings, bank info, sync settings, ANAF token validity), which an agent cannot get from annotations and which matters since there is no output 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, zero filler, with the operation and its scope front-loaded before the return-value summary.
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?
A simple read-only single-parameter tool whose annotations and schema are complete; the description sensibly fills the one remaining gap (what is returned) since no output schema exists. Marginally short of 5 only because it says nothing about failure behavior for an invalid or unauthorized UUID.
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?
Only parameter is uuid at 100% schema coverage, so per the rubric a baseline of 3 applies, but the description also adds that the UUID identifies a 'specific company' in the context of a multi-company account, giving the identifier a concrete frame of reference.
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?
States a specific verb ('Get') and resource ('detailed information for a specific company'), plus the lookup key (UUID). This clearly separates it from companies_list and the mutating siblings (companies_update, companies_delete), though it never names an alternative explicitly.
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?
Usage is only implied: an agent can infer you call this when you already have a company UUID and need its full record. There is no explicit when-to-use guidance, no mention of when to prefer companies_list or a related getter instead.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
companies_listARead-onlyIdempotent
List all companies belonging to the authenticated user's organization. Returns company details including CIF, addresses, bank info, sync settings, and ANAF token status. Use this to find company UUIDs for the companies_select tool.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the safety profile is covered by structured data. The description adds what the payload contains (CIF, addresses, bank info, sync settings, ANAF token status), which is real added value since there is no output schema. It doesn't mention pagination, ordering, or whether an empty organization returns an empty array.
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, each earning its place: what is listed, what comes back, and what to do with the result. The scope constraint is front-loaded before the return-field inventory.
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 no parameters and no output schema, the description carries the return-value burden and does so by enumerating the key fields and naming the UUIDs the agent will need downstream. Missing only edge-case behavior (empty result, ordering), which is minor for a zero-arg list.
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 tool takes zero parameters, so the baseline of 4 applies. The description correctly frames the implicit scoping (organization is derived from the authenticated user rather than passed in), which is the only semantic an agent needs here.
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?
States a specific verb and resource with explicit scope: 'List all companies belonging to the authenticated user's organization.' It also names a downstream sibling (companies_select), but doesn't contrast itself with companies_get, the other read sibling, which is the pair an agent is most likely to confuse.
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 final sentence gives a concrete use case and routes the agent to companies_select once UUIDs are known. There is no negative guidance (why to prefer this over companies_get, or that no filtering is possible), but the positive context is clear and actionable.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
companies_selectAIdempotent
Select the active company for the current session. This sets the X-Company header used by all subsequent invoice, client, product, and other company-scoped requests. Call companies_list first to find available company UUIDs.
| Name | Required | Description | Default |
|---|---|---|---|
| companyId | Yes | Company UUID to set as the active company for this session. All subsequent API calls will use this company context. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare readOnlyHint=false, idempotentHint=true and non-destructive but say nothing about scope or persistence; the description fills that gap by explaining the selection is session-scoped and changes the context of all subsequent company-scoped requests. Merge semantics versus a possible sibling are not covered.
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 sentences, front-loaded with the action and its effect, then the prerequisite. Nothing redundant.
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 one-parameter session-state tool with annotations and no output schema, the definition covers action, side effect, and prerequisite. The only meaningful omission is disambiguation from companies_set_active.
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 single parameter is fully documented, so the baseline is 3. The description adds value by naming the source of the UUID (companies_list), which the schema does not say.
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?
States a specific verb and resource ('Select the active company for the current session') and explains the concrete effect (sets the X-Company header for subsequent calls). It does not, however, distinguish itself from the very similar sibling companies_set_active, which an agent will see in the same namespace.
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?
Gives an explicit prerequisite sequence: call companies_list first to obtain available company UUIDs, then select one. That is real routing guidance, though it omits when to prefer this over companies_set_active.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
companies_set_activeAIdempotent
Set the organization-level active company by UUID. Calls PUT /api/v1/companies/{uuid}/set-active on the server and returns the updated list of all companies with the new active company reflected. Requires COMPANY_EDIT permission. Use companies_list first to find available company UUIDs.
| Name | Required | Description | Default |
|---|---|---|---|
| companyId | Yes | Company UUID to mark as the active company for the organization. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnlyHint=false, idempotentHint=true, destructiveHint=false), so the description's job is to add context, and it does: the underlying PUT endpoint, the COMPANY_EDIT permission requirement, and the fact that the response is the refreshed company list. It does not mention what happens to the previously active company or any side effects on other settings, which is a minor omission for a mutation.
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 the action and free of padding. The raw endpoint path is arguably filler for an agent that never calls the API directly, but it does not obstruct comprehension.
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 one parameter, no output schema, and annotations present, the description covers action, prerequisite, permission, and return shape, which is close to complete. The one real gap is the unresolved overlap with companies_select, which an agent needs resolved before choosing this 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?
Only one parameter and schema coverage is 100%, so the schema already explains companyId fully. The description restates 'by UUID' without adding format, sourcing, or error semantics beyond what the schema and the companies_list hint already convey.
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?
States a specific verb and resource with scope ('Set the organization-level active company by UUID'), which is far clearer than the name alone. However, it never distinguishes itself from the sibling tool companies_select, which an agent could easily confuse with this one.
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?
Gives a concrete prerequisite ('Use companies_list first to find available company UUIDs') and states the required permission, so an agent knows how to prepare a valid call. It stops short of saying when to prefer this over companies_select, so no explicit exclusions or alternatives are offered.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
companies_toggle_syncA
Toggle ANAF SPV / e-Factura synchronization on or off for a specific company. Calls POST /api/v1/companies/{uuid}/toggle-sync — flips the company's syncEnabled boolean. Requires COMPANY_EDIT permission. Enabling fails with 422 (messageKey ERR_SYNC_ENABLE_NO_TOKEN) when the company has no valid ANAF OAuth token; connect via anaf_create_token_link first. Returns { syncEnabled, message }. To enable on a fresh company, the recipe is: companies_list → anaf_create_token_link (open the URL, complete OAuth) → anaf_validate_cif → companies_toggle_sync.
| Name | Required | Description | Default |
|---|---|---|---|
| companyId | Yes | Company UUID. Use companies_list to find available UUIDs. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare the generic safety profile (not read-only, not idempotent, not destructive); the description adds the permission required (COMPANY_EDIT), the failure mode with the specific messageKey, and the return shape { syncEnabled, message }. This is context the agent cannot get from structured fields.
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?
Front-loaded with the action, then prerequisites, error behavior, and return shape — every sentence carries operational value. The closing recipe slightly repeats the earlier anaf_create_token_link mention, a minor redundancy that keeps it just short of a 5.
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 single-parameter mutation with no output schema, the description covers everything an agent needs: permission requirement, prerequisite token state, the specific error on failure, the returned fields, and the multi-step onboarding path. Nothing material is left to inference.
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 single companyId parameter is fully documented in the schema, including how to find the UUID via companies_list. The description adds no syntax or format detail beyond that, so the baseline 3 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?
States a specific verb and resource ('Toggle ANAF SPV / e-Factura synchronization on or off for a specific company') and names the exact endpoint and boolean flipped (syncEnabled). An agent can distinguish this from siblings like anaf_sync_trigger or anaf_sync_status without opening any schema.
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 names the prerequisite (valid ANAF OAuth token, otherwise 422 ERR_SYNC_ENABLE_NO_TOKEN) and the alternative to run first (anaf_create_token_link). It even gives the full ordering recipe for a fresh company: companies_list → anaf_create_token_link → anaf_validate_cif → companies_toggle_sync.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
companies_updateAIdempotent
Update configuration settings for a company. Note: core ANAF data (CIF, registration number, VAT status, official address) cannot be modified as they are synced from official ANAF sources. Only editable fields like contact info, bank details, and sync settings can be changed.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | Company display name | |
| uuid | Yes | Company UUID | |
| No | Contact email address | ||
| phone | No | Contact phone number | |
| bankBic | No | BIC/SWIFT code | |
| bankName | No | Bank name | |
| bankAccount | No | IBAN account number | |
| syncDaysBack | No | Number of days to sync back from ANAF (1-365) | |
| archiveEnabled | No | Enable automatic archiving | |
| enabledModules | No | Array of enabled module keys for sidebar visibility (null = all enabled). Valid keys: delivery_notes, receipts, proforma_invoices, recurring_invoices, reports, efactura, spv_messages | |
| defaultCurrency | No | Default currency code (e.g., "RON", "EUR") | |
| efacturaDelayHours | No | Hours to delay e-Factura sync (0-72) | |
| archiveRetentionYears | No | Years to retain archived data (1-50) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare the mutation is idempotent and non-destructive, so the description's real contribution is the ANAF-sync constraint that silently rejects edits to CIF, registration number, VAT status and official address - valuable and non-obvious. It does not disclose partial-update semantics (whether omitted fields are preserved or cleared) or permission requirements, which is the main remaining behavioral risk for a 13-param PATCH-style 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?
Two sentences, the mutation scope is stated first, and the constraining note follows immediately. No filler or restated title text.
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 mutation tool with no output schema, the description covers the critical unknown (which fields cannot be changed) but leaves partial-update behavior and the effect of the required uuid implicit. The missing piece is narrow rather than structural.
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 of the 12 editable parameters is already documented, and the description's grouping (contact info, bank details, sync settings) only loosely maps onto them. It never mentions name, defaultCurrency, enabledModules, or the archive parameters, so it adds little beyond the schema 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?
Names a specific verb (update) and resource (company configuration settings), which separates it from companies_get/create/delete. It also implicitly distinguishes itself from companies_toggle_sync and companies_set_active by scoping the change to configuration fields, though it never names those siblings.
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 note about which fields are immutable gives clear implied guidance on when this tool is appropriate, but there is no explicit routing to alternatives like companies_toggle_sync (enable/disable sync) or companies_set_active, which overlap with the 'sync settings' it claims to own.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
companies_upload_logoAIdempotent
Upload a logo image for a company. Accepts PNG, JPG, or SVG files up to 2MB. The logo appears on PDF documents (invoices, proformas, delivery notes, receipts).
| Name | Required | Description | Default |
|---|---|---|---|
| uuid | Yes | Company UUID | |
| filePath | Yes | Absolute path to the logo image file (PNG, JPG, or SVG) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare non-read-only, idempotent, non-destructive, closed-world behavior, so the bar is lower. The description still adds real value beyond that: accepted formats, a 2MB size ceiling, and the downstream effect that the image renders on invoices, proformas, delivery notes and receipts. It stops short of saying whether an existing logo is overwritten.
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 sentences, front-loaded with the action, then constraints, then the visible effect. No filler and nothing an agent must scroll past to reach the operative 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 two-parameter upload with full schema coverage and no output schema, the description covers formats, size, and outcome. The remaining gap is whether the file path is resolved on the client or the server, and whether an existing logo is replaced or errors out.
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 both parameters are already documented, and the format list partly duplicates the filePath description. The description does contribute the 2MB limit, which appears nowhere in the schema, making the constraint enforceable before a failed call.
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?
States a specific verb and resource ('Upload a logo image for a company'), which is unambiguous. It does not differentiate from the sibling companies_delete_logo or indicate that this replaces any existing logo, so the agent must infer the lifecycle relationship on its own.
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?
Usage is only implied by the purpose sentence; there is no explicit statement of when to call this versus companies_delete_logo, nor any prerequisite such as company ownership or permissions. The note about where the logo appears gives a hint of intent but is not guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
company_registry_citiesARead-onlyIdempotent
Get a list of cities for a given Romanian county. Optionally filter by city name. Useful for address auto-complete when creating clients or companies. Results are cached for 5 minutes.
| Name | Required | Description | Default |
|---|---|---|---|
| q | No | Optional search query to filter cities | |
| county | Yes | County code or name (e.g., "B" for Bucharest, "CJ" for Cluj) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations already declare readOnlyHint, idempotentHint, and destructiveHint=false, so the safety profile is covered. The description adds a genuinely useful behavioral detail beyond the annotations: 'Results are cached for 5 minutes,' which tells the agent about staleness and repeat-call behavior. It does not describe the response shape or ordering, keeping it at 4 rather than 5.
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 sentences, front-loaded with the core action and followed by the filter, use case, and caching note. Every sentence adds information an agent would act on, with no filler or repetition of the schema.
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, annotation-covered read-only lookup with full schema coverage and no output schema, the description is nearly complete: it covers the action, filter, use case, and caching. The only minor gap is that it does not indicate the shape or ordering of returned city entries, which an agent might want for auto-complete rendering.
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 both parameters are already documented in the schema, including the county code examples. The description reinforces that the name filter is optional and that the county is required, but adds no syntax, casing, or matching-rule details 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 opens with a specific verb and resource: 'Get a list of cities for a given Romanian county.' It also mentions the optional name filter, so an agent knows exactly what the tool returns. It does not explicitly differentiate from nearby siblings such as company_registry_search or anaf_nomenclator_localitati, which keeps it from a 5.
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 provides one concrete usage context — 'Useful for address auto-complete when creating clients or companies' — which implies when to reach for it. However, it gives no exclusions or alternatives, so an agent cannot tell from this text when to prefer company_registry_search, anaf_nomenclator_localitati, or clients_from_registry instead.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
company_registry_searchARead-onlyIdempotent
Search the Romanian company registry (ONRC) by company name. Returns matching companies with CUI, name, and registration details. Useful for finding a company before creating a client. Results are cached for 5 minutes.
| Name | Required | Description | Default |
|---|---|---|---|
| q | Yes | Search query (company name, minimum 2 characters) | |
| limit | No | Maximum results to return (default: 10) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint and destructiveHint=false, and the description adds genuinely new behavioral context: results are cached for 5 minutes and the returned fields are CUI, name and registration details. It stops short of describing empty-result or rate-limit 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?
Three short sentences, front-loaded with the verb and resource, then return values, then usage hint. No filler and no repetition of schema details.
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 only 2 fully described parameters and no output schema, the description covers what the tool does, what it returns, and a caching caveat, which is sufficient to call it correctly. A brief note on how it differs from the registry-based client creation path would close the last gap.
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 both q and limit are already documented with types, minimum length and default. The description restates that search is by company name but adds no syntax, matching behavior, or limit guidance beyond the schema, so the baseline 3 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?
States a specific verb and resource ('Search the Romanian company registry (ONRC) by company name') and enumerates the returned fields, so the agent knows exactly what it retrieves. It only partially differentiates from nearby siblings such as company_registry_cities or clients_from_registry, which are not named.
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 sentence 'Useful for finding a company before creating a client' implies the usage context, but there are no explicit when-not conditions and the very similar clients_from_registry sibling is never mentioned as an alternative.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
cpv_codes_searchARead-onlyIdempotent
Search CPV (Common Procurement Vocabulary) classification codes by code number or description. CPV codes are used in e-Transport declarations and public procurement. Returns matching codes with their descriptions.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum results to return (max 100, default: 30) | |
| search | Yes | Search query (CPV code number or description text) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, non-destructive and openWorldHint=false, so the safety profile is fully covered by structured data. The description adds only that matching codes come back with their descriptions; it does not disclose matching semantics, ordering, or that there is no persistence.
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 tight sentences, front-loaded with the action and resource, followed by domain context and the return shape. The return clause overlaps slightly with the first sentence's 'by code number or description' but nothing is wasteful.
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 lookup with no output schema and a fully documented two-parameter schema, the description covers what it does, what it returns, and why it matters. Only result ordering/capping behavior is left unexplained, which is minor.
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 both `search` and `limit` are already documented in the schema. The description merely restates that the query can be a code number or description text, adding little beyond what the schema says.
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?
States a specific verb (search) and resource (CPV classification codes), plus the two searchable fields (code number or description). The name is distinct from the plausible sibling nc_codes_search, but the description never explicitly says how it differs from that or from the various *_codes_list 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?
Domain context is provided ('used in e-Transport declarations and public procurement'), which implies when an agent would want this. However there is no explicit when-to-use vs nc_codes_search, no guidance on prefix vs substring matching, and no pointer to a follow-up tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
dashboard_statsARead-onlyIdempotent
Get comprehensive dashboard statistics for the selected company. Returns invoice counts (total, draft, issued, paid, overdue), revenue amounts (total revenue, VAT, paid, unpaid), monthly breakdown, top clients, top products, recent activity, and payment summary. Supports predefined periods (month, quarter, year) or custom date ranges.
| Name | Required | Description | Default |
|---|---|---|---|
| to | No | Custom end date (YYYY-MM-DD), used instead of period | |
| from | No | Custom start date (YYYY-MM-DD), used instead of period | |
| period | No | Predefined time period for statistics | |
| companyId | No | Company UUID (overrides configured default) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, destructiveHint=false, and openWorldHint=false, so safety is covered. The description adds real value beyond that by disclosing the concrete output payload, which matters because no output schema exists, and by explaining the period-versus-custom-range selection logic. It omits default-period behavior and any note on response size or performance of the multi-aggregate query.
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 the core purpose and followed by the payload enumeration and the date-mode rule; nothing is padded or redundant. The long comma-separated list of returned fields is dense but earns its place given the absence of an output schema.
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 no output schema, the description appropriately compensates by enumerating return contents, and it covers all four parameters and the company-scoping behavior. The one remaining gap is the undefined default when neither period nor from/to is supplied, which an agent would need to know before calling with zero arguments.
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 each of the four parameters individually documented including the enum for period and the 'used instead of period' precedence. The description restates the same period/range distinction without adding syntax, formatting, or precedence detail beyond what the schema already provides, so the baseline 3 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?
Uses a specific verb (Get) and resource (dashboard statistics) and enumerates the returned aggregates (invoice counts, revenue, monthly breakdown, top clients/products, recent activity, payment summary), so the agent knows exactly what this tool yields. It does not differentiate itself from nearby analytical siblings such as reports_sales_analysis, reports_vat, or dosare_stats, which the agent must infer from name alone.
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 establishes context ('for the selected company') and the two operating modes (predefined period vs custom from/to range), which implies when the tool applies. However, it never states when to prefer this over reports_sales_analysis or reports_vat, nor what happens when no period or dates are supplied despite all four parameters being optional.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
declaration_buildARead-onlyIdempotent
Build an ANAF declaration from plain JSON (schema from declaration_form_spec): Storno writes the XML, applies its own rules (required fields, address codes, quotas, postal code, tenant CNP …), does the arithmetic (D212: 20 % forfait, 10 % tax, CASS tiers on the minimum wage), validates it with ANAF's DUKIntegrator and, for C168, with ANAF's online validator behind the web form (the authoritative BR-C168 rules). Returns valid, xml, issues[{level: error|warning|info, code, field, message}] (info = computed amounts to explain to the user) and validation{duk, anafOnline}. Loop: fix issues → build again until valid=true, then declaration_pdf. Public, nothing stored, 60 requests/hour per IP.
| Name | Required | Description | Default |
|---|---|---|---|
| type | Yes | Form code, e.g. C168 | |
| input | Yes | The form input (see declaration_form_spec → input / example) | |
| online | No | Also run ANAF's online validator when available (default true) | |
| validate | No | Run the DUK validator (default true) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations cover the safety profile (readOnly, idempotent, non-destructive), and the description adds substantial extra context: what rules Storno applies, the arithmetic for D212, that C168 uses ANAF's authoritative online validator, that nothing is stored, and a 60 req/hour per IP rate limit. It also describes the exact return shape (valid, xml, issues[], validation{duk, anafOnline}) in the absence of an output 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?
Front-loaded with the core action and the loop instruction is clearly placed at the end. It is dense and packed with parenthetical detail (D212 percentages, CASS tiers) that is helpful but borders on verbose for a single sentence block.
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 no output schema, the description fully specifies the return shape and issue levels, names the prerequisite (declaration_form_spec) and the follow-on (declaration_pdf), and discloses rate limits and statelessness. Nothing an agent needs to invoke it correctly is missing.
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, but the description adds meaning: it explains that `input` is plain JSON shaped by declaration_form_spec, that `online` triggers ANAF's authoritative C168 rules, and that validation is two-stage (DUK vs ANAF online). That goes beyond the one-line schema hints.
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?
States a specific verb+resource: 'Build an ANAF declaration from plain JSON', and immediately points to declaration_form_spec for the input schema. This distinguishes it from sibling tools like declaration_validate_xml (existing XML) and declarations_submit (filing). An agent can tell exactly what this does without opening the schema.
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?
Gives a clear workflow: build → fix issues → rebuild until valid=true → declaration_pdf, and names declaration_form_spec as the source of input shape. It stops short of explicitly contrasting with declaration_validate_xml or declarations_create/submit, so alternatives are implied rather than stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
declaration_formsARead-onlyIdempotent
ANAF declaration forms Storno can build from plain JSON for you (today: C168 rent contract registration/amendment/termination, D212 Declarația unică for rent income with tax and CASS computed). Returns type, title and description of each form. Public, no account.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover read-only, idempotent, non-destructive, closed-world. The description adds genuinely new context: the current coverage is limited to C168 and D212 (an important expectation-setter), it is public with no account required, and it returns three fields per item. It does not mention ordering, pagination, or failure modes, but for a tiny static catalog that is minor.
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 sentences, front-loaded with the resource and immediately qualified by concrete form examples and the return fields. The only weakness is the awkward opener ("forms Storno can build from plain JSON for you"), which spends words on product voice rather than agent-relevant 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 parameterless, read-only listing with no output schema, the definition supplies what is needed: what is listed, which forms currently exist, what fields come back, and that no auth is needed. An explicit pointer to the build/spec siblings would close the remaining gap.
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?
Zero parameters, so baseline is 4. The description does not need to explain inputs and correctly focuses on output content instead.
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?
Identifies the resource (ANAF declaration forms the product can build) and states the return shape (type, title, description per form), which marks it as a catalog/discovery tool. It is distinguishable from siblings like declaration_build or declaration_form_spec, though the opening sentence is a fragment ("ANAF declaration forms Storno can build from plain JSON for you") that reads as marketing rather than a verb-led statement.
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?
Use is only implied: an agent can infer this is the entry point to discover which forms are buildable before calling declaration_build or declaration_form_spec. No sibling is named, no when-not condition, and no statement of what to do with the returned types is given.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
declaration_form_specARead-onlyIdempotent
Everything needed to fill an ANAF declaration form correctly: the JSON input schema Storno expects (fields, required/optional, codes and their meaning, hints), how it maps to the ANAF XML (namespace, every XSD attribute with type and constraints), the business rules ANAF enforces (including the web-form rules the DUK validator misses, e.g. BR-C168-00991/0041/005911), the filing steps and a complete example. Read it before declaration_build. C168 addresses need the codes from anaf_nomenclator_*; never invent CNPs or CUIs.
| Name | Required | Description | Default |
|---|---|---|---|
| xsd | No | true → return the raw ANAF XSD instead of the spec | |
| type | Yes | Form code, e.g. C168 |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/non-destructive, so the safety bar is low and the description correctly doesn't restate it. It adds genuine value by disclosing the scope and depth of the payload, including that it surfaces web-form rules the DUK validator misses (citing rule IDs BR-C168-00991/0041/005911), which tells the agent this is authoritative reference material rather than a summary.
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?
Front-loaded with the main claim, then a dense but purposeful enumeration of what the spec contains, followed by two short action sentences. The single long sentence is packed but every clause carries distinct information; nothing is 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?
There is no output schema, so the description bears the burden of describing the return, and it does enumerate the constituents well (schema, XML mapping, business rules, filing steps, example). It could go further on size/structure of the returned document, but for a reference-lookup tool an agent has enough to call 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 description coverage is 100% and both parameters (type, xsd) are already documented in the schema. The description adds no parameter-level detail — notably it never explains the xsd=true branch that switches the return to the raw ANAF XSD, leaving that entirely to 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?
States a specific verb and resource: it returns the complete specification needed to fill an ANAF declaration form. It enumerates the concrete payload (JSON input schema, XSD attribute mapping, business rules, filing steps, example) and names the target consumer (declaration_build), so it is unmistakable against siblings like declaration_forms or declaration_form_versions.
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?
Explicit ordering instruction: 'Read it before declaration_build.' It also states a prerequisite for C168 addresses (codes must come from anaf_nomenclator_*) and a prohibition (never invent CNPs or CUIs), naming the sibling tools to use instead.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
declaration_form_versionsARead-onlyIdempotent
ANAF's current version of every declaration form (validator J and PDF P) as DUKIntegrator's own manifest lists them, with what changed lately (changedRecently: forms Storno builds that changed in the last 30 days) and whether this Storno installation's validators lag behind ANAF (localOutdated). Check it before building or filing when a rejection mentions the form version. Public, no account.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish that this is a safe, read-only, idempotent lookup. The description adds meaningful behavioral context beyond that: it discloses that results include DUKIntegrator's manifest view, changedRecently over the last 30 days, localOutdated status, and that the endpoint is public with no account needed.
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 compact and front-loads the core purpose before explaining the derived fields and usage trigger. The parenthetical explanation is dense but each clause adds concrete meaning about the response.
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 no input parameters and no output schema, the description carries the burden of explaining what is returned. It names the key response concepts and the practical decision it supports, though it does not describe the overall response shape or any pagination/format 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?
This tool has zero parameters, so there is no parameter semantics burden. The description correctly does not discuss inputs, matching the empty 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 states a specific resource and scope: 'ANAF's current version of every declaration form (validator J and PDF P)' as listed by DUKIntegrator's manifest. It also distinguishes the payload by naming the included derived fields, so an agent can tell this apart from related tools like declaration_forms and declaration_form_spec.
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 gives a clear usage trigger: 'Check it before building or filing when a rejection mentions the form version.' It does not explicitly compare this against sibling tools such as declaration_forms or declaration_form_spec, so it stops short of full alternative routing guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
declaration_pdfARead-onlyIdempotent
Produce the PDF ANAF accepts for upload: DUKIntegrator renders the validated XML into ANAF's PDF form with the XML embedded and, where required (C168), a zip of attachments embedded (the scanned contract for a registration, the addendum for an amendment, the termination document or the landlord's sworn statement — document_generate — for a termination). Pass local file paths in attachmentPaths and/or base64 attachments (PDF, JPG, PNG, TIFF; 10 MB total). With outFile the PDF is written locally, ready for agent_submit_declaration_pdf (qualified certificate) or manual upload in SPV. Public, nothing stored.
| Name | Required | Description | Default |
|---|---|---|---|
| xml | Yes | The validated declaration XML from declaration_build | |
| type | Yes | Form code, e.g. C168 | |
| outFile | No | Path where the PDF is written; when omitted the response carries pdfBase64 | |
| attachments | No | ||
| attachmentPaths | No | Local files to put in the zip |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations cover the safety profile (readOnly, non-destructive, idempotent, closed-world) and the description adds genuine operational context: which attachments are required per case (registration contract, amendment addendum, termination document or sworn statement), accepted formats, a 10 MB total cap, where the file lands when outFile is set, and that nothing is stored server-side.
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?
Front-loaded with the outcome ('Produce the PDF ANAF accepts'), then constraints, then next steps. The embedded parentheticals are dense but each carries decision-relevant detail (which document type satisfies which filing), so little could be cut without losing guidance.
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 exists, yet the description explains both return modes (pdfBase64 in the response, or a written outFile) and the success handoff to submission. For a 5-parameter tool with two required inputs, nothing an agent needs to call it correctly is missing.
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 80%, and the description still adds meaning by distinguishing the two attachment channels (local file paths in attachmentPaths vs base64 attachments) and by stating the aggregate size limit and permitted MIME types that the schema does not encode. It repeats that outFile causes a local write rather than adding new detail there.
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?
States a concrete verb and artifact: renders the validated XML into the exact PDF form ANAF accepts, with the XML (and for C168 a zip of attachments) embedded. It is clearly distinguishable from declarations_download_pdf, invoices_pdf and receipt PDF tools because it names DUKIntegrator and ANAF's upload form as the target.
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?
Gives strong downstream context: with outFile the output is ready for agent_submit_declaration_pdf (qualified certificate) or manual SPV upload, and it names document_generate as the source of the sworn statement for a termination. It never explicitly contrasts itself with sibling PDF/declaration tools, so the when-not path is implicit rather than stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
declarations_agent_resultA
Submit the ANAF response received via the local agent back to the server. The server parses the response, extracts the upload ID, sets status to PROCESSING, and dispatches status checking.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Declaration UUID | |
| body | Yes | Response body from ANAF | |
| headers | No | Response headers from ANAF | |
| companyId | No | Company UUID (overrides STORNO_COMPANY_ID env var) | |
| statusCode | Yes | HTTP status code from ANAF response |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare readOnlyHint=false and destructiveHint=false but say nothing about state transitions; the description fills exactly that gap by disclosing that the server parses the payload, extracts an upload ID, flips status to PROCESSING and starts status polling. That is real side-effect disclosure beyond the structured fields. It omits error/retry behavior, which matters given idempotentHint=false.
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 and zero filler: the action first, then the chain of server effects. Nothing repeats the tool name or the schema, and the pipeline narrative is front-loaded where an agent will read it.
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 state-mutating tool with no output schema, the description covers the essential invisible work (parse, extract ID, set PROCESSING, dispatch polling). What is missing is what the caller receives back and what happens on a malformed body, given the tool is non-idempotent.
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 all five parameters (id, statusCode, body, headers, companyId) are already documented in the schema. The description adds no parameter-level meaning, such as which fields are actually parsed for the upload ID. Baseline 3 is correct when the schema does the work.
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?
Specific verb ('Submit') plus a clearly scoped resource ('the ANAF response received via the local agent') and the server-side consequences. An agent can tell this is the callback half of an agent round-trip, distinct from declarations_file_via_agent (outbound) and declarations_get (read). It stops short of naming the siblings it differs from.
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 phrase 'received via the local agent' implies this is called after the local agent has the ANAF response, so usage is inferable. But there is no explicit trigger condition, no statement of what to do if the agent call fails, and no pointer to the related siblings (spv_sync_agent_result, spv_request_agent_result) that share this pattern.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
declarations_createA
Create a new tax declaration. VAT and payroll types (d394, d300, d390, d100, d112) are auto-populated from the company's invoices for the period; so are 'd301' (decont special de TVA for companies not registered for VAT: purchases from abroad with self-assessed VAT, monthly) and 'd398' (OSS / regimul UE: sales to consumers in other member states — invoices typed special-regime art. 314-315, plus untyped invoices that charge VAT to a non-VAT-registered EU buyer; amounts in EUR at the quarter-end ECB rate; quarterly, any month of the quarter) and 'd406' (SAF-T: the whole audit file — header, accounts, customers / suppliers, tax codes, the ledger derived from the documents and the source documents — for the company's VAT period, periodType monthly or quarterly). Form-based types are filled from plain JSON: 'd212' (Declarația unică, rent income; month 12) and 'c168' (rental contract registration/amendment/termination; month 12) take data.input in the shape of declaration_form_spec, and c168 needs data.attachments [{name, contentBase64}] (the scanned contract / termination document) for the PDF. Then declarations_validate → declarations_file_via_agent.
| Name | Required | Description | Default |
|---|---|---|---|
| data | No | For d212 / c168: { input: <form input>, attachments?: [{name, contentBase64}] }. Responses return attachments as {name, size, mime, stored} without the content; sending that shape back keeps the stored files | |
| type | Yes | Declaration type | |
| year | Yes | Declaration year (e.g. 2026) | |
| month | Yes | Declaration month (1–12) | |
| dosarId | No | Attach the new declaration to this dosar | |
| companyId | No | Company UUID (overrides STORNO_COMPANY_ID env var) | |
| periodType | No | Period type (default: "monthly") |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare this is a non-idempotent, non-destructive write, so the safety profile is covered. The description adds real behavioral context beyond that: declarations are auto-derived from the company's invoices, d398 converts amounts at the quarter-end ECB rate, d406 assembles the full SAF-T audit file, and c168 requires scanned attachments for the PDF. It does not say whether the created declaration is a draft or what happens on duplicate creation (relevant given idempotentHint=false).
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 purpose is front-loaded, but the remainder is one enormous semicolon-chained sentence with deeply nested parentheses, which is hard to scan and makes per-type facts difficult to locate. Every clause carries information, so the problem is structure rather than padding.
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 7-parameter, nested-object, mutation tool with no output schema, the description covers per-type sourcing behavior, the `data` shape for form types, and the downstream workflow. It omits what the call returns (an ID? a draft object?) and any duplicate/error behavior, which matters for a non-idempotent create.
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's `type` enum carries only "Declaration type," and the description supplies the missing semantics for every value: which are auto-populated from invoices, which are form-based and need `data.input`, and which need `data.attachments`. It also adds period constraints the schema lacks (d212/c168 use month 12, d398 is quarterly but accepts any month of the quarter, d406 uses `periodType` monthly or quarterly).
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?
States a specific verb and resource ("Create a new tax declaration") and immediately scopes it by enumerating every supported declaration type. An agent can distinguish this creator tool from declarations_prepare, declarations_build, or dosare_d212_create by the type list alone.
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?
Ends with an explicit workflow handoff: "Then declarations_validate → declarations_file_via_agent," which tells the agent what to do after creation. It also splits types into auto-populated vs. form-based, implicitly telling the agent which path to take. It never explicitly excludes the overlapping siblings (dosare_d212_create, dosare_c168_create, declaration_build), so the when-not is missing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
declarations_deleteADestructiveIdempotent
Soft-delete a tax declaration. Cannot delete accepted declarations.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Declaration UUID to delete | |
| companyId | No | Company UUID (overrides STORNO_COMPANY_ID env var) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare destructiveHint=true, which alone would suggest permanent removal; the description adds the crucial correction that this is a soft delete, plus a state-based precondition. That is genuine context beyond the structured fields, though it omits whether a restore path exists and any permission/company-scoping implications.
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, the core action and its nature first, then the blocking condition. No filler or repetition of the title.
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 two-parameter destructive tool with full schema coverage and annotations, the description covers what is deleted, the soft-delete nature, and the key precondition. A note on recoverability or the company-scoping effect of companyId would close the remaining gap.
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 described, including the env-var override behavior for companyId, so the description need not compensate. It adds no meaning about the id parameter beyond what the schema already states; baseline 3 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?
"Soft-delete a tax declaration" gives a specific verb plus resource, and "soft-delete" is more precise than the tool name alone since it signals the record is not physically removed. It does not explicitly contrast with other deletion siblings (e.g., dosare_delete, invoices_delete), so it stops short of full sibling differentiation.
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?
"Cannot delete accepted declarations" is an explicit when-not condition that prevents a predictable failed call. It names no alternative route (e.g., what to do instead with an accepted declaration), so context is clear but exclusions-to-alternatives mapping is absent.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
declarations_download_pdfARead-onlyIdempotent
The PDF ANAF accepts for this declaration (DUKIntegrator's form with the XML embedded and, for C168, the attachment zip), generated on demand from the current data. Use it when the user files by hand: they upload this file in SPV (persoane fizice: SPV → Depunere declarații) or on the e-guvernare portal with their own certificate. Written to outFile. Storno's rules and ANAF's validator run first; errors come back instead of a broken file.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Declaration UUID | |
| outFile | Yes | Where to write the PDF | |
| refresh | No | Regenerate even if a PDF was already produced (drafts only) | |
| companyId | No | Company UUID (overrides STORNO_COMPANY_ID env var) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, non-destructive, closed-world. The description adds meaningful context beyond that: generation happens from current data, Storno rules and ANAF validation run first, and errors are returned instead of a broken file. That failure-mode disclosure is exactly what an agent needs for a file-producing 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?
Four dense sentences, front-loaded with what the file is, then when to use it, then where it lands, then validation behavior. Every sentence contributes, though the parenthetical file-format aside and portal navigation detail make it slightly heavier than strictly necessary.
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 no output schema, the description correctly explains the return contract: a file written to outFile, or errors instead of a file when validation fails. Combined with the annotation safety profile, an agent has enough to invoke it correctly; only the sibling disambiguation is thin.
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 all four parameters are already documented. The description restates that output goes to outFile but adds no syntax, path conventions, or refresh semantics beyond what the schema provides. Baseline 3 applies when the schema carries the parameter burden.
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 precisely identifies the artifact: the ANAF-accepted PDF with embedded XML (plus attachment zip for C168), generated on demand. That is far more specific than the tool name alone. It does not explicitly contrast with close siblings like declarations_download_xml or declaration_pdf, leaving some ambiguity about which artifact-producing tool to pick.
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 gives a clear use case — the user files by hand and uploads the file in SPV or on the e-guvernare portal with their own certificate. That implicitly excludes the electronic-submission path (declarations_submit / agent), but no alternative tool is named explicitly.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
declarations_download_xmlBRead-onlyIdempotent
Download the generated XML for a tax declaration. Returns the raw XML content.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Declaration UUID | |
| companyId | No | Company UUID (overrides STORNO_COMPANY_ID env var) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, destructiveHint=false and closed-world behavior, so the safety profile is covered. The description contributes the fact that it returns raw XML content (useful since there is no output schema), but says nothing about auth requirements or behavior when the XML has not yet been generated.
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, front-loaded with the action and resource, with the second sentence delivering the output-format detail. 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?
A simple read-only tool with full schema coverage, annotations, and an explicit return-format statement — enough to call correctly. Minor gap: no mention of failure behavior if the XML does not exist or how the raw content is delivered.
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 both parameters (id, companyId) are fully documented in the schema. The description adds no meaning beyond that, which is acceptable at the baseline for fully-covered schemas.
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?
States a specific verb (download) and resource (generated XML for a tax declaration) and clarifies the return format. It is distinguishable from declarations_download_pdf by the XML vs PDF payload, but the description never explicitly names or contrasts the sibling 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 phrase 'generated XML' implies a declaration must already have been built, but there is no explicit when-to-use guidance, no prerequisites, and no mention of alternatives such as declarations_download_pdf or declarations_get.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
declarations_file_via_agentA
File a declaration at ANAF in one call, the way the web app does: Storno prepares the XML and the DUK PDF (with the attachment zip for c168), the local Storno Agent signs it with the qualified certificate and uploads it to the e-guvernare portal, and Storno records ANAF's upload index (status processing; the recipisa arrives in the SPV inbox and in the dosar). Needs the agent on this computer and the PIN (pin, STORNO_AGENT_PIN, or the PIN remembered on this computer by the agent). Check declarations_validate first. Remember: one C168 per landlord and period in processing at a time.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Declaration UUID | |
| pin | No | Token PIN; defaults to STORNO_AGENT_PIN, or to the PIN the agent remembers for this certificate | |
| companyId | No | Company UUID (overrides STORNO_COMPANY_ID env var) | |
| certificateId | Yes | Certificate id from agent_certificates |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already disclose non-readonly, open-world, non-idempotent, non-destructive behavior, but the description adds substantial context beyond them: what Storno prepares, that the local agent signs and uploads, how the PIN is resolved, that status becomes processing, and where the recipisa arrives.
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 front-loaded with the main action and follows with relevant operational details. It is dense but mostly earns its length; phrases like 'the way the web app does' are slightly decorative but still orient the agent.
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 no output schema, the description is sufficiently complete: it explains what happens during the call, prerequisite steps, PIN sources, local agent requirement, status behavior, and the C168 processing constraint. An agent can call it correctly without additional 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 the schema already documents all four parameters. The description adds only limited extra meaning, mainly reiterating PIN resolution sources, while not elaborating on id or certificateId 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 states a specific verb and resource ('File a declaration at ANAF') and clearly explains the end-to-end one-call behavior: XML/PDF preparation, local agent signing, e-guvernare upload, and index recording. This distinguishes it from siblings such as declarations_submit, declarations_upload, or agent_submit_declaration_pdf.
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 gives explicit prerequisites ('Check declarations_validate first', needs the local agent and PIN) and a key operational constraint ('one C168 per landlord and period in processing at a time'). It does not explicitly name an alternative tool for when the local agent is unavailable, so it stops short of full when/when-not guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
declarations_getARead-onlyIdempotent
Get a single tax declaration by UUID. Returns full declaration details including populated data, status, metadata, and error messages.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Declaration UUID | |
| companyId | No | Company UUID (overrides STORNO_COMPANY_ID env var) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/non-destructive, so the safety profile is covered. The description adds real value by enumerating what the response contains (populated data, status, metadata, error messages), which matters since no output schema exists.
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 tight sentences: the operation is front-loaded, and the second sentence covers the return payload with 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?
With no output schema, the description compensates by listing the returned fields, and annotations cover the safety profile. Only the companyId override behavior is left to the 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?
Schema coverage is 100% and both parameters (id, companyId override) are documented in the schema. The description mentions the UUID lookup but adds no extra semantics, so the baseline 3 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?
States a specific verb (Get) and resource (single tax declaration) plus the key (UUID). It is clearly distinguishable from declarations_list, though it never names that sibling explicitly.
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 get-by-UUID pattern implies usage, but there is no explicit guidance on when to use this versus declarations_list or dosare_get, and no prerequisites (auth, company scoping) are stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
declarations_listARead-onlyIdempotent
List tax declarations for the active company. Supports filtering by type, status, year, and month. Returns paginated list of declarations with their status and period.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | Page number (default: 1) | |
| type | No | Declaration type filter | |
| year | No | Year filter (e.g. 2026) | |
| limit | No | Items per page (default: 10, max: 20) | |
| month | No | Month filter (1–12) | |
| status | No | Status filter | |
| companyId | No | Company UUID (overrides STORNO_COMPANY_ID env var) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations already declare read-only, idempotent, non-destructive behavior. The description adds useful context: it scopes results to the active company and discloses that results are paginated and include status and period. It does not detail permissions or pagination metadata, but the annotation coverage lowers the burden.
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 concise sentences and is front-loaded with the core purpose. Every sentence adds useful information about scope, filtering, and return shape.
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 adequately explains that it returns a paginated list containing status and period. Combined with the fully documented input schema and safety annotations, an agent has enough information to invoke 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 description coverage is 100%, so the schema already fully documents all seven parameters, including enums for type and status and ranges for year and month. The description names the main filters but does not add significant 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 uses a specific verb and resource: 'List tax declarations for the active company.' It also states the supported filters and return shape, which clearly distinguishes it from declaration detail tools like declarations_get.
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 usage is implied by 'List tax declarations' and the mentioned filters, but there is no explicit guidance on when to use this tool versus alternatives such as declarations_get or other declaration search/export tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
declarations_prepareA
Prepare a declaration for agent-based submission. Returns XML content, ANAF URL, Bearer token, and CIF needed by the local agent to proxy the mTLS request. Use operation param for different flows: submit (default), listMessages, download.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Declaration UUID | |
| companyId | No | Company UUID (overrides STORNO_COMPANY_ID env var) | |
| operation | No | Operation type (default: submit) | |
| downloadId | No | ANAF download ID (required for operation=download) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare non-read-only, non-destructive behavior. The description adds meaningful context beyond that: it returns XML content, an ANAF URL, a Bearer token, and CIF for a local agent to proxy an mTLS request, which is important behavioral and security 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 three tightly written sentences. The primary purpose is front-loaded, the return behavior follows, and the operation guidance closes without 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?
With no output schema, the description explains the key return values and the local-agent workflow. Combined with complete schema coverage, an agent has enough to invoke it, though the lack of explicit sibling routing leaves a small gap.
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 schema already documents all four parameters. The description reinforces the operation parameter and its default, but adds no substantial detail beyond the schema for id, companyId, or downloadId.
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 states a specific verb and resource: prepare a declaration for agent-based submission. It also clarifies the return payload and local-agent mTLS proxy role, which distinguishes it from generic declaration tools, though it does not explicitly name sibling alternatives such as declarations_submit.
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 implied usage via 'agent-based submission' and explains the operation variants. However, it does not state when to choose this tool over declarations_submit, declarations_file_via_agent, or declarations_agent_result.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
declarations_recalculateAIdempotent
Recalculate a draft declaration by re-populating its data from current invoices. Only works on declarations in "draft" status.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Declaration UUID to recalculate | |
| companyId | No | Company UUID (overrides STORNO_COMPANY_ID env var) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false, idempotentHint=true and destructiveHint=false; the description adds the crucial detail that the operation overwrites the draft's data from current invoices, which implies manual edits can be lost. It does not state what happens when the declaration is not in draft (error vs no-op) or what the response contains.
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, front-loaded with the action and effect, followed immediately by the constraint. Nothing redundant or padded.
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 two-parameter mutation with annotations covering safety and idempotency and no output schema, the description gives enough to call it correctly. The main remaining gap is failure behavior on non-draft declarations and whether the recalculation is a full replace of draft contents.
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 both parameters (id, companyId) are documented in the schema, so the schema carries the parameter burden. The description adds no meaning beyond it — it does not explain the companyId env-var override semantics or UUID expectations.
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?
States a specific verb (recalculate) and resource (draft declaration) plus the mechanism (re-populating data from current invoices), which meaningfully separates it from siblings like declarations_sync or declarations_refresh_statuses. It does not name any sibling explicitly, so it stops short of the top score.
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 precondition "Only works on declarations in 'draft' status" is an explicit when-not rule that prevents wasted calls. However, with many adjacent declaration tools (declarations_sync, declarations_prepare, declarations_validate), no alternative is named for declarations in other statuses or for different refresh semantics.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
declarations_refresh_statusesA
RETIRED server-side status refresh: answers 409 AGENT_REQUIRED because ANAF SPVWS2 requires the qualified certificate (mTLS). Refresh statuses from the web app through the local storno-agent.
| Name | Required | Description | Default |
|---|---|---|---|
| companyId | No | Company UUID (overrides STORNO_COMPANY_ID env var) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Adds crucial behavior beyond the annotations: the call is retired, will return 409 AGENT_REQUIRED, and fails because ANAF SPVWS2 requires the qualified certificate over mTLS. This prevents wasted attempts and explains the exact failure mode.
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 compact sentences with 'RETIRED' front-loaded so the agent learns the critical constraint immediately. No wasted text.
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?
Complete enough for a non-functional stub: it explains why it fails and the general alternative path. Naming the precise agent-based sibling tool would make it fully actionable.
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 single optional companyId parameter is already documented there. The description adds no parameter-specific meaning, so the baseline 3 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?
States a specific verb and resource ('refresh statuses') and immediately discloses that the server-side implementation is RETIRED and always answers 409 AGENT_REQUIRED. It does not name the exact sibling agent tool to use instead, which keeps it from a 5.
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 tells the agent not to use this server-side path and points to the web app via the local storno-agent. The exclusion is clear, but the specific MCP tool or workflow to invoke is left implicit among many agent-related siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
declarations_submitA
Submit a declaration to ANAF. Generates XML, uploads to ANAF SPV, and begins async status polling. Works on "draft" or "validated" declarations.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Declaration UUID to submit | |
| companyId | No | Company UUID (overrides STORNO_COMPANY_ID env var) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare openWorld and non-idempotent, but the description adds substantive context beyond them: the tool generates XML, pushes to an external SPV endpoint, and starts async status polling — telling the agent the operation has external side effects and continues after return. It does not cover failure handling or whether it can be re-run safely.
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 sentences, action verb first, pipeline mechanics second, precondition last. No filler or repetition of the tool name.
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 exists, so the description should say what the agent gets back and what to do next after the async polling begins (e.g. poll declarations_refresh_statuses or anaf_declaration_status). It hints at async behavior but leaves the follow-up and return value 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 description coverage is 100% for both parameters (id, companyId), so the schema already carries the parameter semantics including the env-var override. The description adds nothing about parameters, which is baseline-acceptable here.
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?
Names a specific verb and resource ('Submit a declaration to ANAF') and enumerates the pipeline steps (XML generation, SPV upload, async polling), which separates it from bare helpers like declarations_validate or declarations_upload. It still doesn't name a sibling explicitly, so the boundary with declarations_prepare/declarations_upload must be inferred.
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 sentence 'Works on "draft" or "validated" declarations' gives a real precondition for use, which is useful. There is no guidance on when not to use it or which alternative to pick (e.g. declarations_upload for a manual file push), so usage is implied rather than stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
declarations_syncA
RETIRED server-side sync: ANAF SPVWS2 accepts only the qualified certificate (mTLS), so this endpoint now answers 409 AGENT_REQUIRED. Declarations and SPV messages are pulled through the local storno-agent from the web app (declarations page or the SPV documents page); the tools spv_sync_prepare / spv_sync_agent_result cover the same flow for automation.
| Name | Required | Description | Default |
|---|---|---|---|
| year | Yes | Year to sync declarations for (e.g. 2026) | |
| companyId | No | Company UUID (overrides STORNO_COMPANY_ID env var) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Discloses behavior beyond the annotations: the reason for retirement (SPVWS2 requires a qualified certificate over mTLS, which the server cannot supply), the concrete failure mode (409 AGENT_REQUIRED), and the replacement path. Annotations (readOnlyHint=false, openWorldHint=true) are now stale and give no hint of this, so the description carries the needed load well.
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 tight sentences, retired status front-loaded before the explanation and the redirect. Nothing is redundant and no sentence could be dropped without losing routing 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 deprecated two-parameter endpoint with no output schema, everything an agent needs is present: why it fails, what it returns, and exactly which tools replace it. A caller cannot misuse it after reading this.
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% (year and companyId are fully documented inline), so the baseline is 3. The description adds nothing about parameters, though in fairness they are moot for a retired endpoint that always returns 409.
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?
Opens with 'RETIRED server-side sync' and names the exact resource (declarations and SPV messages), then states the current observable behavior: HTTP 409 AGENT_REQUIRED. An agent can tell instantly that this tool no longer performs the action its name implies, which no sibling name would reveal.
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 redirects: pull via the local storno-agent from the web app, and use spv_sync_prepare / spv_sync_agent_result for automation. That is a direct when-not-to-use plus named alternatives, the strongest form of routing guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
declarations_updateAIdempotent
Update a draft declaration: data (for d212 / c168 the form input under data.input and attachments under data.attachments) and/or metadata. Only drafts can be edited. With filedExternally (any status but submitted/accepted) Storno records a filing made outside it and follows its state.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Declaration UUID | |
| data | No | ||
| metadata | No | ||
| companyId | No | Company UUID (overrides STORNO_COMPANY_ID env var) | |
| filedExternally | No | The declaration was filed outside Storno (portal by hand, another program, at the counter): Storno records ANAF's number and follows its state on StareD112; ghiseu: true when the number is the counter registration number |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark it as non-read-only, idempotent and non-destructive; the description adds the important constraint that editing is limited to drafts and discloses a real side effect — with `filedExternally` Storno records an external filing and tracks its state on StareD112. That is behavior an agent could not infer from 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 dense sentences, front-loaded with the action and the editable fields, followed by the status constraint and the external-filing exception. No filler; every clause carries a rule the agent needs.
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 5-parameter mutation tool with no output schema, the description covers the mutable payload, the draft precondition, and the external-filing side effect. It does not say whether omitted fields are preserved or how the response reports the new state, which is the main remaining gap.
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 60%, and the description compensates by explaining the shape of `data` (form input under data.input, attachments under data.attachments for d212/c168) and by spelling out the `filedExternally` index/ghiseu semantics. `metadata` and `companyId` remain thin, but the two opaque parameters are covered well.
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?
States a specific verb and resource ('Update a draft declaration') and immediately scopes the editable surface to `data` and/or `metadata`, which distinguishes it from declarations_create and declarations_submit. It does not name a sibling explicitly, but the draft-only constraint effectively separates it from the submit/validate 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?
Explicitly states 'Only drafts can be edited', which is the key precondition an agent needs, and clarifies that `filedExternally` is valid in any status but submitted/accepted. No named alternatives, but the usage envelope is unambiguous.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
declarations_uploadA
Bring a declaration made in another program into Storno: an XML file, or the ANAF PDF produced by SAGA / DUKIntegrator / the filled ANAF form (Storno reads the XML embedded in it). Type, year and month come from the document. The uploaded document is what gets validated (declarations_validate) and filed (declarations_file_via_agent) — nothing is regenerated. The recipisa lands in the dosar like any other filing.
| Name | Required | Description | Default |
|---|---|---|---|
| filePath | Yes | Local path of the .xml or .pdf file | |
| companyId | No | Company UUID (overrides STORNO_COMPANY_ID env var) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations (readOnly=false, destructive=false, idempotent=false), the description adds real behavioral context: type/year/month are derived from the document rather than supplied, the uploaded file is what gets validated and filed, and the recipisa is stored in the dosar. It does not address duplicate uploads or what the call itself returns, which is the main remaining gap for a non-idempotent write.
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?
Front-loaded with the action and accepted formats, followed by downstream consequences. Every sentence adds information, though the second sentence packs several ideas into one long em-dash construction and could be split for readability.
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 two-parameter import tool with no output schema, the description covers format acceptance, metadata derivation, and the validate/file follow-up chain. The only shortfall is that it doesn't say what the upload call itself returns (declaration id? parse errors?) before handing off to declarations_validate.
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 filePath and companyId are already documented. The description reinforces the file semantics by naming the accepted formats, but says nothing about companyId or the env-var override. Baseline 3 is appropriate when the schema carries the parameter burden.
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?
Specific verb (bring/upload) plus resource (a declaration produced elsewhere) and the exact accepted formats (XML, ANAF PDF from SAGA/DUKIntegrator/filled ANAF form). This clearly separates it from declarations_create or declaration_build, which generate declarations rather than importing 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 establishes the context of use — documents produced in another program — and explicitly says nothing is regenerated, which steers agents away from build/create siblings. It stops short of naming the alternative tool or stating exclusions (e.g. when to use declaration_build instead), so it's clear but not a full when/when-not map.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
declarations_validateAIdempotent
Validate a draft declaration by generating and checking the XML output. Transitions the declaration to "validated" status if successful.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Declaration UUID to validate | |
| companyId | No | Company UUID (overrides STORNO_COMPANY_ID env var) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes beyond the annotations by disclosing the actual side effect: the declaration transitions to 'validated' status on success. This is meaningful for a mutating tool (readOnlyHint=false) that is idempotent and non-destructive. It does not say what happens on failure (returned errors vs. exception) or whether the generated XML persists, which keeps it from a 5.
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 compact sentences with the action and its outcome front-loaded. No filler or restated field names.
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 two-parameter mutation with annotations already covering safety and idempotency and no output schema, the description is nearly sufficient, but it leaves the failure/validation-error behavior unexplained, which an agent needs to interpret a 'failed validation' outcome 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% and both parameters carry descriptions, so the schema already explains id and the companyId env-override. The description adds only the implicit constraint that the id should reference a draft; 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?
States a specific verb ('validate') and resource ('draft declaration') plus the mechanism (generating and checking XML output). It does not, however, distinguish itself from the closely named siblings declaration_validate_xml or declaration_build, so an agent must infer the difference.
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 word 'draft' implies this applies only to draft declarations and the success path is stated, but there is no explicit when-not guidance, no mention of prerequisites, and no pointer to the alternative tools (declaration_validate_xml, declarations_submit) for related checks.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
declaration_validate_xmlARead-onlyIdempotent
Validate an ANAF tax declaration XML (D212 Declaratia unica, C168 rent contract registration, D177, D700, D100, D112, D300, D390, D394 …) with ANAF's own DUKIntegrator validators, the same jars the ANAF portal uses. Public endpoint: no account needed, nothing is stored, 60 requests/hour per IP. Returns ANAF's errors and warnings verbatim. When the root namespace is missing or belongs to another reporting period, Storno applies the namespace ANAF asks for and returns the corrected XML (namespaceCorrected=true): upload that one. Use it before filing in SPV, or in a build → validate → fix loop when assembling a declaration from a taxpayer's documents.
| Name | Required | Description | Default |
|---|---|---|---|
| xml | Yes | The declaration XML document (max 4 MB) | |
| type | No | Form code, e.g. D212, C168, D300. Inferred from the root element when omitted. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only cover the read-only/idempotent/closed-world profile, and the description adds genuinely non-obvious behavior: rate limit of 60 requests/hour per IP, no account required, nothing persisted, verbatim error/warning return, and the crucial namespace auto-correction that returns a modified XML with namespaceCorrected=true rather than failing. That last detail changes how an agent must handle the response, so it is high-value 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?
Dense but front-loaded: what it does, then safety/limits, then the namespace-correction caveat, then when to use it. Every sentence carries information, though the long parenthetical form-code list is the least essential part.
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?
Despite having no output schema, the description explains what comes back (verbatim ANAF errors and warnings, plus corrected XML flagged by namespaceCorrected) and when to re-upload the corrected document. Combined with rate-limit and no-auth facts, an agent has everything needed to call 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%, so both parameters are already documented, including the type-inference behavior and the 4 MB cap. The description adds the list of supported form codes (D212, C168, D300 ...), which enriches the mental model of the `type` parameter, but it does not clarify formats or edge cases 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?
States a specific verb and resource ('Validate an ANAF tax declaration XML') and names the exact validator engine (ANAF's DUKIntegrator jars), which is far more specific than the tool name alone. It does not explicitly distinguish itself from the sibling declarations_validate, so the reader must infer that this one is stateless/raw-XML while the sibling works on stored declarations.
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?
Gives clear triggering contexts: 'Use it before filing in SPV, or in a build → validate → fix loop when assembling a declaration from a taxpayer's documents.' That is actionable guidance, though no explicit exclusions or named alternatives (e.g. vs. declarations_validate) are provided.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
defaults_invoiceARead-onlyIdempotent
Get all default values and dropdown options needed for invoice creation. Returns VAT rates, currencies with symbols, payment terms (in days), units of measure, payment methods, and current BNR exchange rates for EUR/USD/GBP/CHF relative to RON. Always fetch this before creating invoices — never hardcode these values.
| Name | Required | Description | Default |
|---|---|---|---|
| companyId | No | Company UUID override (uses active company if not set) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and openWorldHint=false, so safety profile is covered. The description adds useful context beyond annotations: the exact data domains returned and the BNR exchange-rate source, which matters for invoice correctness.
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 tight sentences: purpose and returned contents front-loaded, then the usage directive. Every clause carries information; 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?
Although there is no output schema, the description enumerates the returned value categories in enough detail that an agent knows what to expect. Combined with annotations and full schema coverage, nothing material is missing.
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 companyId override is already documented in the schema. The description adds no additional parameter semantics, which is acceptable at baseline 3.
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?
States a specific verb+resource (get default values and dropdown options for invoice creation) and enumerates exactly what comes back (VAT rates, currencies, payment terms, units, methods, BNR rates). Clearly distinct from siblings like vat_rates_list or exchange_rates_list, which return single data sets.
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?
Gives an explicit directive: 'Always fetch this before creating invoices — never hardcode these values.' That establishes the when and a strong anti-pattern, though it does not name alternative tools for individual value sets.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delivery_notes_bulk_convertA
Convert multiple issued delivery notes into a single invoice. All delivery notes must be issued, have the same client, and use the same currency. Creates one invoice combining all lines and marks all delivery notes as invoiced.
| Name | Required | Description | Default |
|---|---|---|---|
| ids | Yes | Array of delivery note UUIDs to convert into a single invoice | |
| companyId | No | Company UUID (overrides configured default) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false, idempotentHint=false and destructiveHint=false, so the mutating nature is known; the description adds the real value of what happens (one combined invoice created, all source notes marked invoiced). It stops short of describing partial-failure or reversibility behavior for a non-idempotent bulk mutation.
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 dense sentences: the action/result first, then the constraints and side effects. No filler, nothing repeated from the schema or annotations.
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 non-idempotent bulk mutation with no output schema, the description covers preconditions and resulting state changes, which is most of what an agent needs. Missing is what happens if some notes fail validation or whether the operation is atomic.
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 `ids` and `companyId` fully documented in the schema. The description adds nothing about the ids array, ordering, or the company override, so the baseline 3 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?
States a specific verb and resource — converting multiple delivery notes into one invoice — and the word 'multiple' plus 'single invoice' implicitly distinguishes it from the sibling single-note `delivery_notes_convert`. It does not name that sibling explicitly, which keeps it just short of a 5.
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?
Gives concrete preconditions for use: all notes must be issued, share the same client, and share the same currency. It never states exclusions or names the single-note alternative, so the agent must infer when to pick one over the other.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delivery_notes_cancelADestructiveIdempotent
Cancel a delivery note when delivery will not occur. Can be cancelled from draft or issued status. Preserves historical record unlike deletion. Optionally provide a cancellation reason.
| Name | Required | Description | Default |
|---|---|---|---|
| uuid | Yes | UUID of the delivery note to cancel | |
| companyId | No | Company UUID (overrides configured default) | |
| cancellationNotes | No | Internal notes about the cancellation | |
| cancellationReason | No | Reason for cancellation |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true and idempotentHint=true, so the safety profile is covered. The description adds useful context beyond annotations: allowed statuses (draft/issued), historical record preservation versus deletion, and the optional cancellation reason. It does not cover permissions or downstream effects, but the added context is meaningful.
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?
Four short sentences, front-loaded with the action and condition, and no wasted words. The final sentence about the optional reason is slightly redundant with the schema but still relevant.
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 cancel mutation with no output schema, the description covers the key conditions (statuses) and distinguishes from deletion. It gives enough context to invoke correctly, though it could mention error behavior for invalid statuses or effects on related documents.
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 schema already documents all four parameters. The description only mentions the optional cancellation reason, adding marginal value without syntax or format detail beyond the schema. Baseline 3 is appropriate when the schema carries the parameter documentation.
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 states a specific verb and resource ('Cancel a delivery note') and adds the condition 'when delivery will not occur.' It implicitly distinguishes itself from deletion by noting it 'preserves historical record unlike deletion,' though it does not explicitly name sibling tools like delivery_notes_delete or delivery_notes_storno.
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?
Usage context is clear: cancel when delivery will not occur, and only from draft or issued status. However, there are no explicit exclusions or named alternatives (e.g., when to use storno or delete instead), which keeps it below a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delivery_notes_convertA
Convert a delivery note into a final invoice. Creates a new invoice with all delivery note data, marks the delivery note as converted, and establishes a link between the two documents. Returns both the new invoice and updated delivery note.
| Name | Required | Description | Default |
|---|---|---|---|
| uuid | Yes | UUID of the delivery note to convert to an invoice | |
| dueDate | No | Override due date for the new invoice (default: delivery note due date, YYYY-MM-DD) | |
| companyId | No | Company UUID (overrides configured default) | |
| issueDate | No | Override issue date for the new invoice (default: today, YYYY-MM-DD) | |
| invoiceSeriesId | No | UUID of the invoice series to use (if different from delivery note series) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds meaningful behavior beyond the annotations: it creates a new invoice with all delivery note data, marks the delivery note as converted, links the documents, and returns both. It does not warn about retry behavior or duplicate-risk implications of the non-idempotent annotation.
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 deliver the core action, side effects, and return behavior without repetition. The conversion purpose is front-loaded and every sentence contributes.
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 mutation tool with no output schema, the description covers the main effects and returned documents, and the annotations communicate mutation and non-idempotency. It still omits operational preconditions such as whether the delivery note must be issued, unconverted, or otherwise valid before conversion.
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 all five parameters are already documented in the schema, including uuid, dueDate, issueDate, invoiceSeriesId, and companyId. The description does not add parameter-specific meaning beyond the schema, which is acceptable given full coverage but does not exceed 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 states a specific verb and resource: 'Convert a delivery note into a final invoice.' It is clear what the tool does, but it does not explicitly distinguish this single conversion from the sibling tool delivery_notes_bulk_convert or other conversion-related 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?
Usage is implied by the purpose statement: use it to turn a delivery note into an invoice. However, there is no explicit guidance about preconditions, alternatives such as bulk conversion or proforma conversion, or when not to use this tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delivery_notes_createA
Create a new delivery note in draft status. Delivery notes document physical delivery of goods or services and can later be converted to invoices. Include deputy information for proof of delivery. A default delivery_note series is auto-assigned if neither seriesId nor documentSeriesId is provided.
| Name | Required | Description | Default |
|---|---|---|---|
| lines | Yes | Array of line items (minimum 1 required) | |
| notes | No | Public notes about the delivery | |
| dueDate | Yes | Due date for invoicing (YYYY-MM-DD) | |
| clientId | Yes | UUID of the client | |
| currency | Yes | Currency code (e.g., RON, EUR, USD) | |
| issuerId | No | UUID of the issuer user | |
| mentions | No | Additional mentions or instructions | |
| seriesId | No | UUID of the delivery note series (uses default series if not provided) | |
| companyId | No | Company UUID (overrides configured default) | |
| issueDate | Yes | Date of issue (YYYY-MM-DD) | |
| deputyAuto | No | Vehicle registration number used for delivery | |
| deputyName | No | Name of person who received the delivery | |
| issuerName | No | Name of person issuing the delivery note | |
| salesAgent | No | Sales agent name | |
| exchangeRate | No | Exchange rate to base currency (default: 1.0 for RON) | |
| internalNote | No | Internal note (not visible to client) | |
| deliveryLocation | No | Full address where goods were delivered | |
| documentSeriesId | No | UUID of the document series to use (alternative to seriesId; uses default delivery_note series if neither is provided) | |
| projectReference | No | Related project or order reference | |
| deputyIdentityCard | No | ID card number of the deputy | |
| etransportTrailer1 | No | First trailer registration number | |
| etransportTrailer2 | No | Second trailer registration number | |
| etransportEndCounty | No | End county code (1-52). Required for e-Transport (BR-211) | |
| etransportEndNumber | No | End street number | |
| etransportEndStreet | No | End street name (2-100 chars) | |
| etransportEndLocality | No | End locality name (2-100 chars) | |
| etransportStartCounty | No | Start county code (1-52 per ANAF nomenclature, e.g., 4=Bacau, 40=Bucuresti). Required for e-Transport (BR-210) | |
| etransportStartNumber | No | Start street number | |
| etransportStartStreet | No | Start street name (2-100 chars per BR-215) | |
| etransportEndOtherInfo | No | End additional address info | |
| etransportPostIncident | No | Post-incident declaration (after the transport was completed) | |
| etransportEndPostalCode | No | End postal code | |
| etransportOperationType | No | Operation type code: 10 (intra-community acquisition), 12 (intra-community delivery), 20 (transaction in national territory between two different entities with goods moving domestically), 30 (domestic transport document TTN), 40 (import), 50 (export), 60 (goods not released for circulation) | |
| etransportStartLocality | No | Start locality name (2-100 chars per BR-214) | |
| etransportTransportDate | No | Transport start date (YYYY-MM-DD) | |
| etransportVehicleNumber | No | Vehicle registration number (e.g., "BC01ABC"). Schematron BR-031: 3-20 uppercase alphanumeric chars | |
| etransportStartOtherInfo | No | Start additional address info | |
| etransportStartPostalCode | No | Start postal code | |
| etransportTransporterCode | No | Transporter CUI/CIF (numeric only, e.g., "31385365"). Must match ANAF format per BR-002 | |
| etransportTransporterName | No | Transporter legal name (e.g., "UNIVERSAL EQUIPMENT PROJECTS SRL") | |
| etransportTransporterCountry | No | Transporter country code (ISO 3166-1 alpha-2, e.g., "RO"). For TTN (opType 30) must be "RO" per BR-005 |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare non-read-only, non-destructive, non-idempotent, closed-world behavior. The description adds meaningful context beyond them: the record is created in draft status (not issued), a default delivery_note series is auto-assigned when no series is given, and it can later be converted to an invoice. It omits e-Transport-related obligations despite ~15 such params, keeping it below 5.
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?
Four short sentences, front-loaded with the action and status, then progressively adding context. No filler, though the series-default sentence partially duplicates schema text.
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 41-parameter tool with substantial e-Transport/ANAF compliance fields and no output schema, the description is thin: it never mentions e-Transport requirements or the minimum-one-line rule, relying entirely on the schema. Adequate alongside full schema coverage, but not complete for a tool of this 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 the baseline is 3. The description's series-default sentence largely restates what seriesId/documentSeriesId already say, and its deputy mention only points at a subset of the 41 parameters; it adds little semantic detail not already 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?
States a specific verb and resource ('Create a new delivery note in draft status') and adds conceptual orientation (documents physical delivery, convertible to invoices). It does not explicitly differentiate itself from creation-capable siblings such as delivery_notes_from_proforma or delivery_notes_convert, so it stops short of a 5.
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?
Usage context is implied ('Include deputy information for proof of delivery', default series fallback) but there is no explicit when-to-use versus alternatives guidance, such as when to create a delivery note from scratch instead of via delivery_notes_from_proforma.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delivery_notes_deleteADestructiveIdempotent
Permanently delete a delivery note. Only draft delivery notes can be deleted. Use cancel for issued delivery notes to preserve audit trail.
| Name | Required | Description | Default |
|---|---|---|---|
| uuid | Yes | UUID of the delivery note to delete | |
| companyId | No | Company UUID (overrides configured default) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true and idempotentHint=true, so the description's added value is the eligibility precondition and the audit-trail consequence, both of which go beyond the schema. Minor gap: it says 'Permanently' while a delivery_notes_restore sibling exists, so the reversibility of the delete is not fully clarified.
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 sentences with no filler, and the most important constraint (draft-only) is front-loaded right after the action. The alternative routing is left to the end where it belongs.
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 two-parameter destructive tool with full annotation coverage and no output schema, the description supplies the critical precondition and the escape hatch to cancel. The only thing an agent might still wonder about is whether a deleted note is recoverable via delivery_notes_restore.
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 both uuid and companyId documented in the schema itself, so the baseline applies. The description adds nothing about the uuid identifier or the companyId override, which is acceptable given the schema does the work.
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?
States a specific verb and resource ('Permanently delete a delivery note') and immediately scopes the operation to drafts. The naming of 'cancel' as the alternative makes it distinguishable from delivery_notes_cancel, delivery_notes_restore, and the other delivery_notes_* siblings without opening a schema.
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?
Gives an explicit when-not condition ('Only draft delivery notes can be deleted') and names the alternative for the excluded case ('Use cancel for issued delivery notes'), along with the rationale (audit trail). An agent has everything needed to choose between delete and cancel.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delivery_notes_emailA
Send a delivery note to a client via email with the PDF attached. Supports custom subject, body, CC, and BCC recipients. Recipients (to, cc, bcc) must be client emails registered on the company; other addresses are rejected with EMAIL_RECIPIENT_NOT_CLIENT.
| Name | Required | Description | Default |
|---|---|---|---|
| cc | No | CC email addresses | |
| to | Yes | Recipient email address | |
| bcc | No | BCC email addresses | |
| body | No | Email body text (auto-generated if omitted) | |
| uuid | Yes | UUID of the delivery note to send | |
| subject | No | Email subject (auto-generated if omitted) | |
| companyId | No | Company UUID (overrides configured default) | |
| templateId | No | UUID of email template to use (category: delivery_note) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (not read-only, openWorld, non-idempotent, not destructive). The description adds real value on top: the PDF is attached, recipients are validated against registered clients, and the rejection surfaces as the concrete error code EMAIL_RECIPIENT_NOT_CLIENT. It does not cover whether the note must be issued first or what happens on repeat sends, but with annotations present this clears the bar.
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 sentences, front-loaded with what the tool does, then capabilities, then the failure constraint. Nothing is repeated from the schema verbatim and no sentence is 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?
For an 8-parameter mutation with no output schema, the description covers the send behavior, the recipient restriction, and the failure mode. Gaps remain around the delivery note's required state (issued?) and what the call returns, but annotations and the fully documented schema carry the rest.
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 goes beyond the schema by stating that to, cc, and bcc are all subject to the same client-email restriction — a constraint the schema's 'CC email addresses' text does not convey — and by framing subject/body as optional customization.
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?
States a specific verb and resource plus the delivery mechanism: 'Send a delivery note to a client via email with the PDF attached.' That is enough to separate it from read-only siblings like delivery_notes_email_history or delivery_notes_pdf, though the description never names those siblings explicitly to make the routing 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?
Usage is implied by the action itself and reinforced by a hard precondition (recipients must be client emails registered on the company). But no alternatives are named — nothing tells the agent when to use delivery_notes_email_defaults to configure defaults, or delivery_notes_email_history to inspect prior sends.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delivery_notes_email_defaultsBRead-onlyIdempotent
Get pre-filled email content for a delivery note including default recipient, subject, and body text with template variables already substituted.
| Name | Required | Description | Default |
|---|---|---|---|
| uuid | Yes | UUID of the delivery note | |
| companyId | No | Company UUID (overrides configured default) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint and destructiveHint=false, so the safety profile is covered. The description adds one genuinely useful behavioral fact — template variables are already substituted server-side — but says nothing about what happens when no template is configured or how company defaults interact with the request.
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?
A single well-formed sentence with no filler, front-loaded with the verb and resource, and the returned fields listed last. Nothing is redundant.
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 two-parameter tool this covers the essentials, but with no output schema an agent would benefit from knowing the response shape more precisely and how it relates to the sibling delivery_notes_email call that would consume this content.
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 only two parameters, so the schema already documents uuid and companyId including the 'overrides configured default' behavior. The description adds nothing about parameters, which is acceptable at full coverage but not value-adding.
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?
A specific verb ('Get') plus a specific resource ('pre-filled email content for a delivery note') with the returned fields enumerated. It implicitly separates itself from delivery_notes_email (the send tool) by describing content retrieval, but never names that sibling explicitly.
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 intended use (fetching defaults so an email can be composed or previewed before delivery_notes_email is called) is only implied by 'pre-filled'. There is no explicit when-to-use, no when-not-to-use, and no reference to delivery_notes_email or delivery_notes_email_history as alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delivery_notes_email_historyARead-onlyIdempotent
Get the email sending history for a delivery note, including all sent emails with their status, timestamps, and recipient information.
| Name | Required | Description | Default |
|---|---|---|---|
| uuid | Yes | UUID of the delivery note | |
| companyId | No | Company UUID (overrides configured default) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, non-destructive and closed-world, so the safety profile is covered. The description still contributes by disclosing what the response contains (sent emails with status, timestamps, recipient info), which is valuable given there is no output schema. It does not mention ordering or pagination limits.
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?
A single front-loaded sentence with no filler; the resource and returned fields both earn their place.
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 two-parameter read tool with strong annotations, the description covers purpose and return contents. Minor gaps remain around result ordering, pagination, and behavior when no emails have been sent, but nothing critical to correct invocation is missing.
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?
Both parameters are fully documented in the schema (100% coverage), including the note that companyId overrides the configured default. The description adds nothing about parameters, so the baseline 3 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?
States a specific verb ('Get') and resource ('email sending history for a delivery note') and enumerates the contents returned (status, timestamps, recipients). It implicitly contrasts with the sibling delivery_notes_email, though it never names that sender tool explicitly.
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?
Usage is only implied by the noun phrase 'history' — an agent can infer this is a read/audit call rather than a send, but there is no explicit when-to-use, no prerequisite about the delivery note being issued/emailed, and no named alternative.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delivery_notes_from_proformaA
Create a new delivery note from an existing proforma invoice. Copies client, lines, dates, currency, and notes from the proforma. The delivery note is created in draft status.
| Name | Required | Description | Default |
|---|---|---|---|
| companyId | No | Company UUID (overrides configured default) | |
| proformaId | Yes | UUID of the proforma invoice to create delivery note from |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare the mutating, non-idempotent, non-destructive profile, and the description adds real value beyond that: it enumerates exactly which fields are copied and that the result lands in draft status, so the agent knows nothing is finalized. It omits auth/permission requirements and does not warn that repeat calls produce duplicate delivery notes.
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 tight sentences: action first, then copied fields, then resulting state. No filler, no repetition of the tool name, and the most decision-relevant fact (draft status) is not buried.
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 two-parameter creation tool with full schema coverage and no output schema, the definition covers source, copied content, and initial state. It leaves two relevant gaps: what the call returns (ID vs full object) and whether the source proforma is modified.
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 both parameters are already described in the schema; the description only implies the proformaId role and says nothing about companyId or the override behavior. Baseline 3 is appropriate when the schema carries the parameter burden.
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?
States a specific verb and resource ('Create a new delivery note') plus the source ('from an existing proforma invoice'), which inherently separates it from delivery_notes_create. It never names the sibling or explains why one path is chosen over the other, so it falls short of fully explicit sibling differentiation.
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 'from an existing proforma invoice' qualifier implies you need a proformaId, but there is no explicit when-to-use guidance versus delivery_notes_create, no mention of proforma_invoices_convert, and no stated prerequisites (e.g., proforma must be accepted/issued). Usage is only inferable.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delivery_notes_getARead-onlyIdempotent
Get complete details for a specific delivery note including all line items, client information, deputy details, and calculated totals.
| Name | Required | Description | Default |
|---|---|---|---|
| uuid | Yes | UUID of the delivery note to retrieve | |
| companyId | No | Company UUID (overrides configured default) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, non-destructive, closed-world, so the safety profile needs no restating. The description does add genuine value by previewing the response contents (line items, client, deputy, totals) absent an output schema, but says nothing about not-found behavior or permission 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?
A single tightly packed sentence with the resource and the returned data front-loaded; every clause carries information and there is no boilerplate.
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 two-parameter read with full schema coverage and rich annotations, the definition covers purpose and payload shape adequately. The only meaningful gap is error/not-found behavior, which is minor for this tool class.
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 documented in the schema, so baseline 3 applies. The description does not mention the uuid requirement or the companyId override semantics, adding nothing parameter-level 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?
Specific verb ('Get') plus resource ('delivery note') with an explicit enumeration of what the payload contains (line items, client info, deputy details, totals). It does not name the sibling delivery_notes_list or state how it differs, so it falls short of a 5.
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?
Usage is only implied by the word 'specific' and the required uuid; the description never says to use delivery_notes_list for browsing/searching or to use this after obtaining a uuid. No exclusions, no prerequisites, no alternative named.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delivery_notes_issueAIdempotent
Mark a delivery note as issued when the physical delivery of goods or completion of services occurs. Transitions status from draft to issued. Once issued, the delivery note becomes read-only.
| Name | Required | Description | Default |
|---|---|---|---|
| uuid | Yes | UUID of the delivery note to mark as issued | |
| companyId | No | Company UUID (overrides configured default) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false, idempotentHint=true and destructiveHint=false, so the safety profile is covered. The description adds genuinely new behavioral context by stating that the record becomes read-only after issuing — a consequence an agent can't derive from the annotations. It never says what the call returns or whether the lock can be undone.
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 sentences, zero filler, and the core action is front-loaded before the state-transition and read-only consequences. Every sentence carries information an agent needs.
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 two-parameter mutation tool with no output schema, the description covers the action, the trigger, the state transition and the post-condition. The only real gap is the return payload and the behavior on notes that are not in draft status.
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 both parameters (uuid, companyId) are fully documented in the schema, so the baseline is 3. The description contributes no additional meaning about the UUID format, the company override behavior, or what happens if the note is already issued.
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?
Names a specific verb (mark as issued) and resource (delivery note), and pins down the exact state transition (draft -> issued), which implicitly separates it from delivery_notes_cancel, delivery_notes_storno and delivery_notes_convert. It stops short of naming those siblings, so an agent must infer the boundary rather than read it.
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?
Gives a concrete triggering condition: use it when the physical delivery of goods occurs or services are completed. There is no explicit when-not guidance and no pointer to the alternative tools for correcting or reversing an issued note, which leaves the negative space unstated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delivery_notes_listARead-onlyIdempotent
List delivery notes for the selected company with optional filtering by status, date range, client, and search term. Delivery notes document physical delivery of goods or completion of services.
| Name | Required | Description | Default |
|---|---|---|---|
| to | No | End date filter (YYYY-MM-DD) | |
| from | No | Start date filter (YYYY-MM-DD) | |
| page | No | Page number (default: 1) | |
| limit | No | Items per page (default: 20, max: 100) | |
| search | No | Search term for delivery note number or client name | |
| status | No | Filter by status | |
| clientId | No | Filter by client UUID | |
| companyId | No | Company UUID (overrides configured default) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, destructiveHint=false and openWorldHint=false, so the safety profile is covered. The description adds useful domain context (what a delivery note represents) but says nothing about pagination behavior, default ordering, or result size beyond what the schema states.
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, no waste: the operational summary comes first and the domain definition second. Nothing redundant.
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 list tool with full schema coverage and complete annotations, the description supplies the missing 'what is a delivery note' context. Only minor gaps remain, such as default page size or ordering, which the schema partially covers.
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 every parameter including the status enum and date formats is already documented. The description only echoes the filter categories ('status, date range, client, and search term') without adding syntax or semantics, which is the baseline case.
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?
States a specific verb+resource ('List delivery notes') plus the scope (selected company) and the available filters, so an agent can distinguish it from delivery_notes_get/create/update. It never explicitly contrasts itself with the sibling delivery-note tools, so it stops short of a 5.
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?
Usage is implied by 'list ... with optional filtering' and by the domain sentence explaining what a delivery note is, but there is no explicit when-to-use / when-not guidance or pointer to alternatives such as delivery_notes_get for a single record.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delivery_notes_pdfARead-onlyIdempotent
Download the PDF for a delivery note. Returns base64-encoded PDF binary data. The delivery note must be in issued or converted status. Optionally hide VAT or prices for simplified delivery documents.
| Name | Required | Description | Default |
|---|---|---|---|
| uuid | Yes | UUID of the delivery note | |
| hideVat | No | Hide VAT amounts from the PDF (default: false) | |
| companyId | No | Company UUID (overrides configured default) | |
| hidePrices | No | Hide all prices from the PDF (default: false) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, destructiveHint=false, and openWorldHint=false. The description adds useful behavior beyond annotations: the return is base64-encoded PDF binary data, the document must be issued/converted, and VAT/prices can be hidden.
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 front-loaded sentences with no wasted text. The core action, return format, status prerequisite, and optional flags are all presented efficiently.
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 PDF download tool with no output schema, the description covers the critical return format, the document-status prerequisite, and the optional visibility controls. The schema and annotations already supply the remaining parameter and safety 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?
Schema description coverage is 100%, so all four parameters are already documented in the schema. The description adds rationale for hideVat/hidePrices (simplified delivery documents) but does not add meaning for companyId 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 gives a specific verb and resource: "Download the PDF for a delivery note." The resource is clearly differentiated from sibling PDF tools such as invoices_pdf, receipts_pdf, and proforma_invoices_pdf.
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 states a clear prerequisite: the delivery note must be in issued or converted status. It also explains optional simplification via hiding VAT or prices, but it does not explicitly name alternative tools like delivery_notes_email or describe when not to use this tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delivery_notes_restoreAIdempotent
Restore a cancelled delivery note back to draft status. Only cancelled delivery notes can be restored. This reverses the cancellation and allows the delivery note to be re-issued.
| Name | Required | Description | Default |
|---|---|---|---|
| uuid | Yes | UUID of the cancelled delivery note to restore | |
| companyId | No | Company UUID (overrides configured default) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly=false, idempotent=true, destructive=false, so the safety profile is covered. The description adds real state-transition semantics that annotations cannot convey: the source state (cancelled), the target state (draft), and the follow-on capability (re-issuing). It stops short of describing error behavior or 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 short sentences, front-loaded with the action and result. The precondition and the 're-issued' rationale each earn their place; 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?
For a two-parameter mutation with full schema coverage and a complete annotation set, the description supplies purpose, precondition, and state effect. Missing only edge-case behavior (what happens if the note is not cancelled) and return information, which are minor here.
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 uuid and companyId are already documented. The description only implies the uuid refers to a cancelled note and adds nothing about the companyId override or identifier format; 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?
States a specific verb and resource ('Restore a cancelled delivery note') plus the resulting state ('back to draft status'). It is clearly distinct from siblings like delivery_notes_cancel or delivery_notes_storno, though it never names those alternatives explicitly.
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?
'Only cancelled delivery notes can be restored' gives a concrete precondition for when the tool applies. It does not route to alternatives (e.g. use cancel for the inverse, or storno for other reversals), so the guidance is clear but not exhaustive.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delivery_notes_stornoA
Create a storno (return) delivery note with negated quantities from an existing issued delivery note. The storno delivery note is created as a draft and can be issued separately.
| Name | Required | Description | Default |
|---|---|---|---|
| uuid | Yes | UUID of the issued delivery note to create storno for | |
| companyId | No | Company UUID (overrides configured default) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations, the description adds meaningful behavioral context: the storno carries negated quantities, is created as a draft, and can be issued separately. It does not detail permissions, idempotency behavior, or what happens if the source note is already a storno, but the annotations already cover the basic safety profile.
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 followed by the draft/issue behavior. Nothing is redundant or padded.
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 two-parameter mutation tool with full schema coverage and annotations, the description is nearly complete: it explains the source, effect, and resulting draft state. It could mention edge cases or the absence of an output schema would not matter, but no major gap remains.
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 schema already documents both uuid and companyId. The description reinforces that the source is an existing issued delivery note but does not add format or selection 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 states a specific verb and resource: create a storno delivery note from an existing issued delivery note, with negated quantities. It is clearly distinguishable from a normal delivery-note creation, but it does not explicitly name sibling tools or contrast itself with alternatives such as delivery_notes_create or invoices_bulk_storno.
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 implies the usage condition: the source must be an existing issued delivery note, and the result starts as a draft that can be issued separately. However, it gives no explicit when-not guidance and does not mention alternatives like delivery_notes_create or batch storno tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delivery_notes_submit_etransportA
Submit an issued delivery note to Romania's ANAF e-Transport system for domestic transport declaration (TTN). The delivery note must be in issued status with e-Transport fields filled (vehicle number, route, transport data, line tariff codes and weights). Submission is asynchronous — the status will update from uploaded to ok (with UIT) or nok (with error).
| Name | Required | Description | Default |
|---|---|---|---|
| uuid | Yes | UUID of the issued delivery note to submit to e-Transport | |
| companyId | No | Company UUID (overrides configured default) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly=false, openWorld=true, idempotent=false and destructive=false; the description adds real value beyond them by disclosing that submission is asynchronous and that status moves from 'uploaded' to 'ok' (with UIT) or 'nok' (with error). It does not warn that resubmitting a non-idempotent call may create duplicate declarations, which would have been the one bit of missing behavioral context.
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 the action and target system, then prerequisites, then outcome. Every sentence carries distinct information; nothing is repeated from the schema or annotations.
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 two-parameter submission tool with no output schema, the description covers purpose, prerequisites, and the async outcome states an agent needs to interpret results. It could close the loop by pointing to how to poll the resulting status (e.g. delivery_notes_get) or roughly how long the transition takes, but what is present is nearly 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% for both parameters, so 'uuid' and 'companyId' semantics are already fully documented in the schema. The description adds no syntax, format, or fallback guidance for either parameter — it only describes the state of the object being submitted. Baseline 3 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?
States a specific verb and resource ('Submit an issued delivery note to Romania's ANAF e-Transport system') and names the declaration type (TTN), which clearly separates it from generic delivery-note CRUD. However, it never names the closest sibling, delivery_notes_validate_etransport, so the agent gets no explicit differentiation cue between validating and submitting.
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 preconditions are spelled out concretely: the note must be in issued status and the e-Transport fields (vehicle number, route, transport data, line tariff codes, weights) must be filled. That tells the agent exactly what state to establish before calling. It stops short of naming alternatives (e.g. run delivery_notes_validate_etransport first) or stating when not to submit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delivery_notes_updateAIdempotent
Update an existing delivery note. Delivery notes in draft or issued status can be updated. Replaces all line items with the provided array.
| Name | Required | Description | Default |
|---|---|---|---|
| uuid | Yes | UUID of the delivery note to update | |
| lines | Yes | Array of line items (replaces all existing lines) | |
| notes | No | Public notes about the delivery | |
| dueDate | Yes | Due date for invoicing (YYYY-MM-DD) | |
| clientId | Yes | UUID of the client | |
| currency | Yes | Currency code (e.g., RON, EUR, USD) | |
| issuerId | No | UUID of the issuer user | |
| mentions | No | Additional mentions or instructions | |
| seriesId | No | UUID of the delivery note series | |
| companyId | No | Company UUID (overrides configured default) | |
| issueDate | Yes | Date of issue (YYYY-MM-DD) | |
| deputyAuto | No | Vehicle registration number | |
| deputyName | No | Name of person who received the delivery | |
| issuerName | No | Name of person issuing the delivery note | |
| salesAgent | No | Sales agent name | |
| exchangeRate | No | Exchange rate to base currency | |
| internalNote | No | Internal note (not visible to client) | |
| deliveryLocation | No | Full address where goods were delivered | |
| documentSeriesId | No | UUID of the document series to use (alternative to seriesId) | |
| projectReference | No | Related project or order reference | |
| deputyIdentityCard | No | ID card number of the deputy | |
| etransportTrailer1 | No | First trailer registration number | |
| etransportTrailer2 | No | Second trailer registration number | |
| etransportEndCounty | No | End county code (1-52) | |
| etransportEndNumber | No | End street number | |
| etransportEndStreet | No | End street name | |
| etransportEndLocality | No | End locality name | |
| etransportStartCounty | No | Start county code (1-52) | |
| etransportStartNumber | No | Start street number | |
| etransportStartStreet | No | Start street name | |
| etransportEndOtherInfo | No | End additional address info | |
| etransportPostIncident | No | Post-incident declaration | |
| etransportEndPostalCode | No | End postal code | |
| etransportOperationType | No | Operation type code: 10, 12, 20, 30 (TTN), 40, 50, 60 | |
| etransportStartLocality | No | Start locality name | |
| etransportTransportDate | No | Transport start date (YYYY-MM-DD) | |
| etransportVehicleNumber | No | Vehicle registration number (3-20 uppercase alphanumeric) | |
| etransportStartOtherInfo | No | Start additional address info | |
| etransportStartPostalCode | No | Start postal code | |
| etransportTransporterCode | No | Transporter CUI/CIF (numeric only) | |
| etransportTransporterName | No | Transporter legal name | |
| etransportTransporterCountry | No | Transporter country code (e.g., "RO") |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover safety (readOnly=false, idempotent=true, destructive=false), and the description adds a materially important behavior beyond them: line items are replaced wholesale, so any existing line omitted from the array disappears. It still omits permissions/auth requirements and whether updating re-triggers e-Transport validation. Note the mild tension: wholesale line replacement destroys existing line data even though destructiveHint=false.
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 sentences, zero filler, and the core operation plus the two constraints are front-loaded. Nothing repeated and nothing padded.
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 42-parameter mutation tool with no output schema, the description supplies the two things the schema cannot: when the call is legal (status) and what it does to existing lines. Gaps remain around series/numbering effects on update and whether e-Transport fields must be resupplied, but these are secondary given full schema coverage.
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% across all 42 parameters, so the schema already explains uuid, the required line fields, and the e-Transport fields. The description only echoes the array-level replacement semantics that the schema's own line description states, adding no new parameter meaning.
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?
Specific verb+resource: "Update an existing delivery note" with two concrete constraints (draft/issued status, full line replacement). It does not name siblings such as delivery_notes_create or delivery_notes_cancel, relying on the name for differentiation, which keeps it just short of a 5.
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 status precondition ("draft or issued status can be updated") is real usage guidance, implying issued-but-cancelled/storno notes are not updatable. However, it never names an alternative tool or says what to do instead (e.g., delivery_notes_get to read current lines before overwriting, or delivery_notes_cancel for finalized notes).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delivery_notes_validate_etransportARead-onlyIdempotent
Validate a delivery note against Romania's e-Transport schema before submitting. Checks entity validation, XSD schema, and Schematron rules. Returns validation result with errors and warnings. Use this before submit_etransport to catch issues early.
| Name | Required | Description | Default |
|---|---|---|---|
| uuid | Yes | UUID of the delivery note to validate | |
| companyId | No | Company UUID (overrides configured default) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, non-destructive and closed-world, so safety is covered. The description adds genuine context beyond that: three distinct validation layers (entity, XSD, Schematron) and that the response carries both errors and warnings. It doesn't say whether validation has side effects or cost/latency, but the added detail is substantial.
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 sentences with zero redundancy: what it validates, what it checks, what it returns, then when to use it. The purpose and the routing advice come first, so an agent can act after the first two sentences.
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 no output schema, the description correctly characterizes the return value as a validation result with errors and warnings. Read-only annotations cover the safety profile. The only minor gap is that it doesn't hint at the shape of the errors/warnings or a pass/fail flag, but the description is otherwise sufficient for correct invocation.
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 both uuid and companyId are documented in the schema, so baseline 3 applies. The description adds no extra meaning about the uuid or the override behavior of companyId beyond what the schema states.
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?
States a specific verb (validate) and resource (delivery note) plus the exact standard applied (Romania's e-Transport schema). A reader immediately knows it is a pre-submission check, not an issuance or submission action, which separates it from delivery_notes_submit_etransport and the other delivery_notes_* siblings.
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 before submit_etransport to catch issues early', naming the alternative and the sequencing condition. It does not state a when-not case (e.g. already-validated notes or drafts that cannot be validated), so it stops short of full alternatives coverage.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
document_generateARead-onlyIdempotent
Generate a standard legal document as PDF (and HTML) from fields: 'conventie_incetare_inchiriere' (fields: data_conventie?, locator{nume, adresa, ci_serie?, ci_numar?, cnp?}, locatar{same}, contract{numar, data, adresa_imobil, numar_inregistrare_anaf?, data_inregistrare_anaf?}, data_incetare, termen_utilitati_zile?, garantie{suma?, valuta?, termen_zile?}) or 'declaratie_incetare_contract' (locator{nume, adresa, cnp?}, locatar{nume, cnp?}, contract{numar, data, adresa_imobil, data_inceput, data_sfarsit, chirie?, valuta?, numar_inregistrare_anaf?, data_inregistrare_anaf?}, data_incetare, motiv?, motiv_detalii?, organ_fiscal?, data_declaratie?). Dates as dd.mm.yyyy. Pass outFile to save the PDF locally (then sign it with agent_sign_pdf or have it signed by hand); otherwise the PDF comes back base64. Public, nothing stored.
| Name | Required | Description | Default |
|---|---|---|---|
| type | Yes | ||
| fields | Yes | Document fields (see description) | |
| outFile | No | Path where the PDF is written; when omitted the response carries pdfBase64 |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, non-destructive, closed-world; the description adds genuinely new behavior: dual PDF+HTML output, the base64-vs-local-file dichotomy, and the no-storage/public nature. It stops short of covering failure modes (invalid field sets, missing required keys, what happens if outFile path is unwritable).
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?
Front-loaded with the purpose and output modes, then the field spec. Every element earns its place, but the dense parenthetical field grammar is hard to scan and would benefit from flatter structuring; it is long because it is information-dense, not padded.
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 nested objects, no output schema, and an opaque `fields` parameter, the description carries the full burden and does: document types, required vs optional fields, date format, output transport, and the natural next step (signing). No output schema means the return-value explanation it provides is essential and present.
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?
This is the tool's key strength: the `fields` object is opaque in the schema (additionalProperties), and the description supplies the full per-type schema including nested locator/locatar/contract/garantie objects and which subfields are optional. It also explains the outFile/response tradeoff and the date format dd.mm.yyyy, which the schema does not.
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?
States a specific verb (generate) and resource (legal document), names the two supported document types and enumerates their required field shapes, so an agent knows exactly what will be produced. This is far beyond a restatement of the name and clearly distinguishes it from sibling builders like declaration_build or dosare_document by document type.
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?
Gives concrete operational guidance: pass outFile to persist the PDF and then sign with agent_sign_pdf, or omit it to receive base64, plus 'Public, nothing stored.' It does not explicitly say when to prefer this over the sibling declaration_* or proforma/document PDF tools, so routing among similar generators is left partly to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
document_series_createA
Create a new document series. The prefix must be unique per company and document type. Common patterns: "FAC" for invoices, "FAC2026" for annual series, "PRO" for proformas. Use currentNumber to set the starting number (default: 0, so first document gets number 1).
| Name | Required | Description | Default |
|---|---|---|---|
| type | Yes | Document type this series is for | |
| active | No | Whether the series is active and available for new documents (default: true) | |
| prefix | Yes | Series prefix (must be unique per company+type). Examples: "FAC", "FAC2026", "PRO", "AVZ" | |
| companyId | No | Company UUID override (uses active company if not set) | |
| currentNumber | No | Starting number — the last used number (default: 0, meaning next document gets 1) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare non-read-only, non-idempotent, non-destructive, closed-world. The description adds the important behavioral fact that the prefix must be unique per company+type (implying a failure mode on duplicates) and explains numbering semantics via currentNumber — real context beyond annotations. Return value and error behavior are still absent.
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?
Four tight sentences with the core action front-loaded and the unique-prefix constraint immediately after. The example list and default restatement are somewhat redundant with the schema, preventing a 5.
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 create tool with no output schema, the description explains uniqueness and numbering but doesn't say what the call returns, whether the series becomes default/active automatically, or what the duplicate-prefix failure looks like — meaningful gaps for an agent that must decide how to proceed after calling it.
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 all five parameters are documented in the schema, including prefix examples and the currentNumber default. The description's example prefixes and default restatement largely duplicate that, so it sits at the baseline rather than adding new syntax or format details.
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?
States a specific verb+resource ('Create a new document series') that is unambiguous and clearly distinct from siblings like document_series_update, document_series_list, and document_series_set_default. It doesn't explicitly name a sibling, which keeps it from a 5.
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?
Implied usage (create a series before issuing documents of that type) but no explicit when-to-use / when-not-to-use guidance or reference to alternatives such as document_series_update or document_series_numbering_decision. The uniqueness constraint hints at a pre-check but doesn't route the agent anywhere.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
document_series_deleteADestructiveIdempotent
Permanently delete a document series. Cannot delete a series that has been used for any documents. Consider marking as inactive (active=false) instead, to preserve referential integrity and the audit trail. Only delete if the series was created by mistake and never used.
| Name | Required | Description | Default |
|---|---|---|---|
| uuid | Yes | Document series UUID to delete | |
| companyId | No | Company UUID override (uses active company if not set) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true and idempotentHint=true, so the description is not obligated to re-state the safety profile. Instead it adds the substantive precondition (deletion is refused if the series has been used), the downstream consequences of deleting (referential integrity and audit trail loss), and the remedial action. That is exactly the context annotations cannot express.
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, zero waste, front-loaded with the destructive nature before the constraint and the alternative. Each sentence carries distinct information: what it does, when it fails, what to do instead.
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 2-parameter destructive mutation with no output schema, the description covers intent, precondition, alternative, and consequence. The only untouched surface is the companyId override, which the schema already explains.
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 both uuid and companyId documented in the schema including the 'uses active company if not set' fallback, so the baseline is 3. The description adds no parameter-level detail and, notably, never mentions companyId or the active-company override.
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?
States a specific verb+resource ('Permanently delete a document series') and immediately distinguishes it from siblings by scope and consequence. An agent can tell it apart from document_series_update or document_series_set_default without opening any schema.
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?
Gives an explicit prohibition ('Cannot delete a series that has been used for any documents'), names the preferred alternative with the exact field to change ('marking as inactive (active=false)'), and states the only valid deletion case ('created by mistake and never used'). When-to-use, when-not-to-use, and the alternative are all present.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
document_series_listARead-onlyIdempotent
List all document series for the active company, optionally filtered by type. Document series define the numbering prefixes for invoices (e.g., "FAC"), proformas ("PRO"), credit notes, and delivery notes. Each series tracks the current and next available number.
| Name | Required | Description | Default |
|---|---|---|---|
| type | No | Filter by document type: invoice, proforma, credit_note, or delivery_note | |
| companyId | No | Company UUID override (uses active company if not set) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, non-destructive, and closed-world, so safety is covered. The description adds meaningful domain transparency the annotations cannot: that each series tracks a current and next available number, which tells the agent what state it is inspecting. It stops short of describing the return payload shape, but the added context is well beyond the annotation baseline.
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 sentences, front-loaded with the action and scope before the explanatory domain context. No filler, no repetition of schema fields.
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?
There is no output schema, so the description usefully explains that each series has a numbering prefix and current/next number, giving the agent a mental model of the returned objects. It does not state ordering, pagination, or whether a default series is flagged, which leaves a modest gap for a list 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% and both parameters (type enum, companyId override) are fully documented there. The description's 'optionally filtered by type' and 'active company' phrasing only restates the schema, so baseline 3 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?
States a specific verb and resource ('List all document series') plus scope ('for the active company', 'optionally filtered by type'). It then defines what a document series actually is (numbering prefixes for invoices, proformas, credit notes, delivery notes), which distinguishes it from sibling mutation tools like document_series_create or document_series_set_default.
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 'optionally filtered by type' clause implies when to use the filter, and the mention of the active company implies the companyId override scenario. However, it never explicitly names an alternative tool (e.g., document_series_create if none exist, or document_series_numbering_decision for number selection), so the agent must infer routing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
document_series_numbering_decisionARead-onlyIdempotent
Decizia de numerotare: the yearly internal decision (OMFP 2634/2015) that names the person responsible for allocating document numbers and lists, per document type, the series and the number range allocated for the year. Built from the company's document series: first number = the first number issued in that year (or the next free number), planned last number = first + rangeSize - 1 (extended to the highest number already issued). Returns the decision as JSON (company identification, legal basis, rows with firstNumber/lastNumber/format, warnings for missing representative or registration number); pass outFile to save the signed-ready PDF instead ("DECIZIA nr. … din …", table, signature block, Romanian).
| Name | Required | Description | Default |
|---|---|---|---|
| year | No | Year of the decision (default: current year) | |
| outFile | No | Where to write the PDF; when omitted the decision is returned as JSON | |
| companyId | No | Company UUID override (uses active company if not set) | |
| rangeSize | No | Numbers allocated per series; planned last number = first + rangeSize - 1 (default 9999) | |
| responsible | No | Person responsible for numbering (default: the company representative) | |
| decisionDate | No | Decision date YYYY-MM-DD (default 1 January of the year) | |
| decisionNumber | No | Decision number (default 1) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/non-destructive, and the description adds substantial behavior beyond that: the numbering arithmetic (first = first issued or next free, last = first + rangeSize - 1, extended to the highest number already issued), the warning conditions for a missing representative or registration number, and the PDF layout when outFile is supplied. The one nuance left unstated is that supplying outFile writes a file to disk, which is a mild side effect not reflected in readOnlyHint=true.
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?
Front-loaded with the definition and legal basis, then derivation rules, then return/output behavior — a logical order with no filler. It is dense (two long sentences packing many clauses), so it is slightly heavy to parse, but every clause carries information an agent needs.
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 no output schema, 7 optional parameters and no annotations covering semantics, the description does the heavy lifting: it describes the returned JSON sections and the PDF contents, plus the warning cases. It does not say what happens when no document series exist for the company or how errors surface, which is the main remaining gap.
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, but the description goes further by explaining what rangeSize actually produces (the extension to the highest already-issued number) and contrasting the two output modes governed by outFile (JSON vs signed-ready PDF). year, decisionDate, decisionNumber and responsible are left largely to the schema, but the schema documents them adequately.
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 identifies the concrete artifact produced (the yearly numbering decision under OMFP 2634/2015) and how it is derived from the company's document series, which clearly separates it from siblings like document_series_list or document_series_create. The generation verb itself is only implied ('Returns the decision as JSON', 'pass outFile to save the PDF') rather than stated up front, which keeps it just short of a 5.
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?
Usage is implied by the legal framing (a yearly decision naming the numbering-responsible person), so an agent can infer this is the once-a-year compliance document for a company. However, there is no explicit when-to-use / when-not-to-use statement and no alternative tool is named (e.g. document_series_list for inspecting series, document_generate for other documents).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
document_series_set_defaultAIdempotent
Set a document series as the default for its type. The default series is auto-selected when creating new documents of that type. Only one series can be default per type.
| Name | Required | Description | Default |
|---|---|---|---|
| uuid | Yes | Document series UUID to set as default | |
| companyId | No | Company UUID override (uses active company if not set) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare the mutation profile (readOnlyHint=false, destructiveHint=false, idempotentHint=true), and the description adds real semantic context beyond them: the default is used at document-creation time and only one default exists per type, implying a prior default is displaced. It doesn't state outright that the previous default is unset or what the response returns.
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 sentences, front-loaded with the action, each carrying a distinct fact (what it does, when it takes effect, the one-per-type constraint). 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?
For a two-parameter, non-destructive, idempotent mutation with a fully documented schema and no output schema, the description covers the essentials. The only minor gap is whether setting a new default clears the old one and what the call returns.
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?
Both parameters (uuid, companyId) are fully documented in the schema at 100% coverage, so the schema carries this dimension. The description adds no meaning about the uuid or the companyId override, so baseline 3 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?
States a specific verb and resource ('Set a document series as the default') plus the scope ('for its type'), which is distinguishable from document_series_update and document_series_list. It never names a sibling explicitly, so it stops short of a 5.
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?
Explains the operational consequence — the default series is auto-selected when creating new documents of that type — which tells the agent when this matters. It offers no explicit exclusions or pointer to an alternative (e.g., use document_series_update to change other fields), leaving that to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
document_series_updateAIdempotent
Update an existing document series. Only "currentNumber" and "active" can be changed — prefix and type are immutable after creation. Use active=false to deactivate a series (e.g., at end of fiscal year). Changing currentNumber affects the next document number, use with extreme caution to avoid duplicates.
| Name | Required | Description | Default |
|---|---|---|---|
| uuid | Yes | Document series UUID to update | |
| active | No | Set series active or inactive (inactive = not available for new documents) | |
| companyId | No | Company UUID override (uses active company if not set) | |
| currentNumber | No | Update the last used number (CAUTION: setting lower than max existing number may create duplicates) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations cover safety hints (non-read-only, idempotent, non-destructive), and the description adds what annotations cannot say: which fields are immutable after creation, what deactivation actually means operationally, and that changing currentNumber shifts the next issued document number with a duplicate risk. That is meaningful consequence-level context beyond the structured metadata.
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, then allowed mutations, then the operational warning. No filler, no restatement of the tool name.
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 4-param mutation tool with no output schema, the definition covers scope, mutable vs immutable fields, and the main failure mode. It does not say what the call returns or whether any permission/role is required, which is a minor gap given annotations already signal it is a non-destructive, idempotent write.
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, but the description adds semantics the schema lacks: prefix and type are immutable (a constraint statement, not a field doc), and it frames currentNumber as affecting the *next* document number rather than just the stored counter. uuid and companyId are left to the schema, which is fine at full 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?
States a specific verb and resource ('Update an existing document series') and immediately bounds the mutable surface, which distinguishes it from document_series_create, document_series_delete and document_series_set_default without opening any schema.
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?
Gives a concrete usage scenario ('Use active=false to deactivate a series, e.g., at end of fiscal year') and a caution condition for currentNumber. It does not explicitly name sibling alternatives (e.g., create/delete for other lifecycle operations), so it stops short of full routing guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
document_typesARead-onlyIdempotent
Standard Romanian legal documents Storno can generate from structured fields (public, nothing stored): conventie_incetare_inchiriere (rental termination agreement between locator and locatar) and declaratie_incetare_contract (the locator's sworn statement that a rental contract ended, used as the mandatory C168 attachment). Returns each type with its required fields.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, non-destructive and closed-world, so the safety profile is covered. The description adds genuinely new behavioral context: '(public, nothing stored)' reassures the agent there are no persistence side effects, and 'Returns each type with its required fields' discloses the shape of the response in the absence of an output 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 with no filler; the resource and privacy posture are front-loaded and the per-type definitions earn their space by letting the agent pick the right type without a follow-up call. The parenthetical definitions are slightly dense but not redundant.
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 zero-parameter catalog tool with rich annotations and no output schema, the description covers what the tool returns (each type plus required fields) and the key caveat (public, nothing stored). A brief note on whether the list is static or configurable would fully close the gap, but nothing essential to correct invocation is missing.
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 tool takes zero parameters and the input schema is an empty object, so there is nothing for the description to disambiguate. Baseline 4 applies; no parameter-level gaps exist to compensate for.
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 names the concrete resource — standard Romanian legal document types Storno can generate — and enumerates the two specific types with one-line definitions, so an agent can distinguish it from generation tools like document_generate or dosare_c168_create. The only weakness is that the listing verb appears late ('Returns each type with its required fields') rather than up front, so the tool's action is inferred for the first clause.
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?
Usage is implied rather than stated: the mention that declaratie_incetare_contract is 'the mandatory C168 attachment' hints this catalog precedes dosare_c168_create, and 'can generate from structured fields' hints it precedes document_generate. There is no explicit when-to-use, no when-not, and no named alternative, leaving the agent to infer the sequencing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
dosare_actionsARead-onlyIdempotent
What needs the user's attention across all dosare: "todo" (rejected filings with the reason, requests in error, dosare flagged for a decision, deadlines within 14 days, contracts expiring within 60 days, unread somații/decizii), "inProgress" (filings ANAF is processing, requests without answer) and "answers" (recipisas, answers, certificates received in the last 14 days). Start here when the user asks "what do I have to do?".
| Name | Required | Description | Default |
|---|---|---|---|
| companyId | No | Company UUID (overrides STORNO_COMPANY_ID env var) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, non-destructive and closed-world, so safety is covered; the description adds genuinely new behavioral detail: the exact buckets returned and the concrete thresholds (deadlines within 14 days, contracts expiring within 60 days, receipts from the last 14 days). It does not state whether results are counts or full records, nor any pagination/size limits, which leaves a gap for a tool with no output 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?
The purpose is front-loaded in the first clause, followed by a compact inline enumeration of the three buckets, then the trigger phrase last. The parenthetical lists are dense but each item carries decision-relevant information about what qualifies as an 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?
With no output schema, the description correctly takes on the burden of describing the return shape via bucket names and contents, and the time thresholds make the inclusion criteria unambiguous. What is missing is the response structure (counts vs. items, ordering, truncation) — minor but relevant for an agent deciding whether to call it first.
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?
There is a single optional parameter with 100% schema description coverage, which already documents companyId as a UUID overriding the env var. The description never mentions the parameter or what happens when it is omitted (all companies vs. env-configured company), so it adds no meaning beyond the schema; baseline 3 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?
States a specific resource (all dosare) and an aggregation purpose (what needs the user's attention), then names the three returned buckets with their contents. An agent can tell this is a cross-dosare triage view rather than a list/get tool like dosare_list or dosare_get without opening either schema.
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 closing sentence 'Start here when the user asks "what do I have to do?"' gives an explicit trigger with a concrete user utterance. It does not name alternatives or exclusions (e.g., when to prefer dosare_list or dosare_stats instead), so it stops short of a full when/when-not routing rule.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
dosare_annual_returnAIdempotent
Ensure the "Declarația unică " dosar (one per filing year) with its 25 May deadline; returns it. Default year: the one whose 25 May is next. Deadline reminders go out 30, 7 and 1 days before.
| Name | Required | Description | Default |
|---|---|---|---|
| an | No | Filing year, e.g. 2026 for the income of 2025 | |
| companyId | No | Company UUID (overrides STORNO_COMPANY_ID env var) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already state idempotent=true, destructive=false, and readOnly=false, so the description need not repeat safety basics. It adds useful behavior beyond annotations: one dosar per filing year, the 25 May deadline, the default-year rule, and reminder timing.
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 short and front-loaded with the core action and resource. Every sentence carries useful information: purpose, default behavior, and reminder timing.
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 an idempotent ensure-style tool with 100% schema coverage and annotations covering safety, the description is mostly complete. The remaining gap is that "returns it" is not further explained and there is no output schema, but the tool's main behavior is sufficiently described.
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 schema already documents both parameters. The description nonetheless adds meaningful meaning for "an" by specifying the default year: the one whose 25 May is next. The companyId override is left entirely to 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 uses a specific verb, "Ensure," and names the exact resource: the "Declarația unică <an>" dosar, one per filing year. It is clear what the tool produces, though it does not explicitly contrast itself with sibling tools such as dosare_create or dosare_get.
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?
Usage is implied: call this to get or create the annual return dosar for a filing year, with a default year if omitted. However, the description gives no explicit when-not-to-use guidance or named alternatives among the many dosare_* siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
dosare_attachAIdempotent
Attach (or detach) a declaration, an SPV request or an ANAF message to a dosar. A declaration brings its archived recipisas along; a request brings its answer.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Dosar id | |
| detach | No | true → remove the link instead | |
| companyId | No | Company UUID (overrides STORNO_COMPANY_ID env var) | |
| requestId | No | ||
| documentId | No | ||
| declarationId | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover safety (readOnlyHint=false, destructiveHint=false, idempotentHint=true), yet the description adds real behavior beyond them: attaching a declaration cascades its archived recipisas, and attaching a request brings its answer along. That cascade side effect is precisely the kind of context annotations cannot express. It omits what detaching does to those carried-over artifacts.
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, front-loaded with the verb and target entities, followed by the cascade behavior. No filler or restatement of the title.
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 6-parameter mutation with no output schema, the description covers the core linking semantics but leaves gaps: no mention of the identifier exclusivity rule, no note on the companyId override interaction, and no indication of the success response or failure modes.
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?
At 50% schema coverage, three UUID parameters (declarationId, requestId, documentId) have no schema description, and the description only loosely hints at their meaning through the entity list. It never states the likely rule that exactly one of the three identifiers should be supplied alongside the required dosar id, which is the key invocation constraint.
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?
Names a specific verb (attach/detach) and the exact resource classes it operates on (declaration, SPV request, ANAF message) linked to a dosar, which is concrete and non-tautological. It does not explicitly contrast itself with adjacent dosare_* tools such as dosare_document or dosare_files_upload, so sibling differentiation is left to inference.
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?
Usage is implied by the entities named, and the detach flag's effect is stated ('remove the link instead'). However there is no explicit guidance on when to use this versus dosare_document / dosare_files_upload, nor on whether the linking parameters are mutually exclusive.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
dosare_billingARead-onlyIdempotent
Everything invoiced between the landlord and the tenant of a rental dosar (matched by the tenant's CUI/CNP on clients and suppliers): the recurring invoice, the invoices issued to the tenant with paid / partial / unpaid / overdue state and days overdue, totals per currency, the invoices received from the tenant (e.g. works compensated with the rent) and, when the dosar records an investment clause, the compensation balance. Answers "did the tenant pay?" and "how much rent is outstanding?".
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Rental-contract dosar id | |
| companyId | No | Company UUID (overrides STORNO_COMPANY_ID env var) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the read-only/idempotent/closed-world profile, so the description's added value lies elsewhere and it delivers: it explains the matching rule (tenant CUI/CNP looked up across clients and suppliers) and that the compensation balance appears only when the dosar records an investment clause. It does not touch on volume or response shape, but the conditional-inclusion disclosure is real behavioral context.
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?
One dense sentence enumerating the returned blocks plus one short sentence of user-facing intent. Every clause maps to a distinct content section, and the core subject is front-loaded, though the nested parenthetical list is heavier than strictly necessary.
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 no output schema and only two input params, the description must carry the return-value burden, and it does so by enumerating the included sections and the overdue-state semantics. What remains unspecified is the response structure/format, a minor gap for an aggregation 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% — both `id` (rental-contract dosar id) and `companyId` (company override) are documented in the schema. The description adds no parameter-level detail, so the baseline of 3 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?
It states precisely what the tool returns for a rental dosar: recurring invoice, issued invoices with paid/partial/unpaid/overdue state, per-currency totals, received invoices, and a conditional compensation balance. This is clearly distinguishable from generic siblings like dosare_get or dosare_stats, though no sibling is named to make the boundary explicit.
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 closing questions ("did the tenant pay?", "how much rent is outstanding?") imply when to reach for this tool, which is useful routing. However, it never states explicitly that this is the billing view versus dosare_get/dosare_stats, nor any prerequisites or exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
dosare_c168_createA
Create the C168 declaration in the dosar from the reviewed input (schema: declaration_form_spec C168) with the attachment: dosar files by id (fileIds) and/or local files (attachmentPaths) — the scanned contract for a registration, the addendum for an amendment, the termination document or the signed sworn statement for a termination. Storno applies its rules (errors → 422 with issues), stores the reviewed addresses in the dosar for next time and sets the next step. Then declarations_validate and declarations_file_via_agent. ANAF processes one C168 per landlord and period at a time.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Rental-contract dosar id | |
| input | No | Reviewed C168 input; omitted → the prefill as is | |
| actiune | Yes | ||
| fileIds | No | ||
| companyId | No | Company UUID (overrides STORNO_COMPANY_ID env var) | |
| attachmentPaths | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only mark it as a non-readonly, non-destructive, non-idempotent closed-world write. The description adds real behavior beyond that: Storno rule enforcement with errors surfaced as 422 with issues, a persistent side effect (reviewed addresses stored in the dosar for next use), and that it advances the dosar's next step. It does not disclose response shape or what happens on retry (relevant given idempotentHint=false).
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 action and its inputs come first, then validation/workflow, then the ANAF business constraint last. Despite the em-dash clause enumerating attachment types, every clause carries operative information — no filler or restatement of the title.
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 6-parameter mutation with nested input object, no output schema, and only partial schema descriptions, the definition covers inputs, error behavior, side effects, and follow-up tools. The main remaining gap is the return value (e.g. the created declaration id) which, with no output schema, is left entirely to inference.
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 50%, and the description compensates by explaining the two undocumented attachment params (fileIds = dosar files by id, attachmentPaths = local files) and by mapping actiune to the required attachment type — scanned contract for a registration, addendum for an amendment, termination document or signed sworn statement for a termination. It does not spell out the actiune enum values themselves or clarify whether both attachment sources can be combined.
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?
States a specific verb and resource ("Create the C168 declaration in the dosar") and scopes the source of data ("reviewed input", schema declaration_form_spec C168). This clearly separates it from dosare_c168_prefill (which produces the input) and dosare_d212_create (a different form), so an agent can route without opening the schema.
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?
Gives the sequencing context explicitly: consume the reviewed input, then run declarations_validate and declarations_file_via_agent. It also states the business constraint that ANAF processes one C168 per landlord and period at a time, which affects when the call can succeed. It stops short of stating explicit exclusions or prerequisites (e.g. that prefill must exist first) or what to do on 422 beyond the error signal.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
dosare_c168_prefillARead-onlyIdempotent
The C168 input (registration / amendment / termination of the rental contract) prefilled from a rental-contract dosar and the company, with Storno's rule issues listing what is still missing (nomenclator address codes for the property, tenant and landlord; tenant CNP …). Fill the gaps with anaf_nomenclator_* and the user, then dosare_c168_create. Also lists the dosar files that can be attached.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Rental-contract dosar id | |
| actiune | No | ||
| companyId | No | Company UUID (overrides STORNO_COMPANY_ID env var) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnly, idempotent, non-destructive, closed-world), and the description adds behavior beyond them by disclosing what the response contains: the prefilled C168 fields, a Storno rule-issue list of what is still missing (address nomenclator codes, tenant CNP), and the dosar files that can be attached. It does not describe failure modes when the dosar lacks required data, which keeps it from a 5.
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?
Front-loaded with the operation and its output, then the next-step instructions; every sentence carries information. The nested parentheticals make it dense but not padded.
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 no output schema, the description still tells the agent exactly what comes back and what to do with each part, and the three-parameter input is fully accounted for. Missing only error/precondition behavior for dosars that fail Storno validation.
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%: id and companyId are documented, but actiune has an enum with no description. The description compensates by spelling out the three modes (registration / amendment / termination) and by indicating that company context is pulled implicitly, adding 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?
States a specific verb (prefill) plus the exact resource (the C168 input for registration/amendment/termination of a rental contract) and the source data (rental-contract dosar + company). It is clearly separable from the sibling dosare_c168_create, which it names as the downstream writer.
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?
Gives a concrete procedure: call this first, fill the gaps listed with anaf_nomenclator_* and the user, then call dosare_c168_create. That is real routing guidance with named alternatives, though it never states when this tool should be skipped or what happens if the dosar is of the wrong type.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
dosare_createA
Create a dosar. For a rental contract pass subject {numar, data (contract date), adresa (property), chirias, chiriasCif (tenant CNP/CUI — needed for C168), chirie (monthly), moneda, deLa, panaLa, dataIncetare?}: the title and the 30-day C168 deadline are derived. For the yearly Declarația unică use dosare_annual_return instead. Other types: title, deadlineAt, deadlineLabel, nextStep, notes.
| Name | Required | Description | Default |
|---|---|---|---|
| type | Yes | ||
| notes | No | ||
| title | No | ||
| status | No | ||
| subject | No | ||
| nextStep | No | ||
| companyId | No | Company UUID (overrides STORNO_COMPANY_ID env var) | |
| deadlineAt | No | YYYY-MM-DD | |
| deadlineLabel | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare a non-read-only, non-destructive, non-idempotent create operation. The description adds useful derived-field behavior (title and 30-day C168 deadline) and required rental subject fields, but it does not disclose validation, side effects, permissions, or what is returned.
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 purpose is front-loaded, and the field guidance is dense but largely information-bearing. The long subject-object clause is somewhat hard to scan, but there is little wasted text.
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 9-parameter create tool with a nested object and no output schema, the description supplies the most important type-specific field guidance and the annual-return alternative. It still has gaps around the status parameter, all enum type values, and the response behavior.
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 low at 22%, so the description must compensate. It does this well for the nested subject object by naming and explaining many rental-contract fields, and it maps title, deadlineAt, deadlineLabel, nextStep, and notes to other types; status and the full type enum remain unexplained.
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 gives a specific verb and resource ('Create a dosar') and distinguishes the rental-contract path from the annual-return sibling. However, 'dosar' is not defined and the other type values are only loosely addressed.
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 explicitly routes yearly Declarația unică to dosare_annual_return instead and explains what to pass for rental_contract. It does not clarify when to use the C168 or D212 sibling tools, even though C168 is referenced.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
dosare_d212_createA
Create the D212 draft (rent scenario) inside a Declarația unică dosar from the reviewed input (schema: declaration_form_spec D212; omit input to use the prefill as is). The draft then goes through declarations_validate (ANAF DUKIntegrator), declarations_prepare / declarations_agent_result (sign + file with the certificate through the local agent) and the recipisa lands in the dosar.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | ||
| input | No | ||
| companyId | No | Company UUID (overrides STORNO_COMPANY_ID env var) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare create semantics (readOnlyHint=false, destructiveHint=false, idempotentHint=false, openWorldHint=false). The description adds value beyond that: the result is only a draft (not a submission), and it names the exact follow-on path — declarations_validate, declarations_prepare / declarations_agent_result, recipisa into the dosar. It does not say what happens on duplicate drafts or what the create call returns.
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 action, then the optional-input rule, then the lifecycle. Every clause carries information the agent needs and nothing is repeated from the schema or annotations.
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 mutating tool with a nested freeform input object and no output schema, the description covers the workflow but not the return value (draft identifier? dosar id?) that later steps like declarations_validate would need, nor failure behavior. Adequate to make the call, but thin on what comes back.
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 only 33%, so the description must carry weight, and it does: it explains that 'input' is optional and that omitting it falls back to the prefill as-is, and it ties the input shape to the declaration_form_spec D212 schema. 'id' is only implied to be the dosar id via 'inside a ... dosar', and companyId is left to 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 verb and resource are concrete: it creates a D212 draft (rent scenario) inside a Declarația unică dosar, which the agent can distinguish from the c168 siblings by the declaration code and from dosare_d212_prefill by the 'draft from reviewed input' framing. It stops short of naming the prefill sibling as the source tool, so the boundary is inferred rather than stated.
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 a clear use condition ('from the reviewed input') and an explicit branch for the alternative mode ('omit input to use the prefill as is'). It also positions the call in the downstream sequence. It does not say when not to use it (e.g., an existing draft already present, or that prefill must be run/reviewed first).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
dosare_d212_prefillARead-onlyIdempotent
D212 rent-scenario input prefilled from the rental-contract dosare for the income year of a Declarația unică dosar (contract, period within the year, gross rent = monthly rent × months for RON contracts; foreign-currency rents come back as 0 with a note to convert at BNR rates). Review it with the user, then dosare_d212_create.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Declarația unică dosar id | |
| companyId | No | Company UUID (overrides STORNO_COMPANY_ID env var) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnly, idempotent, non-destructive), and the description adds real behavioral detail beyond them: how gross rent is derived (monthly rent × months for RON contracts) and the important caveat that foreign-currency rents return 0 with a conversion note. Minor gaps remain around missing-contract cases and the exact returned shape.
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?
One dense sentence plus a short imperative, with the core action front-loaded and the calculation rule and edge case packed in without filler. The parenthetical is heavy but every clause carries 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?
There is no output schema, so the description carries the burden of saying what comes back, and it does: contract, period within the year, gross rent value, and the 0-with-note behavior for foreign currency. Only the handling of missing data (no contract in year) is left unexplained.
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 both parameters (id, companyId) are documented in the schema, so baseline 3 applies. The description implies the dosar id selects the income year but adds no syntax or override detail 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?
States a specific verb (prefill) plus the exact resource (D212 rent-scenario input) and its data source (the rental-contract dosare tied to a Declarația unică dosar's income year). It is clearly distinguishable from the sibling dosare_d212_create, which it names as the follow-up step.
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 sequences the workflow: review the prefill with the user, then call dosare_d212_create. It does not state a when-not condition (e.g., what to do if no rental contract exists in the year), but the intended context is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
dosare_deleteADestructiveIdempotent
Delete a dosar. Its declarations, requests and messages are kept, only ungrouped.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | ||
| companyId | No | Company UUID (overrides STORNO_COMPANY_ID env var) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true and idempotentHint=true, so the description's main added value is explaining what is destroyed versus retained. It explicitly states that declarations, requests, and messages are kept and only ungrouped, which is important behavioral context beyond the annotations. It does not discuss permissions or recovery, but the key side effect is disclosed.
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 short sentences with no wasted text. The primary action is front-loaded and the retention behavior follows immediately.
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 destructive delete with no output schema, the description covers the most important effect: the dosar is deleted while its declarations, requests, and messages remain but become ungrouped. It is not fully complete because it omits parameter guidance and any permission or irreversibility context, but the core behavior is clear.
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 does not mention either parameter and adds no meaning beyond the input schema. The schema documents companyId but leaves id with only its name, type, and required status, so at 50% schema description coverage the description should compensate and does not.
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 states a specific verb and resource: 'Delete a dosar.' It also clarifies the non-obvious outcome that related declarations, requests, and messages are kept rather than deleted. This distinguishes it clearly from sibling tools such as dosare_update or dosare_get.
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 when to use the tool because it deletes a dosar, but it does not explicitly say when to choose deletion over alternatives such as updating or ungrouping through another operation. It also gives no prerequisites, warnings, or exclusions for a destructive operation.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
dosare_documentARead-onlyIdempotent
Generate a legal document from a rental-contract dosar, prefilled with the landlord (company), tenant, contract and property: 'conventie_incetare_inchiriere' (termination agreement), 'declaratie_incetare_contract' (landlord's sworn statement, the C168 termination attachment), 'act_aditional_inchiriere' (addendum: extension and/or new rent; fields act{numar,data}, prelungire{data_inceput,data_sfarsit}, chirie_noua{suma,valuta,de_la}) or 'notificare_incetare_inchiriere' (termination notice: data_incetare, preaviz_zile, motiv). Without render you get the prefilled fields to review with the user; with render:true and the reviewed fields (overrides) you get the PDF (written to outFile when given). Sign it by hand or with agent_sign_pdf, then attach it to the C168 termination.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Rental-contract dosar id | |
| type | Yes | ||
| fields | No | Overrides for the prefilled fields (e.g. locatar.adresa, data_incetare, motiv) | |
| render | No | ||
| outFile | No | ||
| companyId | No | Company UUID (overrides STORNO_COMPANY_ID env var) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations declare readOnlyHint=true, but the description says the PDF is 'written to outFile when given', which is a filesystem side effect and contradicts the read-only annotation. This is an annotation contradiction, so the behavioral transparency score is capped at 1 despite otherwise useful workflow disclosure.
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 dense and front-loads the core action and supported document types. It is a long paragraph, but nearly all content is relevant to selection or invocation; minor structural improvement could come from breaking the type list into clearer segments.
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 complex tool with no output schema, the description explains the two return modes (prefilled fields vs PDF) and the downstream signing/attachment workflow. It does not cover error behavior or permission requirements, but the main invocation and output expectations are clear.
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 description coverage is only 50%, but the description compensates by explaining each enum value for `type` and by naming type-specific nested fields such as act{numar,data}, prelungire{...}, and chirie_noua{...}. It also clarifies the semantics of render, fields overrides, and outFile.
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?
States a specific verb and resource: generate a legal document from a rental-contract dosar. It enumerates the four document types with local-language names and parenthetical explanations, making the tool's scope distinguishable from siblings.
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?
Explains the review-first workflow: call without render to get prefilled fields, then with render:true and reviewed fields to get the PDF. It also names the signing step via agent_sign_pdf and attachment to C168, though it does not explicitly distinguish when to use this versus other document-generation siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
dosare_files_downloadARead-onlyIdempotent
Download a file kept in a dosar to a local path (e.g. to sign it with agent_sign_pdf, then upload the signed copy with dosare_files_upload).
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Dosar id | |
| fileId | Yes | ||
| outFile | Yes | ||
| companyId | No | Company UUID (overrides STORNO_COMPANY_ID env var) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint/idempotent/non-destructive, and the description adds a key detail the annotations omit: the tool writes a file to a local path, so 'read-only' applies to the server, not the filesystem. It does not say whether an existing outFile is overwritten or whether parent directories are created.
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?
A single sentence that front-loads the action and resource before the optional workflow hint. No redundant restatement of the title.
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 download tool with full safety annotations and a simple 4-param schema, the description covers the essential context. Minor gaps remain around overwrite behavior and what the call returns (a local path vs. confirmation), but no output schema is needed to correct 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 50%: id and companyId are documented in the schema, while fileId and outFile are not. The description supplies meaning for outFile ('local path') but says nothing about fileId beyond the dosar context, so it only partially compensates.
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?
States a specific verb (Download) and resource (a file kept in a dosar) plus the destination (a local path). It also implicitly distinguishes itself from dosare_files_upload by naming the opposite operation in the workflow.
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?
Gives a concrete usage scenario — download, sign with agent_sign_pdf, re-upload — which tells an agent where this fits in a chain. It stops short of stating exclusions or prerequisites, but no competing download sibling exists for dosare files.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
dosare_files_uploadA
Put a file into a dosar: the scanned contract (kind contract), an addendum (act_aditional), the termination document or the signed sworn statement (incetare), a signed declaration (declaratie), anything else (altele). PDF, JPG, PNG or TIFF, up to 10 MB. Files in a dosar become the zip attachment of the C168 filed from it.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Dosar id | |
| kind | No | ||
| path | Yes | Local file path | |
| companyId | No | Company UUID (overrides STORNO_COMPANY_ID env var) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false, idempotentHint=false and destructiveHint=false, so the bar is lower. The description still adds non-obvious behavior: accepted formats (PDF/JPG/PNG/TIFF), a 10 MB size cap, and the downstream effect that uploaded files become the zip attachment of the C168 filed from the dosar — all information an agent cannot get from 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 sentences, front-loaded with the purpose and document-kind mapping, then constraints, then downstream effect. Slightly list-heavy in the kind enumeration, but every clause carries information an agent needs.
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 4-parameter mutating tool with no output schema, the description covers purpose, valid kinds, file constraints and the consequence of uploading. What remains unaddressed is permission/auth requirements and duplicate-handling, which are secondary for a non-destructive, non-idempotent upload.
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 75%, so the schema already documents id, path and companyId. The description adds meaning the schema lacks: the semantic intent of each `kind` enum value and the constraints on the file at `path` (formats and 10 MB limit). companyId's override behavior is left entirely to the schema, which is acceptable at this 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?
States a specific verb and resource ('put a file into a dosar') and immediately disambiguates the resource further by mapping each `kind` value to a concrete document type. An agent can tell this is the write-side companion of dosare_files_download without opening the schema.
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 kind-to-document mapping implicitly guides which value to pass, which is real usage help. However, it never says when to use this tool instead of the sibling dosare_attach, nor any preconditions (does the dosar need to exist, are duplicates rejected?). Use is implied rather than stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
dosare_getBRead-onlyIdempotent
One dosar with its linked declarations, SPV requests, ANAF messages and the chronological timeline (filed, index, recipisa, answers).
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | ||
| companyId | No | Company UUID (overrides STORNO_COMPANY_ID env var) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, destructiveHint=false and closed-world scope, so the safety profile is covered. The description adds genuine value by disclosing the aggregate payload composition (declarations, SPV requests, ANAF messages, timeline stages like 'recipisa'), but says nothing about error behavior for a missing id or how companyId overrides affect scope.
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?
A single dense sentence with zero filler, and the key payload contents are front-loaded. It is a noun fragment rather than a statement of action, which slightly reduces immediate parseability.
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 no output schema, the description must carry the return-value burden, and it does a reasonable job of listing the aggregated sections. However, for an aggregate detail tool it omits id format, not-found behavior, and whether the timeline is paginated or bounded.
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 only 50% — companyId is documented in the schema, but id (required, uuid) has no description. The tool description adds no parameter information at all, so it does not compensate for the uncovered half; an agent gets no hint about the id format or the companyId override semantics from the description.
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 names the specific resource (one dosar) and enumerates exactly what is bundled with it — linked declarations, SPV requests, ANAF messages, and a chronological timeline. That singular scope implicitly separates it from dosare_list, but it never states the retrieval verb or the id-based lookup explicitly.
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?
Usage is only implied: 'One dosar' signals singular detail retrieval versus the sibling dosare_list. There is no explicit when-to-use/when-not, no mention of related_get, dosare_stats, or dosare_document as alternatives, and no prerequisites (e.g., company context) are stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
dosare_listBRead-onlyIdempotent
Case files (dosare) of the company: rental contracts (with tenant, rent, period, the 30-day C168 deadline), yearly Declarația unică dosare (25 May deadline), periodic returns, fiscal standing. Each carries status (active / attention / closed), next step, deadline with days left, and counts of linked declarations, SPV requests and ANAF messages.
| Name | Required | Description | Default |
|---|---|---|---|
| type | No | ||
| status | No | ||
| clientId | No | Only dosare linked to this client (the tenant) | |
| companyId | No | Company UUID (overrides STORNO_COMPANY_ID env var) | |
| supplierId | No | Only dosare linked to this supplier |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so safety behavior is covered. The description adds useful context about returned fields such as status, next step, deadline days left, and linked counts, but it does not mention pagination, permissions, or filtering 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 compact and front-loads the core resource definition before listing fields and categories. It is somewhat dense and could better signal the listing action, but every sentence contributes useful 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?
With no output schema and only 60% schema coverage, the description partially compensates by describing returned fields like status, deadlines, and linked counts. However, it leaves out important listing behavior such as pagination, result ordering, and how the optional filters affect the returned set.
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 60%, and the description adds some meaning by enumerating case types and status values that map to the type and status enums. It does not explain the filtering roles of clientId, supplierId, or companyId beyond what the schema already provides, so the 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 identifies the resource as company case files (dosare) and enumerates the relevant categories: rental contracts, annual returns, periodic returns, and fiscal standing. It stops short of explicitly saying 'list' and does not distinguish the tool from sibling dosare_get, but the resource scope is still clear.
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 such as dosare_get, dosare_stats, or dosare_create. It implies a listing use case through its field summary, but there are no explicit usage conditions or exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
dosare_registry_importA
Create rental-contract dosare for registry contracts (pass the contract objects from dosare_registry_proposals, usually those with existingDosarId null). Terminated contracts become closed dosare; expired ones without a termination filing are flagged for attention (file C168 încetare or an addendum).
| Name | Required | Description | Default |
|---|---|---|---|
| companyId | No | Company UUID (overrides STORNO_COMPANY_ID env var) | |
| contracts | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare non-readonly, non-idempotent, non-destructive, and the description adds real business behavior on top: terminated contracts become closed dosare and expired ones without a termination filing are flagged for attention. It does not discuss what happens to contracts that already have an existingDosarId or how partial failures surface on a non-idempotent bulk write, so the disclosure is strong but not complete.
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 the action and the input source, then the downstream business rules. Dense but every clause carries domain information; the Romanian filing codes (C168 încetare) are legitimate domain vocabulary rather than padding.
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 non-idempotent bulk mutation with no output schema, the description says nothing about the response (created dosar ids vs. per-contract errors), retry safety, or maximum batch size. The core workflow is covered, but an agent cannot predict what it gets back or how to handle a re-run.
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 only 50% and the undocumented parameter is the required one (contracts, an untyped object array with no schema description); the description compensates by naming the exact source of those objects and the existingDosarId null heuristic. companyId is left to the schema, which is fine given it already documents the env-var override.
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?
"Create rental-contract dosare for registry contracts" gives a specific verb and a narrowly scoped resource, and it explicitly names dosare_registry_proposals as the input source, which separates it from the generic dosare_create sibling.
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 tells the agent exactly what to pass (contract objects from dosare_registry_proposals, typically the ones with existingDosarId null) and what to do for flagged cases (file C168 încetare or an addendum), which effectively routes to dosare_c168_create. It never states when not to use this versus dosare_create for manual dosar creation, so the bar for a 5 isn't met.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
dosare_registry_proposalsARead-onlyIdempotent
Contracts listed in ANAF's registry extract ("Registrul contractelor de locatiune", the answer to the C168 SPV request — request it with spv_request_prepare type C168) with their state after all filings (active / expired without termination / terminated), each matched to the existing dosare. Reads the newest extract archived in the SPV inbox, or the PDF at pdfPath. Then dosare_registry_import for the ones without a dosar.
| Name | Required | Description | Default |
|---|---|---|---|
| pdfPath | No | Local PDF of the extract, when it was downloaded by hand | |
| companyId | No | Company UUID (overrides STORNO_COMPANY_ID env var) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish readOnly, idempotent, non-destructive, closed-world behavior, so the safety profile is covered. The description adds useful context: it reads the newest extract from the SPV inbox by default or the PDF at pdfPath, and only proposes rather than creating dosare. It does not say how many proposals it returns or what happens to already-matched contracts.
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 dense but every clause supports a decision: source, prerequisite, output semantics, and next step. The nested parentheticals and quotes make it harder to parse than necessary, but there is 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?
For a two-optional-parameter read tool with annotations covering its safety profile, the description is complete enough to call it. Without an output schema, it would ideally say more about the returned proposal structure, but it conveys the essential matched-to-dosare result.
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 both pdfPath and companyId are documented in the schema. The description reinforces pdfPath as the manual-download alternative, but adds no syntax or precedence detail beyond that. Baseline 3 is appropriate given the schema does the heavy lifting.
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?
States a specific resource (contracts from ANAF's C168 registry extract) and what it produces (each contract's state after all filings, matched to existing dosare). It also distinguishes itself from the sibling dosare_registry_import by positioning itself as the step that runs first.
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 explains the upstream prerequisite (request the extract via spv_request_prepare type C168) and explicitly routes records without a dosar to dosare_registry_import. The chain is clear, though there is no explicit statement of when not to use it, for example if an extract is already processed.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
dosare_statsARead-onlyIdempotent
Rental portfolio of the company: every property with tenant, rent, period, active/expiring state and linked declarations; active contracts; contracts expiring within 60 days; monthly rent by currency; expected gross rent per income year from the contracts (RON) versus what the D212s declared per year (with the declaration status). Answers "how much rent did I collect and declare last year?".
| Name | Required | Description | Default |
|---|---|---|---|
| companyId | No | Company UUID (overrides STORNO_COMPANY_ID env var) | |
| csvOutFile | No | Write the portfolio as a CSV file to this path instead of returning JSON |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish readOnlyHint=true, idempotentHint=true, destructiveHint=false and openWorldHint=false, so safety is covered. The description adds genuine context beyond that: it is a cross-contract aggregation that also joins D212 declaration data and declaration status, which tells the agent this is a derived, multi-source read rather than a simple record fetch. It omits any note on cost/latency or result size for what is clearly a heavy aggregate.
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 definition is front-loaded with the resource and then enumerates returned sections, with the human-facing question placed last as a retrieval cue. It is dense but every clause maps to real returned data; the semicolon chain is slightly hard to scan but no sentence is 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?
With no output schema, the description carries the burden of explaining return values, and it does so section by section (portfolio, active contracts, expiring contracts, rent by currency, expected vs declared per year). Combined with a fully documented two-parameter schema and read-only annotations, an agent has enough to call it correctly and anticipate the response shape.
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 both parameters (companyId override of STORNO_COMPANY_ID, csvOutFile CSV destination) are already documented in the schema. The description only indirectly touches companyId via "of the company" and never references the CSV output mode. Baseline 3 is appropriate when the schema carries parameter semantics.
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 names a specific resource (the company's rental portfolio statistics) and enumerates exactly what the aggregate contains: per-property tenant/rent/period/state, active contracts, contracts expiring in 60 days, rent by currency, and expected-vs-declared rent per income year. That is far more specific than a title restatement. It does not, however, explicitly contrast itself with nearby siblings such as dosare_list or dosare_annual_return, so an agent must infer that this is the aggregated/derived view.
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 closing question ("how much rent did I collect and declare last year?") implicitly frames the intended use as annual rent-vs-D212 reconciliation. There is no explicit when-to-use statement, no exclusion of dosare_list/dosare_annual_return/dashboard_stats, and no stated prerequisites (e.g., contracts must exist, D212s must be filed) to get meaningful output.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
dosare_updateAIdempotent
Update a dosar: title, subject fields (merged), status (active / attention / closed), nextStep, deadlineAt + deadlineLabel, notes, and the link to the other party as a client / supplier of the company (clientId / supplierId; null unlinks). The link is found by the tenant CUI/CNP automatically when a dosar is created; set it by hand when the client record has a different identifier.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | ||
| notes | No | ||
| title | No | ||
| status | No | ||
| subject | No | ||
| clientId | No | ||
| nextStep | No | ||
| companyId | No | Company UUID (overrides STORNO_COMPANY_ID env var) | |
| deadlineAt | No | ||
| supplierId | No | ||
| deadlineLabel | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare idempotentHint=true and destructiveHint=false, so the safety profile is covered. The description adds genuinely non-obvious behavior with 'null unlinks' for clientId/supplierId and the auto-linking rule at creation time. It does not say whether omitted fields are left untouched (PATCH semantics) versus reset, which matters a lot on a 10-optional-parameter mutation.
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?
Field list is front-loaded right after the verb, and the second sentence covers the one non-obvious linking rule. Dense but every sentence carries information; the parenthetical field grouping keeps the enumeration compact.
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 an 11-parameter mutation with no output schema and near-zero schema descriptions, the definition covers most of what matters but leaves one significant hole: whether this is a partial update (unspecified fields preserved) or a replace. 'subject fields (merged)' hints at merge semantics only for that one nested object, leaving the top-level semantics ambiguous.
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 only 9% (just companyId), so the description has to carry the load and largely does: it explains the status enum values, the deadlineAt + deadlineLabel pairing, that subject fields are merged, and that passing null to clientId/supplierId unlinks. Only id and companyId are left to the schema, which is reasonable.
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?
States a specific verb (update) and resource (dosar) and enumerates exactly which fields can be changed, so an agent knows the tool's scope immediately. It does not explicitly contrast with dosare_create / dosare_get, but the verb makes the distinction self-evident.
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?
There is targeted guidance for one case: set the client/supplier link manually when the client record has a different identifier, since creation auto-resolves it by tenant CUI/CNP. However, there is no general when-to-use framing, no note on when to use this versus a specialized tool like dosare_attach or the d212/c168 prefill tools, and no prerequisites stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
efactura_messages_getARead-onlyIdempotent
Get full details of a specific e-Factura message including both parsed details and raw ANAF response data. Includes related invoice information when available. Useful for diagnosing specific invoice upload errors.
| Name | Required | Description | Default |
|---|---|---|---|
| uuid | Yes | UUID of the e-Factura message to retrieve |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, non-destructive behavior, and a closed-world scope. The description adds valuable behavioral context by stating that the response includes parsed details, raw ANAF response data, and related invoice information when available.
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 efficient sentences with the core action front-loaded. Each sentence adds useful information: response contents, related invoice inclusion, and diagnostic use.
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 one-parameter, read-only detail tool with rich annotations and no output schema, the description provides enough context about what is returned and why to use it. It could be slightly more complete by explicitly routing list/browse use to efactura_messages_list, but nothing critical is missing for invocation.
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 the single uuid parameter, so the structured input already explains the parameter fully. The description does not add syntax or selection guidance beyond saying it retrieves a 'specific e-Factura message', so the baseline of 3 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?
The description uses a specific verb and resource: 'Get full details of a specific e-Factura message'. It clearly distinguishes detail retrieval from listing by saying 'specific message', though it does not explicitly name the sibling list tool as the alternative.
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 gives a clear use context: 'Useful for diagnosing specific invoice upload errors.' That helps an agent decide when this tool is appropriate, but it does not state when not to use it or explicitly compare it with efactura_messages_list or invoices_efactura_message.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
efactura_messages_listBRead-onlyIdempotent
List e-Factura messages from the ANAF SPV platform with pagination and filtering. Messages include responses to uploaded invoices, notifications (accepted/rejected), errors, warnings, and informational messages. Useful for troubleshooting invoice upload issues.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | Page number (default: 1) | |
| limit | No | Items per page (default: 20, max: 100) | |
| status | No | Filter by message status | |
| messageType | No | Filter by message type |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, openWorldHint=false and destructiveHint=false, so the safety profile is covered. The description adds that results are paginated/filterable and what message categories appear, but says nothing about ordering, defaults for missing data, or ANAF SPV availability/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?
Three short sentences, front-loaded with the verb/resource, then content scope, then use case. No repetition or filler; slight redundancy between the enumerated message types and the schema enums.
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 list with full annotations this is close to sufficient, but with no output schema the description should hint at what a message record contains (id, date, status, reference) and should route to efactura_messages_get for details. Those gaps are real though not severe.
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 enums are documented in-schema, so the baseline is 3. The description mentions pagination and filtering in prose and its message-type list mirrors the messageType enum, but it adds no format or default 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?
States a specific verb and resource (list e-Factura messages from the ANAF SPV platform) and enumerates the message content types, so an agent knows what this returns. It does not, however, distinguish itself from the close sibling efactura_messages_get or from spv_documents_list.
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?
"Useful for troubleshooting invoice upload issues" implies a use case, but there is no explicit when-to-use/when-not guidance and no pointer to efactura_messages_get for single-message retrieval or to invoices_efactura_message for per-invoice context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
einvoice_config_deleteADestructiveIdempotent
Delete an e-invoice provider configuration for a company. Removes the provider settings and disables submissions for that provider. Existing submissions are not affected.
| Name | Required | Description | Default |
|---|---|---|---|
| provider | Yes | E-invoicing provider to remove | |
| companyId | No | Company UUID (uses default if not specified) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already flag destructiveHint=true and idempotentHint=true; the description adds real value beyond them by specifying what is removed (provider settings), the side effect (submissions disabled for that provider), and that existing submissions are untouched. It does not say whether the deletion is reversible or requires confirmation.
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 sentences, front-loaded with the action, then the effect, then the scope caveat. 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?
For a destructive config mutation with no output schema, the description covers what changes and what is preserved, which is the key agent decision input. Missing only irreversibility/confirmation and recovery notes, which are modest gaps given the destructive annotation.
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%, including the provider enum and the companyId default behavior, so the schema carries the parameter burden. The description only implies the company scoping and adds no format or constraint details.
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?
States a specific verb and resource (delete e-invoice provider configuration for a company) and scopes it to provider settings. It is clearly distinct from einvoice_config_list/save/test, though it never names which sibling is the alternative.
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?
Usage is implied by 'delete ... configuration', but there is no explicit when-to-use / when-not guidance, e.g. whether to use einvoice_config_save to merely disable a provider instead of removing it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
einvoice_config_listARead-onlyIdempotent
List all e-invoice provider configurations for a company. Shows which providers are enabled and their settings (API credentials, routing codes, etc.). Provider-specific config fields: anaf (managed via ANAF tokens), xrechnung (clientId, clientSecret for ZRE), sdi (certPath, certPassword or apiEndpoint, apiKey), ksef (authToken, nip), facturx (clientId, clientSecret, siret for Chorus Pro).
| Name | Required | Description | Default |
|---|---|---|---|
| companyId | No | Company UUID (uses default if not specified) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true and destructiveHint=false, so the safety profile is covered. The description's added value is moderate: it discloses that the response includes sensitive material (API credentials, clientSecret, certPassword, authToken), which is genuinely useful context an agent won't get from annotations. With substantial annotation coverage, this lands at a 3.
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?
Purpose is front-loaded in the first sentence, followed by a compact enumeration of per-provider fields. The third sentence is dense but earns its place because there is no output schema and the agent otherwise cannot interpret provider-specific keys; nothing is redundant.
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 one optional parameter, full schema coverage, and no output schema, the description does the needed extra work by describing what a returned config contains and which fields belong to each of the five providers. It stops short of saying what happens when no config exists for a provider or whether secrets are masked, which is the only meaningful gap.
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 single companyId parameter already documents the default-company fallback, so the schema carries the semantics. The description only echoes "for a company" and adds no format or selection detail beyond the schema — baseline 3 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?
The description opens with a specific verb+resource ("List all e-invoice provider configurations for a company") and immediately qualifies the scope (providers enabled, their settings). It doesn't explicitly name a sibling like einvoice_config_save or einvoice_providers, so the distinction from those is left implicit, but "List all" is unambiguous against the write/delete siblings.
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?
Usage is implied: this is the read path, with einvoice_config_save/delete/test as the obvious write counterparts, but the description never states when to choose this over einvoice_providers or when a config would not exist. No exclusions or prerequisites (e.g., auth to ANAF for the anaf provider) are given.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
einvoice_config_saveAIdempotent
Create or update an e-invoice provider configuration for a company. Use this to enable a provider and set API credentials. Config is provider-specific JSON: xrechnung requires {clientId, clientSecret} for ZRE API; sdi requires {certPath, certPassword} or {apiEndpoint, apiKey} for intermediary; ksef requires {authToken, nip}; facturx requires {clientId, clientSecret, siret} for Chorus Pro. ANAF config is managed separately via ANAF tokens.
| Name | Required | Description | Default |
|---|---|---|---|
| config | No | Provider-specific configuration as JSON object | |
| enabled | No | Whether this provider is active (default: true) | |
| provider | Yes | E-invoicing provider to configure | |
| companyId | No | Company UUID (uses default if not specified) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare idempotentHint=true, destructiveHint=false, and readOnlyHint=false, so the safety and repeat-call profile is covered. The description adds that config is provider-specific and that ANAF is out of scope, but it does not say whether an existing configuration is overwritten, whether credentials are validated against the provider, or what a successful call returns.
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?
Front-loaded with the purpose, then the use case, then the credentials spec, then the ANAF exclusion. The dense per-provider enumeration is semicolon-structured and every clause carries information an agent needs to build a valid call.
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 4-parameter upsert with a nested free-form object and no output schema, the description covers the hardest part (valid config shapes) and the scope boundary. Remaining gaps are overwrite semantics and error behavior on invalid credentials.
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 leaves `config` as a free-form object with additionalProperties and no key documentation; the description supplies exactly the missing per-provider key sets (xrechnung clientId/clientSecret, sdi certPath/certPassword or apiEndpoint/apiKey, ksef authToken/nip, facturx clientId/clientSecret/siret). That is real added meaning beyond the 100% 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?
States a specific verb pair and resource: 'Create or update an e-invoice provider configuration for a company.' That is unmistakably distinct from the sibling read/delete/test tools (einvoice_config_list, einvoice_config_delete, einvoice_config_test) and from einvoice_submit.
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?
'Use this to enable a provider and set API credentials' gives a concrete when-to-use condition, and the closing sentence explicitly excludes ANAF by pointing to the separate ANAF token flow (anaf_tokens). It stops short of naming the exact sibling tools for validation or listing, but the routing signal is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
einvoice_config_testA
Test e-invoice provider connection with given credentials before saving. Validates that the credentials can authenticate with the provider API. Supports: xrechnung (ZRE OAuth2), sdi (intermediary API or cert validation), ksef (session init), facturx (Chorus Pro OAuth2). ANAF uses a separate OAuth flow and cannot be tested here.
| Name | Required | Description | Default |
|---|---|---|---|
| config | Yes | Provider-specific credentials to test. xrechnung: {clientId, clientSecret}; sdi: {apiEndpoint, apiKey} or {certPassword}; ksef: {authToken, nip}; facturx: {clientId, clientSecret} | |
| provider | Yes | E-invoicing provider to test connection for | |
| companyId | No | Company UUID (uses default if not specified) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only say openWorldHint=true, readOnlyHint=false, idempotentHint=false; the description adds the substantive behavior — actual outbound authentication against each provider's API (ZRE/Chorus Pro OAuth2, SDI cert validation, KSeF session init) — which explains failure modes. It does not say whether a failed test has side effects (e.g. session creation on KSeF), a minor gap.
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?
Four short sentences, front-loaded with the action and purpose, then the supported provider matrix, then the exclusion. No filler and nothing that could be cut without losing routing 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?
With no output schema, the description should say what a test yields; it implies a pass/fail authentication result but not the error detail returned. For a dry-run validation tool with annotated external behavior this is nearly complete, with only the response shape left implicit.
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 config parameter already enumerates the exact per-provider credential keys, so the schema carries most of the load. The description adds only the auth mechanism behind each variant (OAuth2 vs cert validation vs session init), which helps interpret errors but does not extend the parameter contract itself; baseline 3 fits.
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?
States a specific verb (test/validate) and a specific resource (e-invoice provider credentials) and immediately separates itself from the save path with 'before saving'. The per-provider list makes it unmistakable versus siblings like einvoice_config_save, einvoice_config_list, storage_config_test and mailer_config_test.
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?
'before saving' gives clear context for when to invoke it rather than just persisting config, and the ANAF sentence is an explicit exclusion that redirects the agent to a separate OAuth flow. It stops short of naming the save sibling outright, but the usage condition is unambiguous.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
einvoice_providersARead-onlyIdempotent
List all available e-invoicing providers. Returns provider identifiers, labels, and country codes. Providers include: anaf (Romania), xrechnung (Germany), sdi (Italy), ksef (Poland), facturx (France).
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, destructiveHint=false and openWorldHint=false, so the safety profile is covered. The description goes beyond them by disclosing the return payload's shape (identifiers, labels, country codes) and the fixed set of providers, which is the main behavioral fact for a static catalog. A minor gap remains about whether the list can be extended.
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 sentences, front-loaded with the action and return fields, followed by a compact provider legend that earns its place by telling the agent which identifiers are valid. 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?
With no output schema, the description adequately compensates by naming the returned fields and enumerating the providers. It leaves slightly unclear whether this catalog is exhaustive/static or per-tenant, but nothing critical for correct invocation is missing.
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 tool takes zero parameters, so the baseline is 4; there are no inputs whose semantics need explaining, and the description correctly doesn't invent any.
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?
States a specific verb and resource ('List all available e-invoicing providers') and enumerates the returned fields plus the concrete provider set, so the agent knows exactly what comes back. This clearly distinguishes it from configuration/sibling tools like einvoice_config_list or einvoice_submit.
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?
Usage is only implied: an agent can infer it should call this before configuring or submitting e-invoices, but there is no explicit when-to-use, when-not, or named alternative. No prerequisites or exclusions are stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
einvoice_submissionsARead-onlyIdempotent
List all e-invoice submissions for a specific invoice. Shows submission history across all providers (ANAF, XRechnung, SDI, KSeF, Factur-X) with status, external IDs, error messages, and metadata. Note: ANAF submissions are tracked separately via the existing e-Factura flow and may not appear here.
| Name | Required | Description | Default |
|---|---|---|---|
| uuid | Yes | UUID of the invoice | |
| companyId | No | Company UUID (uses default if not specified) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, non-destructive behavior. The description adds real value beyond that: it lists the providers covered and the fields returned (status, external IDs, error messages, metadata), and it discloses an important data-coverage gap for ANAF. Pagination and result limits remain unmentioned.
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 the purpose, followed by returned data and the caveat. No filler. The provider list inside parentheses is slightly dense but earns its place by defining the coverage scope.
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 a read-only tool, two fully documented parameters, and no output schema, the description covers what the agent needs: what is returned, which providers are included, and where results may be missing. Only pagination/ordering behavior is left unspecified, which is minor here.
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 uuid and companyId documented in the schema. The description only reinforces that the query is scoped to a specific invoice and adds no syntax or default detail beyond what the schema already provides. 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?
States a specific verb and resource ('List all e-invoice submissions for a specific invoice') plus the scope of providers covered. The ANAF caveat effectively differentiates it from the e-Factura sibling flow, so an agent can tell it apart from efactura_messages_list and einvoice_submit without opening schemas.
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?
Implied usage is clear: fetch submission history for one invoice. The ANAF note names the alternative flow and warns when results will be incomplete, which is a genuine routing hint. It stops short of a full when-to-use / when-not-to-use statement (e.g., relative to einvoice_submit or einvoice_providers).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
einvoice_submitA
Submit an invoice to an e-invoicing provider. Supports all EU providers: anaf (Romania e-Factura), xrechnung (Germany), sdi (Italy), ksef (Poland), facturx (France). For ANAF, uses the existing e-Factura submission flow. For other providers, generates country-specific XML and optionally submits via API if credentials are configured.
| Name | Required | Description | Default |
|---|---|---|---|
| uuid | Yes | UUID of the invoice to submit | |
| provider | Yes | E-invoicing provider: anaf (Romania), xrechnung (Germany), sdi (Italy), ksef (Poland), facturx (France) | |
| companyId | No | Company UUID (uses default if not specified) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false, openWorldHint=true, idempotentHint=false; the description adds genuinely useful behavior beyond that: non-ANAF providers generate country-specific XML and only call the remote API if credentials are configured, which tells the agent the effect can be either local generation or an external irreversible submission. It does not cover failure modes, retry safety, or what is returned after a submission.
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 the action, then the provider matrix, then the behavioral branch. Efficient and scannable; the only waste is the provider list being restated from the enum.
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 3-parameter mutation tool with no output schema, the description covers what is submitted, where it goes, and the conditional remote call, which is enough to call it correctly. Missing is the post-submission picture (does it return a submission id, is it tracked by einvoice_submissions) and any precondition on invoice state.
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 all three parameters (uuid, provider, companyId) are already documented, and the provider list in the description merely repeats the enum description. The description adds no meaning about the uuid's expected invoice state or what companyId defaulting entails, so the baseline 3 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?
States a specific verb and resource ("Submit an invoice to an e-invoicing provider") and enumerates the five supported providers with country mapping. It is clear what the tool does, though it never names the closest sibling (invoices_submit) to say how they differ, leaving the agent to infer the boundary.
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 provider list implies when to use it, and the sentence "For ANAF, uses the existing e-Factura submission flow" hints at a relationship to the ANAF tooling. But with siblings like invoices_submit, einvoice_providers and einvoice_config_test present, the description gives no explicit rule for choosing this tool over them and no stated prerequisites (e.g., must the invoice be issued first, must config exist?).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
email_templates_createA
Create a new email template. Templates support dynamic variables that are replaced with actual data when emails are sent. Use the category parameter to specify the document type: "invoice" (default), "delivery_note", or "receipt".
| Name | Required | Description | Default |
|---|---|---|---|
| body | Yes | Email body content (supports variables and Markdown formatting) | |
| name | Yes | Template name for internal reference | |
| subject | Yes | Email subject line (supports variables like [[invoice_number]]) | |
| category | No | Template category: "invoice" (default), "delivery_note", or "receipt" | |
| companyId | No | Company UUID (overrides configured default) | |
| isDefault | No | Set as default template (default: false). Only one template can be default per category |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare the mutation profile (readOnlyHint=false, destructiveHint=false, idempotentHint=false), so the description adds only the dynamic-variable substitution behavior and the category default. It says nothing about required permissions, whether creating a default template displaces an existing default, or validation of body/subject variables.
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 sentences, front-loaded with the action, zero filler. The middle sentence on dynamic variables earns its place; the category sentence is partly redundant with the schema.
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 6-param creation tool with 100% schema coverage and full annotations, the description covers what the resource is and the one non-obvious content behavior (variable substitution at send time). Missing only edge-case behavior around isDefault/companyId, which the schema describes adequately.
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 all six parameters are already documented. The description's category sentence merely restates the schema's enum and default, adding no new meaning for name/subject/body, while the more consequential companyId override and isDefault conflict rule are left entirely to 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?
States a specific verb+resource ('Create a new email template') and immediately scopes it with the variable/dynamic-content behavior. It does not name sibling alternatives, but the create/list/update/delete naming makes the distinction reasonably evident.
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?
Creation intent is implied clearly, but there is no explicit when-to-use context, no prerequisites (e.g. permissions, companyId override), and no pointer to email_templates_update for modifying an existing template.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
email_templates_deleteADestructiveIdempotent
Permanently delete an email template. Cannot delete the last remaining template or the default template (set another as default first). Emails already sent using this template are not affected.
| Name | Required | Description | Default |
|---|---|---|---|
| uuid | Yes | UUID of the email template to delete | |
| companyId | No | Company UUID (overrides configured default) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true and idempotentHint=true, so the safety profile is covered. The description adds material rules the annotations cannot express: two blocking conditions on deletion and the reassurance that already-sent emails are unaffected — precisely the blast-radius information an agent needs before a destructive call.
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 sentences, front-loaded with the action, then the blocking conditions, then the side-effect clarification. No filler and no repetition of what the schema or annotations already state.
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 two-parameter destructive delete with no output schema, the description covers the action, the failure modes, and the downstream impact. There is no meaningful gap an agent would need to close before calling it.
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% for both the required uuid and the optional companyId override, so the schema carries parameter meaning. The description adds nothing about either parameter, which meets the baseline-3 bar but no more.
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?
States a specific verb and resource — "Permanently delete an email template" — with the word "permanently" clarifying irreversibility. This cleanly separates it from sibling operations email_templates_list, email_templates_create, and email_templates_update without ambiguity.
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?
Gives concrete preconditions for successful use: the last remaining template cannot be deleted, and a default template must have its default status moved first. It stops short of naming the sibling tool to use for that (e.g. email_templates_update), leaving the agent to infer the follow-up action.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
email_templates_listARead-onlyIdempotent
List all email templates configured for the selected company. Templates support dynamic variables that are replaced with actual data when emails are sent. Use the category parameter to filter by document type: "invoice" (default), "delivery_note", or "receipt".
| Name | Required | Description | Default |
|---|---|---|---|
| category | No | Template category: "invoice" (default), "delivery_note", or "receipt" | |
| companyId | No | Company UUID (overrides configured default) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, destructiveHint=false and openWorldHint=false, so the safety profile is fully covered without the description. The description adds only the note about dynamic variables being resolved at send time and the default category; it says nothing about pagination, ordering, or what a returned template looks like. Useful but thin against an already-complete annotation set.
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 sentences with the core action front-loaded and no filler. The middle sentence about dynamic variables is tangential to a listing call but does provide context about what a template contains, so it earns partial keep.
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 two-parameter, optional-parameter read-only list tool with full schema coverage and complete annotations, the description covers action, scope, and filtering adequately. The only gap is the absence of any indication of return shape or result size, which is minor for this tool's 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% and the category enum is fully documented in the schema, including the default. The description restates the enum values and adds the framing that category corresponds to document type, plus 'selected company' hints that companyId falls back to configuration. That is marginal added meaning over a schema that already does the work, so baseline 3.
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?
States a specific verb and resource ('List all email templates') plus the scope ('configured for the selected company'), which is enough to distinguish it from the email_templates_create/update/delete siblings without opening any schema. It stops short of explicitly naming those siblings, so it lands at 4 rather than 5.
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 tells the agent how to use the category filter and gives the default, which is real usage guidance for the parameter. It does not say when to reach for this tool versus related listing tools (e.g. pdf_template_config_templates) or when listing is unnecessary, so usage is implied rather than framed as when/when-not.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
email_templates_updateAIdempotent
Update an existing email template. All fields are optional but at least one must be provided. Setting isDefault to true will unset the current default template in the same category.
| Name | Required | Description | Default |
|---|---|---|---|
| body | No | Email body content (supports variables and Markdown formatting) | |
| name | No | Template name for internal reference | |
| uuid | Yes | UUID of the email template to update | |
| subject | No | Email subject line (supports variables) | |
| companyId | No | Company UUID (overrides configured default) | |
| isDefault | No | Set as default template. Only one template can be default per category |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover safety traits such as idempotency and non-destructiveness. The description adds important behavior beyond annotations: at least one updatable field must be supplied, and setting isDefault to true unsets the current default template in the same category.
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 concise sentences, front-loads the core action, and includes only constraints and side effects that an agent needs in order to invoke the tool correctly.
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 an update mutation with annotations covering safety and a fully described input schema, the description is mostly complete. It could say more about return behavior or error cases, but no output schema exists and the key mutation side effect is disclosed.
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 schema already documents each parameter. The description still adds a useful cross-parameter constraint ('all fields are optional but at least one must be provided') and clarifies the side effect of isDefault beyond the schema's wording.
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 states a specific verb and resource: 'Update an existing email template.' This clearly distinguishes it from sibling operations such as email_templates_create, email_templates_list, and email_templates_delete.
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?
Usage is implied by 'update an existing' and the at-least-one-field constraint, but there is no explicit guidance on when to choose this tool over alternatives like create/delete/list 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.
exchange_rates_convertARead-onlyIdempotent
Convert an amount between two currencies using current BNR exchange rates. For non-RON to non-RON conversions, cross-rates through RON are calculated. Result is rounded to 2 decimal places.
| Name | Required | Description | Default |
|---|---|---|---|
| to | Yes | Target currency code (ISO 4217, e.g., RON, EUR, USD) | |
| date | No | Specific date for exchange rate (YYYY-MM-DD, defaults to latest rates) | |
| from | Yes | Source currency code (ISO 4217, e.g., EUR, USD, RON) | |
| amount | Yes | Amount to convert |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover read-only, idempotent, and open-world behavior, so the lower bar applies. The description still adds genuine context the annotations don't: non-RON cross-rates are computed through RON and the result is rounded to 2 decimals, both of which affect what the agent gets back.
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 sentences, front-loaded with the core action, followed by the two behaviors an agent would otherwise get wrong (cross-rate path and rounding). No filler whatsoever.
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 no output schema, the description usefully discloses the important result characteristics (cross-rate derivation, 2-decimal rounding). It stops short of describing the response shape — e.g. whether a rate value is returned alongside the converted amount — which would fully close the gap.
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 every parameter (from, to, amount, date) is already documented with format and default semantics. The description adds no parameter-level detail beyond implying rates are 'current', which the schema's date default already conveys — 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?
States a specific verb and resource — convert an amount between two currencies using BNR rates — which is clearly distinct from the sibling exchange_rates_list. It never names that sibling, so it falls just short of explicit differentiation, but an agent can still tell the two apart from the verb alone.
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?
Usage is implied by 'convert an amount between two currencies' rather than stated as when-to-use conditions. There is no explicit guidance on when to call this versus exchange_rates_list or how to handle conversions whose date matters, leaving the routing inference to the agent.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
exchange_rates_listARead-onlyIdempotent
Get current BNR (Banca Nationala a Romaniei) exchange rates. Rates are updated daily around 13:00 EET. Returns rates for all supported currencies expressed as: 1 foreign currency = X RON. On weekends and holidays, the last available rates are returned.
| Name | Required | Description | Default |
|---|---|---|---|
| date | No | Specific date for rates (YYYY-MM-DD, defaults to latest available rates) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint/idempotentHint/openWorldHint, yet the description adds real value: daily refresh around 13:00 EET and fallback to the last available rates on weekends and holidays. What remains unstated is pagination or a currency subset filter, though it says all supported currencies are returned, which pre-empts that question.
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 sentences, front-loaded with the purpose, then update cadence, then return format and edge-case behavior. No sentence is 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?
With no output schema, the description carries the burden of describing the return, and it does so by specifying the currency direction and the all-currencies scope. The only residual gap is that the schema's date parameter implies historical lookups the description never acknowledges.
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 single `date` parameter is fully documented in the schema (including the default to latest available), so the baseline 3 applies. The description's framing around "current" rates adds nuance but does not explain how the date parameter yields historical rates.
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?
Specific verb+resource ("Get current BNR exchange rates"), names the authoritative source and states the return semantics ("1 foreign currency = X RON"). It does not explicitly differentiate from the sibling exchange_rates_convert, so an agent must infer that this lists rates while that one performs a conversion.
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?
Usage context is implied by the weekend/holiday staleness note, which tells the agent the tool still returns data on non-business days. However, there is no explicit statement of when to prefer this over exchange_rates_convert or what to do with the returned rates.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
expiries_createA
Record something with an expiry date. Kinds: rca, itp, rovinieta, casco, tahograf (calibration), extinctor, trusa_medicala, licenta_transport, copie_conforma, leasing (contract end) — usually with a vehicleId — and certificat_digital, contract, autorizatie, other for the company. Members get the expiry.due notification remindDaysBefore days before (default 30), then 7 and 1 days before and on the day.
| Name | Required | Description | Default |
|---|---|---|---|
| kind | Yes | ||
| label | No | Display label (default: the kind's name, e.g. "RCA") | |
| notes | No | ||
| number | No | Policy / certificate / contract number | |
| provider | No | Insurer, ITP station, leasing company, certificate provider … | |
| companyId | No | Company UUID (overrides STORNO_COMPANY_ID env var) | |
| expiresAt | Yes | Expiry date, YYYY-MM-DD | |
| validFrom | No | Valid from, YYYY-MM-DD | |
| vehicleId | No | The vehicle the document belongs to; omit for a company-level item | |
| remindDaysBefore | No | First reminder this many days before (default 30); then 7, 1 and 0 days |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare the generic mutation profile (readOnly=false, idempotent=false, destructive=false), and the description goes meaningfully beyond that by disclosing the side effect: members receive the `expiry.due` notification at `remindDaysBefore` (default 30), then 7, 1, and 0 days before expiry. That notification cascade is real behavioral context an agent cannot get from structured fields. It does not cover duplicate handling or past-date behavior, so not a 5.
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?
Purpose is front-loaded in the first clause, followed by the kind taxonomy and then the notification behavior in priority order. It is dense and em-dash-heavy but every sentence carries information; the kind list is long but functional.
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 10-parameter create tool with an output-less mutation and annotations covering the safety profile, the description supplies the domain taxonomy, the vehicle-vs-company scoping rule, and the reminder behavior. Gaps remain around duplicate/conflict handling and what happens with an already-past `expiresAt`, but nothing essential to calling it correctly is missing.
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 80%, so the baseline is 3. The description does add some meaning the schema lacks, notably which kinds are vehicle-scoped vs company-scoped and the reminder cadence behind `remindDaysBefore`, but the remaining fields (label, notes, number, provider, validFrom, companyId) are left entirely to 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?
Opens with a concrete verb+resource ("Record something with an expiry date") and enumerates the domain-specific kinds, which lets an agent map the tool to compliance-document tracking. It is distinguishable from expiries_list/get/update/renew by being the creation path, though it never states that relationship explicitly.
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?
Implied usage only: the kind taxonomy hints that vehicle documents take a `vehicleId` while certificat_digital/contract/autorizatie/other are company-level, so an agent can infer which fields to supply. But there is no explicit when-to-use vs when-not, and no mention of when to prefer expiries_update or expiries_renew instead of creating a new record.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
expiries_deleteADestructiveIdempotent
Delete an expiry item. To keep the history, renew it or close it (expiries_update closed=true) instead.
| Name | Required | Description | Default |
|---|---|---|---|
| uuid | Yes | Expiry item UUID | |
| companyId | No | Company UUID (overrides STORNO_COMPANY_ID env var) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true, idempotentHint=true and readOnlyHint=false, so the safety profile is covered. The description adds real value beyond that by disclosing the consequence (history is lost) and the preservation path. It stops short of saying whether the delete is hard or soft or how to confirm it, which keeps it off a 5.
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, no filler, with the destructive action stated first and the safer alternative immediately behind it. Every clause earns its place.
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 two-parameter delete with full annotation coverage and no output schema, the description supplies the one thing annotations cannot: what is lost and what to do instead. Only the hard-vs-soft-delete semantics and recovery options are left unstated.
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 uuid and companyId are already documented and the description correctly does not repeat them. It does add cross-tool knowledge by citing `closed=true` on expiries_update, but nothing about this tool's own parameters, so the baseline 3 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?
States a specific verb and resource ('Delete an expiry item'), which cleanly separates it from expiries_get, expiries_renew and expiries_update in the sibling list. An agent can pick it without opening the schema.
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 names the alternatives (renew, or expiries_update with closed=true) and the condition that selects them ('to keep the history'). This is exactly the when-not-to-use-this guidance that matters for a destructive call.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
expiries_getCRead-onlyIdempotent
One expiry item with history: the items it renewed, newest first.
| Name | Required | Description | Default |
|---|---|---|---|
| uuid | Yes | Expiry item UUID | |
| companyId | No | Company UUID (overrides STORNO_COMPANY_ID env var) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, destructiveHint=false, so the safety profile is covered. The description adds genuinely new behavioral context by disclosing that the payload embeds a `history` collection ordered newest-first. It says nothing about not-found behavior or what the item itself contains, so it goes beyond annotations only modestly.
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?
A single clause with no filler, and the most useful fact — the embedded history and its ordering — is placed up front. It is efficient, though so compressed that the retrieval action and lookup key are never spelled out.
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 no output schema, the description carries the burden of describing the return value, and it only covers the `history` part while saying nothing about the expiry item's own fields. Annotations cover safety and the schema covers both parameters, so the remaining gap is the shape of the primary object rather than the call mechanics.
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 `uuid` and `companyId` (including the STORNO_COMPANY_ID override) are fully documented in the schema. The description adds no meaning about either parameter, so the baseline 3 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?
The description identifies the resource as a single expiry item and adds that a `history` collection of renewed items is included, which distinguishes it from the sibling `expiries_list` and `expiries_upcoming`. However, it is a noun phrase with no verb — the retrieval action is only implied by the tool name — and it never states that the item is looked up by UUID, leaving the core operation implicit.
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?
There is no when-to-use guidance, no statement of when to prefer this over `expiries_list` or `expiries_upcoming`, and no prerequisites or failure conditions. The singular framing hints at single-item lookup, but the agent must infer that from the name rather than the description.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
expiries_listARead-onlyIdempotent
Expiry items of the company, soonest first (expired ones come first): vehicle documents and company-level items. Each item carries daysLeft, status (ok | due — within remindDaysBefore — | expired | renewed), vehicle {id, plate, displayName} (null for company-level items) and renewedFromId. Filters: kind, vehicleId, companyLevel (items without a vehicle), includeClosed (renewed items, for the history).
| Name | Required | Description | Default |
|---|---|---|---|
| kind | No | ||
| companyId | No | Company UUID (overrides STORNO_COMPANY_ID env var) | |
| vehicleId | No | ||
| companyLevel | No | ||
| includeClosed | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint and destructiveHint=false, so the safety profile is covered. The description adds useful behavioral context — result ordering, the status vocabulary including the remindDaysBefore threshold, and the vehicle sub-object shape — but says nothing about pagination, result limits or permission 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?
A single dense paragraph, front-loaded with the resource and ordering, then return shape, then filters. Every clause carries information — no filler or restatement of the tool name.
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 exists, so describing the returned fields (daysLeft, status enum, vehicle, renewedFromId) is exactly the right compensation and it is done. Gaps remain on pagination/limits and on how `companyId` interacts with the environment default in the listing 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 only 20% schema coverage, the description carries most of the burden and does so: it explains `kind`, `vehicleId`, `companyLevel` and `includeClosed` (including the non-obvious closed/renewed semantics). Only `companyId` is left to the schema, and there it is documented.
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?
Names the resource (expiry items of the company), the scope (vehicle documents plus company-level items) and the sort order (soonest first, expired first). It never names a sibling such as expiries_upcoming or expiries_get, so the agent must infer which endpoint to use from the filter list alone.
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?
Filter semantics function as usage guidance: `companyLevel` is tied to items without a vehicle and `includeClosed` is explicitly labeled as being for history/renewed items. No explicit when-not or named alternative is given, but the conditions that select each filter are clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
expiries_renewA
Renew an expiry item: creates the next one (same kind, label, vehicle, provider and reminder setting) and closes the old one, kept as history (renewedFrom). Without expiresAt the usual validity of the kind is added to the old expiry (RCA / rovinietă / CASCO / certificate 12 months, ITP / tahograf 24, trusă medicală 36), counted from today when it had already expired. Returns item (the new one) and previous.
| Name | Required | Description | Default |
|---|---|---|---|
| uuid | Yes | Expiry item UUID to renew | |
| notes | No | ||
| number | No | New policy / document number | |
| provider | No | Default: the old provider | |
| companyId | No | Company UUID (overrides STORNO_COMPANY_ID env var) | |
| expiresAt | No | New expiry date, YYYY-MM-DD | |
| validFrom | No | Default: the old expiry date (or today when already expired) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already flag a non-read-only, non-destructive, non-idempotent write. The description adds real value beyond them: the old item is closed but preserved as history via renewedFrom, which fields are carried over, and exactly how expiresAt is defaulted per kind. It does not warn about duplicate renewals, though idempotentHint=false already signals that.
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?
Front-loads the action and its two-part effect, then the date defaulting, then the return shape. Dense but every clause carries information; only the long parenthetical duration list is a candidate for trimming.
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 write tool with no output schema, the description covers the side effects on both old and new records, the date-arithmetic fallback, and the returned keys ('item' and 'previous'). Nothing an agent needs in order to call it correctly is missing.
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 86%, so most parameters are documented already; the description still adds the derivation rule for expiresAt (kind-specific validity, counted from today if already expired) and confirms provider defaults to the old provider, which the schema states. That is meaningful semantics beyond the schema text.
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?
States a specific verb and resource ('Renew an expiry item') and immediately explains the compound behavior — creating the next item and closing the old one as history. That behavior distinguishes it from expiries_update and expiries_create without needing to name them explicitly.
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?
There is implied guidance about when the default validity kicks in ('Without expiresAt...'), but nothing says when to renew versus editing an item via expiries_update or creating a new one via expiries_create. The agent must infer the selection rule.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
expiries_upcomingARead-onlyIdempotent
What expires in the next days days (default 60, max 730), already expired items included, as flat rows {id, kind, label, number, provider, validFrom, expiresAt, daysLeft, status, remindDaysBefore, vehicleId, vehicle, notes} with counts {total, expired, due, ok}. The dashboard card uses the same list.
| Name | Required | Description | Default |
|---|---|---|---|
| days | No | ||
| companyId | No | Company UUID (overrides STORNO_COMPANY_ID env var) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/non-destructive, so the bar is lower. The description still adds real behavior: the 60-day default, the 730-day cap, and the fact that already-expired items are included rather than filtered out — a behavior an agent would otherwise have to guess.
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 time window and scope, followed by the exact return shape. No filler; every clause conveys either a constraint or a returned field.
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?
There is no output schema, so the description carries the return-value burden and does so thoroughly: all 13 row fields plus the counts aggregate. The remaining gap is relational — it doesn't say how it differs from expiries_list or expiries_get.
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 50%, with `days` undocumented in the schema; the description fills exactly that gap by giving its default (60) and ceiling (730) and stating it is a forward-looking window. `companyId` is covered by the schema. No detail on whether days counts from today or how expired items beyond the window behave.
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?
States a specific query ('what expires in the next `days` days') with scope qualifiers (default 60, max 730, expired items included). It never distinguishes itself from the sibling expiries_list, so an agent can't be certain which list tool to pick.
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 'already expired items included' note and the field/counts preview imply when this list is appropriate, and the dashboard-card remark hints at the use case. But there is no explicit 'use this instead of expiries_list when...' routing, which matters given a very close sibling exists.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
expiries_updateAIdempotent
Update an expiry item. Changing expiresAt restarts the reminders. vehicleId: null detaches it from the vehicle; closed: true closes it by hand (without creating the next one).
| Name | Required | Description | Default |
|---|---|---|---|
| kind | No | ||
| uuid | Yes | Expiry item UUID | |
| label | No | Display label (default: the kind's name, e.g. "RCA") | |
| notes | No | ||
| closed | No | ||
| number | No | Policy / certificate / contract number | |
| provider | No | Insurer, ITP station, leasing company, certificate provider … | |
| companyId | No | Company UUID (overrides STORNO_COMPANY_ID env var) | |
| expiresAt | No | ||
| validFrom | No | Valid from, YYYY-MM-DD | |
| vehicleId | No | ||
| remindDaysBefore | No | First reminder this many days before (default 30); then 7, 1 and 0 days |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish that this is a non-destructive, idempotent mutation, so the bar is lower. The description still adds real behavioral context beyond them: changing `expiresAt` restarts the reminder schedule, `vehicleId: null` detaches rather than deletes, and `closed: true` suppresses creation of the next item.
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 clauses, all front-loaded after the one-line purpose statement. Every clause carries non-obvious information (reminders, detach, no successor item); nothing is wasted.
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 12-parameter mutation tool with no output schema and annotations covering safety, the description covers the highest-risk side effects an agent could otherwise trigger accidentally. It does not state whether the update is partial (only supplied fields changed) or whether `kind` can be changed after creation, which keeps it short of full 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 moderate (58%), and the description supplies semantics the schema cannot: the reminder restart side effect of `expiresAt`, the detach meaning of a null `vehicleId`, and the manual-close meaning of `closed`. It leaves the remaining parameters (kind, label, notes, number, provider, companyId, validFrom, remindDaysBefore) entirely to the schema, so it is not exhaustive.
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?
States a specific verb and resource ("Update an expiry item"), which clearly separates it from expiries_create, expiries_delete and expiries_get. It does not name the closest sibling, expiries_renew, although the "without creating the next one" phrasing hints at the boundary.
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?
Usage is only implied: the closing note contrasts manual closure with automatic renewal, so an agent can infer when to prefer this over expiries_renew. There is no explicit statement of when to use this tool versus the alternatives, nor any prerequisites.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
exports_downloadARead-onlyIdempotent
Download a generated export file (ZIP archive). Export files are single-use and auto-deleted after download. The filename is typically provided by the endpoint that generated the export (e.g. POST /api/v1/invoices/export). Common formats: invoices-export-YYYY-MM.zip, vat-report-YYYY-MM.zip, clients-export-YYYY-MM-DD.zip.
| Name | Required | Description | Default |
|---|---|---|---|
| filename | Yes | Export filename to download (e.g. "invoices-export-2026-02.zip"). Obtained from the export generation endpoint response. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations, it discloses the crucial trait that exports are single-use and auto-deleted after download, warning the agent not to retry or double-fetch. It doesn't say what error or return shape appears when the file is expired or already consumed, and this 'consumed on read' behavior sits in some tension with the idempotentHint=true annotation, though it is not a direct 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?
Front-loads the action and the single-use warning, then the sourcing of the filename. The trailing list of common formats is mildly redundant but helps the agent sanity-check the argument, so it earns its place.
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?
There is no output schema, yet the description never says how the file is returned (bytes, base64, signed URL) or what a missing/expired export yields. For a one-parameter download tool this is the main remaining hole; the behavioral warning and filename sourcing cover the rest.
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 single parameter is already documented as coming from the export generation endpoint. The description reinforces this with format examples (invoices-export-YYYY-MM.zip) but adds no syntax, path, or validation rules the schema lacks.
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?
Specific verb and resource ('Download a generated export file (ZIP archive)') plus the clarifying 'generated', which separates it from the many export-generation siblings such as invoices_export_zip or clients_export_csv. An agent can tell which side of the generate/download pair this is.
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 explains where the filename comes from ('typically provided by the endpoint that generated the export (e.g. POST /api/v1/invoices/export)'), which implicitly routes the agent to a generation tool first. It never states an explicit exclusion or what to do if no filename is available, so it stops short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
fiscal_calendarARead-onlyIdempotent
Filing deadlines of the company for the next days days (default 60, max 366) from from (default today), plus the unfiled ones of the last month. Items: code (D300, D390, D394, D301, D100, D112, D406 SAF-T, D212, BILANT, and from the rental-contract dosare: C168 registration deadline, D212_ESTIMAT estimated income of a new contract for a natural person, CONTRACT_END contract end; these carry dosarId / dosarTitle), label, dueDate (moved to the next working day after weekends and Romanian legal holidays), nominalDueDate, daysLeft, period {year, month | quarter, from, to}, appliesBecause (vat_payer, intra_community_operations, non_vat_payer_foreign_suppliers, income_tax, employees, saft, individual, company, rental_contract), declarationType (the type to pass to declarations_create — D406 is generated in Storno as well, only the annual statements and the contract-end reminder carry null) and status: due, overdue (past due, nothing submitted) or filed (a submitted / accepted declaration of that type exists for the period). With allCompanies=true the list covers every company the user can see, each item carrying its company. The rules follow the company settings vatPeriod, incomeTaxPeriod and hasEmployees (companies_update).
| Name | Required | Description | Default |
|---|---|---|---|
| days | No | Window length in days (default 60) | |
| from | No | Start date YYYY-MM-DD (default today) | |
| companyId | No | Company UUID (overrides STORNO_COMPANY_ID env var) | |
| allCompanies | No | All companies of the organization instead of one (accountant view) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnly, idempotent, closed-world), and the description adds substantial behavior on top: how dueDate is shifted for weekends and Romanian legal holidays, what each status value means (filed requires a submitted/accepted declaration of that type for the period), which company settings (vatPeriod, incomeTaxPeriod, hasEmployees via companies_update) drive the rules, and what allCompanies changes.
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?
Purpose is front-loaded in the first clause, and with no output schema the long item-field enumeration does real work rather than repeating structured data. It is still a single dense paragraph with nested parentheticals that could be split into a return-shape list for faster scanning.
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 exists, so the description must carry the return shape — and it does: every item field (code, label, dueDate, nominalDueDate, daysLeft, period, appliesBecause, declarationType, status, dosarId/dosarTitle) is explained, along with the code catalog and the null cases for declarationType. For a read-only, 4-parameter, no-pagination tool this is complete enough to call 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 description coverage is 100%, so days/from/companyId/allCompanies are already documented in the schema, including defaults and the 366 cap. The description restates the same defaults and adds the accountant-view framing for allCompanies, but says nothing about companyId's env-var override, so it adds little beyond the structured field docs.
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?
Opens with a precise verb+resource+scope: filing deadlines for the next `days` days plus unfiled ones from the last month. It also routes to a sibling by noting declarationType is 'the type to pass to declarations_create', though it never contrasts itself with declarations_list or expiries_upcoming, so differentiation is inferred rather than stated.
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?
Usage context is clear: use it to see what is due in a window plus what was missed last month, and use allCompanies=true for the accountant view across every visible company. There is no explicit when-not guidance or named alternative for the case where the agent wants all declarations rather than deadlines.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
import_executeA
Execute an import job after mapping is confirmed. The import runs asynchronously via a message queue. Check status with import_get.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Import job ID | |
| companyId | No | Company UUID override (uses active company if not set) | |
| importOptions | No | Optional import options: markAsPaid (invoice imports); groupBy = week | day | order and platformName / platformCif / platformCountry (platform_sales); includeAll to import orders whose status is not paid / completed (WooCommerce, PrestaShop); cashRegisterName, vatGroups ({"1": "21", "2": "11", "3": "5", "4": "0"}) and paymentTypes ({"1": "cash", "3": "card"}) for receipts |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare this as a non-read-only, non-idempotent operation, and the description adds relevant behavior: execution is asynchronous via a message queue and status should be checked with import_get. It does not discuss retries, queue failures, permissions, or rate limits, but it adds meaningful operational 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 three short sentences with no waste, and the precondition is front-loaded before the asynchronous behavior and status-check routing. Every sentence earns its place.
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 an execute tool with a rich nested input schema and no output schema, the description covers the key calling context: mapping must be confirmed, execution is asynchronous, and status is checked via import_get. It could mention retry/error behavior, but the essential invocation guidance is present.
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, including detailed importOptions semantics and the companyId override. The description adds no additional parameter meaning beyond the schema, so the 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 states a specific verb and resource: execute an import job. It also distinguishes the action from the sibling status-check tool by naming import_get, and it establishes the precondition that mapping must already be confirmed.
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 says to use this after mapping is confirmed and points to import_get for status checks, which gives useful selection context. It does not explicitly list exclusions or name other nearby alternatives such as import_preview or import_mapping, so it stops short of fully prescriptive when/when-not guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
import_getARead-onlyIdempotent
Get full status and details of an import job including progress, row counts (imported, skipped, failed), and error details.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Import job ID | |
| companyId | No | Company UUID override (uses active company if not set) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint and non-destructive, so the safety profile is covered. The description adds real value by enumerating what the response contains (progress, imported/skipped/failed row counts, error details), which is important since there is no output 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?
A single front-loaded sentence with the verb and resource first and the returned fields after; no filler 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?
With no output schema, the description appropriately describes the returned data, and annotations cover safety. What's missing is call-sequence context (e.g., use after import_execute to poll progress), which would fully round it out.
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%: both id and companyId are documented in the schema, including the active-company fallback behavior. The description adds nothing about parameters, so the baseline 3 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?
States a specific verb (get) and resource (import job) plus the scope of what is returned (status, progress, row counts, error details). It is distinguishable from import_execute/import_upload, though the boundary with import_history is only inferable, not stated.
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 no indication of when to call this versus import_history (list jobs) or when to poll it relative to import_execute. An agent must infer that this retrieves a single job by ID and that import_history lists them.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
import_historyARead-onlyIdempotent
List past import jobs for the active company. Returns job ID, type, source, status, row counts, and timestamps.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Number of results (max 200, default: 50) | |
| companyId | No | Company UUID override (uses active company if not set) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and destructiveHint=false, so the safety profile is covered. The description adds the useful scoping note that results are limited to the active company, but says nothing about ordering, pagination beyond the limit parameter, or retention of historical jobs.
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 tight sentences: the first states the action and scope, the second enumerates the returned fields. The scope constraint is front-loaded and every clause carries 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 two-parameter list tool with no output schema, the description compensates by enumerating the return fields (job ID, type, source, status, row counts, timestamps). Only minor gaps remain, such as ordering of results and whether the limit affects pagination.
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 both 'limit' (max 200, default 50) and 'companyId' (UUID override) are already documented. The description's phrase 'for the active company' weakly reinforces the companyId override behavior but adds no syntax or formatting detail 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?
States a concrete verb and resource ('List past import jobs') with an explicit scope ('for the active company'), so it is clearly a read/history tool. It does not explicitly contrast itself with the sibling import_get (single job detail), so it stops short of a 5.
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 word 'past' and 'history' implies it is for reviewing previously run jobs rather than launching new ones, but usage is only inferred. No explicit when-to-use or when-not-to-use guidance, and no mention of when to prefer import_get for a specific job.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
import_mappingBRead-onlyIdempotent
Save column mapping for an import job. Maps CSV columns to Storno fields. Call after reviewing the preview to confirm or adjust mappings before executing.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Import job ID | |
| companyId | No | Company UUID override (uses active company if not set) | |
| columnMapping | Yes | Object mapping CSV column names to Storno field names |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description says 'Save column mapping', a write to the import job, while annotations declare readOnlyHint=true. An agent following the description would treat this as a mutation, contradicting the declared safety profile. No compensating detail (whether mappings are overwritten, whether they persist until execution) is given.
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 sentences with the action front-loaded and the workflow hint last; nothing is redundant. Slightly more compact would be ideal, but every sentence carries signal.
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 exists, and the description does not say what is returned or whether the mapping persists until import_execute. For a small 3-parameter tool the purpose and timing are covered, but the mutation semantics and result are left implicit.
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%, including the columnMapping nested object and companyId override, so the schema carries parameter meaning. The description only restates the mapping's direction (CSV column names to Storno field names) without adding new syntax or format detail.
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?
States a specific verb and resource ('Save column mapping for an import job') and adds what the mapping does ('Maps CSV columns to Storno fields'), which distinguishes it from siblings like import_preview and import_execute without naming 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?
Explicitly places the call in the workflow: 'Call after reviewing the preview to confirm or adjust mappings before executing.' The sequencing versus preview and execute is clear, though the sibling tools are not named and no exclusion case is given.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
import_previewARead-onlyIdempotent
Get a preview of an uploaded import job including detected columns, sample data, and column mapping suggestions. Use after uploading a file to review before executing.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Import job ID | |
| companyId | No | Company UUID override (uses active company if not set) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and destructiveHint=false, so the safety profile is covered. The description adds value the annotations cannot: what the response actually contains (detected columns, sample data, mapping suggestions), which matters because there is no output schema. It does not mention whether the preview expires or how long an import job stays previewable.
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, zero waste. The capability statement is front-loaded and the usage note follows it; nothing repeats the schema or the annotations.
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, two-parameter tool with no output schema, the description covers what it returns and where it fits in the import sequence. The only gaps are relatively fine operational details: preview lifetime and whether the mapping suggestions are applied via a separate 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% and both parameters carry their own descriptions, so the baseline is 3. The description implies the id comes from a prior upload ('after uploading a file'), which hints at the parameter's provenance, but adds no format, scoping, or companyId 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?
Specific verb ('Get a preview') plus a specific resource ('an uploaded import job') and an explicit enumeration of what the preview contains (detected columns, sample data, mapping suggestions). This separates it cleanly from import_upload, import_mapping, import_execute, and import_get without opening any schema.
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 sentence 'Use after uploading a file to review before executing' gives an explicit position in the workflow and implies the alternatives (upload first, execute later). It stops short of naming the sibling tools or stating exclusions, so it is clear context rather than a full when/when-not rule.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
import_revertADestructiveIdempotent
Revert a completed or cancelled import job: deletes every record it created (invoices and their lines, receipts, clients, payments) and marks the job as reverted. Use it to undo an import that mapped the wrong columns or grouped the statement the wrong way.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Import job ID | |
| companyId | No | Company UUID override (uses active company if not set) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already flag destructiveHint=true and idempotentHint=true, so the description's added value is the concrete destruction surface — exactly which entity types get removed and that the job is marked rather than deleted. It stops short of stating irreversibility or what happens to a job in an ineligible state, which would have completed the picture.
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, zero filler. The action and its destructive scope come first, and the supporting rationale trails it.
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 destructive, no-output-schema tool the description covers trigger conditions, destroyed entities, and resulting state. The one gap is the response shape — whether it reports counts or a summary — which the absent output schema leaves to the description.
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% for both parameters (id and companyId override), so the schema already carries the semantics. The description mentions none of them; baseline 3 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?
Specific verb (revert) plus resource (import job) and an explicit enumeration of the side effects: deleting invoices and lines, receipts, clients, payments, and flagging the job as reverted. There is no ambiguity about what this tool does or how it differs from import_execute/import_get.
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?
States the eligible precondition ('completed or cancelled import job') and gives concrete motivating scenarios (wrong column mapping, wrong statement grouping). It doesn't explicitly name a sibling alternative, but for a revert operation there is no plausible competing tool, so the guidance is effectively complete.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
import_sourcesARead-onlyIdempotent
Get available import sources and import types. Returns supported import sources (SmartBill, Saga, Oblio, FGO, Facturis, eMag, and the sales sources Uber, Bolt, Glovo, Tazz, WooCommerce, PrestaShop, cash_register) and import types (clients, products, invoices_issued, invoices_received, recurring_invoices, platform_sales, receipts).
| Name | Required | Description | Default |
|---|---|---|---|
| companyId | No | Company UUID override (uses active company if not set) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true and openWorldHint=false, so the safe-read profile is covered. The description adds genuine value by spelling out the concrete contents of the response (source and type enumerations) since there is no output schema, but it says nothing about scoping to the active company or the cost/stability of calling it repeatedly.
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 purpose, and the long enumeration is the payload rather than filler. Slightly dense but nothing redundant.
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 no-required-parameter, read-only enumeration tool with no output schema, listing the returned sources and types is the essential content and it is fully present. The only gap is not tying those values to the import_preview/import_execute workflow.
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?
There is only one optional parameter and schema description coverage is 100%, so the schema fully documents companyId as a UUID override that defaults to the active company. The description adds nothing about it, which is acceptable under the baseline-3 rule when the schema does the work.
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 opens with a concrete verb plus resource ('Get available import sources and import types') and then enumerates exactly what is returned, so an agent knows this is a static discovery/enumeration call rather than an import action. It does not explicitly contrast with sibling import_* tools such as import_template or import_preview, which is the only thing keeping it from a 5.
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?
Usage is only implied: an agent can infer it should call this before import_preview/import_execute to learn valid source and type values, but the description never states that sequencing or says when not to use it. No prerequisites or alternatives are mentioned.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
import_templateARead-onlyIdempotent
Download a CSV template for a specific import type. Returns base64-encoded CSV with column headers and example rows that can be filled in and uploaded via import_upload. Pass source for a platform or shop template (uber, bolt, glovo, tazz, woocommerce, prestashop) to get the columns of that export instead of the generic ones.
| Name | Required | Description | Default |
|---|---|---|---|
| source | No | Platform / shop whose column layout the template should use | |
| companyId | No | Company UUID override (uses active company if not set) | |
| importType | Yes | Type of import to get template for |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/non-destructive, and the description is consistent with that. It adds real context the annotations cannot: the response is base64-encoded CSV containing headers plus example rows, not a file or a URL. It does not mention size limits or company scoping, but the core behavior is disclosed.
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 the action, then the return shape, then the optional-parameter nuance. No filler and nothing that repeats the schema verbatim.
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 no output schema, the description carries the burden of describing the return value and does so precisely (base64 CSV with headers and example rows), and it connects to the downstream import_upload step. Nothing an agent needs to invoke this correctly is missing.
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 beats it by explaining that `source` swaps the column layout to a named platform's export format rather than just naming the enum. `importType` and `companyId` are not elaborated beyond the schema, which is acceptable since their descriptions are complete.
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?
States a specific verb and resource (download a CSV import template), names the required discriminator (importType), and contrasts the two modes (generic vs. platform/shop-specific columns). An agent can distinguish this from import_upload, import_preview, or import_sources without opening any schema.
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?
Makes the workflow position explicit — fill in the returned template and send it via import_upload — and explains when to pass `source` (to get a platform's export layout instead of generic columns). It stops short of naming a when-not or pointing at import_sources for discovering valid platform values.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
import_uploadA
Upload a file (CSV, XLSX, XML, or ZIP) to start a new import job. Requires importType (clients, products, invoices_issued, invoices_received, recurring_invoices, platform_sales, receipts) and source (smartbill, saga, oblio, fgo, facturis_online, easybill, ciel, factureaza, facturare_pro, icefact, bolt, facturis, emag, uber, glovo, tazz, woocommerce, prestashop, cash_register, generic). Platform statements (uber, bolt, glovo, tazz) use importType platform_sales and become one sales invoice to the platform plus the commission purchase invoice per group; shop exports (woocommerce, prestashop) use invoices_issued; the A4200 XML or a ZIP of a month exported by a fiscal cash register uses source cash_register with importType receipts. Returns the created import job with preview data.
| Name | Required | Description | Default |
|---|---|---|---|
| source | Yes | Source application the file was exported from | |
| filePath | Yes | Absolute path to the file to upload (CSV, XLSX, XML, or a ZIP of A4200 XML files) | |
| companyId | No | Company UUID override (uses active company if not set) | |
| importType | Yes | Type of data being imported |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false, idempotentHint=false and destructiveHint=false, so the mutation profile is known at baseline. The description adds real value by noting 'start a new import job' and 'Returns the created import job with preview data', implying data is staged rather than applied. However it does not say whether re-uploading the same file creates a duplicate job, or what privileges/company scoping are needed.
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?
Front-loaded with the action and accepted formats, then the domain rules. The exhaustive enum recitations in parentheses duplicate schema data and pad the text, but every clause carries mapping guidance that is not otherwise available.
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 4-parameter tool with full schema coverage and no output schema, the description covers inputs, accepted file types and the return value. It omits the natural follow-on steps (mapping/preview/execute) and file size or validation constraints, which an agent orchestrating an import would want.
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 goes beyond the schema by mapping domain sources to the correct importType, which the flat enums cannot convey. The long enumerated lists largely restate the schema enums, keeping this short of a 5.
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?
States a specific verb and resource ('Upload a file ... to start a new import job') plus the accepted formats, so the agent knows exactly what the tool does. It doesn't name sibling tools (import_preview, import_mapping, import_execute), so the boundary with them is only implied by 'start a new import job'.
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?
Gives concrete when-to-use conditions for parameter combinations: platform statements (uber, bolt, glovo, tazz) require importType platform_sales; shop exports require invoices_issued; A4200 XML or a cash-register ZIP requires source cash_register with importType receipts. No explicit exclusions against alternative import tools, and no statement that this only creates a job while import_execute applies it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
integration_invoicing_activityARead-onlyIdempotent
Check whether a fiscal code (CUI/CIF) invoices through Storno, and how many invoices it issued recently. Built for platforms that give their users a benefit for invoicing here, so it is NOT authenticated with your user token — the credential is a shared integration key, configured server-side as INTEGRATION_API_KEY. Returns only { active, invoicesLast30d, windowDays, invoicesInWindow }: no company name, no amounts, no clients. Counts issued outgoing invoices only — drafts, cancelled and rejected ones do not count, so a company cannot earn a benefit by issuing and voiding. Returns active: false for an unknown fiscal code and for a suspended organization alike. If the server has no key configured the endpoint answers 404 ("not enabled"), and a wrong key answers 401.
| Name | Required | Description | Default |
|---|---|---|---|
| cui | Yes | Fiscal code to look up. Written however you have it — "RO12345678", "12345678", spaced or dotted are all accepted | |
| window | No | How many days back to count, 1-365 (default 30). The 30-day figure is reported as invoicesLast30d regardless | |
| integrationKey | No | The shared integration key. Falls back to the STORNO_INTEGRATION_KEY environment variable when omitted |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the readOnly/idempotent annotations: discloses a separate credential model (shared INTEGRATION_API_KEY, server-side), the exact return shape, the counting rule (issued outgoing only; drafts/cancelled/rejected excluded), the meaning of active:false for unknown vs suspended orgs, and the 404/401 error semantics. This is substantive behavioral context an agent could not infer from 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?
Dense but every sentence carries information — purpose first, then auth model, return shape, counting rules, then error codes. It is on the long side, but nothing is filler; a slight tightening of the return-shape sentence would make it a 5.
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 3-param read-only lookup with no output schema, the description supplies everything an agent needs: what it returns, how counts are computed, auth expectations, and failure modes. Nothing material is left to inference.
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 already 100%, so the baseline is 3, but the description adds real meaning: integrationKey is a shared server-side credential rather than the user token, and it clarifies that invoicesLast30d is always reported regardless of the chosen window. That closes the subtle semantic gap the schema only hints at.
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?
States a specific verb+resource (check whether a fiscal code invoices through Storno, and count recent issued invoices) and scopes it to an integration use case, which clearly separates it from the user-facing invoices_* siblings. An agent can tell it is a lookup/eligibility check, not a listing 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?
Gives clear usage context — built for platforms granting a benefit for invoicing here — and explicitly warns that it is NOT authenticated with the user token. It does not name an alternative sibling or spell out when-not to call it, but the audience framing makes the intended caller unambiguous.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
invitations_createA
Invite a new user to join the organization by email. An invitation email is sent automatically. Invitations expire after 7 days. Roles: ADMIN, ACCOUNTANT, EMPLOYEE (cannot invite as OWNER).
| Name | Required | Description | Default |
|---|---|---|---|
| role | Yes | Role to assign to the invited user: ADMIN, ACCOUNTANT, or EMPLOYEE | |
| Yes | Email address of the user to invite |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Adds real behavior beyond the annotations: an email is dispatched automatically and the invitation expires after 7 days, which the agent cannot infer from readOnlyHint=false / idempotentHint=false / openWorldHint=true. It does not cover duplicate-invite behavior or what happens to an existing pending invitation for the same email.
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?
Four short sentences, front-loaded with the action and scope, then the side effect, lifetime, and role constraint. No filler 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?
For a two-parameter create tool with full schema coverage and annotations, this covers action, side effect, expiry, and role limits. Since there is no output schema, it could have mentioned what the call returns (e.g. the invitation record/id) so the agent knows how to follow up.
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, but the description adds meaning by enumerating the assignable roles and stating that OWNER cannot be granted through this tool. The email parameter is only implied ('by email'), with format left entirely to 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?
States a specific verb and resource ('Invite a new user to join the organization by email') and makes the delivery channel explicit. It is clearly distinguishable from siblings such as invitations_resend, invitations_list, invitations_delete, and members_update.
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?
Gives the clear context in which to use it (adding a brand-new user, email-based invitation), which separates it from member management and invitation resend/delete tools. It stops short of explicitly saying when not to use it, e.g. for already-existing users or pending invitations.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
invitations_deleteADestructiveIdempotent
Cancel a pending invitation. The invitation token is immediately invalidated and cannot be used. Cannot cancel invitations that have already been accepted.
| Name | Required | Description | Default |
|---|---|---|---|
| uuid | Yes | Invitation UUID to cancel |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already carry destructiveHint=true, idempotentHint=true and readOnlyHint=false, so the safety profile is covered; the description goes further by disclosing the concrete effect (the token is immediately invalidated and cannot be used) and the precondition that accepted invitations are rejected. It does not say what error or response the caller sees when the invitation is already accepted or not 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?
Three short sentences with zero filler; the action and its immediate effect come first and the failure condition last. Every sentence contributes a distinct fact.
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 one-parameter destructive mutation with no output schema and rich annotations, the description supplies the effect, the irreversibility of the token, and the state precondition. An agent has everything needed to decide whether to call it and to anticipate the rejection case.
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?
Only one parameter, and the schema already describes it fully as 'Invitation UUID to cancel' at 100% coverage. The description adds nothing about the identifier's format or where to obtain it, so the baseline 3 for schema-covered parameters 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?
States a specific verb and resource ('Cancel a pending invitation') and scopes it to the pending state, which separates it from invitations_resend and invitations_list in meaning. It stops short of naming a sibling outright, so an agent must infer the boundary from the word 'pending' rather than being told.
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?
Gives a clear exclusion: it cannot be used on invitations that have already been accepted, which tells the agent when this call will fail. It never points at the alternative action (invitations_resend) for invitations the user may actually want to re-send instead of cancel.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
invitations_listARead-onlyIdempotent
List all pending invitations for the organization. Only returns invitations that have not yet been accepted. Only organization admins and owners can view invitations.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/non-destructive, so the safety profile is covered. The description adds genuinely new behavior: results are filtered to unaccepted invitations only, and the call requires organization admin or owner privileges — an authorization constraint an agent cannot derive from annotations. It stops short of describing result shape or pagination.
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 sentences, front-loaded with the action and resource, then the filtering rule, then the permission gate. Every sentence adds distinct information with no repetition of the tool name or annotations.
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 zero-parameter read there is little to document, and the description covers scope, filtering, and authorization. The only gap is that it never hints at what an invitation record contains (invitee, role, expiry), which matters slightly since there is no output 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 tool takes zero parameters, so there is nothing for the description to disambiguate. Baseline 4 applies; the description correctly avoids inventing filter options the schema does not support.
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?
States a specific verb (list) and resource (pending invitations) scoped to the organization, plus a clear filter (not yet accepted). It does not explicitly contrast with siblings like members_list or invitations_resend, but the resource is unambiguous enough that an agent can select it without confusion.
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?
Usage is only implied: the description tells you it returns pending-but-unaccepted invitations, which acts as a scope exclusion, but there is no explicit 'use X instead when you want accepted/historical invitations' or statement about when a caller should reach for this over members_list. Adequate but leaves routing to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
invitations_resendA
Resend the invitation email for a pending invitation. Does not extend the expiration date. If the invitation has expired, cancel it and create a new one instead.
| Name | Required | Description | Default |
|---|---|---|---|
| uuid | Yes | Invitation UUID to resend |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare the non-readOnly, non-idempotent, non-destructive profile. The description adds real behavioral detail beyond them: an email is dispatched, the expiration date is not extended, and the expired case must be handled via cancel+create. It stops short of stating permissions or rate limits.
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 sentences, front-loaded with the action, followed by the key caveat and the edge-case fallback. Nothing redundant.
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 one-parameter mutation tool with annotations and no output schema, the description covers purpose, side effect, and the expired-invitation edge case. It could say whether the recipient address can be changed or what a success/failure response looks like, but nothing critical is missing.
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% for the single uuid parameter, so the schema already explains it. The description only implicitly constrains uuid to a pending invitation; baseline 3 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?
States a specific verb (resend) and resource (invitation email) and narrows the scope to pending invitations. An agent can distinguish this from invitations_create and invitations_delete without opening the schema.
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?
Names the precondition (pending invitation) and explicitly routes the agent elsewhere when it fails: cancel the expired invitation and create a new one. That is a concrete alternative workflow rather than an implied one.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
invoices_attachmentsARead-onlyIdempotent
Download a file attachment from an invoice. Returns base64-encoded binary data with the MIME type. Get attachment UUIDs from invoices_get (the "attachments" array). Supports PDF, images, Word, Excel, ZIP, and other file types.
| Name | Required | Description | Default |
|---|---|---|---|
| uuid | Yes | Invoice UUID | |
| companyId | No | Company UUID override (uses active company if not set) | |
| attachmentId | Yes | Attachment UUID (from invoices_get attachments array) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/non-destructive, so the description's value-add is the return contract: base64-encoded binary plus MIME type, and the supported file-type range (PDF, images, Word, Excel, ZIP). That is genuinely useful beyond the structured fields. It omits any note on payload size or rate limits, which matters for large ZIP attachments, so not a 5.
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?
Four short sentences, front-loaded with the action and the return format, then the required-ID provenance, then supported types. Every sentence carries information the agent needs; nothing is redundant with the annotations.
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?
There is no output schema, so the description must describe the return value — and it does precisely (base64 binary with MIME type). Combined with the ID-provenance hint and the supported-type note, an agent has everything needed to call this 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 all three parameters documented, so the baseline is 3. The description reinforces the attachmentId provenance and the invoice-level scoping of uuid, but adds nothing about the companyId override parameter that the schema already explains.
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?
States a specific verb and resource ('Download a file attachment from an invoice') and immediately disambiguates from the sibling that lists attachments by naming invoices_get as the source of attachment UUIDs. An agent can distinguish this from invoices_pdf or exports_download without opening any schema.
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 tells the agent where to obtain the required attachmentId ('Get attachment UUIDs from invoices_get (the "attachments" array)'), which is the main usage prerequisite. It does not state when NOT to use it or contrast with adjacent download tools (invoices_pdf, exports_download), so it stops short of full when/when-not guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
invoices_bulk_cancelBDestructiveIdempotent
Cancel multiple invoices in batch with an optional reason. Returns count of cancelled invoices and any per-item errors.
| Name | Required | Description | Default |
|---|---|---|---|
| ids | Yes | Array of invoice UUIDs to cancel (1–100) | |
| reason | No | Reason for cancellation applied to all invoices in the batch | |
| companyId | No | Company UUID override (uses active company if not set) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true, idempotentHint=true, and readOnlyHint=false, so the safety profile is covered. The description does add genuine value by disclosing partial-failure behavior ('any per-item errors') and the return shape, which annotations cannot express. It omits whether cancellation is reversible (an invoices_restore sibling exists) and any permission 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 sentences, zero waste, with the core action front-loaded and the return behavior trailing. Nothing is repeated or padded.
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 no output schema, the description correctly compensates by stating the return value (count plus per-item errors). Combined with a fully documented input schema and rich destructive/idempotent annotations, an agent has nearly everything needed; only reversibility and batch-limit failure behavior are unaddressed.
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 all three parameters including the 1–100 id limit are already documented. The description only echoes the optional reason, adding no new semantics beyond the schema; baseline 3 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?
States a specific verb and resource (cancel) with the batch scope made explicit by 'multiple invoices in batch'. It is distinguishable from most siblings, though it never names invoices_cancel (single) or invoices_bulk_storno, which are the two nearest 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?
No statement of when to use this versus invoices_cancel for a single invoice, or versus invoices_bulk_storno / invoices_bulk_delete. The word 'batch' implies multi-item usage but there are no prerequisites, exclusions, or alternative routing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
invoices_bulk_deleteADestructiveIdempotent
Delete multiple draft invoices in batch. Only invoices with status "draft" can be deleted. This action is irreversible. Returns count of deleted invoices and any per-item errors.
| Name | Required | Description | Default |
|---|---|---|---|
| ids | Yes | Array of invoice UUIDs to delete (1–100). Only draft invoices are eligible. | |
| companyId | No | Company UUID override (uses active company if not set) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true and idempotentHint=true, so the description's job is to add texture — and it does: 'This action is irreversible' plus the draft-only gate and the partial-success shape ('count of deleted invoices and any per-item errors'). That partial-failure behavior is meaningful for a batch call and is not derivable from the annotations. It does not cover whether deleted drafts can be restored via invoices_restore.
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?
Four short sentences, front-loaded with the action, then the eligibility gate, the irreversibility warning, and the return shape. No filler or restated title.
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 no output schema, the description usefully compensates by naming the return values (deleted count plus per-item errors). Combined with the destructiveness and eligibility constraints, an agent has what it needs to call it safely; only recovery/undo options for accidentally deleted drafts are unaddressed.
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 ids property already documents the 1–100 UUID array and the draft eligibility, plus companyId's active-company fallback. The description adds nothing beyond that on parameters, so the baseline of 3 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?
States a specific verb, resource and scope: 'Delete multiple draft invoices in batch', which cleanly separates it from the single-item invoices_delete and from non-destructive siblings like invoices_bulk_cancel or invoices_bulk_mark_paid. The eligibility restriction (draft only) further pins the operation down.
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?
Gives a hard precondition — 'Only invoices with status "draft" can be deleted' — which tells the agent exactly when this tool will succeed and when it must reach for a different operation. It stops short of naming the alternative tools (single delete, cancel/storno) for issued invoices, so routing still needs a little inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
invoices_bulk_mark_paidAIdempotent
Mark multiple invoices as fully paid in batch. Creates payment records for each invoice's remaining balance. paymentMethod defaults to "bank_transfer". Returns count of updated invoices and any per-item errors.
| Name | Required | Description | Default |
|---|---|---|---|
| ids | Yes | Array of invoice UUIDs to mark as paid (1–100) | |
| paidAt | No | Payment date in ISO 8601 format (YYYY-MM-DD). Defaults to today. | |
| companyId | No | Company UUID override (uses active company if not set) | |
| paymentMethod | No | Payment method applied to all invoices (default: bank_transfer) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare non-readonly, idempotent, non-destructive. The description adds real value beyond that: it discloses that payment records are created against remaining balance, that partial failures are reported per-item rather than aborting the batch, and the default payment method. No contradiction with 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 short sentences, front-loaded with the action and scope, then side effects, then return shape. No filler 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 exists, and the description compensates by stating the return value (updated count plus per-item errors). Combined with 100% schema coverage for the four parameters and annotations covering the safety profile, an agent has what it needs to call this 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 description coverage is 100%, so ids, paidAt, companyId and paymentMethod are already documented in the schema. The description only restates the paymentMethod default; it adds no format or edge-case semantics (e.g., what happens to already-paid or partially-paid invoices in the id array). Baseline 3.
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?
Specific verb + resource + scope: 'Mark multiple invoices as fully paid in batch', plus the side effect (creates payment records for each invoice's remaining balance). This clearly distinguishes it from single-record siblings like payments_create and from invoices_bulk_cancel/bulk_storno.
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?
Usage is implied by the batch framing and by the fact that payment records are created per invoice, which suggests payments_create is the single-invoice alternative. However, the description never explicitly states when to use this vs. payments_create, nor any preconditions (e.g., invoice must be issued/unpaid).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
invoices_bulk_stornoA
Create storno (refund/credit note) invoices for multiple invoices in batch. Only outgoing invoices with status "issued" or "validated" are eligible. Returns count of created storno invoices and any per-item errors.
| Name | Required | Description | Default |
|---|---|---|---|
| ids | Yes | Array of invoice UUIDs to storno (1–100). Only outgoing, issued/validated invoices are eligible. | |
| companyId | No | Company UUID override (uses active company if not set) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare a non-read-only, non-destructive, non-idempotent mutation, so the safety bar is mostly covered. The description adds real value beyond them: eligibility state gating, partial-failure semantics ('per-item errors'), and the shape of the result. It does not warn that repeating the call creates duplicate storno documents (idempotentHint=false), which is the notable remaining gap.
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, zero waste: purpose first, eligibility second, return contract third. Every sentence carries distinct information and the most important constraint 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 only two flat parameters, 100% schema coverage, and no output schema, the description does the job of explaining what comes back ('count of created storno invoices and per-item errors'). Slightly incomplete because it is silent on side effects on the source invoices' status and numbering, which matters for a credit-note mutation.
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 both parameters are documented in the schema, including the 1–100 bound and the companyId override fallback. The description only restates the eligibility constraint already present on 'ids', adding no new semantics. Baseline 3 applies when the schema does the heavy lifting.
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?
States a specific verb+resource combination ('Create storno (refund/credit note) invoices') and scopes it to batch operation over multiple invoices. The parenthetical defines the domain term 'storno' so an agent can distinguish it from invoices_bulk_cancel or invoices_bulk_delete without consulting another schema.
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?
Gives an explicit precondition: 'Only outgoing invoices with status "issued" or "validated" are eligible' — actionable gating information. It stops short of naming alternative siblings (e.g. invoices_cancel vs invoices_bulk_cancel) or stating when this is the wrong choice, so it is clear context without exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
invoices_cancelADestructiveIdempotent
Cancel an issued invoice. Requires a cancellation reason (minimum 10 characters). Changes status to "cancelled". Cancelled invoices remain in the system for record-keeping. Use invoices_restore to undo an accidental cancellation.
| Name | Required | Description | Default |
|---|---|---|---|
| uuid | Yes | Invoice UUID to cancel | |
| reason | Yes | Reason for cancellation (minimum 10 characters) | |
| companyId | No | Company UUID override (uses active company if not set) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true, idempotentHint=true and readOnlyHint=false, so the description does not need to restate that this mutates. It does add real context beyond annotations: the status transition to 'cancelled' and the fact that the record is retained rather than purged, which is exactly what an agent needs to judge consequences.
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?
Four short sentences, front-loaded with the action and the required input, then the resulting state, then the recovery path. Nothing is redundant or padding.
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 a mutation tool with full annotation coverage, a complete parameter schema and no output schema, this is nearly sufficient: the agent knows the required input, the state change and how to undo. Minor gaps remain around permissions or restrictions on which invoice states can be cancelled (e.g., paid or already-issued invoices).
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 uuid, reason and companyId parameters are already documented in the schema. The description only repeats the reason minimum length, adding no syntax, format or edge-case meaning beyond the structured fields; baseline 3 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?
States a specific verb and resource ('Cancel an issued invoice') and immediately distinguishes the effect (status becomes 'cancelled', record retained) from deletion. It also names the sibling that reverses the action, so the agent can separate it from invoices_delete, invoices_bulk_cancel and invoices_storno.
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 routes accidental cancellations to invoices_restore, which is a concrete alternative condition. It does not, however, say when to prefer this over invoices_delete, invoices_storno or invoices_bulk_cancel, so the sibling routing is only partial.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
invoices_createA
Create a new draft invoice. Requires at least one line item and either a clientId or receiverName/receiverCif. The invoice starts in "draft" status and can be edited until issued. Use invoices_issue to finalize and generate XML/PDF.
| Name | Required | Description | Default |
|---|---|---|---|
| lines | Yes | Invoice line items (at least one required) | |
| notes | No | Public notes visible to the client | |
| collect | No | Record an immediate payment. Pass true for full payment with defaults, or an object with value/type/issueDate/documentNumber/mentions for details. | |
| dueDate | No | Payment due date in ISO 8601 format (YYYY-MM-DD) | |
| clientId | No | Client UUID (from clients_list). Either clientId or receiverName should be provided. | |
| currency | No | ISO 4217 currency code (default: RON) | |
| issuerId | No | Issuer ID number | |
| language | No | Document language for PDF generation (default: ro) | |
| mentions | No | Additional legal mentions on the invoice | |
| seriesId | No | Invoice series UUID (from document_series_list). Uses default if not provided. | |
| companyId | No | Company UUID override (uses active company if not set) | |
| issueDate | Yes | Invoice issue date in ISO 8601 format (YYYY-MM-DD) | |
| deputyAuto | No | Deputy vehicle registration number | |
| deputyName | No | Deputy/representative name | |
| issuerName | No | Name of person issuing the invoice | |
| salesAgent | No | Sales agent name | |
| orderNumber | No | Purchase order number | |
| plataOnline | No | Enable online payment via Stripe (default: from company settings) | |
| platitorTva | No | Whether sender is VAT payer (default: false) | |
| receiverCif | No | Receiver tax ID / CIF (used together with receiverName when no client entity exists) | |
| vatIncluded | No | When used with autoApplyVatRules, sets whether unit prices include VAT on all lines. Ensures correct totals after VAT rules change rates. | |
| documentType | No | Document type (default: invoice) | |
| exchangeRate | No | Exchange rate relative to RON (default: 1.0) | |
| internalNote | No | Internal note (not visible to the client) | |
| paymentTerms | No | Payment terms description (e.g., "Net 30") | |
| receiverName | No | Receiver name (used when no client entity exists). Either clientId or receiverName should be provided. | |
| taxPointDate | No | Tax point date if different from issue date (YYYY-MM-DD) | |
| paymentMethod | No | Payment method: bank_transfer (default), cash, card, cheque, other | |
| tvaLaIncasare | No | VAT on collection / TVA la încasare (default: false) | |
| ublExtensions | No | UBL extension fields for advanced e-Factura compliance. These map directly to UBL XML elements not covered by the standard invoice fields. | |
| buyerReference | No | Buyer reference identifier (BT-10) | |
| contractNumber | No | Contract reference number | |
| idempotencyKey | No | Idempotency key to prevent duplicate creation | |
| penaltyEnabled | No | Enable late payment penalty (default: false) | |
| invoiceTypeCode | No | Tax regime / invoice type code. standard = default commercial invoice; reverse_charge = taxare inversa; the other values map to specific Romanian tax-code articles. | |
| deliveryLocation | No | Delivery address | |
| parentDocumentId | No | Parent document UUID (required for credit notes / refunds) | |
| penaltyGraceDays | No | Grace period in days before penalty starts applying | |
| projectReference | No | Project reference number | |
| taxPointDateCode | No | Tax point date code | |
| autoApplyVatRules | No | Auto-apply VAT rules (reverse charge for VIES-valid EU clients, OSS destination rate for non-VIES EU clients). Default: false. | |
| showClientBalance | No | Show client balance on invoice (default: false) | |
| deputyIdentityCard | No | Deputy ID card number | |
| businessProcessType | No | Business process type (e.g., "urn:cen.eu:en16931:2017#compliant#urn:efactura.mfinante.ro:CIUS-RO:1.0.1") | |
| penaltyPercentPerDay | No | Daily penalty percentage (e.g., 0.05 for 0.05% per day) | |
| tenderOrLotReference | No | Tender or lot reference | |
| despatchAdviceReference | No | Despatch advice reference | |
| buyerAccountingReference | No | Buyer accounting reference | |
| invoicedObjectIdentifier | No | Invoiced object identifier | |
| receivingAdviceReference | No | Receiving advice reference |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false, destructiveHint=false and idempotentHint=false, so the safety profile is covered. The description adds real lifecycle context beyond that: the record starts in 'draft', remains editable until issued, and issuing/XML/PDF generation is a separate call. It does not mention the idempotencyKey parameter's role in preventing duplicate creation, which matters given idempotentHint=false.
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?
Four short sentences, front-loaded with the action and its prerequisites, then lifecycle, then the follow-up tool. Nothing is repeated from the schema and nothing is wasted.
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 50-parameter, deeply nested creation tool with no output schema, the description covers purpose, minimum viable input, state transitions and the next step in the workflow. It omits how defaults are resolved (currency RON, series, VAT rules, company settings) and what the create response returns, but the 100%-covered schema carries most of that weight.
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 would be 3, but the description adds a cross-field constraint the schema does not express (only 'lines' and 'issueDate' are in required; the clientId-or-receiverName/CIF choice is enforced only in prose). That is genuine value beyond the structured fields.
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?
Specific verb + resource + scope: 'Create a new draft invoice' immediately distinguishes it from invoices_issue, invoices_update and invoices_get. The draft-only nature is stated explicitly, so an agent knows exactly what artifact is produced.
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?
Gives prerequisites ('at least one line item and either a clientId or receiverName/receiverCif') and routes finalization to invoices_issue. It does not disambiguate the equally named siblings proforma_invoices_create, recurring_invoices_create or delivery_notes_create, which an agent could plausibly confuse with this one.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
invoices_deleteADestructiveIdempotent
Permanently delete a draft invoice. Only invoices with status "draft" can be deleted. This action is irreversible. For issued invoices, use invoices_cancel instead.
| Name | Required | Description | Default |
|---|---|---|---|
| uuid | Yes | Invoice UUID to delete | |
| companyId | No | Company UUID override (uses active company if not set) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true and idempotentHint=true, so the safety profile is partly covered. The description adds meaningful context beyond that: permanence, irreversibility, and the draft-status precondition. It could say more about side effects, but for a simple delete tool this is strong.
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?
Front-loads the key action and constraint, then gives the alternative in three short sentences. There is no wasted text and no buried critical condition.
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 destructive, schema-complete, annotation-rich delete tool, the description supplies the crucial missing context: draft-only applicability, irreversibility, and the correct alternative for issued invoices. No output schema is needed for this operation.
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 both the required uuid and optional companyId override are already documented in the schema. The description does not add parameter-level detail beyond what the schema provides, which matches the baseline for high 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?
States a specific verb and resource ("Permanently delete a draft invoice") and makes the draft-only scope explicit. It also distinguishes the operation from invoices_cancel, so the agent can identify the tool without opening the schema.
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 when the tool applies (draft invoices only) and when it does not, naming invoices_cancel as the alternative for issued invoices. This is exactly the routing guidance needed among the many invoice siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
invoices_efactura_messageARead-onlyIdempotent
Send a message to the issuer of a RECEIVED e-Factura through SPV (ANAF "RASP"): dispute the invoice, ask for a corrected one, say it is not yours. ANAF delivers it to the seller under the invoice's upload index; the invoice itself is not changed. Needs a received invoice with an ANAF upload index and a valid e-Factura token on the company. Max 4000 characters.
| Name | Required | Description | Default |
|---|---|---|---|
| uuid | Yes | UUID of the received invoice | |
| message | Yes | Plain-text message for the issuer (Romanian, max 4000 characters) | |
| companyId | No | Company UUID override (uses active company if not set) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the annotations: it discloses the delivery path (ANAF hands the message to the seller under the invoice's upload index), states the key side-effect boundary ('the invoice itself is not changed'), and adds an operational limit (max 4000 characters) plus the token prerequisite. Note a mild tension worth flagging: 'Send a message' is an outbound action while readOnlyHint=true, but the description's explicit 'invoice itself is not changed' reconciles this rather than contradicting it.
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 tightly packed sentences: action and use cases first, delivery mechanics second, prerequisites and limit last. No filler, and the constraint (4000 chars) is placed where it is needed rather than buried.
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?
Covers prerequisites, mechanism, side effects and length limits for a no-output write operation, which is most of what an agent needs. It stops short of saying what, if anything, comes back (message ID, status) for a tool with no output schema, which would close the last gap.
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 uuid/message/companyId are already documented, and maxLength 4000 is in the schema too. The description adds little parameter-level detail, only implying that uuid must reference a received invoice with an upload index and that the company needs a valid token; baseline 3 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?
States a specific verb and resource ('Send a message to the issuer of a RECEIVED e-Factura through SPV') and enumerates the three concrete use cases: dispute, request correction, deny ownership. It clearly separates itself from the read-side siblings (efactura_messages_list/efactura_messages_get) by emphasizing RECEIVED and outbound delivery.
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?
Preconditions are explicit: 'Needs a received invoice with an ANAF upload index and a valid e-Factura token on the company.' It frames the tool around received (not issued) invoices, which implicitly excludes the invoices_issue/submit family, but it never names an alternative tool or an explicit when-not-to-use case.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
invoices_emailA
Send an invoice via email with optional PDF and XML attachments. Use invoices_email_defaults first to get pre-filled subject and body. Emails are sent asynchronously via queue. PDF attachment requires Pro plan. Recipients (to, cc, bcc) must be client emails registered on the company; other addresses are rejected with EMAIL_RECIPIENT_NOT_CLIENT.
| Name | Required | Description | Default |
|---|---|---|---|
| cc | No | CC email address (comma-separated for multiple) | |
| to | Yes | Recipient email address | |
| bcc | No | BCC email address (comma-separated for multiple) | |
| body | No | Email body text (uses default template if not provided) | |
| uuid | Yes | Invoice UUID to email | |
| subject | No | Email subject (uses default template if not provided) | |
| language | No | Email template language: ro (default) or en | |
| attachPdf | No | Attach PDF invoice (default: true, requires Pro plan) | |
| attachXml | No | Attach UBL XML file (default: false) | |
| companyId | No | Company UUID override (uses active company if not set) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the annotations: discloses asynchronous queue-based delivery, a Pro-plan gating rule for PDF attachments, and the exact rejection error EMAIL_RECIPIENT_NOT_CLIENT for non-client addresses. It does not cover duplicate/resend behavior or delivery failure handling, which matters for a non-idempotent send.
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?
Four short sentences, each carrying distinct information (what it does, prerequisite, async behavior, plan gating, recipient rule). The primary action is front-loaded and nothing is 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?
For a 10-parameter mutation tool with no output schema, the description covers the operation, prerequisites, side-effect timing and failure modes well. It never indicates what the call returns (queue id, message id, status) nor points to invoices_email_history for verification, which are the remaining 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%, so the baseline is 3, but the description adds a constraint not present in the schema: to/cc/bcc must be client emails registered on the company. That is genuine semantic guidance for three parameters rather than restatement.
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?
States a specific verb and resource ('Send an invoice via email') plus the scope of what can be included (optional PDF and XML attachments). This distinguishes it cleanly from invoices_pdf, invoices_email_defaults, invoices_email_history and the parallel delivery_notes_email / proforma_invoices_send siblings.
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?
Gives an explicit prerequisite workflow ('Use invoices_email_defaults first to get pre-filled subject and body') and hard constraints on recipients. It stops short of naming when not to use it (e.g. share links or the proforma send path), so it is clear context without explicit exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
invoices_email_defaultsARead-onlyIdempotent
Get pre-filled email content for an invoice based on the company email template. Returns suggested "to", "cc", "subject", and "body" with template variables already substituted. Use this to populate the email form before calling invoices_email.
| Name | Required | Description | Default |
|---|---|---|---|
| uuid | Yes | Invoice UUID | |
| language | No | Email language: ro (default) or en | |
| companyId | No | Company UUID override (uses active company if not set) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare this as read-only, idempotent, non-destructive, and closed-world. The description adds useful behavior beyond that: it returns suggested to, cc, subject, and body values and explains that template variables are already substituted, which is especially valuable because no output schema exists.
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 front-loaded with the core action, then the return shape, then the workflow recommendation. Every sentence is useful and there is no redundant or filler text.
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 three-parameter read tool with no output schema, the definition explains what is returned and how the result is used before calling invoices_email. Combined with complete schema coverage and annotations, it gives an agent enough context to invoke the tool 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 description coverage is 100%, so all three parameters are already documented in the input schema. The description does not add further meaning about uuid, language, or companyId beyond the schema, so the baseline of 3 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?
States a specific verb and resource: gets pre-filled email content for an invoice based on the company template. It also names the exact returned fields and clarifies that template variables are substituted, making its purpose distinct from invoices_email and email template management 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?
Explicitly instructs the agent to use this to populate the email form before calling invoices_email, which gives a clear sequencing rule. It lacks explicit when-not-to-use conditions, but the intended workflow is unambiguous.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
invoices_email_historyARead-onlyIdempotent
Get the complete history of emails sent for an invoice, including delivery status, open/click tracking, bounce information, and who sent each email. Useful for audit trails and verifying client received the invoice.
| Name | Required | Description | Default |
|---|---|---|---|
| uuid | Yes | Invoice UUID | |
| companyId | No | Company UUID override (uses active company if not set) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and non-destructive behavior, so the safety profile is covered. The description still earns credit by disclosing what the response contains — delivery status, open/click tracking, bounce info, and sender identity — which annotations do not convey and which matters for an audit use case.
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, no filler: the first front-loads what is returned, the second gives the use case. Nothing is repeated from the schema or annotations.
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 no output schema, the field enumeration is the right compensation and makes the tool callable with confidence. Minor gaps remain: no mention of whether history is paginated or bounded, and no statement that this only reads existing emails rather than triggering new ones.
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% (uuid = Invoice UUID, companyId = Company UUID override with active-company fallback), so the schema carries parameter meaning. The description adds nothing about the identifiers and does not explain the company-override behavior in prose, leaving it at 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?
States a specific verb and resource ('Get the complete history of emails sent for an invoice') and enumerates the payload contents, so an agent can tell it apart from the mutating invoices_email sibling. It stops short of naming invoices_email or delivery_notes_email_history as the contrasting alternative, so differentiation is inferable rather than explicit.
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 second sentence gives intended scenarios ('audit trails', 'verifying client received the invoice'), which implies when to reach for it. There is no explicit when-not guidance or pointer to the sibling that actually sends mail (invoices_email) or to defaults configuration.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
invoices_eventsARead-onlyIdempotent
Get the complete timeline of events for an invoice: status changes, ANAF submissions, validations, emails sent, payments received, and user actions. Useful for audit trails, debugging, and understanding invoice lifecycle history.
| Name | Required | Description | Default |
|---|---|---|---|
| uuid | Yes | Invoice UUID | |
| companyId | No | Company UUID override (uses active company if not set) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, non-destructive and closed-world, so safety is covered structurally. The description adds real value by disclosing the contents of the read (which event classes appear in the timeline), which the annotations cannot convey. It does not discuss ordering, pagination, or result size limits.
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, zero filler. The core capability and its scope lead; the use cases follow. Every clause earns its place by adding either scope or intent.
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 exists, but the description compensates by listing the event types returned, which is the main thing an agent needs to judge relevance. Remaining gaps (chronological ordering, empty-timeline behavior) are minor for a read-only lookup.
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 two well-documented params (uuid required, companyId as active-company override), so the schema carries the parameter burden. The description mentions invoices but does not explain the companyId override behavior or what happens when the UUID is unknown.
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?
Specific verb ('Get') plus resource ('complete timeline of events for an invoice'), and it enumerates the event categories (status changes, ANAF submissions, validations, emails, payments, user actions). That enumeration is what separates it from invoices_get and from the various invoices_submit/validate/email action 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?
Names three concrete purposes (audit trails, debugging, lifecycle history), giving an agent a clear picture of when this tool is the right pick. It stops short of naming alternatives such as invoices_get or efactura_messages_list, so there is no explicit when-not guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
invoices_export_csvARead-onlyIdempotent
Export a filtered list of invoices to CSV format. Accepts the same filters as invoices_list (status, direction, date range, client, etc.). Returns CSV text with UTF-8 BOM for Excel compatibility. Max 10,000 invoices; use invoices_export_zip for large exports with files.
| Name | Required | Description | Default |
|---|---|---|---|
| sort | No | Sort field | |
| order | No | Sort order | |
| dateTo | No | End date (YYYY-MM-DD, issue date) | |
| search | No | Search term for invoice number or client name | |
| status | No | Filter by invoice status | |
| clientId | No | Filter by client UUID | |
| dateFrom | No | Start date (YYYY-MM-DD, issue date) | |
| companyId | No | Company UUID override (uses active company if not set) | |
| direction | No | Filter by direction |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, non-destructive behavior, so the description's added value is the 10,000-invoice hard cap and the UTF-8 BOM encoding detail — both operationally relevant. It does not discuss permissions or how large results are streamed/truncated at the cap, keeping it short of a 5.
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 sentences, zero filler, with the capability stated first and the size-cap alternative last. Every sentence contributes a distinct fact (what it does, filter parity, output encoding, limit).
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?
Although there is no output schema, the description covers the return value (CSV text with BOM), the size ceiling, and the escalation path to the zip sibling. Nothing an agent needs to call this correctly is missing.
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 enum values for status, direction, sort and order, so the schema already carries parameter meaning. The description's "status, direction, date range, client, etc." merely mirrors that and adds no format or default 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?
States a specific verb and resource ("Export ... invoices to CSV format") plus scope (filtered list). It also names the sibling it differs from (invoices_export_zip) and implicitly from invoices_list, so an agent can select it without opening another schema.
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 it accepts the same filters as invoices_list, giving the agent a reference for filter semantics. It also supplies a concrete routing rule: above 10,000 invoices or when files are needed, use invoices_export_zip.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
invoices_export_efactura_zipA
Export e-Factura XML files as a ZIP archive. For large batches (>100 invoices), the export is processed asynchronously and returns a job ID to poll for completion.
| Name | Required | Description | Default |
|---|---|---|---|
| dateTo | No | End date filter in ISO 8601 format (YYYY-MM-DD) | |
| dateFrom | No | Start date filter in ISO 8601 format (YYYY-MM-DD) | |
| companyId | No | Company UUID override (uses active company if not set) | |
| direction | Yes | Invoice direction to export |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations cover only the safety profile (readOnlyHint=false, destructiveHint=false), so this disclosure is genuinely useful: it reveals the asynchronous processing at more than 100 invoices and says that the call returns a job ID instead of a ZIP. What is missing is the next step: which tool to poll and how the finished archive is retrieved or how long it lives.
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, no filler. The core purpose comes first, and the async threshold is stated right after it.
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?
There is no output schema, so the description carries the burden of explaining the return shape. It does this in part: it mentions a job ID, but it omits the immediate synchronous response for small batches and never explains how the ZIP is retrieved or delivered. An agent still cannot complete the workflow using this definition alone.
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 all four parameters, including the direction enum, are already documented in the schema. The description adds nothing about filtering semantics, such as whether the date range applies to the issue date or the e-Factura transmission date, so the 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?
It names a concrete verb and resource: exporting e-Factura XML files as a ZIP archive. That distinguishes it from the CSV, SAGA-XML, and PDF export siblings. However, it never addresses the closely named sibling invoices_export_zip, so a user picking between those two has no guidance.
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 context: use this when you need e-Factura XML files packed together. It also explains that the behavior changes above 100 invoices. However, it never states when to choose this option over invoices_export_zip, exports_download, or accounting_export_zip, and it gives no prerequisites such as a connection or token for e-Factura.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
invoices_export_payments_saga_xmlARead-onlyIdempotent
Export supplier payments (plati) in Saga XML format. Exports the incoming invoice payments in the given period (all of them when no period is passed) for accounting software integration. Use accountCash/accountBank/accountCard to override the chart-of-accounts for this export (defaults come from the company’s stored SAGA settings).
| Name | Required | Description | Default |
|---|---|---|---|
| dateTo | No | End date (YYYY-MM-DD, payment date) | |
| dateFrom | No | Start date (YYYY-MM-DD, payment date). Pass a period: without one the whole history is exported. | |
| companyId | No | Company UUID override (uses active company if not set) | |
| accountBank | No | Override bank transfer account (e.g. 5121) | |
| accountCard | No | Override card analytic account (e.g. 5125.2) | |
| accountCash | No | Override cash account (e.g. 5311) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/non-destructive, so the bar is lower. The description still adds real value beyond them: the fallback that omitting the period exports the entire history, and that account overrides default to the company's stored SAGA settings — a side effect an agent would not otherwise know.
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 verb+resource, then period behavior, then parameter guidance — no filler. Slight waste from restating "export" three times and from the supplier/incoming wording, which adds ambiguity rather than 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?
A read-only, six-parameter export with full schema coverage and annotations; the description covers scope, defaults, and override semantics. The remaining gap is what the tool actually returns (inline XML vs. a downloadable artifact needing exports_download), which has no output schema to cover it.
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 coverage, baseline is 3; the description adds the fact that the account overrides exist specifically to replace chart-of-accounts defaults sourced from SAGA settings, which the schema does not state. It does not explain the interaction between dateFrom/dateTo beyond what schema already covers.
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?
States a specific verb and resource (export payments in Saga XML format), which is legible against most siblings. However, the first sentence says "supplier payments (plati)" while the second says "incoming invoice payments," which are opposite flows, and no sibling (invoices_export_saga_xml, invoices_export_receipts_saga_xml, suppliers_export_saga_xml) is named to disambiguate.
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?
Gives context ("for accounting software integration") and a key behavioral rule (no period = all history), which implies when to call it. It never says when to use this instead of the sibling SAGA exports, nor any prerequisites such as SAGA settings having been configured.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
invoices_export_receipts_saga_xmlARead-onlyIdempotent
Export payment receipts (incasari) in Saga XML format. Exports the outgoing invoice payments in the given period (all of them when no period is passed) for accounting software integration. Use accountCash/accountBank/accountCard to override the chart-of-accounts for this export (defaults come from the company’s stored SAGA settings; SAGA requires the leaf analytic for cards, e.g. 5125.2).
| Name | Required | Description | Default |
|---|---|---|---|
| dateTo | No | End date (YYYY-MM-DD, payment date) | |
| dateFrom | No | Start date (YYYY-MM-DD, payment date). Pass a period: without one the whole history is exported. | |
| companyId | No | Company UUID override (uses active company if not set) | |
| accountBank | No | Override bank transfer account (e.g. 5121) | |
| accountCard | No | Override card analytic account (e.g. 5125.2) | |
| accountCash | No | Override cash account (e.g. 5311) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnly, idempotent, non-destructive), so the description's job is added context — and it delivers: no period means the whole history is exported, account defaults come from the company's stored SAGA settings, and card accounts require a leaf analytic (e.g. 5125.2). It stops short of saying what the call actually returns (inline XML vs. a downloadable artifact).
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 tight sentences, front-loaded with purpose and scope, then the account-override caveat. The parentheticals (incasari, the 5125.2 example) are load-bearing rather than 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?
For a 6-parameter read-only export with no output schema, the description covers scope, period semantics, and account overrides thoroughly. The one meaningful gap is the return shape — whether the XML is returned inline, as a base64 blob, or as a file reference — which the agent cannot infer without an output 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?
Schema coverage is 100%, so baseline is 3; the description still adds value by explaining the default source for the three account parameters (company SAGA settings) and the leaf-analytic constraint for cards, neither of which is in the schema. The dateFrom default behavior is restated from the schema but tied explicitly to export scope.
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?
Names a specific verb and resource (
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 accounting-software integration and states the period default, which is helpful context. However, it never names an alternative or an exclusion — notably it does not distinguish this from the near-identically named sibling invoices_export_payments_saga_xml, so the agent must infer which one to call.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
invoices_export_saga_xmlARead-onlyIdempotent
Export invoices in Saga XML format for accounting software integration (e.g., Saga C). Accepts the same filters as invoices_export_csv. Returns XML text content.
| Name | Required | Description | Default |
|---|---|---|---|
| sort | No | Sort field | |
| order | No | Sort order | |
| dateTo | No | End date (YYYY-MM-DD, issue date) | |
| search | No | Search term for invoice number or client name | |
| status | No | Filter by invoice status | |
| clientId | No | Filter by client UUID | |
| dateFrom | No | Start date (YYYY-MM-DD, issue date) | |
| companyId | No | Company UUID override (uses active company if not set) | |
| direction | No | Filter by direction |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, non-destructive, so the safety profile is covered; the description adds that the payload is returned as XML text content, which matters because there is no output schema. It omits any note on size limits or whether large exports route through exports_download.
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 sentences, front-loaded with the format and purpose, no filler. Slightly terse on the return side but every sentence earns its place.
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 export tool with full schema coverage, the description covers purpose, filters and return type. The main remaining gap is handling of large result sets (exports_download exists as a sibling), which an agent might want to know.
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 9 documented params and 4 enums, so the schema carries parameter meaning. The description only adds that filtering mirrors invoices_export_csv, which is a useful cross-reference but not additional semantics per parameter.
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?
States a specific verb (export), resource (invoices), and output format (Saga XML), which separates it from invoices_export_csv and invoices_export_zip. It does not explicitly distinguish itself from invoices_xml or invoices_export_receipts_saga_xml, but the resource+format pair is specific enough to route correctly.
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?
Gives the use context (accounting software integration, e.g. Saga C) and cross-references invoices_export_csv as the equivalent-filter alternative, implying CSV is the other choice. No explicit when-not condition, but the context is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
invoices_export_zipA
Export a set of invoices (by UUID list) to a ZIP archive containing PDFs, XMLs, and a CSV summary. Processed asynchronously — returns an exportId and statusUrl. Poll the statusUrl or wait for webhook. Requires Pro plan. Max 100 invoices per export.
| Name | Required | Description | Default |
|---|---|---|---|
| companyId | No | Company UUID override (uses active company if not set) | |
| includeCsv | No | Include CSV summary in ZIP (default: true) | |
| includePdf | No | Include PDF files in ZIP (default: true, requires Pro plan) | |
| includeXml | No | Include UBL XML files in ZIP (default: true) | |
| invoiceIds | Yes | Array of invoice UUIDs to include in the ZIP (max 100) | |
| folderStructure | No | ZIP folder organization: flat (default), by-client, by-month, or by-series |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Despite annotations already flagging non-read-only, the description adds the details that actually govern behaviour: asynchronous processing, an exportId + statusUrl return, two ways to await completion (polling or webhook), a Pro-plan gate, and a 100-invoice cap enforced per call.
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, then execution model, then gating constraints. No filler, and each clause carries decision-relevant 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?
With no output schema, the description correctly supplies the return shape (exportId, statusUrl). The one meaningful gap is how the finished archive is actually fetched — the exports_download sibling is never mentioned, leaving the agent to guess the retrieval step after polling reports ready.
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 every parameter (includeCsv/includePdf/includeXml/folderStructure/companyId) is already documented in the schema. The description only echoes the invoiceIds list and its 100-item limit, adding no meaning about the toggle or folder-structure options.
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?
States a specific verb and resource ('Export a set of invoices (by UUID list) to a ZIP archive') and immediately enumerates the contents (PDFs, XMLs, CSV summary), which implicitly separates it from siblings like invoices_export_csv and invoices_export_efactura_zip that produce only one artifact.
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 operating constraints (Pro plan, max 100, async) but never states when to pick this over invoices_export_csv, invoices_export_efactura_zip, or accounting_export_zip. Usage is only implied by the artefact list, so the agent must infer the selection rule itself.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
invoices_getARead-onlyIdempotent
Get complete details for a specific invoice by UUID, including all line items, payment history, events timeline, attachments, client and supplier info, XML/PDF generation status, and ANAF submission details.
| Name | Required | Description | Default |
|---|---|---|---|
| uuid | Yes | Invoice UUID | |
| companyId | No | Company UUID override (uses active company if not set) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, non-destructive and closed-world, so safety is covered. The description adds genuine value by disclosing the shape of the response (line items, payment history, events, attachments, ANAF submission details), which is meaningful since no output schema exists.
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?
A single front-loaded sentence with the verb and key first, followed by a payload enumeration that earns its length because it substitutes for a missing output schema. No filler or restatement of the name.
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 two-parameter read tool with full schema coverage, the description is nearly complete: it explains what is returned and that lookup is by UUID. It omits error behavior for unknown UUIDs and cross-company access semantics, minor gaps rather than blockers.
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 both parameters are already documented with descriptions. The description confirms the UUID is the lookup key but says nothing about the companyId override or what happens if it is omitted, so it adds little beyond the schema. Baseline 3 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?
States a specific verb and resource ('Get complete details for a specific invoice by UUID') and enumerates the payload contents, so the agent knows exactly what it retrieves. It does not explicitly distinguish itself from siblings like invoices_list or proforma_invoices_get, which would be needed for a 5.
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?
Usage is implied: fetch a single invoice when you have a UUID, versus the sibling invoices_list for enumerating. But no sentence states when to prefer this over invoices_events, invoices_attachments, or invoices_xml, which now appear partially redundant given this tool aggregates that data.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
invoices_issueAIdempotent
Issue a draft invoice. Validates the data, assigns a series number, generates UBL 2.1 XML, generates PDF (Pro plan), and changes status from "draft" to "issued". Once issued, the invoice cannot be edited. Use invoices_submit to send to ANAF e-Factura.
| Name | Required | Description | Default |
|---|---|---|---|
| uuid | Yes | Invoice UUID to issue | |
| companyId | No | Company UUID override (uses active company if not set) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly=false, idempotent=true, destructive=false, but the description goes well beyond them: it discloses the full side-effect chain (validation, series numbering, XML generation, PDF gated behind the Pro plan) and the irreversibility of the state change. The Pro-plan gating and "cannot be edited" are exactly the kind of runtime context annotations cannot express. The irreversibility note is in tension with destructiveHint=false only superficially — nothing is destroyed — so this is not a 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?
Three tight sentences, front-loaded with the action and its consequences, then the irreversibility warning, then the sibling routing. No filler, and each sentence carries a distinct piece of decision-relevant 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?
With no output schema, the description should indicate what an agent gets back and what failure looks like; it covers the success path and the Pro-plan caveat but is silent on validation failure behavior and on the returned object. For a two-parameter mutation with full annotation coverage, this is nearly complete but leaves the error path unaddressed.
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 both parameters (uuid, companyId) are already documented, and the description adds no syntax or format guidance beyond them. The baseline 3 applies; the only extra semantic signal is the implicit precondition that the referenced invoice must be in draft, and the companyId override/active-company behavior is left entirely to 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 definition states a specific verb and resource ("Issue a draft invoice") and enumerates the concrete effects — validation, series number assignment, UBL 2.1 XML, PDF on Pro plan, draft→issued state change. It explicitly names the sibling it is not (invoices_submit for ANAF e-Factura), so an agent can separate it from invoices_validate, invoices_pdf, and invoices_submit without opening any schema.
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 gives a clear precondition ("a draft invoice") and routes the follow-up action to invoices_submit, naming the condition that selects it. The warning that an issued invoice cannot be edited functions as an implicit "do not use if you still need to modify it," but there is no explicit when-not list or mention of what happens on a non-draft input.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
invoices_listARead-onlyIdempotent
List invoices for the active company with pagination, filtering, and sorting. Supports filtering by status (draft/issued/sent_to_provider/validated/rejected/cancelled), direction (incoming/outgoing), date range, client, and search term. Returns paginated results with totals.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | Page number (default: 1) | |
| sort | No | Field to sort by (default: issueDate) | |
| limit | No | Items per page, max 100 (default: 20) | |
| order | No | Sort order: asc or desc (default: desc) | |
| dateTo | No | End date filter on the issue date, ISO 8601 (YYYY-MM-DD) | |
| search | No | Search term for invoice number or client name | |
| status | No | Filter by invoice status | |
| clientId | No | Filter by client UUID | |
| dateFrom | No | Start date filter on the issue date, ISO 8601 (YYYY-MM-DD) | |
| companyId | No | Company UUID override (uses active company if not set) | |
| direction | No | Filter by direction: incoming or outgoing invoices |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare the safe read-only, idempotent, non-destructive profile, so the description focuses on behavior beyond safety: it states the active-company scope, supported filtering dimensions, pagination, sorting, and that results include totals. This adds useful operational context.
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 the core operation, then filters and return behavior. The text is dense but appropriate, with no filler 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?
Given 11 optional parameters and no output schema, the description provides enough context to call the tool correctly: scope, filtering, pagination, sorting, and return summary. It could say more about the shape of returned totals, but is largely 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 100%, so the schema already documents all parameters including defaults and enum values. The description restates the main filter groups and enumerates status/direction values, but adds little syntax or 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?
States a specific verb and resource (list invoices) with scope (active company) and capabilities (pagination, filtering, sorting). It is distinguishable from invoices_get by action, but does not explicitly name sibling 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?
Usage is implied by the list/filter nature of the tool, but the description does not explicitly say when to use it versus invoices_get, invoices_export_csv, or other invoice tools. No prerequisites or exclusions are stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
invoices_pdfARead-onlyIdempotent
Download the PDF representation of an invoice. Returns base64-encoded binary data with content type. Requires Pro plan. PDF is generated automatically on issue or on-demand when first requested.
| Name | Required | Description | Default |
|---|---|---|---|
| uuid | Yes | Invoice UUID | |
| companyId | No | Company UUID override (uses active company if not set) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish read-only, idempotent, non-destructive behavior. The description adds meaningful context beyond annotations: Pro plan requirement, base64-encoded return format with content type, and automatic/on-demand PDF generation timing.
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 compact sentences, front-loaded with the core action and followed by important return and prerequisite details. Every sentence contributes useful information without 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?
The description covers the key facts an agent needs: what is returned, how it is encoded, the plan requirement, and generation behavior. It is slightly incomplete regarding error conditions or explicit alternatives, but no output schema exists and the return behavior is adequately explained.
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 both parameters (uuid and companyId) are already documented in the schema. The description does not add parameter-specific meaning beyond what the schema provides, so the baseline of 3 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?
The description states a specific verb and resource: 'Download the PDF representation of an invoice.' This clearly distinguishes the tool from invoice data retrieval tools such as invoices_get and invoice XML export tools such as invoices_xml.
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 gives useful context by stating 'Requires Pro plan' and explaining when the PDF is generated. However, it does not explicitly say when to use this instead of siblings like invoices_get, invoices_export_zip, or invoices_share_links_create.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
invoices_restoreAIdempotent
Restore a cancelled invoice back to "draft" status. Only for accidental cancellations. Cannot restore if the invoice was submitted to ANAF, has credit notes, or has recorded payments. The invoice can then be edited and reissued.
| Name | Required | Description | Default |
|---|---|---|---|
| uuid | Yes | Invoice UUID to restore from cancelled status | |
| companyId | No | Company UUID override (uses active company if not set) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=false and idempotentHint=true, so the safety profile is covered; the description adds substantive context those annotations cannot: three concrete preconditions that block the call and the post-condition that the invoice becomes editable and reissuable. It does not mention permissions/authorization needs, but otherwise enriches the behavioral picture.
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?
Four short sentences, front-loaded with the action and target state, followed by the guard conditions. No filler and nothing out of order.
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 state-transition mutation with no output schema, the description covers the preconditions and the resulting state well enough to call correctly. It could mention the failure response shape or whether the original invoice number is preserved, but the essentials are present.
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 both parameters (uuid, companyId) are already documented in the schema. The description adds no parameter-level detail, so the baseline 3 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?
States a specific verb and resource ('Restore a cancelled invoice') plus the resulting state ('back to "draft" status'), which distinguishes it from siblings like invoices_cancel and invoices_delete. The state transition is 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?
'Only for accidental cancellations' sets a clear intent condition, and the exclusion list (ANAF-submitted, credit notes, payments) tells the agent when the call will fail. It stops short of naming alternative tools (e.g. invoices_cancel or reissuing via invoices_create) for the non-accidental case.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
invoices_submitA
Submit an issued invoice to the ANAF e-Factura system. The invoice must be in "issued" status. Changes status to "sent_to_provider". ANAF validates the invoice asynchronously — poll invoices_get or use invoices_events to check validation result.
| Name | Required | Description | Default |
|---|---|---|---|
| uuid | Yes | Invoice UUID to submit to ANAF | |
| companyId | No | Company UUID override (uses active company if not set) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare non-readonly, non-idempotent, open-world behavior; the description adds genuinely new context by naming the resulting state transition ('sent_to_provider') and disclosing that ANAF validation is asynchronous. It does not cover failure modes (duplicate submission, provider errors) or what the submit response itself contains, which keeps it from a 5.
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 sentences, front-loaded with the action and precondition, then the state effect, then the verification path. Every sentence carries operational information with 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?
For a state-changing, asynchronous submit tool with no output schema, the description covers the essential mental model: precondition, resulting status, and how to observe the async outcome. It leaves the failure/retry behavior unaddressed, which is the main remaining gap.
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 only two parameters, both well documented in the schema ('Invoice UUID to submit to ANAF', company override using active company). The description adds no parameter-level meaning beyond the schema, so the baseline 3 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?
The description opens with a specific verb+resource+target ('Submit an issued invoice to the ANAF e-Factura system'), which separates it from invoices_validate, invoices_issue, and invoices_efactura_message. It stops short of explicitly naming those siblings, so an agent must still infer the boundary with einvoice_submit and invoices_validate.
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 states the precondition clearly ('must be in "issued" status') and gives explicit follow-up routing: poll invoices_get or use invoices_events for the validation result. It does not tell the agent what to do if the invoice is in another status or when to prefer this over einvoice_submit/invoices_validate.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
invoices_sync_clientAIdempotent
Resync a single invoice with its client's current profile data (receiver name, CUI/CNP, buyer snapshot, VAT rules). Only allowed while the invoice has not been uploaded to ANAF (or was rejected) and is not cancelled. Cached XML/PDF files are invalidated so they regenerate with the corrected data. Use clients_sync_invoices to resync all unsent invoices of a client at once.
| Name | Required | Description | Default |
|---|---|---|---|
| uuid | Yes | Invoice UUID to resync with its client's current data | |
| companyId | No | Company UUID override (uses active company if not set) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare readOnlyHint=false, idempotentHint=true, destructiveHint=false, so the mutation profile is already structured. The description adds real value by disclosing the gating conditions and the cascading side effect (cached XML/PDF invalidated and regenerated), but it does not say what the call returns or what happens when the preconditions fail (error vs. partial apply).
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 tight sentences; the core action is front-loaded, preconditions second, side effect and alternative last. No redundancy against the schema or annotations.
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 mutation tool with no output schema, the description covers preconditions, side effects, and the sibling alternative, which is nearly everything an agent needs. It falls short only on the return payload and failure behavior, which matters given there is no output 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?
Schema coverage is 100% with only two params, so the schema documents uuid and the companyId override adequately. The description names the fields being synced (receiver name, CUI/CNP, VAT rules) but adds nothing about parameter syntax or the companyId override, so baseline 3 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?
Specific verb+resource ('resync a single invoice with its client's current profile data') with the affected fields enumerated, and it explicitly contrasts with the sibling clients_sync_invoices. An agent can distinguish it from the many other invoices_* tools without opening a schema.
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?
Gives hard preconditions ('only allowed while the invoice has not been uploaded to ANAF (or was rejected) and is not cancelled') plus the explicit alternative for the bulk case (clients_sync_invoices). Both when-to-use and when-not are covered.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
invoices_updateAIdempotent
Update an existing draft invoice. Only invoices with status "draft" can be updated. When updating the lines array, the entire array is replaced — include all lines you want to keep. Once issued, use invoices_cancel instead.
| Name | Required | Description | Default |
|---|---|---|---|
| uuid | Yes | Invoice UUID to update | |
| lines | No | Invoice line items. WARNING: replaces all existing lines — include every line you want to keep. | |
| notes | No | Public notes visible to the client | |
| dueDate | No | Payment due date (YYYY-MM-DD) | |
| clientId | No | Client UUID | |
| currency | No | ISO 4217 currency code | |
| issuerId | No | Issuer ID number | |
| language | No | Document language for PDF generation (default: ro) | |
| mentions | No | Additional legal mentions | |
| seriesId | No | Invoice series UUID | |
| companyId | No | Company UUID override (uses active company if not set) | |
| issueDate | No | Invoice issue date (YYYY-MM-DD) | |
| deputyAuto | No | Deputy vehicle registration | |
| deputyName | No | Deputy/representative name | |
| issuerName | No | Name of person issuing the invoice | |
| salesAgent | No | Sales agent name | |
| orderNumber | No | Purchase order number | |
| plataOnline | No | Enable online payment via Stripe | |
| platitorTva | No | Whether sender is VAT payer | |
| receiverCif | No | Receiver tax ID / CIF | |
| vatIncluded | No | When used with autoApplyVatRules, sets whether unit prices include VAT on all lines. Ensures correct totals after VAT rules change rates. | |
| documentType | No | Document type | |
| exchangeRate | No | Exchange rate relative to RON | |
| internalNote | No | Internal note (not visible to client) | |
| paymentTerms | No | Payment terms description | |
| receiverName | No | Receiver name (when no client entity exists) | |
| taxPointDate | No | Tax point date (YYYY-MM-DD) | |
| paymentMethod | No | Payment method: bank_transfer, cash, card, cheque, other | |
| tvaLaIncasare | No | VAT on collection / TVA la încasare | |
| ublExtensions | No | UBL extension fields for advanced e-Factura compliance. These map directly to UBL XML elements not covered by the standard invoice fields. | |
| buyerReference | No | Buyer reference identifier | |
| contractNumber | No | Contract reference number | |
| penaltyEnabled | No | Enable late payment penalty | |
| invoiceTypeCode | No | Tax regime / invoice type code | |
| deliveryLocation | No | Delivery address | |
| parentDocumentId | No | Parent document UUID (for credit notes) | |
| penaltyGraceDays | No | Grace period before penalty applies | |
| projectReference | No | Project reference number | |
| taxPointDateCode | No | Tax point date code | |
| autoApplyVatRules | No | Auto-apply VAT rules (reverse charge for VIES-valid EU clients, OSS destination rate for non-VIES EU clients). Default: false. | |
| showClientBalance | No | Show client balance on invoice | |
| deputyIdentityCard | No | Deputy ID card number | |
| businessProcessType | No | Business process type | |
| penaltyPercentPerDay | No | Daily penalty percentage | |
| tenderOrLotReference | No | Tender or lot reference | |
| despatchAdviceReference | No | Despatch advice reference | |
| buyerAccountingReference | No | Buyer accounting reference | |
| invoicedObjectIdentifier | No | Invoiced object identifier | |
| receivingAdviceReference | No | Receiving advice reference |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations cover mutation and idempotency, but the description adds critical behavioral context: updates are limited to draft invoices and the lines array is fully replaced, requiring callers to include all lines to keep. It does not mention auth or rate limits, but adds meaningful operational detail 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 short sentences, front-loaded with the primary action and constraint, then the critical lines caveat and alternative. No wasted text.
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 49-parameter update tool with full schema descriptions and no output schema, the description covers the key operational caveats (draft-only, line replacement, alternative tool). It does not detail authentication or side effects beyond annotations, but is otherwise 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 the schema already documents all parameters. The description reinforces the lines replacement semantics but does not add new parameter-level meaning 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 states a specific verb and resource: update an existing draft invoice. It distinguishes from siblings by restricting to draft status and naming invoices_cancel for issued 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?
It clearly says when to use: only draft invoices, and points to invoices_cancel once issued. It does not mention other alternatives like invoices_delete for drafts or when to prefer invoices_create, but the main conditional guidance is explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
invoices_validateARead-onlyIdempotent
Validate an invoice before issuing or submitting. Returns a list of errors and warnings. Use mode "quick" for fast validation (basic rules) or "full" for comprehensive UBL Schematron and CIUS-RO compliance checks.
| Name | Required | Description | Default |
|---|---|---|---|
| mode | No | Validation mode: "quick" for fast basic rules (default), "full" for UBL Schematron + CIUS-RO compliance (slower) | |
| uuid | Yes | Invoice UUID to validate | |
| companyId | No | Company UUID override (uses active company if not set) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, non-destructive and closed-world, so the safety profile is covered. The description adds value beyond that by disclosing the return content ("list of errors and warnings") and the cost tradeoff between modes (fast vs. slower comprehensive checks), which is not in 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?
Three short sentences with zero filler: purpose first, return value second, mode selection last. All actionable 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?
For a read-only validation tool with no output schema, the description covers purpose, inputs (via schema), mode behavior, and the shape of the result (errors and warnings). It could go slightly further on whether a failed validation errors out versus always returning a report, but the essentials are present.
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 every parameter, including the mode enum and the companyId override fallback, is already documented in the schema. The description's mode explanation largely restates the enum description, so it adds little beyond structured data. 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?
States a specific verb+resource ("Validate an invoice") with an explicit scope qualifier ("before issuing or submitting") that separates it from the write siblings invoices_issue and invoices_submit. An agent can identify the tool's role without opening the schema.
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?
Gives a clear when-to-use condition ("before issuing or submitting") and explains the choice between the two modes ("quick" for fast basic rules, "full" for comprehensive compliance). It does not explicitly name or exclude alternatives, but the workflow positioning is unambiguous.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
invoices_verify_signatureARead-onlyIdempotent
Verify the ANAF digital signature on a validated invoice. Checks certificate validity, signature cryptographic integrity, and XML content integrity. Requires Pro plan and the invoice must be in "validated" status (ANAF-signed).
| Name | Required | Description | Default |
|---|---|---|---|
| uuid | Yes | Invoice UUID (must be ANAF-validated) | |
| companyId | No | Company UUID override (uses active company if not set) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly=true, idempotent=true, non-destructive, closed-world, so safety is covered. The description adds genuinely useful context beyond them: the Pro-plan entitlement gate and the fact that a non-validated invoice is not eligible. However, it never says what a failed verification produces (error vs. a negative result field) or what the response contains, which matters for a verification tool with no output 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?
Three short sentences, each earning its place: purpose and scope, the specific checks performed, then the eligibility constraints. The core action is front-loaded with zero 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?
Covers purpose, checks, and preconditions, and annotations handle safety, with full schema coverage on two parameters. The one real gap is return semantics: with no output schema, the agent cannot know whether success yields a boolean, a certificate detail block, or a thrown error.
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 both parameters (uuid, companyId) carry their own descriptions, including the 'must be ANAF-validated' constraint on uuid. The description adds no syntax, format, or override semantics beyond that, so baseline 3 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?
Specific verb (verify) plus precise resource (the ANAF digital signature on a validated invoice), with the three sub-checks enumerated (certificate validity, cryptographic integrity, XML content integrity). The 'must be in validated status' precondition implicitly separates it from sibling invoices_validate, so an agent can tell what stage of the workflow this occupies.
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?
States two concrete preconditions: requires Pro plan and the invoice must be in 'validated' (ANAF-signed) status. It does not explicitly name alternatives (e.g. invoices_validate to reach that state, or invoices_xml for raw XML), so there are no stated when-not-to-use exclusions, but the context is clear enough to invoke correctly.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
invoices_xmlARead-onlyIdempotent
Download the UBL 2.1 XML file for an issued invoice. Returns the XML text content. The XML is the format required for ANAF e-Factura submission and conforms to CIUS-RO and EN 16931 standards.
| Name | Required | Description | Default |
|---|---|---|---|
| uuid | Yes | Invoice UUID | |
| companyId | No | Company UUID override (uses active company if not set) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the safety profile is covered. The description adds real value beyond that: it discloses the return payload ('XML text content') and the conformance standards (CIUS-RO, EN 16931), which tells the agent the output is submission-ready rather than arbitrary XML.
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 sentences, zero filler, with the core action and format front-loaded before the standards detail. Everything earns its place.
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 no output schema, the description correctly covers the return value ('XML text content'), which is the key unknown. It does not address whether the invoice must already be issued/validated or what happens on an invalid state, a minor gap for a simple read 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% with only two parameters, so the schema already documents uuid and the companyId override. The description adds nothing about parameter behavior (e.g., whether the active company is used when companyId is omitted), so it sits at 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?
States a specific verb+resource (download XML file for an issued invoice) and pins the exact format (UBL 2.1). It does not name or differentiate against close siblings like invoices_export_efactura_zip or invoices_efactura_message, so an agent must infer which export tool fits.
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 phrase 'for an issued invoice' implies a precondition and usage context, but the description never says when to pick this over invoices_pdf, invoices_export_efactura_zip, or invoices_submit. No exclusions or alternatives are mentioned.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
licensing_create_keyA
Generate a new license key for a self-hosted Storno instance. Only the organization owner can create license keys. The full 64-character license key is returned ONLY ONCE — store it immediately. Each self-hosted instance should use its own key.
| Name | Required | Description | Default |
|---|---|---|---|
| instanceName | No | Human-readable name for the self-hosted instance (e.g. "Production", "Staging") |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only say non-read-only, non-idempotent, non-destructive; the description adds genuinely critical behavior not available elsewhere: the 64-character key is shown ONLY ONCE and must be stored immediately, and creation is restricted to the organization owner. These are exactly the facts an agent must know before invoking.
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 sentences, zero waste, with the highest-risk fact (one-time key display) front-loaded after the purpose statement. Every sentence carries distinct 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?
With no output schema, the description correctly compensates by describing the return value (full 64-character key, shown once) and the authorization requirement. Minor gaps: it doesn't say whether instanceName is required or what happens to previously issued keys for the same instance.
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 single optional parameter (instanceName) is fully documented in the schema with examples. The description adds no parameter-level detail beyond that, so the baseline 3 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?
States a specific verb and resource ('Generate a new license key') plus the scope ('for a self-hosted Storno instance'). This is unambiguously distinct from the sibling licensing_list_keys, licensing_revoke_key, and licensing_validate tools without needing to name 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?
Gives a concrete prerequisite ('Only the organization owner can create license keys') and a usage rule ('Each self-hosted instance should use its own key'). It does not explicitly exclude cases or point to a sibling for listing/validating existing keys, so it falls short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
licensing_list_keysARead-onlyIdempotent
List all license keys issued for the current organization. Keys are returned with masked values (first and last 8 characters shown). Includes active and revoked keys with lastValidatedAt timestamps to verify self-hosted instances are running. Only the organization owner can list keys.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent and non-destructive, yet the description still adds genuinely new traits: values are masked to first/last 8 characters, revoked keys are included alongside active ones, and an owner-level authorization requirement applies. These are exactly the details an agent cannot get from the annotation block.
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?
Four sentences, no repetition, and the core operation is stated first before disclosure of masking, key states and the owner restriction. Every sentence carries distinct 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?
With no parameters, no output schema and rich annotations, the remaining risk is unknown return shape — and the description closes that gap by describing masking format, inclusion of revoked keys and the lastValidatedAt field. Nothing an agent needs in order to call or interpret the result is missing.
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 tool takes zero parameters, so the baseline is 4 and there is nothing for the description to disambiguate. It correctly does not waste text on parameter semantics and instead spends it on return content.
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 opens with a specific verb and resource ('List all license keys') scoped to 'the current organization', which cleanly separates it from licensing_create_key, licensing_revoke_key and licensing_validate. An agent can identify the operation without inspecting any schema.
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 states the access condition ('Only the organization owner can list keys') and gives a concrete use case ('lastValidatedAt timestamps to verify self-hosted instances are running'), which tells the agent why it would call this. It does not explicitly name when to prefer a sibling (e.g., licensing_validate for checking a single key), so it falls short of a full routing statement.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
licensing_revoke_keyADestructiveIdempotent
Revoke (deactivate) a license key. The associated self-hosted instance will fall back to the Free plan on its next validation cycle (within 24 hours). Revocation is a soft delete — the key record is kept with active: false. Revoked keys cannot be reactivated; generate a new key instead. Only the organization owner can revoke keys.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | UUID of the license key to revoke |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Adds substantial behavior beyond the annotations: it discloses the consequence (instance falls back to Free plan within 24 hours), that it is a soft delete (active: false, record retained), irreversibility (cannot be reactivated), and an authorization constraint (org owner only). These are exactly the operational facts an agent needs for a destructive mutation.
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?
Four tight sentences, front-loaded with the core action, then consequence, mutability, and permission. Every sentence contributes a distinct operational fact with no redundancy.
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 destructive, single-parameter mutation with no output schema, the description covers consequence, reversibility, retention, timing, and authorization — everything needed to invoke it correctly and safely. Nothing material is missing.
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 a single documented parameter ('UUID of the license key to revoke'), so the schema already carries full parameter meaning. The description adds no format or usage detail beyond what the schema provides, so baseline 3 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?
States a specific verb and resource ('Revoke (deactivate) a license key') and distinguishes the action from its siblings by noting that revoked keys cannot be reactivated and a new key should be generated instead. An agent can tell this apart from licensing_create_key and licensing_validate without opening any schema.
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?
Provides clear context for when to use it (permanent revocation) and effectively when not to (no reactivation possible — use a new key path instead). It stops just short of naming the sibling tool to select, so it's strong but not fully explicit routing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
licensing_validateARead-onlyIdempotent
Validate a self-hosted license key and retrieve the current plan, features, and subscription details. This endpoint does NOT require authentication — the license key itself is the credential. Returns plan features, organization name, billing period end, and trial info if applicable. Used by self-hosted instances every 24 hours.
| Name | Required | Description | Default |
|---|---|---|---|
| licenseKey | Yes | 64-character hex license key issued for the self-hosted instance | |
| instanceUrl | No | Public URL of the self-hosted instance (stored for identification in the dashboard) | |
| instanceName | No | Human-readable name for this self-hosted instance (stored for identification) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, non-destructive, so the safety profile is covered. The description adds genuinely useful context beyond that: no auth required because the key is the credential, and the periodic 24-hour call cadence.
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?
Front-loaded with the core action and scope, and every sentence is relevant. The third sentence partially restates the return fields already implied by sentence one, which is mild redundancy.
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 no output schema, the description does the work of describing returned fields (plan features, org name, billing period end, trial info) and the auth model. It does not describe behavior on an invalid or expired key, a minor remaining gap.
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 all three parameters are documented in the schema itself. The description adds no detail about instanceUrl/instanceName or key format, so the 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?
States a specific verb and resource ("Validate a self-hosted license key") plus what it returns. It is clearly distinguishable from siblings like licensing_create_key, licensing_list_keys, and licensing_revoke_key, which are named for other license operations.
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?
Gives clear context: "Used by self-hosted instances every 24 hours" and notes no authentication is needed. It does not explicitly exclude or route against the sibling key-management tools, so it stops short of the top mark.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
mailer_config_deleteADestructiveIdempotent
Delete the organization's custom email sender configuration. Client documents revert to being sent from the default Storno address.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations already identify this as destructive and idempotent. The description adds useful behavioral context beyond annotations by explaining the post-delete effect: client documents revert to the default Storno address.
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. It front-loads the action and then immediately explains the operational consequence.
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 zero-parameter destructive configuration deletion, the description covers the essential action and its effect. It could add more explicit usage guidance, but annotations already provide safety and idempotency context, and no output schema exists.
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?
There are zero parameters, so parameter semantics are not a meaningful gap. The baseline for a no-parameter tool is 4, and no additional parameter explanation is needed.
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 states a specific verb and resource: delete the organization's custom email sender configuration. It is clearly distinct from sibling tools such as mailer_config_get, mailer_config_update, and mailer_config_test.
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 effect of deletion is described, which implies when an agent might use it: when custom email sending should be removed and default sending restored. However, it does not explicitly say when to choose this over mailer_config_update or what prerequisites or warnings apply.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
mailer_config_getARead-onlyIdempotent
Get the organization's custom email sender (SMTP) configuration (Business plan). Returns the host, port, encryption, username, from address/name, whether a password is saved, and the last test time. The password is never returned.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true and destructiveHint=false, so the safety profile is covered. The description adds meaningful behavior beyond that: the Business plan gating and the explicit guarantee that the password is never returned, which matters for an agent handling credentials.
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 tight sentences: the first names the resource and plan requirement, the second enumerates the returned fields, the third flags the password exclusion. Nothing is repeated from the annotations and no sentence is 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?
With no output schema, the description carries the return-value burden and does so by listing the returned fields and the deliberate omission of the password. The one remaining gap is the unconfigured case (error vs. nulls), which an agent would want to know before branching.
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 tool takes zero parameters, so there is nothing for the description to disambiguate and the baseline of 4 applies. The schema is empty and consistent with the description's implication that the config is scoped to the caller's organization.
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?
States a specific verb (get) and a specific resource (the organization's custom SMTP/email sender configuration), which is unambiguous against siblings like mailer_config_update, mailer_config_test and mailer_config_delete. The field list that follows further pins down exactly what is retrieved.
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?
Usage is only implied — an agent infers this is the read side of the mailer_config family. The Business plan note is a useful prerequisite, but there is no explicit 'use this before updating' or 'call mailer_config_test to verify' routing, and no statement about what happens when no configuration exists yet.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
mailer_config_testA
Send a test message through the custom email sender to verify the SMTP settings. Uses the saved configuration unless overridden by the parameters. Sends to testEmail, or to the from address if omitted.
| Name | Required | Description | Default |
|---|---|---|---|
| host | No | ||
| port | No | ||
| fromName | No | ||
| password | No | ||
| username | No | ||
| testEmail | No | Recipient for the test message (defaults to the from address) | |
| encryption | No | ||
| fromAddress | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare openWorldHint=true, readOnlyHint=false, and idempotentHint=false. The description adds useful behavioral detail: it actually sends a message, uses saved configuration by default, and falls back to the from address when testEmail is omitted.
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 sentences, front-loaded with the tool's purpose and followed by the configuration and recipient rules. No wasted text.
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 the core action, configuration source, and recipient fallback for an 8-parameter optional-override tool. It does not describe failure behavior or provide enough parameter detail to fully compensate for the sparse schema, but annotations cover the side-effect profile.
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 only 13%, so the description must carry most parameter meaning. It explains that parameters can override saved configuration and clarifies testEmail fallback, but it leaves host, port, fromName, password, username, encryption, and fromAddress semantics undocumented.
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?
States a specific verb and resource: send a test message through the custom email sender to verify SMTP settings. This clearly distinguishes it from configuration-management siblings such as mailer_config_get and mailer_config_update.
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 validating SMTP configuration and explains that saved settings are used unless parameters override them. However, it does not explicitly state when not to use it or name alternatives, leaving usage context only implied.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
mailer_config_updateAIdempotent
Create or update the organization's custom email sender (Business plan only). Invoices, receipts, and delivery notes to clients are then sent through this SMTP server from your own address. Omit the password on update to keep the saved one.
| Name | Required | Description | Default |
|---|---|---|---|
| host | No | SMTP host (e.g., "smtp.example.com") | |
| port | No | SMTP port (e.g., 587 for STARTTLS, 465 for SSL) | |
| enabled | No | Enable or disable the custom sender | |
| fromName | No | Display name for the sender | |
| password | No | SMTP password (omit to keep the saved one) | |
| username | No | SMTP username | |
| encryption | No | Connection encryption: "tls" (STARTTLS), "ssl" (implicit), or "none" | |
| fromAddress | No | From address (must be authorized on the SMTP server) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare idempotentHint=true, destructiveHint=false, readOnlyHint=false, so the safety profile is covered; the description adds real value beyond that with upsert semantics, the password-retention rule on update, and the downstream consequence that client-facing documents are sent through this SMTP server. It stops short of saying whether credentials are validated before saving or what happens on a failed connection.
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 sentences, front-loaded with the action and resource, then the consequence, then the one non-obvious operational rule. 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?
For a 8-param, zero-required upsert tool with no output schema, the description covers plan gating, create-vs-update behavior, and the password edge case. It leaves out validation/error behavior and whether saving is transactional with mailer_config_test, which is a modest remaining gap.
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 every parameter including host, port, encryption enum, and fromAddress is already documented. The description's one added hint — omitting the password keeps the saved one — duplicates the schema's own 'omit to keep the saved one' text, so it adds no meaning beyond the structured fields.
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?
States a specific verb pair ('Create or update') and resource ('the organization's custom email sender'), and its effect on outbound invoice/receipt/delivery-note mail is spelled out. An agent can immediately distinguish it from the read-only mailer_config_get, mailer_config_test, and mailer_config_delete siblings.
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 plan gating ('Business plan only') is a useful prerequisite, and the upsert framing implies when to reach for it. However, it never names alternatives or exclusions — e.g. that mailer_config_test should be used to verify credentials, or that mailer_config_get reads the current config — leaving routing to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
members_deleteADestructiveIdempotent
Deactivate (soft-delete) a member from the organization. Preserves historical data but prevents login. Cannot deactivate yourself, the organization owner, or super admins.
| Name | Required | Description | Default |
|---|---|---|---|
| uuid | Yes | Member UUID to deactivate |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations already declare destructive and idempotent behavior, and the description adds meaningful context beyond them: the operation is a soft-delete, preserves historical data, prevents login, and has role-based restrictions. This directly helps an agent anticipate consequences and avoid invalid calls.
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 tightly written sentences with the core action front-loaded and no wasted language. The restrictions follow immediately and are 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 one-parameter soft-delete tool with rich annotations and no output schema, the description covers the essential action, data effect, login impact, and role restrictions. Nothing critical is missing for correct invocation.
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 sole parameter is already documented as "Member UUID to deactivate." The description adds no additional syntax or format guidance beyond what the schema provides, so the 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 and resource: "Deactivate (soft-delete) a member from the organization." It clearly distinguishes this destructive member operation from member listing and updating siblings.
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 provides clear when-not conditions by naming subjects that cannot be deactivated: yourself, the organization owner, and super admins. It does not explicitly compare this tool to alternatives such as members_update, but the usage context is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
members_listARead-onlyIdempotent
List all members of the organization with their roles, active status, and allowed company access. Only organization admins and owners can list members.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare this as a safe, read-only, idempotent, non-destructive operation. The description adds valuable context by disclosing the authorization constraint and the member fields returned, though it does not discuss ordering or completeness guarantees.
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-load the main action and follow with the access constraint. There is no redundant or filler text.
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 no input parameters and no output schema, the description supplies what an agent needs: it explains what is returned and who may call it. No significant behavioral or authorization detail is missing for this simple list 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?
The tool has zero parameters, so there is no parameter semantics to explain. The description appropriately does not invent parameter details.
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 states a specific verb and resource: list all organization members. It also enumerates the returned attributes (roles, active status, company access), making its purpose distinct from members_update and members_delete.
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 the prerequisite that only organization admins and owners can list members. It does not name alternatives or when-not-to-use cases, but the operation is a straightforward list with no obvious competing sibling.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
members_permissions_referenceARead-onlyIdempotent
Get the permissions reference: all available permissions grouped by category, and role default permissions for each role (owner, admin, accountant, employee). Useful for understanding which permissions exist before setting custom permissions on a member.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, openWorldHint=false, and destructiveHint=false. The description adds useful behavioral context by specifying what the reference contains: permissions grouped by category and role defaults for owner, admin, accountant, and employee.
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 wasted language. It front-loads the core action and follows with the practical reason to use it.
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 reference tool with no parameters and no output schema, the description is complete enough. It explains what is returned and when an agent should use it, and annotations cover the safety profile.
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 tool has zero parameters, so parameter semantics are not a meaningful gap. The baseline for a no-parameter tool is 4, and the description appropriately focuses on the returned reference content instead.
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 states a specific verb and resource: it retrieves a permissions reference, including available permissions grouped by category and default permissions for each named role. It is clearly distinguishable from mutation siblings like members_update and members_delete.
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 gives a clear usage context: use it to understand which permissions exist before setting custom permissions on a member. It does not explicitly name members_update as the alternative, but the workflow guidance is clear and sufficient.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
members_updateAIdempotent
Update a member's role, active status, allowed company access, and custom permissions. Cannot change role to OWNER or modify the organization owner. Roles: ADMIN, ACCOUNTANT, EMPLOYEE. Pass permissions as an array of permission strings to set custom permissions, or null to reset to role defaults.
| Name | Required | Description | Default |
|---|---|---|---|
| role | No | New role for the member: ADMIN, ACCOUNTANT, or EMPLOYEE | |
| uuid | Yes | Member UUID to update | |
| isActive | No | Whether the member is active. Deactivated members cannot log in. | |
| permissions | No | Custom permissions array (e.g. ["company.view","invoice.create"]). Pass null to reset to role defaults. | |
| allowedCompanies | No | Array of company UUIDs the member is allowed to access |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare non-read-only, idempotent, non-destructive, so the safety profile is covered. The description adds genuine policy context beyond that: the OWNER restriction and the null-permissions reset semantics, which an agent could not infer from annotations. It does not say whether omitted fields are left untouched or how invalid permission strings are handled.
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 dense sentences: what it updates first, hard constraints second, permission semantics third. No filler and the most important restriction is not buried.
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 5-parameter mutation tool with full schema coverage, annotations covering safety and idempotency, and no output schema, the description is nearly sufficient. The remaining gap is minor: no statement about partial-update behavior or what a rejected update returns.
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 all five parameters are documented in the schema, including the null-reset behavior for permissions and the deactivation effect of isActive. The description largely restates those semantics rather than adding new ones, so the baseline 3 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?
States a specific verb (update) and resource (member) and enumerates exactly which attributes are mutable: role, active status, allowed company access, custom permissions. That enumeration distinguishes it cleanly from members_list and members_delete, though no sibling is named explicitly.
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?
Gives real when-not guidance: cannot set role to OWNER and cannot modify the organization owner, which prevents a whole class of failed calls. It does not point to members_permissions_reference for valid permission strings or to invitations_create for non-members, so alternatives remain implicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
nc_codes_searchARead-onlyIdempotent
Search NC (Combined Nomenclature / NACE) classification codes by code number or description. NC codes are used in e-Transport declarations for goods classification. Returns matching codes with their descriptions.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum results to return (max 100, default: 30) | |
| search | Yes | Search query (NC code number or description text) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, openWorldHint=false and destructiveHint=false, so the safety profile is fully covered. The description still contributes the return shape ('matching codes with their descriptions') in the absence of an output schema, but says nothing about result ordering, empty-result behavior, or how partial/fuzzy matching works.
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 sentences, front-loaded with the verb and resource, followed by domain context and the return shape. No filler, no repetition of schema fields.
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 two-parameter read-only lookup with 100% schema coverage and no output schema, the description covers purpose, domain context, and return content adequately. Only matching behavior (partial vs exact, case sensitivity) is left unaddressed.
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 both parameters (search, limit) are already documented in structured data. The description restates the search semantics (code number or description text) but adds no matching-behavior detail beyond the schema, so baseline 3 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?
States a specific verb (Search) and resource (NC / Combined Nomenclature / NACE classification codes) plus the lookup keys (code number or description). It also clarifies the domain purpose (e-Transport goods classification). It does not name any sibling (e.g. cpv_codes_search, vat_category_codes_list) that could be confused with it, so it stops short of a 5.
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 mention that NC codes are used in e-Transport declarations implies when the tool is relevant, but there is no explicit when-to-use/when-not-to-use statement or directive to pick this over cpv_codes_search or the anaf_nomenclator_* tools. Usage is inferable but not guided.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
notification_preferences_getARead-onlyIdempotent
Get the authenticated user's notification preferences for all event types. Returns per-event settings for email, in-app, push, and WhatsApp channels.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, openWorldHint=false, and destructiveHint=false, so safety is covered. The description adds useful context that the result covers all event types and per-event email, in-app, push, and WhatsApp settings, but it does not add much beyond that return scope.
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 short sentences with zero wasted text. The core action and return scope are front-loaded and 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 zero-parameter read-only getter with rich annotations, the description supplies enough context to understand what is fetched and at a high level what is returned. It does not describe the exact response shape, but no output schema exists and the high-level channel summary is adequate for this simple 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?
The tool has zero parameters, so there are no parameter semantics to document. The baseline for a no-parameter tool is 4, and the description does not introduce any misleading parameter expectations.
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 gives a specific verb and resource: get the authenticated user's notification preferences across all event types, and it explains the returned channel data. It is clearly a read operation versus the sibling notification_preferences_update, though it does not explicitly name the update alternative.
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?
Usage is strongly implied by 'Get the authenticated user's notification preferences', but there is no explicit when-to-use guidance, prerequisites, or comparison to notification_preferences_update. The agent can infer this is the read operation, but the description does not route between alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
notification_preferences_updateAIdempotent
Update notification preferences for specific event types. Each preference controls email, in-app, push, and WhatsApp delivery channels. Event types include: invoice.validated, invoice.rejected, invoice.due_soon, invoice.due_today, invoice.overdue, sync.completed, sync.error, efactura.new_documents, token.expiring_soon, token.refresh_failed, export_ready.
| Name | Required | Description | Default |
|---|---|---|---|
| preferences | Yes | Array of notification preference updates |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare non-read-only, idempotent, non-destructive, closed-world behavior, so the safety profile is covered. The description adds useful domain context (four delivery channels per preference), but it never says whether the submitted array replaces the full preference set or merges into it — the single most consequential behavior for an idempotent update 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?
Two sentences with the action and channel semantics front-loaded, followed by an enumeration. The long event-type list is dense but earns its place because the schema has no enum; nothing else is wasted.
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 one parameter, full schema coverage, and rich annotations, most of the burden is already met, and no output schema is needed. Still missing for a preference-mutation tool: whether unlisted channels/event types are preserved or reset, and whose preferences are affected — both matter for calling 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% and there is only one parameter, so the baseline would be 3. However, the description enumerates the valid event types (invoice.validated, sync.error, token.expiring_soon, etc.), which the schema does not provide — eventType is a free-form string with no enum, only an example. That list adds real meaning beyond the structured data.
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?
States a specific verb and resource ('Update notification preferences') and narrows scope to 'specific event types', which is more precise than the name alone. It does not address whose preferences are being changed (current user vs. company-wide), which is the one ambiguity an agent might care about, so it falls short of a 5.
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 phrase 'for specific event types' implies partial, targeted updates, but there is no explicit statement of when to use this versus notification_preferences_get, nor whether an omitted event type or channel is left untouched. Usage is inferable but never spelled out.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
notifications_listARead-onlyIdempotent
Retrieve a paginated list of notifications for the authenticated user. Notification types include: invoice_received, invoice_paid, sync_completed, sync_failed, token_expiring, token_expired, payment_overdue, invitation_received.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | Page number for pagination (default: 1) | |
| limit | No | Number of items per page (default: 20, max: 100) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true and destructiveHint=false, so the safety profile is covered. The description adds genuinely useful context the annotations don't: the scope is the authenticated user's own notifications, results are paginated, and the concrete taxonomy of possible notification types. It doesn't state ordering (newest first?) or whether read and unread are mixed, which keeps it below 5.
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, zero filler, and the core action plus scope come first with the type list as supporting detail. The enumerated types are dense but each one earns its place by telling the agent what states can appear.
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 list tool whose annotations cover safety and whose schema fully documents both params, the description is nearly sufficient. The remaining gap is the absence of any hint about ordering or the shape of a notification item (since no output schema exists), which would help an agent consume the result 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 description coverage is 100% and both parameters (page, limit) are fully documented with defaults and max in the schema. The description only restates "paginated" and adds no syntax or format detail beyond that, so the baseline of 3 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?
States a specific verb and resource ("Retrieve a paginated list of notifications") plus the scope constraint ("for the authenticated user"). The enumeration of notification types further pins down what the resource contains, making it easy to distinguish from siblings like notifications_unread_count or notifications_mark_read.
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?
Usage is implied by the verb "list" rather than stated: there is no explicit guidance on when to use this versus notifications_unread_count or the mark-read tools, and no mention of filtering by read status or type. An agent can infer the purpose but must reason about alternatives on its own.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
notifications_mark_readAIdempotent
Mark a specific notification as read. This operation is idempotent — marking an already-read notification has no error. Decrements the unread count by one.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Notification UUID to mark as read |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare idempotentHint=true and destructiveHint=false, so the idempotency sentence is partly redundant, but it clarifies that re-marking produces no error. The description also discloses a side effect absent from annotations: the unread count decrements by one, which is genuinely useful state-change context.
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 sentences, front-loaded with the action, then behavior, then side effect. Every sentence adds something, though the idempotency line partly duplicates the idempotentHint annotation.
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 one-parameter mutation with rich annotations and no output schema, the description covers the action, the idempotent failure mode, and the observable side effect. Nothing an agent needs in order to call it correctly is missing.
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 single 'id' parameter is documented as a Notification UUID, so the schema carries the semantics. The description adds only 'a specific notification', which restates rather than enriches the parameter.
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 states a specific verb and resource ('Mark a specific notification as read'), and the word 'specific' implicitly contrasts with the sibling notifications_read_all and spv_documents_mark_read. It never names those siblings explicitly, so the differentiation is inferable rather than stated.
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?
Usage is implied by the single-object framing, but the description never says when to prefer this over notifications_read_all or why an agent would pick one notification at a time. No prerequisites or exclusions are given, leaving the agent to infer the choice from sibling names.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
notifications_read_allAIdempotent
Mark all notifications as read for the authenticated user in a single operation. Resets the unread count to zero. This operation is idempotent.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare idempotentHint=true, destructiveHint=false, and readOnlyHint=false. The description adds useful behavioral context beyond those annotations: it resets the unread count to zero and clarifies that all notifications are affected in a single operation. It does not detail side effects or error conditions, but it complements the annotations well.
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 sentences with no wasted language. The primary action is front-loaded, followed by the user-visible effect and idempotency guarantee.
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 zero-parameter mutation tool, the description is complete enough: it identifies the action, scope, effect on unread count, and idempotency. No output schema exists, and the annotations already cover the safety profile, so no critical agent-facing detail is missing.
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?
There are zero parameters, so parameter semantics receive the baseline score of 4. The description correctly does not invent parameter details for a no-argument tool.
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 states a specific verb and resource: marking all notifications as read for the authenticated user in one operation. It clearly implies a bulk action but does not explicitly distinguish itself from the sibling notifications_mark_read, which likely handles individual notifications.
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 phrase 'Mark all' and 'in a single operation' implies when to use this bulk tool, but there is no explicit guidance contrasting it with notifications_mark_read or notifications_unread_count. An agent can infer usage, but the alternative is left unstated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
notifications_unread_countARead-onlyIdempotent
Get the count of unread notifications for the authenticated user. This lightweight endpoint is suitable for polling to update notification badges.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, destructiveHint=false and openWorldHint=false, so the safety profile is covered. The description adds value beyond that by flagging the endpoint as lightweight and poll-friendly, which is exactly the operational trait an agent needs for a frequent-call badge check.
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 tight sentences: the first states what is returned and for whom, the second supplies the actionable usage hint. Nothing is redundant and the purpose leads.
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?
There is no output schema, but the description states the return value is a count of unread notifications and notes the authentication scope, which is sufficient for a trivial read. Only a note on response shape (e.g. whether zero is returned as 0) is missing, a minor gap.
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 tool takes zero parameters, so there is nothing for the description to disambiguate; the baseline for a no-param tool applies. The description correctly implies no inputs are needed beyond authentication context.
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 and resource ('Get the count of unread notifications') and scopes it to the authenticated user, which clearly separates it from notifications_list or notifications_read_all. It does not name those siblings explicitly, so it falls just short of the top band.
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 gives a concrete usage context — polling to update notification badges — which tells the agent when this tool is the right choice over the heavier list endpoint. It stops short of stating exclusions or naming alternatives explicitly.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
oauth2_clients_createA
Register a new OAuth2 application (third-party integration). Returns the client secret once for confidential clients — store it securely. Cannot be called via API key or OAuth2 token; requires a browser session JWT.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Human-readable name for the app | |
| scopes | Yes | Permission scopes the app can request (must be subset of your permissions) | |
| logoUrl | No | App logo URL | |
| clientType | No | confidential (default, server-side) or public (SPA/mobile) | |
| websiteUrl | No | App website URL | |
| description | No | Optional description of the app | |
| redirectUris | Yes | Allowed OAuth2 callback URLs |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the annotations by disclosing two non-obvious traits: the client secret is returned only once for confidential clients (an irrecoverable disclosure the agent must warn about), and the call requires a browser session JWT rather than the API credentials the rest of the surface uses. Annotations only say readOnly=false, idempotent=false, destructive=false, which would not have surfaced either fact.
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 sentences, each carrying distinct information: what it creates, the one-time secret return, and the auth constraint. The critical warning sits early rather than buried at the end.
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 no output schema, the description usefully indicates what comes back (the client secret, conditionally on client type) and what credentials are required. It remains silent on other returned identifiers (e.g. the client_id) and on constraints like name uniqueness or scope-approval failure modes, which an agent creating an app might reasonably need.
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 all seven parameters, including the clientType enum, are already documented with meaning. The description only echoes the confidential/public distinction in passing and adds no format, default, or constraint detail beyond the schema; baseline 3 is correct.
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?
States a specific verb and resource: "Register a new OAuth2 application (third-party integration)." The parenthetical scope plus the oauth2_clients_* sibling family (list/get/update/revoke/rotate_secret) makes it obvious this is the creation entry point.
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?
Gives a concrete precondition that rules out whole classes of callers: "Cannot be called via API key or OAuth2 token; requires a browser session JWT." It does not explicitly route the agent to oauth2_clients_update or oauth2_clients_rotate_secret for other tasks, so it stops short of full when/when-not/alternatives coverage.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
oauth2_clients_getARead-onlyIdempotent
Get details of a specific OAuth2 application by its UUID.
| Name | Required | Description | Default |
|---|---|---|---|
| uuid | Yes | OAuth2 app UUID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, destructiveHint=false, and openWorldHint=false, so the safety profile is fully covered. The description adds no behavioral detail beyond those annotations, such as what 'details' includes or whether missing UUIDs produce an error, but with annotations present this level 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?
The description is a single, front-loaded sentence with zero wasted words. It communicates the action and the lookup key immediately.
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 lookup with one fully documented parameter and rich annotations, the description is sufficient to select and invoke the tool. Its only mild gap is that 'details' is vague about what fields are returned, and there is no output schema to fill that in.
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 single uuid parameter is fully documented in the schema. The description only restates that lookup is by UUID, adding no format, example, or validation semantics 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 states a specific verb and resource: 'Get details of a specific OAuth2 application.' The phrase 'by its UUID' narrows the scope enough to distinguish it from a list operation, though it does not explicitly name the sibling tool oauth2_clients_list.
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 should be used when the caller already has an OAuth2 app UUID, but it gives no explicit when-to-use guidance, prerequisites, or alternative tool recommendation such as using oauth2_clients_list when the UUID is unknown.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
oauth2_clients_listARead-onlyIdempotent
List all registered OAuth2 applications for the current organization. Returns app name, client ID, client type, scopes, status, and creation date.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and non-destructive, so the safety profile is covered. The description adds real value by enumerating the returned fields (name, client ID, type, scopes, status, creation date), which matters because no output schema exists; it stops short of stating permission requirements or whether results are truncated.
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, zero filler, with the operation and scope front-loaded and the return payload immediately after. Nothing repetitive of the title or annotations.
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 no output schema, the field enumeration carries the return-value burden well, and the read-only listing behavior is fully covered by annotations plus the description. Missing only access-control context (whether admin/owner rights are needed) and any note on result size.
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 tool takes zero parameters, so there is nothing for the description to disambiguate — baseline 4. It does note the implicit org scoping ('current organization'), which is the only semantic an agent could need here.
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?
States a specific verb and resource ('List all registered OAuth2 applications') plus a scope ('for the current organization'), so an agent immediately knows what it returns. It never names the sibling oauth2_clients_get it must not be confused with, but the 'list all' framing makes the boundary with a single-item get self-evident.
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?
There is no statement of when to use this over oauth2_clients_get, oauth2_clients_scopes, or api_keys_list, and no prerequisites such as required role or permission (listing OAuth2 clients is typically admin-only). The org scope is the only implicit usage cue.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
oauth2_clients_revokeADestructiveIdempotent
Revoke an OAuth2 application and all its associated access and refresh tokens. This action is irreversible. Cannot be called via API key or OAuth2 token.
| Name | Required | Description | Default |
|---|---|---|---|
| uuid | Yes | OAuth2 app UUID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true and idempotentHint=true. The description adds meaningful context: the revocation cascades to access and refresh tokens, the action is irreversible, and the calling credential restriction is specified.
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, front-loaded sentences with no wasted words. The irreversible nature and credential restriction are surfaced immediately.
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 single-parameter destructive operation, the definition covers scope, irreversibility, cascading token deletion, and credential restrictions. Output details are not needed because no output schema exists, though a note about the response shape or effects on the app record could add slight value.
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?
There is one required parameter (uuid) and schema description coverage is 100%, so the schema already documents it. The description does not add any additional detail about the parameter, which is acceptable under the baseline rule.
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?
States a specific verb ('Revoke') and resource ('OAuth2 application and all its associated access and refresh tokens'). It is clear what the tool does, though it does not explicitly contrast with sibling tools like oauth2_clients_update or oauth2_clients_rotate_secret.
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 an authentication restriction ('Cannot be called via API key or OAuth2 token') but does not say when to choose this over related operations such as rotate_secret or update. Usage is implied rather than explicitly guided.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
oauth2_clients_rotate_secretA
Rotate the client secret of a confidential OAuth2 application. Returns the new secret once — store it securely. The old secret is immediately invalidated. Cannot be called via API key or OAuth2 token.
| Name | Required | Description | Default |
|---|---|---|---|
| uuid | Yes | OAuth2 app UUID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare the mutation profile; the description adds genuinely non-inferable behavior: the new secret is returned exactly once and must be stored, and the old secret is invalidated immediately. The auth-method restriction is also stated, which no annotation conveys. Minor tension with destructiveHint=false is explainable (the app is not deleted, only its credential replaced), so it is not a 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?
Three short sentences, each carrying distinct load: what it does, what it returns, what happens to the old value, plus the auth constraint. The operation itself is front-loaded and there is 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?
With one required parameter, full schema coverage, no output schema and no nested objects, the description covers everything an agent needs: the effect on existing credentials, the one-time return of the new secret, and the calling-context restriction.
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?
There is a single parameter (uuid) with 100% schema description coverage, so the schema already carries the semantics. The description adds nothing about the identifier beyond what the schema states, which is the expected baseline for a fully-documented single-param tool.
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?
States a specific verb and resource (rotate the client secret) and scopes it to confidential OAuth2 applications. An agent can distinguish it from siblings like oauth2_clients_update (field edits) and oauth2_clients_revoke (credential revocation) without opening any schema.
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?
Gives a clear when-not condition ('Cannot be called via API key or OAuth2 token'), which is a real precondition an agent must check before calling. It stops short of naming alternatives (e.g. use oauth2_clients_update for non-secret changes, oauth2_clients_revoke to disable the app), so it falls one step short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
oauth2_clients_scopesARead-onlyIdempotent
List all available permission scopes that can be granted to OAuth2 applications, grouped by category. Only returns scopes the authenticated user holds.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, non-destructive, closed-world behavior, so the safety profile is covered. The description adds real value beyond them by disclosing that results are permission-filtered to scopes the authenticated user holds, which materially affects what the agent will receive.
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 with no filler. The output shape (grouped by category) and the filtering constraint are both front-loaded and each sentence earns its place.
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 no output schema, the description carries the burden of describing the response and does so at a high level (grouped by category, permission-filtered). It stops short of saying what a single scope entry looks like (identifier vs. label, whether descriptions are included), a minor remaining gap.
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 tool takes zero parameters, so there is nothing for the description to disambiguate; the baseline for a parameterless tool applies. The description correctly does not invent parameter discussion.
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?
States a specific verb and resource ('List all available permission scopes that can be granted to OAuth2 applications') and adds the grouping dimension. This is clearly separable from the OAuth2 client CRUD siblings, though it does not explicitly distinguish itself from the similarly-named api_keys_scopes sibling.
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 when-to-use or when-not-to-use statement. The purpose implies it is a reference lookup used before creating or updating an OAuth2 client, but the agent must infer that, and must infer when to use api_keys_scopes instead.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
oauth2_clients_updateAIdempotent
Update an existing OAuth2 application. Only provided fields are changed. Cannot be called via API key or OAuth2 token.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | New name | |
| uuid | Yes | OAuth2 app UUID | |
| scopes | No | New scopes | |
| logoUrl | No | New logo URL | |
| isActive | No | Enable/disable the app | |
| websiteUrl | No | New website URL | |
| description | No | New description | |
| redirectUris | No | New redirect URIs |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare the mutation profile: readOnlyHint=false, destructiveHint=false, and idempotentHint=true. The description adds useful behavioral context by saying only supplied fields change and that the endpoint cannot be called via API key or OAuth2 token.
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 sentences, front-loaded with the action and followed by the most important mutation and auth constraints. There is no wasted text.
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 an update tool with full schema coverage and annotations, the definition is largely complete. It omits response details and deeper permission specifics, but covers the key partial-update and authentication constraints.
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 meaningful parameter behavior by clarifying that omitted fields remain unchanged, which is more than the schema states per-field.
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 states a specific verb and resource: 'Update an existing OAuth2 application.' It clearly distinguishes update from sibling operations such as oauth2_clients_create, oauth2_clients_get, and oauth2_clients_revoke.
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 phrase 'Only provided fields are changed' implies partial-update usage, and the auth restriction gives some context. However, it does not explicitly say when to use this tool versus oauth2_clients_create or oauth2_clients_revoke, nor does it name alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
partners_verify_allA
Re-check every client and supplier of the company whose last registry check is missing or older than days days (default 30; 0 = everyone). Romanian partners go to ANAF in batches of 100, EU partners to VIES one by one; individuals and non-EU partners are skipped. Returns counts: checked, changed (snapshot differs from the previous one), failed (registry did not answer — retried by the daily job), skipped, and since. The same run happens automatically every day at 06:40 for partners older than 30 days.
| Name | Required | Description | Default |
|---|---|---|---|
| days | No | Re-check partners checked more than this many days ago (default 30, 0 = all) | |
| companyId | No | Company UUID (overrides STORNO_COMPANY_ID env var) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well past the annotations by disclosing routing logic (ANAF batches of 100, VIES one-by-one), skip rules (individuals and non-EU partners), failure handling (registry failures are retried by the daily job), and that snapshots are compared and may change — consistent with readOnlyHint=false and openWorldHint=true. It also documents the returned counts, including `since`, which the annotations cannot supply.
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?
Four front-loaded sentences: scope, routing behavior, return shape, then automation context. Each sentence carries distinct operational information with no filler or repetition of the schema.
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 batched, externally-calling tool with no output schema, the description supplies everything needed: which parties are covered or skipped, how the call is distributed, what happens on failure, and the shape of the result counts. Nothing an agent needs before invoking it is missing.
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 schema already documents both `days` and `companyId` fully. The description's `days` parenthetical only restates the schema default and zero-semantics, and it says nothing at all about `companyId`, so it adds no meaning beyond structured data.
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?
States a specific verb and resource (re-check every client and supplier) plus the exact selection scope (last registry check missing or older than `days`). The word 'every' and the batch description make it clearly distinct from the single-partner sibling `partner_verify`, so an agent can pick correctly without opening a schema.
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?
Gives concrete trigger conditions: missing or stale checks, `days` default 30, and 0 meaning everyone. It also discloses that the same run happens automatically at 06:40 daily, which tells the agent when calling manually is redundant, but it never names the single-partner alternative or an explicit 'do not use for X' exclusion.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
partner_verifyA
Check one client or supplier at ANAF (Romanian company with CUI) or VIES (EU partner with a VAT number) and store the snapshot on it: vatRegistered, vatOnCollection (+ vatOnCollectionFrom/To), inactive, efacturaRegistered, viesValid, verificationNotes, vatStatusCheckedAt. Returns the updated partner and result: checked (bool), source (anaf | vies), changes (became_inactive, reactivated, lost_vat_registration, vat_registered, vat_on_collection, vat_on_collection_ended, vies_invalid, vies_valid) and error (not_applicable for individuals / non-EU partners, registry_unavailable when the registry did not answer — the previous snapshot is kept, not_found when ANAF does not know the CUI). A degrading change also sends the partner.status_changed notification to the company members. Requires the client-edit permission; throttled per user like the registry lookups.
| Name | Required | Description | Default |
|---|---|---|---|
| type | Yes | Partner kind | |
| uuid | Yes | Client or supplier UUID | |
| companyId | No | Company UUID (overrides STORNO_COMPANY_ID env var) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Despite annotations covering the safety profile (readOnlyHint=false, destructiveHint=false, openWorldHint=true), the description adds substantial behavioral context: it lists exactly which snapshot fields are stored, enumerates change types returned in `result.changes`, explains error semantics (not_applicable, registry_unavailable with snapshot preservation, not_found), discloses the side-effect notification on degrading changes, and states the required permission and throttling. This goes well beyond what annotations provide.
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 a single dense paragraph, front-loaded with purpose and then details. Every sentence earns its place, but the parenthetical lists and error explanations could be structured as bullets for faster scanning. It is information-rich without being redundant.
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 no output schema, the description fully explains the return shape: updated partner fields, `result` with checked/source/changes/error, and notification side effect. It also covers permissions and throttling. An agent has everything needed to invoke and interpret the tool 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 description coverage is 100%, so the schema already fully documents the three parameters (type enum, uuid, companyId override). The description does not add syntax or format details beyond what the schema provides, but it does implicitly clarify that `type` selects the registry path. Baseline 3 is appropriate when schema does the heavy lifting.
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?
States a clear verb ('Check') and specific resource ('one client or supplier'), names both registries (ANAF for CUI, VIES for EU VAT), and notes the snapshot storage side effect. This distinguishes it from siblings like clients_anaf_lookup and clients_vies_lookup, which are single-registry lookups, and from partners_verify_all.
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 makes clear this is for a single partner and explains when each registry applies based on partner type (CUI vs VAT number). It also documents error conditions for individuals/non-EU partners. However, it does not explicitly name or compare against the sibling partners_verify_all for bulk operations, leaving that routing inference to the agent.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
payments_createA
Record a payment received for an invoice. Updates the invoice amountPaid and balance, and automatically changes invoice status to "partially_paid" or "paid" as appropriate. Supports partial payments with full details (method, reference, notes).
| Name | Required | Description | Default |
|---|---|---|---|
| notes | No | Additional notes about this payment | |
| amount | Yes | Payment amount (must be greater than 0) | |
| currency | No | Currency code (ISO 4217). Defaults to invoice currency. Include if payment is in a different currency. | |
| companyId | No | Company UUID override (uses active company if not set) | |
| invoiceId | Yes | Invoice UUID to record payment for | |
| reference | No | Payment reference number (e.g., bank transfer reference, receipt number) | |
| paymentDate | Yes | Date payment was received in ISO 8601 format (YYYY-MM-DD) | |
| paymentMethod | No | Payment method: bank_transfer (default), cash, card, cheque, or other |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the annotations (readOnly=false, destructive=false, idempotent=false) by disclosing the side effects on the invoice: amountPaid, balance, and automatic status transition to partially_paid or paid. It does not warn that retries create duplicate payments despite idempotentHint=false, nor mention permission or validation constraints 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?
Three short sentences, front-loaded with the purpose and immediate side effects. The final sentence largely repeats schema field documentation and could be trimmed without losing meaning.
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 an 8-parameter create tool with full schema coverage and annotations present, the description covers the essential behavior and downstream invoice mutation. Gaps are minor: no statement about duplicate prevention on retry, error conditions, or what the created payment record returns (there is no output schema to defer to).
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 schema already documents every parameter including amount, currency, companyId override, and the paymentMethod enum. The description only restates that method, reference, and notes exist and that partial amounts are allowed, adding little beyond the schema 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?
States a concrete verb and resource ('Record a payment received for an invoice') plus the resulting state changes on the invoice, so the action is unambiguous. It does not distinguish itself from adjacent siblings such as payments_receipt_issue or invoices_bulk_mark_paid, so an agent cannot tell whether a receipt is also generated.
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?
Usage is only implied: the mention of partial payments and detail fields hints at when this is appropriate, but there is no explicit when-to-use guidance, no prerequisite (e.g., invoice must be issued/unpaid), and no pointer to the sibling for receipt issuance or bulk marking paid.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
payments_deleteADestructiveIdempotent
Permanently delete a recorded payment from an invoice. Updates the invoice amountPaid and balance, and may change the invoice status back to "unpaid" or "partially_paid". This action is irreversible — use with caution for corrections.
| Name | Required | Description | Default |
|---|---|---|---|
| companyId | No | Company UUID override (uses active company if not set) | |
| invoiceId | Yes | Invoice UUID | |
| paymentId | Yes | Payment UUID to delete (from payments_list) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the annotations by naming the cascade effects: the invoice's amountPaid and balance are recalculated and status may revert to 'unpaid' or 'partially_paid'. It also restates irreversibility in plain language, so the agent understands a correction mutates the parent invoice, not just the payment row.
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 sentences, front-loaded with the action, followed by side effects and then the risk warning. No filler and nothing repeated.
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 destructive, idempotent mutation with no output schema, the description covers the essential consequence set: permanent removal plus invoice recalculation and status rollback. Minor residual gaps are what the call returns and any permission/ownership requirements, but nothing that would cause an incorrect invocation.
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 all three properties carry their own descriptions (including the helpful cross-reference that paymentId comes from payments_list). The description adds no further parameter meaning, so the baseline 3 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?
States a specific verb and resource ('Permanently delete a recorded payment from an invoice'), which cleanly separates it from payments_create, payments_list, and payments_receipt_issue. The scope qualifier 'recorded ... from an invoice' makes clear it operates on an existing payment tied to an 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?
'use with caution for corrections' hints at the intended scenario (fixing mistaken payments rather than routine flow), which is useful implied guidance. However, it names no alternative — e.g. whether to reverse via storno or a receipt refund path instead — and gives no preconditions or exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
payments_listARead-onlyIdempotent
List all payments recorded for a specific invoice, ordered by payment date (most recent first). Returns payment amount, date, method, reference number, and notes. The sum of payments determines the invoice amountPaid and balance.
| Name | Required | Description | Default |
|---|---|---|---|
| companyId | No | Company UUID override (uses active company if not set) | |
| invoiceId | Yes | Invoice UUID to list payments for |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, and non-destructive behavior. The description adds meaningful context beyond that: result ordering (most recent first), returned fields, and the downstream effect that the sum of payments determines invoice amountPaid and balance. Pagination or size limits are not disclosed.
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 efficient sentences with the core scope front-loaded, followed by ordering and return/derived information. No filler 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?
For a two-parameter read-only list with no output schema, the description supplies the missing return-field and ordering details plus the invoice balance relationship. Annotations cover safety, and schema covers parameters, so the agent has what it needs to invoke 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 description coverage is 100%, so both invoiceId and companyId are already documented. The description reinforces that invoiceId scopes the listing, but adds no further semantics for the companyId override. Baseline 3 applies when the schema carries parameter meaning.
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 states a specific verb and resource: listing payments for a specific invoice. Scope is precise and clearly distinct from payments_create/delete, though it does not explicitly name or contrast with any sibling 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?
Usage is implied by the invoice-scoped listing, but there is no explicit guidance on when to prefer this over related tools such as receipts_list or invoice payment views. 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.
payments_receipt_issueAIdempotent
Issue the chitanță (cash receipt) for a cash payment already recorded on an issued invoice: a number from the receipt series (the company default, or seriesId) and a date (default: the payment date). The receipt documents the existing payment and never records a second one — the invoice balance and the cash register keep the same single payment. Idempotent: a payment that already has a receipt keeps it. 422 for non-cash payments, received invoices, or when no receipt series exists.
| Name | Required | Description | Default |
|---|---|---|---|
| date | No | Receipt date YYYY-MM-DD (default: the payment date) | |
| seriesId | No | Receipt series UUID (type receipt); default: the company default receipt series | |
| companyId | No | Company UUID override (uses active company if not set) | |
| invoiceId | Yes | Invoice UUID | |
| paymentId | Yes | Payment UUID (from payments_list; paymentMethod must be cash) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Well beyond the annotations: it states the side-effect boundary explicitly — the invoice balance and cash register keep the same single payment — which is the single most important thing to know before calling a mutation on payment data. It also restates idempotency in concrete terms (a payment that already has a receipt keeps it) and enumerates three 422 conditions, none of which appear in 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?
Four sentences, front-loaded with the action and resource, then the behavioral guarantee, then the failure modes. The em-dash aside explains rather than repeats, and no sentence could be dropped without losing information an agent needs.
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 mutation with five params and no output schema, it covers side effects, defaults, idempotency and error conditions thoroughly. It leaves the response shape (e.g. whether the created receipt/number is returned) and any permission or series-exhaustion behavior unstated, which is a minor gap given no output schema exists to answer it.
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 already documents every parameter, including the same defaults the description mentions (payment date, company default receipt series) — so the description largely restates structured data. It adds no new semantics for invoiceId/paymentId beyond what the schema says. Baseline 3 applies when the schema carries the load.
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?
Names a specific verb (issue), a specific resource (chitanță / cash receipt), and pins the exact scope: a cash payment already recorded on an issued invoice. The clarification that it 'never records a second one' cleanly separates it from payments_create and from the standalone receipts_create/receipts_issue family without needing to open any schema.
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?
Gives a clear positive precondition (cash payment already recorded on an issued invoice) and hard exclusions via the 422 conditions (non-cash payments, received invoices, no receipt series) — an agent knows exactly when this call will fail. It stops short of naming a sibling alternative for those failure cases (e.g. where to go for a non-cash payment), so not a full 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
payments_receipt_pdfARead-onlyIdempotent
Download the PDF of the chitanță issued for a cash payment (see payments_receipt_issue). A5 landscape: company, payer, amount in figures and in words, the invoice it settles, the payment date.
| Name | Required | Description | Default |
|---|---|---|---|
| companyId | No | Company UUID override (uses active company if not set) | |
| invoiceId | Yes | Invoice UUID | |
| paymentId | Yes | Payment UUID with a receipt issued |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, destructiveHint=false and openWorldHint=false, so the safety profile is covered elsewhere. The description contributes what the document actually contains (company, payer, amount in figures and words, settled invoice, payment date) and its A5 landscape format, which is genuinely useful, but says nothing about delivery form (binary stream vs. link), permissions, or the error case of a payment without an issued receipt.
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 compact sentences, front-loaded with the action and resource, with the document contents following as supporting detail. No filler or restated title; the only mild inefficiency is that the content list is optional context rather than operational guidance.
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?
There is no output schema, so the description usefully compensates by describing the generated document's layout and data fields, which is the main thing an agent would otherwise lack. The remaining gap is that it doesn't state the returned representation (PDF bytes/base64/file URL), which matters when no output schema exists.
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 all three parameters are already documented in the schema. The description reinforces that this applies only to cash payments (relevant to paymentId) and identifies invoiceId as the settled invoice, but adds no syntax, format, or defaulting guidance beyond the schema — baseline 3 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?
States a concrete verb+resource ("Download the PDF of the chitanță issued for a cash payment") and scopes it to cash receipts, cross-referencing the issuing tool payments_receipt_issue. It stops short of distinguishing itself from the separate receipts_pdf / receipts_* family in the sibling list, which an agent could confuse with this one.
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 parenthetical "(see payments_receipt_issue)" implies the receipt must be issued before the PDF can be downloaded, and "for a cash payment" narrows the applicable case. However there is no explicit when-to-use statement, no rejection of alternatives (e.g. receipts_pdf, invoices_pdf), and no stated behavior when no receipt has been issued.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
pdf_template_config_getBRead-onlyIdempotent
Get the PDF template configuration for the current company. Returns the active template slug, primary color, font, logo/bank info visibility, footer text, and custom CSS. Creates a default config if none exists.
| Name | Required | Description | Default |
|---|---|---|---|
| companyId | No | Company UUID (overrides configured default) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare readOnlyHint=true and destructiveHint=false, but the description says 'Creates a default config if none exists' — a state-changing side effect. This directly contradicts the read-only annotation. The return-field disclosure is useful, but the contradiction is serious enough to warrant a 1 and an annotation_contradiction flag.
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 front-loaded with the primary action, then lists return fields, and ends with the default-creation caveat. It is appropriately sized with 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?
For a tool with a single optional parameter, full schema coverage, and annotations, the description covers purpose and return values. But the side-effect disclosure ('creates a default config') conflicts with the annotation and leaves the agent with an inaccurate behavioral model, and the companyId override is not mentioned in the description.
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 single parameter is fully documented in the schema as an optional company UUID that overrides the configured default. The description mentions only 'the current company' and does not add meaning about the override behavior, so it stays at the baseline 3.
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 opens with a specific verb and resource: 'Get the PDF template configuration for the current company.' It also lists the fields returned, making the tool's output recognizable. However, it does not explicitly distinguish this read tool from sibling tools like pdf_template_config_templates or pdf_template_config_preview.
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 by stating it retrieves the current company's configuration and creates a default if none exists. But it gives no explicit guidance on when to use this tool versus pdf_template_config_templates, pdf_template_config_preview, or pdf_template_config_update.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
pdf_template_config_previewARead-onlyIdempotent
Generate an HTML preview of a PDF template with sample invoice data. Use this to preview how a template will look before saving configuration changes.
| Name | Required | Description | Default |
|---|---|---|---|
| companyId | No | Company UUID (overrides configured default) | |
| fontFamily | No | Font family to preview (e.g., "Roboto") | |
| primaryColor | No | Primary color to preview in hex format (e.g., "#6366f1") | |
| templateSlug | No | Template design to preview (default: classic) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, non-destructive, closed-world behavior, so the safety profile is covered. The description adds two genuinely useful facts beyond that: the output is HTML, and the data rendered is sample invoice data rather than real records — meaning nothing is persisted and the preview is not representative of live content.
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, zero waste, with the core action front-loaded and the usage cue immediately after. Nothing to trim.
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 no output schema, the description usefully discloses that the return value is HTML and that it is rendered against sample data. A four-parameter read-only tool is adequately covered; only the absence of any note on the preview's fidelity or size limits keeps it from a 5.
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%, including an enum for templateSlug, so the schema carries all parameter meaning. The description only gestures at the visual fields ("how a template will look") without adding format or default details beyond the schema. Baseline 3 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?
States a specific verb and resource: generate an HTML preview of a PDF template, populated with sample invoice data. It is clearly distinct from pdf_template_config_get/update/templates by being a non-persisting render, though it never names those siblings explicitly.
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?
"Use this to preview how a template will look before saving configuration changes" gives a clear trigger condition that implicitly routes the agent here before calling pdf_template_config_update. No explicit exclusions or sibling names, so it stops short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
pdf_template_config_templatesARead-onlyIdempotent
List all available PDF template designs with their slugs, names, descriptions, and default colors. Use the slug value when updating the template configuration.
| Name | Required | Description | Default |
|---|---|---|---|
| companyId | No | Company UUID (overrides configured default) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true and destructiveHint=false, so the safety profile is covered. The description adds value by disclosing the shape of the result (slugs, names, descriptions, default colors) and clarifying that slugs are the key consumed by the update tool. It does not say whether templates are global or per-company.
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 tight sentences with zero waste: the first front-loads what is listed and what fields come back, the second gives the actionable follow-up. No filler or restatement of the tool name.
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 no output schema, the description usefully enumerates the return fields and explains how the slug feeds the update tool, which is enough to call it correctly. The remaining gap is the scope of the listing (global vs company-scoped) and whether companyId changes the result set.
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 there is only one optional parameter (companyId, with a documented override meaning), so the schema carries the semantics. The description never mentions the companyId override, adding nothing beyond the schema, which is the expected baseline here.
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?
States a specific verb and resource (list PDF template designs) and enumerates the returned fields (slugs, names, descriptions, default colors). It hints at its relationship to pdf_template_config_update by telling the agent to use the slug there, but never distinguishes itself from pdf_template_config_get or pdf_template_config_preview.
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 second sentence gives a downstream usage hint ('use the slug value when updating the template configuration'), which implies this is a discovery step before configuration. However, it never states when to call this instead of pdf_template_config_get or pdf_template_config_preview, and gives no preconditions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
pdf_template_config_updateBIdempotent
Update the PDF template configuration for the current company. Customize the template design, colors, fonts, logo visibility, bank info display, footer text, and custom CSS applied to all generated PDFs.
| Name | Required | Description | Default |
|---|---|---|---|
| showLogo | No | Show company logo on PDFs (default: true) | |
| companyId | No | Company UUID (overrides configured default) | |
| customCss | No | Custom CSS styles injected into the PDF template | |
| fontFamily | No | CSS font family for the PDF (e.g., "DejaVu Sans", "Roboto") | |
| footerText | No | Custom footer text displayed at the bottom of PDFs | |
| primaryColor | No | Primary brand color in hex format (e.g., "#2563eb") | |
| showBankInfo | No | Show bank account information on PDFs (default: true) | |
| showVatInRon | No | Show the VAT amount converted to RON on foreign-currency invoices (default: true). Legally required (Cod Fiscal art. 319 (20) j) for RON VAT payers issuing in foreign currency. | |
| templateSlug | No | Template design to use: classic, modern, minimal, or bold |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare non-readOnly, idempotent, non-destructive, closed-world, so the safety profile is covered. The description adds real context that the configuration is 'applied to all generated PDFs', which is useful blast-radius information, but it never states whether partial updates merge with existing values or replace them — a material question given zero required parameters.
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, the mutation target stated first and the customizable fields enumerated second; no wasted preamble. The field enumeration partially restates schema property names, which costs a little density.
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 no output schema required, full schema coverage on all 9 parameters, and annotations carrying the safety profile, the definition covers what an agent needs to call it correctly. The only meaningful omission is update/merge semantics for optional fields, which slightly limits confidence.
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 parameter meaning is already documented, including the enum for templateSlug and the legal note on showVatInRon. The description's field list (design, colors, fonts, logo, bank info, footer, CSS) mirrors the schema rather than adding merge/validation semantics, so the baseline 3 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?
Specific verb-resource pair ('Update the PDF template configuration') with a stated scope ('for the current company') and an enumeration of the configurable surface. It does not explicitly contrast itself with the pdf_template_config_get/preview/templates siblings, though the write verb makes the distinction reasonably evident.
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?
There is no guidance on when to use this versus pdf_template_config_get (inspect), pdf_template_config_preview (preview), or pdf_template_config_templates (list designs), nor any prerequisite or exclusion. A reader must infer usage from the tool name alone.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
product_categories_createB
Create a new POS product category. Categories are scoped to a single company.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Display name, 1–100 characters | |
| color | No | Optional hex colour ("#RRGGBB" or "RRGGBB"); invalid values are silently dropped | |
| companyId | No | Company UUID override (uses active company if not set) | |
| sortOrder | No | Sort order in the chip strip (smaller = earlier; default 0) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare the write operation is not read-only, not idempotent, and not destructive, so the agent knows the safety profile. The description adds useful scoping context ('Categories are scoped to a single company'), but it does not cover other behavioral aspects like permission requirements or duplicate-name handling. There is no contradiction with 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 with zero waste: the first states the action, the second adds essential scope information. It is front-loaded and easy to parse.
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 (a create operation with 4 fully documented parameters and no output schema), the description provides sufficient context for an agent to understand the tool's purpose and scope. It could be slightly more complete by indicating when to choose create over update, but overall it meets the need.
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, so all four parameters (name, color, companyId, sortOrder) are already well-documented. The description does not add any parameter-specific semantics beyond what the schema provides. Baseline 3 is appropriate when the schema fully covers 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 states a specific verb ('Create') and resource ('POS product category'), making the tool's action immediately clear. It adds scope ('scoped to a single company'), which aids understanding, but it does not explicitly distinguish this tool from siblings like product_categories_update or product_categories_list, so it falls short of a 5.
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 offers no explicit when-to-use guidance, no prerequisites, and no mention of alternatives (e.g., when to use this versus updating an existing category). The only usage hint is the verb 'Create', which is implied but not elaborated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
product_categories_deleteADestructiveIdempotent
Delete a product category. Products that were in the category lose the assignment (categoryId is set to null) but are not deleted.
| Name | Required | Description | Default |
|---|---|---|---|
| uuid | Yes | Category UUID to delete | |
| companyId | No | Company UUID override (uses active company if not set) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already flag destructiveHint=true and idempotentHint=true, so the safety profile is covered. The description goes beyond them by disclosing the cascade behavior: products keep existing and only lose their categoryId. It stops short of stating reversibility or permission requirements, so 4 is appropriate.
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, zero filler, with the destructive consequence front-loaded right after 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 two-parameter delete with no output schema, the description covers the action and the data consequence, which is what an agent most needs. It could add a note on error cases (nonexistent UUID) or required permissions, keeping it from a 5.
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 both uuid and companyId are already documented in the schema. The description adds nothing about the companyId active-company override, so the baseline 3 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?
The description opens with a precise verb+resource ('Delete a product category') and immediately states the side effect, so an agent can distinguish it from product_categories_update or products_update without opening the schema.
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 effect on products is described, which implies a use case, but there is no explicit when-to-use versus alternatives guidance (e.g., reassign products via product_categories_update instead, or whether empty categories should be removed). Usage is only implied.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
product_categories_listARead-onlyIdempotent
List all product categories for the active company, ordered by sortOrder then name. Categories appear as a chip strip above the POS product grid and double as fallback colour swatches for products that don't have their own colour.
| Name | Required | Description | Default |
|---|---|---|---|
| companyId | No | Company UUID override (uses active company if not set) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint and openWorldHint=false, so the safety profile is covered. The description adds genuine behavioral detail beyond that: results are ordered by sortOrder then name, and scoping defaults to the active company. It does not mention authentication or whether the list is ever truncated, but the core behavior is well disclosed.
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 verb, scope and ordering. The second sentence is domain color that helps tool selection rather than pure padding, though it is the least essential part of the definition.
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 zero-required-parameter read-only list with rich annotations, the description covers purpose, scope and ordering. It does not describe the fields returned (id, name, colour, sortOrder), which is a minor gap given there is no output 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?
Schema description coverage is 100% and the single optional companyId is already documented as a UUID override using the active company. The description echoes the default-company behavior but adds no format or edge-case detail beyond the schema, so the baseline 3 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?
States a specific verb and resource ("List all product categories") plus scope ("for the active company") and ordering, so it is immediately distinguishable from the sibling product_categories_create/update/delete tools. The second sentence anchors the resource in its domain (POS chip strip, fallback colour swatches), reinforcing what is being listed.
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?
Usage is implied through the POS/colour-swatch context, which suggests when an agent would want categories. However, there is no explicit when-to-use statement, no mention of alternatives such as products_list, and no note about when a companyId override should be supplied.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
product_categories_updateAIdempotent
Update a product category. All fields optional; omitted fields stay unchanged. Pass color=null to clear the swatch.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | Display name, 1–100 characters | |
| uuid | Yes | Category UUID to update | |
| color | No | Hex colour swatch; null to clear | |
| companyId | No | Company UUID override (uses active company if not set) | |
| sortOrder | No | Sort order in the chip strip |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare idempotentHint=true and destructiveHint=false, so the safety profile is covered. The description adds genuinely useful merge semantics (omitted fields untouched) and the null-vs-omit distinction for clearing the swatch — behavior an agent would otherwise have to guess. It doesn't mention permission or company-scoping implications.
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, front-loaded with the action, then the merge rule and the one non-obvious edge case (null clears). Nothing is redundant or padded.
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 5-parameter idempotent update with full schema coverage and no output schema, this covers the essentials: what it does, partial-update behavior, and the null sentinel. Only the response shape and the companyId override's effect on scope are left unaddressed.
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 each parameter is already documented, including 'null to clear' for color. The description restates the partial-update rule and the null-clearing convention, which reinforces but does not extend the schema, so the baseline 3 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?
Specific verb plus resource ("Update a product category") makes the operation unmistakable, and the sibling set makes the create/delete/list counterparts obvious. It stops short of naming a sibling to disambiguate, but no ambiguity exists here.
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?
Usage is implied: it's the mutation path for an existing category, and "omitted fields stay unchanged" tells the agent this is a partial patch. There is no explicit when-to-use vs. product_categories_create or guidance on prerequisites such as needing the uuid first.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
products_getARead-onlyIdempotent
Get detailed information about a specific product by UUID, including usage statistics (total usage count, total revenue generated, average quantity, first and last usage dates).
| Name | Required | Description | Default |
|---|---|---|---|
| uuid | Yes | Product UUID | |
| companyId | No | Company UUID override (uses active company if not set) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, destructiveHint=false and openWorldHint=false, so the safety profile is covered. The description earns credit by disclosing what the payload contains (total usage count, total revenue, average quantity, first/last usage dates) – critical since there is no output schema. It does not state behavior when the UUID is unknown or the product belongs to another company.
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?
One sentence, front-loaded with the verb and identifier, then the value-add detail. No filler and nothing that could be cut.
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 no output schema, enumerating the returned fields is exactly the right compensation and makes the tool callable in one shot. Remaining gap is the absence of company scoping context (companyId override) and not-found behavior, but for a straightforward read-by-id tool this is close to 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 100%, so both uuid and companyId are already documented. The description adds only that lookup is 'by UUID' and says nothing about the companyId override ('uses active company if not set'), so it does not extend the schema. Baseline 3 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?
States a specific verb ('Get'), resource ('product'), identifier ('by UUID'), and enumerates the returned statistics. This clearly distinguishes it from the sibling products_list, which returns collections rather than one product's detail with usage aggregates.
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?
Usage is only implied: 'a specific product by UUID' suggests it follows a list call or that the agent already has a UUID. There is no explicit when-to-use, no mention of products_list as the discovery path, and no note on when the extra usage statistics matter versus a plain lookup.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
products_listARead-onlyIdempotent
List products for the active company. Products are sync-only and are automatically extracted from invoice line items during ANAF synchronization — they cannot be manually created or edited. Results can be filtered by active status and searched by name, code, or description.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | Page number (default: 1) | |
| limit | No | Items per page, max 200 (default: 50) | |
| search | No | Search term to filter by product name, code, or description | |
| isActive | No | Filter by active status (true = active only, false = inactive only) | |
| companyId | No | Company UUID override (uses active company if not set) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover read-only, idempotent, closed-world and non-destructive. The description adds real value beyond them: the data is sync-only, originates from ANAF synchronization of invoice line items, and cannot be manually created or edited — which prevents an agent from attempting a write workflow. It says nothing about pagination defaults or ordering, which is a minor remaining gap.
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 the verb and scope, then the sync-only constraint, then the filtering options. Nothing is repeated and nothing is wasted.
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 five-parameter, zero-required list tool with full schema coverage and annotations carrying the safety profile, the description covers purpose, origin of data, and filtering. Only the shape of returned product records and default ordering are unaddressed, and no output schema exists to cover 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%, so all five parameters are already documented, including the exact search fields and the isActive semantics. The description restates the same filtering capability without adding syntax, defaults, or edge cases, so baseline 3 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?
States a specific verb and resource ('List products for the active company') and immediately scopes it: products are sync-derived from invoice line items. That single constraint distinguishes it from products_get/products_update and tells an agent there is no create path for this resource.
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?
Gives clear context for when to call it (browse the company's product catalog, optionally narrowed by active status or a name/code/description search) and implicitly rules out creation/editing. It does not explicitly point to products_get for a single record, so the routing to siblings is only partial.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
products_updateAIdempotent
Update an existing product by UUID. All fields are optional — only provided fields are changed. Useful for assigning product codes (so sales can be grouped per plan/SKU), fixing names, or adjusting default prices on sync-created products. Pass code=null to clear a code.
| Name | Required | Description | Default |
|---|---|---|---|
| code | No | Product code / SKU. Pass null to clear the existing code. | |
| name | No | Product name | |
| uuid | Yes | Product UUID to update | |
| color | No | Optional hex colour swatch shown on the POS product grid (e.g. "#1e40af"). Six-digit hex with or without leading "#"; pass null to clear. | |
| ncCode | No | NC (Nomenclatura Combinata) code | |
| cpvCode | No | CPV code for public procurement | |
| vatRate | No | VAT rate percentage (e.g. 19 for 19%) | |
| currency | No | ISO 4217 currency code | |
| isActive | No | Whether the product is active | |
| companyId | No | Company UUID override (uses active company if not set) | |
| sgrAmount | No | Romanian SGR (Sistem Garantie-Returnare) deposit per unit, e.g. 0.50 for plastic beverage bottles. Null clears it. The POS auto-injects a single VAT-exempt deposit line summing all SGR product quantities. | |
| categoryId | No | UUID of a product_category for POS grid grouping; pass null to clear. | |
| description | No | Product description | |
| defaultPrice | No | Default unit price | |
| unitOfMeasure | No | Unit of measure code (e.g. "buc", "ore", "kg") | |
| vatCategoryCode | No | VAT category code (e.g. "S", "Z", "E") |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (not read-only, idempotent, non-destructive). The description adds genuinely useful behavior: partial-update semantics ('all fields are optional — only provided fields are changed') and the null-clearing convention, which is not obvious from the annotations alone. It remains silent on validation failures or permission 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?
Three sentences, identity and partial-update contract front-loaded, then use cases, then the null edge case. The parenthetical about grouping sales per plan/SKU justifies its length.
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 16-parameter mutation tool with full schema coverage, no output schema, and annotations carrying safety, the description supplies exactly the missing pieces: partial update, null-clearing, and realistic usage contexts. Nothing an agent needs to call it correctly is absent.
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 every parameter including null-clearing is already documented in the schema. The description reinforces the partial-update and code=null behavior but adds no parameter detail the schema lacks, 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?
States a specific verb and resource ('Update an existing product by UUID'), which is unambiguous against products_list/products_get and the category tools. It never names a sibling explicitly, but the resource is narrow enough that confusion is unlikely.
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?
Gives concrete use cases (assigning SKUs so sales group per plan, fixing names, adjusting prices on sync-created products), which tells an agent when this is the right call. It does not say when to reach for products_get or product_categories_update instead, so there is no explicit exclusion guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
proforma_invoices_acceptAIdempotent
Mark a proforma invoice as accepted by the client. Transitions status to accepted. Once accepted, the proforma is ready to be converted to a final invoice.
| Name | Required | Description | Default |
|---|---|---|---|
| uuid | Yes | UUID of the proforma invoice to mark as accepted | |
| companyId | No | Company UUID (overrides configured default) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare the safety profile (readOnlyHint=false, destructiveHint=false, idempotentHint=true), so the description only needs to add context. It contributes the state-machine effect and downstream consequence, but is silent on what happens if the invoice is already accepted/rejected/cancelled, whether the transition is reversible, or what permissions are required.
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 sentences, front-loaded with the action and immediately followed by its effect and consequence. Minor redundancy between 'mark as accepted' and 'transitions status to accepted', but it clarifies rather than wastes.
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 two-parameter status-transition tool with full annotation coverage and no output schema, this is close to complete: the action, resulting state, and next step are all stated. Only edge-case behavior (already accepted, invalid source state) is missing.
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 only two params, so the schema already documents uuid and the companyId override. The description adds nothing about either parameter, which is acceptable at this coverage level but not additive.
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?
States a specific verb and resource ('Mark a proforma invoice as accepted') plus the resulting state change. It implicitly distinguishes the action from siblings like proforma_invoices_reject or proforma_invoices_cancel, though it never names them explicitly.
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 workflow position is implied: this is the step after the client accepts, and 'ready to be converted to a final invoice' points toward the convert sibling. There is no explicit when-not guidance (e.g., does the invoice need to be in 'sent' status first?) and no named alternative.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
proforma_invoices_bulk_deleteADestructiveIdempotent
Delete multiple proforma invoices in batch. Only draft proformas can be deleted. Returns count of deleted and any errors.
| Name | Required | Description | Default |
|---|---|---|---|
| ids | Yes | Array of proforma invoice UUIDs to delete (1-100) | |
| companyId | No | Company UUID (overrides configured default) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true and idempotentHint=true, so the safety profile is covered. The description adds real value beyond that: the draft-only precondition and the return shape ('count of deleted and any errors'), which lets the agent anticipate partial failures in a batch.
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 sentences, zero filler: purpose first, eligibility constraint second, return behavior third. Every sentence carries information an agent needs.
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 no output schema, the description does the minimum needed by stating the return payload (deleted count plus errors). Combined with the draft-only restriction and full schema coverage on both parameters, an agent has what it needs to call this correctly; it could only be improved with explicit routing to the single-delete or cancel alternatives.
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%: both ids (1-100 UUIDs) and companyId (overrides configured default) are fully documented in the schema. The description adds nothing parameter-specific, and the batch limit of 100 is only visible in the schema, so baseline 3 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?
States a specific verb (delete), resource (proforma invoices), and scope (multiple, in batch), which distinguishes it from the singular sibling proforma_invoices_delete. It does not explicitly name that sibling, but 'bulk/batch' makes the distinction clear enough to select correctly.
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?
Adds one important eligibility rule — only draft proformas can be deleted — which tells the agent when this tool is applicable. It gives no guidance on what to do with non-draft proformas (e.g., proforma_invoices_cancel) or on using the single-delete tool for one item, so alternatives are left implicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
proforma_invoices_cancelADestructiveIdempotent
Cancel a proforma invoice. Can be cancelled from any status except converted or already cancelled. Preserves historical record unlike deletion.
| Name | Required | Description | Default |
|---|---|---|---|
| uuid | Yes | UUID of the proforma invoice to cancel | |
| companyId | No | Company UUID (overrides configured default) | |
| cancellationNotes | No | Internal notes about the cancellation | |
| cancellationReason | No | Reason for cancellation |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true, idempotentHint=true, and readOnlyHint=false. The description adds meaningful state-gating rules and the key behavioral distinction that the record is retained rather than deleted.
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 sentences, front-loaded with the action and followed by the eligibility constraint and the contrast with deletion. 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?
For a four-parameter mutation with full schema coverage, annotations covering safety and idempotency, and no output schema, the description provides the essential behavioral context. It could say more about the resulting status or downstream effects, but nothing critical is missing.
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 adds no details about the uuid, companyId, cancellationNotes, or cancellationReason parameters beyond what the schema already documents.
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?
States a specific verb and resource ("Cancel a proforma invoice") and immediately distinguishes the operation from deletion by noting it preserves the historical record. An agent can distinguish this from proforma_invoices_delete without opening the schema.
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 defines when cancellation is allowed (any status except converted or already cancelled) and contrasts it with deletion. It does not route the agent between cancel, reject, or bulk-cancel siblings, but the key precondition and alternative are clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
proforma_invoices_convertA
Convert a proforma invoice into a final invoice. Creates a new invoice with all proforma data, marks proforma as converted, and links the two documents. Returns both the new invoice and updated proforma.
| Name | Required | Description | Default |
|---|---|---|---|
| uuid | Yes | UUID of the proforma invoice to convert | |
| dueDate | No | Override due date for the new invoice (default: proforma due date, YYYY-MM-DD) | |
| companyId | No | Company UUID (overrides configured default) | |
| issueDate | No | Override issue date for the new invoice (default: today, YYYY-MM-DD) | |
| invoiceSeriesId | No | UUID of invoice series to use (if different from proforma series) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish that this is a non-read-only, non-idempotent, non-destructive mutation, so the bar is lower. The description adds valuable behavioral detail beyond annotations: it creates a new invoice, marks the proforma as converted, links the two documents, and returns both records. It does not warn about duplicate conversion risk, permissions, or error conditions, which keeps it from a 5.
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 tight sentences, front-loaded with the primary action and followed by the side effects and return value. No redundant restatement of the tool name or title.
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 mutation tool with complete parameter descriptions and annotations, the description covers the core action, side effects, and return values. It could be more complete by stating prerequisites, duplicate-call behavior, and error/status constraints, but what is present is sufficient for correct invocation in most cases.
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 schema already documents uuid and each override parameter (dueDate, companyId, issueDate, invoiceSeriesId). The description adds no parameter-specific guidance beyond saying the new invoice contains all proforma data, 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?
States a specific verb (convert) and resource (proforma invoice), plus the concrete outcome: a new final invoice is created, the proforma is marked converted, and both documents are linked. An agent can distinguish this from proforma list/get/create/update/delete siblings without opening the schema.
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?
Usage is implied by the conversion action, but the description does not say when this should be used versus proforma_invoices_accept, proforma_invoices_reject, or invoices_create directly. It also omits prerequisites such as whether the proforma must be in a particular status before conversion.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
proforma_invoices_createB
Create a new proforma invoice in draft status with line items. Supports multiple currencies, discounts, and optional references.
| Name | Required | Description | Default |
|---|---|---|---|
| lines | Yes | Array of line items (minimum 1 required) | |
| notes | No | Public notes visible to client | |
| dueDate | Yes | Payment due date (YYYY-MM-DD) | |
| clientId | Yes | UUID of the client | |
| currency | Yes | Currency code (e.g., RON, EUR, USD) | |
| issuerId | No | UUID of the issuer user | |
| language | No | Document language for PDF generation (default: ro) | |
| mentions | No | Additional mentions or notes | |
| seriesId | Yes | UUID of the invoice series configured for proforma invoices | |
| companyId | No | Company UUID (overrides configured default) | |
| issueDate | Yes | Date of issue (YYYY-MM-DD) | |
| issuerName | No | Name of person issuing the proforma | |
| salesAgent | No | Sales agent name | |
| validUntil | Yes | Valid until date (YYYY-MM-DD) | |
| orderNumber | No | Client purchase order number | |
| exchangeRate | No | Exchange rate to base currency (default: 1.0 for RON) | |
| internalNote | No | Internal note (not visible to client) | |
| paymentTerms | No | Payment terms description (e.g., "Net 30") | |
| contractNumber | No | Related contract number | |
| invoiceTypeCode | No | Tax regime / invoice type code (default: standard) | |
| deliveryLocation | No | Delivery address or location | |
| projectReference | No | Related project reference |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare non-read-only, non-destructive, non-idempotent and closed-world, so the safety profile is covered. The description adds real behavioral context beyond them: the record is created as a draft (not issued), currency and discount handling are supported, and extra references are optional. It stops short of saying the draft must later be sent/accepted/converted before invoicing.
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 action and the key outcome (draft status, line items). "Optional references" is the weakest phrase since it restates what the schema already marks optional, but nothing is padded or redundant at length.
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 22-parameter creation tool with no output schema, the description says nothing about what is returned (presumably an id, number, status) or whether the response includes generated PDF/numbering. Annotations cover the safety profile and the schema covers fields, so it is adequate, but an agent still can't predict the response or the follow-up lifecycle step.
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% across 22 parameters, so the schema fully documents each field including line-item nesting, enums and defaults. The description only groups capabilities at a high level (currencies, discounts, references) without adding format, constraint or interdependency detail. Baseline 3 is the correct ceiling here.
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?
States a specific verb and resource ("Create a new proforma invoice") plus two distinguishing behaviors: the result lands in draft status and includes line items. That already separates it from proforma_invoices_update and from invoices_create, though it never names the alternatives explicitly.
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 versus proforma_invoices_convert (which upgrades an accepted proforma to an invoice) or invoices_create (a real invoice). The draft-status detail hints at a workflow, but the agent must infer the preconditions (series configured for proformas, client existing, VAT rates known) rather than being told.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
proforma_invoices_deleteADestructiveIdempotent
Permanently delete a proforma invoice. Only draft proforma invoices can be deleted. Use cancel for sent/accepted/rejected proformas to preserve audit trail.
| Name | Required | Description | Default |
|---|---|---|---|
| uuid | Yes | UUID of the proforma invoice to delete | |
| companyId | No | Company UUID (overrides configured default) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true and idempotentHint=true, but the description adds real value beyond them: that deletion is permanent (irreversible, no restore path offered for proformas unlike invoices_restore), that it is gated on draft status, and the audit-trail consequence of the alternative. What it omits is the failure behavior (what error/result when a non-draft uuid is passed) and the effect of the companyId override.
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 sentences, each earning its place: action + permanence first, precondition second, alternative and rationale third. Zero padding and correctly 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 two-parameter destructive mutation with full annotation coverage, no output schema, and complete schema docs, the description supplies the decision-critical information (irreversibility, draft-only gate, alternative). It stops short of describing failure modes or whether the operation is recoverable by an admin, which would close the remaining gap.
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 both parameters are documented in-schema, so the baseline of 3 applies. The description adds no syntax, format, or sourcing guidance for 'uuid' or for what 'companyId overrides configured default' means in the delete context.
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?
States a specific verb ('Permanently delete') and resource ('proforma invoice') and immediately scopes it against the sibling operation ('Use cancel for sent/accepted/rejected proformas'). An agent can distinguish this from proforma_invoices_cancel or proforma_invoices_bulk_delete without opening any schema.
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 gives the precondition ('Only draft proforma invoices can be deleted') and names the alternative plus the reason to choose it ('Use cancel ... to preserve audit trail'). This is the when-to-use / when-not-to-use / alternative triad in two sentences.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
proforma_invoices_getARead-onlyIdempotent
Get complete details for a specific proforma invoice including all line items, client information, and calculated totals.
| Name | Required | Description | Default |
|---|---|---|---|
| uuid | Yes | UUID of the proforma invoice to retrieve | |
| companyId | No | Company UUID (overrides configured default) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, destructiveHint=false, and openWorldHint=false. The description adds useful context about the returned details, including line items, client information, and totals, but does not mention error behavior, permissions, or not-found 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?
The description is a single efficient sentence that is front-loaded with the core action and scope. Every part of the sentence contributes useful information with no wasted wording.
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 get operation with complete schema coverage and annotations covering safety traits, the description is largely complete. It describes the returned content even though there is no output schema, though it could say more about error cases or authentication 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 description coverage is 100%, so both the uuid and companyId parameters are already documented in the schema. The description does not add further parameter semantics beyond what the structured input schema provides, so the 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 uses a specific verb and resource: "Get complete details for a specific proforma invoice," and lists what is included. It clearly distinguishes retrieving one invoice from listing invoices, though it does not explicitly name the sibling list 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 usage is implied by "specific proforma invoice" and the required UUID parameter, but there is no explicit guidance on when to use this versus proforma_invoices_list or how to obtain the UUID. No exclusions or alternatives are stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
proforma_invoices_listARead-onlyIdempotent
List proforma invoices for the selected company with optional filtering by status, date range, client, and search term. Returns paginated results.
| Name | Required | Description | Default |
|---|---|---|---|
| to | No | End date filter (YYYY-MM-DD) | |
| from | No | Start date filter (YYYY-MM-DD) | |
| page | No | Page number (default: 1) | |
| sort | No | Sort field | |
| limit | No | Items per page (default: 20, max: 100) | |
| order | No | Sort order | |
| search | No | Search term for invoice number or client name | |
| status | No | Filter by status | |
| clientId | No | Filter by client UUID | |
| companyId | No | Company UUID (overrides configured default) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and destructiveHint=false, so the safety profile is fully covered by structured data. The one added behavioral fact is "Returns paginated results," which is useful but largely inferable from the page/limit parameters in the schema; nothing about ordering defaults or result shape is added.
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, zero filler, with the core purpose and company scoping front-loaded ahead of the filter enumeration. Nothing could be cut without losing 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 10-parameter list endpoint with no output schema, the description covers the essentials but is thin: it says nothing about default sort behavior, pagination defaults/max, or what each result entry contains. The rich schema compensates for most of the parameter side, leaving a modest gap.
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 ten parameters are already fully documented including formats (YYYY-MM-DD), enum values, and the companyId override. The description only restates which dimensions can be filtered, adding no semantics 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 opens with a specific verb and resource ("List proforma invoices") and scopes it to the selected company, so the agent knows exactly what is returned. It does not distinguish itself from closely-named siblings such as invoices_list or recurring_invoices_list, which is the only missing piece.
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?
Enumerating the available filters (status, date range, client, search term) implies when this tool is appropriate, but the description never states when to prefer proforma_invoices_get instead, nor any prerequisite for reading a list. Usage is inferable rather than explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
proforma_invoices_pdfARead-onlyIdempotent
Download the PDF of a proforma invoice. Returns base64-encoded binary data. Requires Pro plan.
| Name | Required | Description | Default |
|---|---|---|---|
| uuid | Yes | UUID of the proforma invoice | |
| companyId | No | Company UUID (overrides configured default) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and non-destructive behavior, so the safety profile is covered. The description adds real value beyond that by disclosing the return payload shape ("base64-encoded binary data") and a licensing constraint (Pro plan), which annotations cannot express.
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 sentences, front-loaded with the action and result, with the prerequisite last. Nothing is wasted and there is no restating of the title.
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 binary-download tool with no output schema, mentioning base64 encoding is important and covers the main return-value question. But the description omits whether the proforma must be in a particular state to render a PDF, how errors surface, and any size/streaming caveats—gaps an agent may hit at runtime.
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 both uuid and companyId are already self-documenting, and the description adds nothing about their meaning or interaction (e.g., how companyId override affects the lookup). This is the expected baseline when the schema carries the parameter burden.
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 pairs a specific verb ("Download") with a precise resource ("PDF of a proforma invoice"), which is clearly distinguishable from proforma_invoices_get (metadata) and proforma_invoices_list. It stops short of naming those siblings explicitly, so differentiation is implied rather than stated.
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 plan prerequisite ("Requires Pro plan") tells the agent a precondition for calling, and "Download the PDF" implies the retrieve-the-rendered-document use case. However, there is no explicit when-to-use guidance versus proforma_invoices_get, nor any exclusion or failure condition guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
proforma_invoices_rejectAIdempotent
Mark a proforma invoice as rejected by the client. Optionally provide a rejection reason and notes. Once rejected, the proforma cannot be converted to an invoice.
| Name | Required | Description | Default |
|---|---|---|---|
| uuid | Yes | UUID of the proforma invoice to mark as rejected | |
| companyId | No | Company UUID (overrides configured default) | |
| rejectionNotes | No | Internal notes about the rejection | |
| rejectionReason | No | Reason for rejection provided by the client |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds a key behavioral consequence beyond the annotations: once rejected, the proforma cannot be converted to an invoice. This complements the idempotentHint and non-destructiveHint well. It does not mention authentication requirements or what happens if the proforma is already converted or rejected.
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 sentences are front-loaded with the action, followed by optional inputs and the terminal consequence. Every sentence carries useful information with no repetition or 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?
For a simple state-change action with full schema coverage and useful annotations, the description covers the essential behavior: what it does, optional inputs, and the irreversible conversion consequence. Missing details about error states (already rejected/converted) and permissions are minor given the 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?
Schema coverage is already 100%, so the schema documents all four parameters. The description notes that rejection reason and notes are optional, but it does not clarify the distinction between the client-provided reason and internal notes that the schema defines, so it adds only marginal value.
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 states a specific verb and resource ('Mark a proforma invoice as rejected by the client') and clarifies that the rejection is client-driven. It does not explicitly differentiate this from sibling actions like proforma_invoices_cancel or proforma_invoices_delete, leaving some ambiguity among state-changing siblings.
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?
Usage is implied by the client-rejection framing and the consequence that conversion becomes impossible. However, there is no explicit guidance on when to use this versus proforma_invoices_cancel, proforma_invoices_accept, or proforma_invoices_delete, so the agent must infer the choice.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
proforma_invoices_sendA
Mark a proforma invoice as sent to the client. Transitions status from draft to sent. Once sent, the proforma becomes read-only.
| Name | Required | Description | Default |
|---|---|---|---|
| uuid | Yes | UUID of the proforma invoice to mark as sent | |
| companyId | No | Company UUID (overrides configured default) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare that this is not read-only, is open-world, is not idempotent, and is not destructive. The description adds meaningful behavioral detail beyond that: the status moves from draft to sent and the proforma becomes read-only afterward. It stops short of clarifying whether a real email is dispatched or whether the status change can be reversed.
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 short, front-loaded sentences with no wasted text. The purpose, state transition, and consequence are presented in a logical order.
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 two-parameter mutation with full schema coverage and annotations covering safety traits, the description provides enough context to invoke it correctly. The main remaining ambiguity is whether 'sent' means an actual email is dispatched or only a status change is recorded, but the core behavior is clear.
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 both uuid and companyId already documented in the input schema. The description adds no additional parameter semantics, so the 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 names a specific verb and resource: 'Mark a proforma invoice as sent to the client.' It also states the exact state transition from draft to sent, which clearly distinguishes it from sibling proforma actions such as accept, reject, cancel, and convert.
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 draft-to-sent transition implies the tool should be used on a draft proforma, and the read-only consequence is useful context. However, the description does not explicitly say when to use this instead of accept, reject, cancel, convert, or other sibling operations, nor does it clarify whether an actual client email is sent.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
proforma_invoices_updateAIdempotent
Update an existing proforma invoice. Only invoices in draft status can be updated. Replaces all line items with the provided array.
| Name | Required | Description | Default |
|---|---|---|---|
| uuid | Yes | UUID of the proforma invoice to update | |
| lines | Yes | Array of line items (replaces all existing lines) | |
| notes | No | Public notes visible to client | |
| dueDate | Yes | Payment due date (YYYY-MM-DD) | |
| clientId | Yes | UUID of the client | |
| currency | Yes | Currency code (e.g., RON, EUR, USD) | |
| issuerId | No | UUID of the issuer user | |
| language | No | Document language for PDF generation (default: ro) | |
| mentions | No | Additional mentions or notes | |
| seriesId | Yes | UUID of the invoice series | |
| companyId | No | Company UUID (overrides configured default) | |
| issueDate | Yes | Date of issue (YYYY-MM-DD) | |
| issuerName | No | Name of person issuing the proforma | |
| salesAgent | No | Sales agent name | |
| validUntil | Yes | Valid until date (YYYY-MM-DD) | |
| orderNumber | No | Client purchase order number | |
| exchangeRate | No | Exchange rate to base currency | |
| internalNote | No | Internal note (not visible to client) | |
| paymentTerms | No | Payment terms description | |
| contractNumber | No | Related contract number | |
| invoiceTypeCode | No | Tax regime / invoice type code | |
| deliveryLocation | No | Delivery address or location | |
| projectReference | No | Related project reference |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations cover the safety profile (not read-only, not destructive, idempotent, closed-world), so the description earns credit for the extra constraints it adds: the status gate and the fact that line items are wholesale replaced rather than merged. It does not clarify what happens to optional fields that are omitted (cleared vs preserved) or whether the document is regenerated/re-numbered on update.
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 sentences, zero filler, with the identity, the precondition, and the most surprising side effect front-loaded. Every sentence carries actionable 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 23-parameter, 8-required mutation with no output schema, the biggest open question is whether this behaves as a full replacement of the whole document (fields omitted get reset) or a partial merge; the description only resolves this for lines. The draft precondition is present, but the payload-replacement model and post-update state are left to inference.
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 schema already documents all 23 parameters, including the per-line 'omit to create new' hint and the replacement semantics on the lines array. The description's 'replaces all line items' restates what the schema already says rather than adding syntax or defaulting guidance beyond it, so baseline 3 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?
States a specific verb and resource ('Update an existing proforma invoice'), which is unambiguous against the many siblings prefixed with proforma_invoices_ and distinguishable from invoices_update. It does not explicitly contrast with proforma_invoices_create or proforma_invoices_convert, but the verb+resource is precise enough to route correctly.
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?
'Only invoices in draft status can be updated' is a genuine when-not condition that prevents failed calls on issued/accepted invoices. What is missing is routing guidance against alternatives such as proforma_invoices_cancel or proforma_invoices_convert for non-draft documents.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
receipts_cancelADestructiveIdempotent
Cancel a receipt. Can be cancelled from draft or issued status. Preserves the historical record unlike deletion. Optionally provide a cancellation reason.
| Name | Required | Description | Default |
|---|---|---|---|
| uuid | Yes | UUID of the receipt to cancel | |
| companyId | No | Company UUID (overrides configured default) | |
| cancellationNotes | No | Internal notes about the cancellation | |
| cancellationReason | No | Reason for cancellation |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark this as destructive, idempotent, and non-read-only, so the safety profile is covered. The description adds meaningful behavior beyond annotations: only draft or issued receipts can be cancelled, cancellation preserves the historical record unlike deletion, and a reason may be supplied.
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 tight sentences with no wasted language. It front-loads the action, then gives eligibility, behavioral distinction, and the optional parameter 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 destructive receipt mutation with rich annotations and full schema coverage, the description supplies the key missing behavioral context: eligible statuses, record preservation, and optional reason. It does not discuss reversibility or mention receipts_restore, but the structured fields cover the rest.
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 input schema already documents uuid, companyId, cancellationNotes, and cancellationReason. The description only calls out the optional cancellation reason, so it adds little beyond the schema and fits the baseline of 3 when schema coverage is high.
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 states a specific verb and resource: 'Cancel a receipt.' It also scopes the operation to draft or issued receipts and distinguishes it from deletion by noting that the historical record is preserved, so an agent can differentiate it from receipts_delete.
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 a clear eligibility condition: cancellation is possible from draft or issued status. It also contrasts cancellation with deletion, which is a useful alternative-selection cue, though it does not explicitly mention sibling operations such as receipts_refund or receipts_restore.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
receipts_convert_to_invoiceA
Convert an issued receipt into a final invoice. Creates a new invoice with all receipt data, marks the receipt as invoiced, and establishes a link between the two documents. Returns both the new invoice and updated receipt.
| Name | Required | Description | Default |
|---|---|---|---|
| uuid | Yes | UUID of the issued receipt to convert to an invoice | |
| dueDate | No | Due date for the new invoice (YYYY-MM-DD) | |
| companyId | No | Company UUID (overrides configured default) | |
| issueDate | No | Override issue date for the new invoice (default: today, YYYY-MM-DD) | |
| invoiceSeriesId | No | UUID of the invoice series to use (if different from receipt series) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With annotations declaring readOnlyHint=false and destructiveHint=false, the description still adds real value: it discloses the mutation of the source record ('marks the receipt as invoiced'), the creation of a new record, and the establishment of a link between them. It stops short of covering repeat-call behavior (idempotentHint=false implies duplicates are possible) or any authorization 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?
Three tight sentences: what it does, what changes on both sides, and what is returned. The primary action is front-loaded and no sentence is redundant.
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 five-parameter mutation tool with no output schema, the description covers the action, side effects, and return payload (new invoice plus updated receipt). It is slightly incomplete on failure modes — already-invoiced receipts, series/numbering conflicts, or required permissions — but nothing essential to invoking it is missing.
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 all five parameters including defaults and formats (YYYY-MM-DD, company override) are already documented in the schema. The description adds only the aggregate notion that 'all receipt data' is copied; the optional overrides (dueDate, issueDate, invoiceSeriesId) are left entirely to the schema, which is acceptable at this coverage level.
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?
States a specific verb ('convert') and precise resource pairing ('issued receipt' -> 'final invoice'), then spells out the three resulting effects. An agent can distinguish this immediately from receipts_create, receipts_issue, or proforma_invoices_convert without opening any schema.
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 phrase 'an issued receipt' implies the precondition that the source must already be issued, but there is no explicit when-to-use/when-not guidance, no mention of what to do instead for proformas or delivery notes, and no statement of what happens if the receipt is already invoiced.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
receipts_createA
Create a new receipt (bon fiscal) in draft status. Receipts document point-of-sale transactions with payment method details and optional fiscal register information. Can later be issued and converted to invoices. A default receipt series is auto-assigned if neither seriesId nor documentSeriesId is provided.
| Name | Required | Description | Default |
|---|---|---|---|
| lines | Yes | Array of line items (minimum 1 required) | |
| notes | No | Public notes on the receipt | |
| clientId | No | UUID of the client (optional for receipts) | |
| currency | Yes | Currency code (e.g., RON, EUR, USD) | |
| issuerId | No | UUID of the issuer user | |
| mentions | No | Additional mentions or instructions | |
| seriesId | No | UUID of the receipt series (uses default series if not provided) | |
| companyId | No | Company UUID (overrides configured default) | |
| issueDate | Yes | Date of issue (YYYY-MM-DD) | |
| issuerName | No | Name of person issuing the receipt | |
| salesAgent | No | Sales agent name | |
| cardPayment | No | Amount paid by card (for mixed payments) | |
| cashPayment | No | Amount paid in cash (for mixed payments) | |
| customerCif | No | Customer tax ID / CIF (when no clientId is provided) | |
| customerName | No | Customer name (when no clientId is provided) | |
| exchangeRate | No | Exchange rate to base currency (default: 1.0 for RON) | |
| fiscalNumber | No | Fiscal receipt number assigned by the cash register | |
| internalNote | No | Internal note (not visible to customer) | |
| otherPayment | No | Amount paid by other method, e.g. meal ticket (for mixed payments) | |
| paymentMethod | No | Payment method used for the transaction | |
| idempotencyKey | No | Unique key for retry-safe submissions. Repeat calls with the same key return the originally created receipt instead of creating a duplicate. Recommended for queued offline POS sales and ambiguous timeouts. | |
| cashRegisterName | No | Name or identifier of the cash register / fiscal printer | |
| documentSeriesId | No | UUID of the document series to use (alternative to seriesId; uses default receipt series if neither is provided) | |
| projectReference | No | Related project or order reference |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare the tool is a non-read-only, non-destructive, non-open-world, non-idempotent create operation. The description adds useful behavioral context beyond that: the receipt starts in draft status, can later be issued and converted, and a default receipt series is auto-assigned when no series ID is supplied.
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 front-loaded with the core action and status, followed by concise lifecycle and default-series context. Every sentence contributes useful information without repetition or 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 rich 24-parameter schema with full description coverage and existing annotations, the description supplies the key operational context: draft status, lifecycle transitions, and default series assignment. It does not describe return values or permissions, but those gaps are minor because no output schema exists and the schema covers parameter semantics.
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 schema already documents the 24 parameters. The description adds only a small amount of meaning by clarifying that the default receipt series is used if neither seriesId nor documentSeriesId is provided, which the schema also covers. Baseline 3 is appropriate when the schema does the heavy lifting.
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 states a specific verb and resource: 'Create a new receipt (bon fiscal) in draft status.' It also distinguishes the draft-creation step from later lifecycle actions by noting that the receipt 'Can later be issued and converted to invoices.' It stops short of explicitly naming sibling tools, but the purpose is clear.
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 lifecycle context implies when to use this tool: to create a draft receipt before issuing or converting it. However, it does not explicitly say when to choose this over siblings like receipts_issue or receipts_convert_to_invoice, nor does it state exclusions or prerequisites.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
receipts_deleteADestructiveIdempotent
Permanently delete a receipt. Only draft receipts can be deleted. Use cancel for issued receipts to preserve the audit trail.
| Name | Required | Description | Default |
|---|---|---|---|
| uuid | Yes | UUID of the receipt to delete | |
| companyId | No | Company UUID (overrides configured default) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true, idempotentHint=true and readOnlyHint=false, so the safety profile is covered; the description adds genuinely new behavioral context — the draft-only eligibility gate and the audit-trail rationale. It stops short of clarifying how the presence of a sibling receipts_restore interacts with the claim of permanence, which is a meaningful ambiguity for a destructive 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?
Three short sentences, no filler, and the destructive action plus the eligibility constraint are front-loaded before the alternative-tool pointer. Every sentence carries distinct 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 two-parameter destructive tool with full annotation coverage and no output schema, the description covers what an agent needs to call it correctly. The only gap is not reconciling "permanently delete" with the existence of receipts_restore.
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 only two parameters, both documented in the schema (uuid as the target, companyId as a default override). The description adds no format or selection guidance beyond the schema, so the baseline 3 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?
States a specific verb and resource ("Permanently delete a receipt") and immediately distinguishes itself from the sibling receipts_cancel by scoping deletion to drafts. An agent can tell it apart from receipts_cancel and receipts_restore without opening any schema.
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?
Gives an explicit precondition ("Only draft receipts can be deleted") and names the alternative tool with its rationale ("Use cancel for issued receipts to preserve the audit trail"). This is the when/when-not/alternative pattern in full.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
receipts_emailA
Send a receipt (bon fiscal) to a customer via email with the PDF attached. Supports custom subject, body, CC, and BCC recipients. Recipients (to, cc, bcc) must be client emails registered on the company; other addresses are rejected with EMAIL_RECIPIENT_NOT_CLIENT.
| Name | Required | Description | Default |
|---|---|---|---|
| cc | No | CC email addresses | |
| to | Yes | Recipient email address | |
| bcc | No | BCC email addresses | |
| body | No | Email body text (auto-generated if omitted) | |
| uuid | Yes | UUID of the receipt to send | |
| subject | No | Email subject (auto-generated if omitted) | |
| companyId | No | Company UUID (overrides configured default) | |
| templateId | No | UUID of email template to use (category: receipt) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the side-effect profile (readOnly=false, idempotent=false, openWorld=true), and the description adds meaningful context: the PDF attachment is included, subject/body are auto-generated when omitted, and non-client addresses fail with the named error EMAIL_RECIPIENT_NOT_CLIENT. It stops short of saying what is returned on success (e.g., delivery record).
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 sentences, front-loaded with the action and the recipient constraint; nothing is padded and the error case is stated compactly at the end.
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 an 8-parameter, output-schema-less mutation tool, the description covers the action, customization scope, and the failure mode that would otherwise waste a call. It could go further on prerequisites (e.g., receipt must be issued) and on what a successful send produces.
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 schema already explains all 8 parameters including the auto-defaults. The description's mention of subject, body, CC, and BCC adds little beyond the schema and stays silent on companyId and templateId selection.
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 names a specific verb (send), resource (receipt / bon fiscal), and delivery channel (email, PDF attached), which cleanly separates it from receipts_pdf and receipts_email_history in the sibling list.
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 gives a real precondition ('recipients must be client emails registered on the company'), but never says when to prefer this over receipts_pdf, receipts_email_defaults, or invoices_email, nor what to do if the receipt is unissued or unsubmitted.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
receipts_email_defaultsBRead-onlyIdempotent
Get pre-filled email content for a receipt including default recipient, subject, and body text with template variables already substituted.
| Name | Required | Description | Default |
|---|---|---|---|
| uuid | Yes | UUID of the receipt | |
| companyId | No | Company UUID (overrides configured default) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and non-destructive behavior, so the safety profile is covered. The description adds that content is pre-filled and template variables are already substituted, which is useful, but it does not disclose what happens if the receipt has no configured defaults or if the receipt UUID is invalid.
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 a single efficient sentence that front-loads the operation and specifies the returned content. There is no redundant or wasted text.
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 getter with no output schema, the description explains enough about the return value (default recipient, subject, body with substituted variables). It could be slightly more complete by mentioning the companyId override or behavior when defaults are absent, but the core need is covered.
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 both uuid and companyId are fully documented in the schema. The description does not mention parameters or the companyId override, so it adds no meaning beyond the schema; this is the baseline 3 case.
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 states a specific verb ('Get') and resource ('pre-filled email content for a receipt') and enumerates the main returned fields. It is clearly distinguishable from send/history siblings, though it does not explicitly name the sibling it is not.
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?
There is no explicit guidance on when to use this tool versus alternatives such as receipts_email or receipts_email_history. The intended use is only implied by the verb 'Get' and the resource 'email defaults'.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
receipts_email_historyARead-onlyIdempotent
Get the email sending history for a receipt, including all sent emails with their status, timestamps, and recipient information.
| Name | Required | Description | Default |
|---|---|---|---|
| uuid | Yes | UUID of the receipt | |
| companyId | No | Company UUID (overrides configured default) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, non-destructive and closed-world, so the safety profile is covered. The description adds that the payload contains per-email status, timestamps and recipients, but says nothing about ordering, pagination, or caps on history length.
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?
A single front-loaded sentence naming the resource and the returned data, with no filler or redundancy.
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 exists, and the description compensates by naming the main response fields. For a simple two-parameter read tool with full annotation coverage, this is nearly complete; only ordering/pagination notes are missing.
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% for both parameters (uuid, companyId), so the schema carries the semantics. The description only restates that the history is scoped 'for a receipt' and adds no detail on the companyId override behavior.
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?
Clear verb+resource: reads the email sending history for a specific receipt. The description also enumerates the returned fields (status, timestamps, recipients), which distinguishes it from receipts_email (which sends) by implication, though no sibling is named explicitly.
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?
'History' implies a read-after-send lookup, so an agent can infer when to use it, but the description gives no explicit when/when-not guidance and never points to receipts_email (send) or delivery_notes_email_history / invoices_email_history as the analogous tools for other document types.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
receipts_getARead-onlyIdempotent
Get complete details for a specific receipt (bon fiscal) including all line items, payment breakdown, fiscal data, and calculated totals.
| Name | Required | Description | Default |
|---|---|---|---|
| uuid | Yes | UUID of the receipt to retrieve | |
| companyId | No | Company UUID (overrides configured default) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and destructiveHint=false, so the safety profile is covered. The description adds genuine behavioral value by specifying the returned data ('all line items, payment breakdown, fiscal data, and calculated totals'), which is important since there is no output 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?
A single, front-loaded sentence with no filler. The verb and resource lead, and the enumeration of returned data is compact and useful.
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 getter with full annotation coverage, 100% schema coverage, and no output schema, the description does well by describing the returned payload. It could be more complete by mentioning behavior when the UUID is not found or by explicitly routing to receipts_list for discovery.
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 both parameters (uuid and companyId) are already documented. The description does not add any parameter-level meaning, making the baseline 3 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 states a specific verb ('Get') and resource ('a specific receipt (bon fiscal)') and enumerates the payload returned (line items, payment breakdown, fiscal data, totals). This implicitly distinguishes it from receipts_list, though it does not explicitly name that sibling.
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?
Usage is implied: retrieve one receipt when you have its UUID. There is no explicit guidance on when to prefer receipts_list to locate a UUID or when another sibling like receipts_pdf is more appropriate.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
receipts_issueAIdempotent
Mark a receipt as issued at the point of sale. Transitions status from draft to issued. Once issued, the receipt becomes read-only and its fiscal data is locked.
| Name | Required | Description | Default |
|---|---|---|---|
| uuid | Yes | UUID of the receipt to mark as issued | |
| companyId | No | Company UUID (overrides configured default) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare the mutation profile (readOnly=false, destructive=false, idempotent=true), and the description adds genuinely new consequences: the record becomes read-only and its fiscal data is locked. It still doesn't say what happens if the receipt isn't in draft or whether authorization/fiscal config is required.
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 sentences, front-loaded with the action, then the transition, then the consequence. No filler and no repetition of the name.
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 small two-parameter mutation with no output schema, the description covers the essential contract: what moves, what locks, and that it's one-way in effect. Missing only error-condition guidance (non-draft receipts) and confirmation of what the response contains.
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 documented (uuid and companyId override), so the schema carries the parameter burden. The description adds no semantics about the uuid target or when the companyId override matters, which is the baseline expectation here.
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?
States a specific verb and resource ('Mark a receipt as issued') plus the state transition it performs. It does not distinguish itself from near-siblings like receipts_cancel, receipts_convert_to_invoice, payments_receipt_issue, or invoices_issue, so an agent must infer which 'issue' applies where.
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?
'Transitions status from draft to issued' and 'at the point of sale' imply the precondition (receipt must already exist in draft) but never state it as a requirement or say what to do otherwise. No explicit exclusions or routing to alternatives such as payments_receipt_issue for payment-linked receipts.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
receipts_listARead-onlyIdempotent
List receipts (bonuri fiscale) for the selected company with optional filtering by status, date range, client, and search term. Receipts document point-of-sale transactions and can be converted to invoices.
| Name | Required | Description | Default |
|---|---|---|---|
| to | No | End date filter (YYYY-MM-DD) | |
| from | No | Start date filter (YYYY-MM-DD) | |
| page | No | Page number (default: 1) | |
| limit | No | Items per page (default: 20, max: 100) | |
| search | No | Search term for receipt number or customer name | |
| status | No | Filter by status | |
| clientId | No | Filter by client UUID | |
| companyId | No | Company UUID (overrides configured default) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the safety profile is fully covered structurally. The description adds the useful domain context that receipts are POS transactions convertible to invoices, but says nothing about pagination behavior or default result volume despite exposing page/limit params.
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 tight sentences: capability and scope first, domain explanation second. Nothing is redundant with the annotations or schema, and nothing extraneous 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?
For a read-only list tool with full schema coverage and complete annotations, the description supplies the necessary purpose and domain framing. The only gap is pagination/result-size expectations, which the schema mostly implies via page and limit.
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 every parameter (including page/limit defaults and status enum) is already documented in the schema; baseline 3 applies. The description's list of filter axes (status, date range, client, search) mirrors rather than extends 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 first sentence names a specific verb and resource ('List receipts (bonuri fiscale)') plus its scope ('for the selected company'), and the second sentence explains what a receipt is. However, it never contrasts itself with siblings such as receipts_get or receipts_convert_to_invoice, so the agent must infer the list-vs-get distinction from the names alone.
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?
Optional filtering dimensions are enumerated, which implies the intended usage (browse/filter receipts), but the description never states when to prefer this tool over receipts_get, invoices_list, or receipts_convert_to_invoice, and no prerequisites or exclusions are given.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
receipts_pdfARead-onlyIdempotent
Download the PDF for a receipt (bon fiscal). Returns base64-encoded PDF binary data. The receipt must be in issued or invoiced status.
| Name | Required | Description | Default |
|---|---|---|---|
| uuid | Yes | UUID of the receipt | |
| companyId | No | Company UUID (overrides configured default) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint and non-destructive behavior, so the bar is lower; the description still adds value by disclosing the base64 encoding of the returned payload and the status gate that causes failures. It does not mention size limits or download/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?
Three short sentences: purpose first, then return format, then precondition. Every sentence carries information an agent needs and there is 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?
With no output schema, the description usefully states what comes back (base64 PDF) and the status requirement, which is enough for an agent to call it correctly. Minor gap: nothing about how the base64 payload should be handled downstream or error behavior when status is wrong.
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 only two parameters (uuid required, companyId override), both documented in the schema. The description adds nothing about parameter behavior, so the baseline 3 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?
States a specific verb and resource ('Download the PDF for a receipt') and even clarifies the domain term (bon fiscal), so an agent can distinguish it from receipts_get or receipts_email. It stops short of explicitly naming the sibling that returns the receipt record rather than the document.
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 precondition 'the receipt must be in issued or invoiced status' is a real usage constraint, but there is no statement of when to prefer this over receipts_get, payments_receipt_pdf, or receipts_email. Usage is implied rather than spelled out.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
receipts_refundA
Issue a refund (counter-)receipt that mirrors the parent receipt with negative quantities and inverted payment amounts. The refund is auto-issued, linked back via refundOf, and inherits the parent receipt series. Parent must be issued and not itself a refund. Omit lineSelections for a full refund of the whole receipt; pass it to refund only specific lines (with possibly partial quantities). Multiple partial refunds against the same parent are allowed until the original quantities are exhausted.
| Name | Required | Description | Default |
|---|---|---|---|
| uuid | Yes | UUID of the parent issued receipt to refund | |
| companyId | No | Company UUID (overrides configured default) | |
| lineSelections | No | When provided, only the listed lines are refunded with the given (partial) quantities. When omitted, the entire receipt is refunded. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond annotations (destructiveHint=false, idempotentHint=false), the description discloses auto-issuance, refundOf linkage, inherited series, and the accumulating multiple-partial-refund behavior until quantities are exhausted. It omits permission/auth requirements, but adds substantial behavioral context.
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?
Front-loaded with the core behavior, then constraints. Dense but every sentence (linkage, series inheritance, preconditions, lineSelections branching) carries information; 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?
For a 3-param mutation tool with no output schema and reasonable annotations, the description covers mechanics, preconditions, and partial-refund semantics. Return shape is left implicit, which is the only notable gap.
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, but the description adds real meaning: it clarifies that lineSelections with partial quantities is allowed and that repeated partials can be issued against the same parent until exhausted. This goes beyond the schema's per-line note.
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?
States a specific verb and resource ('Issue a refund (counter-)receipt') and immediately explains the mechanism: mirrors parent with negative quantities and inverted amounts. This clearly separates it from receipts_issue and receipts_cancel.
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?
Gives concrete preconditions (parent must be issued and not itself a refund) and explicit branching on lineSelections (omit for full refund, pass for partial). It does not route to an explicit alternative sibling, but the usage conditions are clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
receipts_restoreAIdempotent
Restore a cancelled receipt back to draft status. Only cancelled receipts can be restored. This reverses the cancellation and allows the receipt to be re-issued.
| Name | Required | Description | Default |
|---|---|---|---|
| uuid | Yes | UUID of the cancelled receipt to restore | |
| companyId | No | Company UUID (overrides configured default) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare non-read-only, non-destructive, idempotent behavior, and the description is consistent with that. It adds real value by disclosing the state machine effect (cancelled → draft) and the downstream consequence that the receipt can be re-issued. It does not cover permissions, numbering effects, or what happens to an already-issued document.
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 sentences with the action and precondition front-loaded. There is mild redundancy between "Only cancelled receipts can be restored" and "This reverses the cancellation", but nothing is wasted overall.
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 two-parameter state-transition tool with full schema coverage and no output schema, the description covers action, precondition and outcome. The only gap is the side effects on document numbering or previously issued copies, which an agent might reasonably wonder about before restoring.
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 both parameters are documented in the schema, including the companyId override semantics. The description adds no further meaning about uuid or companyId, so the baseline of 3 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?
States a specific verb and resource plus the exact state transition: a cancelled receipt is returned to draft status. An agent can distinguish it from receipts_cancel or receipts_refund from the description alone, though it never names those siblings explicitly.
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?
"Only cancelled receipts can be restored" gives a clear precondition that tells the agent when this tool applies. It stops short of naming the alternative actions (e.g. re-issuing, cancelling again) or stating what to do if the receipt is in another state, so no exclusions are given.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
receipts_updateAIdempotent
Update an existing receipt. Receipts in draft or issued status can be updated. Replaces all line items with the provided array.
| Name | Required | Description | Default |
|---|---|---|---|
| uuid | Yes | UUID of the receipt to update | |
| lines | Yes | Array of line items (replaces all existing lines) | |
| notes | No | Public notes on the receipt | |
| clientId | No | UUID of the client (optional for receipts) | |
| currency | Yes | Currency code (e.g., RON, EUR, USD) | |
| issuerId | No | UUID of the issuer user | |
| mentions | No | Additional mentions or instructions | |
| seriesId | No | UUID of the receipt series | |
| companyId | No | Company UUID (overrides configured default) | |
| issueDate | Yes | Date of issue (YYYY-MM-DD) | |
| issuerName | No | Name of person issuing the receipt | |
| salesAgent | No | Sales agent name | |
| cardPayment | No | Amount paid by card (for mixed payments) | |
| cashPayment | No | Amount paid in cash (for mixed payments) | |
| customerCif | No | Customer tax ID / CIF (when no clientId is provided) | |
| customerName | No | Customer name (when no clientId is provided) | |
| exchangeRate | No | Exchange rate to base currency | |
| fiscalNumber | No | Fiscal receipt number assigned by the cash register | |
| internalNote | No | Internal note (not visible to customer) | |
| otherPayment | No | Amount paid by other method, e.g. meal ticket (for mixed payments) | |
| paymentMethod | No | Payment method used for the transaction | |
| cashRegisterName | No | Name or identifier of the cash register / fiscal printer | |
| documentSeriesId | No | UUID of the document series to use (alternative to seriesId) | |
| projectReference | No | Related project or order reference |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare non-read-only, idempotent, non-destructive behavior. The description adds important operational context beyond annotations: status eligibility and the fact that all line items are replaced, which is critical for an agent to avoid unintended data loss.
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 sentences, front-loaded with the action and status constraint, followed by the replacement behavior. Every sentence carries necessary operational meaning with 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 rich annotations and 100% schema coverage, the description is nearly complete for a mutation tool. It covers status restrictions and line replacement, though it could mention that unspecified fields remain unchanged or clarify response behavior, but no output schema exists.
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 all 24 parameters are documented in the schema. The description reinforces line replacement semantics but does not add new parameter-level detail beyond what the schema already provides, so baseline 3 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?
The description states a specific verb and resource ('Update an existing receipt') and clarifies the operation applies only to receipts in draft or issued status. It is clearly distinct from create/issue siblings, though it does not explicitly name an alternative 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?
It gives a clear condition for use: receipts in draft or issued status can be updated. It does not explicitly state when not to use it or which sibling to use instead, but the status constraint provides meaningful usage context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
recurring_invoices_bulk_deleteADestructiveIdempotent
Delete multiple recurring invoice templates in a single request. Returns the count of deleted items and any errors for items that could not be deleted.
| Name | Required | Description | Default |
|---|---|---|---|
| ids | Yes | Array of recurring invoice UUIDs to delete (1-100) | |
| companyId | No | Company UUID (overrides configured default) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true and idempotentHint=true, so the safety profile is known. The description adds genuinely new context: the operation is partially tolerant — it returns a count plus per-item errors for entries that could not be deleted, telling the agent this is not an all-or-nothing delete. It stops short of stating permission requirements or whether deletion is soft or hard.
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, zero waste, with the operation front-loaded and the return behavior following. Nothing in it repeats the schema or annotations verbatim.
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 no output schema, the description usefully covers the return shape (count plus per-item errors), which is the main thing an agent needs for a partial-failure bulk operation. It leaves open the side effects of deleting a template that already spawned invoices, which for a destructive tool is a meaningful residual gap.
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 both parameters are documented there, including the 1-100 bounds on ids and the companyId override. The description adds nothing beyond the plural implication of the ids array, so the baseline of 3 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?
States a specific verb and resource — delete multiple recurring invoice templates — with the bulk scope made explicit in 'multiple ... in a single request'. An agent can distinguish it from recurring_invoices_delete (single) and from recurring_invoices_bulk_toggle_active without opening a schema.
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 bulk framing implies when to prefer this over the single-item recurring_invoices_delete, but that alternative is never named and no exclusions or prerequisites (e.g. what happens to already-issued invoices from a template) are given. Usage is only inferable from the plural wording.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
recurring_invoices_bulk_issue_nowA
Immediately generate invoices from multiple recurring invoice templates. Useful for triggering generation outside the normal schedule. Does not update the nextIssuanceDate.
| Name | Required | Description | Default |
|---|---|---|---|
| ids | Yes | Array of recurring invoice UUIDs (1-100) | |
| companyId | No | Company UUID (overrides configured default) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare it is a non-read-only, non-destructive, non-idempotent operation, so the description's added value is the non-obvious side-effect note: 'Does not update the nextIssuanceDate.' That is exactly the kind of caveat an agent cannot get from structured fields. It still leaves unstated whether created invoices are drafts or issued, and how partial failures across the id array are handled.
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 sentences, no filler, with the core action front-loaded and the caveat last. Every sentence carries distinct 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 non-idempotent bulk mutation with no output schema, the description should say what comes back (per-id results? count of invoices created?) and whether inactive templates are skipped or error. The nextIssuanceDate caveat is helpful but the outcome contract is left open.
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%: the ids array documents the 1-100 UUID range and companyId documents the default override. The description adds nothing about the parameters, so baseline 3 applies since the schema does the work.
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?
States a specific verb and resource: 'generate invoices from multiple recurring invoice templates', with 'Immediately' and 'multiple' distinguishing it from the singular recurring_invoices_issue_now sibling. It never names that sibling explicitly, so the differentiation is implied by wording rather than stated.
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?
'Useful for triggering generation outside the normal schedule' gives a clear condition for reaching for this tool rather than waiting for the scheduler. No exclusions or named alternatives, so an agent must infer that recurring_invoices_issue_now covers the single-template case.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
recurring_invoices_bulk_toggle_activeA
Toggle the active/paused status of multiple recurring invoices at once. Set active=true to resume or active=false to pause invoice generation.
| Name | Required | Description | Default |
|---|---|---|---|
| ids | Yes | Array of recurring invoice UUIDs (1-100) | |
| active | Yes | Set to true to activate, false to pause | |
| companyId | No | Company UUID (overrides configured default) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnlyHint=false, destructiveHint=false, openWorldHint=false), and the description usefully clarifies that pausing stops invoice generation rather than deleting anything. However it is silent on the mutation's real risks: whether partial failures across the batch are reported, what happens to ids already in the target state, and whether per-id results are returned (no output schema exists). Note a mild tension with idempotentHint=false, since setting active to a fixed boolean should be repeatable.
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, zero padding: the operation size is stated first, then the boolean semantics. Nothing to cut.
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 bulk mutation with no output schema, an agent still needs to know how per-invoice outcomes and failures are surfaced, and whether re-sending an already-applied state is a no-op or an error. Those gaps keep it at minimum-viable rather than 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 100%, so the schema already documents ids, active and companyId, and the description only restates the active semantics. It adds nothing about the companyId override behavior or batch limits, so the baseline 3 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?
Names a specific verb and resource (bulk status toggle of recurring invoices) and the phrase "multiple recurring invoices at once" scopes it apart from the singular recurring_invoices_toggle and from the bulk_delete/bulk_issue_now siblings. An agent can pick it without opening the schema.
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?
"multiple ... at once" plus "active=true to resume or active=false to pause invoice generation" makes the use case clear: apply one state to many. It never explicitly says to use recurring_invoices_toggle for a single invoice or names any exclusion, so it stops short of full when-not guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
recurring_invoices_createB
Create a new recurring invoice template. The system will automatically generate invoices based on the specified frequency and schedule. Supports fixed, updated_product, bnr_rate and bnr_rate_markup pricing rules on line items.
| Name | Required | Description | Default |
|---|---|---|---|
| lines | Yes | Array of line items (minimum 1 required) | |
| notes | No | Notes printed on every generated document. Placeholders: [[luna]], [[luna±N]], [[an]], [[an±N]], [[luna_nr]], [[curs]] (the BNR rate note), [[suma:EXPR]] (an amount computed from EXPR, e.g. [[suma:1900*curs]] = 1,900 EUR at the BNR rate of the issue date; names: curs, curs_EUR, curs_USD…, sold, sold_anterior, rata), and with a running balance: [[sold]] (left after this invoice), [[sold_anterior]] (before), [[rata]] (deducted now). Amounts print in Romanian format (9.633,00). | |
| balance | No | Running balance in RON (e.g. an investment recovered through rent reductions). Reduced on every issuance by balanceStep; printed with [[sold]]. The template pauses when it reaches zero. | |
| clientId | Yes | UUID of the client | |
| currency | Yes | ISO 4217 currency code (e.g., RON, EUR) | |
| seriesId | Yes | UUID of the document series | |
| stopDate | No | ISO 8601 date to stop generation (YYYY-MM-DD) | |
| companyId | No | Company UUID (overrides configured default) | |
| frequency | Yes | How often to generate invoices | |
| reference | No | Human-readable reference for this recurring invoice | |
| balanceStep | No | Expression deducted from balance per issuance, e.g. "1900*curs" (1,900 EUR at the BNR rate of the issue date). Names: curs, curs_EUR…, sold_anterior. The last deduction is capped at what is left. | |
| dueDateDays | No | Days after issue date for due date (required if dueDateType is days) | |
| dueDateType | Yes | How due date is calculated. days = N days after issue. fixed_day = fixed day of month. | |
| documentType | Yes | Document type to generate | |
| frequencyDay | Yes | Day of month for generation (1-31) | |
| paymentTerms | No | Payment terms text | |
| autoEmailTime | No | Time to send email (HH:mm, default: "09:00") | |
| frequencyMonth | No | Month for yearly generation (1-12, required if frequency is yearly) | |
| penaltyEnabled | No | Enable late payment penalties (default: false) | |
| dueDateFixedDay | No | Fixed day of month for due date (1-31, required if dueDateType is fixed_day) | |
| invoiceTypeCode | Yes | Tax regime / invoice type code | |
| autoEmailEnabled | No | Auto-send email on invoice generation (default: false) | |
| nextIssuanceDate | Yes | ISO 8601 date for the first invoice generation (YYYY-MM-DD) | |
| penaltyGraceDays | No | Grace period in days before penalties apply | |
| autoEmailDayOffset | No | Days offset for email sending (default: 0) | |
| penaltyPercentPerDay | No | Daily penalty percentage |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare this is a non-readonly, non-idempotent mutation. The description adds useful context that invoices will be generated automatically according to frequency and schedule, but it omits operational details like pause behavior, required permissions, or what the response returns.
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 sentences, front-loaded with the core action and generation behavior. There is little wasted text, and the key concept appears immediately.
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 complex creation tool with 26 parameters, 10 required fields, and no output schema, the description is quite thin. It covers the core behavior and pricing-rule support, but leaves scheduling, auto-email, balance, and return-value context to the schema or unstated.
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 schema already documents all 26 parameters in detail. The description mentions pricing rules but only lists four of the five schema enum values, omitting expression, and adds no syntax or format 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 states a specific verb and resource: creating a recurring invoice template, with automatic invoice generation. It distinguishes this from one-off invoice creation by emphasizing recurrence and scheduling, though it does not explicitly name sibling 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?
It explains what the tool does but gives no explicit guidance on when to use it versus alternatives such as recurring_invoices_update, recurring_invoices_issue_now, or invoices_create. The agent must infer that this is for initial template creation.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
recurring_invoices_deleteADestructiveIdempotent
Permanently delete a recurring invoice template. Previously generated invoices from this template are not affected. Use toggle to temporarily pause instead.
| Name | Required | Description | Default |
|---|---|---|---|
| uuid | Yes | UUID of the recurring invoice template to delete | |
| companyId | No | Company UUID (overrides configured default) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Although annotations already declare destructiveHint=true and idempotentHint=true, the description adds important behavioral detail: deletion is permanent and previously generated invoices are unaffected. It does not explain permission requirements or confirmation behavior, but it adds meaningful 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?
Three short sentences, front-loaded with the permanent-delete outcome and immediately followed by the key side-effect and safer alternative. Every sentence contributes useful information without 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?
For a destructive delete tool with annotations, full schema coverage, and no output schema, the description gives the critical context: deletion is permanent and generated invoices are unaffected. It could mention bulk-delete alternatives or authorization expectations, but nothing essential is missing for a correct call.
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 both the uuid and companyId parameters are already documented in the schema. The description does not add any parameter-specific syntax, defaults, or constraints beyond what the schema provides, making 3 the correct 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 names a specific verb and resource: "Permanently delete a recurring invoice template." It also distinguishes the action from the closely related pause behavior by explicitly pointing to toggle.
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 explicitly says to use toggle instead when the goal is to temporarily pause, which is a clear alternative-use rule. It does not mention bulk-delete siblings or other deletion contexts, so it falls just short of full guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
recurring_invoices_getARead-onlyIdempotent
Get detailed information about a specific recurring invoice template including all line items used as a template for generated invoices.
| Name | Required | Description | Default |
|---|---|---|---|
| uuid | Yes | UUID of the recurring invoice template | |
| companyId | No | Company UUID (overrides configured default) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, destructiveHint=false and openWorldHint=false, so the safety profile is fully covered. The description's added value is that the response includes the template's line items — useful context — but it says nothing about error behavior for unknown uuids or about how generated invoices relate to the template.
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?
A single front-loaded sentence that identifies the resource first and the payload second. The trailing clause 'used as a template for generated invoices' is slightly redundant and could be trimmed.
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 two-parameter, read-only fetch with no output schema and full annotation coverage, the description is adequate: it names the resource and flags that line items come back. A fuller note on what else the detail payload contains would make it 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 100% and both parameters (uuid, companyId) are documented in the schema, so the baseline is 3. The description adds no meaning beyond it — notably it never explains the companyId override that the schema only hints at.
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?
States a specific verb (Get) and a precise resource (a specific recurring invoice template), plus the notable payload detail that the line items are included. It is clearly distinguishable from recurring_invoices_list by the word 'specific', though it never names a sibling explicitly.
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?
Usage is only implied: you call it when you have a single template and need its details. There is no statement about when to prefer recurring_invoices_list first to find the uuid, and no prerequisites or exclusions are mentioned.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
recurring_invoices_issue_nowA
Manually trigger immediate invoice generation from a recurring invoice template, bypassing the scheduled generation. Useful for testing configurations or creating one-off invoices. Does not update the nextIssuanceDate.
| Name | Required | Description | Default |
|---|---|---|---|
| uuid | Yes | UUID of the recurring invoice template to issue now | |
| companyId | No | Company UUID (overrides configured default) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds important behavioral context beyond the annotations by explaining that scheduled generation is bypassed and that nextIssuanceDate is not updated. It does not contradict the non-readOnly, non-idempotent annotations, and the caveat about nextIssuanceDate is especially useful for an agent predicting side effects.
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 tight sentences front-load the core action, then add use cases and an important side-effect caveat. Every sentence contributes relevant information without 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?
For a simple two-parameter mutation tool with annotations covering safety and idempotency, the description is mostly complete. The main remaining gap is that it does not describe what the tool returns, which matters because no output schema is provided.
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 already has 100% description coverage for both parameters. The description reinforces that the uuid identifies a recurring invoice template but adds no parameter-level detail beyond what the schema provides, so the 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 states a specific action: manually trigger immediate invoice generation from a recurring invoice template, bypassing scheduled generation. It clearly distinguishes the tool from scheduled generation, though it does not explicitly contrast with the sibling recurring_invoices_bulk_issue_now.
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 gives concrete use cases: testing configurations and creating one-off invoices. It also clarifies the bypass behavior, but does not explicitly state when to choose this over recurring_invoices_bulk_issue_now.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
recurring_invoices_listARead-onlyIdempotent
List recurring invoice templates for the selected company. Supports filtering by active status and frequency.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | Page number (default: 1) | |
| limit | No | Items per page (default: 20, max: 100) | |
| search | No | Search term to filter by reference or notes | |
| isActive | No | Filter by active status (true/false) | |
| companyId | No | Company UUID (overrides configured default) | |
| frequency | No | Filter by generation frequency |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, destructiveHint=false and a closed-world scope, so the safety profile is fully covered elsewhere. The description adds the company-scoping context and the available filter dimensions, but says nothing about pagination defaults, result ordering, or what the templates include.
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 with the operation and scope front-loaded, no filler. The second sentence is largely a restatement of schema parameters, which slightly reduces its 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?
A read-only list tool with complete parameter documentation and full annotation coverage has little left to explain, and the description covers scope and filtering. It would be marginally better with a note on pagination/result ordering, but nothing essential is missing.
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 every parameter including the frequency enum is documented inline, so the baseline is 3. The description's mention of active-status and frequency filtering merely restates two schema parameters and adds no semantics for search, page/limit, or the companyId override.
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?
Specific verb + resource ("List recurring invoice templates") with scope ("for the selected company"), which distinguishes it from singular siblings like recurring_invoices_get or mutation siblings like recurring_invoices_toggle. It stops short of explicitly naming the alternative list-style siblings (invoices_list, proforma_invoices_list), but the resource noun is 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?
"Supports filtering by active status and frequency" implies the useful call contexts, and "selected company" implies the default-scoping behavior. However, there is no explicit when-to-use vs when-to-use-get guidance, and no mention that recurring_invoices_get is the right call for a single template.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
recurring_invoices_toggleB
Toggle the active status of a recurring invoice template to pause or resume automatic invoice generation. If active, it will be paused; if paused, it will be resumed.
| Name | Required | Description | Default |
|---|---|---|---|
| uuid | Yes | UUID of the recurring invoice template to toggle | |
| companyId | No | Company UUID (overrides configured default) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description usefully spells out the state machine ('if active, it will be paused; if paused, it will be resumed'), which explains the non-idempotent annotation in concrete terms. It does not disclose whether already-scheduled generations are cancelled, permission requirements, or what the response returns, so it goes only modestly beyond the annotation set.
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?
Front-loaded with the core action in one sentence, with the state-transition detail immediately after. The second sentence largely restates the first in conditional form, so there is mild redundancy but no bloat.
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 two-parameter mutation with full schema coverage and no output schema, the description covers the essential purpose. It still leaves out side effects on pending/scheduled invoices and what the caller gets back, which matters for a state-changing operation.
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 both the uuid and the companyId override are already documented in the schema. The description adds no further parameter semantics, which is acceptable but not additive; baseline 3 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?
States a specific verb and resource (toggle active status of a recurring invoice template) plus the business effect (pause/resume automatic invoice generation). It is distinguishable from siblings such as recurring_invoices_update or recurring_invoices_delete, though it never names the near-duplicate bulk variant recurring_invoices_bulk_toggle_active.
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?
Usage is implied by the pause/resume framing, so an agent can infer this is the flip-the-flag tool. However, there is no explicit guidance on when to use this versus recurring_invoices_update (which could also change the active flag) or recurring_invoices_bulk_toggle_active, and no stated preconditions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
recurring_invoices_updateAIdempotent
Update an existing recurring invoice template. All fields are optional but at least one must be provided. When updating lines, the entire lines array replaces existing lines.
| Name | Required | Description | Default |
|---|---|---|---|
| uuid | Yes | UUID of the recurring invoice template to update | |
| lines | No | Array of line items (replaces all existing lines) | |
| notes | No | Notes printed on every generated document; same placeholders as recurring_invoices_create ([[luna]], [[an]], [[curs]], [[suma:EXPR]], [[sold]], [[sold_anterior]], [[rata]]) | |
| balance | No | Running balance in RON (null removes it); see recurring_invoices_create | |
| clientId | No | UUID of the client | |
| currency | No | ISO 4217 currency code | |
| seriesId | No | UUID of the document series | |
| stopDate | No | ISO 8601 date to stop generation (null to remove) | |
| companyId | No | Company UUID (overrides configured default) | |
| frequency | No | How often to generate invoices | |
| reference | No | Human-readable reference | |
| balanceStep | No | Expression deducted from balance per issuance, e.g. "1900*curs"; null removes it | |
| dueDateDays | No | Days after issue date for due date | |
| dueDateType | No | How due date is calculated. days = N days after issue. fixed_day = fixed day of month. | |
| documentType | No | Document type to generate | |
| frequencyDay | No | Day of month for generation (1-31) | |
| paymentTerms | No | Payment terms text | |
| autoEmailTime | No | Time to send email (HH:mm) | |
| frequencyMonth | No | Month for yearly generation (1-12) | |
| penaltyEnabled | No | Enable late payment penalties | |
| dueDateFixedDay | No | Fixed day of month for due date (1-31) | |
| invoiceTypeCode | No | Tax regime / invoice type code | |
| autoEmailEnabled | No | Auto-send email on invoice generation | |
| nextIssuanceDate | No | ISO 8601 date for next invoice generation (YYYY-MM-DD) | |
| penaltyGraceDays | No | Grace period in days before penalties apply | |
| autoEmailDayOffset | No | Days offset for email sending | |
| penaltyPercentPerDay | No | Daily penalty percentage |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false, idempotentHint=true and destructiveHint=false, so safety is covered. The description adds the non-obvious destructive-ish detail that the 'lines' array fully replaces existing lines, which is exactly the kind of behavior an agent must know before calling. It stops short of mentioning side effects on already-scheduled issuances (e.g., changing nextIssuanceDate).
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 sentences, front-loaded with purpose, then the invocation constraint, then the one surprising behavior. Every sentence carries distinct information and nothing is repeated.
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 27-parameter update tool, the description plus the fully documented schema and annotations give enough to call it correctly. The only soft spot is the phrase 'all fields are optional' while the schema requires uuid, which could momentarily confuse an agent about whether the template identifier is optional.
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 every one of the 27 parameters, including complex ones like priceRule expressions and balance expressions, is documented in the schema. The description adds nothing parameter-specific beyond 'lines replaces existing lines', which the schema also states, so the baseline 3 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?
States a specific verb and resource ('Update an existing recurring invoice template'), so the agent knows exactly what entity is being mutated. It does not name or distinguish itself from nearby siblings such as recurring_invoices_create or recurring_invoices_toggle, leaving that inference to the agent.
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?
Provides constraints that shape invocation ('all fields optional but at least one must be provided'), which is genuinely useful usage guidance. However, it never says when to prefer this over recurring_invoices_create, recurring_invoices_toggle, or issue_now, so alternative selection remains implicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
reports_sales_analysisARead-onlyIdempotent
Generate a sales analysis report for a date range. Returns KPI summary (annual total, invoiced, collected, outstanding), monthly revenue trends, recent invoices, top clients, and top products. Requires X-Company header (companyId param or STORNO_COMPANY_ID env var).
| Name | Required | Description | Default |
|---|---|---|---|
| dateTo | Yes | End date in YYYY-MM-DD format (e.g. 2026-02-26) | |
| dateFrom | Yes | Start date in YYYY-MM-DD format (e.g. 2026-01-01) | |
| companyId | No | Company UUID (overrides STORNO_COMPANY_ID env var) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, non-destructive, and closed-world, so the safety profile is covered; the description adds genuine value by listing the returned sections (KPI summary, monthly trends, recent invoices, top clients, top products) and by disclosing the X-Company auth requirement and its env-var fallback. It doesn't mention default ordering, result caps on "recent invoices", or performance cost of wide date ranges.
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 tight sentences: purpose first, then return payload, then the prerequisite. Every sentence carries information an agent needs and nothing is repeated verbatim from the schema beyond what is necessary framing.
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 no output schema, the description correctly takes on the burden of describing the return shape, and it also covers the required auth header — the two things most likely to cause a failed call. It stops short of noting payload size or truncation behavior for the list sections, which matters for a report that aggregates several collections.
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 all three parameters — dateFrom, dateTo, companyId — are already documented with formats and the env-var override. The description restates the date range and the company requirement without adding format, constraint, or edge-case guidance (e.g. max span, dateFrom after dateTo behavior), so the baseline of 3 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?
The description opens with a specific verb and resource ("Generate a sales analysis report for a date range") and enumerates exactly what the report contains. It does not, however, distinguish this from nearby analytics siblings such as reports_vat, reports_vat_oss, balance_analysis, or dashboard_stats, so an agent must infer which reporting tool to pick.
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?
Usage is implied by "for a date range" and by naming the required company context, but there is no explicit when-to-use, when-not-to-use, or pointer to a sibling report for a different analytical need. Given how many overlapping report/analysis tools exist, this leaves real selection work to the agent.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
reports_vatARead-onlyIdempotent
VAT (TVA) summary of a period: issued (collected) and received (deductible) invoices totalled and broken down by VAT rate, net VAT and invoice counts, in the invoice currencies. Period: year+month (default: current month), year+quarter, year+period=year (whole year) or from+to (YYYY-MM-DD). Filters: direction (outgoing|incoming), clientId, supplierId, currency (ISO code), vatRate (only the lines at that rate count), documentType (invoice|credit_note), finalOnly (leave drafts, rejected and converted documents out). Requires X-Company header (companyId param or STORNO_COMPANY_ID env var).
| Name | Required | Description | Default |
|---|---|---|---|
| to | No | Range end, YYYY-MM-DD (with from) | |
| from | No | Range start, YYYY-MM-DD (with to) | |
| year | No | Report year (default: current year) | |
| month | No | Report month (1–12); the default period when no quarter / period / range is given | |
| period | No | 'year' for the whole year | |
| quarter | No | Quarter (1–4) instead of a month | |
| vatRate | No | Only the lines at this VAT rate (e.g. 21); totals are then summed from those lines | |
| clientId | No | Only invoices of this client (UUID) | |
| currency | No | Only invoices in this currency (ISO code, e.g. RON) | |
| companyId | No | Company UUID (overrides STORNO_COMPANY_ID env var) | |
| direction | No | Only issued or only received invoices | |
| finalOnly | No | Leave drafts, rejected and converted documents out (cancelled ones never count) | |
| supplierId | No | Only invoices of this supplier (UUID) | |
| documentType | No | Only invoices or only credit notes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint and non-destructive, so the safety profile is covered. The description adds real value on top: the mandatory X-Company header resolved via companyId or STORNO_COMPANY_ID, that cancelled documents never count, and that finalOnly excludes drafts/rejected/converted. It does not mention volume limits or pagination for large result sets.
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?
Front-loads what the report returns before moving to period formats and filters, so an agent gets the payload first. It is dense but well ordered; the main inefficiency is re-listing parameters the schema already documents at 100% coverage.
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 no output schema and 14 optional parameters, the description does the necessary work of describing the returned totals and breakdown, plus the auth header requirement. Missing is any statement distinguishing it from reports_vat_oss and any note on result size for wide ranges.
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 every one of the 14 parameters is already documented. The description largely restates the schema (direction, clientId, supplierId, currency, vatRate, documentType, finalOnly) without adding syntax or interaction rules beyond noting that vatRate restricts the summed lines. Baseline 3 applies since the schema does the heavy lifting.
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?
States a specific resource and scope: VAT (TVA) summary for a period, with issued vs received invoices totalled and broken down by VAT rate. The output shape is spelled out concretely. It does not, however, differentiate itself from the sibling reports_vat_oss, whose domain overlaps enough that an agent could hesitate between 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 explains how to configure the period (year+month, year+quarter, period=year, from+to) and enumerates filters, which implies usage but never states when to pick this report over reports_vat_oss, balance_analysis or reports_sales_analysis. No exclusions or prerequisites are given beyond the X-Company header requirement.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
reports_vat_ossARead-onlyIdempotent
Quarterly OSS (One Stop Shop, EU special scheme) view of the VAT: VAT charged to consumers in other EU member states, grouped by state of consumption, rate and invoice currency, converted to EUR at the ECB rate of the last day of the quarter (the D398 rule). Returns the payment due date (end of the month after the quarter), the unique reference RO//Q. and the ANAF OSS account. EUR amounts are null while the quarter is still running (no ECB rate yet).
| Name | Required | Description | Default |
|---|---|---|---|
| year | Yes | Report year (e.g. 2026) | |
| quarter | Yes | Quarter (1–4) | |
| companyId | No | Company UUID (overrides STORNO_COMPANY_ID env var) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/non-destructive, so the description is free to add the genuinely useful behavior: conversion at the ECB rate of the last day of the quarter (D398 rule), the null EUR amounts while the quarter is running, and the RO/<vatCode>/Q<n>.<year> reference format. It does not cover authorization requirements or what happens for non-OSS companies, which is the remaining gap.
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?
Front-loaded with purpose, then return values, then the null-amount caveat — every sentence carries information. It is dense with domain jargon (D398, ANAF, OSS) in a single long sentence, which costs a little readability but no waste.
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 no output schema, the description carries the burden of describing returns and does so well: grouping dimensions, EUR conversion, payment due date, reference number, ANAF OSS account, and the null-amount condition. Missing only the concrete response shape/field names and any error or eligibility conditions.
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 year, quarter and companyId are already documented in the schema. The description adds only indirect meaning (quarter is the OSS filing quarter) and no format, default, or override semantics beyond the schema; baseline 3 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?
The description states a specific resource and scope: a quarterly OSS (EU One Stop Shop) VAT view grouped by member state, rate and currency. It is clearly distinct from a generic VAT report, but it never names the sibling reports_vat to draw the contrast explicitly.
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?
Usage is only implied: an agent can infer it is the right tool when it needs the EU OSS quarterly breakdown, but there is no explicit when-to-use statement, no exclusion (e.g., 'for domestic VAT use reports_vat'), and no prerequisites such as the need for an OSS-registered VAT code.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
spv_documents_downloadARead-onlyIdempotent
Download the archived PDF of an SPV document to a local file. Fails with SPV_FILE_PENDING when the agent has not fetched it yet, or SPV_FILE_PURGED when retention removed it.
| Name | Required | Description | Default |
|---|---|---|---|
| uuid | Yes | SPV document UUID | |
| companyId | No | Company UUID (overrides STORNO_COMPANY_ID env var) | |
| outputPath | Yes | Local file path to write the PDF to |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and destructiveHint=false, so the safety profile is covered. The description adds useful behavioral context beyond annotations by disclosing the two failure modes and the pending-fetch prerequisite, though it omits local-file overwrite semantics.
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 compact sentences with no wasted wording. The purpose is front-loaded and the failure conditions follow naturally.
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 download tool without an output schema, the description covers what it does, where it writes, and its main failure modes. It could mention the success return value or overwrite behavior, but the key invocation context is present.
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 each parameter is already documented. The description only indirectly reinforces that outputPath is a local file path and adds no syntax or format guidance beyond the schema, making the baseline 3 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 gives a specific verb ('Download') and resource ('archived PDF of an SPV document') plus the destination ('local file'). It clearly distinguishes this tool from siblings like spv_documents_get or spv_documents_list.
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 states an important precondition: downloading fails with SPV_FILE_PENDING unless the document has already been fetched, and SPV_FILE_PURGED if retention removed it. It does not explicitly name alternative tools or when-not-to-use cases, so it falls short of full routing guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
spv_documents_getBRead-onlyIdempotent
Get one archived SPV document with all details (ANAF ids, dates, archive status, download errors).
| Name | Required | Description | Default |
|---|---|---|---|
| uuid | Yes | SPV document UUID | |
| companyId | No | Company UUID (overrides STORNO_COMPANY_ID env var) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, destructiveHint=false and openWorldHint=false, so the safety profile is covered. The description adds genuine value by enumerating what the record contains (ANAF ids, dates, archive status, download errors), but says nothing about behavior for missing UUIDs or access to non-archived documents.
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?
A single front-loaded sentence with no filler; the parenthetical field list is informative rather than bloated. Slightly more structure (e.g. a clause on the UUID or on sibling choice) could be added without cost.
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?
There is no output schema, so the description carries the return-value burden, and it does list the main returned data categories. For a two-parameter read tool with full annotation coverage this is close to sufficient; only the missing-entity behavior and the companyId override caveat are absent.
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 both parameters (uuid, companyId) are documented in the schema, so the baseline of 3 applies. The description adds no meaning beyond the schema; notably it ignores the companyId override parameter and its env-var fallback interaction.
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?
States a specific verb and resource ('Get one archived SPV document') plus the scope of returned data, which distinguishes a single-record fetch from the sibling list/stats tools by implication of 'one'. It never names spv_documents_list or spv_documents_download explicitly, so the contrast is inferred rather than stated.
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 no when-to-use or when-not guidance and does not point to alternatives such as spv_documents_download for the file itself or spv_documents_list for enumeration. 'archived' hints at scope but the agent must guess the boundary on its own.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
spv_documents_listARead-onlyIdempotent
List the archived ANAF SPV inbox for a company: every message (somatii / enforcement notices, decizii, notificari, adrese, recipise, certificate, plati...) classified by category and severity, with archived-PDF status. Critical items (SOMATII, inactivation/VAT-cancellation decisions, risk reports) carry short legal deadlines. Documents get into the archive through the local storno-agent sync (certificate/mTLS), see spv_sync_prepare.
| Name | Required | Description | Default |
|---|---|---|---|
| to | No | ANAF date to (YYYY-MM-DD) | |
| from | No | ANAF date from (YYYY-MM-DD) | |
| page | No | Page number (default: 1) | |
| limit | No | Items per page (default: 10, max: 100) | |
| search | No | Search in message type, details or ANAF id | |
| unread | No | Only documents not yet read | |
| category | No | Filter by category | |
| severity | No | Filter by severity | |
| companyId | No | Company UUID (overrides STORNO_COMPANY_ID env var) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/non-destructive, so the safety bar is low. The description adds genuinely non-redundant context: results are archive-only, each item carries a category, a severity, and archived-PDF status, and critical items (SOMATII, inactivation/VAT-cancellation decisions, risk reports) come with short legal deadlines that create urgency the agent should surface.
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 'what it lists' and then the risk/deadline nuance. Dense but every clause carries information; the parenthetical message-type list is slightly long but reinforces scope.
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 list tool with a fully described schema and no output schema, the description covers scope, contents, classification axes, and provenance. What is missing is any hint of the response envelope (total count, pagination behavior) despite page/limit params, but that is a minor gap.
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 every one of the nine parameters is already documented in the schema, and the description adds no syntax or format detail. It does add domain meaning to the severity axis by naming which categories are 'critical', which marginally deepens the schema's flat enum.
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?
States a specific verb and resource ('List the archived ANAF SPV inbox for a company') and enumerates what the listing contains (message types, category, severity, archived-PDF status). It does not explicitly contrast itself with siblings like spv_documents_get or spv_documents_stats, so an agent must infer that this is the collection-level read.
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 explains the data provenance ('documents get into the archive through the local storno-agent sync, see spv_sync_prepare'), which tells the agent the archive is pre-populated rather than fetched live here. However, it never states when to pick this over spv_documents_get, spv_documents_stats, or spv_requests_list, and gives no exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
spv_documents_mark_readAIdempotent
Mark one SPV document as read (or all unread documents of the company when uuid is omitted).
| Name | Required | Description | Default |
|---|---|---|---|
| uuid | No | SPV document UUID; omit to mark everything read | |
| companyId | No | Company UUID (overrides STORNO_COMPANY_ID env var) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare readOnlyHint=false, idempotentHint=true, and destructiveHint=false, so safety is largely covered. The description still adds real value by disclosing the blast radius: omitting uuid marks ALL unread company documents read, which is the main behavioral risk an agent must know. It does not mention reversibility or required permissions, keeping it short of a 5.
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?
A single well-formed sentence with the primary action first and the bulk condition folded into a parenthetical. Every clause is load-bearing; nothing is redundant.
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 only two optional params, full annotations, and no output schema, the description covers what an agent needs to call it correctly, especially the bulk-read footgun. Minor gaps remain around the multi-tenant context (companyId override) and confirmation of what the call returns.
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 description only restates the uuid omission semantics already present in the schema. The companyId parameter (which overrides STORNO_COMPANY_ID) is never mentioned in the description, so no meaning is added beyond the schema — baseline 3.
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 states a specific verb and resource ("Mark one SPV document as read") and immediately qualifies the scope with the bulk variant. It is clearly distinguishable from siblings like spv_documents_list, spv_documents_get, and spv_documents_download, though it doesn't explicitly name 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 parenthetical explains the conditional behavior that selects the bulk path ("when uuid is omitted"), which is genuine invocation guidance. However, it says nothing about when this tool should be preferred over related operations or any prerequisites (e.g., must the document be fetched/list first).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
spv_documents_statsARead-onlyIdempotent
Counts for the SPV inbox archive of a company: total, unread, PDFs still to download, breakdown by category and by severity, plus the category and severity lists.
| Name | Required | Description | Default |
|---|---|---|---|
| companyId | No | Company UUID (overrides STORNO_COMPANY_ID env var) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and non-destructive behavior, so safety is covered; the description earns credit by disclosing what is actually counted (total, unread, PDFs still to download) and that both aggregate breakdowns and the raw category/severity lists are returned. That is return-shape context the annotations do not supply.
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?
A single front-loaded sentence that begins with the verb and resource, then enumerates the returned metrics with zero filler. Every clause contributes information about the output.
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 no output schema, the description carries the burden of describing return values and does so by enumerating the counters and lists. The only notable absence is any note on scoping default (company from env vs. explicit ID), which the schema covers only partially, and no indication of what an empty archive returns.
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?
Only one parameter, companyId, and the schema already documents it at 100% coverage, including the STORNO_COMPANY_ID env-var override. The description adds no further parameter meaning, so the baseline 3 for full schema coverage 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?
The description names a specific verb (counts) and a precise resource (the SPV inbox archive of a company) and enumerates the metrics returned, so an agent knows this is the aggregate/stats view rather than a listing. It never explicitly contrasts itself with siblings like spv_documents_list, but the noun 'counts' plus the metric enumeration makes the distinction inferable.
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?
There is no explicit 'use this when...' statement and no named alternative; the usage is only implied by the resource and by the existence of spv_documents_list in the sibling set. An agent can infer this is the dashboard-style summary endpoint, but must reason about it rather than being told.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
spv_document_uploadA
Step 3 of an SPV inbox sync: store the PDF the agent fetched from ANAF descarcare for a document. Pass the body base64-encoded. HTML answers (expired SPV session) are rejected with SPV_NOT_A_DOCUMENT.
| Name | Required | Description | Default |
|---|---|---|---|
| uuid | Yes | SPV document UUID (from spv_sync_agent_result documents[]) | |
| companyId | No | Company UUID (overrides STORNO_COMPANY_ID env var) | |
| bodyBase64 | Yes | Response body, base64-encoded | |
| statusCode | Yes | HTTP status ANAF returned for descarcare |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false and idempotentHint=false, so the mutation profile is known. The description adds genuinely new behavior: HTML responses from an expired SPV session are rejected with SPV_NOT_A_DOCUMENT, and the body must be base64. It omits what happens on a repeated uuid (relevant given idempotentHint=false) and whether an existing stored file is overwritten.
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 sentences, no filler, with the workflow position, encoding requirement, and failure mode all front-loaded in that order.
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 four-parameter mutation with no output schema, the description covers workflow position, input encoding, and a key error case. It leaves the success response shape and overwrite/duplicate semantics unstated, which is a moderate but not severe gap.
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 each of the four parameters already documented, including that uuid comes from spv_sync_agent_result documents[]. The description's 'pass the body base64-encoded' largely restates the bodyBase64 schema text, adding little beyond the high-coverage schema 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?
States a specific verb and resource: store the PDF fetched from ANAF descarcare for a given SPV document, and anchors it as step 3 of an SPV inbox sync. This is clearly distinguishable from siblings like spv_documents_download or spv_sync_agent_result.
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 'step 3 of an SPV inbox sync' framing gives clear situational context and implies the prerequisite that the agent already fetched the descarcare response. It does not explicitly name alternative tools or a 'do not use when' case, so it falls short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
spv_request_agent_resultA
Step 2 of an SPV request: relay the raw ANAF answer to cerere ({id_solicitare, titlu} or {eroare}). Records the ANAF request id or the error on the request.
| Name | Required | Description | Default |
|---|---|---|---|
| body | Yes | Raw ANAF response body (JSON) | |
| companyId | No | Company UUID (overrides STORNO_COMPANY_ID env var) | |
| requestId | Yes | Request UUID from spv_request_prepare | |
| statusCode | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false, idempotentHint=false, destructiveHint=false, and openWorldHint=false. The description adds that it records the ANAF request id or error, but does not explain retry behavior, required permissions, or what happens if the same response is relayed twice.
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 step number, with no redundant filler. It is appropriately sized for a step-2 relay tool.
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 step context and body shape are useful, but the description does not explain the required statusCode parameter or make the handoff from spv_request_prepare explicit. Given that annotations cover the safety profile and schema covers most parameters, the remaining gap is moderate.
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 75%, with requestId, body, and companyId already documented in the schema. The description meaningfully extends body semantics by specifying the expected payload shapes ({id_solicitare, titlu} or {eroare}), though statusCode remains undocumented.
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?
States a specific action and resource: relay the raw ANAF answer and record the ANAF request id or error on the request. The 'Step 2' framing distinguishes it from the prepare step, although it does not explicitly name the sibling 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 'Step 2' framing implies it should be called after a prepare step with a raw ANAF response. However, the description gives no explicit when/when-not guidance and does not name alternatives such as spv_request_prepare or spv_request_delete.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
spv_request_deleteADestructiveIdempotent
Delete a pending or failed SPV request record (answered requests keep their history).
| Name | Required | Description | Default |
|---|---|---|---|
| companyId | No | Company UUID (overrides STORNO_COMPANY_ID env var) | |
| requestId | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true and idempotentHint=true, so the safety profile is covered. The description adds real value by disclosing the eligibility restriction that answered requests are exempt and retain history — a non-obvious behavioral rule not present in annotations or 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?
A single front-loaded sentence with the scope restriction in parentheses. Zero waste, no redundant restatement of the tool name.
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 two-parameter delete with full annotation coverage and no output schema, the definition gives enough to act: what is deleted, and what is protected. The only omission is requestId semantics, which is a minor but real gap.
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 only 50%: companyId is documented but requestId has no description anywhere. The description does not explain what a requestId is, where to obtain it, or how companyId's env-var override interacts with it, so it fails to compensate for the coverage gap.
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?
Specific verb (delete) plus resource (SPV request record) with an added scope qualifier: only pending or failed requests. That scope constraint distinguishes it from list/prepare siblings without naming them, so it stops just short of a 5.
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 parenthetical 'answered requests keep their history' functions as an implicit when-not: the agent learns this tool is only valid for pending/failed records. No sibling is named as an alternative, but the eligibility condition is explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
spv_request_prepareA
Step 1 of an SPV request: validate the type and parameters (see spv_request_types). Returns requestId and channel: "ws" with the ANAF cerere URL the local storno-agent must GET with the certificate, or "web" with a form the agent submits to the SPV website (POST /spv-web-request on the agent) for types the web service lacks (C168, certificates, decisions). Relay the answer with spv_request_agent_result. The answer document itself arrives later in listaMesaje with the same id_solicitare and is archived by the inbox sync.
| Name | Required | Description | Default |
|---|---|---|---|
| type | Yes | Exact ANAF request type, e.g. "Fisa Rol", "D300", "Duplicat Recipisa", "Adeverinte Venit" | |
| params | No | Parameters by name: an, luna, motiv, numar_inregistrare, cui_pui, lunai, lunas | |
| companyId | No | Company UUID (overrides STORNO_COMPANY_ID env var) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds substantial behavioral detail beyond the annotations: it explains the returned requestId and channel, describes the 'ws' certificate-based GET flow and the 'web' form submission flow including the POST endpoint, lists categories that require the web channel, and explains how the eventual answer document arrives asynchronously in listaMesaje.
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 front-loaded with the step and purpose, then gives return behavior, routing details, and the asynchronous outcome. Every part contributes operational information, and there is no redundant restatement of the name or annotations.
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 workflow-preparation tool with no output schema, the description covers what is returned, the two channel behaviors, the certificate requirement for the local agent, the web submission fallback, the next relay step, and how the final answer is delivered later. It is complete enough for correct invocation.
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 already 100%, so the baseline is 3. The description adds meaningful semantics by stating that type and params are validated and by directing the agent to spv_request_types for the authoritative list of accepted request types and 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 opens with a specific verb and resource: 'Step 1 of an SPV request: validate the type and parameters.' It distinguishes this preparation step from the downstream relay tool by naming spv_request_agent_result and pointing to spv_request_types for valid values.
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 defines this as the first step in the SPV request workflow and names the relevant companion tools: spv_request_types for validating type/parameters and spv_request_agent_result for relaying the answer. The workflow context is explicit enough that an agent can select this tool without ambiguity.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
spv_requests_listBRead-onlyIdempotent
Requests sent to ANAF SPV for the company, newest first, with status (pending, requested, answered, error), ANAF id_solicitare and the archived answer document id when it arrived.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | ||
| limit | No | ||
| status | No | ||
| companyId | No | Company UUID (overrides STORNO_COMPANY_ID env var) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, destructiveHint=false, so the safety profile is covered. The description adds genuine context beyond that — newest-first ordering and the shape of the returned records including the status lifecycle — but says nothing about pagination defaults, result caps, or behavior when the company has no SPV sync configured.
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?
A single front-loaded sentence that opens with the verb and resource, then layers scope, ordering, and payload. It is dense but every clause carries information; a slightly cleaner split between 'what it does' and 'what it returns' would read better.
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 no output schema, the description does some of the return-value work by naming the key fields, but it omits pagination behavior and the fact that page/limit/status are inputs — meaningful gaps for a four-parameter list endpoint. The essential purpose is conveyed, but the calling contract is only half described.
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 only 25% — only companyId is documented, and its env-var override note lives in the schema, not the description. The description never mentions page, limit, or that status is a filterable input parameter; the status values are presented only as returned fields, which can mislead an agent into thinking no filtering is available.
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?
States a specific verb+resource: lists SPV requests sent to ANAF for the company, with ordering ('newest first') and the fields returned (status, id_solicitare, archived answer document id). It is clearly distinct from spv_documents_list by being about requests rather than documents, though it never names that sibling to make the boundary explicit.
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?
Usage is only implied by the listing nature of the tool; there is no statement of when to use this versus spv_documents_list, spv_request_prepare, or spv_request_types, and no mention of prerequisites such as an active ANAF token or synced company. The agent must infer the workflow from the name.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
spv_request_typesARead-onlyIdempotent
Catalog of what can be requested from ANAF SPV (solicitari): reports (Fisa Rol, VECTOR FISCAL, Situatie Sintetica, Obligatii de plata, Istoric declaratii, Bilant), copies of filed declarations (D300, D394, D112, D212 ...), Duplicat Recipisa, Adeverinte Venit, certificates, decisions. Filtered for the company the way the SPV form does it: a CNP (individual person) gets D212, Duplicat declaratie unica, Adeverinte Venit, Istoric declaratii PF, C168, fisa rol…; a CUI gets the company returns, bilant, decisions. Each entry carries audience and lists the required and optional parameters (an, luna, motiv, numar_inregistrare, cui_pui, lunai/lunas), the first year with data, ANAF notes and wsSupported (false = the web service answers "tip raport necunoscut"; the agent then submits the SPV website form instead, e.g. C168, certificates, decisions); also the exact reasons accepted for income certificates.
| Name | Required | Description | Default |
|---|---|---|---|
| all | No | true = the whole catalog; default = only what the SPV form offers the company (a CNP sees a different list than a CUI) | |
| companyId | No | Company UUID (overrides STORNO_COMPANY_ID env var) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover safety (readOnly, idempotent, non-destructive, closed-world), so the bar is lower, and the description still adds real substance: each entry carries an `audience` field, per-entry required/optional parameter lists, first year with data, ANAF notes, and the meaning of wsSupported. That wsSupported=false explanation is genuinely non-obvious behavioral disclosure an agent could not derive from 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 catalog purpose is front-loaded, but everything else is packed into a single dense run-on sentence with semicolon-separated enumerations. Each clause carries information, yet the prose-list format makes it hard to scan, and the trailing note about 'exact reasons accepted for income certificates' dangles without a clear connection to the tool's behavior.
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?
There is no output schema, so the entry-shape disclosure (audience, params, first year, notes, wsSupported) is doing essential work and is present. What's missing is any statement of how this catalog should be consumed next — i.e. that the selected type feeds into spv_request_prepare — leaving the workflow link implicit.
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 both parameters are already documented. The description nonetheless adds meaning beyond the schema by explaining what the default filter actually does — a CNP sees D212, Duplicat declaratie unica, C168, while a CUI sees company returns, bilant and decisions — which clarifies the `all` toggle far more concretely than its schema text.
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 names a concrete resource (the catalog of request types available in ANAF SPV) and concretely enumerates its contents (Fisa Rol, VECTOR FISCAL, D300, Adeverinte Venit, etc.), so an agent knows exactly what this returns. It does not, however, draw the boundary against siblings like spv_request_prepare or spv_requests_list, which is the missing piece for a 5.
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?
Usage is only implied by the word 'Catalog' — the reader must infer this is the discovery step before calling spv_request_prepare. The one genuine routing rule given is conditional behavior downstream: when wsSupported=false the agent should submit the SPV website form instead. No explicit when-to-use or when-not-to-use statement relative to alternatives is present.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
spv_sync_agent_resultA
Step 2 of an SPV inbox sync: relay the raw ANAF listaMesaje response fetched by the agent. Every message is archived and classified, users are notified (push/email) about critical and important documents, and the response lists the PDFs the agent should now fetch from descarcare and upload with spv_document_upload.
| Name | Required | Description | Default |
|---|---|---|---|
| body | Yes | Raw response body from ANAF (JSON) | |
| companyId | No | Company UUID (overrides STORNO_COMPANY_ID env var) | |
| statusCode | Yes | HTTP status ANAF returned |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the annotations by disclosing real side effects: every message is archived and classified, and users are notified by push/email for critical and important documents. That is meaningful context for a non-readOnly, non-idempotent tool. It stops short of saying whether re-posting the same body duplicates archives or how error/statusCode failures are handled.
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?
A single dense sentence that front-loads the step identifier and then the action, with no filler. Slightly overloaded by listing three side effects plus the next step, but every clause earns its place.
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 no output schema, the description carries the burden of explaining the return value, and it does so explicitly (the list of PDFs to fetch). Combined with the disclosed side effects, an agent has enough to call it correctly; only error-path and duplicate-handling behavior are unaddressed.
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 parameters are already documented; the description only confirms that body is the raw listaMesaje payload. It never mentions the companyId override parameter, so it adds little beyond the schema. Baseline 3 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?
States a specific verb and resource (relay the raw ANAF listaMesaje response) and anchors it as 'Step 2 of an SPV inbox sync', which cleanly separates it from spv_sync_prepare and spv_document_upload in the same pipeline.
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?
Gives clear ordering context (this runs after the agent has fetched the response) and explicitly names the follow-up path: fetch PDFs from descarcare and upload via spv_document_upload. It does not state exclusions or what to do if the sync is invoked out of sequence, so not a full 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
spv_sync_prepareA
Step 1 of an SPV inbox sync. Returns the ANAF listaMesaje URL the local storno-agent must GET with the qualified certificate (mTLS; the OAuth token is not accepted by SPVWS2), plus any PDFs still pending download. Relay the ANAF response with spv_sync_agent_result.
| Name | Required | Description | Default |
|---|---|---|---|
| days | No | How many days back to list (default and max: 60) | |
| companyId | No | Company UUID (overrides STORNO_COMPANY_ID env var) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Adds auth context beyond the annotations: mTLS with the qualified certificate is required and the OAuth token is rejected by SPVWS2, which is a crucial constraint for the calling agent. It also discloses the payload (URL + pending PDFs) rather than only repeating the annotation hints; it doesn't contradict readOnlyHint=false, since preparation likely records sync state.
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 tight sentences, front-loaded with the step/purpose, then the call mechanics, then the handoff. Every sentence adds information with 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?
With no output schema, the description correctly explains what is returned (the listaMesaje URL and pending PDFs) and the required auth. The only minor gap is the shape and structure of the pending PDFs payload, but the essentials for correct invocation are present.
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 days and companyId are already fully documented in the schema. The description adds no extra meaning about these parameters (e.g., defaulting behavior or how companyId interacts with the env var), so the baseline 3 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?
States a specific verb and resource: 'Step 1 of an SPV inbox sync' that returns the ANAF listaMesaje URL plus pending PDFs. It is clearly distinguishable from the sibling spv_sync_agent_result, which is named as the relay step.
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?
Gives the operational context: the returned URL must be GET with the qualified certificate (mTLS), and the response must then be relayed via spv_sync_agent_result. It clearly places this call in a two-step flow, though it does not state what to do if the flow is out of order or what happens on repeated calls.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
storage_config_deleteADestructiveIdempotent
Delete the external storage configuration. Files already stored externally will no longer be accessible. This does NOT delete files from the external bucket.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true and idempotentHint=true, so the safety profile is covered; the description goes further by spelling out the real-world consequence (existing externally stored files become inaccessible) and the important boundary (files in the external bucket are NOT deleted). That is precisely the context an agent needs before invoking a destructive 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?
Three short sentences, front-loaded with the action, then consequence, then the non-consequence. Every sentence carries distinct information and nothing is repeated.
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?
Zero params, no output schema, and annotations cover the safety profile, so the description is close to sufficient. It omits what happens after deletion (e.g., whether storage falls back to a default or local backend, and whether elevated permissions are required), which would matter for an agent deciding to call it.
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 tool takes zero parameters, so there is nothing for the description to disambiguate; baseline 4 applies. No misleading parameter language is present.
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?
States a specific verb+resource ('Delete the external storage configuration') that is unambiguously distinct from siblings like storage_config_get, storage_config_update, and storage_config_test. An agent can tell exactly what object is removed without opening the schema.
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?
Usage is only implied: the description conveys that this tears down external storage and makes existing files inaccessible, which signals caution, but it never states when to prefer this over reconfiguring via storage_config_update or what prerequisites must hold. No explicit when/when-not or alternative routing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
storage_config_getARead-onlyIdempotent
Get the organization's external storage configuration. Returns the current provider, bucket, region, and connection status. External storage allows storing PDFs and XMLs in your own S3-compatible bucket.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover read-only, idempotent, non-destructive, and non-open-world behavior. The description adds useful context about what is returned (provider, bucket, region, connection status) and explains what external storage is for.
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 short sentences, front-loaded with the operation and return fields, followed by only relevant external-storage context. There is no wasted text.
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 zero-parameter, read-only getter with rich annotations and no output schema, the description is sufficiently complete: it states what is retrieved, the fields returned, and the purpose of external storage.
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?
There are no parameters, so parameter semantics are minimal. Schema coverage is 100%, and the description appropriately does not invent parameter details.
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 clear verb and resource: "Get the organization's external storage configuration." It also names the returned fields, making the operation specific, though it does not explicitly contrast with storage_config_update, storage_config_test, or storage_config_delete.
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?
Usage is implied by the "Get" verb and the return fields described, but the description gives no explicit guidance on when to use this versus update/test/providers/delete siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
storage_config_providersARead-onlyIdempotent
List available external storage providers with their configuration requirements and documentation links.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, openWorldHint=false, and destructiveHint=false, so the safety profile is covered. The description adds that results include configuration requirements and documentation links, which is useful return-content context, but it does not discuss authentication needs, result ordering, or pagination. With no output schema, that is a modest gap rather than a major one for a zero-parameter read-only listing.
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?
It is a single front-loaded sentence with no wasted words. The key action and resource appear immediately, followed by the useful detail about what each listed provider contains.
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 zero-parameter, read-only listing tool with rich annotations and no output schema, the description gives enough context about what is returned. It could be slightly stronger by naming the storage_config_* alternatives or noting whether the provider list is static, but nothing essential is missing.
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?
There are zero parameters, so the baseline is 4. The description does not need to explain parameter semantics, and the empty schema is consistent with a no-argument listing call.
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 states a specific verb (List) and resource (available external storage providers), then adds what each entry includes (configuration requirements and documentation links). This distinguishes it from sibling storage_config_get, storage_config_update, storage_config_test, and storage_config_delete, though it does not explicitly name those 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 usage is implied: discover supported storage providers before calling storage_config_update or storage_config_test. However, the description provides no explicit when-to-use guidance, prerequisites, or exclusions relative to the other storage_config_* tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
storage_config_testA
Test the external storage connection. Attempts to write and read a test file to verify credentials and permissions. Uses existing config credentials if not provided.
| Name | Required | Description | Default |
|---|---|---|---|
| bucket | No | Bucket name | |
| region | No | AWS region | |
| endpoint | No | Custom endpoint URL | |
| provider | No | Storage provider to test | |
| accountId | No | Account ID | |
| accessKeyId | No | Access key ID | |
| forcePathStyle | No | Use path-style URLs | |
| secretAccessKey | No | Secret access key |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare readOnlyHint=false, destructiveHint=false, openWorldHint=true, and the description is consistent: it discloses that a test file is written and read, that credentials and permissions are verified, and that existing config is used when params are omitted. It could add whether the test file is cleaned up, but the write/verify behavior is well communicated.
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 sentences, front-loaded with the purpose, then the mechanism, then the credential fallback. 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?
For an 8-param, no-output-schema tool the description covers intent, mechanism, and credential behavior adequately. It lacks detail on how success/failure is reported and whether the test file is removed, which would be useful for an external-storage connectivity check.
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 schema carries the field-level documentation, but the description adds meaningful semantics: all eight params are optional overrides, and omitted values fall back to existing stored config credentials. That clarifies why no params are required.
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?
States a specific verb and resource ('Test the external storage connection') and explains the mechanism (write/read a test file). It is clearly distinguished from storage_config_get/update/delete by the 'test' intent, though it does not explicitly name those siblings.
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 phrase 'Uses existing config credentials if not provided' implies a sensible usage context (run after configuring storage), but there is no explicit guidance on when to use this versus storage_config_get or when not to run it (e.g. against production buckets).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
storage_config_updateBIdempotent
Create or update external storage configuration. Supports S3-compatible providers (AWS S3, Cloudflare R2, MinIO, DigitalOcean Spaces, etc.). Credentials are encrypted at rest.
| Name | Required | Description | Default |
|---|---|---|---|
| bucket | Yes | Bucket name | |
| prefix | No | Key prefix/folder path within the bucket | |
| region | No | AWS region (e.g., "eu-central-1") | |
| endpoint | No | Custom endpoint URL (for non-AWS S3-compatible providers) | |
| isActive | No | Enable or disable external storage | |
| provider | Yes | Storage provider (e.g., "s3", "r2", "minio", "spaces") | |
| accountId | No | Account ID (e.g., for Cloudflare R2) | |
| accessKeyId | No | Access key ID | |
| forcePathStyle | No | Use path-style URLs instead of virtual-hosted (for MinIO) | |
| secretAccessKey | No | Secret access key |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare non-readonly, idempotent, non-destructive behavior. The description adds one genuinely useful behavioral fact — credentials are encrypted at rest — but omits whether existing config is overwritten, whether changes take effect immediately, and any permission requirements for what is effectively a write of sensitive secrets.
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 sentences, front-loaded with the core action, then provider scope, then the security note. No waste, though the provider list is somewhat redundant with the schema's provider examples.
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 no output schema, the description correctly avoids describing return values, and annotations plus 100% schema coverage carry the safety and field details. It could still mention required fields (provider, bucket) or the encryption/validation flow, but for a config upsert it is largely 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 100%, so all ten params are documented in the schema; the description only echoes provider examples already present in the provider property. Baseline 3 applies since the schema does the heavy lifting and the description adds no parameter-level meaning beyond 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?
States a specific verb pair plus resource ('Create or update external storage configuration') and scopes it to S3-compatible storage. An agent can distinguish it from siblings like storage_config_get/delete/test by name and content, though the description never explicitly names those 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?
No guidance on when to use this versus storage_config_test, storage_config_providers, or storage_config_delete, nor any prerequisites (e.g., admin scope, or that credentials should be validated via the test tool afterward). 'Create or update' implies upsert semantics but usage conditions are left entirely to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
storno_xml_generateARead-onlyIdempotent
Generate an e-Factura (UBL 2.1, CIUS-RO) XML for a storno / credit invoice without an account. Public endpoint: nothing is stored, no authentication needed, rate limited per IP. Returns the XML, the XSD + Schematron validation report, and totals. The result is an Invoice (type 380) with negated quantities and a BillingReference to the original document, exactly what Storno issues for stornos. RON only. Use it to correct an invoice already accepted in SPV, or to test XML output before integrating.
| Name | Required | Description | Default |
|---|---|---|---|
| buyer | Yes | ||
| lines | Yes | ||
| seller | Yes | ||
| storno | No | ||
| currency | No | ||
| original | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations, it discloses that nothing is stored, no authentication is needed, rate limiting is per IP, and it returns XML plus XSD/Schematron validation report and totals. It also explains the output structure as type 380 with negated quantities and BillingReference, which is substantial behavioral context for a tool with no output 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?
The description is front-loaded with the core purpose and then packs auth, storage, output, format, business meaning, currency, and usage into a compact block. There is no significant filler, though 'exactly what Storno issues for stornos' is slightly redundant but still clarifying.
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 complex nested generator with no output schema, the description covers what it returns, that it validates against XSD and Schematron, what business document it produces, its currency limitation, and the expected use cases. Remaining field-level detail is appropriately delegated to the input 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 description adds some meaning: currency is RON only, the storno references an original document, and output quantities are negated. However, it does not compensate for low schema coverage by explaining seller, buyer, line-item, or required-field semantics; the nested schema must carry most parameter documentation.
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 states a precise verb and resource: generate an e-Factura UBL 2.1 CIUS-RO XML for a storno / credit invoice. It clearly distinguishes this from normal invoice tools by noting it works without an account and produces an Invoice type 380 with negated quantities and a BillingReference to the original.
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 gives explicit use cases: correct an invoice already accepted in SPV, or test XML output before integrating. It also clarifies the public no-auth context. It does not name sibling alternatives or explicit when-not conditions, so it falls short of the top usage-guidance level.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
suppliers_bulk_deleteADestructiveIdempotent
Soft-delete multiple suppliers in a single request. Returns the count of deleted items and any errors.
| Name | Required | Description | Default |
|---|---|---|---|
| ids | Yes | Array of supplier UUIDs to delete (1-100) | |
| companyId | No | Company UUID (overrides configured default) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations already declare destructiveHint=true and idempotentHint=true, but the description adds the non-obvious fact that this is a *soft* delete rather than permanent removal. It also discloses the return shape—count plus any errors—which hints at partial-failure behavior. It doesn't explain whether partial successes roll back, but it meaningfully exceeds 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 short sentences, purpose front-loaded, return semantics second. No filler or redundancy.
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 no output schema, the description properly states what comes back (count and errors), and the soft-delete disclosure is crucial for a destructive bulk tool. Minor gaps remain around partial-failure semantics and confirmation, but nothing essential to calling it is missing.
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 'ids' (1-100 array) and 'companyId' (overrides configured default) fully documented in the schema. The description adds no parameter-specific detail, so the baseline 3 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?
States a specific verb and scope: 'Soft-delete multiple suppliers in a single request.' The words 'multiple' and 'bulk' clearly distinguish it from the sibling suppliers_delete for single records, so an agent can route correctly without opening the schema.
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?
Usage is only implied by 'multiple' and the bulk naming; it never explicitly says when to choose this over suppliers_delete or another bulk operation. Adequate but no exclusions or confirmation requirements for a destructive action.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
suppliers_createA
Create a new supplier manually. Requires name, county, city, address, and registration number. If a supplier with the same CIF already exists, returns the existing supplier instead.
| Name | Required | Description | Default |
|---|---|---|---|
| cif | No | Tax identification number (CIF) | |
| city | Yes | City | |
| name | Yes | Supplier name | |
| No | Email address | ||
| notes | No | Internal notes | |
| phone | No | Phone number | |
| county | Yes | County | |
| address | Yes | Street address | |
| country | No | Country code ISO 3166-1 alpha-2 (default: RO) | |
| vatCode | No | VAT code (e.g., RO12345678) | |
| bankName | No | Bank name | |
| companyId | No | Company UUID (overrides configured default) | |
| affiliated | No | Affiliated party — D394 sets prsAfiliat = 1 when an affiliated partner appears on an invoice of the period | |
| isVatPayer | No | Whether supplier is a VAT payer (default: false) | |
| postalCode | No | Postal code | |
| bankAccount | No | Bank account (IBAN) | |
| registrationNumber | Yes | Trade registry number (e.g., J40/123/2020) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare this is a non-read-only, non-destructive write, so the description does not need to restate that. It adds a meaningful behavioral trait beyond the annotations: a CIF-based dedupe that returns the existing supplier instead of creating a duplicate.
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 sentences, front-loaded with the action, then the required fields, then the dedupe edge case. No sentence is wasted and the ordering supports quick scanning.
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 17-parameter mutation tool with rich schema descriptions and safety annotations, the description covers purpose, required inputs, and a key edge case. However, with no output schema it does not describe the normal success return value, which would be useful for an agent to know.
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 every parameter is documented in the schema. The description repeats the required fields but adds no format details, defaults, or meaning beyond what the schema already provides, so the baseline 3 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?
States a specific verb and resource ('Create a new supplier') and adds a scope modifier ('manually') that implicitly distinguishes it from bulk import or registry-sync siblings. An agent can identify this as the single-record creation tool without opening the schema.
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 word 'manually' hints that this is for hand-entered suppliers rather than imports, but no alternative tool is named and there is no explicit when-to-use or when-not-to-use guidance. The context is implied rather than stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
suppliers_deleteADestructiveIdempotent
Soft-delete a supplier record. The supplier is marked as deleted but not permanently removed. Existing incoming invoices from this supplier remain intact. If new invoices arrive from this supplier via ANAF sync, the supplier record will be restored automatically.
| Name | Required | Description | Default |
|---|---|---|---|
| uuid | Yes | UUID of the supplier to delete | |
| companyId | No | Company UUID (overrides configured default) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the annotations (destructiveHint=true, idempotentHint=true) by disclosing exact mutation semantics: soft-delete only, related incoming invoices preserved, and automatic un-deletion triggered by a future ANAF sync. That auto-restore behavior is non-obvious and directly affects an agent's decision to call it.
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?
Four short sentences, front-loaded with the operation and its reversibility, then the downstream consequences. No filler, and each sentence adds a distinct fact.
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 mutating delete tool with full schema coverage, the description covers the key behavioral surprises (data retention, auto-restore). Minor gaps remain: no note on required permissions, behavior when the supplier is already deleted, or response shape — though no output schema exists either.
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 only two parameters (uuid required, companyId optional override), so the schema already carries the parameter meaning. The description adds nothing about the uuid target or the companyId override, which is acceptable given full coverage but is baseline-level.
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?
States a specific verb and resource — "soft-delete a supplier record" — and immediately clarifies what that means operationally (marked deleted, not permanently removed). It implicitly contrasts with a hard delete (e.g. suppliers_bulk_delete) but never names a sibling or route.
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?
Usage is implied rather than stated: the soft-delete semantics tell an agent this is the reversible option, but there is no explicit "use this instead of X when Y" and no mention of when a permanent removal or bulk operation would be preferred. Sibling suppliers_bulk_delete is not referenced.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
suppliers_export_csvARead-onlyIdempotent
Export all suppliers for the active company as a CSV file. Returns base64-encoded UTF-8 CSV with BOM.
| Name | Required | Description | Default |
|---|---|---|---|
| companyId | No | Company UUID (overrides configured default) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, non-destructive, closed-world behavior. The description adds genuinely new information: the return is base64-encoded UTF-8 CSV with a BOM, which matters for downstream decoding and is not covered by any output schema. It stops short of noting size limits or what 'active company' resolution means when companyId is absent.
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 tight sentences with zero waste, leading with the operation and following with the return format that an agent needs to handle the result.
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 no output schema and only one optional parameter, the definition covers what the tool does and what it returns well enough to call correctly. Minor gaps remain around default company resolution and any size/volume limits on a full export.
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 single companyId parameter is fully documented as an override of the configured default. The description's 'active company' phrasing adds no syntax detail and slightly muddies the default-vs-override distinction the schema already makes clear.
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?
States a specific verb ('Export'), resource ('all suppliers'), scope ('for the active company'), and format ('CSV file'), so an agent can immediately tell it apart from suppliers_list or suppliers_export_saga_xml. It does not name those siblings explicitly, which keeps it from a 5.
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 phrase 'all suppliers for the active company' implies this is a bulk export with no filtering, hinting at when to prefer it over the paginated suppliers_list. However, it never states when to use this versus suppliers_list or suppliers_export_saga_xml, leaving the choice to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
suppliers_export_saga_xmlARead-onlyIdempotent
Export all suppliers in SAGA accounting XML format. Returns base64-encoded XML file compatible with SAGA import.
| Name | Required | Description | Default |
|---|---|---|---|
| companyId | No | Company UUID (overrides configured default) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, non-destructive and closed-world, so safety is covered. The description adds real behavioral value on top: it returns the file base64-encoded inside the response and is scoped to ALL suppliers with SAGA import compatibility, which tells the agent it gets a blob rather than a path. It stops short of size limits or failure behavior when no company is configured.
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, front-loaded with the action and format, then the return shape. Nothing is wasted or restated from the title.
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 single-parameter read-only export with rich annotations and no output schema, the definition covers what an agent needs: what is exported, the format, and the encoding of the result. Minor gap is the absence of anything about payload size or the 'all suppliers, no filtering' caveat being stated more explicitly.
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?
Only one optional parameter and schema description coverage is 100%, so the schema already fully documents companyId including the override semantics. The description adds no additional parameter guidance, which is acceptable at this coverage level but earns only 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?
States a specific verb and resource (export suppliers) plus the target format (SAGA accounting XML), which cleanly separates it from suppliers_export_csv and from the invoices_/clients_ SAGA variants. An agent can pick the right sibling from this sentence alone.
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?
Usage is implied: the tool is for producing a SAGA-importable file of suppliers. There is no explicit when-to-use/when-not, no mention of the CSV alternative or of prerequisites such as a configured company or completed supplier data.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
suppliers_getARead-onlyIdempotent
Get detailed information about a specific supplier including invoice history summary and the last 10 recent incoming invoices. Core data (name, CUI) comes from ANAF and is read-only.
| Name | Required | Description | Default |
|---|---|---|---|
| uuid | Yes | UUID of the supplier to retrieve | |
| companyId | No | Company UUID (overrides configured default) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true and destructiveHint=false, so the safety profile is covered. The description adds genuinely new behavior: the data originates from ANAF, is read-only at the source, and the invoice history is capped at the last 10 recent incoming invoices — a retrieval limit an agent could not infer from 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, zero filler, with the primary action and return payload front-loaded and the ANAF provenance caveat placed second. Every clause carries 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?
With no output schema, the description correctly compensates by naming the shape of the response (core data plus invoice history summary plus 10 recent invoices) and its source. Minor gap: it does not clarify how the companyId override interacts with the configured default, though the 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 description coverage is 100% for both parameters, so uuid and the companyId override are already fully documented. The description adds nothing about parameter semantics, which is acceptable given the schema does the work — baseline 3.
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?
States a specific verb and resource ('Get detailed information about a specific supplier') and even enumerates the returned payload (invoice history summary, last 10 incoming invoices), which goes beyond the bare name. It does not explicitly contrast with the sibling suppliers_list, so it falls short of 5.
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 single-supplier scope implies the tool is for fetching one record by UUID, but there is no explicit when-to-use or when-not guidance and no pointer to suppliers_list for discovery of the UUID. Usage is inferable rather than stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
suppliers_listARead-onlyIdempotent
List suppliers for the selected company grouped alphabetically. Suppliers are automatically created from incoming invoices via ANAF e-Factura synchronization. Supports search by name, CUI, or email.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | Page number (default: 1) | |
| limit | No | Items per page (default: 50, max: 200) | |
| search | No | Search term to filter by name, CUI, or email | |
| companyId | No | Company UUID (overrides configured default) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, non-destructive, so the safety profile is covered. The description adds genuinely new context: suppliers are auto-provisioned from incoming invoices via ANAF e-Factura sync, which explains why records the agent didn't create exist and why counts may change between calls.
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 sentences, front-loaded with the core action, then context, then capabilities. No filler, though the provenance sentence sits slightly ahead of the more operationally useful search note.
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 paginated list tool with a fully documented schema and safety annotations, the description covers purpose, provenance and search. Missing only minor operational details such as default page size and return shape, which the schema largely covers.
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 all four parameters (page, limit, search, companyId) are already documented. The description restates the search fields (name, CUI, email) but adds nothing about pagination or the companyId override, so baseline 3 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?
States a specific verb and resource ("List suppliers") plus a scope ("for the selected company") and an ordering behavior ("grouped alphabetically"). It is distinguishable from clients_list by resource, but does not explicitly disambiguate against siblings like suppliers_export_csv or suppliers_get.
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?
Usage is implied: fetch the supplier catalog, with search supported. There is no explicit when-to-use/when-not guidance, no pointer to suppliers_get for details or suppliers_create for manual creation, even though several sibling tools operate on the same resource.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
suppliers_updateAIdempotent
Update editable fields of a supplier record. Core data (name, CUI) from ANAF cannot be modified. Only contact information, address details, banking details, and internal notes can be updated.
| Name | Required | Description | Default |
|---|---|---|---|
| city | No | City | |
| uuid | Yes | UUID of the supplier to update | |
| No | Email address | ||
| notes | No | Internal notes about this supplier | |
| phone | No | Phone number | |
| county | No | County | |
| address | No | Street address | |
| country | No | Country code (ISO 3166-1 alpha-2, e.g., "RO") | |
| bankName | No | Bank name | |
| companyId | No | Company UUID (overrides configured default) | |
| postalCode | No | Postal code | |
| bankAccount | No | Bank account (IBAN) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare a non-destructive, idempotent write in a closed world, so the description's job is mainly the exception surface — and it delivers that by naming name/CUI as ANAF-managed and unmodifiable. It does not disclose partial-update semantics (what happens to omitted fields, and whether passing null clears a value), which matters given most properties are nullable.
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 sentences, front-loaded with the action and then the constraint; no filler and no restatement of the name or annotations. The most consequential fact (core data cannot be modified) arrives before any field enumeration.
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 12-parameter mutation with no output schema, the description covers purpose and the immutability constraint but leaves the partial-update contract and the effect of nulls unstated, which is the main ambiguity an agent would hit. Annotations carry the safety profile, so nothing critical is missing about risk, but the update semantics are underspecified.
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 per-field meaning is already documented; the description groups parameters into contact, address, banking and notes categories, adding a little orientation. It says nothing about the required uuid, the null-versus-omit behavior, or the companyId override, so it only modestly exceeds the schema 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 opens with a specific verb and resource ('Update editable fields of a supplier record') and immediately scopes which fields qualify, so an agent knows this is a mutation on an existing supplier rather than a creation or lookup. It does not name the sibling alternatives (suppliers_create, suppliers_get) it is distinguished from, which keeps it short of a 5.
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?
Implicit guidance is present: the ANAF-sourced immutability statement tells the agent not to attempt name/CUI changes, which prevents a class of failed calls. However there is no explicit 'use this when…' framing, no prerequisites (permissions, existing supplier UUID), and no routing to siblings for creating or reading suppliers.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
system_healthARead-onlyIdempotent
Check the Storno API system health status. Returns database, queue, storage, and service diagnostics when authenticated. Useful for troubleshooting connectivity or service issues.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, non-destructive and closed-world, and the description adds value on top: it names the four diagnostic areas returned and flags that results come back "when authenticated". The auth caveat is the key extra signal, though it is ambiguous whether auth is a hard prerequisite or merely affects response depth.
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 sentences ordered purpose → return contents → use case, with no filler. The only mild redundancy is "system health status" overlapping with the later "diagnostics" phrasing.
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 no output schema and no parameters, the description carries the return-value burden and does so by listing database, queue, storage, and service diagnostics. It does not say what a degraded or unauthenticated response looks like, which is the one remaining gap for a health-check 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?
The tool takes zero parameters, so the baseline is 4; there is nothing for the description to disambiguate and it correctly makes no parameter claims. No enums, defaults, or scoping inputs exist to document.
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?
States a specific verb and resource ("Check the Storno API system health status") and enumerates the diagnostic domains returned. It is clear, but it never distinguishes itself from adjacent introspection siblings such as system_version, anaf_status, or agent_status.
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?
"Useful for troubleshooting connectivity or service issues" gives an explicit use context, which is enough to route an agent here during incident triage. It stops short of exclusions or naming an alternative for narrower checks (e.g. version lookup or ANAF status).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
system_versionARead-onlyIdempotent
Get backend version plus web and mobile (iOS/Android/Huawei) latest+min versions and store URLs. Pass platform to get a flat client object for that mobile surface, and version to also get a resolved gate with tier (blocking/recommended/ok/unknown) so you do not have to compare versions yourself.
| Name | Required | Description | Default |
|---|---|---|---|
| version | No | Current client version (e.g. `1.4.2`). Only honoured when `platform` is also supplied. Drives the `gate.tier` field. | |
| platform | No | Mobile platform to get a flat `client` object for. Omit for the full payload. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish readOnly/idempotent/non-destructive and closed-world, so the safety burden is lifted. The description adds genuine behavioral value: it discloses the resolved `gate.tier` values (blocking/recommended/ok/unknown) and that resolution is done server-side so the agent needn't compare versions itself. Missing only auth/rate-limit or caching notes.
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 what is returned and followed by the conditional behaviors. No filler, no restatement of the tool name, and every clause carries a fact the agent needs.
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?
There is no output schema, so the description must carry the return contract; it covers the full payload, the flat `client` object, store URLs, and the `gate.tier` resolution with its value set. That is sufficient to call the tool correctly, with only minor gaps around the exact shape of the full payload.
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, but the description adds semantics the schema does not: it names the output shape each parameter produces (`client` object, `gate` with `tier`) and enumerates the tier values. The `version`-requires-`platform` dependency is repeated from the schema, which is the only redundancy.
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?
Specific verb (Get) plus a precisely enumerated resource: backend version, web/mobile latest+min versions, store URLs. The scope is unlike any sibling (system_health, admin_version_overrides), so an agent can identify it without opening the schema.
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 clearly explains the two usage modes: omit platform for the full payload, supply platform to get a flat `client` object, and add version to obtain a resolved `gate`. It stops short of naming an alternative tool or stating when not to use this one, so it is context-rich but not fully exclusive.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
telemetry_sendA
Send a batch of telemetry events for the current user and company. Events are processed asynchronously. Maximum 100 events per batch. Telemetry is always sent to api.storno.ro regardless of configured base URL.
| Name | Required | Description | Default |
|---|---|---|---|
| events | Yes | Array of telemetry events to send | |
| platform | No | Platform identifier (default: "cli") | |
| companyId | No | Company UUID (overrides STORNO_COMPANY_ID env var) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Adds real context beyond the annotations: asynchronous processing (so no immediate result to inspect), a hard 100-event batch limit, and the notable fact that data is always sent to api.storno.ro regardless of configured base URL — which matches openWorldHint=true and matters for privacy/proxy setups. It does not say what happens when the limit is exceeded or whether failures are retried, keeping it from a 5.
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?
Four short sentences, each carrying distinct information (what, async behavior, batch limit, endpoint override), with the core action front-loaded. Nothing is redundant with the tool name or annotations.
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?
Covers the operational essentials for a fire-and-forget write tool with no output schema: batching limit, async semantics, and destination endpoint. Auth requirements and failure/retry behavior are unstated, which is the only meaningful gap.
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, but the description contributes the batch-size constraint on the events array and frames the company context that companyId controls. The platform parameter and timestamp defaulting are left entirely to the schema, which is acceptable given full 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?
States a specific verb (Send) and resource (batch of telemetry events) plus the scope (current user and company). No sibling tool competes in this namespace, so an agent can identify it immediately, though it does not explicitly distinguish itself from anything else.
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?
Usage is implied by the description — an agent infers it should call this when it has telemetry events to report — but there is no explicit when-to-use or when-not-to-use guidance, and no mention of whether earlier batching or deferral is preferred. The 100-event cap gives a practical batching hint but not a selection rule.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
vat_category_codes_listARead-onlyIdempotent
List all available VAT category codes with their i18n message keys. Codes: S (standard rate), Z (zero-rated), E (exempt from tax), AE (reverse charge), K (exempt for export), L (intra-community supply), O (outside scope), M (margin scheme). Does not require authentication.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, destructiveHint=false and openWorldHint=false, so the safety profile is covered. The description adds a genuinely non-redundant trait — 'Does not require authentication' — which the annotations do not express, plus the static/non-parameterized nature of the result.
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 purpose statement is front-loaded in the first clause, followed by a compact parenthetical list, then the auth note. Every element earns its place, though the inline code list makes the sentence long and slightly list-like rather than scannable.
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 no output schema, the description carries the burden of describing the return value, and it does so by naming both the codes and their i18n message keys and enumerating the code set. What is missing is the shape of each record (field names) and whether codes ever change, but for a simple static lookup this is close to 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?
The tool takes zero parameters, so there is nothing for the description to clarify; the baseline for 0-param tools applies. The enumeration of codes is a bonus that helps the agent interpret the response rather than a parameter explanation.
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?
States a specific verb and resource ('List all available VAT category codes') and then enumerates each code with its meaning, so the agent knows exactly what the payload will contain. It does not explicitly distinguish itself from the sibling vat_rates_list, but the enumerated content makes the difference inferable.
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 its use case (fetching the fixed enum of VAT category codes) but never says when to prefer it over vat_rates_list or how the codes should be applied to invoice line items. The only explicit guidance is the authentication note, which is about access, not usage selection.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
vat_rates_createA
Create a new VAT rate for the active company. If isDefault is true, any existing default rate is demoted. If this is the first VAT rate, it automatically becomes the default. Common e-Factura category codes: S=standard, AA=reduced, E=exempt, O=outside scope, Z=zero rated, AE=reverse charge.
| Name | Required | Description | Default |
|---|---|---|---|
| rate | Yes | VAT percentage (e.g., 19 for 19%, 0 for exempt) | |
| label | Yes | Display label shown in dropdowns (e.g., "TVA 19%", "Scutit") | |
| position | No | Display order position in dropdowns (lower = first). Auto-assigned if not provided. | |
| companyId | No | Company UUID override (uses active company if not set) | |
| isDefault | No | Set this as the default VAT rate for new invoice lines (default: false) | |
| categoryCode | No | e-Factura category code (default: "S"). Options: S, Z, E, AE, K, L, O, M |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations cover readOnlyHint=false, idempotentHint=false, and destructiveHint=false. The description adds meaningful behavioral context beyond annotations: setting isDefault demotes the existing default, and the first VAT rate automatically becomes default. It does not mention duplicate handling or side effects on existing invoice lines, so not a 5.
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, front-loaded with the core action, and every sentence adds useful information about defaults or category codes. There is no redundant or filler text.
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 create mutation with full schema coverage and annotations, the description supplies the key behavioral details: default demotion and automatic first-rate defaulting. It could mention whether duplicate rates are allowed or how companyId override interacts with the active company, but the essentials are covered.
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 real meaning for categoryCode by explaining common e-Factura codes and clarifies the isDefault side effect. A minor inconsistency exists: it lists AA=reduced, which is not in the schema's option list (S, Z, E, AE, K, L, O, M), and omits K, L, M.
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 states a specific verb and resource: 'Create a new VAT rate for the active company.' It clearly distinguishes creation from sibling tools like vat_rates_update, vat_rates_delete, and vat_rates_list.
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 purpose implies when to use the tool, but there is no explicit guidance on when to choose it over vat_rates_update or vat_category_codes_list. No alternatives or exclusions are named.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
vat_rates_deleteADestructiveIdempotent
Soft-delete a VAT rate. The rate is marked as deleted but not physically removed, preserving historical invoice integrity. Cannot delete the default rate (set another as default first) or the last remaining rate. Existing invoices are not affected.
| Name | Required | Description | Default |
|---|---|---|---|
| uuid | Yes | VAT rate UUID to delete | |
| companyId | No | Company UUID override (uses active company if not set) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Adds real context beyond the annotations: destructiveHint=true would suggest hard removal, but the description clarifies the record is only marked deleted, historical invoice integrity is preserved, and existing invoices are unaffected. Gap: it never says whether the soft-delete is reversible (there is no vat_rates_restore sibling) or what happens on a repeat call, despite idempotentHint=true.
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?
Four short sentences, front-loaded with the verb and the soft-delete semantics, followed by the blocking constraints and the invoice-impact reassurance. No filler and no repetition of the schema.
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 two-parameter mutation with no output schema, the description covers side effects, invariants, and preconditions well. It leaves the response shape and reversibility undefined, which are the only meaningful omissions.
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 (uuid, companyId) are documented in the schema, so the baseline applies. The description adds nothing about the uuid targeting or the active-company override behavior, so the schema does all the work.
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?
Specific verb + resource ('Soft-delete a VAT rate') with the mutation semantics spelled out immediately. It is trivially distinguishable from sibling operations like vat_rates_update, vat_rates_create, and vat_rates_list without opening any schema.
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?
Gives clear preconditions and the workaround ('Cannot delete the default rate (set another as default first) or the last remaining rate'), which is exactly the guidance an agent needs before calling. It does not name alternatives or explicitly say when not to reach for this tool, but for a delete with no competing sibling there is little to route between.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
vat_rates_listARead-onlyIdempotent
List all VAT rates configured for the active company, sorted by display position. Returns rate percentage, display label, e-Factura category code, and which rate is the default. Common Romanian rates: 19% (standard), 9% (reduced), 5% (super-reduced), 0% (exempt).
| Name | Required | Description | Default |
|---|---|---|---|
| companyId | No | Company UUID override (uses active company if not set) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, closed-world, and non-destructive, so the safety profile is covered. The description goes beyond them by disclosing the sort order and enumerating exactly which fields are returned (percentage, label, e-Factura category code, default flag), which is meaningful because no output schema exists. It does not mention permission requirements or whether the list is user-editable, so it stops just short of a 5.
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 first sentence front-loads the action and scope, then the return fields, then domain context; each sentence is purposeful. The final sentence on common Romanian rates is supplementary rather than essential to invocation, but it is short and genuinely useful for sanity-checking values, so it does not feel like padding.
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 single-optional-parameter read tool with no output schema and full annotation coverage, the description supplies what the schema and annotations cannot: the returned fields, their ordering, and a reference set of expected rate values. An agent has everything needed to select and invoke 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?
There is a single optional parameter with 100% schema description coverage, so the schema already explains the companyId override, establishing a baseline of 3. The description reinforces the default ('active company') but adds no format, validation, or failure semantics beyond what the schema states.
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 clear verb ('List all') and a specific resource ('VAT rates configured for the active company') and scopes the result to the active company with a defined ordering. It is easy to distinguish from vat_rates_create/update/delete, though it never names a sibling such as vat_category_codes_list, so the differentiation is implicit rather than explicit.
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?
Usage is only implied: 'configured for the active company' tells the agent the context, but there is no statement of when to prefer this tool over vat_category_codes_list, nor when to pass companyId instead of relying on the active company. An agent can infer this is the read path for VAT rates, but nothing is explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
vat_rates_updateAIdempotent
Update an existing VAT rate. Note: changing the rate percentage does not retroactively affect existing invoices — those preserve the original rate. Only updates display label, category code, default status, or position. At least one field must be provided.
| Name | Required | Description | Default |
|---|---|---|---|
| rate | No | VAT percentage | |
| uuid | Yes | VAT rate UUID to update | |
| label | No | Display label | |
| position | No | Display order position | |
| companyId | No | Company UUID override (uses active company if not set) | |
| isDefault | No | Set as default rate (demotes any existing default) | |
| categoryCode | No | e-Factura category code (S, AA, E, O, Z, AE) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the annotations by disclosing that a rate change does not retroactively alter existing invoices — a genuinely non-obvious side effect for a non-destructive, idempotent mutation. The added 'at least one field must be provided' rule is also not in the schema. Minor ding: the sentence 'Only updates display label, category code, default status, or position' omits rate even though the preceding sentence and the schema both allow it, creating internal ambiguity.
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 sentences, front-loaded with the core action and immediately followed by the most important caveat. The enumeration of updatable fields partially duplicates the schema and introduces inconsistency, so it does not fully earn its place.
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 7 parameters at full schema coverage and annotations covering safety, idempotency, and scope, the description covers what an agent needs before calling: mutation scope, the retroactivity caveat, and the minimum-payload rule. It lacks any statement about what is returned after the update, which is relevant given there is no output 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?
Schema coverage is 100%, so the per-field meanings are already handled; the description still adds value by explaining the cross-field constraint (at least one optional field) and the retroactivity semantics of 'rate', neither of which the schema conveys. The contradictory field enumeration slightly muddies which fields are actually patchable.
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 first sentence is a precise verb+resource statement: 'Update an existing VAT rate.' That cleanly separates it from vat_rates_create, vat_rates_delete, and vat_rates_list, though no sibling is named explicitly to reinforce the boundary.
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?
Usage is implied by 'Update an existing VAT rate' plus the constraint that at least one field must be provided, which is actionable. However, it never states when to use this versus recreating a rate or which situations warrant a patch, and no alternatives are named.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
vehicles_createA
Add a vehicle to the company. The plate is normalised to upper case. Add its documents afterwards with expiries_create (vehicleId).
| Name | Required | Description | Default |
|---|---|---|---|
| vin | No | ||
| fuel | No | ||
| make | No | ||
| year | No | Year of manufacture | |
| model | No | ||
| notes | No | ||
| plate | Yes | Registration plate, e.g. "B 123 ABC" | |
| companyId | No | Company UUID (overrides STORNO_COMPANY_ID env var) | |
| ownership | No | own (default), leasing or rented | |
| driverName | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already disclose that this is a non-read-only, non-destructive, non-idempotent create operation. The description adds useful behavior by noting plate normalization and the follow-up document workflow, but it does not mention duplicate handling, permissions, or what is returned.
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 sentences, front-loaded with the core action and followed by the key normalization detail and next-step workflow. There is 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?
The definition is adequate because annotations cover safety traits and the schema carries parameter types/enums. However, for a 10-parameter create tool with no output schema, it should say more about return values and optional fields to be 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?
With 10 parameters and only 40% schema description coverage, the description does not compensate for the many undocumented fields. It explains only plate normalization and does not clarify the roles of vin, fuel, make, model, notes, driverName, or companyId beyond what the schema itself 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?
Description states a specific verb and resource: "Add a vehicle to the company." It clearly separates this from sibling read/update/delete operations and points to the related expiries creation flow.
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 gives clear context for when to use this tool: creating a vehicle under the company, with the follow-up action of adding documents via expiries_create. It does not explicitly compare against vehicles_update or state exclusions, so not a full 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
vehicles_deleteADestructiveIdempotent
Delete a vehicle and all its expiry items (history included). Prefer vehicles_update with active=false for a vehicle that left the fleet.
| Name | Required | Description | Default |
|---|---|---|---|
| uuid | Yes | Vehicle UUID | |
| companyId | No | Company UUID (overrides STORNO_COMPANY_ID env var) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructive=true and idempotent=true, so the safety profile is known. The description adds critical scope beyond that: deletion cascades to expiry items, including their history, which is exactly the irreversible side effect an agent needs before calling it.
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 compact sentences: the destructive action and cascade come first, followed immediately by the safer alternative. There is no filler and every clause carries decision-relevant 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 two-parameter delete tool with rich annotations and a fully documented schema, the description covers the action, the cascade side effect, and the safer alternative. An agent has everything needed to decide and invoke 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% and both parameters (uuid, companyId) are fully documented in the input schema, so the baseline is 3. The description adds no parameter-level details such as which identifier is required or how companyId overrides the environment variable.
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?
States a specific verb and resource ('Delete a vehicle') and explicitly includes the cascade ('all its expiry items, history included'), which an agent could not infer from the name alone. The sibling tools vehicles_get/create/update are implicitly distinguished by the delete scope.
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?
Names an alternative path explicitly ('Prefer vehicles_update with active=false for a vehicle that left the fleet') and gives the condition for choosing it. It doesn't spell out when permanent deletion is actually appropriate, but the main routing decision is covered.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
vehicles_getCRead-onlyIdempotent
One vehicle with its open expiry items, counts and nextExpiry.
| Name | Required | Description | Default |
|---|---|---|---|
| uuid | Yes | Vehicle UUID | |
| companyId | No | Company UUID (overrides STORNO_COMPANY_ID env var) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint and destructiveHint=false, so the safety profile is covered. The description contributes the return shape (open expiry items, counts, nextExpiry), which is genuinely useful since there is no output schema, but it says nothing about whether missing vehicles error or return null.
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?
A single short sentence with no filler, front-loading the result content. It is efficient, though bordering on under-specified rather than genuinely 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 two-parameter read tool with full annotation coverage, the minimum is met, and the note about open expiry items partially compensates for the absent output schema. It still omits error behavior and the relationship of `counts`/`nextExpiry` to the returned payload.
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 uuid and companyId parameters are fully documented in the schema itself. The description adds no parameter-level meaning beyond that, which is the baseline case.
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 fragment "One vehicle with its open expiry items" implies fetching a single vehicle record, and the name vehicles_get reinforces this, so it is distinguishable from vehicles_list. However, it never states a verb ("retrieve/get") or mentions that the vehicle is identified by uuid, leaving the purpose only implied rather than declared.
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?
There is no guidance on when to use this tool versus vehicles_list or expiries_get/expiries_list. An agent must infer from the name alone that this is the single-record counterpart to the list tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
vehicles_listARead-onlyIdempotent
Vehicles of the company (parc auto) with, per vehicle, nextExpiry (the soonest open expiry item: kind, label, expiresAt, daysLeft, status ok | due | expired) and counts {expired, due, ok}. Filter with active and search (plate, make, model, driver, VIN).
| Name | Required | Description | Default |
|---|---|---|---|
| active | No | Only active (true) or only inactive (false) vehicles | |
| search | No | ||
| companyId | No | Company UUID (overrides STORNO_COMPANY_ID env var) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the safety profile is covered. The description adds behavior beyond that by disclosing the per-vehicle derived fields (`nextExpiry` with status ok|due|expired and `counts`), which is valuable because there is no output schema. It omits pagination or default ordering, which is a gap.
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 dense sentences that are front-loaded with the core purpose and then the returned structure, with no filler. It is information-rich but readable; some clause density comes from enumerating the status values and search fields.
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 no output schema, the description responsibly describes the derived fields `nextExpiry` and `counts`, and it documents the search fields. What remains incomplete is list mechanics, such as pagination, ordering, or default result limits, and the `companyId` override behavior, which matters for a list 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 67%: `active` and `companyId` are already documented, but `search` has no schema description. The description adds meaning by enumerating the searchable fields (plate, make, model, driver, VIN), which compensates for that gap. It does not explain matching behavior (substring vs exact) or how the two filters combine.
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 states a specific verb and resource: listing the company's vehicles (parc auto), and it explains what each entry contains (nextExpiry, counts). It does not explicitly name the sibling vehicles_get as the single-vehicle alternative, but the resource is 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?
It names the two filter dimensions (`active` and `search` with the searchable fields), which gives implied guidance on how to narrow results. It does not state when to use this tool versus vehicles_get or expiries_upcoming, and there are no exclusions or prerequisites.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
vehicles_updateBIdempotent
Update a vehicle (any field of vehicles_create, plus active). Send null to clear an optional field.
| Name | Required | Description | Default |
|---|---|---|---|
| vin | No | ||
| fuel | No | ||
| make | No | ||
| uuid | Yes | Vehicle UUID | |
| year | No | ||
| model | No | ||
| notes | No | ||
| plate | No | ||
| active | No | false archives the vehicle (sold, returned); its expiries stop appearing in the lists filtered by active vehicles | |
| companyId | No | Company UUID (overrides STORNO_COMPANY_ID env var) | |
| ownership | No | ||
| driverName | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish non-read-only, idempotent, non-destructive behavior; the description adds useful semantics that null clears an optional field. It still omits whether omitted fields are preserved, whether this is a partial or full replacement update, and how `active` archiving behaves.
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, front-loaded with the core action and scope. The null-clearing rule is a useful second sentence and nothing is wasted.
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 12-parameter update tool with no output schema and only partial parameter descriptions, the definition is minimally adequate. The biggest omission is whether this is a partial update that preserves unspecified fields, which matters for correct invocation.
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 only 25% across 12 parameters. The description contributes the cross-reference to vehicles_create fields and the null-clearing rule, but it leaves many parameters undocumented in prose, including enum meanings and the non-nullable plate field.
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?
States a specific verb and resource ('Update a vehicle') and defines scope as fields from vehicles_create plus `active`. It is clearly distinguishable from create/delete siblings, though it relies on another tool's schema to enumerate fields.
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 required uuid and update phrasing imply use on an existing vehicle, and the null instruction gives practical field-clearing guidance. However, it does not explicitly say when to use this instead of vehicles_create or vehicles_delete, nor does it mention prerequisites such as needing a valid vehicle UUID.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
webhooks_createA
Register a new webhook endpoint for the current company. The response includes the full signing secret — store it securely immediately as it will be masked in all subsequent responses. URL must use HTTPS. Use ["*"] for events to subscribe to all event types.
| Name | Required | Description | Default |
|---|---|---|---|
| url | Yes | HTTPS destination URL that will receive POST requests from Storno | |
| events | Yes | Array of event type names to subscribe to (e.g. ["invoice.created", "invoice.validated"]). Use ["*"] to subscribe to all events. | |
| isActive | No | Whether the webhook is active on creation (default: true) | |
| companyId | No | Company UUID (overrides STORNO_COMPANY_ID env var) | |
| description | No | Human-readable label for this webhook endpoint |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the annotations (which only flag non-read-only, non-idempotent, non-destructive) by disclosing that the response contains the full signing secret that will thereafter be masked — a critical one-time-visibility behavior. The HTTPS requirement is another behavioral constraint an agent must honor.
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 tight sentences, each carrying distinct load: what it does, the secret-handling warning, the HTTPS constraint, and the wildcard hint. Front-loaded with the action and 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?
For a non-idempotent create with no output schema but full schema coverage, the description supplies the one piece of context the schema can't — the one-time signing secret. Defaults and field details are left to the schema, which is appropriate.
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 schema already documents url, events (including the ["*"] wildcard), isActive, companyId, and description. The description largely repeats this (HTTPS url, ["*"] events) rather than adding new semantic detail, so the baseline 3 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?
States a specific verb+resource ('Register a new webhook endpoint') scoped to the current company. This clearly separates it from webhooks_list/get/update/delete siblings, though it never explicitly names those 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?
Provides concrete constraints for correct use (URL must be HTTPS, use ["*"] to subscribe to all events), but gives no explicit when-to-use/when-not guidance or pointer to sibling tools such as webhooks_update or webhooks_test.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
webhooks_deleteADestructiveIdempotent
Permanently delete a webhook endpoint and all its delivery history. This is a hard delete with no recovery. To pause deliveries temporarily, use webhooks_update with isActive: false instead.
| Name | Required | Description | Default |
|---|---|---|---|
| uuid | Yes | Webhook endpoint UUID to permanently delete | |
| companyId | No | Company UUID (overrides STORNO_COMPANY_ID env var) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true and idempotentHint=true, so the safety profile is partly carried by structured data; the description still earns credit for adding what the annotations do not: that the delete cascades to delivery history and that recovery is impossible. It stops short of noting permission requirements or confirming behavior for an already-deleted UUID, which is the only remaining gap.
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, both load-bearing. The destructive scope is front-loaded in sentence one and the alternative route follows immediately in sentence two, with no filler or restatement of the tool name.
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 two-parameter delete with rich annotations (destructive, idempotent, closed-world) and no output schema, this covers everything an agent needs: what is destroyed, that it is irreversible, and which sibling to use instead. Nothing material is missing.
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 both parameters are documented in-schema, so the baseline of 3 applies. The description adds no syntax, format, or semantics for uuid or the companyId override beyond what the schema already states.
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?
States a specific verb and resource — 'Permanently delete a webhook endpoint and all its delivery history' — which is unmistakably distinct from webhooks_update, webhooks_regenerate_secret, or any list/get sibling. The scope of the deletion (endpoint plus history) is included, not just the verb.
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 names the alternative behavior an agent might actually want and the sibling that provides it: 'To pause deliveries temporarily, use webhooks_update with isActive: false instead.' This is a when-not-to-use rule with the exact fallback tool and parameter value, leaving nothing to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
webhooks_deliveriesARead-onlyIdempotent
Retrieve a paginated list of delivery attempts for a webhook endpoint. Can filter by status (success/failed), event type, and date range. Use webhooks_delivery_detail to inspect full request/response payloads.
| Name | Required | Description | Default |
|---|---|---|---|
| to | No | End date filter in ISO 8601 format (YYYY-MM-DD) | |
| from | No | Start date filter in ISO 8601 format (YYYY-MM-DD) | |
| page | No | Page number for pagination (default: 1) | |
| uuid | Yes | Webhook endpoint UUID | |
| limit | No | Number of items per page (default: 20, max: 100) | |
| status | No | Filter by delivery status: success or failed | |
| companyId | No | Company UUID (overrides STORNO_COMPANY_ID env var) | |
| eventType | No | Filter by event type name (e.g. invoice.validated) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the safety profile is fully covered. The description adds only that results are paginated and filterable by status, event type, and date range, which are largely restatements of schema capabilities. It says nothing about ordering, retention, or rate limits, so it adds modest value 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 short sentences with no filler: purpose first, filter capabilities second, sibling routing third. It is front-loaded and every sentence earns its place.
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 paginated list tool with full schema coverage and annotations carrying the safety profile, the definition covers what an agent needs to invoke it and to know when to switch to the detail sibling. No output schema exists, so some return-shape detail is absent, but for a list operation this is a minor gap.
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 each parameter (uuid, from/to, page, limit, status, eventType, companyId) is already documented. The description repeats the filter categories and the success/failed statuses without adding format, default, or precedence details 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?
States a specific verb (Retrieve) and resource (paginated list of delivery attempts for a webhook endpoint), and explicitly distinguishes itself from webhooks_delivery_detail by naming that sibling for payload inspection. An agent can select it correctly without opening any schema.
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?
Provides clear routing: use this tool for lists of delivery attempts, and use webhooks_delivery_detail when full request/response payloads are needed. It does not mention other nearby siblings like webhooks_events (event-type catalogue) or webhooks_list, so a small gap remains, but the primary alternative is handled explicitly.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
webhooks_delivery_detailARead-onlyIdempotent
Retrieve the complete details of a single webhook delivery attempt, including the full request payload, request headers (with signature), and the full response received. Use this to debug failed deliveries.
| Name | Required | Description | Default |
|---|---|---|---|
| uuid | Yes | Webhook endpoint UUID | |
| companyId | No | Company UUID (overrides STORNO_COMPANY_ID env var) | |
| deliveryUuid | Yes | Delivery attempt UUID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations already establish that this is a read-only, idempotent, non-destructive, closed-world operation. The description adds useful behavioral context by saying the response includes the full request payload, request headers with signature, and full response received, which is valuable for debugging and security-sensitive inspection. It does not discuss retention, redaction, or error behavior, but the added detail is meaningful 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 and front-loads the resource and return contents before the use case. Every sentence adds useful information with no redundant or vague phrasing.
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 single-resource read tool with full schema coverage and rich annotations, the description is complete enough: it explains what is returned even though no output schema exists, and it gives a clear debugging use case. Nothing essential for correct invocation is missing.
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 all three parameters (uuid, companyId, deliveryUuid) are already well documented in the schema. The description does not add syntax, format, or selection guidance beyond the schema, so the 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 ('Retrieve') and precisely identifies the resource as 'a single webhook delivery attempt,' immediately distinguishing it from the sibling list operation webhooks_deliveries. It also enumerates the exact detail payload returned, so an agent can understand what makes this tool different without opening the schema.
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 the primary use case: 'Use this to debug failed deliveries.' That gives the agent a concrete situation for selecting this tool. It stops short of explicitly naming the alternative (webhooks_deliveries) or saying when not to use it, which keeps it from a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
webhooks_eventsARead-onlyIdempotent
List all available webhook event types that can be subscribed to, including their descriptions and categories (invoices, payments, clients, sync, proforma). Use this to discover valid event names for webhook configuration.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover safety (readOnly, idempotent, non-destructive, closed-world), so the marginal burden is low. The description adds that results include descriptions and category groupings (invoices, payments, clients, sync, proforma), which is useful shape information given there is no output 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 short sentences: the verb+resource+returned fields first, the intended use second. No repetition, no filler, and the most actionable information leads.
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 parameterless, read-only enumeration with no output schema, the description is nearly complete: it says what is returned and why. A small remaining gap is whether the catalog is static or account-specific, but nothing needed to call it correctly is missing.
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 tool takes zero parameters, so the baseline is 4 and there is no parameter semantics to explain. The description correctly implies no filtering inputs are needed.
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?
States a specific verb and resource ('List all available webhook event types that can be subscribed to') and disambiguates from sibling webhooks_list, which returns configured webhooks rather than the catalog of subscribable types. An agent can pick between the two without inspecting schemas.
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?
'Use this to discover valid event names for webhook configuration' gives a clear trigger condition tied to webhook setup. It stops short of naming the follow-up actions (webhooks_create / webhooks_update) or stating exclusions, so it is strong but not fully explicit routing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
webhooks_getARead-onlyIdempotent
Retrieve the full configuration of a single webhook endpoint. The secret is always masked in this response — use webhooks_regenerate_secret to obtain a new full secret.
| Name | Required | Description | Default |
|---|---|---|---|
| uuid | Yes | Webhook endpoint UUID | |
| companyId | No | Company UUID (overrides STORNO_COMPANY_ID env var) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare this as read-only, idempotent, non-destructive, and not open-world. The description adds useful behavioral context beyond annotations by stating that the secret is always masked and pointing to the correct alternative tool for obtaining a full secret.
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, front-loaded with the core action and followed by the critical secret-masking caveat. Every sentence adds useful information with no repetition or 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?
For a read-only get tool with full parameter schema coverage and annotations covering safety behavior, the description provides enough context to invoke it correctly. Since there is no output schema, it could say more about the returned configuration structure, but the secret-masking note covers the most important output caveat.
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, including uuid and companyId, so the structured data already carries parameter meaning. The description reinforces that this retrieves a single webhook endpoint via its UUID but does not add further syntax or format detail 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 states a specific verb and resource: retrieve the full configuration of a single webhook endpoint. It distinguishes this from related operations by naming webhooks_regenerate_secret and by emphasizing the single-endpoint scope, which contrasts with webhooks_list.
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 explains the secret-masking behavior and routes secret retrieval to webhooks_regenerate_secret. It does not explicitly say to use webhooks_list for multiple endpoints, but the single-endpoint framing makes the distinction obvious enough.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
webhooks_listARead-onlyIdempotent
List all webhook endpoints configured for the current company. Secrets are masked in the listing. Requires X-Company header (companyId param or STORNO_COMPANY_ID env var).
| Name | Required | Description | Default |
|---|---|---|---|
| companyId | No | Company UUID (overrides STORNO_COMPANY_ID env var) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint/idempotentHint/non-destructive, so the safety profile is covered. The description adds genuinely new behavioral facts: secrets are masked in output (so the agent shouldn't expect secret values) and the company context comes from a header or env var.
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 sentences, front-loaded with the core action, followed by the output caveat and the auth prerequisite. Every sentence carries distinct information with 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?
Adequate for a simple, read-only, zero-required-param listing tool with no output schema — scope, masking, and auth are all covered. Minor gaps remain around ordering/pagination or whether delivery history is included, but nothing blocks correct invocation.
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 single optional companyId is already documented, including the env-var override. The description merely restates that relationship rather than adding format or precedence detail 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?
States a specific verb+resource ('List all webhook endpoints') and scopes it to 'the current company', which cleanly separates it from webhooks_get and the mutating webhooks_create/update/delete siblings. It stops short of naming an alternative endpoint explicitly.
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 requirement of an X-Company header (companyId param or STORNO_COMPANY_ID env var) gives useful precondition context, and 'all ... for the current company' implies the listing use case. However, there is no explicit when-to-use versus webhooks_get or webhooks_deliveries, leaving selection to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
webhooks_regenerate_secretA
Issue a new HMAC-SHA256 signing secret for a webhook endpoint, immediately invalidating the previous one. The new secret is returned in full only in this response — store it securely. Update your endpoint verification logic before calling this in production.
| Name | Required | Description | Default |
|---|---|---|---|
| uuid | Yes | Webhook endpoint UUID to regenerate the secret for | |
| companyId | No | Company UUID (overrides STORNO_COMPANY_ID env var) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description discloses behavior the annotations do not: the previous secret is invalidated immediately (a consequence not captured by destructiveHint=false), and the new secret is shown in full exactly once, so it must be persisted by the caller. That 'store it securely, you will not see it again' warning is the single most important behavioral fact about this tool and it is stated plainly.
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 sentences, each doing distinct work: what it does, the destructive side effect, and the caller's obligation afterward. The critical side effect is front-loaded in the first sentence, leaving no waste.
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?
There is no output schema, and the description compensates by explaining exactly what the response contains and its one-time nature. Combined with the annotations and a fully-described two-parameter schema, an agent has everything needed to call this correctly and handle the result.
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 both `uuid` and `companyId` documented in-schema, so the baseline of 3 applies. The description adds no additional meaning about the parameters — no note on how companyId interacts with the endpoint's owning company or what happens if it mismatches the webhook's company.
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 gives a specific verb ('Issue a new') and a precise resource ('HMAC-SHA256 signing secret for a webhook endpoint'), so an agent knows exactly what operation is performed. It does not, however, differentiate itself from adjacent siblings such as webhooks_update or oauth2_clients_rotate_secret, which is the only thing keeping it below a 5.
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?
Usage is implied rather than stated: the operational caution ('Update your endpoint verification logic before calling this in production') tells the caller to prepare downstream verifiers first, which is genuinely useful sequencing advice. But there is no explicit when-to-use versus alternatives, no mention of when not to call it, and no prerequisites such as required permissions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
webhooks_testA
Send a synchronous test delivery to a webhook endpoint and return the outcome immediately. Uses a synthetic webhook.test event payload. The webhook must be active. The delivery is recorded in delivery history.
| Name | Required | Description | Default |
|---|---|---|---|
| uuid | Yes | Webhook endpoint UUID to send the test delivery to | |
| companyId | No | Company UUID (overrides STORNO_COMPANY_ID env var) | |
| eventType | No | Override the test event type name (default: webhook.test) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false, idempotentHint=false, openWorldHint=true and destructiveHint=false; the description adds real context beyond them — the call is synchronous with an immediate outcome, the payload is synthetic, and the delivery is persisted to delivery history. It does not note rate limits or what the returned outcome contains.
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?
Four short sentences, each carrying distinct information (sync behavior, payload type, precondition, side effect), with the core action front-loaded and 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?
No output schema exists, and the description only says the outcome is returned 'immediately' without describing what the result includes (status code, response body, latency). Otherwise, for a 3-parameter tool whose safety profile is covered by annotations, the definition is sufficient to call 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%, so uuid, companyId and eventType are already documented in the schema. The description reinforces the uuid (target endpoint) and default event type but says nothing about companyId or the env-var override behavior beyond what the schema states.
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 states a specific verb and resource — send a synchronous test delivery to a webhook endpoint — plus the distinguishing trait (synthetic webhook.test payload) versus the real delivery siblings like webhooks_deliveries. It is clear what the tool does, though it doesn't explicitly name an alternative 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?
A concrete precondition is given ('The webhook must be active'), which implies usage for verifying endpoint configuration, but there is no explicit when-to-use/when-not or reference to sibling tools such as webhooks_deliveries or webhooks_update.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
webhooks_updateAIdempotent
Partially update an existing webhook endpoint. Only provided fields are changed. Providing events replaces the entire subscription list — send the complete desired set each time. URL must use HTTPS.
| Name | Required | Description | Default |
|---|---|---|---|
| url | No | New HTTPS destination URL | |
| uuid | Yes | Webhook endpoint UUID to update | |
| events | No | Replacement list of event type names (replaces entire list, not additive). Use ["*"] for all events. | |
| isActive | No | Enable (true) or pause (false) deliveries for this webhook | |
| companyId | No | Company UUID (overrides STORNO_COMPANY_ID env var) | |
| description | No | Updated human-readable label for this webhook endpoint |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With annotations already declaring non-read-only, idempotent, non-destructive, the description adds meaningful behavioral context: partial-update merge semantics, the lossy full-replacement of the events list, and an HTTPS validation constraint that will cause calls to fail. It stays silent on auth/permission requirements, what the response contains, and whether a test delivery is triggered.
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?
Four short sentences, each carrying a distinct rule; the partial-update scope leads and the destructive events caveat follows immediately. Zero 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?
For a 6-parameter partial-update mutation with full schema coverage and no output schema, the essential facts (scope, merge behavior, replacement caveat, HTTPS requirement) are all present. Slightly short on what a successful response looks like and whether the webhook secret or delivery state is affected.
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 both url and events already document the HTTPS requirement and the replacement semantics the description restates. The description adds no syntax, format, or defaulting detail beyond the schema — baseline 3 given the schema does the heavy lifting.
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?
"Partially update an existing webhook endpoint" gives a specific verb (partial update) and resource (webhook endpoint) with the update semantics baked in, which cleanly separates it from webhooks_create and webhooks_get in the sibling list. An agent can decide to call this without opening the schema.
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 states the condition that selects this behavior — only provided fields change — and warns that events is a full replacement rather than additive, which is exactly the trap an agent would fall into. It doesn't explicitly name an alternative tool (e.g., use webhooks_create for new endpoints), leaving that routing to the naming.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
white_label_config_getARead-onlyIdempotent
Get the organization's white-label branding configuration (Business plan). Returns whether the org is entitled, plus the custom app name, logo URL, accent color, and whether Storno branding is removed from PDFs and client emails.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint/idempotentHint/non-destructive, so the safety profile is covered. The description adds real value beyond that: it discloses the plan gating and the entitlement-check behavior, so the agent knows a non-Business org gets a negative entitlement rather than an error.
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?
A single front-loaded sentence that states the resource, the plan constraint, and the payload contents in one pass. No filler or restatement of the name.
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 no output schema, the description carries the burden of describing the return value, and it does so field-by-field including the entitlement flag. Nothing an agent needs in order to call this zero-arg getter is missing.
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?
Zero parameters, so the baseline of 4 applies; the description correctly adds no parameter claims and instead spends its space on return semantics.
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?
Specific verb (Get) plus precise resource (organization's white-label branding configuration) and an explicit enumeration of the returned values (entitlement flag, app name, logo URL, accent color, Storno-branding removal). An agent can distinguish this from white_label_config_update and the other *_config_get siblings without opening a schema.
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 parenthetical '(Business plan)' establishes a precondition for use and the description implies the read context clearly. It doesn't explicitly name alternatives or say what to do when the org isn't entitled beyond noting the entitlement flag is returned, so no exclusion guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
white_label_config_updateAIdempotent
Create or update the organization's white-label branding (Business plan only). Set a custom app name, accent color, toggle white-label on/off, and remove the "Storno.ro" footer from generated PDFs and the emails your clients receive.
| Name | Required | Description | Default |
|---|---|---|---|
| appName | No | Custom app name shown in the app shell and browser tab (max 100 chars, null to clear) | |
| enabled | No | Enable or disable white-label branding (when off, default Storno branding is used) | |
| customDomain | No | Custom domain to serve the app and client links (e.g. "facturi.example.com"), or null to clear. Changing it resets verification and returns a DNS TXT record to add. | |
| primaryColor | No | Accent color in hex format (e.g., "#2563eb"), or null to clear | |
| removeBranding | No | Remove the "Storno.ro" footer from generated PDFs and client-facing emails |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false, idempotentHint=true, and destructiveHint=false, so the safety profile is known. The description adds meaningful context beyond annotations: plan gating ('Business plan only') and the client-facing effect of removeBranding on PDFs and emails.
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 front-loaded sentences with no wasted words. The purpose, plan restriction, and configurable fields are presented efficiently.
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 five-parameter config update with full schema coverage and annotations, the description is largely complete: it states the plan requirement and the effect of branding removal. Minor gaps are no routing to white_label_config_get/verify_domain and no mention of customDomain resets, though the schema covers the latter.
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 schema fully documents all five parameters, including the customDomain verification-reset behavior. The description lists app name, accent color, enable toggle, and footer removal, but omits customDomain entirely and adds little meaning beyond the already-rich 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 states a specific verb and resource ('Create or update the organization's white-label branding') and enumerates the configurable fields. It is clear what the tool does, though it does not explicitly distinguish itself from sibling white_label_config_get or white_label_config_verify_domain.
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 includes a useful prerequisite ('Business plan only') and implies the tool is for setting branding, but there is no explicit when-to-use guidance versus white_label_config_get or white_label_config_verify_domain, nor any note about the verification flow after changing a domain.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
white_label_config_verify_domainA
Verify the custom domain by checking that the DNS TXT record (_storno-verify.) returned when the domain was set has been published. On success the domain becomes active for client links.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations flag openWorldHint=true and readOnlyHint=false; the description earns credit by explaining why — it performs an external DNS lookup and, on success, flips the domain to active for client links, which is the state change behind readOnlyHint=false. It does not cover failure behavior, DNS propagation timing, or whether retries are safe despite idempotentHint=false.
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, no filler, with the mechanism front-loaded and the outcome stated second. Every clause carries information an agent needs.
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 no parameters and no output schema, the description covers the essentials: what is checked, how, and what success means. It leaves out the failure path and what a negative result looks like, which is the main remaining gap for a verification 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?
The tool takes zero parameters, so the baseline is 4. The description adds useful framing by clarifying that the domain and its expected TXT record come from prior configuration rather than from this call's input.
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?
States a specific verb (verify) and resource (custom domain) plus the exact mechanism: checking a DNS TXT record at `_storno-verify.<domain>`. That is unambiguous and easily distinguished from the sibling config tools (white_label_config_get/update), which read or write config rather than performing an external DNS check.
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 phrase 'the DNS TXT record returned when the domain was set' implies the prerequisite sequence (set domain first, publish TXT, then verify), giving clear usage context. It stops short of explicitly naming white_label_config_update as the predecessor or stating what to do when verification fails.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
9 tool updates
v1.0.57- Changed
invoices_export_csv4 fields changed- added
Input schema / properties / dateFromAdded value: +{ + "description": "Start date (YYYY-MM-DD, issue date)", + "type": "string" +} - added
Input schema / properties / dateToAdded value: +{ + "description": "End date (YYYY-MM-DD, issue date)", + "type": "string" +} - removed
Input schema / properties / fromRemoved value: -{ - "description": "Start date (YYYY-MM-DD)", - "type": "string" -} - removed
Input schema / properties / toRemoved value: -{ - "description": "End date (YYYY-MM-DD)", - "type": "string" -}
- Changed
invoices_export_payments_saga_xml2 fields changed- added
Input schema / properties / dateFromAdded value: +{ + "description": "Start date (YYYY-MM-DD, payment date). Pass a period: without one the whole history is exported.", + "type": "string" +} - added
Input schema / properties / dateToAdded value: +{ + "description": "End date (YYYY-MM-DD, payment date)", + "type": "string" +}
- Changed
invoices_export_receipts_saga_xml2 fields changed- added
Input schema / properties / dateFromAdded value: +{ + "description": "Start date (YYYY-MM-DD, payment date). Pass a period: without one the whole history is exported.", + "type": "string" +} - added
Input schema / properties / dateToAdded value: +{ + "description": "End date (YYYY-MM-DD, payment date)", + "type": "string" +}
- Changed
invoices_export_saga_xml4 fields changed- added
Input schema / properties / dateFromAdded value: +{ + "description": "Start date (YYYY-MM-DD, issue date)", + "type": "string" +} - added
Input schema / properties / dateToAdded value: +{ + "description": "End date (YYYY-MM-DD, issue date)", + "type": "string" +} - removed
Input schema / properties / fromRemoved value: -{ - "description": "Start date (YYYY-MM-DD)", - "type": "string" -} - removed
Input schema / properties / toRemoved value: -{ - "description": "End date (YYYY-MM-DD)", - "type": "string" -}
- Changed
invoices_list4 fields changed- added
Input schema / properties / dateFromAdded value: +{ + "description": "Start date filter on the issue date, ISO 8601 (YYYY-MM-DD)", + "type": "string" +} - added
Input schema / properties / dateToAdded value: +{ + "description": "End date filter on the issue date, ISO 8601 (YYYY-MM-DD)", + "type": "string" +} - removed
Input schema / properties / fromRemoved value: -{ - "description": "Start date filter in ISO 8601 format (YYYY-MM-DD)", - "type": "string" -} - removed
Input schema / properties / toRemoved value: -{ - "description": "End date filter in ISO 8601 format (YYYY-MM-DD)", - "type": "string" -}
- Added
payments_receipt_issue - Added
payments_receipt_pdf - Changed
reports_vat14 fields changed- added
Input schema / properties / clientIdAdded value: +{ + "description": "Only invoices of this client (UUID)", + "type": "string" +} - added
Input schema / properties / currencyAdded value: +{ + "description": "Only invoices in this currency (ISO code, e.g. RON)", + "type": "string" +} - added
Input schema / properties / directionAdded value: +{ + "description": "Only issued or only received invoices", + "enum": [ + "outgoing", + "incoming" + ], + "type": "string" +} - added
Input schema / properties / documentTypeAdded value: +{ + "description": "Only invoices or only credit notes", + "enum": [ + "invoice", + "credit_note" + ], + "type": "string" +} - added
Input schema / properties / finalOnlyAdded value: +{ + "description": "Leave drafts, rejected and converted documents out (cancelled ones never count)", + "type": "boolean" +} - added
Input schema / properties / fromAdded value: +{ + "description": "Range start, YYYY-MM-DD (with to)", + "type": "string" +} - changed
Input schema / properties / month / descriptionPrevious value: -"Report month (1–12)"New value: +"Report month (1–12); the default period when no quarter / period / range is given" - added
Input schema / properties / periodAdded value: +{ + "description": "'year' for the whole year", + "enum": [ + "year" + ], + "type": "string" +} - added
Input schema / properties / quarterAdded value: +{ + "description": "Quarter (1–4) instead of a month", + "maximum": 4, + "minimum": 1, + "type": "integer" +} - added
Input schema / properties / supplierIdAdded value: +{ + "description": "Only invoices of this supplier (UUID)", + "type": "string" +} - added
Input schema / properties / toAdded value: +{ + "description": "Range end, YYYY-MM-DD (with from)", + "type": "string" +} - added
Input schema / properties / vatRateAdded value: +{ + "description": "Only the lines at this VAT rate (e.g. 21); totals are then summed from those lines", + "type": "number" +} - changed
Input schema / properties / year / descriptionPrevious value: -"Report year (e.g. 2026)"New value: +"Report year (default: current year)" - removed
Input schema / requiredRemoved value: -[ - "year", - "month" -]
- Added
reports_vat_oss
6 tool updates
v1.0.51- Added
calendar_feed_disable - Added
calendar_feed_enable - Added
calendar_feed_get - Added
calendar_feed_update - Changed
recurring_invoices_create6 fields changed- added
Input schema / properties / balanceAdded value: +{ + "anyOf": [ + { + "type": [ + "number", + "string" + ] + }, + { + "type": "null" + } + ], + "description": "Running balance in RON (e.g. an investment recovered through rent reductions). Reduced on every issuance by balanceStep; printed with [[sold]]. The template pauses when it reaches zero." +} - added
Input schema / properties / balanceStepAdded value: +{ + "description": "Expression deducted from balance per issuance, e.g. \"1900*curs\" (1,900 EUR at the BNR rate of the issue date). Names: curs, curs_EUR…, sold_anterior. The last deduction is capped at what is left.", + "type": [ + "string", + "null" + ] +} - added
Input schema / properties / lines / items / properties / priceExpressionAdded value: +{ + "description": "With priceRule=expression: the unit price in the document currency computed at issuance, e.g. \"2000*curs - rata\" (2,000 EUR at the BNR rate minus what this issuance deducts from the running balance). Names: curs, curs_EUR…, rata, sold, sold_anterior, luna_nr, an. Negative results become 0.", + "type": "string" +} - changed
Input schema / properties / lines / items / properties / priceRule / descriptionPrevious value: -"Pricing rule. fixed: unitPrice as-is. updated_product: refresh from linked product on each issuance. bnr_rate: convert from referenceCurrency at BNR rate. bnr_rate_markup: same as bnr_rate plus markupPercent."New value: +"Pricing rule. fixed: unitPrice as-is. updated_product: refresh from linked product on each issuance. bnr_rate: convert from referenceCurrency at BNR rate. bnr_rate_markup: same as bnr_rate plus markupPercent. expression: unitPrice computed at issuance from priceExpression (document currency), e.g. \"2000*curs - rata\"." - changed
Input schema / properties / lines / items / properties / priceRule / enumPrevious value: -[ - "fixed", - "updated_product", - "bnr_rate", - "bnr_rate_markup" -]New value: +[ + "fixed", + "updated_product", + "bnr_rate", + "bnr_rate_markup", + "expression" +] - changed
Input schema / properties / notes / descriptionPrevious value: -"Internal notes"New value: +"Notes printed on every generated document. Placeholders: [[luna]], [[luna±N]], [[an]], [[an±N]], [[luna_nr]], [[curs]] (the BNR rate note), [[suma:EXPR]] (an amount computed from EXPR, e.g. [[suma:1900*curs]] = 1,900 EUR at the BNR rate of the issue date; names: curs, curs_EUR, curs_USD…, sold, sold_anterior, rata), and with a running balance: [[sold]] (left after this invoice), [[sold_anterior]] (before), [[rata]] (deducted now). Amounts print in Romanian format (9.633,00)."
- Changed
recurring_invoices_update6 fields changed- added
Input schema / properties / balanceAdded value: +{ + "anyOf": [ + { + "type": [ + "number", + "string" + ] + }, + { + "type": "null" + } + ], + "description": "Running balance in RON (null removes it); see recurring_invoices_create" +} - added
Input schema / properties / balanceStepAdded value: +{ + "description": "Expression deducted from balance per issuance, e.g. \"1900*curs\"; null removes it", + "type": [ + "string", + "null" + ] +} - added
Input schema / properties / lines / items / properties / priceExpressionAdded value: +{ + "description": "With priceRule=expression: the unit price in the document currency computed at issuance, e.g. \"2000*curs - rata\" (2,000 EUR at the BNR rate minus what this issuance deducts from the running balance). Names: curs, curs_EUR…, rata, sold, sold_anterior, luna_nr, an. Negative results become 0.", + "type": "string" +} - changed
Input schema / properties / lines / items / properties / priceRule / descriptionPrevious value: -"Pricing rule. fixed: unitPrice as-is. updated_product: refresh from linked product on each issuance. bnr_rate: convert from referenceCurrency at BNR rate. bnr_rate_markup: same as bnr_rate plus markupPercent."New value: +"Pricing rule. fixed: unitPrice as-is. updated_product: refresh from linked product on each issuance. bnr_rate: convert from referenceCurrency at BNR rate. bnr_rate_markup: same as bnr_rate plus markupPercent. expression: unitPrice computed at issuance from priceExpression (document currency), e.g. \"2000*curs - rata\"." - changed
Input schema / properties / lines / items / properties / priceRule / enumPrevious value: -[ - "fixed", - "updated_product", - "bnr_rate", - "bnr_rate_markup" -]New value: +[ + "fixed", + "updated_product", + "bnr_rate", + "bnr_rate_markup", + "expression" +] - changed
Input schema / properties / notes / descriptionPrevious value: -"Internal notes"New value: +"Notes printed on every generated document; same placeholders as recurring_invoices_create ([[luna]], [[an]], [[curs]], [[suma:EXPR]], [[sold]], [[sold_anterior]], [[rata]])"
1 tool update
v1.0.49- Added
integration_invoicing_activity
35 tool updates
v1.0.48- Added
admin_activity - Added
admin_audit_logs - Changed
anaf_declaration_status2 fields changed- added
Input schema / properties / ghiseuAdded value: +{ + "description": "true when the number is the registration number given at the ANAF counter, not an online upload index", + "type": "boolean" +} - changed
Input schema / properties / index / descriptionPrevious value: -"Upload index returned by the portal"New value: +"Upload index returned by the portal, or the registration number from the counter (with ghiseu: true)"
- Added
client_statement - Added
client_statement_email - Added
client_statements - Changed
clients_create3 fields changed- added
Input schema / properties / affiliatedAdded value: +{ + "description": "Affiliated party — D394 sets prsAfiliat = 1 when an affiliated partner appears on an invoice of the period", + "type": "boolean" +} - added
Input schema / properties / creditLimitAdded value: +{ + "anyOf": [ + { + "minimum": 0, + "type": "number" + }, + { + "type": "null" + } + ], + "description": "Partner rule: maximum outstanding balance in the company currency; issuing an invoice that would exceed it returns a `warning` (never a refusal). null removes the limit" +} - added
Input schema / properties / statusAdded value: +{ + "description": "Partner rule: active (default), warning (a notice is shown when the client is picked on an invoice) or blocked (the client cannot be invoiced — issue is refused)", + "enum": [ + "active", + "warning", + "blocked" + ], + "type": "string" +}
- Changed
clients_update3 fields changed- added
Input schema / properties / affiliatedAdded value: +{ + "description": "Affiliated party — D394 sets prsAfiliat = 1 when an affiliated partner appears on an invoice of the period", + "type": "boolean" +} - added
Input schema / properties / creditLimitAdded value: +{ + "anyOf": [ + { + "minimum": 0, + "type": "number" + }, + { + "type": "null" + } + ], + "description": "Partner rule: maximum outstanding balance in the company currency; issuing an invoice that would exceed it returns a `warning` (never a refusal). null removes the limit" +} - added
Input schema / properties / statusAdded value: +{ + "description": "Partner rule: active (default), warning (a notice is shown when the client is picked on an invoice) or blocked (the client cannot be invoiced — issue is refused)", + "enum": [ + "active", + "warning", + "blocked" + ], + "type": "string" +}
- Added
declaration_form_versions - Changed
declarations_create2 fields changed- changed
Input schema / properties / data / descriptionPrevious value: -"For d212 / c168: { input: <form input>, attachments?: [{name, contentBase64}] }"New value: +"For d212 / c168: { input: <form input>, attachments?: [{name, contentBase64}] }. Responses return attachments as {name, size, mime, stored} without the content; sending that shape back keeps the stored files" - changed
Input schema / properties / type / enumPrevious value: -[ - "d394", - "d300", - "d390", - "d100", - "d112", - "d212", - "c168" -]New value: +[ + "d394", + "d300", + "d390", + "d301", + "d398", + "d406", + "d100", + "d112", + "d212", + "c168" +]
- Changed
declarations_list1 field changed- changed
Input schema / properties / type / enumPrevious value: -[ - "d394", - "d300", - "d390", - "d100", - "d112" -]New value: +[ + "d394", + "d300", + "d390", + "d301", + "d398", + "d406", + "d100", + "d112" +]
- Changed
declarations_update1 field changed- added
Input schema / properties / filedExternallyAdded value: +{ + "additionalProperties": false, + "description": "The declaration was filed outside Storno (portal by hand, another program, at the counter): Storno records ANAF's number and follows its state on StareD112; ghiseu: true when the number is the counter registration number", + "properties": { + "ghiseu": { + "type": "boolean" + }, + "index": { + "type": "string" + } + }, + "required": [ + "index" + ], + "type": "object" +}
- Added
declarations_upload - Added
document_series_numbering_decision - Added
expiries_create - Added
expiries_delete - Added
expiries_get - Added
expiries_list - Added
expiries_renew - Added
expiries_upcoming - Added
expiries_update - Added
fiscal_calendar - Changed
import_execute1 field changed- changed
Input schema / properties / importOptions / descriptionPrevious value: -"Optional import options (e.g., skipDuplicates, updateExisting)"New value: +"Optional import options: markAsPaid (invoice imports); groupBy = week | day | order and platformName / platformCif / platformCountry (platform_sales); includeAll to import orders whose status is not paid / completed (WooCommerce, PrestaShop); cashRegisterName, vatGroups ({\"1\": \"21\", \"2\": \"11\", \"3\": \"5\", \"4\": \"0\"}) and paymentTypes ({\"1\": \"cash\", \"3\": \"card\"}) for receipts"
- Added
import_revert - Changed
import_template2 fields changed- changed
Input schema / properties / importType / enumPrevious value: -[ - "clients", - "products", - "invoices_issued", - "invoices_received", - "recurring_invoices" -]New value: +[ + "clients", + "products", + "invoices_issued", + "invoices_received", + "recurring_invoices", + "platform_sales", + "receipts" +] - added
Input schema / properties / sourceAdded value: +{ + "description": "Platform / shop whose column layout the template should use", + "enum": [ + "uber", + "bolt", + "glovo", + "tazz", + "woocommerce", + "prestashop" + ], + "type": "string" +}
- Changed
import_upload3 fields changed- changed
Input schema / properties / filePath / descriptionPrevious value: -"Absolute path to the file to upload (CSV, XLSX, or XML)"New value: +"Absolute path to the file to upload (CSV, XLSX, XML, or a ZIP of A4200 XML files)" - changed
Input schema / properties / importType / enumPrevious value: -[ - "clients", - "products", - "invoices_issued", - "invoices_received", - "recurring_invoices" -]New value: +[ + "clients", + "products", + "invoices_issued", + "invoices_received", + "recurring_invoices", + "platform_sales", + "receipts" +] - changed
Input schema / properties / source / enumPrevious value: -[ - "smartbill", - "saga", - "oblio", - "fgo", - "facturis_online", - "easybill", - "ciel", - "factureaza", - "facturare_pro", - "icefact", - "bolt", - "facturis", - "emag", - "generic" -]New value: +[ + "smartbill", + "saga", + "oblio", + "fgo", + "facturis_online", + "easybill", + "ciel", + "factureaza", + "facturare_pro", + "icefact", + "bolt", + "facturis", + "emag", + "uber", + "glovo", + "tazz", + "woocommerce", + "prestashop", + "cash_register", + "generic" +]
- Added
invoices_efactura_message - Added
partner_verify - Added
partners_verify_all - Changed
suppliers_create1 field changed- added
Input schema / properties / affiliatedAdded value: +{ + "description": "Affiliated party — D394 sets prsAfiliat = 1 when an affiliated partner appears on an invoice of the period", + "type": "boolean" +}
- Added
vehicles_create - Added
vehicles_delete - Added
vehicles_get - Added
vehicles_list - Added
vehicles_update
1 tool update
v1.0.38- Changed
companies_create1 field changed- changed
Input schema / properties / type / descriptionPrevious value: -"\"individual\" for a natural person identified by CNP (default company)"New value: +"\"individual\" for an individual person identified by CNP (default company)"
28 tool updates
v1.0.37- Changed
agent_sign_pdf1 field changed- changed
Input schema / properties / pin / descriptionPrevious value: -"Token PIN; defaults to STORNO_AGENT_PIN"New value: +"Token PIN; defaults to STORNO_AGENT_PIN, or to the PIN the agent remembers for this certificate"
- Changed
borderou_upload1 field changed- changed
Input schema / properties / filePath / descriptionPrevious value: -"Absolute path to the file to upload (CSV, XLSX, or XLS)"New value: +"Absolute path to the file to upload (CSV, XLSX, XLS, or PDF)"
- Changed
companies_create11 fields changed- added
Input schema / properties / addressAdded value: +{ + "description": "Street and number — individuals only", + "type": "string" +} - changed
Input schema / properties / cif / descriptionPrevious value: -"Romanian tax identification number / CIF (e.g., \"12345678\" or \"RO12345678\")"New value: +"Romanian tax identification number / CIF (e.g., \"12345678\" or \"RO12345678\") — companies only" - added
Input schema / properties / cityAdded value: +{ + "description": "City / localitate — individuals only (required)", + "type": "string" +} - added
Input schema / properties / cnpAdded value: +{ + "description": "The person's CNP (13 digits) — individuals only", + "type": "string" +} - added
Input schema / properties / countryAdded value: +{ + "description": "ISO country, default RO", + "type": "string" +} - added
Input schema / properties / emailAdded value: +{ + "type": "string" +} - added
Input schema / properties / nameAdded value: +{ + "description": "Full name — individuals only", + "type": "string" +} - added
Input schema / properties / phoneAdded value: +{ + "type": "string" +} - added
Input schema / properties / stateAdded value: +{ + "description": "County / județ — individuals only (required)", + "type": "string" +} - added
Input schema / properties / typeAdded value: +{ + "description": "\"individual\" for a natural person identified by CNP (default company)", + "enum": [ + "company", + "individual" + ], + "type": "string" +} - removed
Input schema / requiredRemoved value: -[ - "cif" -]
- Changed
declarations_create3 fields changed- added
Input schema / properties / dataAdded value: +{ + "additionalProperties": {}, + "description": "For d212 / c168: { input: <form input>, attachments?: [{name, contentBase64}] }", + "type": "object" +} - added
Input schema / properties / dosarIdAdded value: +{ + "description": "Attach the new declaration to this dosar", + "format": "uuid", + "type": "string" +} - changed
Input schema / properties / type / enumPrevious value: -[ - "d394", - "d300", - "d390", - "d100", - "d112" -]New value: +[ + "d394", + "d300", + "d390", + "d100", + "d112", + "d212", + "c168" +]
- Added
declarations_download_pdf - Added
declarations_file_via_agent - Added
declarations_update - Added
dosare_actions - Added
dosare_annual_return - Added
dosare_attach - Added
dosare_billing - Added
dosare_c168_create - Added
dosare_c168_prefill - Added
dosare_create - Added
dosare_d212_create - Added
dosare_d212_prefill - Added
dosare_delete - Added
dosare_document - Added
dosare_files_download - Added
dosare_files_upload - Added
dosare_get - Added
dosare_list - Added
dosare_registry_import - Added
dosare_registry_proposals - Added
dosare_stats - Added
dosare_update - Added
related_get - Changed
spv_request_types3 fields changed- added
Input schema / additionalPropertiesAdded value: +false - added
Input schema / properties / allAdded value: +{ + "description": "true = the whole catalog; default = only what the SPV form offers the company (a CNP sees a different list than a CUI)", + "type": "boolean" +} - added
Input schema / properties / companyIdAdded value: +{ + "description": "Company UUID (overrides STORNO_COMPANY_ID env var)", + "type": "string" +}
35 tool updates
v1.0.28- Added
accounting_export_zip - Added
agent_certificates - Added
agent_sign_pdf - Added
agent_status - Added
agent_submit_declaration_pdf - Added
anaf_declaration_status - Added
anaf_nomenclator_judete - Added
anaf_nomenclator_localitati - Added
anaf_nomenclator_strazi - Added
balance_analysis - Added
clients_from_registry - Added
dashboard_stats - Added
declaration_build - Added
declaration_form_spec - Added
declaration_forms - Added
declaration_pdf - Added
declaration_validate_xml - Added
defaults_invoice - Added
document_generate - Added
document_types - Added
spv_document_upload - Added
spv_documents_download - Added
spv_documents_get - Added
spv_documents_list - Added
spv_documents_mark_read - Added
spv_documents_stats - Added
spv_request_agent_result - Added
spv_request_delete - Added
spv_request_prepare - Added
spv_request_types - Added
spv_requests_list - Added
spv_sync_agent_result - Added
spv_sync_prepare - Added
storno_xml_generate - Added
vat_category_codes_list
283 tool updates
v1.0.17- First observed
accounting_export_settings_get - First observed
accounting_export_settings_update - First observed
admin_email_log - First observed
admin_organizations - First observed
admin_stats - First observed
admin_users - First observed
admin_version_override_update - First observed
admin_version_overrides - First observed
anaf_create_token_link - First observed
anaf_delete_token - First observed
anaf_status - First observed
anaf_sync_log - First observed
anaf_sync_status - First observed
anaf_sync_trigger - First observed
anaf_tokens - First observed
anaf_validate_cif - First observed
api_keys_list - First observed
api_keys_scopes - First observed
auth_forgot_password - First observed
auth_login - First observed
auth_me - First observed
auth_refresh - First observed
auth_register - First observed
auth_reset_password - First observed
auth_update_profile - First observed
backup_create - First observed
backup_download - First observed
backup_history - First observed
backup_restore - First observed
backup_restore_status - First observed
backup_status - First observed
balance_delete - First observed
balance_list - First observed
balance_reprocess - First observed
balance_rows - First observed
bank_accounts_create - First observed
bank_accounts_delete - First observed
bank_accounts_list - First observed
bank_accounts_update - First observed
borderou_providers - First observed
borderou_transaction_available_invoices - First observed
borderou_transaction_get - First observed
borderou_transaction_update - First observed
borderou_transactions - First observed
borderou_transactions_rematch - First observed
borderou_transactions_save - First observed
borderou_upload - First observed
cash_register_balance - First observed
cash_register_ledger - First observed
cash_register_movements_create - First observed
cash_register_movements_delete - First observed
cash_register_movements_list - First observed
cash_register_movements_update - First observed
clients_anaf_lookup - First observed
clients_bulk_delete - First observed
clients_create - First observed
clients_delete - First observed
clients_export_csv - First observed
clients_export_saga_xml - First observed
clients_get - First observed
clients_list - First observed
clients_sync_invoices - First observed
clients_update - First observed
clients_vies_lookup - First observed
companies_create - First observed
companies_delete - First observed
companies_delete_logo - First observed
companies_get - First observed
companies_list - First observed
companies_select - First observed
companies_set_active - First observed
companies_toggle_sync - First observed
companies_update - First observed
companies_upload_logo - First observed
company_registry_cities - First observed
company_registry_search - First observed
cpv_codes_search - First observed
declarations_agent_result - First observed
declarations_create - First observed
declarations_delete - First observed
declarations_download_xml - First observed
declarations_get - First observed
declarations_list - First observed
declarations_prepare - First observed
declarations_recalculate - First observed
declarations_refresh_statuses - First observed
declarations_submit - First observed
declarations_sync - First observed
declarations_validate - First observed
delivery_notes_bulk_convert - First observed
delivery_notes_cancel - First observed
delivery_notes_convert - First observed
delivery_notes_create - First observed
delivery_notes_delete - First observed
delivery_notes_email - First observed
delivery_notes_email_defaults - First observed
delivery_notes_email_history - First observed
delivery_notes_from_proforma - First observed
delivery_notes_get - First observed
delivery_notes_issue - First observed
delivery_notes_list - First observed
delivery_notes_pdf - First observed
delivery_notes_restore - First observed
delivery_notes_storno - First observed
delivery_notes_submit_etransport - First observed
delivery_notes_update - First observed
delivery_notes_validate_etransport - First observed
document_series_create - First observed
document_series_delete - First observed
document_series_list - First observed
document_series_set_default - First observed
document_series_update - First observed
efactura_messages_get - First observed
efactura_messages_list - First observed
einvoice_config_delete - First observed
einvoice_config_list - First observed
einvoice_config_save - First observed
einvoice_config_test - First observed
einvoice_providers - First observed
einvoice_submissions - First observed
einvoice_submit - First observed
email_templates_create - First observed
email_templates_delete - First observed
email_templates_list - First observed
email_templates_update - First observed
exchange_rates_convert - First observed
exchange_rates_list - First observed
exports_download - First observed
import_execute - First observed
import_get - First observed
import_history - First observed
import_mapping - First observed
import_preview - First observed
import_sources - First observed
import_template - First observed
import_upload - First observed
invitations_create - First observed
invitations_delete - First observed
invitations_list - First observed
invitations_resend - First observed
invoices_attachments - First observed
invoices_bulk_cancel - First observed
invoices_bulk_delete - First observed
invoices_bulk_mark_paid - First observed
invoices_bulk_storno - First observed
invoices_cancel - First observed
invoices_create - First observed
invoices_delete - First observed
invoices_email - First observed
invoices_email_defaults - First observed
invoices_email_history - First observed
invoices_events - First observed
invoices_export_csv - First observed
invoices_export_efactura_zip - First observed
invoices_export_payments_saga_xml - First observed
invoices_export_receipts_saga_xml - First observed
invoices_export_saga_xml - First observed
invoices_export_zip - First observed
invoices_get - First observed
invoices_issue - First observed
invoices_list - First observed
invoices_pdf - First observed
invoices_restore - First observed
invoices_share_links_create - First observed
invoices_share_links_list - First observed
invoices_share_links_revoke - First observed
invoices_submit - First observed
invoices_sync_client - First observed
invoices_update - First observed
invoices_validate - First observed
invoices_verify_signature - First observed
invoices_xml - First observed
licensing_create_key - First observed
licensing_list_keys - First observed
licensing_revoke_key - First observed
licensing_validate - First observed
mailer_config_delete - First observed
mailer_config_get - First observed
mailer_config_test - First observed
mailer_config_update - First observed
members_delete - First observed
members_list - First observed
members_permissions_reference - First observed
members_update - First observed
nc_codes_search - First observed
notification_preferences_get - First observed
notification_preferences_update - First observed
notifications_list - First observed
notifications_mark_read - First observed
notifications_read_all - First observed
notifications_unread_count - First observed
oauth2_clients_create - First observed
oauth2_clients_get - First observed
oauth2_clients_list - First observed
oauth2_clients_revoke - First observed
oauth2_clients_rotate_secret - First observed
oauth2_clients_scopes - First observed
oauth2_clients_update - First observed
payments_create - First observed
payments_delete - First observed
payments_list - First observed
pdf_template_config_get - First observed
pdf_template_config_preview - First observed
pdf_template_config_templates - First observed
pdf_template_config_update - First observed
product_categories_create - First observed
product_categories_delete - First observed
product_categories_list - First observed
product_categories_update - First observed
products_get - First observed
products_list - First observed
products_update - First observed
proforma_invoices_accept - First observed
proforma_invoices_bulk_delete - First observed
proforma_invoices_cancel - First observed
proforma_invoices_convert - First observed
proforma_invoices_create - First observed
proforma_invoices_delete - First observed
proforma_invoices_get - First observed
proforma_invoices_list - First observed
proforma_invoices_pdf - First observed
proforma_invoices_reject - First observed
proforma_invoices_send - First observed
proforma_invoices_update - First observed
receipts_cancel - First observed
receipts_convert_to_invoice - First observed
receipts_create - First observed
receipts_delete - First observed
receipts_email - First observed
receipts_email_defaults - First observed
receipts_email_history - First observed
receipts_get - First observed
receipts_issue - First observed
receipts_list - First observed
receipts_pdf - First observed
receipts_refund - First observed
receipts_restore - First observed
receipts_update - First observed
recurring_invoices_bulk_delete - First observed
recurring_invoices_bulk_issue_now - First observed
recurring_invoices_bulk_toggle_active - First observed
recurring_invoices_create - First observed
recurring_invoices_delete - First observed
recurring_invoices_get - First observed
recurring_invoices_issue_now - First observed
recurring_invoices_list - First observed
recurring_invoices_toggle - First observed
recurring_invoices_update - First observed
reports_sales_analysis - First observed
reports_vat - First observed
storage_config_delete - First observed
storage_config_get - First observed
storage_config_providers - First observed
storage_config_test - First observed
storage_config_update - First observed
suppliers_bulk_delete - First observed
suppliers_create - First observed
suppliers_delete - First observed
suppliers_export_csv - First observed
suppliers_export_saga_xml - First observed
suppliers_get - First observed
suppliers_list - First observed
suppliers_update - First observed
system_health - First observed
system_version - First observed
telemetry_send - First observed
vat_rates_create - First observed
vat_rates_delete - First observed
vat_rates_list - First observed
vat_rates_update - First observed
webhooks_create - First observed
webhooks_delete - First observed
webhooks_deliveries - First observed
webhooks_delivery_detail - First observed
webhooks_events - First observed
webhooks_get - First observed
webhooks_list - First observed
webhooks_regenerate_secret - First observed
webhooks_test - First observed
webhooks_update - First observed
white_label_config_get - First observed
white_label_config_update - First observed
white_label_config_verify_domain
TDQS
Scored across 374 tools
Most tools are scoped to a clear resource and action, and the descriptions are detailed enough to separate similar operations. However, the sheer number produces several near-overlapping flows (companies_select vs companies_set_active, declarations_submit vs declarations_file_via_agent vs agent_submit_declaration_pdf, retired declarations_sync vs spv_sync_prepare) that an agent can easily misselect.
Names mostly follow a resource_action snake_case pattern, but prefixes mix singular and plural forms (company_registry_search vs clients_list, product_categories_list), and some tools are noun phrases rather than verb-led (dashboard_stats, balance_analysis, fiscal_calendar). The surface remains readable but is not fully predictable at 374 tools.
374 tools is an extreme mismatch for a single MCP server, far beyond the 50+ threshold for severe overload. Even for a large ERP, this many tools overwhelms selection and violates the principle that each tool should clearly earn its place in a focused set.
The surface covers full lifecycle operations for invoices, proformas, delivery notes, receipts, payments, clients, suppliers, bank/cash registers, VAT, declarations, SPV, e-Factura, e-Transport, imports/exports, backups, admin, webhooks, and licensing. Almost every domain an agent would need is represented, with only intentional constraints such as sync-only product creation.
Maintenance
Related MCP Connectors
Invoicing tools for AI assistants: clients, draft invoices with computed tax, and email sending.
Create invoices from your AI assistant in 6 languages and 10 currencies, ready for WhatsApp.
Spanish Veri*factu invoicing: create invoices, expenses and VAT returns from your AI assistant.
Issue Brazilian service invoices (NFS-e Nacional) from your AI, with preview and confirmation.
Related MCP Servers
- AlicenseNot gradedqualityCmaintenanceEnables integration with Fatture in Cloud to manage Italian electronic invoices through natural conversation, including creating, sending, and tracking invoices and financial data.51 PyPI25MIT
- AlicenseNot gradedqualityDmaintenanceEnables AI assistants to interact with the SuperFaktura invoicing system for managing invoices, clients, and expenses via natural language.3Apache 2.0
- AlicenseNot gradedqualityBmaintenanceEnables AI agents to issue Romania e-Factura electronic invoices (factura electronica) into the national ANAF/SPV system by building UBL 2.1 CIUS-RO XML and uploading it under the merchant's own ANAF access token.MIT
- AlicenseNot gradedqualityBmaintenanceEnables AI agents to issue Italian FatturaPA electronic invoices and transmit them to the SdI via Invoicetronic. Supports creating and querying invoices with Italian VAT rates.MIT