Skip to main content
Glama
erp-mafia

Fortnox MCP Server

by erp-mafia

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

The easiest way to use Fortnox MCP - no credentials needed, just authorize in your browser.

Option A: Add to Claude.ai (Web)

  1. Go to claude.ai

  2. Navigate to SettingsIntegrationsAdd Integration

  3. Enter the URL: https://fortnox-mcp.vercel.app/mcp

  4. Wait 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.json

  • Windows: %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

  1. Register at Fortnox Developer Portal

  2. Create an application to get your Client ID and Client Secret

  3. 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.json

  • Windows: %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 customers

  • fortnox_get_customer - Get customer details

  • fortnox_create_customer - Create new customer

  • fortnox_update_customer - Update customer

  • fortnox_delete_customer - Delete customer

Invoice Management

  • fortnox_list_invoices - List invoices with filtering

  • fortnox_get_invoice - Get invoice details with line items

  • fortnox_create_invoice - Create new invoice

  • fortnox_update_invoice - Update draft invoice

  • fortnox_bookkeep_invoice - Bookkeep invoice

  • fortnox_cancel_invoice - Cancel invoice

  • fortnox_credit_invoice - Create credit note

  • fortnox_send_invoice_email - Send invoice by email

Supplier Management

  • fortnox_list_suppliers - List and search suppliers

  • fortnox_get_supplier - Get supplier details

  • fortnox_create_supplier - Create new supplier

  • fortnox_update_supplier - Update supplier

  • fortnox_delete_supplier - Delete supplier

Supplier Invoice Management

  • fortnox_list_supplier_invoices - List supplier invoices with filtering

  • fortnox_get_supplier_invoice - Get supplier invoice details

  • fortnox_approve_supplier_invoice - Approve supplier invoice for payment

  • fortnox_payables_report - Get accounts payable aging report

Order Management

  • fortnox_list_orders - List sales orders with filtering

  • fortnox_list_offers - List offers/quotes with filtering

Account Management

  • fortnox_list_accounts - List chart of accounts

  • fortnox_get_account - Get account details

  • fortnox_create_account - Create new account

  • fortnox_update_account - Update account

  • fortnox_delete_account - Delete account

Voucher Management

  • fortnox_list_vouchers - List vouchers (journal entries)

  • fortnox_get_voucher - Get voucher details with rows

  • fortnox_create_voucher - Create manual voucher

  • fortnox_list_voucher_series - List available voucher series

  • fortnox_account_activity - Get activity for a specific account

  • fortnox_search_vouchers - Search vouchers by description, account, or amount

Company Information

  • fortnox_get_company_info - Get company details

  • fortnox_list_financial_years - List company financial years

Analytics

  • fortnox_invoice_summary - Get invoice statistics by period

  • fortnox_top_customers - Get top customers by revenue

  • fortnox_unpaid_report - Get detailed unpaid invoice report

Business Intelligence

  • fortnox_cash_flow_forecast - Forecast cash flow based on invoices and payables

  • fortnox_order_pipeline - Analyze sales order pipeline

  • fortnox_sales_funnel - Analyze sales funnel from offers to invoices

  • fortnox_product_performance - Analyze product/article performance

  • fortnox_period_comparison - Compare financial metrics across periods

  • fortnox_customer_growth - Analyze customer acquisition and growth

  • fortnox_project_profitability - Analyze project profitability (if using projects)

  • fortnox_cost_center_analysis - Analyze costs by cost center

  • fortnox_expense_analysis - Analyze expenses by category

  • fortnox_yearly_comparison - Compare year-over-year performance

  • fortnox_gross_margin_trend - Track gross margin trends over time

Installation

No installation needed! Just add the config above to Claude Desktop.

Manual Installation

npm install -g fortnox-mcp-server

From Source

git clone https://github.com/jakobwennberg/fortnox-mcp.git
cd fortnox-mcp
npm install
npm run build

Configuration

Environment Variables

Local Mode (default)

Variable

Required

Description

FORTNOX_CLIENT_ID

Yes

Your Fortnox app client ID

FORTNOX_CLIENT_SECRET

Yes

Your Fortnox app client secret

FORTNOX_REFRESH_TOKEN

Yes

OAuth2 refresh token (only needed for initial setup; automatically persisted after first use)

FORTNOX_ACCESS_TOKEN

No

Current access token (auto-refreshed)

TRANSPORT

No

stdio (default) or http

