Fortnox MCP Server
Click 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., "@Fortnox MCP Servershow me my unpaid 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.
Fortnox MCP Server
An MCP (Model Context Protocol) server for integrating with the Fortnox Swedish accounting system. This server enables LLMs to interact with Fortnox for managing invoices, customers, suppliers, orders, accounts, vouchers, and provides business intelligence analytics.
Two Ways to Use
Mode | Best For | Setup |
Remote Mode | End users | Just add URL, authorize in browser |
Local Mode | Developers, self-hosted | Configure environment variables |
Related MCP server: billy-mcp
Quick Start: Remote Mode (Recommended)
The easiest way to use Fortnox MCP - no credentials needed, just authorize in your browser.
Option A: Add to Claude.ai (Web)
Go to claude.ai
Navigate to Settings → Integrations → Add Integration
Enter the URL:
https://fortnox-mcp.vercel.app/mcpWait for it to load, then authorize access by clicking connect
Option B: Add to Claude Desktop
Open your Claude Desktop config file:
macOS:
~/Library/Application Support/Claude/claude_desktop_config.jsonWindows:
%APPDATA%\Claude\claude_desktop_config.json
Add this configuration:
{
"mcpServers": {
"fortnox": {
"url": "https://fortnox-mcp.vercel.app/mcp"
}
}
}Restart Claude Desktop. When you first ask Claude to do something with Fortnox, a browser window will open for you to authorize access to your Fortnox account. Once authorized, you're all set!
Quick Start: Local Mode (Self-Hosted)
For developers who want to run the server locally or use their own Fortnox app credentials.
1. Get your Fortnox credentials
Register at Fortnox Developer Portal
Create an application to get your Client ID and Client Secret
Complete the OAuth2 flow to get a Refresh Token
2. Add to Claude Desktop
Open your Claude Desktop config file:
macOS:
~/Library/Application Support/Claude/claude_desktop_config.jsonWindows:
%APPDATA%\Claude\claude_desktop_config.json
Add this configuration:
{
"mcpServers": {
"fortnox": {
"command": "npx",
"args": ["-y", "fortnox-mcp-server"],
"env": {
"FORTNOX_CLIENT_ID": "your-client-id",
"FORTNOX_CLIENT_SECRET": "your-client-secret",
"FORTNOX_REFRESH_TOKEN": "your-refresh-token"
}
}
}
}3. Restart Claude Desktop
That's it! You can now ask Claude to manage your Fortnox invoices, customers, and more.
Features
Customer Management
fortnox_list_customers- List and search customersfortnox_get_customer- Get customer detailsfortnox_create_customer- Create new customerfortnox_update_customer- Update customerfortnox_delete_customer- Delete customer
Invoice Management
fortnox_list_invoices- List invoices with filteringfortnox_get_invoice- Get invoice details with line itemsfortnox_create_invoice- Create new invoicefortnox_update_invoice- Update draft invoicefortnox_bookkeep_invoice- Bookkeep invoicefortnox_cancel_invoice- Cancel invoicefortnox_credit_invoice- Create credit notefortnox_send_invoice_email- Send invoice by email
Supplier Management
fortnox_list_suppliers- List and search suppliersfortnox_get_supplier- Get supplier detailsfortnox_create_supplier- Create new supplierfortnox_update_supplier- Update supplierfortnox_delete_supplier- Delete supplier
Supplier Invoice Management
fortnox_list_supplier_invoices- List supplier invoices with filteringfortnox_get_supplier_invoice- Get supplier invoice detailsfortnox_approve_supplier_invoice- Approve supplier invoice for paymentfortnox_payables_report- Get accounts payable aging report
Order Management
fortnox_list_orders- List sales orders with filteringfortnox_list_offers- List offers/quotes with filtering
Account Management
fortnox_list_accounts- List chart of accountsfortnox_get_account- Get account detailsfortnox_create_account- Create new accountfortnox_update_account- Update accountfortnox_delete_account- Delete account
Voucher Management
fortnox_list_vouchers- List vouchers (journal entries)fortnox_get_voucher- Get voucher details with rowsfortnox_create_voucher- Create manual voucherfortnox_list_voucher_series- List available voucher seriesfortnox_account_activity- Get activity for a specific accountfortnox_search_vouchers- Search vouchers by description, account, or amount
Company Information
fortnox_get_company_info- Get company detailsfortnox_list_financial_years- List company financial years
Analytics
fortnox_invoice_summary- Get invoice statistics by periodfortnox_top_customers- Get top customers by revenuefortnox_unpaid_report- Get detailed unpaid invoice report
Business Intelligence
fortnox_cash_flow_forecast- Forecast cash flow based on invoices and payablesfortnox_order_pipeline- Analyze sales order pipelinefortnox_sales_funnel- Analyze sales funnel from offers to invoicesfortnox_product_performance- Analyze product/article performancefortnox_period_comparison- Compare financial metrics across periodsfortnox_customer_growth- Analyze customer acquisition and growthfortnox_project_profitability- Analyze project profitability (if using projects)fortnox_cost_center_analysis- Analyze costs by cost centerfortnox_expense_analysis- Analyze expenses by categoryfortnox_yearly_comparison- Compare year-over-year performancefortnox_gross_margin_trend- Track gross margin trends over time
Installation
Via npx (Recommended)
No installation needed! Just add the config above to Claude Desktop.
Manual Installation
npm install -g fortnox-mcp-serverFrom Source
git clone https://github.com/jakobwennberg/fortnox-mcp.git
cd fortnox-mcp
npm install
npm run buildConfiguration
Environment Variables
Local Mode (default)
Variable | Required | Description |
| Yes | Your Fortnox app client ID |
| Yes | Your Fortnox app client secret |
| Yes | OAuth2 refresh token (only needed for initial setup; automatically persisted after first use) |
| No | Current access token (auto-refreshed) |
| No |
|
| No | HTTP port (default: 3000) |
Remote Mode (AUTH_MODE=remote)
Variable | Required | Description |
| Yes | Set to |
| Yes | Public URL of your server |
| Yes | Secret for signing JWT tokens |
| Yes | Your Fortnox app client ID |
| Yes | Your Fortnox app client secret |
| Yes* | Upstash Redis URL for token storage |
| Yes* | Upstash Redis token |
| No | HTTP port (default: 3000) |
*Falls back to in-memory storage if not provided (not recommended for production)
Getting OAuth Credentials
Register as a developer at Fortnox Developer Portal
Create a new application to get Client ID and Client Secret
Complete the OAuth2 authorization flow to obtain a refresh token
Set the environment variables
Usage
With Claude Desktop
See Quick Start above.
As HTTP Server
TRANSPORT=http PORT=3000 node dist/index.jsThen connect to http://localhost:3000/mcp
Tool Examples
List Unpaid Invoices
{
"tool": "fortnox_list_invoices",
"arguments": {
"filter": "unpaid",
"limit": 20
}
}Create Invoice
{
"tool": "fortnox_create_invoice",
"arguments": {
"customer_number": "1001",
"rows": [
{
"description": "Consulting services",
"quantity": 10,
"price": 1000
}
]
}
}Create Voucher
{
"tool": "fortnox_create_voucher",
"arguments": {
"voucher_series": "A",
"description": "Office supplies",
"transaction_date": "2025-01-24",
"rows": [
{ "account_number": 6110, "debit": 500 },
{ "account_number": 1910, "credit": 500 }
]
}
}Rate Limiting
The Fortnox API allows 25 requests per 5 seconds. This server includes automatic rate limiting to prevent exceeding this limit.
Development
# Run in development mode with auto-reload
npm run dev
# Build for production
npm run build
# Clean build artifacts
npm run cleanPublishing & Distribution
This server is published to multiple registries for easy installation:
Registry | URL | Purpose |
npm | Package distribution via | |
MCP Registry | Official MCP server discovery | |
GitHub | Source code |
How It Works
User adds config to Claude Desktop with
npx fortnox-mcp-serverClaude Desktop starts the server via npx (downloads latest version from npm)
Server authenticates with Fortnox using OAuth2 credentials from environment variables
Claude can now use tools like
fortnox_list_invoices,fortnox_create_customer, etc.Server handles API calls to Fortnox, including automatic token refresh and rate limiting
Token Persistence (Local Mode)
Fortnox refresh tokens are single-use — each token refresh returns a new one. The server automatically persists the latest refresh token to ~/.fortnox-mcp/tokens.json so it survives process restarts without requiring manual config updates.
On first run, the server reads
FORTNOX_REFRESH_TOKENfrom your environment/configAfter each token refresh, the new refresh token is saved to
~/.fortnox-mcp/tokens.jsonOn subsequent restarts, the server uses the persisted token (which is always the latest)
If the persisted file is missing or corrupt, the server falls back to the environment variable
The token file is created with restricted permissions (0600) for security.
Releasing New Versions
To release a new version, use the release script:
# Bug fixes (1.0.0 → 1.0.1)
npm run release:patch
# New features (1.0.0 → 1.1.0)
npm run release:minor
# Breaking changes (1.0.0 → 2.0.0)
npm run release:majorThe release script automatically:
Bumps the version in
package.jsonUpdates
server.jsonfor the MCP RegistryBuilds the project
Commits and tags the release
Publishes to npm
Publishes to MCP Registry
Pushes to GitHub
Prerequisites for releasing:
npm login- Logged into npmmcp-publisher login github- Logged into MCP RegistryClean git working directory
Users Get Updates Automatically
When you publish a new version, users running npx -y fortnox-mcp-server will automatically get the latest version the next time they restart Claude Desktop.
Deploying Your Own Remote Server
Want to host your own instance of the Fortnox MCP server? Follow these instructions.
Deploy to Vercel
1. Prerequisites
A Vercel account
An Upstash Redis database (for token storage)
A Fortnox Developer account with an app created
2. Set Environment Variables
In your Vercel project settings, add these environment variables:
Variable | Description |
| Set to |
| Your Vercel deployment URL (e.g., |
| A random secret string for signing tokens (generate with |
| Your Fortnox app client ID |
| Your Fortnox app client secret |
| Upstash Redis REST URL |
| Upstash Redis REST token |
3. Configure Fortnox OAuth Callback
In your Fortnox app settings, add this redirect URI:
https://your-app.vercel.app/oauth/fortnox/callback4. Deploy
vercel --prodServer Endpoints
Endpoint | Description |
| Health check |
| OAuth metadata |
| Start OAuth flow |
| Exchange code for tokens |
| Fortnox OAuth callback |
| Protected MCP endpoint |
Architecture
┌─────────────────────────────────────────────────────────────┐
│ fortnox-mcp-server │
├─────────────────────────────────────────────────────────────┤
│ Mode: AUTH_MODE=local | remote │
├─────────────────────────────────────────────────────────────┤
│ │
│ LOCAL MODE REMOTE MODE │
│ ─────────── ─────────── │
│ • Env var tokens • OAuth flow │
│ • Single user • Multi-user │
│ • stdio or HTTP • HTTP only │
│ • Auto-persisted tokens • Token storage (Redis) │
│ (~/.fortnox-mcp/) │
│ │
└─────────────────────────────────────────────────────────────┘License
MIT
Available Tools
51 toolsfortnox_account_activityAccount Activity ReportARead-onlyIdempotent
Show all voucher transactions affecting specific account(s).
IMPORTANT: The financial_year parameter uses Fortnox sequential IDs (1, 2, 3...), NOT calendar years. Use fortnox_list_financial_years first to find the correct ID for your target year.
Common use cases:
Rent expenses: account_number=5010 (or 5010-5099 range)
Salary costs: account_range={ from: 7000, to: 7999 }
Bank transactions: account_number=1930
Revenue analysis: account_range={ from: 3000, to: 3999 }
Note: This tool fetches voucher details and filters client-side since the Fortnox API doesn't support native account filtering. Use date ranges to limit the scan.
Args:
account_number (number): Single account number to filter by (1000-9999)
account_numbers (array): Multiple account numbers to filter by (max 20)
account_range (object): Account range { from: 3000, to: 3999 }
financial_year (number): Fortnox financial year ID (use fortnox_list_financial_years to find)
period ('today' | ... | 'last_year'): Convenience date period filter
from_date (string): Filter vouchers from this date (YYYY-MM-DD)
to_date (string): Filter vouchers to this date (YYYY-MM-DD)
voucher_series (string): Filter by voucher series (e.g., 'A')
include_summary (boolean): Include totals per account (default: true)
max_vouchers (number): Max vouchers to scan, 10-500 (default: 500)
response_format ('markdown' | 'json'): Output format
Returns: Transactions matching the account criteria with optional summary.
Examples:
First call fortnox_list_financial_years to find that ID 4 = 2025
Bank transactions this month: account_number=1930, financial_year=4, period="this_month"
Salary costs: account_range={ from: 7000, to: 7999 }, financial_year=4
Rent expenses: account_number=5010, financial_year=4
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Even though annotations already declare readOnlyHint=true and destructiveHint=false, the description adds valuable behavioral context: it fetches voucher details and filters client-side, has a max_vouchers limit, and returns a summary. This goes beyond the annotations and helps the agent understand performance and output 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?
The description is well-structured into sections: core purpose, critical warning, use cases, parameter list, return note, and examples. It is longer than average, but every section earns its place and aids correct invocation; important warnings are placed prominently.
Shorter descriptions cost fewer tokens and are easier for agents to parse. 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 absence of an output schema, the description adequately explains what the tool returns (transactions matching account criteria with optional summary). It also covers prerequisites, parameter constraints, and usage examples, making it complete for a read-only reporting 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 input schema is empty, so the description carries the entire burden of documenting parameters. It enumerates all arguments with types, constraints (e.g., account_numbers max 20, max_vouchers 10-500, response_format enum), and concrete examples, making the tool fully invocable by the agent.
Input schemas describe structure but not intent. Descriptions should explain 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 statement: "Show all voucher transactions affecting specific account(s)." It clearly distinguishes this tool from sibling tools like fortnox_list_vouchers or fortnox_search_vouchers by focusing on account activity and account-based filtering.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly instructs agents to call fortnox_list_financial_years first to get the correct financial year ID, and warns that the API doesn't support native account filtering, recommending date ranges to limit the scan. Common use cases with example account numbers and ranges provide actionable when-to-use guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
fortnox_approve_supplier_invoiceApprove Supplier Invoice for PaymentA
Approve a supplier invoice for payment.
This approves the invoice and marks it ready for payment processing.
Args:
given_number (string): The supplier invoice given number to approve (required)
response_format ('markdown' | 'json'): Output format
Returns: Confirmation that the invoice has been approved for payment.
| Name | Required | Description | Default |
|---|---|---|---|
| given_number | Yes | The supplier invoice given number to approve | |
| response_format | No | Output format: 'markdown' or 'json' | markdown |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false, signaling a write operation. The description adds value by explaining the outcome ('marks it ready for payment processing') and the return value (confirmation). It does not mention reversibility or permissions, but the provided context goes beyond the annotation basics.
Agents need to know what a tool does to the 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 well-structured, with a clear opening statement, a brief explanation of the effect, and a compact Args/Returns layout. Every sentence contributes useful information without unnecessary fluff.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple tool with only two parameters and no output schema, the description covers the action, its consequence, parameters, and return value. It doesn't mention error scenarios or status prerequisites, but these are not critical for understanding the core function.
Complex tools with many parameters or behaviors need more documentation. Simple 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's Args section largely mirrors the schema's parameter descriptions. It adds no additional semantic detail beyond what the schema already provides, so the baseline score 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 clearly states the tool approves a supplier invoice for payment, using a specific verb ('approve') and resource ('supplier invoice'). It also clarifies the consequence ('marks it ready for payment processing'), which distinguishes it from sibling tools like cancel, credit, or bookkeep.
Agents choose between tools based on descriptions. A clear purpose with a specific verb 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 the action, but provides no explicit guidance on when to choose this tool over alternatives (e.g., bookkeep_invoice or credit_invoice) or any prerequisites like invoice status. There are no exclusions or conditions given, so it offers only implied context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
fortnox_bookkeep_invoiceBookkeep Fortnox InvoiceA
Bookkeep an invoice, creating the accounting entries. Once booked, the invoice cannot be edited.
Args:
document_number (string): Invoice document number to bookkeep (required)
response_format ('markdown' | 'json'): Output format
Returns: Confirmation of bookkeeping with the created voucher reference.
| Name | Required | Description | Default |
|---|---|---|---|
| document_number | Yes | Invoice document number | |
| response_format | No | Output format: 'markdown' or 'json' | markdown |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate a mutating operation (readOnlyHint=false), and the description adds valuable behavioral context: the irreversible nature of booking and the return of a voucher reference. No contradictions 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?
The description is compact and efficient: a single purpose sentence, a clear args list, and a returns line. No fluff or redundant 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?
For a simple two-parameter action, the description covers what it does, the critical constraint (irreversibility), and the return value. It lacks explicit mention of prerequisites like the invoice existing or being in a bookable state, but the overall clarity is high.
Complex tools with many parameters or behaviors need more documentation. Simple 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 well-defined in the schema. The tool description repeats the parameter details without adding extra meaning, so a baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb 'Bookkeep' and resource 'an invoice', and clearly states the outcome: 'creating the accounting entries'. This distinguishes it from sibling tools like create_invoice, cancel_invoice, or approve_supplier_invoice by indicating a final accounting action.
Agents choose between tools based on descriptions. A clear purpose with a specific verb 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 this is for finalizing an invoice into the accounting ledger, and the note 'Once booked, the invoice cannot be edited' provides important context about when to use it. However, it does not explicitly name alternatives or exclude cases like already-booked invoices.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
fortnox_cancel_invoiceCancel Fortnox InvoiceADestructive
Cancel an invoice. Booked invoices will have reversal entries created.
Args:
document_number (string): Invoice document number to cancel (required)
response_format ('markdown' | 'json'): Output format
Returns: Confirmation of cancellation.
| Name | Required | Description | Default |
|---|---|---|---|
| document_number | Yes | Invoice document number | |
| response_format | No | Output format: 'markdown' or 'json' | markdown |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate destructive behavior (destructiveHint=true), so the bar is lower. The description adds meaningful context by explicitly stating that booked invoices will have reversal entries created, which clarifies the side effect and provides insight 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 extremely concise, with a clear one-sentence purpose, a compact Args list, and a Returns note. No unnecessary words or redundant information, making it easy to parse and act upon.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the simple two-parameter schema, the description covers the return value ('Confirmation of cancellation') and a key side effect (reversal entries). It's adequate for a straightforward cancellation tool, though it does not mention error handling or permissions, which are not critical for basic use.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so both parameters are fully documented in the schema. The description repeats the parameter names and types without adding extra meaning or nuance, which meets the baseline for coverage but does not exceed it.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's function with a specific verb and resource: 'Cancel an invoice.' It also distinguishes the behavior for booked invoices by mentioning reversal entries, which sets it apart from related tools like credit invoice or 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?
No guidance is provided on when to use this tool versus alternatives such as fortnox_credit_invoice or fortnox_delete_customer. The description simply explains the action without contextual direction, leaving the agent to infer appropriate usage.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
fortnox_cash_flow_forecastCash Flow ForecastARead-onlyIdempotent
Generate cash flow forecast from unpaid receivables and payables. Shows expected inflows, outflows, net flow, and running balance grouped by week or month.
| Name | Required | Description | Default |
|---|---|---|---|
| group_by | No | How to group the forecast: 'week' or 'month' | week |
| horizon_days | No | Number of days to forecast ahead (1-365, default: 90) | |
| include_overdue | No | Include overdue receivables and payables in the forecast | |
| response_format | No | Output format: 'markdown' or 'json' | markdown |
| starting_balance | No | Optional starting cash balance to use for projection |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish read-only, idempotent, and non-destructive behavior. The description adds useful behavioral context by specifying the data source (unpaid receivables/payables) and output components (expected inflows, outflows, net flow, running balance), going beyond the structured 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?
A single, well-structured sentence that immediately conveys the tool's purpose and output. It is front-loaded with the action verb and contains no filler or redundant information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Even without an output schema, the description adequately explains the return values (inflows, outflows, net flow, running balance). All parameters are covered by the schema, and the description covers the core business logic. Minor caveats about forecast estimation could be added, but not essential.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents every parameter. The description only reinforces the 'group_by' concept by mentioning grouping by week or month, but adds no new semantics for the remaining parameters.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states a specific action ('Generate cash flow forecast') with a specific resource ('unpaid receivables and payables') and defines the expected outputs (inflows, outflows, net flow, running balance). This distinguishes it from sibling reporting tools by focusing on forecast generation from unpaid items.
Agents choose between tools based on descriptions. A clear purpose with a specific verb 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 clear context for when to use this tool: when a cash flow forecast based on unpaid receivables/payables is needed. It does not explicitly mention alternatives or exclusions, but the purpose is specific enough to guide selection.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
fortnox_cost_center_analysisCost Center AnalysisARead-onlyIdempotent
[LIMITED] Analyze costs by cost center/department. Returns cost center list only.
For actual cost center data, use fortnox_account_activity with cost center filtering on vouchers.
| Name | Required | Description | Default |
|---|---|---|---|
| period | No | Date period to analyze | |
| to_date | No | End date for analysis (YYYY-MM-DD). Ignored if period is specified. | |
| from_date | No | Start date for analysis (YYYY-MM-DD). Ignored if period is specified. | |
| cost_center | No | Filter to a specific cost center code | |
| response_format | No | Output format: 'markdown' or 'json' | markdown |
| account_range_to | No | End of account range to include (default: all accounts) | |
| account_range_from | No | Start of account range to include (default: all accounts) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover read-only, idempotent, and non-destructive behavior. The description adds valuable context by stating the limited return type and that it does not provide full cost data, which helps set expectations beyond the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two concise sentences, with the key limitation '[LIMITED]' front-loaded. It avoids redundancy and every sentence adds information, making it highly efficient.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple read-only tool with no output schema, the description adequately indicates the output type ('cost center list only') and limitations. It also points to a richer alternative, covering the essential context without extraneous detail.
Complex tools with many parameters or behaviors need more documentation. 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 covers all 7 parameters with complete descriptions (100% coverage), so the description need not repeat parameter details. It adds no extra semantic value, but the schema is sufficient, earning a baseline score of 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 clearly states the tool's function: 'Analyze costs by cost center/department' with a specific verb and resource. It also distinguishes itself by noting it 'Returns cost center list only' and directing to a sibling tool for actual data, making its scope 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?
Explicitly provides usage guidance: the '[LIMITED]' marker warns of constraints, and the instruction to 'use fortnox_account_activity with cost center filtering on vouchers' for actual cost center data gives a clear alternative. This satisfies when-to-use and when-not-to-use requirements.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
fortnox_create_accountCreate Fortnox AccountB
Create a new account in the chart of accounts.
Args:
account_number (number): Account number 1000-9999 (required)
description (string): Account description (required)
vat_code (string): VAT code for the account
active (boolean): Whether the account is active (default: true)
cost_center_settings ('ALLOWED' | 'MANDATORY' | 'NOTALLOWED'): Cost center settings
project_settings ('ALLOWED' | 'MANDATORY' | 'NOTALLOWED'): Project settings
sru_code (number): SRU code for tax reporting
Returns: The created account details.
| Name | Required | Description | Default |
|---|---|---|---|
| active | No | Whether the account is active | |
| sru_code | No | SRU code for tax reporting | |
| vat_code | No | VAT code for the account | |
| description | Yes | Account description (required) | |
| account_number | Yes | Account number (1000-9999, required) | |
| response_format | No | Output format: 'markdown' or 'json' | markdown |
| project_settings | No | Project settings for the account | |
| cost_center_settings | No | Cost center settings for the account |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate readOnlyHint=false, so the write nature is known. The description adds that it returns the created account details, but offers no additional context on permissions, validation, or side effects. Minor added 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?
The description is concise and well-structured, with a clear main sentence and an Args list. It is slightly redundant with the schema but does not waste 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?
With eight parameters and no output schema, the description should more thoroughly describe the return value and any business rules. The return statement 'The created account details' is vague, and no mention is made of uniqueness or other constraints. The description is adequate but not comprehensive.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, meaning the input schema already describes all parameters. The description restates the parameters with types and constraints but adds no new semantic insight beyond what is in the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool creates a new account in the chart of accounts, using a specific verb and resource. This distinguishes it from sibling tools like fortnox_update_account, fortnox_delete_account, and fortnox_get_account.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description does not provide guidance on when to use this tool versus alternatives. It merely states 'Create a new account' without mentioning conditions, exclusions, or other tools like fortnox_update_account for modifications.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
fortnox_create_customerCreate Fortnox CustomerA
Create a new customer in Fortnox.
Args:
name (string): Customer name (required)
customer_number (string): Customer number (auto-generated if not provided)
organisation_number (string): Company registration number
email (string): Primary email address
phone (string): Primary phone number
address1, address2, zip_code, city, country, country_code: Address fields
currency (string): 3-letter currency code (e.g., 'SEK')
vat_number (string): VAT registration number
vat_type ('SEVAT' | 'EUVAT' | 'EUREVERSEDVAT' | 'EXPORT'): VAT type
terms_of_payment (string): Payment terms code
price_list (string): Price list code
comments (string): Internal comments
Returns: The created customer with assigned customer number.
| Name | Required | Description | Default |
|---|---|---|---|
| city | No | City | |
| name | Yes | Customer name (required) | |
| No | Primary email address | ||
| phone | No | Primary phone number | |
| country | No | Country name | |
| address1 | No | Street address line 1 | |
| address2 | No | Street address line 2 | |
| comments | No | Internal comments about the customer | |
| currency | No | Currency code (e.g., 'SEK', 'EUR') | |
| vat_type | No | VAT type for the customer | |
| zip_code | No | Postal/ZIP code | |
| price_list | No | Price list code | |
| vat_number | No | VAT registration number | |
| country_code | No | Two-letter country code (e.g., 'SE' for Sweden) | |
| customer_number | No | Customer number (auto-generated if not provided) | |
| response_format | No | Output format: 'markdown' or 'json' | markdown |
| terms_of_payment | No | Payment terms code | |
| organisation_number | No | Organisation/company number |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds useful behavioral context such as 'customer_number auto-generated if not provided' and 'Returns: The created customer with assigned customer number.' It does not contradict the annotations, which already indicate non-read-only and non-idempotent behavior, but it does not deepen the explanation of side effects or prerequisites.
Agents need to know what a tool does to the 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 structured with an Args list and Returns section, but the Args block largely duplicates the information available in the input schema. While it is readable and front-loaded with the main purpose, the redundancy prevents it from being exceptionally 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 create tool with no output schema, the description adequately explains the return value and the auto-generation of customer numbers. It is sufficiently complete given the rich input schema and annotations, though it could mention permission requirements or idempotency 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?
The input schema already provides descriptions for all 18 parameters (100% coverage). The description restates these parameters and adds minimal semantic value, such as grouping address fields and giving an example currency code. This does not meaningfully exceed 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 begins with 'Create a new customer in Fortnox,' which is a specific verb+resource statement. It clearly distinguishes this tool from sibling tools like fortnox_update_customer, fortnox_delete_customer, and fortnox_get_customer.
Agents choose between tools based on descriptions. A clear purpose with a specific verb 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 creating a new customer, but it does not explicitly state when not to use it or mention alternatives. For example, it does not say 'use fortnox_update_customer for existing customers.' Usage context is only implied.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
fortnox_create_invoiceCreate Fortnox InvoiceA
Create a new invoice in Fortnox.
Args:
customer_number (string): Customer number (required)
rows (array): Invoice line items (at least one required)
Each row: { description, quantity?, price?, article_number?, unit?, discount?, vat?, account_number? }
invoice_date (string): Invoice date YYYY-MM-DD (defaults to today)
due_date (string): Due date YYYY-MM-DD
our_reference (string): Our reference person
your_reference (string): Customer's reference
invoice_type ('INVOICE' | 'CASH' | 'CARD' | 'UNDEFINED'): Invoice type
currency (string): 3-letter currency code
terms_of_payment (string): Payment terms code
comments (string): Internal comments
remarks (string): Remarks printed on invoice
freight (number): Shipping cost
administration_fee (number): Admin fee
send_type ('EMAIL' | 'PRINT' | 'EINVOICE'): How to send
Returns: The created invoice with assigned document number.
Example rows: [{ "description": "Consulting services", "quantity": 10, "price": 1000 }]
| Name | Required | Description | Default |
|---|---|---|---|
| rows | Yes | Invoice rows/lines (at least one required) | |
| freight | No | Freight/shipping cost | |
| remarks | No | Remarks printed on the invoice | |
| comments | No | Comments on the invoice | |
| currency | No | Currency code (e.g., 'SEK') | |
| due_date | No | Due date (YYYY-MM-DD) | |
| send_type | No | How to send the invoice | |
| invoice_date | No | Invoice date (YYYY-MM-DD, defaults to today) | |
| invoice_type | No | Type of invoice | |
| our_reference | No | Our reference person | |
| your_reference | No | Customer's reference person | |
| customer_number | Yes | Customer number (required) | |
| response_format | No | Output format: 'markdown' or 'json' | markdown |
| terms_of_payment | No | Payment terms code | |
| administration_fee | No | Administration fee |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations indicate readOnlyHint=false and destructiveHint=false, so a write operation is expected. The description adds useful context beyond annotations: the return value (created invoice with document number), default for invoice_date, and example row structure. No 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?
The description is organized into Args, Returns, and Example rows. It lists all parameters concisely without fluff. The example is valuable. Slightly longer than ideal but well-structured and every section 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 15 parameters and no output schema, the description covers all parameters, the return value, and provides an example. It doesn't address edge cases or error handling, but for a create tool this is reasonably complete, especially 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 description coverage is 100%, so the baseline is 3. The description repeats parameter names but adds an example row structure and clarifies invoice_type/send_type enums. This is helpful but not a significant semantic addition beyond the schema's detailed descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states 'Create a new invoice in Fortnox' with a specific verb and resource. It distinguishes from sibling tools like fortnox_credit_invoice (credit) and fortnox_update_invoice (update) by being the create operation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The context is clear for a create operation, but it does not explicitly name alternatives or when-not-to-use scenarios. It provides defaults and an example, giving practical guidance, but lacks exclusions like 'use fortnox_credit_invoice for credit invoices'.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
fortnox_create_supplierCreate Fortnox SupplierA
Create a new supplier in Fortnox.
Args:
name (string): Supplier name (required)
supplier_number (string): Supplier number (auto-generated if not provided)
organisation_number (string): Company registration number
email (string): Email address
phone (string): Phone number
address1, address2, zip_code, city, country, country_code: Address fields
currency (string): 3-letter currency code
vat_number (string): VAT registration number
bank_account (string): Bank account number
bg_number (string): Bankgiro number
pg_number (string): Plusgiro number
terms_of_payment (string): Payment terms code
comments (string): Internal comments
Returns: The created supplier with assigned supplier number.
| Name | Required | Description | Default |
|---|---|---|---|
| city | No | City | |
| name | Yes | Supplier name (required) | |
| No | Primary email address | ||
| phone | No | Primary phone number | |
| country | No | Country name | |
| address1 | No | Street address line 1 | |
| address2 | No | Street address line 2 | |
| comments | No | Internal comments about the supplier | |
| currency | No | Currency code (e.g., 'SEK', 'EUR') | |
| zip_code | No | Postal/ZIP code | |
| bg_number | No | Bankgiro number | |
| pg_number | No | Plusgiro number | |
| vat_number | No | VAT registration number | |
| bank_account | No | Bank account number | |
| country_code | No | Two-letter country code (e.g., 'SE' for Sweden) | |
| response_format | No | Output format: 'markdown' or 'json' | markdown |
| supplier_number | No | Supplier number (auto-generated if not provided) | |
| terms_of_payment | No | Payment terms code | |
| organisation_number | No | Organisation/company number |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations indicate readOnlyHint=false, openWorldHint=true, idempotentHint=false, destructiveHint=false. The description adds context by noting that supplier_number is auto-generated if not provided, and that the created supplier with assigned supplier number is returned. It does not contradict annotations and provides useful behavioral details beyond them.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured with a clear opening sentence, an Args list, and a Returns section. It is compact given the 19 parameters, with no filler text. However, the parameter list largely repeats the schema descriptions, making it slightly redundant but still efficient.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a complex tool with 19 parameters and no output schema, the description covers purpose, all parameters, and the return value. It does not address potential error cases or constraints beyond 'required' on name, but it provides sufficient context for an agent to invoke the tool correctly. The absence of an output schema is mitigated by the Returns section.
Complex tools with many parameters or behaviors need more documentation. 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% parameter description coverage, so the schema already explains each parameter. The description lists the parameters with brief clarifiers (e.g., '3-letter currency code') and notes auto-generation, but this mostly duplicates schema content. It adds little new meaning beyond the schema, fitting the baseline for high schema coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description starts with 'Create a new supplier in Fortnox,' which clearly specifies the action (create), the resource (supplier), and the system (Fortnox). This distinguishes it from sibling tools like update_supplier, delete_supplier, and list_suppliers. The description also summarizes the expected outcome in Returns.
Agents choose between tools based on descriptions. A clear purpose with a specific verb 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 indicates this tool is for creating a new supplier, which implies usage when adding a supplier. However, it does not explicitly mention when not to use it, such as when the supplier already exists (in which case update_supplier would be appropriate) or any prerequisites. The context is clear but not elaborated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
fortnox_create_voucherCreate Fortnox VoucherA
Create a new voucher (manual accounting entry) in Fortnox.
IMPORTANT: The sum of debits must equal the sum of credits (balanced entry).
Args:
voucher_series (string): Voucher series (e.g., 'A', 'B') (required)
description (string): Voucher description (required)
transaction_date (string): Transaction date YYYY-MM-DD (required)
rows (array): Accounting rows, minimum 2 (required)
Each row: { account_number, debit?, credit?, description?, cost_center?, project? }
cost_center (string): Default cost center for all rows
project (string): Default project for all rows
Returns: The created voucher with assigned voucher number.
Example: Create a cash payment voucher: { "voucher_series": "A", "description": "Office supplies payment", "transaction_date": "2025-01-24", "rows": [ { "account_number": 6110, "debit": 500, "description": "Office supplies" }, { "account_number": 1910, "credit": 500, "description": "Cash" } ] }
| Name | Required | Description | Default |
|---|---|---|---|
| rows | Yes | Voucher rows (minimum 2 rows required, debit must equal credit) | |
| project | No | Default project for all rows | |
| cost_center | No | Default cost center for all rows | |
| description | Yes | Voucher description (required) | |
| voucher_series | Yes | Voucher series (e.g., 'A', 'B') (required) | |
| response_format | No | Output format: 'markdown' or 'json' | markdown |
| transaction_date | Yes | Transaction date (YYYY-MM-DD, required) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate this is a write operation (readOnlyHint=false). The description adds valuable behavioral context beyond annotations: the critical balance requirement ('sum of debits must equal sum of credits'), the minimum of 2 rows, and the return value ('created voucher with assigned voucher number'). The example further clarifies expected 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 well-structured with clear sections: purpose, important note, args, returns, and an example. Every sentence provides useful information without redundancy. The 'IMPORTANT' callout emphasizes the critical balance rule, and the example is compact yet complete.
Shorter descriptions cost fewer tokens and are easier for agents to parse. 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 (7 parameters, nested rows, no output schema), the description is highly complete. It covers the return format, all required parameters, the balance constraint, and includes a realistic example. No output schema exists, so the explicit return description is especially valuable.
Complex tools with many parameters or behaviors need more documentation. Simple 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 Args section mostly repeats schema info, but it adds a concrete example showing how to structure rows with debit/credit and descriptions, which clarifies parameter semantics beyond the schema's field-level descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb and resource: 'Create a new voucher (manual accounting entry) in Fortnox.' This clearly distinguishes it from sibling tools like get_voucher, list_vouchers, and list_voucher_series, and the parenthetical clarifies it is for manual entries, not automatic invoice booking.
Agents choose between tools based on descriptions. A clear purpose with a specific verb 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 'manual accounting entry' implies when this tool is appropriate, but there is no explicit guidance on when to use it versus alternatives (e.g., fortnox_bookkeep_invoice for automatic bookings). No exclusions or alternative mentions are provided, so usage context is only implicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
fortnox_credit_invoiceCredit Fortnox InvoiceA
Create a credit note for an invoice. This creates a new credit invoice referencing the original.
Args:
document_number (string): Invoice document number to credit (required)
response_format ('markdown' | 'json'): Output format
Returns: The created credit invoice details.
| Name | Required | Description | Default |
|---|---|---|---|
| document_number | Yes | Invoice document number | |
| response_format | No | Output format: 'markdown' or 'json' | markdown |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate non-read-only and non-destructive behavior. The description adds that a new credit invoice referencing the original is created, but does not detail side effects on the original invoice or any required permissions.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise and front-loaded with the purpose, but the Args section largely duplicates the schema property descriptions, making it slightly 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 two-parameter create operation with no output schema, the description provides purpose, parameters, and return value, but lacks information on side effects or prerequisites.
Complex tools with many parameters or behaviors need more documentation. Simple 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 description adds that document_number is the invoice to credit, clarifying its role, while response_format is already fully 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 'Create a credit note for an invoice' with a specific verb and resource, and clarifies it creates a new credit invoice referencing the original, distinguishing it from sibling tools like cancel_invoice or create_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?
It clearly indicates when to use the tool (when a credit note for an invoice is needed) but does not explicitly contrast it with alternatives such as cancel_invoice or update_invoice.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
fortnox_customer_growthCustomer Growth AnalyticsARead-onlyIdempotent
Identify growing and declining customers by comparing revenue across periods. Shows growth rates and trends.
| Name | Required | Description | Default |
|---|---|---|---|
| show | No | Filter to show only growing, declining, or all customers | all |
| top_n | No | Number of customers to return (1-100, default: 20) | |
| compare_to | No | Period to compare against. If not specified, compares to the previous equivalent period. | |
| min_revenue | No | Only include customers with at least this much revenue in either period | |
| current_period | Yes | Current period to analyze (e.g., 'this_quarter', 'this_year') | |
| response_format | No | Output format: 'markdown' or 'json' | markdown |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, openWorldHint=true, idempotentHint=true, and destructiveHint=false, covering the safety profile. The description adds that it 'Shows growth rates and trends,' which is output-related rather than behavioral. No additional behavioral traits (e.g., data freshness, computation method, limitations) are disclosed, so the description adds limited 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?
The description is extremely concise: two sentences, no redundancy, and front-loaded with the core function. Every word contributes meaning, making it an efficient and well-structured description.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool has six parameters and no output schema, so the description should clarify what the tool returns beyond just 'growth rates and trends.' It does not mention fields like customer names, revenue amounts, or growth rate calculations, leaving the output structure somewhat vague. For a read-only analytics tool, this is a moderate gap given the absence of 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 description coverage is 100%, so the baseline is 3. The description does not add any parameter-level meaning beyond what the schema provides; it only mentions the high-level concept of comparing revenue across periods, which is consistent with the 'current_period' and 'compare_to' parameters but adds no new 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?
The description clearly states the tool's function: identifying growing and declining customers by comparing revenue across periods. It uses a specific verb ('Identify') and resource ('customers') with a clear analytical scope. However, it does not explicitly distinguish itself from sibling tools like fortnox_period_comparison or fortnox_top_customers, which could also analyze growth or period trends.
Agents choose between tools based on descriptions. A clear purpose with a specific verb 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 use for customer growth analysis but does not provide explicit guidance on when to use this tool versus alternatives such as fortnox_period_comparison or fortnox_top_customers. There are no stated exclusions or scenarios where another tool would be preferred, leaving the usage context only implicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
fortnox_delete_accountDelete Fortnox AccountADestructive
Delete an account from the chart of accounts.
WARNING: This action cannot be undone. The account must not have any transactions.
Args:
account_number (number): Account number to delete (required)
Returns: Confirmation of deletion.
| Name | Required | Description | Default |
|---|---|---|---|
| account_number | Yes | Account number to delete |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark destructiveHint=true, but the description adds crucial details: 'cannot be undone' and 'must not have any transactions.' It also states a return confirmation, adding 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?
Five short lines: action, warning, precondition, arg doc, return. 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 one-parameter destructive delete, it includes warning, precondition, and return value. Output schema is absent but return is stated. It could specify error behavior (e.g., if account has transactions), but the warning implies it won't proceed.
Complex tools with many parameters or behaviors need more documentation. Simple 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 account_number defined and constrained (integer 1000-9999). The description repeats the parameter name/type but adds no new semantic 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?
Description clearly states 'Delete an account from the chart of accounts,' specifying the verb and resource. It distinguishes from sibling delete tools (e.g., delete_customer, delete_supplier) by targeting accounts.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description warns that the account must not have any transactions, providing a clear precondition for use. It also flags irreversibility. While it doesn't explicitly name alternatives, the precondition serves as a when-not condition.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
fortnox_delete_customerDelete Fortnox CustomerADestructive
Delete a customer from Fortnox.
WARNING: This action cannot be undone. The customer must not have any invoices or orders.
Args:
customer_number (string): Customer number to delete (required)
Returns: Confirmation of deletion.
| Name | Required | Description | Default |
|---|---|---|---|
| customer_number | Yes | Customer number to delete |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true, and the description adds that the action 'cannot be undone' and requires the customer to have no invoices or orders. This goes beyond the annotation by specifying irreversibility and a critical precondition, enriching the agent's understanding of the tool's behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise and well-structured: a clear one-line purpose, a warning, an Args list, and Returns. No unnecessary words or fluff. Every sentence earns its place, making it easy for an agent to parse quickly.
Shorter descriptions cost fewer tokens and are easier for agents to parse. 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 delete operation with annotations, the description covers the essential aspects: the action, irreversibility, precondition, and return confirmation. It lacks details on error handling if the customer has invoices, but is sufficiently complete for the 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?
The input schema already provides 100% coverage with the description 'Customer number to delete'. The description's Args section merely repeats this information without adding extra syntax, format, or edge-case details. Since schema coverage is high, 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 clearly states 'Delete a customer from Fortnox', which is a specific verb and resource. This distinguishes it from sibling tools like fortnox_create_customer, fortnox_update_customer, and fortnox_get_customer. The purpose 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?
The description provides a clear precondition: 'The customer must not have any invoices or orders.' This implies when not to use the tool, though it does not explicitly name alternatives. The context is clear enough for an agent to decide when deletion is appropriate.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
fortnox_delete_supplierDelete Fortnox SupplierADestructive
Delete a supplier from Fortnox.
WARNING: This action cannot be undone. The supplier must not have any invoices.
Args:
supplier_number (string): Supplier number to delete (required)
Returns: Confirmation of deletion.
| Name | Required | Description | Default |
|---|---|---|---|
| supplier_number | Yes | Supplier number to delete |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the destructiveHint annotation, the description explicitly warns that the action cannot be undone and requires the supplier to have no invoices. This adds critical safety context that the annotation alone does not 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?
The description is compact and well-structured: a clear main statement, a warning, an args section, and a returns section. Every sentence serves a purpose, and there is 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 simple delete operation with one parameter and no output schema, the description covers purpose, danger, prerequisites, and return value. It is complete and sufficient for an agent to select and invoke the 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 single parameter supplier_number is fully described in the schema, and the description restates it without adding new meaning. With 100% 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?
The description clearly states the tool deletes a supplier from Fortnox, using a specific verb and resource. It is distinctly differentiated from sibling tools like fortnox_delete_customer and fortnox_delete_account by naming the exact 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 provides clear context by warning that the supplier must not have invoices, implying when deletion is valid. It doesn't explicitly name alternatives, but the precondition and naming convention make usage clear enough.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
fortnox_expense_analysisExpense AnalysisARead-onlyIdempotent
[LIMITED] Analyze expenses by account class. Returns category structure only.
For actual expense data, use fortnox_account_activity with account_range={from: 4000, to: 8999}.
| Name | Required | Description | Default |
|---|---|---|---|
| period | No | Date period to analyze | |
| to_date | No | End date for analysis (YYYY-MM-DD). Ignored if period is specified. | |
| group_by | No | Group expenses by individual account or account class (e.g., 4xxx, 5xxx) | account_class |
| from_date | No | Start date for analysis (YYYY-MM-DD). Ignored if period is specified. | |
| compare_to | No | Optional period to compare against | |
| response_format | No | Output format: 'markdown' or 'json' | markdown |
| account_range_to | No | End of expense account range (default: 8999) | |
| account_range_from | No | Start of expense account range (default: 4000) |
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 that the tool is '[LIMITED]' and returns only category structure, not actual expense data, which is valuable behavioral context beyond the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences: the first clearly states the core purpose and limitation, the second points to the alternative. No fluff, immediately scannable, and appropriately 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 no output schema, the description clearly states that the tool returns 'category structure only,' which sets expectations. It also points to the sibling tool for actual data, covering the main functional gap. However, it does not detail what the category structure contains (e.g., totals, counts), so it is not fully complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so parameters are already well-documented. The description does not add specific parameter-level detail beyond what the schema provides, but it reinforces the account_range defaults indirectly via the alternative tool 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?
The description clearly states the tool analyzes expenses by account class and explicitly notes it 'Returns category structure only.' This distinguishes it from sibling tools like fortnox_account_activity and fortnox_expense_analysis's limited 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?
It explicitly says when not to use this tool ('For actual expense data, use fortnox_account_activity') and provides a concrete alternative with parameters. This gives the agent clear decision guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
fortnox_get_accountGet Fortnox AccountARead-onlyIdempotent
Retrieve detailed information about a specific account.
Args:
account_number (number): The account number to retrieve (1000-9999, required)
response_format ('markdown' | 'json'): Output format
Returns: Complete account details including description, VAT settings, and balances.
| Name | Required | Description | Default |
|---|---|---|---|
| account_number | Yes | The account number to retrieve (1000-9999) | |
| response_format | No | Output format: 'markdown' or 'json' | markdown |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already provide readOnlyHint and idempotentHint. The description adds value by specifying the return content (description, VAT settings, balances), giving the agent concrete output expectations. No contradictions.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise and structured with Args and Returns sections. Every line adds useful information without unnecessary fluff, making it easy to scan.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple read-only tool, the description covers purpose, parameters, and return value highlights. Annotations handle side-effect transparency, and the absence of an output schema is compensated by the explicit return 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%, and the description only restates parameter names and the account_number range already present in the schema. It does not add additional semantic meaning beyond the structured definitions.
Input schemas describe structure but not intent. Descriptions should explain 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 'Retrieve detailed information about a specific account', which is a specific verb+resource+scope. It clearly distinguishes from sibling tools like list_accounts by focusing on a single account.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The 'specific account' phrasing implies use for single-account lookups, but the description does not explicitly mention alternatives or when-not scenarios. No reference to list_accounts or other siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
fortnox_get_company_infoGet Fortnox Company InformationARead-onlyIdempotent
Retrieve information about the company connected to this Fortnox account.
Returns company name, organisation number, addresses, contact details, and other company information.
Args:
response_format ('markdown' | 'json'): Output format
Returns: Company details including name, organisation number, address, and contact information.
| Name | Required | Description | Default |
|---|---|---|---|
| response_format | No | Output format: 'markdown' or 'json' | markdown |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, covering the safety profile. The description adds value by explicitly listing the returned data fields (company name, organisation number, addresses, contact details) and notes it's 'other company information,' which helps set expectations about the response. It does not introduce any contradicting 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 structured with clear sections and is not overly long, but it contains redundancy: the initial sentence already states what is returned, and the 'Returns' section repeats nearly the same detail. This duplication makes it slightly less concise than it could be.
Shorter descriptions cost fewer tokens and are easier for agents to parse. 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 (one optional parameter, no output schema, read-only annotations), the description is complete. It identifies the resource, enumerates the returned fields, and mentions the optional output format. With rich annotations covering the operational context, no additional information is needed.
Complex tools with many parameters or behaviors need more documentation. Simple 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 parameter 'response_format' already has a description and enum in the schema. The description's 'Args' section repeats this information without adding new semantics, so it adds no meaningful value beyond what the schema provides. Baseline of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb 'Retrieve' and the specific resource: 'information about the company connected to this Fortnox account.' It distinguishes from siblings like fortnox_get_account or fortnox_get_customer by focusing on company-level info. The name and title reinforce this purpose.
Agents choose between tools based on descriptions. A clear purpose with a specific verb 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 clear context: this is for retrieving company information from the connected Fortnox account. It does not explicitly name alternatives or exclusions, but the context is unambiguous enough for an agent to know when to select it over other getters. A brief alternative note would elevate it to 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
fortnox_get_customerGet Fortnox CustomerARead-onlyIdempotent
Retrieve detailed information about a specific customer.
Args:
customer_number (string): The customer number to retrieve (required)
response_format ('markdown' | 'json'): Output format
Returns: Complete customer details including contact info, addresses, payment terms, and VAT settings.
| Name | Required | Description | Default |
|---|---|---|---|
| customer_number | Yes | The customer number to retrieve | |
| response_format | No | Output format: 'markdown' or 'json' | markdown |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and destructiveHint=false, covering the safety profile. The description adds return-content details but does not disclose additional behavioral traits such as permission requirements, error behavior, 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?
The description is structured and succinct, but the 'Args' section duplicates schema content without adding value. The 'Returns' section is useful and 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?
The tool is simple with two parameters and no output schema; the description covers the return content adequately. It omits error-handling or auth context, but given the annotations and simple scope, this is sufficient.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema already provides full descriptions for both parameters, and the 'Args' section merely restates them. No additional semantic detail (format, defaults, edge cases) is added beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action ('Retrieve') and the target ('detailed information about a specific customer'), distinguishing it from list/get tools for other entities. The singular 'specific customer' makes it unambiguous that this is a point-lookup.
Agents choose between tools based on descriptions. A clear purpose with a specific verb 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 use for a known customer number but does not explicitly contrast with siblings like fortnox_list_customers or other lookup tools. There is no 'when not to use' or alternative recommendation.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
fortnox_get_invoiceGet Fortnox InvoiceARead-onlyIdempotent
Retrieve detailed information about a specific invoice including all line items.
Args:
document_number (string): The invoice document number to retrieve (required)
response_format ('markdown' | 'json'): Output format
Returns: Complete invoice details including customer info, dates, amounts, line items, and payment status.
| Name | Required | Description | Default |
|---|---|---|---|
| document_number | Yes | The invoice document number to retrieve | |
| response_format | No | Output format: 'markdown' or 'json' | markdown |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate readOnly, idempotent, openWorld, and non-destructive behavior. The description supplements this by specifying the return content (customer info, dates, amounts, line items, payment status), which is useful because there is no output schema. 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 well-organized with Args and Returns sections, and the purpose is front-loaded. It is concise but includes some redundancy with the schema (e.g., parameter descriptions), making it slightly less crisp than the ideal, but still efficient.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given there is no output schema, the description appropriately explains the return value (complete invoice details with specific fields). It also clarifies required vs optional parameters. It does not mention errors or authorization, but for a simple get tool with strong annotations, this is sufficient.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema already provides full descriptions for both parameters, and the description largely repeats that information (document_number required, response_format enum). Since schema coverage is 100%, the description adds no significant semantic value beyond what is structured.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states a specific action ('Retrieve detailed information about a specific invoice including all line items'), which distinguishes it from list-oriented siblings like fortnox_list_invoices. The verb+resource combination makes it immediately obvious what this tool does.
Agents choose between tools based on descriptions. A clear purpose with a specific verb 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 a specific invoice (as opposed to listing multiple invoices), but does not explicitly mention when to prefer this over alternatives or any exclusions. No alternative tools are referenced, and the context signals show many sibling tools that could overlap in purpose.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
fortnox_get_supplierGet Fortnox SupplierARead-onlyIdempotent
Retrieve detailed information about a specific supplier.
Args:
supplier_number (string): The supplier number to retrieve (required)
response_format ('markdown' | 'json'): Output format
Returns: Complete supplier details including contact info, addresses, bank details, and payment terms.
| Name | Required | Description | Default |
|---|---|---|---|
| response_format | No | Output format: 'markdown' or 'json' | markdown |
| supplier_number | Yes | The supplier number to retrieve |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, which the description's 'Retrieve' aligns with. The description adds value by enumerating the returned data categories (contact info, addresses, bank details, payment terms), giving more behavioral context than 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?
The description is compact and well-organized: a one-sentence purpose, an Args block, and a Returns section. Every element earns its place with no filler, and the structure allows 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 simple read-only tool with two parameters and an enum, the description fully covers the purpose, parameters, and return content. It explicitly lists the categories of supplier details returned, which compensates for the lack of 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%, and the description's Args section essentially restates the schema. No additional meaning is added for either parameter beyond what the schema already documents, 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 resource ('supplier'), and clarifies it targets a specific supplier by number. This distinguishes it from fortnox_list_suppliers (which lists all) and fortnox_get_supplier_invoice (which targets invoices).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description clearly implies the tool is for fetching a single supplier's details by supplier_number. It doesn't explicitly name alternatives like list_suppliers, but the context is unambiguous enough for an agent to select this over sibling tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
fortnox_get_supplier_invoiceGet Fortnox Supplier InvoiceARead-onlyIdempotent
Retrieve detailed information about a specific supplier invoice including all line items.
Args:
given_number (string): The supplier invoice given number to retrieve (required)
response_format ('markdown' | 'json'): Output format
Returns: Complete supplier invoice details including supplier info, dates, amounts, line items, and payment status.
| Name | Required | Description | Default |
|---|---|---|---|
| given_number | Yes | The supplier invoice given number to retrieve | |
| response_format | No | Output format: 'markdown' or 'json' | markdown |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and destructiveHint=false, so the safety profile is known. The description adds value by disclosing what data is returned (supplier info, dates, amounts, line items, payment status) and mentions the required parameter and output format. No contradictions 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?
The description is concise and well-structured: a single-purpose first sentence, a brief Args section, and a Returns section. Every sentence earns its place, with no redundancy or fluff. It is front-loaded with the primary purpose.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple get-by-ID tool with no output schema, the description is complete. It explains the purpose, identifies the required parameter, describes the output format option, and details the return content (including line items and payment status). It covers all necessary operational aspects without needing extra 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?
The input schema already covers 100% of parameter descriptions: given_number and response_format each have clear descriptions. The description merely restates these in Args (e.g., 'The supplier invoice given number to retrieve' and 'Output format'), adding no additional semantic meaning beyond what the schema provides. 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 clearly states the tool's function with a specific verb ('Retrieve') and resource ('specific supplier invoice'), including scope ('all line items'). It distinguishes itself from sibling tools like fortnox_list_supplier_invoices (which lists rather than retrieves a single invoice) and fortnox_get_invoice (which targets customer invoices).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides clear context for when to use this tool: when detailed information about a specific supplier invoice is needed. It doesn't explicitly mention alternative tools or exclusions, but the 'specific' qualifier and the name align with typical get-by-ID usage, making the intended use clear enough.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
fortnox_get_voucherGet Fortnox VoucherARead-onlyIdempotent
Retrieve detailed information about a specific voucher including all accounting rows.
IMPORTANT: The financial_year parameter uses Fortnox sequential IDs (1, 2, 3...), NOT calendar years. Use fortnox_list_financial_years first to find the correct ID for your target year.
Args:
voucher_series (string): Voucher series (e.g., 'A') (required)
voucher_number (number): Voucher number within the series (required)
financial_year (number): Fortnox financial year ID (use fortnox_list_financial_years to find)
response_format ('markdown' | 'json'): Output format
Returns: Complete voucher details including all debit/credit rows.
| Name | Required | Description | Default |
|---|---|---|---|
| financial_year | No | Fortnox financial year ID (1, 2, 3...). NOT calendar year. Use fortnox_list_financial_years to find the correct ID. | |
| voucher_number | Yes | Voucher number within the series | |
| voucher_series | Yes | Voucher series (e.g., 'A') | |
| response_format | No | Output format: 'markdown' or 'json' | markdown |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark this as read-only and idempotent. The description adds valuable context: it specifies that 'financial_year' uses Fortnox sequential IDs not calendar years, and clarifies that the return includes 'all debit/credit rows.' No contradictions 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?
The description is well-structured with a clear opening line, an IMPORTANT caveat, an Args list, and a Returns section. It is somewhat redundant with the schema but stays efficient and front-loads the core purpose. Every section earns its place, though the Args list could be trimmed given schema duplication.
Shorter descriptions cost fewer tokens and are easier for agents to parse. 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 operation with no output schema, the description fully specifies what the agent gets ('Complete voucher details including all debit/credit rows') and the essential prerequisite for financial_year. Combined with the schema's rich parameter descriptions and the annotation set, the tool is sufficiently complete 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% and the description's Args section largely mirrors schema descriptions. The only added value is the pointer to fortnox_list_financial_years, but that is already embedded in the schema's financial_year description. Therefore, the description adds no significant semantics beyond the structured 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 starts with a crisp, specific verb+resource: 'Retrieve detailed information about a specific voucher including all accounting rows.' This clearly distinguishes it from sibling tools like fortnox_list_vouchers (list all) and fortnox_search_vouchers (search) by focusing on a single, fully-detailed voucher.
Agents choose between tools based on descriptions. A clear purpose with a specific verb 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 explicit usage prerequisite: 'Use fortnox_list_financial_years first to find the correct ID for your target year.' This is practical guidance that prevents misuse. However, it doesn't explicitly state when to prefer this tool over search_vouchers or list_vouchers, but the 'specific voucher' wording implies the use case.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
fortnox_gross_margin_trendGross Margin Trend AnalyticsARead-onlyIdempotent
[LIMITED] Analyze gross margin trends. Returns formula and structure only.
For actual margin data, use fortnox_account_activity with:
Revenue: account_range={from: 3000, to: 3999}
COGS: account_range={from: 4000, to: 4999}
| Name | Required | Description | Default |
|---|---|---|---|
| period | No | Date period to analyze (e.g., 'this_year', 'last_year') | |
| to_date | No | End date for analysis (YYYY-MM-DD). Ignored if period is specified. | |
| group_by | No | How to group the margin trend: 'month' or 'quarter' | month |
| from_date | No | Start date for analysis (YYYY-MM-DD). Ignored if period is specified. | |
| cogs_accounts | No | Cost of goods sold account range (e.g., '4000-4999'). Default: 4000-4999 | |
| response_format | No | Output format: 'markdown' or 'json' | markdown |
| revenue_accounts | No | Revenue account range (e.g., '3000-3999'). Default: 3000-3999 |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare read-only, idempotent, and non-destructive behavior. The description adds the crucial limitation that it returns only formula and structure, not real data. This goes beyond annotations to prevent misuse, though it could further describe exactly how the formula 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 description is compact and front-loads the critical limitation ('LIMITED' and 'Returns formula and structure only') before pivoting to a practical alternative. Every sentence carries weight, with no redundant or filler 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?
For a tool that intentionally provides only formula and structure, the description is complete enough: it states its limited output, points to the correct tool for actual data, and relies on a fully documented schema for parameter details. A minor gap is not describing what the formula/structure output actually looks like.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema descriptions cover 100% of the seven parameters, including enums, defaults, and date format patterns. The tool description adds account range examples for the alternative tool rather than new parameter semantics for this tool, so it meets the baseline but does not exceed it.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The title and description clearly identify the tool as 'Gross Margin Trend Analytics' while immediately flagging it as '[LIMITED]' and stating it returns 'formula and structure only.' This precise scope distinguishes it from sibling analytics tools and prevents false expectations.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides explicit guidance: for actual margin data, use fortnox_account_activity with specific account ranges for revenue (3000-3999) and COGS (4000-4999). This directly answers when to use this tool versus the alternative, which is model behavior.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
fortnox_invoice_summaryInvoice Summary AnalyticsARead-onlyIdempotent
Calculate summary statistics for invoices over a period.
Answers questions like:
"What was my total revenue this month?"
"How many invoices did we send last quarter?"
"What's the average invoice amount this year?"
"Show me revenue breakdown by customer"
Args:
period ('today' | 'yesterday' | 'this_week' | 'last_week' | 'this_month' | 'last_month' | 'this_quarter' | 'last_quarter' | 'this_year' | 'last_year'): Date period to analyze
from_date (string): Start date YYYY-MM-DD (ignored if period specified)
to_date (string): End date YYYY-MM-DD (ignored if period specified)
filter ('cancelled' | 'fullypaid' | 'unpaid' | 'unpaidoverdue' | 'unbooked'): Filter by invoice status
customer_number (string): Filter by specific customer
group_by ('customer' | 'month' | 'status'): Group statistics by dimension
include_details (boolean): Include individual invoice list (default: false)
response_format ('markdown' | 'json'): Output format
Returns: For JSON: { period, date_range, summary: { count, total, average, min, max, ... }, groups?: [...], invoices?: [...] } For Markdown: Formatted summary with totals and optional breakdown
Examples:
Monthly revenue: period="this_month"
Revenue by customer this year: period="this_year", group_by="customer"
Unpaid invoice totals: filter="unpaid"
Error Handling:
Returns truncation warning if >10,000 invoices
Returns "Error: ..." if API call fails
| Name | Required | Description | Default |
|---|---|---|---|
| filter | No | Filter invoices by status before calculating summary | |
| period | No | Date period to analyze (e.g., 'this_month', 'last_quarter'). If not specified, analyzes all invoices. | |
| to_date | No | End date for analysis (YYYY-MM-DD). Ignored if period is specified. | |
| group_by | No | Group summary statistics by this dimension | |
| from_date | No | Start date for analysis (YYYY-MM-DD). Ignored if period is specified. | |
| customer_number | No | Filter by specific customer number | |
| include_details | No | Include list of individual invoices in the response | |
| response_format | No | Output format: 'markdown' or 'json' | markdown |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds significant behavioral details beyond the annotations: it warns about truncation for >10,000 invoices, notes that from_date/to_date are ignored when period is specified, describes error handling ('Returns "Error: ..." if API call fails'), and outlines the return format for both JSON and Markdown. These enrich the read-only, idempotent nature already declared by annotations without contradiction.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-organized with clear sections: purpose, example questions, Args, Returns, Examples, and Error Handling. It front-loads the core purpose in the first sentence. However, the Args section largely duplicates the input schema, which adds redundancy and length. The extra examples and error handling justify some length, but the duplication keeps it from a perfect score.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
This is a complex tool with 8 parameters and no output schema. The description compensates admirably by detailing the return structure for JSON, describing the Markdown format, explaining truncation and error handling, and providing parameter combination examples. It covers the essential behavioral and output aspects that the schema and annotations do not, making it complete enough for an agent to invoke the tool confidently.
Complex tools with many parameters or behaviors need more documentation. Simple 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 repeats most parameter details already in the schema, adding little new semantic meaning. It does provide useful combination examples (e.g., group_by='customer' with period='this_year') that illustrate parameter interplay, but this is more about usage context than fundamentally new parameter semantics. Thus, it meets the baseline without exceeding it.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's purpose: 'Calculate summary statistics for invoices over a period.' It uses a specific verb and resource, and the example questions further clarify that it answers analytical queries about totals, counts, averages, and breakdowns. This distinguishes it from sibling tools like fortnox_list_invoices (which lists raw invoices) and fortnox_unpaid_report (which focuses specifically on unpaid invoices).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides clear context on when to use this tool through example questions and examples of parameter combinations (e.g., 'Monthly revenue: period="this_month"', 'Revenue by customer this year: period="this_year", group_by="customer"'). However, it does not explicitly name alternative tools or state when not to use it, so it stops short of full exclusion guidance. Still, the context is strong enough for an agent to infer appropriate usage.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
fortnox_list_accountsList Fortnox AccountsARead-onlyIdempotent
List accounts from the chart of accounts in Fortnox.
Retrieves a paginated list of accounts with optional filtering.
Args:
limit (number): Max results per page, 1-100 (default: 20)
page (number): Page number for pagination (default: 1)
search_description (string): Search accounts by description
from_account (number): Filter accounts from this number (1000-9999)
to_account (number): Filter accounts to this number (1000-9999)
response_format ('markdown' | 'json'): Output format
Returns: List of accounts with account number, description, and active status.
Examples:
List revenue accounts: from_account=3000, to_account=3999
List expense accounts: from_account=4000, to_account=8999
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | Page number for pagination | |
| limit | No | Maximum number of results to return (1-100) | |
| to_account | No | Filter accounts to this account number | |
| from_account | No | Filter accounts from this account number | |
| response_format | No | Output format: 'markdown' or 'json' | markdown |
| search_description | No | Search accounts by description |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false. The description adds meaningful behavioral details beyond those annotations: pagination behavior (limit/page), filtering ranges (account numbers 1000-9999), and return shape (account number, description, active status). No contradictions 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?
The description is well-organized: a one-sentence summary, a bulleted Args list, a Returns line, and two practical examples. Every section earns its place, and the text is appropriately sized for a tool with six parameters.
Shorter descriptions cost fewer tokens and are easier for agents to parse. 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 no output schema, the description provides all necessary context: pagination, filtering, return fields, and concrete examples. It fully equips an agent to select and 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 coverage is 100%, with every parameter already described in the schema. The description restates the parameters and adds illustrative examples (e.g., 'List revenue accounts: from_account=3000, to_account=3999'), but it does not provide significant additional meaning beyond the schema's existing descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with 'List accounts from the chart of accounts in Fortnox,' using a specific verb and resource. It clearly differentiates from sibling tools like fortnox_get_account (single account) and fortnox_create_account/update_account/delete_account (mutations).
Agents choose between tools based on descriptions. A clear purpose with a specific verb 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 conveys clear usage context: a paginated list with optional filtering, supported by examples such as 'from_account=3000, to_account=3999' for revenue accounts. It stops short of explicitly naming when to use alternatives (e.g., fortnox_get_account for a single account), but the intended use is unambiguous.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
fortnox_list_customersList Fortnox CustomersARead-onlyIdempotent
List customers from Fortnox accounting system.
Retrieves a paginated list of customers with optional filtering by status, name, or customer number.
Args:
limit (number): Max results per page, 1-100 (default: 20)
page (number): Page number for pagination (default: 1)
filter ('active' | 'inactive'): Filter by customer status
search_name (string): Search customers by name (partial match)
customer_number (string): Filter by specific customer number
organisation_number (string): Filter by organisation number
response_format ('markdown' | 'json'): Output format
Returns: List of customers with customer number, name, email, city, and organisation number.
Examples:
List all active customers: filter="active"
Search by name: search_name="Acme"
Get specific customer: customer_number="1001"
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | Page number for pagination | |
| limit | No | Maximum number of results to return (1-100) | |
| filter | No | Filter by customer status | |
| search_name | No | Search customers by name (partial match) | |
| customer_number | No | Filter by specific customer number | |
| response_format | No | Output format: 'markdown' or 'json' | markdown |
| organisation_number | No | Filter by organisation number |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, covering the safety profile. The description adds behavioral context by mentioning pagination, partial matching for search_name, and the return fields. It does not contradict annotations but also does not go deeply into edge cases, ordering, or rate limits. The added value over annotations is moderate.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured with a clear opening sentence, an Args list, a Returns section, and examples. It is somewhat lengthy but each section earns its place by clarifying parameters and usage. The information is front-loaded with the purpose, and the formatting makes it easy to scan.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's moderate complexity (7 parameters, 2 enums) and the absence of an output schema, the description provides good coverage: it explains pagination, filters, response format, and return fields. It lacks details like default sorting, but for a read-only list tool with strong annotations, this is sufficiently complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the schema already documents all parameters. The description repeats the parameter details in the Args section and adds examples (e.g., filter='active', search_name='Acme') that illustrate usage. However, it does not add new semantic meaning beyond the schema descriptions, such as parameter interactions or format specifics. 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 clearly states 'List customers from Fortnox accounting system' and elaborates on retrieving a paginated list with optional filters. It uses a specific verb+resource structure and distinguishes from sibling tools like fortnox_get_customer (single customer) and fortnox_create_customer (creation).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides clear context for when to use the tool (listing customers) and includes examples of common use cases. However, it does not explicitly contrast it with alternatives like fortnox_get_customer or fortnox_top_customers, nor does it state when not to use it. The guidance is implied rather than explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
fortnox_list_financial_yearsList Financial YearsARead-onlyIdempotent
List all financial years configured in Fortnox.
IMPORTANT: Voucher tools (fortnox_list_vouchers, fortnox_account_activity, etc.) use Fortnox sequential IDs (1, 2, 3...) NOT calendar years. Use this tool first to find the correct ID.
Example: If ID 4 maps to 2025-01-01 to 2025-12-31, use financial_year=4 in voucher tools.
Args:
response_format ('markdown' | 'json'): Output format
Returns: List of financial years with ID, date range, and accounting method.
| Name | Required | Description | Default |
|---|---|---|---|
| response_format | No | Output format: 'markdown' or 'json' | markdown |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare read-only, idempotent, non-destructive. The description adds value beyond annotations by stating the return contents (ID, date range, accounting method) and the critical fact that the ids are sequential, not calendar years. No 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?
The description is front-loaded with purpose, immediately followed by a crucial warning, an illustrative example, structured args/returns, and no filler. Every sentence contributes necessary context.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's low complexity, one optional param, and no output schema, the description fully covers what the tool returns and why it's useful, including the ID mapping that prevents misuse. With annotations covering safety, this is 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% and the parameter has a clear enum/default/description. The description repeats the parameter information without adding any new semantics, so it stays at the baseline of 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: 'List all financial years configured in Fortnox.' It distinguishes from sibling tools by clarifying this tool provides the sequential ID mapping needed by voucher tools, not just a generic 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?
Explicit guidance is given: 'Use this tool first to find the correct ID' for voucher tools, with a concrete example mapping ID 4 to a calendar year. This clearly tells when to use this tool in relation to alternatives like fortnox_list_vouchers.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
fortnox_list_invoicesList Fortnox InvoicesARead-onlyIdempotent
List invoices from Fortnox accounting system.
Retrieves a paginated list of invoices with optional filtering by status, customer, date range, or amount. Supports convenience period filters and can fetch all results for large datasets.
Args:
limit (number): Max results per page, 1-100 (default: 20)
page (number): Page number for pagination (default: 1)
filter ('cancelled' | 'fullypaid' | 'unpaid' | 'unpaidoverdue' | 'unbooked'): Filter by invoice status
customer_number (string): Filter by customer number
from_date (string): Filter invoices from this date (YYYY-MM-DD)
to_date (string): Filter invoices to this date (YYYY-MM-DD)
period ('today' | 'yesterday' | 'this_week' | 'last_week' | 'this_month' | 'last_month' | 'this_quarter' | 'last_quarter' | 'this_year' | 'last_year'): Convenience date period, overrides from_date/to_date
from_final_pay_date (string): Filter by due date from (YYYY-MM-DD)
to_final_pay_date (string): Filter by due date to (YYYY-MM-DD)
sortby ('customername' | 'customernumber' | 'documentnumber' | 'invoicedate' | 'total'): Field to sort by
sortorder ('ascending' | 'descending'): Sort order (default: ascending)
fetch_all (boolean): Fetch all results by auto-paginating (max 10,000 results)
min_amount (number): Filter invoices >= this amount (client-side)
max_amount (number): Filter invoices <= this amount (client-side)
response_format ('markdown' | 'json'): Output format
Returns: For JSON: { total, page, limit, count, has_more, total_pages, next_offset?, truncated?, invoices: [...] } For Markdown: Formatted list with pagination info
Examples:
List unpaid invoices: filter="unpaid"
Last month's invoices: period="last_month"
Top invoices by amount: sortby="total", sortorder="descending"
All invoices over 10000: fetch_all=true, min_amount=10000
Customer invoices this year: customer_number="1001", period="this_year"
Error Handling:
Returns "Error: Rate limit exceeded..." if API limit hit
Returns truncation info if fetch_all hits safety limits
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | Page number for pagination | |
| limit | No | Maximum number of results to return (1-100) | |
| filter | No | Filter invoices by status | |
| period | No | Convenience date period filter (e.g., 'last_month', 'this_quarter'). Overrides from_date/to_date if provided. | |
| sortby | No | Field to sort results by | |
| to_date | No | Filter invoices to this date (YYYY-MM-DD) | |
| fetch_all | No | Fetch all results by auto-paginating through all pages. WARNING: May take time for large datasets (max 10,000 results). | |
| from_date | No | Filter invoices from this date (YYYY-MM-DD) | |
| sortorder | No | Sort order for results | ascending |
| max_amount | No | Filter invoices with total <= this amount (client-side filter, applied after fetching) | |
| min_amount | No | Filter invoices with total >= this amount (client-side filter, applied after fetching) | |
| customer_number | No | Filter by customer number | |
| response_format | No | Output format: 'markdown' or 'json' | markdown |
| to_final_pay_date | No | Filter by due date to (YYYY-MM-DD) | |
| from_final_pay_date | No | Filter by due date from (YYYY-MM-DD) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description enriches the readOnly/openWorld/idempotent annotations by disclosing auto-pagination limits (max 10,000 results), client-side filtering behavior for min/max_amount, error handling for rate limits, and optional truncation. This is valuable behavioral context beyond the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is long but well-structured with clear sections (Args, Returns, Examples, Error Handling). It front-loads the core purpose and keeps each element purposeful, although some details repeat schema descriptions.
Shorter descriptions cost fewer tokens and are easier for agents to parse. 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 15 parameters and no output schema, the description is comprehensive: it explains return formats for JSON and Markdown, includes pagination details, provides five illustrative examples, and covers error scenarios. This gives the agent sufficient context to use 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?
The schema covers all 15 parameters with 100% documentation, but the description adds extra semantic value through an organized Args list with defaults, explicit override behavior (period overrides from_date/to_date), and practical examples tying parameters to use cases.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states 'List invoices from Fortnox accounting system' and explains it provides a paginated list with filtering options. This distinguishes it from related tools like fortnox_get_invoice (single invoice) and fortnox_invoice_summary (summaries). The scope is specific and actionable.
Agents choose between tools based on descriptions. A clear purpose with a specific verb 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 detailed use cases through examples (unpaid invoices, period filters, sorting, fetch_all) and clarifies when to use filters. However, it does not explicitly contrast with alternative tools like fortnox_get_invoice, so the guidance is implied rather than explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
fortnox_list_offersList Fortnox OffersARead-onlyIdempotent
List sales offers/quotes with filtering by status, customer, date range. Filter: cancelled, expired, ordercreated, ordernotcreated.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | Page number for pagination | |
| limit | No | Maximum number of results to return (1-100) | |
| filter | No | Filter offers by status: 'cancelled', 'expired', 'ordercreated', 'ordernotcreated' | |
| period | No | Convenience date period filter (e.g., 'last_month', 'this_quarter'). Overrides from_date/to_date if provided. | |
| sortby | No | Field to sort results by | |
| to_date | No | Filter offers to this date (YYYY-MM-DD) | |
| fetch_all | No | Fetch all results by auto-paginating through all pages. WARNING: May take time for large datasets (max 10,000 results). | |
| from_date | No | Filter offers from this date (YYYY-MM-DD) | |
| sortorder | No | Sort order for results | ascending |
| customer_number | No | Filter by customer number | |
| response_format | No | Output format: 'markdown' or 'json' | markdown |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, confirming the tool's safe read nature. The description adds no additional behavioral context such as pagination behavior, rate limits, or data scope beyond the filter options already present in the schema. 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 a single, front-loaded sentence that efficiently conveys the tool's purpose and key filtering options. Every word earns its place, with no redundant phrasing or unnecessary detail.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the rich schema (11 params, 5 enums, 100% coverage) and comprehensive annotations, the description is adequate for a list operation. It does not need to explain return values since no output schema exists, but the summary of filtering dimensions and the tool name are sufficient for an agent to understand the tool's role. Minor gap: no mention of pagination or response_format, though those are 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 all 11 parameters are fully documented with descriptions and enums. The description provides a high-level summary of filters but does not add extra semantic meaning 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?
The description uses the specific verb 'List' and clearly identifies the resource as 'sales offers/quotes', distinguishing it from sibling list tools such as list_invoices and list_orders. It also outlines the primary filtering dimensions (status, customer, date range), providing a clear purpose.
Agents choose between tools based on descriptions. A clear purpose with a specific verb 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 listing sales offers but does not explicitly differentiate when to use this tool over siblings like list_orders or list_invoices. No exclusions or alternative recommendations are provided, leaving the agent to infer context from the tool name and resource type.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
fortnox_list_ordersList Fortnox OrdersARead-onlyIdempotent
List sales orders with filtering by status, customer, date range. Filter: cancelled, expired, invoicecreated, invoicenotcreated.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | Page number for pagination | |
| limit | No | Maximum number of results to return (1-100) | |
| filter | No | Filter orders by status: 'cancelled', 'expired', 'invoicecreated', 'invoicenotcreated' | |
| period | No | Convenience date period filter (e.g., 'last_month', 'this_quarter'). Overrides from_date/to_date if provided. | |
| sortby | No | Field to sort results by | |
| to_date | No | Filter orders to this date (YYYY-MM-DD) | |
| fetch_all | No | Fetch all results by auto-paginating through all pages. WARNING: May take time for large datasets (max 10,000 results). | |
| from_date | No | Filter orders from this date (YYYY-MM-DD) | |
| sortorder | No | Sort order for results | ascending |
| customer_number | No | Filter by customer number | |
| response_format | No | Output format: 'markdown' or 'json' | markdown |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and destructiveHint=false, so the safety profile is covered. The description adds minimal behavioral context beyond the schema—it restates the filter options but does not mention pagination behavior, output content, or any operational quirks beyond what the schema already 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?
The description is two short sentences, front-loaded with the action and resource ('List sales orders'). Every sentence adds value, with no filler or repetition. The structure is ideal for quick 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?
For a simple read-only list tool with comprehensive schema and annotations, the description covers the essential purpose. However, with no output schema, it could explicitly describe what the response contains (e.g., order fields or format). The tool name and context largely suffice, but a small addition 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%, so the description does not need to compensate for undocumented parameters. It does provide a high-level grouping of parameters (status, customer, date range) and lists the filter enum values, but this largely duplicates the schema's existing param descriptions. The baseline of 3 is appropriate since no additional semantics are added.
Input schemas describe structure but not intent. Descriptions should explain 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 'List' and clearly identifies the resource 'sales orders', along with the filtering dimensions (status, customer, date range). This distinguishes it from sibling tools like fortnox_list_invoices or fortnox_list_customers.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage when sales orders are needed but does not explicitly state when to choose this over alternatives like fortnox_list_invoices or fortnox_list_offers. No exclusions or alternative guidance is provided, which is a gap given the number of similar list tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
fortnox_list_supplier_invoicesList Fortnox Supplier InvoicesARead-onlyIdempotent
List supplier invoices (accounts payable) from Fortnox.
Retrieves a paginated list of supplier invoices with optional filtering by status, supplier, date range, or amount.
Args:
limit (number): Max results per page, 1-100 (default: 20)
page (number): Page number for pagination (default: 1)
filter ('cancelled' | 'fullypaid' | 'unpaid' | 'unpaidoverdue' | 'unbooked' | 'pendingpayment'): Filter by invoice status
supplier_number (string): Filter by supplier number
from_date (string): Filter invoices from this date (YYYY-MM-DD)
to_date (string): Filter invoices to this date (YYYY-MM-DD)
period ('today' | 'yesterday' | ... | 'last_year'): Convenience date period, overrides from_date/to_date
from_final_pay_date (string): Filter by due date from (YYYY-MM-DD)
to_final_pay_date (string): Filter by due date to (YYYY-MM-DD)
sortby ('suppliername' | 'suppliernumber' | 'invoicenumber' | 'invoicedate' | 'total'): Field to sort by
sortorder ('ascending' | 'descending'): Sort order (default: ascending)
fetch_all (boolean): Fetch all results by auto-paginating (max 10,000 results)
min_amount (number): Filter invoices >= this amount (client-side)
max_amount (number): Filter invoices <= this amount (client-side)
response_format ('markdown' | 'json'): Output format
Returns: List of supplier invoices with supplier, dates, amounts, and status.
Examples:
List unpaid supplier invoices: filter="unpaid"
Last month's supplier invoices: period="last_month"
Supplier invoices this year: supplier_number="1", period="this_year"
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | Page number for pagination | |
| limit | No | Maximum number of results to return (1-100) | |
| filter | No | Filter supplier invoices by status | |
| period | No | Convenience date period filter (e.g., 'last_month', 'this_quarter'). Overrides from_date/to_date if provided. | |
| sortby | No | Field to sort results by | |
| to_date | No | Filter invoices to this date (YYYY-MM-DD) | |
| fetch_all | No | Fetch all results by auto-paginating through all pages. WARNING: May take time for large datasets (max 10,000 results). | |
| from_date | No | Filter invoices from this date (YYYY-MM-DD) | |
| sortorder | No | Sort order for results | ascending |
| max_amount | No | Filter invoices with total <= this amount (client-side filter) | |
| min_amount | No | Filter invoices with total >= this amount (client-side filter) | |
| response_format | No | Output format: 'markdown' or 'json' | markdown |
| supplier_number | No | Filter by supplier number | |
| to_final_pay_date | No | Filter by due date to (YYYY-MM-DD) | |
| from_final_pay_date | No | Filter by due date from (YYYY-MM-DD) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and non-destructive behavior. The description adds valuable behavioral details beyond annotations: pagination, fetch_all auto-pagination with a 10,000-result cap, client-side vs. server-side filtering (min_amount/max_amount), and response format options. 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?
The description is neatly organized with a summary, Args list, Returns section, and Examples. It is long but appropriately so for 15 parameters, and every part contributes actionable information 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?
The description fully equips an agent to invoke the tool correctly: it explains all parameters, return content (supplier, dates, amounts, status), pagination behavior, filter semantics, client-side filtering, and provides concrete examples. Since there is no output schema, the description's Return section compensates well.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Input schema coverage is 100% with each property having a rich description. The description's Args section mostly mirrors the schema, only adding minor clarifications like 'period overrides from_date/to_date' and 'client-side' for amount filters. It does not substantially enhance understanding 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 'List' and a precise resource 'supplier invoices (accounts payable) from Fortnox', which clearly distinguishes it from sibling tools like fortnox_list_invoices (which likely lists customer invoices) and fortnox_list_suppliers. It also communicates the tool's scope with optional filtering and pagination.
Agents choose between tools based on descriptions. A clear purpose with a specific verb 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 clear context for when to use the tool, listing status filters, date ranges, and examples like 'filter="unpaid"' and 'period="last_month"'. It does not explicitly name alternatives or state when not to use it, but the purpose is unambiguous enough for selection.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
fortnox_list_suppliersList Fortnox SuppliersARead-onlyIdempotent
List suppliers from Fortnox accounting system.
Retrieves a paginated list of suppliers with optional filtering.
Args:
limit (number): Max results per page, 1-100 (default: 20)
page (number): Page number for pagination (default: 1)
filter ('active' | 'inactive'): Filter by supplier status
search_name (string): Search suppliers by name (partial match)
response_format ('markdown' | 'json'): Output format
Returns: List of suppliers with supplier number, name, email, city, and organisation number.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | Page number for pagination | |
| limit | No | Maximum number of results to return (1-100) | |
| filter | No | Filter by supplier status | |
| search_name | No | Search suppliers by name (partial match) | |
| response_format | No | Output format: 'markdown' or 'json' | markdown |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and destructiveHint=false, covering the safety profile. The description adds valuable behavioral context beyond annotations: pagination (limit/page), partial-match search behavior, the response_format parameter, and the specific return 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?
The description is well-structured with a clear opening sentence, a bulleted Args list, and a Returns section. It is readable and front-loaded, though the Args list duplicates schema details, making it slightly longer than 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 appropriately explains return values ('supplier number, name, email, city, and organisation number'). It also covers pagination, filtering, and output format. However, it omits potential error cases and ordering/sorting behavior, so it is not fully exhaustive.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema has 100% description coverage for all 5 parameters, including defaults and enums. The description's Args section largely repeats the schema information, such as 'limit (number): Max results per page' and 'filter ('active' | 'inactive')', without adding new semantic 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 ('List') and clearly identifies the resource ('suppliers from Fortnox accounting system'). It distinguishes itself from sibling tools like 'fortnox_list_customers' and 'fortnox_get_supplier' by focusing on a paginated, filterable supplier 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 usage for listing suppliers with optional filtering and pagination, but it does not explicitly state when to prefer this over alternatives (e.g., 'fortnox_get_supplier' for a single supplier) or provide exclusion criteria. No alternative tools are mentioned.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
fortnox_list_vouchersList Fortnox VouchersARead-onlyIdempotent
List vouchers (accounting entries) from Fortnox.
Retrieves a paginated list of vouchers with optional filtering.
IMPORTANT: The financial_year parameter uses Fortnox sequential IDs (1, 2, 3...), NOT calendar years. Use fortnox_list_financial_years first to find the correct ID for your target year.
Args:
limit (number): Max results per page, 1-100 (default: 20)
page (number): Page number for pagination (default: 1)
voucher_series (string): Filter by voucher series (e.g., 'A', 'B')
financial_year (number): Fortnox financial year ID (use fortnox_list_financial_years to find)
from_date (string): Filter vouchers from this date (YYYY-MM-DD)
to_date (string): Filter vouchers to this date (YYYY-MM-DD)
response_format ('markdown' | 'json'): Output format
Returns: List of vouchers with series, number, description, and date.
Examples:
First call fortnox_list_financial_years to find that ID 4 = 2025
List vouchers for 2025: financial_year=4
List manual vouchers: voucher_series="A", financial_year=4
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | Page number for pagination | |
| limit | No | Maximum number of results to return (1-100) | |
| to_date | No | Filter vouchers to this date (YYYY-MM-DD) | |
| from_date | No | Filter vouchers from this date (YYYY-MM-DD) | |
| financial_year | No | Fortnox financial year ID (1, 2, 3...). NOT calendar year. Use fortnox_list_financial_years to find the correct ID. | |
| voucher_series | No | Filter by voucher series (e.g., 'A', 'B') | |
| response_format | No | Output format: 'markdown' or 'json' | markdown |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description goes beyond annotations by disclosing the non-obvious financial_year sequential ID behavior (not calendar years) and examples of how to use it. It also confirms pagination and return content, adding meaningful behavioral context even though the read-only/idempotent safety profile is already covered 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?
The description is well-structured with an intro, important note, Args list, Returns, and Examples. It is slightly verbose because the Args section largely duplicates schema descriptions, but the note and examples earn their place, making it appropriately sized for a 7-parameter 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?
Given no output schema, the description adequately explains return values (series, number, description, date), provides a critical dependency (financial_year ID), and includes usage examples. The combination of pagination, filtering, and the financial_year caveat gives a complete picture for selecting and invoking the 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?
With 100% schema description coverage, the baseline is 3. The description adds value by reinforcing the financial_year semantics, providing concrete examples (e.g., 'ID 4 = 2025'), and explaining the response_format. However, much of the Args section repeats schema descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool lists vouchers (accounting entries) from Fortnox with pagination and filtering. It uses a specific verb and resource, but does not explicitly differentiate from sibling tools like fortnox_search_vouchers or fortnox_get_voucher, though 'list' implies a plural summary.
Agents choose between tools based on descriptions. A clear purpose with a specific verb 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 clear usage context: it is a paginated list for vouchers with optional filters. It explicitly instructs the user to call fortnox_list_financial_years first to resolve the financial_year ID, which is a concrete usage guideline, but it doesn't directly compare to alternative list/search tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
fortnox_list_voucher_seriesList Fortnox Voucher SeriesARead-onlyIdempotent
List available voucher series in Fortnox.
Voucher series are used to categorize vouchers (e.g., 'A' for manual entries, 'B' for bank, etc.).
Args:
response_format ('markdown' | 'json'): Output format
Returns: List of voucher series with code, description, and whether manual entries are allowed.
| Name | Required | Description | Default |
|---|---|---|---|
| response_format | No | Output format: 'markdown' or 'json' | markdown |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and idempotentHint=true, so the safety profile is clear. The description adds value by specifying the return fields (code, description, manual entries allowed) and the domain purpose, which goes 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 well-structured with a one-line summary, a contextual note, and clear Args/Returns sections. It is concise but includes a slight redundancy by re-stating the parameter description already present in 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 list tool with no output schema, the description is adequately complete: it states what it returns and explains the domain. It does not mention pagination or whether all series are returned, but given openWorldHint and the likely small set, 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 coverage is 100% for the single parameter response_format, including enum and default. The description merely repeats the schema's explanation ('Output format: markdown or json'), adding no new semantic 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 'List available voucher series in Fortnox' with a clear verb and resource. It distinguishes from siblings like fortnox_list_vouchers by focusing on voucher series, and adds explanatory context about their purpose.
Agents choose between tools based on descriptions. A clear purpose with a specific verb 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 voucher series categorize vouchers, but it does not explicitly state when to use this tool versus alternatives or provide exclusions. No sibling tool is named as an alternative.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
fortnox_order_pipelineOrder Pipeline AnalyticsARead-onlyIdempotent
Analyze order pipeline and backlog. Shows pending vs invoiced orders grouped by status, customer, or month.
| Name | Required | Description | Default |
|---|---|---|---|
| period | No | Date period to analyze (e.g., 'this_month', 'this_year') | |
| to_date | No | End date for analysis (YYYY-MM-DD). Ignored if period is specified. | |
| group_by | No | How to group order pipeline statistics | status |
| from_date | No | Start date for analysis (YYYY-MM-DD). Ignored if period is specified. | |
| response_format | No | Output format: 'markdown' or 'json' | markdown |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and destructiveHint=false. The description adds meaningful behavioral context by stating that it shows pending vs invoiced orders and supports grouping, which goes beyond the safety flags. No contradiction 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 concise sentences, front-loaded with action and resource. Every word adds value and there is no extraneous information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only analytics tool with rich schema annotations and a full parameter schema, the description sufficiently covers the tool's purpose, output shape, and grouping options. It is complete enough for an agent to select and invoke correctly without additional detail.
Complex tools with many parameters or behaviors need more documentation. Simple 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 is documented. The description's mention of grouping by status, customer, or month aligns with the group_by parameter but adds no new semantics 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 uses a specific verb ('Analyze') and names the exact resource ('order pipeline and backlog'), then details the output ('pending vs invoiced orders grouped by status, customer, or month'). This clearly differentiates it from siblings like fortnox_list_orders or fortnox_invoice_summary.
Agents choose between tools based on descriptions. A clear purpose with a specific verb 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 implies when to use the tool: when analyzing order pipeline and backlog with pending vs invoiced comparison. It doesn't explicitly mention alternatives or exclusions, but the context is unambiguous and the sibling list makes the use case obvious.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
fortnox_payables_reportAccounts Payable Aging ReportARead-onlyIdempotent
Generate an accounts payable aging report for unpaid supplier invoices.
Answers questions like:
"What supplier invoices are overdue?"
"How much do we owe each supplier?"
"Show me aging breakdown of payables"
"Which supplier invoices over 10,000 SEK are unpaid?"
Args:
min_amount (number): Only include invoices >= this amount
supplier_number (string): Filter by specific supplier
group_by ('supplier' | 'age_bucket' | 'both'): How to group report (default: both)
include_details (boolean): Include individual invoice list (default: true)
response_format ('markdown' | 'json'): Output format
Returns: Aging report with summary, breakdowns by supplier and age bucket.
Age Buckets:
not_due: Due date is in the future
1-30 days: Overdue 1-30 days
31-60 days: Overdue 31-60 days
61-90 days: Overdue 61-90 days
90+ days: Overdue more than 90 days
Examples:
Full payables report: (use defaults)
Large unpaid invoices: min_amount=50000
Specific supplier: supplier_number="1"
| Name | Required | Description | Default |
|---|---|---|---|
| group_by | No | How to group unpaid supplier invoices in the report | both |
| min_amount | No | Only include invoices with balance >= this amount | |
| include_details | No | Include list of individual unpaid invoices | |
| response_format | No | Output format: 'markdown' or 'json' | markdown |
| supplier_number | No | Filter by specific supplier number |
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 clear. The description adds useful behavioral details: the age bucket definitions, the return summary/breakdown structure, and the ability to filter by min_amount and supplier_number. This goes beyond annotations without contradicting them.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-organized with clear sections: purpose, example questions, arguments, return value, age buckets, and examples. It is dense with useful information yet remains scannable and free of fluff. Every section contributes to understanding 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?
Given the tool has 5 parameters and no output schema, the description covers the essential context: what it does, what parameters to use, what the report includes, age bucket definitions, and practical examples. It could be more explicit about the exact output structure (e.g., field names), but for a report tool this is reasonably complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema already provides 100% parameter descriptions (e.g., 'Only include invoices with balance >= this amount'). The description's 'Args' section mostly restates the schema, and the examples (min_amount=50000, supplier_number='1') add minor flavor but no new semantic meaning. It meets the baseline for full schema coverage but doesn't elevate it.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with 'Generate an accounts payable aging report for unpaid supplier invoices,' a specific verb and resource. The example questions (e.g., 'What supplier invoices are overdue?') further clarify the tool's scope and distinguish it from neighboring invoice and report 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 example questions effectively convey when to use the tool (e.g., 'Show me aging breakdown of payables'). However, it does not explicitly name alternatives or say when not to use it, though the context is clear enough from the questions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
fortnox_period_comparisonPeriod Comparison AnalyticsARead-onlyIdempotent
Compare business metrics (revenue, invoice count, etc.) between two time periods with percentage changes.
| Name | Required | Description | Default |
|---|---|---|---|
| metrics | No | Metrics to compare between periods | |
| compare_to | No | Period to compare against. If not specified, compares to the previous equivalent period. | |
| current_period | Yes | Current period to analyze (e.g., 'this_month', 'this_quarter') | |
| response_format | No | Output format: 'markdown' or 'json' | markdown |
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 the behavioral detail that percentage changes are computed, which is useful but limited. It does not contradict annotations and provides some extra context, aligning with the calibration example for 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?
The description is a single, front-loaded sentence with zero wasted words. It immediately states the verb and resource, making it highly efficient 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 full schema, rich annotations, and clear description, the tool is well-specified. The description mentions percentage changes, which is the key output, and the response_format parameter covers output presentation. No output schema exists, but the description plus schema are sufficient for a comparison 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 detailed descriptions and enums for all parameters. The description adds minimal parameter meaning beyond 'revenue, invoice count' as examples, but the schema already does the heavy lifting. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb 'Compare' with a clear resource ('business metrics') and scope ('between two time periods with percentage changes'). This clearly distinguishes it from sibling analytics tools like fortnox_invoice_summary or fortnox_yearly_comparison, as period-over-period comparison is the unique focus.
Agents choose between tools based on descriptions. A clear purpose with a specific verb 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 clear context for when to use the tool (comparing metrics across two periods) but does not explicitly mention when not to use it or name any alternatives among the many sibling report tools. This is clear context without exclusions, so it falls short of a 5 but is still strong.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
fortnox_product_performanceProduct Performance AnalyticsARead-onlyIdempotent
Analyze product/customer sales performance. Returns top performers ranked by revenue, quantity, or invoice count.
| Name | Required | Description | Default |
|---|---|---|---|
| top_n | No | Number of top products to return (1-100, default: 20) | |
| metric | No | Metric to rank products by: 'revenue', 'quantity', or 'invoice_count' | revenue |
| period | No | Date period to analyze (e.g., 'this_year', 'last_quarter') | |
| to_date | No | End date for analysis (YYYY-MM-DD). Ignored if period is specified. | |
| from_date | No | Start date for analysis (YYYY-MM-DD). Ignored if period is specified. | |
| include_trends | No | Compare to previous period to show trends | |
| response_format | No | Output format: 'markdown' or 'json' | markdown |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, openWorldHint, idempotentHint, and destructiveHint, so the safety profile is clear. The description adds that results are ranked top performers, which is helpful, but does not disclose details about period handling, trends, or response format beyond the schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, front-loaded with the main verb and resource, no wasted words. The structure is efficient 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?
The description gives a high-level overview but does not explain nuances like the optional trends comparison, date range handling, or how it differs from other analytics tools. Given the absence of an output schema and competing siblings, more context would be beneficial, but the schema fills many 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 all parameters are documented in the schema. The description does not add extra parameter meaning, but the baseline of 3 applies per the rubric.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states it analyzes product/customer sales performance and returns top performers ranked by revenue, quantity, or invoice count. It has a specific verb and resource, but does not explicitly differentiate from sibling analytics tools like fortnox_top_customers or fortnox_period_comparison.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage when one needs top sales performers, but provides no explicit guidance on when to use this tool versus alternatives or when not to use it. There is no mention of exclusions or sibling tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
fortnox_project_profitabilityProject Profitability AnalyticsARead-onlyIdempotent
[LIMITED] Analyze profitability by project. Returns project list only.
For actual project financials, use fortnox_account_activity with project filtering on vouchers.
| Name | Required | Description | Default |
|---|---|---|---|
| period | No | Date period to analyze | |
| to_date | No | End date for analysis (YYYY-MM-DD). Ignored if period is specified. | |
| from_date | No | Start date for analysis (YYYY-MM-DD). Ignored if period is specified. | |
| project_number | No | Filter to a specific project number | |
| include_details | No | Include detailed breakdown of revenue and costs per project | |
| response_format | No | Output format: 'markdown' or 'json' | markdown |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, openWorldHint=true, idempotentHint=true, and destructiveHint=false. The description adds value by stating the tool is '[LIMITED]' and 'Returns project list only,' which clarifies a key behavioral constraint not fully captured by annotations alone. However, it doesn't go deeper into what 'project list' includes (e.g., project number, name, aggregated metrics).
Agents need to know what a tool does to the 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 clear sentences, front-loaded with '[LIMITED]' to immediately set expectations. Every word earns its place; no fluff 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?
Given 6 optional parameters, a robust annotation set, and no output schema, the description is fairly complete. It explains the limited scope, specifies the output boundary ('Returns project list only'), and points to the correct alternative for full financials. A minor gap is not describing what fields are in the returned project list, but the sibling alternative mitigates 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?
The input schema covers all 6 parameters with descriptions, and the schema description coverage is 100%, so the description doesn't need to add parameter details. The description itself adds no new information about parameters, matching 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?
The description clearly states the tool's function: 'Analyze profitability by project.' It also specifies the output scope: 'Returns project list only.' This distinguishes it from sibling tools like fortnox_account_activity and fortnox_invoice_summary, making the purpose unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides explicit alternative usage: 'For actual project financials, use fortnox_account_activity with project filtering on vouchers.' This tells the agent when to choose a different tool, which is exactly the guidance needed.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
fortnox_sales_funnelSales Funnel AnalyticsARead-onlyIdempotent
Analyze sales funnel from offers to orders to invoices. Shows counts, values, and conversion rates at each stage.
| Name | Required | Description | Default |
|---|---|---|---|
| period | No | Date period to analyze (e.g., 'this_quarter', 'this_year') | |
| to_date | No | End date for analysis (YYYY-MM-DD). Ignored if period is specified. | |
| from_date | No | Start date for analysis (YYYY-MM-DD). Ignored if period is specified. | |
| response_format | No | Output format: 'markdown' or 'json' | markdown |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, destructiveHint=false, and idempotentHint, so the safety profile is covered. The description adds behavioral context by specifying the output contents (counts, values, conversion rates), which is useful. 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?
The description is exactly two sentences, front-loaded with the main action and resource. It immediately conveys the funnel stages and outputs, with no unnecessary words or repetition.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool is a read-only analytics function with full schema coverage and rich annotations. The description covers the core purpose and outputs, which is sufficient for most use cases. It does not mention the period/date-range precedence, but that is already documented in the schema, so the description need not repeat 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 all four parameters are already well-documented (period enum, date range patterns, response_format enum). The description adds no parameter-specific semantics beyond what the schema provides, which aligns with the baseline score for full schema coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's purpose with a specific verb ('Analyze'), a defined resource ('sales funnel'), and the stages involved (offers → orders → invoices). It also mentions the metrics shown (counts, values, conversion rates), which distinguishes it from sibling tools like fortnox_invoice_summary or fortnox_order_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?
The description provides a clear context for when to use the tool: when analyzing the sales funnel from offers to invoices. It does not explicitly mention alternatives or exclusions, but the stated stages and metrics make the intended use obvious relative to siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
fortnox_search_vouchersSearch VouchersARead-onlyIdempotent
Search vouchers by description text.
IMPORTANT: The financial_year parameter uses Fortnox sequential IDs (1, 2, 3...), NOT calendar years. Use fortnox_list_financial_years first to find the correct ID for your target year.
Performs client-side text search across voucher descriptions.
Args:
search_text (string): Text to search for in voucher descriptions (min 2 chars)
financial_year (number): Fortnox financial year ID (use fortnox_list_financial_years to find)
period ('today' | ... | 'last_year'): Convenience date period filter
from_date (string): Filter vouchers from this date (YYYY-MM-DD)
to_date (string): Filter vouchers to this date (YYYY-MM-DD)
voucher_series (string): Filter by voucher series (e.g., 'A')
case_sensitive (boolean): Case-sensitive search (default: false)
include_rows (boolean): Include voucher row details (default: false)
max_vouchers (number): Max vouchers to scan, 10-500 (default: 500)
response_format ('markdown' | 'json'): Output format
Returns: Vouchers with descriptions matching the search text.
Examples:
First call fortnox_list_financial_years to find that ID 4 = 2025
Find salary vouchers: search_text="salary", financial_year=4, period="this_year"
Find rent payments: search_text="rent", financial_year=4, voucher_series="B"
| Name | Required | Description | Default |
|---|---|---|---|
| period | No | Convenience date period filter (e.g., 'this_month', 'last_quarter'). Overrides from_date/to_date. | |
| to_date | No | Filter vouchers to this date (YYYY-MM-DD) | |
| from_date | No | Filter vouchers from this date (YYYY-MM-DD) | |
| search_text | Yes | Text to search for in voucher descriptions (min 2 chars) | |
| include_rows | No | Include full voucher row details in results | |
| max_vouchers | No | Maximum vouchers to scan (10-500). Use date filtering for larger datasets. | |
| case_sensitive | No | Whether search should be case-sensitive | |
| financial_year | No | Fortnox financial year ID (1, 2, 3...). NOT calendar year. Use fortnox_list_financial_years to find the correct ID. | |
| voucher_series | No | Filter by voucher series (e.g., 'A', 'B') | |
| response_format | No | Output format: 'markdown' or 'json' | markdown |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds significant behavioral context beyond annotations: it discloses that the search is performed client-side, that financial_year is not a calendar year, and that max_vouchers limits the scan scope. These details help the agent anticipate performance and correctness issues. The annotations already establish read-only/idempotent, so the description complements rather than repeats.
Agents need to know what a tool does to the 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 well-structured with IMPORTANT, Args, Returns, and Examples sections, and the financial-year warning is front-loaded. However, the Args list essentially repeats the schema verbatim, adding redundancy for a 10-parameter tool. Still, the examples and warning earn their place, making it reasonably 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 (10 params), the description covers the core purpose, the critical financial_year caveat, scanning limits, and illustrative examples. It lacks explicit output shape details, but no output schema exists and the return is described as matching vouchers. Overall it is sufficient 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. The description's Args section largely duplicates the schema descriptions (e.g., financial_year warning is identical). It adds no new parameter semantics beyond examples, so no uplift beyond 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 'Search vouchers by description text,' a specific verb and resource that clearly differentiates this from sibling tools like fortnox_list_vouchers (list all) and fortnox_get_voucher (single voucher). The additional 'client-side text search' phrase further clarifies the tool's unique role.
Agents choose between tools based on descriptions. A clear purpose with a specific verb 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 important usage context, including the warning that financial_year uses sequential IDs and instructs users to 'Use fortnox_list_financial_years first.' It also gives examples of typical searches. However, it does not explicitly state when to prefer this over fortnox_list_vouchers or exclude other alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
fortnox_send_invoice_emailSend Fortnox Invoice by EmailA
Send an invoice to the customer via email.
The invoice will be sent to the email address configured for the customer.
Args:
document_number (string): Invoice document number to send (required)
response_format ('markdown' | 'json'): Output format
Returns: Confirmation that the email was sent.
| Name | Required | Description | Default |
|---|---|---|---|
| document_number | Yes | Invoice document number | |
| response_format | No | Output format: 'markdown' or 'json' | markdown |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds meaningful behavioral context beyond the annotations: it specifies that the email goes to the customer's configured address and that a confirmation is returned. The annotations already indicate openWorldHint (external side effect) and destructiveHint false, and the description aligns with these, providing clarity on the specific side effect without contradicting 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 compact, front-loaded with the primary purpose, and includes a clear Args section and Returns statement. It avoids unnecessary verbosity, though it could be slightly tighter by omitting the redundant parameter repetitions, but overall 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?
For a simple two-parameter tool with no output schema, the description sufficiently explains the tool's effect (sends email to configured address) and return value (confirmation). The annotation openWorldHint already signals external interaction, and the description complements it with specifics. It does not mention edge cases like missing email configuration, but the level of detail is appropriate for 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?
Both parameters are fully described in the input schema, and the description merely repeats their names and types ('document_number', 'response_format') with minimal additional context. Since schema description coverage is 100%, the baseline of 3 applies; the description does not add significant semantic value 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 begins with 'Send an invoice to the customer via email', which clearly identifies the action (send), resource (invoice), and delivery method (email). This distinguishes it from sibling tools like fortnox_get_invoice or fortnox_create_invoice, as no other sibling is focused on emailing invoices.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description clearly states that this tool sends an invoice to the customer's configured email address, providing clear context for when it should be used. It does not explicitly mention alternatives or exclusions, but the purpose is straightforward and unambiguous within the sibling set, so it meets the 'clear context, no exclusions' bar.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
fortnox_top_customersTop Customers AnalyticsARead-onlyIdempotent
Identify top customers by various metrics.
Answers questions like:
"Who are my top 10 customers by revenue?"
"Which customers have the most invoices?"
"Who has the highest unpaid balance?"
"What's the average invoice size per customer?"
Args:
metric ('total_amount' | 'invoice_count' | 'unpaid_amount' | 'average_invoice'): How to rank customers (default: total_amount)
period ('today' | ... | 'last_year'): Date period to analyze
from_date (string): Start date YYYY-MM-DD (ignored if period specified)
to_date (string): End date YYYY-MM-DD (ignored if period specified)
top_n (number): Number of customers to return, 1-50 (default: 10)
include_details (boolean): Include invoice breakdown per customer (default: false)
response_format ('markdown' | 'json'): Output format
Returns: For JSON: { metric, period, customers: [{ rank, customer_number, customer_name, value, invoice_count, ... }] } For Markdown: Ranked table of top customers
Examples:
Top 10 by revenue this year: period="this_year", top_n=10
Customers with most unpaid: metric="unpaid_amount"
Top 5 by invoice count last month: metric="invoice_count", period="last_month", top_n=5
Error Handling:
Returns truncation warning if >10,000 invoices analyzed
Returns "Error: ..." if API call fails
| Name | Required | Description | Default |
|---|---|---|---|
| top_n | No | Number of top customers to return (1-50) | |
| metric | No | Metric to rank customers by | total_amount |
| period | No | Date period to analyze (e.g., 'this_year', 'last_month') | |
| to_date | No | End date for analysis (YYYY-MM-DD). Ignored if period is specified. | |
| from_date | No | Start date for analysis (YYYY-MM-DD). Ignored if period is specified. | |
| include_details | No | Include invoice breakdown for each customer | |
| response_format | No | Output format: 'markdown' or 'json' | markdown |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnlyHint and idempotentHint annotations, the description discloses important behavioral details: it warns about truncation when over 10,000 invoices are analyzed, explains error handling ('Error: ...'), and specifies return formats for JSON and Markdown. This adds significant transparency beyond the structured 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 well-structured with a clear headline, example questions, Args list, Returns section, and Examples, all of which earn their place. It is appropriately detailed given the tool's complexity, and the front-loaded purpose makes it easy to scan.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool has 7 parameters, no output schema, and sits among many analytics siblings, the description fully compensates by describing return values, providing multiple usage examples, and covering error conditions. It leaves no significant gaps for an agent to invoke the tool effectively.
Complex tools with many parameters or behaviors need more documentation. 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 enriches each parameter beyond the schema by listing them in a clear Args block with defaults and behavioral notes such as 'ignored if period specified'. It also provides examples showing parameter combinations, which the schema alone does not offer.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states 'Identify top customers by various metrics' and provides concrete example questions that illustrate the tool's specific purpose of ranking customers. This distinguishes it from sibling tools like list_customers (which lists all customers) and customer_growth (which focuses on growth trends).
Agents choose between tools based on descriptions. A clear purpose with a specific verb 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 clear context through example questions and parameters, effectively communicating when to use it (analytics on top customers). However, it does not explicitly mention when not to use it or name alternative tools for different analytics needs, so it falls short of the highest bar for explicit exclusions and alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
fortnox_unpaid_reportUnpaid Invoices ReportARead-onlyIdempotent
Generate an accounts receivable aging report for unpaid invoices.
Answers questions like:
"What invoices are overdue?"
"How much is owed by each customer?"
"Show me aging breakdown of receivables"
"Which invoices over 10,000 SEK are unpaid?"
Args:
min_amount (number): Only include invoices >= this amount
customer_number (string): Filter by specific customer
group_by ('customer' | 'age_bucket' | 'both'): How to group report (default: both)
include_details (boolean): Include individual invoice list (default: true)
response_format ('markdown' | 'json'): Output format
Returns: For JSON: { summary, by_customer?, by_age_bucket?, invoices? } For Markdown: Formatted aging report with totals
Age Buckets:
not_due: Due date is in the future
1-30 days: Overdue 1-30 days
31-60 days: Overdue 31-60 days
61-90 days: Overdue 61-90 days
90+ days: Overdue more than 90 days
Examples:
Full aging report: (use defaults)
Large unpaid invoices: min_amount=50000
Specific customer aging: customer_number="1001"
Error Handling:
Returns truncation warning if >10,000 invoices
Returns "Error: ..." if API call fails
| Name | Required | Description | Default |
|---|---|---|---|
| group_by | No | How to group unpaid invoices in the report | both |
| min_amount | No | Only include invoices with balance >= this amount | |
| customer_number | No | Filter by specific customer number | |
| include_details | No | Include list of individual unpaid invoices | |
| response_format | No | Output format: 'markdown' or 'json' | markdown |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, openWorld, idempotent, and non-destructive hints. The description adds substantial context beyond that: truncation warnings for >10,000 invoices, error response format, age bucket definitions, and the impact of include_details on output. This far exceeds the baseline expectation.
Agents need to know what a tool does to the 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 well-structured with clear sections (main description, example questions, Args, Returns, Age Buckets, Examples, Error Handling). It is thorough yet concise, front-loading the core purpose and using bullet-style formatting 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?
Given no output schema, the description fully explains the return structure for both JSON and Markdown, lists age buckets, and documents error handling. It also provides enough guidance on parameter combinations to cover the 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 provides 100% coverage of parameter descriptions, so a baseline of 3 applies. The description adds practical examples, default values, and parameter semantics in the Args section, reinforcing but not drastically extending schema information. It earns a 4 because it clarifies usage patterns like min_amount=50000.
Input schemas describe structure but not intent. Descriptions should explain 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 specifies a clear verb and resource: 'Generate an accounts receivable aging report for unpaid invoices.' It distinguishes this from sibling tools like fortnox_list_invoices (listing) and fortnox_payables_report (payables) by focusing on unpaid invoices and aging buckets.
Agents choose between tools based on descriptions. A clear purpose with a specific verb 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 answers common questions and provides concrete examples (full aging report, large invoices, specific customer). It implies when to use this report versus other financial tools, but does not explicitly name alternatives or exclusionary conditions, 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.
fortnox_update_accountUpdate Fortnox AccountBIdempotent
Update an existing account in the chart of accounts.
Args:
account_number (number): Account number to update (required)
description (string): Account description
vat_code (string): VAT code
active (boolean): Whether the account is active
cost_center_settings ('ALLOWED' | 'MANDATORY' | 'NOTALLOWED'): Cost center settings
project_settings ('ALLOWED' | 'MANDATORY' | 'NOTALLOWED'): Project settings
Returns: The updated account details.
| Name | Required | Description | Default |
|---|---|---|---|
| active | No | Whether the account is active | |
| vat_code | No | VAT code for the account | |
| description | No | Account description | |
| account_number | Yes | Account number to update (required) | |
| response_format | No | Output format: 'markdown' or 'json' | markdown |
| project_settings | No | Project settings | |
| cost_center_settings | No | Cost center settings |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds that it updates an existing account and returns the updated details, which is beyond the annotations. However, it does not disclose whether it performs a partial or full update, error behavior for missing accounts, or any side effects. Annotations already cover idempotency and non-destructiveness.
Agents need to know what a tool does to the 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 structured and not verbose, with a clear intro, an Args list, and a Returns section. However, the Args list is redundant with the schema and could be trimmed without losing value.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity (7 parameters, no output schema) and presence of annotations, the description is minimally adequate. It states the purpose and return value, but lacks detail on partial updates, error handling, and the response_format parameter, leaving notable 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 the baseline is 3. The description's Args list repeats schema information without adding new meaning and omits the response_format parameter, providing no semantic value beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states it updates an existing account in the chart of accounts, using a specific verb and resource. This distinguishes it from sibling tools like fortnox_create_account, fortnox_delete_account, and fortnox_get_account.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance is provided on when to use this tool versus alternatives (e.g., create vs. update, or get vs. update). It does not mention prerequisites like account existence or any conditions for use.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
fortnox_update_customerUpdate Fortnox CustomerAIdempotent
Update an existing customer in Fortnox.
Args:
customer_number (string): Customer number to update (required)
name, email, phone, address fields, etc.: Fields to update (only provided fields are changed)
Returns: The updated customer details.
| Name | Required | Description | Default |
|---|---|---|---|
| city | No | City | |
| name | No | Customer name | |
| No | Primary email address | ||
| phone | No | Primary phone number | |
| active | No | Whether the customer is active | |
| country | No | Country name | |
| address1 | No | Street address line 1 | |
| address2 | No | Street address line 2 | |
| comments | No | Internal comments | |
| currency | No | Currency code | |
| zip_code | No | Postal/ZIP code | |
| vat_number | No | VAT registration number | |
| country_code | No | Two-letter country code | |
| customer_number | Yes | Customer number to update (required) | |
| response_format | No | Output format: 'markdown' or 'json' | markdown |
| terms_of_payment | No | Payment terms code | |
| organisation_number | No | Organisation/company number |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate mutating (readOnlyHint=false) and non-destructive (destructiveHint=false). The description adds valuable behavioral details: 'only provided fields are changed' conveys partial-update semantics, and 'Returns: The updated customer details' sets expectations. It does not cover error behavior or authorization, but with annotations present this is sufficient.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is extremely concise: one opening sentence, a short Args list, and a one-line Returns statement. No wasted words, and the structure is front-loaded with the purpose.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool has many parameters but the schema fully documents each. The description covers purpose, partial-update behavior, and return value. Given the rich schema and annotations, this is adequately complete, though it could mention failure scenarios (e.g., customer not found) for full contextual 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%, so baseline is 3. The description adds meaning beyond the schema by explaining that optional fields are updated only when provided (partial update), which is critical for understanding how to use the 17 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 'Update an existing customer in Fortnox' with a specific verb and resource, clearly distinguishing it from creation (fortnox_create_customer), deletion (fortnox_delete_customer), and read-only tools (fortnox_get_customer, fortnox_list_customers).
Agents choose between tools based on descriptions. A clear purpose with a specific verb 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 'existing customer' implies this tool is for updating already-created customers and not for creating new ones, providing clear context. However, it does not explicitly name alternative tools or state when not to use it, so it misses the top score.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
fortnox_update_invoiceUpdate Fortnox InvoiceAIdempotent
Update an existing invoice in Fortnox. Only unbooked invoices can be updated.
Args:
document_number (string): Invoice document number to update (required)
rows (array): Updated line items (replaces all existing rows)
Other fields: Same as create_invoice
Returns: The updated invoice details.
| Name | Required | Description | Default |
|---|---|---|---|
| rows | No | Updated invoice rows (replaces all existing rows) | |
| freight | No | Freight/shipping cost | |
| remarks | No | Remarks printed on the invoice | |
| comments | No | Comments on the invoice | |
| due_date | No | Due date (YYYY-MM-DD) | |
| invoice_date | No | Invoice date (YYYY-MM-DD) | |
| our_reference | No | Our reference person | |
| your_reference | No | Customer's reference person | |
| document_number | Yes | Invoice document number to update (required) | |
| response_format | No | Output format: 'markdown' or 'json' | markdown |
| administration_fee | No | Administration fee |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already provide readOnlyHint=false, idempotentHint=true, and destructiveHint=false. The description adds meaningful behavioral context beyond these: the unbooked precondition and that the rows parameter replaces all existing rows. This is important side-effect information not captured by 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 compact and well-structured: a one-sentence purpose, a succinct Args list, and a Returns line. Every sentence earns its place, and the 'Other fields: Same as create_invoice' shorthand avoids lengthy 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 the 11-parameter schema, 100% schema coverage, and presence of annotations, the description covers the essential context: it mentions the unbooked restriction, the row-replacement behavior, and the return value. It relies on the sibling create_invoice for field semantics, which is acceptable but not fully self-contained.
Complex tools with many parameters or behaviors need more documentation. 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 100%, so all 11 parameters are already documented with meaning and constraints. The description restates document_number as required and says rows replaces all existing rows, but both are already present in the schema. 'Other fields: Same as create_invoice' is a minor cross-reference but does not add per-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 clearly states the action ('Update an existing invoice in Fortnox') and identifies the specific resource (existing invoice). It also includes a key scope constraint ('Only unbooked invoices can be updated') that distinguishes it from create_invoice and other invoice 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?
The description provides clear context: this tool is for updating existing unbooked invoices, and explicitly warns that booked invoices cannot be updated. However, it does not explicitly name alternatives (e.g., 'use create_invoice for new invoices'), so the usage guidance is clear but not fully explicit about 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.
fortnox_update_supplierUpdate Fortnox SupplierAIdempotent
Update an existing supplier in Fortnox.
Args:
supplier_number (string): Supplier number to update (required)
All other fields from create_supplier (only provided fields are updated)
Returns: The updated supplier details.
| Name | Required | Description | Default |
|---|---|---|---|
| city | No | City | |
| name | No | Supplier name | |
| No | Primary email address | ||
| phone | No | Primary phone number | |
| active | No | Whether the supplier is active | |
| country | No | Country name | |
| address1 | No | Street address line 1 | |
| address2 | No | Street address line 2 | |
| comments | No | Internal comments | |
| zip_code | No | Postal/ZIP code | |
| bg_number | No | Bankgiro number | |
| pg_number | No | Plusgiro number | |
| bank_account | No | Bank account number | |
| response_format | No | Output format: 'markdown' or 'json' | markdown |
| supplier_number | Yes | Supplier number to update (required) | |
| terms_of_payment | No | Payment terms code | |
| organisation_number | No | Organisation/company number |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover read/write nature, idempotency, and destructiveness. The description adds key behavioral detail: 'only provided fields are updated' (partial update semantics) and states that it returns the updated supplier details. This goes beyond what annotations provide, though it does not mention auth requirements or error handling.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise and front-loaded, using one sentence for the purpose and brief bullet-like lines for parameters and return value. It avoids redundant explanations and stays within a few lines.
Shorter descriptions cost fewer tokens and are easier for agents to parse. 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 tool with complete schema descriptions and useful annotations, the description is adequately complete. It covers the essential behavioral aspects (partial update, return value) but relies on referencing create_supplier for field details. Since the schema lists all fields, this is acceptable; a fully self-contained description would have been slightly better.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema has 100% description coverage for all 17 parameters, so the baseline is 3. The description adds meaningful semantic context by highlighting that supplier_number is required and that all other fields are optional with partial update behavior. This clarifies the effect of omitting fields, which the schema alone does not 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?
The description clearly states 'Update an existing supplier in Fortnox' with a specific verb and resource. It distinguishes from sibling tools like create_supplier and delete_supplier by focusing on the update operation and noting that only provided fields are updated.
Agents choose between tools based on descriptions. A clear purpose with a specific verb 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 context (updating an existing supplier) but does not explicitly mention when to use this tool instead of create_supplier or delete_supplier. It also does not provide exclusions or alternative tool references, so guidance is implied rather than explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
fortnox_yearly_comparisonYearly Comparison AnalyticsARead-onlyIdempotent
Compare revenue and metrics across multiple years (2-5). Shows year-over-year growth trends.
| Name | Required | Description | Default |
|---|---|---|---|
| years | No | Number of years to compare (2-5, default: 3) | |
| metrics | No | Metrics to compare across years | |
| response_format | No | Output format: 'markdown' or 'json' | markdown |
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 clear. The description adds that the tool shows year-over-year growth trends, going slightly beyond the raw name and title. However, it does not disclose details about the output structure or how it handles incomplete years, leaving some behavioral aspects 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?
The description is extremely concise: two short sentences totaling under 20 words. It is front-loaded with the core purpose and immediately states the key scoping (2-5 years) and output (growth trends), with no fluff or redundant information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With full schema coverage and annotations indicating a safe, read-only operation, the description provides adequate context for an agent to use the tool correctly. It conveys the primary purpose and scope, though it does not explicitly describe the return format (e.g., a table or JSON). Given the lack of an output schema, a brief mention of what the 'showing' entails might improve completeness, but the current state is sufficient for typical use.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema provides 100% coverage with descriptions for all three parameters (years, metrics, response_format), so the description does not need to add parameter-specific meaning. The description's mention of 'metrics' aligns with the schema's enum values, but adds no additional semantic detail beyond what 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?
The description clearly states the tool's function: 'Compare revenue and metrics across multiple years (2-5). Shows year-over-year growth trends.' It specifies the action (compare), the resource (revenue and metrics), and the scope (multiple years with a range), which distinguishes it from sibling tools like fortnox_period_comparison that focus on arbitrary periods.
Agents choose between tools based on descriptions. A clear purpose with a specific verb 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 guidance is only implied through the description's mention of comparing across years; there is no explicit statement of when to use this tool versus alternatives, such as fortnox_period_comparison. The '2-5 years' scope provides context, but the description does not mention when not to use it or name alternative tools.
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.
51 tool updates
v1.0.1- First observed
fortnox_account_activity - First observed
fortnox_approve_supplier_invoice - First observed
fortnox_bookkeep_invoice - First observed
fortnox_cancel_invoice - First observed
fortnox_cash_flow_forecast - First observed
fortnox_cost_center_analysis - First observed
fortnox_create_account - First observed
fortnox_create_customer - First observed
fortnox_create_invoice - First observed
fortnox_create_supplier - First observed
fortnox_create_voucher - First observed
fortnox_credit_invoice - First observed
fortnox_customer_growth - First observed
fortnox_delete_account - First observed
fortnox_delete_customer - First observed
fortnox_delete_supplier - First observed
fortnox_expense_analysis - First observed
fortnox_get_account - First observed
fortnox_get_company_info - First observed
fortnox_get_customer - First observed
fortnox_get_invoice - First observed
fortnox_get_supplier - First observed
fortnox_get_supplier_invoice - First observed
fortnox_get_voucher - First observed
fortnox_gross_margin_trend - First observed
fortnox_invoice_summary - First observed
fortnox_list_accounts - First observed
fortnox_list_customers - First observed
fortnox_list_financial_years - First observed
fortnox_list_invoices - First observed
fortnox_list_offers - First observed
fortnox_list_orders - First observed
fortnox_list_supplier_invoices - First observed
fortnox_list_suppliers - First observed
fortnox_list_voucher_series - First observed
fortnox_list_vouchers - First observed
fortnox_order_pipeline - First observed
fortnox_payables_report - First observed
fortnox_period_comparison - First observed
fortnox_product_performance - First observed
fortnox_project_profitability - First observed
fortnox_sales_funnel - First observed
fortnox_search_vouchers - First observed
fortnox_send_invoice_email - First observed
fortnox_top_customers - First observed
fortnox_unpaid_report - First observed
fortnox_update_account - First observed
fortnox_update_customer - First observed
fortnox_update_invoice - First observed
fortnox_update_supplier - First observed
fortnox_yearly_comparison
TDQS
Scored across 51 tools
The CRUD tools for customers, suppliers, invoices, and accounts are clearly distinct, but the large set of analytical tools creates ambiguity. Tools like period_comparison vs yearly_comparison, customer_growth vs period_comparison, and several 'LIMITED' tools that all defer to account_activity have overlapping or unclear boundaries.
All tools share the fortnox_ prefix and consistently use lowercase with underscores. However, the pattern is not strictly verb_noun: CRUD tools use list_/get_/create_/update_/delete_, while analytics use noun-based names like invoice_summary, order_pipeline, and cash_flow_forecast. The style is predictable but not uniform.
With 51 tools, the server is heavily oversized. Many analytics overlap or are stubs (e.g., five 'LIMITED' tools that just point to account_activity), suggesting the tool count could be reduced significantly without losing functionality. This exceeds the 25+ threshold for 'too many'.
Core financial entities (customers, suppliers, invoices, accounts, vouchers) have solid lifecycle coverage, but there are notable gaps: order and offer tools are list-only with no create/get/update/delete, supplier invoices lack creation/update, and several analytics return only metadata or structure rather than actual data, causing dead ends.
Maintenance
Related MCP Connectors
MCP server unifying ERPs, CRMs, APIs and knowledge base for Claude, ChatGPT and Gemini.
Hosted MCP server for Mini Accountant: invoices, expenses, customers, analytics, tax estimates.
MCP server for Codat — companies, connections, invoices, bills and financial statements.
- ZapierOAuthcom.zapier
Hosted MCP server connecting AI assistants to 9,000+ apps and 40,000+ actions via Zapier.
Related MCP Servers
- AlicenseNot gradedqualityCmaintenanceMCP server for the FreeAgent accounting API, enabling LLMs to securely access and manage accounting data including contacts, invoices, bills, bank transactions, and more.5 npm1MIT
- AlicenseBqualityDmaintenanceAn MCP server for Danish accounting via Billy.dk API, enabling natural-language control over invoices, bank lines, reports, and more, with a write-guard for safety.651MIT
- AlicenseBqualityCmaintenanceMCP server that provides 76 tools for the FreeAgent accounting API, enabling management of invoices, expenses, contacts, projects, timeslips, banking, bills, estimates, credit notes, and accounting reports through natural language.7612 npm5MIT
- AlicenseAqualityBmaintenanceMCP server for the Elorus invoicing and accounting platform, enabling AI assistants to create invoices, manage contacts, and query financial data through natural language.434MIT