PORT

No

HTTP port (default: 3000)

Remote Mode (AUTH_MODE=remote)

Variable

Required

Description

AUTH_MODE

Yes

Set to remote

SERVER_URL

Yes

Public URL of your server

JWT_SECRET

Yes

Secret for signing JWT tokens

FORTNOX_CLIENT_ID

Yes

Your Fortnox app client ID

FORTNOX_CLIENT_SECRET

Yes

Your Fortnox app client secret

UPSTASH_REDIS_REST_URL

Yes*

Upstash Redis URL for token storage

UPSTASH_REDIS_REST_TOKEN

Yes*

Upstash Redis token

PORT

No

HTTP port (default: 3000)

*Falls back to in-memory storage if not provided (not recommended for production)

Getting OAuth Credentials

  1. Register as a developer at Fortnox Developer Portal

  2. Create a new application to get Client ID and Client Secret

  3. Complete the OAuth2 authorization flow to obtain a refresh token

  4. Set the environment variables

Usage

With Claude Desktop

See Quick Start above.

As HTTP Server

TRANSPORT=http PORT=3000 node dist/index.js

Then 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 clean

Publishing & Distribution

This server is published to multiple registries for easy installation:

Registry

URL

Purpose

npm

npmjs.com/package/fortnox-mcp-server

Package distribution via npx

MCP Registry

registry.modelcontextprotocol.io

Official MCP server discovery

GitHub

github.com/jakobwennberg/fortnox-mcp

Source code

How It Works

  1. User adds config to Claude Desktop with npx fortnox-mcp-server

  2. Claude Desktop starts the server via npx (downloads latest version from npm)

  3. Server authenticates with Fortnox using OAuth2 credentials from environment variables

  4. Claude can now use tools like fortnox_list_invoices, fortnox_create_customer, etc.

  5. 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_TOKEN from your environment/config

  • After each token refresh, the new refresh token is saved to ~/.fortnox-mcp/tokens.json

  • On 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:major

The release script automatically:

  1. Bumps the version in package.json

  2. Updates server.json for the MCP Registry

  3. Builds the project

  4. Commits and tags the release

  5. Publishes to npm

  6. Publishes to MCP Registry

  7. Pushes to GitHub

Prerequisites for releasing:

  • npm login - Logged into npm

  • mcp-publisher login github - Logged into MCP Registry

  • Clean 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

Deploy with Vercel

1. Prerequisites

2. Set Environment Variables

In your Vercel project settings, add these environment variables:

Variable

Description

AUTH_MODE

Set to remote

SERVER_URL

Your Vercel deployment URL (e.g., https://your-app.vercel.app)

JWT_SECRET

A random secret string for signing tokens (generate with openssl rand -hex 32)

FORTNOX_CLIENT_ID

Your Fortnox app client ID

FORTNOX_CLIENT_SECRET

Your Fortnox app client secret

UPSTASH_REDIS_REST_URL

Upstash Redis REST URL

UPSTASH_REDIS_REST_TOKEN

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/callback

4. Deploy

vercel --prod

Server Endpoints

Endpoint

Description

GET /health

Health check

GET /.well-known/oauth-authorization-server

OAuth metadata

POST /authorize

Start OAuth flow

POST /token

Exchange code for tokens

GET /oauth/fortnox/callback

Fortnox OAuth callback

POST /mcp

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 tools
fortnox_account_activityAccount Activity ReportA
Read-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

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A5/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters5/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
given_numberYesThe supplier invoice given number to approve
response_formatNoOutput format: 'markdown' or 'json'markdown

TDQS

A4/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
document_numberYesInvoice document number
response_formatNoOutput format: 'markdown' or 'json'markdown

TDQS

A4.2/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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 InvoiceA
Destructive

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
document_numberYesInvoice document number
response_formatNoOutput format: 'markdown' or 'json'markdown

TDQS

A3.8/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines2/5

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 ForecastA
Read-onlyIdempotent

Generate cash flow forecast from unpaid receivables and payables. Shows expected inflows, outflows, net flow, and running balance grouped by week or month.

ParametersJSON Schema
NameRequiredDescriptionDefault
group_byNoHow to group the forecast: 'week' or 'month'week
horizon_daysNoNumber of days to forecast ahead (1-365, default: 90)
include_overdueNoInclude overdue receivables and payables in the forecast
response_formatNoOutput format: 'markdown' or 'json'markdown
starting_balanceNoOptional starting cash balance to use for projection

TDQS

A4.2/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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 AnalysisA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault
periodNoDate period to analyze
to_dateNoEnd date for analysis (YYYY-MM-DD). Ignored if period is specified.
from_dateNoStart date for analysis (YYYY-MM-DD). Ignored if period is specified.
cost_centerNoFilter to a specific cost center code
response_formatNoOutput format: 'markdown' or 'json'markdown
account_range_toNoEnd of account range to include (default: all accounts)
account_range_fromNoStart of account range to include (default: all accounts)

TDQS

A4.4/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
activeNoWhether the account is active
sru_codeNoSRU code for tax reporting
vat_codeNoVAT code for the account
descriptionYesAccount description (required)
account_numberYesAccount number (1000-9999, required)
response_formatNoOutput format: 'markdown' or 'json'markdown
project_settingsNoProject settings for the account
cost_center_settingsNoCost center settings for the account

TDQS

B3.4/5.0
Behavior3/5

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.

Conciseness4/5

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.

Completeness3/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines2/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
cityNoCity
nameYesCustomer name (required)
emailNoPrimary email address
phoneNoPrimary phone number
countryNoCountry name
address1NoStreet address line 1
address2NoStreet address line 2
commentsNoInternal comments about the customer
currencyNoCurrency code (e.g., 'SEK', 'EUR')
vat_typeNoVAT type for the customer
zip_codeNoPostal/ZIP code
price_listNoPrice list code
vat_numberNoVAT registration number
country_codeNoTwo-letter country code (e.g., 'SE' for Sweden)
customer_numberNoCustomer number (auto-generated if not provided)
response_formatNoOutput format: 'markdown' or 'json'markdown
terms_of_paymentNoPayment terms code
organisation_numberNoOrganisation/company number

TDQS

A3.6/5.0
Behavior3/5

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.

Conciseness3/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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 }]

ParametersJSON Schema
NameRequiredDescriptionDefault
rowsYesInvoice rows/lines (at least one required)
freightNoFreight/shipping cost
remarksNoRemarks printed on the invoice
commentsNoComments on the invoice
currencyNoCurrency code (e.g., 'SEK')
due_dateNoDue date (YYYY-MM-DD)
send_typeNoHow to send the invoice
invoice_dateNoInvoice date (YYYY-MM-DD, defaults to today)
invoice_typeNoType of invoice
our_referenceNoOur reference person
your_referenceNoCustomer's reference person
customer_numberYesCustomer number (required)
response_formatNoOutput format: 'markdown' or 'json'markdown
terms_of_paymentNoPayment terms code
administration_feeNoAdministration fee

TDQS

A4.1/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
cityNoCity
nameYesSupplier name (required)
emailNoPrimary email address
phoneNoPrimary phone number
countryNoCountry name
address1NoStreet address line 1
address2NoStreet address line 2
commentsNoInternal comments about the supplier
currencyNoCurrency code (e.g., 'SEK', 'EUR')
zip_codeNoPostal/ZIP code
bg_numberNoBankgiro number
pg_numberNoPlusgiro number
vat_numberNoVAT registration number
bank_accountNoBank account number
country_codeNoTwo-letter country code (e.g., 'SE' for Sweden)
response_formatNoOutput format: 'markdown' or 'json'markdown
supplier_numberNoSupplier number (auto-generated if not provided)
terms_of_paymentNoPayment terms code
organisation_numberNoOrganisation/company number

TDQS

A3.9/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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" } ] }

ParametersJSON Schema
NameRequiredDescriptionDefault
rowsYesVoucher rows (minimum 2 rows required, debit must equal credit)
projectNoDefault project for all rows
cost_centerNoDefault cost center for all rows
descriptionYesVoucher description (required)
voucher_seriesYesVoucher series (e.g., 'A', 'B') (required)
response_formatNoOutput format: 'markdown' or 'json'markdown
transaction_dateYesTransaction date (YYYY-MM-DD, required)

TDQS

A4.3/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
document_numberYesInvoice document number
response_formatNoOutput format: 'markdown' or 'json'markdown

TDQS

A4.1/5.0
Behavior3/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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 AnalyticsA
Read-onlyIdempotent

Identify growing and declining customers by comparing revenue across periods. Shows growth rates and trends.

ParametersJSON Schema
NameRequiredDescriptionDefault
showNoFilter to show only growing, declining, or all customersall
top_nNoNumber of customers to return (1-100, default: 20)
compare_toNoPeriod to compare against. If not specified, compares to the previous equivalent period.
min_revenueNoOnly include customers with at least this much revenue in either period
current_periodYesCurrent period to analyze (e.g., 'this_quarter', 'this_year')
response_formatNoOutput format: 'markdown' or 'json'markdown

TDQS

A3.5/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness3/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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 AccountA
Destructive

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
account_numberYesAccount number to delete

TDQS

A4.2/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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 CustomerA
Destructive

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
customer_numberYesCustomer number to delete

TDQS

A4.2/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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 SupplierA
Destructive

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
supplier_numberYesSupplier number to delete

TDQS

A4.5/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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 AnalysisA
Read-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}.

ParametersJSON Schema
NameRequiredDescriptionDefault
periodNoDate period to analyze
to_dateNoEnd date for analysis (YYYY-MM-DD). Ignored if period is specified.
group_byNoGroup expenses by individual account or account class (e.g., 4xxx, 5xxx)account_class
from_dateNoStart date for analysis (YYYY-MM-DD). Ignored if period is specified.
compare_toNoOptional period to compare against
response_formatNoOutput format: 'markdown' or 'json'markdown
account_range_toNoEnd of expense account range (default: 8999)
account_range_fromNoStart of expense account range (default: 4000)

TDQS

A4.4/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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 AccountA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault
account_numberYesThe account number to retrieve (1000-9999)
response_formatNoOutput format: 'markdown' or 'json'markdown

TDQS

A4.1/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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 InformationA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault
response_formatNoOutput format: 'markdown' or 'json'markdown

TDQS

A4.1/5.0
Behavior4/5

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.

Conciseness3/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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 CustomerA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault
customer_numberYesThe customer number to retrieve
response_formatNoOutput format: 'markdown' or 'json'markdown

TDQS

A3.7/5.0
Behavior3/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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 InvoiceA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault
document_numberYesThe invoice document number to retrieve
response_formatNoOutput format: 'markdown' or 'json'markdown

TDQS

A3.9/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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 SupplierA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault
response_formatNoOutput format: 'markdown' or 'json'markdown
supplier_numberYesThe supplier number to retrieve

TDQS

A4.3/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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 InvoiceA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault
given_numberYesThe supplier invoice given number to retrieve
response_formatNoOutput format: 'markdown' or 'json'markdown

TDQS

A4.3/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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 VoucherA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault
financial_yearNoFortnox financial year ID (1, 2, 3...). NOT calendar year. Use fortnox_list_financial_years to find the correct ID.
voucher_numberYesVoucher number within the series
voucher_seriesYesVoucher series (e.g., 'A')
response_formatNoOutput format: 'markdown' or 'json'markdown

TDQS

A4.2/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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 AnalyticsA
Read-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}

ParametersJSON Schema
NameRequiredDescriptionDefault
periodNoDate period to analyze (e.g., 'this_year', 'last_year')
to_dateNoEnd date for analysis (YYYY-MM-DD). Ignored if period is specified.
group_byNoHow to group the margin trend: 'month' or 'quarter'month
from_dateNoStart date for analysis (YYYY-MM-DD). Ignored if period is specified.
cogs_accountsNoCost of goods sold account range (e.g., '4000-4999'). Default: 4000-4999
response_formatNoOutput format: 'markdown' or 'json'markdown
revenue_accountsNoRevenue account range (e.g., '3000-3999'). Default: 3000-3999

TDQS

A4.4/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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 AnalyticsA
Read-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

ParametersJSON Schema
NameRequiredDescriptionDefault
filterNoFilter invoices by status before calculating summary
periodNoDate period to analyze (e.g., 'this_month', 'last_quarter'). If not specified, analyzes all invoices.
to_dateNoEnd date for analysis (YYYY-MM-DD). Ignored if period is specified.
group_byNoGroup summary statistics by this dimension
from_dateNoStart date for analysis (YYYY-MM-DD). Ignored if period is specified.
customer_numberNoFilter by specific customer number
include_detailsNoInclude list of individual invoices in the response
response_formatNoOutput format: 'markdown' or 'json'markdown

TDQS

A4.4/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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 AccountsA
Read-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

ParametersJSON Schema
NameRequiredDescriptionDefault
pageNoPage number for pagination
limitNoMaximum number of results to return (1-100)
to_accountNoFilter accounts to this account number
from_accountNoFilter accounts from this account number
response_formatNoOutput format: 'markdown' or 'json'markdown
search_descriptionNoSearch accounts by description

TDQS

A4.3/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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 CustomersA
Read-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"

ParametersJSON Schema
NameRequiredDescriptionDefault
pageNoPage number for pagination
limitNoMaximum number of results to return (1-100)
filterNoFilter by customer status
search_nameNoSearch customers by name (partial match)
customer_numberNoFilter by specific customer number
response_formatNoOutput format: 'markdown' or 'json'markdown
organisation_numberNoFilter by organisation number

TDQS

A3.7/5.0
Behavior3/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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 YearsA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault
response_formatNoOutput format: 'markdown' or 'json'markdown

TDQS

A4.7/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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 InvoicesA
Read-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

ParametersJSON Schema
NameRequiredDescriptionDefault
pageNoPage number for pagination
limitNoMaximum number of results to return (1-100)
filterNoFilter invoices by status
periodNoConvenience date period filter (e.g., 'last_month', 'this_quarter'). Overrides from_date/to_date if provided.
sortbyNoField to sort results by
to_dateNoFilter invoices to this date (YYYY-MM-DD)
fetch_allNoFetch all results by auto-paginating through all pages. WARNING: May take time for large datasets (max 10,000 results).
from_dateNoFilter invoices from this date (YYYY-MM-DD)
sortorderNoSort order for resultsascending
max_amountNoFilter invoices with total <= this amount (client-side filter, applied after fetching)
min_amountNoFilter invoices with total >= this amount (client-side filter, applied after fetching)
customer_numberNoFilter by customer number
response_formatNoOutput format: 'markdown' or 'json'markdown
to_final_pay_dateNoFilter by due date to (YYYY-MM-DD)
from_final_pay_dateNoFilter by due date from (YYYY-MM-DD)

TDQS

A4.6/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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 OffersA
Read-onlyIdempotent

List sales offers/quotes with filtering by status, customer, date range. Filter: cancelled, expired, ordercreated, ordernotcreated.

ParametersJSON Schema
NameRequiredDescriptionDefault
pageNoPage number for pagination
limitNoMaximum number of results to return (1-100)
filterNoFilter offers by status: 'cancelled', 'expired', 'ordercreated', 'ordernotcreated'
periodNoConvenience date period filter (e.g., 'last_month', 'this_quarter'). Overrides from_date/to_date if provided.
sortbyNoField to sort results by
to_dateNoFilter offers to this date (YYYY-MM-DD)
fetch_allNoFetch all results by auto-paginating through all pages. WARNING: May take time for large datasets (max 10,000 results).
from_dateNoFilter offers from this date (YYYY-MM-DD)
sortorderNoSort order for resultsascending
customer_numberNoFilter by customer number
response_formatNoOutput format: 'markdown' or 'json'markdown

TDQS

A3.8/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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 OrdersA
Read-onlyIdempotent

List sales orders with filtering by status, customer, date range. Filter: cancelled, expired, invoicecreated, invoicenotcreated.

ParametersJSON Schema
NameRequiredDescriptionDefault
pageNoPage number for pagination
limitNoMaximum number of results to return (1-100)
filterNoFilter orders by status: 'cancelled', 'expired', 'invoicecreated', 'invoicenotcreated'
periodNoConvenience date period filter (e.g., 'last_month', 'this_quarter'). Overrides from_date/to_date if provided.
sortbyNoField to sort results by
to_dateNoFilter orders to this date (YYYY-MM-DD)
fetch_allNoFetch all results by auto-paginating through all pages. WARNING: May take time for large datasets (max 10,000 results).
from_dateNoFilter orders from this date (YYYY-MM-DD)
sortorderNoSort order for resultsascending
customer_numberNoFilter by customer number
response_formatNoOutput format: 'markdown' or 'json'markdown

TDQS

A3.8/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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 InvoicesA
Read-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"

ParametersJSON Schema
NameRequiredDescriptionDefault
pageNoPage number for pagination
limitNoMaximum number of results to return (1-100)
filterNoFilter supplier invoices by status
periodNoConvenience date period filter (e.g., 'last_month', 'this_quarter'). Overrides from_date/to_date if provided.
sortbyNoField to sort results by
to_dateNoFilter invoices to this date (YYYY-MM-DD)
fetch_allNoFetch all results by auto-paginating through all pages. WARNING: May take time for large datasets (max 10,000 results).
from_dateNoFilter invoices from this date (YYYY-MM-DD)
sortorderNoSort order for resultsascending
max_amountNoFilter invoices with total <= this amount (client-side filter)
min_amountNoFilter invoices with total >= this amount (client-side filter)
response_formatNoOutput format: 'markdown' or 'json'markdown
supplier_numberNoFilter by supplier number
to_final_pay_dateNoFilter by due date to (YYYY-MM-DD)
from_final_pay_dateNoFilter by due date from (YYYY-MM-DD)

TDQS

A4.5/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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 SuppliersA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault
pageNoPage number for pagination
limitNoMaximum number of results to return (1-100)
filterNoFilter by supplier status
search_nameNoSearch suppliers by name (partial match)
response_formatNoOutput format: 'markdown' or 'json'markdown

TDQS

A3.9/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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 VouchersA
Read-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

ParametersJSON Schema
NameRequiredDescriptionDefault
pageNoPage number for pagination
limitNoMaximum number of results to return (1-100)
to_dateNoFilter vouchers to this date (YYYY-MM-DD)
from_dateNoFilter vouchers from this date (YYYY-MM-DD)
financial_yearNoFortnox financial year ID (1, 2, 3...). NOT calendar year. Use fortnox_list_financial_years to find the correct ID.
voucher_seriesNoFilter by voucher series (e.g., 'A', 'B')
response_formatNoOutput format: 'markdown' or 'json'markdown

TDQS

A4.3/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose4/5

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.

Usage Guidelines4/5

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 SeriesA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault
response_formatNoOutput format: 'markdown' or 'json'markdown

TDQS

A3.9/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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 AnalyticsA
Read-onlyIdempotent

Analyze order pipeline and backlog. Shows pending vs invoiced orders grouped by status, customer, or month.

ParametersJSON Schema
NameRequiredDescriptionDefault
periodNoDate period to analyze (e.g., 'this_month', 'this_year')
to_dateNoEnd date for analysis (YYYY-MM-DD). Ignored if period is specified.
group_byNoHow to group order pipeline statisticsstatus
from_dateNoStart date for analysis (YYYY-MM-DD). Ignored if period is specified.
response_formatNoOutput format: 'markdown' or 'json'markdown

TDQS

A4.3/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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 ReportA
Read-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"

ParametersJSON Schema
NameRequiredDescriptionDefault
group_byNoHow to group unpaid supplier invoices in the reportboth
min_amountNoOnly include invoices with balance >= this amount
include_detailsNoInclude list of individual unpaid invoices
response_formatNoOutput format: 'markdown' or 'json'markdown
supplier_numberNoFilter by specific supplier number

TDQS

A4.2/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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 AnalyticsA
Read-onlyIdempotent

Compare business metrics (revenue, invoice count, etc.) between two time periods with percentage changes.

ParametersJSON Schema
NameRequiredDescriptionDefault
metricsNoMetrics to compare between periods
compare_toNoPeriod to compare against. If not specified, compares to the previous equivalent period.
current_periodYesCurrent period to analyze (e.g., 'this_month', 'this_quarter')
response_formatNoOutput format: 'markdown' or 'json'markdown

TDQS

A4.1/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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 AnalyticsA
Read-onlyIdempotent

Analyze product/customer sales performance. Returns top performers ranked by revenue, quantity, or invoice count.

ParametersJSON Schema
NameRequiredDescriptionDefault
top_nNoNumber of top products to return (1-100, default: 20)
metricNoMetric to rank products by: 'revenue', 'quantity', or 'invoice_count'revenue
periodNoDate period to analyze (e.g., 'this_year', 'last_quarter')
to_dateNoEnd date for analysis (YYYY-MM-DD). Ignored if period is specified.
from_dateNoStart date for analysis (YYYY-MM-DD). Ignored if period is specified.
include_trendsNoCompare to previous period to show trends
response_formatNoOutput format: 'markdown' or 'json'markdown

TDQS

A3.5/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness3/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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 AnalyticsA
Read-onlyIdempotent

[LIMITED] Analyze profitability by project. Returns project list only.

For actual project financials, use fortnox_account_activity with project filtering on vouchers.

ParametersJSON Schema
NameRequiredDescriptionDefault
periodNoDate period to analyze
to_dateNoEnd date for analysis (YYYY-MM-DD). Ignored if period is specified.
from_dateNoStart date for analysis (YYYY-MM-DD). Ignored if period is specified.
project_numberNoFilter to a specific project number
include_detailsNoInclude detailed breakdown of revenue and costs per project
response_formatNoOutput format: 'markdown' or 'json'markdown

TDQS

A4.4/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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 AnalyticsA
Read-onlyIdempotent

Analyze sales funnel from offers to orders to invoices. Shows counts, values, and conversion rates at each stage.

ParametersJSON Schema
NameRequiredDescriptionDefault
periodNoDate period to analyze (e.g., 'this_quarter', 'this_year')
to_dateNoEnd date for analysis (YYYY-MM-DD). Ignored if period is specified.
from_dateNoStart date for analysis (YYYY-MM-DD). Ignored if period is specified.
response_formatNoOutput format: 'markdown' or 'json'markdown

TDQS

A4.2/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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 VouchersA
Read-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"

ParametersJSON Schema
NameRequiredDescriptionDefault
periodNoConvenience date period filter (e.g., 'this_month', 'last_quarter'). Overrides from_date/to_date.
to_dateNoFilter vouchers to this date (YYYY-MM-DD)
from_dateNoFilter vouchers from this date (YYYY-MM-DD)
search_textYesText to search for in voucher descriptions (min 2 chars)
include_rowsNoInclude full voucher row details in results
max_vouchersNoMaximum vouchers to scan (10-500). Use date filtering for larger datasets.
case_sensitiveNoWhether search should be case-sensitive
financial_yearNoFortnox financial year ID (1, 2, 3...). NOT calendar year. Use fortnox_list_financial_years to find the correct ID.
voucher_seriesNoFilter by voucher series (e.g., 'A', 'B')
response_formatNoOutput format: 'markdown' or 'json'markdown

TDQS

A4.3/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
document_numberYesInvoice document number
response_formatNoOutput format: 'markdown' or 'json'markdown

TDQS

A4.1/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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 AnalyticsA
Read-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

ParametersJSON Schema
NameRequiredDescriptionDefault
top_nNoNumber of top customers to return (1-50)
metricNoMetric to rank customers bytotal_amount
periodNoDate period to analyze (e.g., 'this_year', 'last_month')
to_dateNoEnd date for analysis (YYYY-MM-DD). Ignored if period is specified.
from_dateNoStart date for analysis (YYYY-MM-DD). Ignored if period is specified.
include_detailsNoInclude invoice breakdown for each customer
response_formatNoOutput format: 'markdown' or 'json'markdown

TDQS

A4.8/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters5/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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 ReportA
Read-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

ParametersJSON Schema
NameRequiredDescriptionDefault
group_byNoHow to group unpaid invoices in the reportboth
min_amountNoOnly include invoices with balance >= this amount
customer_numberNoFilter by specific customer number
include_detailsNoInclude list of individual unpaid invoices
response_formatNoOutput format: 'markdown' or 'json'markdown

TDQS

A4.7/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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 AccountB
Idempotent

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
activeNoWhether the account is active
vat_codeNoVAT code for the account
descriptionNoAccount description
account_numberYesAccount number to update (required)
response_formatNoOutput format: 'markdown' or 'json'markdown
project_settingsNoProject settings
cost_center_settingsNoCost center settings

TDQS

B3.4/5.0
Behavior3/5

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.

Conciseness4/5

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.

Completeness3/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines2/5

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 CustomerA
Idempotent

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
cityNoCity
nameNoCustomer name
emailNoPrimary email address
phoneNoPrimary phone number
activeNoWhether the customer is active
countryNoCountry name
address1NoStreet address line 1
address2NoStreet address line 2
commentsNoInternal comments
currencyNoCurrency code
zip_codeNoPostal/ZIP code
vat_numberNoVAT registration number
country_codeNoTwo-letter country code
customer_numberYesCustomer number to update (required)
response_formatNoOutput format: 'markdown' or 'json'markdown
terms_of_paymentNoPayment terms code
organisation_numberNoOrganisation/company number

TDQS

A4.4/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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 InvoiceA
Idempotent

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
rowsNoUpdated invoice rows (replaces all existing rows)
freightNoFreight/shipping cost
remarksNoRemarks printed on the invoice
commentsNoComments on the invoice
due_dateNoDue date (YYYY-MM-DD)
invoice_dateNoInvoice date (YYYY-MM-DD)
our_referenceNoOur reference person
your_referenceNoCustomer's reference person
document_numberYesInvoice document number to update (required)
response_formatNoOutput format: 'markdown' or 'json'markdown
administration_feeNoAdministration fee

TDQS

A4.2/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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 SupplierA
Idempotent

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
cityNoCity
nameNoSupplier name
emailNoPrimary email address
phoneNoPrimary phone number
activeNoWhether the supplier is active
countryNoCountry name
address1NoStreet address line 1
address2NoStreet address line 2
commentsNoInternal comments
zip_codeNoPostal/ZIP code
bg_numberNoBankgiro number
pg_numberNoPlusgiro number
bank_accountNoBank account number
response_formatNoOutput format: 'markdown' or 'json'markdown
supplier_numberYesSupplier number to update (required)
terms_of_paymentNoPayment terms code
organisation_numberNoOrganisation/company number

TDQS

A4.2/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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 AnalyticsA
Read-onlyIdempotent

Compare revenue and metrics across multiple years (2-5). Shows year-over-year growth trends.

ParametersJSON Schema
NameRequiredDescriptionDefault
yearsNoNumber of years to compare (2-5, default: 3)
metricsNoMetrics to compare across years
response_formatNoOutput format: 'markdown' or 'json'markdown

TDQS

A3.8/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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.

  1. 51 tool updatesv1.0.1
    • First observedfortnox_account_activity
    • First observedfortnox_approve_supplier_invoice
    • First observedfortnox_bookkeep_invoice
    • First observedfortnox_cancel_invoice
    • First observedfortnox_cash_flow_forecast
    • First observedfortnox_cost_center_analysis
    • First observedfortnox_create_account
    • First observedfortnox_create_customer
    • First observedfortnox_create_invoice
    • First observedfortnox_create_supplier
    • First observedfortnox_create_voucher
    • First observedfortnox_credit_invoice
    • First observedfortnox_customer_growth
    • First observedfortnox_delete_account
    • First observedfortnox_delete_customer
    • First observedfortnox_delete_supplier
    • First observedfortnox_expense_analysis
    • First observedfortnox_get_account
    • First observedfortnox_get_company_info
    • First observedfortnox_get_customer
    • First observedfortnox_get_invoice
    • First observedfortnox_get_supplier
    • First observedfortnox_get_supplier_invoice
    • First observedfortnox_get_voucher
    • First observedfortnox_gross_margin_trend
    • First observedfortnox_invoice_summary
    • First observedfortnox_list_accounts
    • First observedfortnox_list_customers
    • First observedfortnox_list_financial_years
    • First observedfortnox_list_invoices
    • First observedfortnox_list_offers
    • First observedfortnox_list_orders
    • First observedfortnox_list_supplier_invoices
    • First observedfortnox_list_suppliers
    • First observedfortnox_list_voucher_series
    • First observedfortnox_list_vouchers
    • First observedfortnox_order_pipeline
    • First observedfortnox_payables_report
    • First observedfortnox_period_comparison
    • First observedfortnox_product_performance
    • First observedfortnox_project_profitability
    • First observedfortnox_sales_funnel
    • First observedfortnox_search_vouchers
    • First observedfortnox_send_invoice_email
    • First observedfortnox_top_customers
    • First observedfortnox_unpaid_report
    • First observedfortnox_update_account
    • First observedfortnox_update_customer
    • First observedfortnox_update_invoice
    • First observedfortnox_update_supplier
    • First observedfortnox_yearly_comparison

TDQS

A3.6/5.0

Scored across 51 tools

Disambiguation3/5

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.

Naming Consistency4/5

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.

Tool Count2/5

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'.

Completeness3/5

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

ActivityInactive
ResponsivenessResponsive

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    C
    maintenance
    MCP server for the FreeAgent accounting API, enabling LLMs to securely access and manage accounting data including contacts, invoices, bills, bank transactions, and more.
    5 npm
    1
    MIT
  • A
    license
    B
    quality
    D
    maintenance
    An 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.
    65
    1
    MIT
  • A
    license
    B
    quality
    C
    maintenance
    MCP 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.
    76
    12 npm
    5
    MIT
  • A
    license
    A
    quality
    B
    maintenance
    MCP server for the Elorus invoicing and accounting platform, enabling AI assistants to create invoices, manage contacts, and query financial data through natural language.
    43
    4
    MIT