Skip to main content
Glama
klausagnoletti

e-conomic MCP Server

e-conomic-mcp-server

Perfect for anyone who, like me, is more geek than bookkeeper. Finally there is a bit of fun in bookkeeping. Who would have thought.

Getting started

Install dependencies:

npm install

Run the server:

npm start

Related MCP server: fiken-mcp

Environment variables

The server reads e-conomic credentials from the environment:

  • ECONOMIC_APP_SECRET_TOKEN (required)

  • ECONOMIC_AGREEMENT_GRANT_TOKEN (required)

  • ECONOMIC_BASE_URL (optional, defaults to https://restapi.e-conomic.com)

  • ECONOMIC_DEBUG (optional, set to true to emit JSON debug logs to stderr)

You'll find all the information on both tokens you need to get started here. It's a bit complex but not as boring and annoying as it looks like by first glimpse. Pinky promise!

  • Local development: keep secrets in .env and run npm start from the repo root so dotenv loads them.

  • Desktop MCP clients: either start the server from a shell that has .env loaded, or pass env variables in the client config if you want the client to spawn the server for you.

  • CI/shared environments: use your secret manager (GitHub Actions secrets, etc.) and inject env vars at runtime. Do not commit .env.

Tools

Tool list:

  • Connectivity: hello

  • Customers: list_customers, get_customer, update_customer

  • Products: list_products, upsert_product

  • Draft invoices: list_invoice_drafts, get_invoice_draft, create_invoice_draft, update_invoice_draft, book_invoice_draft

  • Booked invoices: list_booked_invoices, get_booked_invoice, download_invoice_pdf

  • Reference data: list_payment_terms, list_customer_groups, list_vat_zones

Tool reference

Category

Tool

Purpose

Arguments

Returns / Notes

Connectivity

hello

Sanity check to confirm the server is reachable.

{ "name": "YourName" }

Greeting text.

Customers

list_customers

List customers with pagination.

{ "pageSize": number, "page": number }

Paginated customer collection.

Customers

get_customer

Fetch one customer by customer number.

{ "customerNumber": number }

Customer details.

Customers

update_customer

Update customer fields.

{ "customerNumber": number, ...fields }

Updated customer object.

Products

list_products

List products with pagination.

{ "pageSize": number, "page": number }

Paginated product collection.

Products

upsert_product

Create or update a product.

{ "productNumber": string, "name": string, "salesPrice": number, "productGroupNumber": number, ...optionalFields }

Product object. productGroupNumber is required on create.

Draft invoices

list_invoice_drafts

List draft invoices with pagination.

{ "pageSize": number, "page": number }

Paginated draft collection.

Draft invoices

get_invoice_draft

Fetch a draft invoice.

{ "draftInvoiceNumber": number }

Draft invoice details.

Draft invoices

create_invoice_draft

Create a new draft invoice.

{ "customerNumber": number, "currency": "DKK", "date": "YYYY-MM-DD", "lines": [...], "createCustomerIfMissing": boolean, "newCustomer": {...} }

Created draft. If a line omits productNumber, it defaults to "1". If createCustomerIfMissing is true and the customer does not exist, a new customer is created from newCustomer.

Draft invoices

update_invoice_draft

Update a draft invoice.

{ "draftInvoiceNumber": number, ...fields }

Updated draft invoice.

Draft invoices

book_invoice_draft

Book a draft into a booked invoice.

{ "draftInvoiceNumber": number }

Booked invoice payload.

Booked invoices

list_booked_invoices

List booked invoices with pagination.

{ "pageSize": number, "page": number }

Paginated booked invoice collection.

Booked invoices

get_booked_invoice

Fetch a booked invoice.

{ "bookedInvoiceNumber": number }

Booked invoice details.

Booked invoices

download_invoice_pdf

Download a booked invoice PDF.

{ "bookedInvoiceNumber": number }

{ "base64": "..." }.

Reference data

list_payment_terms

List payment terms.

{ "pageSize": number, "page": number }

Payment terms collection.

Reference data

list_customer_groups

List customer groups.

{ "pageSize": number, "page": number }

Customer groups collection.

Reference data

list_vat_zones

List VAT zones.

{ "pageSize": number, "page": number }

VAT zones collection.

MCP client setup

Claude Desktop

Add an MCP server entry to your Claude Desktop config file and restart Claude Desktop:

{
  "mcpServers": {
    "e-conomic": {
      "command": "node",
      "args": ["/absolute/path/to/e-conomic-mcp-server/src/server.js"],
      "env": {
        "ECONOMIC_APP_SECRET_TOKEN": "your_token",
        "ECONOMIC_AGREEMENT_GRANT_TOKEN": "your_token",
        "ECONOMIC_BASE_URL": "https://restapi.e-conomic.com"
      }
    }
  }
}

Common config locations:

  • macOS: ~/Library/Application Support/Claude/claude_desktop_config.json

  • Windows: %APPDATA%\\Claude\\claude_desktop_config.json

  • Linux: ~/.config/Claude/claude_desktop_config.json

Claude Code

Add the MCP server via Claude Code:

claude mcp add-json e-conomic '{
  "type": "stdio",
  "command": "node",
  "args": ["/absolute/path/to/e-conomic-mcp-server/src/server.js"],
  "env": {
    "ECONOMIC_APP_SECRET_TOKEN": "...",
    "ECONOMIC_AGREEMENT_GRANT_TOKEN": "...",
    "ECONOMIC_BASE_URL": "https://restapi.e-conomic.com"
  }
}'

Use --scope project to write a shared .mcp.json file in the repo, or --scope user to make it global for your user.

Codex CLI (OpenAI)

Add the MCP server using Codex CLI:

codex mcp add e-conomic --env ECONOMIC_APP_SECRET_TOKEN=... \
  --env ECONOMIC_AGREEMENT_GRANT_TOKEN=... \
  --env ECONOMIC_BASE_URL=https://restapi.e-conomic.com \
  -- node /absolute/path/to/e-conomic-mcp-server/src/server.js

Codex stores MCP configuration in ~/.codex/config.toml if you prefer to edit it directly.

Gemini CLI

Add to your Gemini CLI settings (user or project settings):

{
  "mcpServers": {
    "e-conomic": {
      "command": "node",
      "args": ["/absolute/path/to/e-conomic-mcp-server/src/server.js"],
      "env": {
        "ECONOMIC_APP_SECRET_TOKEN": "your_token",
        "ECONOMIC_AGREEMENT_GRANT_TOKEN": "your_token",
        "ECONOMIC_BASE_URL": "https://restapi.e-conomic.com"
      }
    }
  }
}

Settings files are located at ~/.gemini/settings.json (user) or <project>/.gemini/settings.json (project). System-wide settings live under /etc/gemini-cli/settings.json (Linux), C:\\ProgramData\\gemini-cli\\settings.json (Windows), or /Library/Application Support/GeminiCli/settings.json (macOS).

License

MIT License. See LICENSE for details.

Available Tools

17 tools
book_invoice_draftBook invoice draftC

Book a draft invoice into a booked invoice.

ParametersJSON Schema
NameRequiredDescriptionDefault
bookWithNumberNoOptional booked invoice number
draftInvoiceNumberYesDraft invoice number

TDQS

C2.9/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description must disclose behavioral traits, but it only states the basic action. It does not mention side effects such as whether the draft is deleted, whether the operation is reversible, required permissions, or error conditions. The optional 'bookWithNumber' parameter's effect is also unexplained, leaving the agent to guess about 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 a single, focused sentence that directly conveys the tool's core purpose. It contains no filler or irrelevant details, making it efficient and easy to parse.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The tool lacks an output schema and annotations, and the description is minimal, failing to explain the operation's full impact. For example, it does not describe what happens to the draft invoice after booking, nor the return value. Given the low complexity, the description is still under-specified for an agent to use it safely without additional 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 schema descriptions for both parameters are present and cover 100% of the parameters, so the baseline is 3. The description adds no additional meaning beyond the schema—it does not explain how 'bookWithNumber' interacts with the booking process or why it is optional.

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 action ('book') and the resource ('draft invoice'), with the outcome being 'booked invoice'. This distinguishes it from sibling tools like create_invoice_draft and update_invoice_draft, though it does not explicitly name alternatives. The verb 'book' is domain-specific but clear in the invoice context.

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 provides no guidance on when to use this tool versus alternatives. It does not mention prerequisites, exclusions, or scenarios where other tools (e.g., update_invoice_draft) would be more appropriate. This is a significant gap given the presence of related draft and booked invoice tools.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

create_invoice_draftCreate invoice draftC

Create a draft invoice in e-conomic.

ParametersJSON Schema
NameRequiredDescriptionDefault
dateYesInvoice date (YYYY-MM-DD)
linesYesInvoice lines
dueDateNo
currencyYesInvoice currency (ISO 4217)
newCustomerNoCustomer payload when creating a missing customer
layoutNumberNo
recipientNameNo
customerNumberYesCustomer number in e-conomic
paymentTermsNumberNo
recipientVatZoneNumberNo
createCustomerIfMissingNoCreate customer if it does not exist

TDQS

C2.5/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden, but it only states the action. It does not disclose side effects like automatic customer creation via createCustomerIfMissing, or that it creates a draft rather than a booked invoice, nor does it mention error conditions or permissions.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness2/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is extremely short, almost to the point of under-specification. While concise, it sacrifices needed detail and does not earn its place as a standalone, informative description.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness1/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a complex tool with 11 parameters, nested objects, and no output schema, this one-sentence description is drastically incomplete. It fails to cover prerequisites, return values, or behavior, making it insufficient for an agent to use confidently.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters1/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 55%, yet the description adds no parameter information whatsoever. It does not explain required fields, optional fields like newCustomer, or behaviors such as how createCustomerIfMissing works, leaving the agent to rely entirely on 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 draft invoice in e-conomic, using a specific verb and resource. It is distinct from siblings like update_invoice_draft and book_invoice_draft by emphasizing the creation step.

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 like update_invoice_draft or book_invoice_draft. It also lacks context on prerequisites, such as requiring an existing customer or how to handle missing customers.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

download_invoice_pdfDownload invoice PDFA

Download a booked invoice PDF as base64.

ParametersJSON Schema
NameRequiredDescriptionDefault
bookedInvoiceNumberYesBooked invoice number

TDQS

A3.6/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden. It discloses that the output is base64, which is a useful behavioral detail beyond a simple 'download'. However, it does not mention error handling, permissions, or behavior for invalid/not-booked invoice numbers.

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, clear sentence that conveys the action, the target, and the output format with no unnecessary words. It is front-loaded and easily parsed.

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 one parameter and no output schema, the description adequately communicates the return format (base64 PDF) and identifies the resource type (booked invoice). Minor gaps exist around error cases and the need for prior booking, but the tool's purpose and primary use are clear.

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 has 100% coverage and the single parameter 'bookedInvoiceNumber' is described as 'Booked invoice number'. The description adds no further meaning beyond the schema, so the baseline score of 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific action verb ('Download') with a clear resource ('a booked invoice PDF') and specifies the output format ('as base64'). It clearly distinguishes this tool from sibling tools like get_booked_invoice, which likely returns invoice data rather than the PDF file.

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 get_booked_invoice or list_booked_invoices. The description does not mention prerequisites, scenarios where this is the preferred choice, or any explicit exclusions.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_booked_invoiceGet booked invoiceA

Fetch a booked invoice by number.

ParametersJSON Schema
NameRequiredDescriptionDefault
bookedInvoiceNumberYesBooked invoice number

TDQS

A3.5/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full burden. It only says 'Fetch', which implies a read operation, but it does not disclose error handling (e.g., not found), required permissions, or response structure. This leaves significant behavioral gaps.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single, front-loaded sentence with no redundant wording. It efficiently communicates the tool's purpose and fits the simplicity of the tool.

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?

For a simple single-parameter tool, the description covers the core purpose and input. However, it lacks details on return values, error behavior, and usage context. Since there is no output schema and no annotations, the description is minimally adequate but with clear 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?

The schema fully documents the only parameter (bookedInvoiceNumber) with type, description, and constraint. The description's 'by number' reiterates the schema without adding extra meaning, so the baseline of 3 applies due to 100% 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 'Fetch a booked invoice by number' with a specific verb ('fetch'), a specific resource ('booked invoice'), and the identifier method ('by number'). This distinguishes it from sibling tools like get_invoice_draft and list_booked_invoices.

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 usage is implied: you use this tool when you have a booked invoice number and need the invoice details. However, there is no explicit guidance on when to use this vs alternatives like list_booked_invoices or get_invoice_draft, nor any exclusions or conditions.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_customerGet customerA

Fetch a single customer by customer number.

ParametersJSON Schema
NameRequiredDescriptionDefault
customerNumberYesCustomer number in e-conomic

TDQS

A4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the burden. It indicates a read operation ('Fetch') but does not disclose behavior such as error handling if the customer is not found, whether it returns null or throws, or any authentication requirements. This is minimal for a simple fetch.

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, focused sentence that front-loads the action and resource, with no redundant words or 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 single-fetch tool with one parameter, the description conveys the essential operation. However, without an output schema or error behavior, it leaves some ambiguity about return format and edge cases, making it 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?

The schema already fully describes the only parameter with 100% coverage, including a description ('Customer number in e-conomic'). The description merely repeats 'by customer number' without adding additional context, so it adds little 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 the specific verb 'Fetch' and resource 'a single customer' with the key 'customer number', clearly distinguishing it from siblings like list_customers (plural) and update_customer. It precisely conveys both the operation and its scope.

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 use when you have a specific customer number, providing clear context for a single-record lookup. However, it does not explicitly name alternatives or state when not to use it, such as 'use list_customers to retrieve multiple customers'.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_invoice_draftGet invoice draftA

Fetch a draft invoice by number.

ParametersJSON Schema
NameRequiredDescriptionDefault
draftInvoiceNumberYesDraft invoice number

TDQS

A3.7/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full burden. It states the basic read operation but does not disclose return behavior (e.g., what happens if the draft invoice is not found), response structure, or any authorization requirements. It adds no information beyond what the title and schema already indicate.

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 no redundant words. It directly conveys the operation without excessive detail, making it appropriately concise for a simple fetch tool.

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?

For a simple single-parameter fetch, the description is adequate but lacks information about the return value (no output schema exists) and error handling. It also does not clarify the distinction from get_booked_invoice beyond the word 'draft'. This is a minimal viable description but has clear 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?

The input schema provides full coverage with a description for draftInvoiceNumber. The description's 'by number' adds only marginal context, as the schema already describes the parameter. 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 'Fetch a draft invoice by number' uses a specific verb ('fetch') and resource ('draft invoice') with a clear lookup criterion. It distinguishes this tool from siblings like list_invoice_drafts (which lists drafts) and get_booked_invoice (which retrieves booked 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 use when a specific draft invoice needs to be retrieved by its number. It does not explicitly state when not to use it or mention alternatives, but the context is unambiguous for a single-item fetch.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

helloHelloA

Return a friendly greeting.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameNoName to greet

TDQS

A3.6/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full burden. It discloses the return type (a greeting) but does not mention optional parameters, formatting, or any side effects. For a simple read-only utility, this is adequate but minimal.

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 concise sentence that is front-loaded and contains no filler. Every word 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?

Given the extreme simplicity of the tool and the schema's parameter description, the description is largely complete. It lacks an example output or explicit statement that the tool is a testing utility, but it is sufficient for the trivial nature of 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?

Schema coverage is 100% with the name parameter described as 'Name to greet'. The description adds no extra meaning beyond the schema, 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 'Return a friendly greeting' uses a specific verb and resource, clearly distinguishing it from sibling business tools. It fully states what the 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 Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No explicit guidance on when to use this tool versus alternatives. The context of being a greeting tool is implied but not stated, and no exclusions or alternative references are provided.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_booked_invoicesList booked invoicesB

Fetch a page of booked invoices.

ParametersJSON Schema
NameRequiredDescriptionDefault
pageNoPage number to fetch (default 1).
pageSizeNoNumber of booked invoices per page (default 100).

TDQS

B3.3/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full burden. It only says 'Fetch a page of booked invoices,' which largely restates the title and adds little behavioral context. It does not disclose read-only semantics, ordering, default behavior, or what 'booked' implies, leaving the agent to infer safety and side effects.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single, focused sentence that is front-loaded with the action and resource. Every word contributes meaning without redundancy or filler.

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?

For a simple paginated list tool, the description is minimally viable. However, with no output schema, no annotations, and no guidance on distinguishing from sibling list tools, it lacks richer context about response format or typical use cases that would make it 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 coverage is 100% with both 'page' and 'pageSize' having descriptive comments. The description adds no extra meaning beyond the schema, so a baseline score of 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb ('Fetch') and resource ('booked invoices') with a scope ('a page'), clearly distinguishing it from sibling tools like list_invoice_drafts (drafts) and get_booked_invoice (single invoice). It indicates pagination, which is a key differentiator.

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 provides no guidance on when to use this tool versus alternatives. It does not mention that this is for browsing booked invoices or that sister tools like list_invoice_drafts are for different states. No exclusions or prerequisites are given.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_customer_groupsList customer groupsA

Fetch a page of customer groups.

ParametersJSON Schema
NameRequiredDescriptionDefault
pageNoPage number to fetch (default 1).
pageSizeNoNumber of customer groups per page (default 100).

TDQS

A3.8/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description is minimal, using 'Fetch' to imply a read operation, but with no annotations, it does not disclose other behavioral aspects such as authentication, side effects, or pagination behavior beyond what the schema indicates. It is not misleading but lacks depth.

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 without filler words. It efficiently communicates the tool's purpose with no waste.

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 operation, the description is mostly adequate. It clearly states what is fetched and the schema covers pagination parameters. However, since there is no output schema, the description could provide a bit more detail on the return format, but it does not severely hinder comprehension.

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 provides full descriptions for both page and pageSize, so the tool description does not need to add parameter semantics. The description adds no extra value beyond referring to 'a page', which is already covered in the schema, so baseline 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

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 the verb 'Fetch' and the resource 'customer groups', distinguishing it from sibling tools like list_customers and get_customer. It precisely indicates a paginated read operation.

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 customer groups, but it does not provide explicit guidance on when to use this tool versus alternatives. There is no mention of exclusions or preferred scenarios compared to other list tools.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_customersList customersA

Fetch a page of customers from the e-conomic API.

ParametersJSON Schema
NameRequiredDescriptionDefault
pageNoPage number to fetch (default 1).
pageSizeNoNumber of customers per page (default 100).

TDQS

A4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the transparency burden. The verb 'Fetch' clearly indicates a read-only operation, and the pagination parameters imply a non-mutating list action. However, it lacks details on potential rate limits, sorting/filtering behavior, or any side effects, which would be useful for a complete picture.

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, concise sentence that directly states the tool's purpose without any fluff or repetition. Every word contributes value.

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 optional pagination parameters and no output schema, the description is adequate. It identifies the resource and pagination behavior without needing to explain return fields. However, it could benefit from a brief note that it returns an array of customer objects, 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?

The input schema already fully describes both parameters (page and pageSize) with defaults and ranges. The description's mention of 'page' adds no new meaning beyond the schema, so it aligns with 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 clearly states the action ('Fetch') and resource ('customers'), and specifies it is paginated ('a page'). This distinguishes it from siblings like get_customer (which fetches a single customer) and list_products (different 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 implies use for retrieving customers in a paginated manner, which provides clear context. However, it does not explicitly mention when not to use it or point to alternatives like get_customer for single records, 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.

list_invoice_draftsList invoice draftsB

Fetch a page of draft invoices.

ParametersJSON Schema
NameRequiredDescriptionDefault
pageNoPage number to fetch (default 1).
pageSizeNoNumber of drafts per page (default 100).

TDQS

B3.2/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden of behavioral disclosure. It does convey read-only intent via 'Fetch' and pagination via 'a page', but lacks detail on return format, sorting, filtering, or any side effects. It adds only marginal behavior beyond the title and name.

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 a single concise sentence with no fluff. It is appropriately sized for a simple list tool, though it is slightly too terse to include any usage guidance. It is front-loaded and easy to parse.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's simplicity, the description is adequate: it states the primary function and pagination is covered by the schema. However, without an output schema or annotations, there is no mention of return fields, ordering, or permission requirements, leaving some gaps for an agent to infer.

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 parameters page and pageSize are fully documented with types, ranges, and defaults. The description adds no additional meaning beyond what the schema already provides, earning the baseline score of 3.

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 uses the specific verb 'Fetch' with resource 'a page of draft invoices', clearly indicating a listing operation for draft invoices. It implicitly distinguishes from sibling tools like get_invoice_draft (singular) and list_booked_invoices (booked vs draft), though it does not explicitly name alternatives.

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 provides no guidance on when to use this tool versus other sibling tools such as get_invoice_draft or book_invoice_draft. There is no context for selecting this tool, no exclusions, and no mention of prerequisites.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_payment_termsList payment termsA

Fetch a page of payment terms.

ParametersJSON Schema
NameRequiredDescriptionDefault
pageNoPage number to fetch (default 1).
pageSizeNoNumber of payment terms per page (default 100).

TDQS

A3.8/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the burden of disclosing behavior. It mentions pagination via 'a page', but it does not describe sorting, filtering, authentication requirements, or the return format. This is minimal but not misleading.

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 sentence, immediately stating the core action. It contains no filler or redundant information, making it highly concise and well-structured.

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 operation with no output schema, the description provides the essential information: it fetches a page of payment terms. However, it lacks details about the shape of the returned data or any behavioral caveats, though the schema covers the pagination parameters.

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 'page' and 'pageSize', including defaults and constraints. The description does not add any additional parameter semantics beyond using the word 'page', so it remains at the 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 clearly states the verb 'Fetch' and resource 'payment terms', adding scope with 'a page' to distinguish it from other list tools for different resources. This is a specific and unambiguous statement of 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 the tool is used to fetch payment terms, but it does not explicitly state when to use it over alternatives or provide exclusions. Since no sibling tool for payment terms exists, the guidance is minimal but adequate for the task.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_productsList productsA

Fetch a page of products.

ParametersJSON Schema
NameRequiredDescriptionDefault
pageNoPage number to fetch (default 1).
pageSizeNoNumber of products per page (default 100).

TDQS

A3.6/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description discloses that this is a read operation returning a single page, which implies pagination and read-only behavior. However, with no annotations, it omits details like error handling, pagination edge cases, or any side effects. It meets the minimum bar but lacks richer behavioral context.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single, focused sentence that states exactly the core function. It is front-loaded with the essential information and contains no unnecessary words.

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 fully documented optional parameters, this description is largely complete. It does not describe the return format, but the tool name and title make it obvious that products are returned. The lack of an output schema is not problematic here.

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 page and pageSize (100% coverage). The description adds no additional parameter meaning beyond what the schema states, so it earns the baseline score.

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 'Fetch a page of products' uses a specific verb and resource, making it clear what the tool does. It distinguishes the tool from siblings like list_customers or upsert_product by naming both the action and the target entity.

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 usage guidance is provided. There is no mention of when to choose this tool over alternatives, nor any exclusions or context about other list tools. The description only states what it does, not when to use it.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_vat_zonesList VAT zonesB

Fetch a page of VAT zones.

ParametersJSON Schema
NameRequiredDescriptionDefault
pageNoPage number to fetch (default 1).
pageSizeNoNumber of VAT zones per page (default 100).

TDQS

B3.3/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full burden of behavioral disclosure. It indicates a 'fetch' operation (implying read-only), but does not mention authorization requirements, rate limits, response format, or any side effects. The description is too minimal to disclose behavioral traits beyond the basic action.

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, concise sentence that front-loads the core action and resource. No wasted words or redundant information, and it appropriately avoids repeating schema details.

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 is simple with two well-documented parameters, but no output schema or annotations exist. The description covers the basic purpose and pagination, but leaves out any mention of the return value structure or whether it returns a list of VAT zones. It is minimally viable but lacks some context that would help the agent fully understand the tool's behavior.

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 fully describes both parameters (page and pageSize) with clear descriptions and defaults, so schema coverage is 100%. The description adds no extra parameter-specific meaning, but the baseline of 3 is appropriate since the schema already provides the necessary 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 tool's action ('Fetch') and resource ('a page of VAT zones'), using a specific verb and resource that distinguishes it from sibling tools like list_customers or list_products. The pagination aspect is also explicitly mentioned, 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 Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides no guidance on when to use this tool versus alternatives, nor any exclusions or prerequisites. It simply states the function without contextual cues about use cases or comparisons to other list tools. No alternatives are mentioned.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

update_customerUpdate customerC

Update an existing customer in e-conomic.

ParametersJSON Schema
NameRequiredDescriptionDefault
cvrNo
eanNo
zipNo
cityNo
nameNo
emailNo
addressNo
countryNo
websiteNo
currencyNoCustomer currency (ISO 4217)
attentionNo
vatZoneNumberNo
customerNumberYesCustomer number to update
paymentTermsNumberNo
customerGroupNumberNo
telephoneAndFaxNumberNo

TDQS

C2.4/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden of behavioral disclosure. It indicates a mutation (update) but does not mention whether it performs partial updates, how missing fields are handled, whether it validates input, what happens if the customer does not exist, or any error behavior.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single concise sentence that communicates the core action without waste. However, it is under-specified for a tool with many parameters and no annotations, so it does not fully earn its place as the only descriptive text.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness1/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's complexity (16 parameters, no annotations, no output schema), the description is completely inadequate. It fails to explain return values, error scenarios, or which fields are supported for update, leaving the agent without crucial decision-making information.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters1/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema has 16 parameters with only 13% description coverage (customerNumber and currency). The description adds no parameter-level meaning, merely saying 'update an existing customer' without explaining any fields or the update semantics.

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 updates an existing customer in e-conomic, which identifies the action and resource. It distinguishes from sibling tools like list_customers and get_customer, though it does not enumerate which fields can be updated.

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 explicit guidance is provided on when to use this tool versus alternatives or any preconditions (e.g., customer must exist). Usage is only implied by the verb 'update', but there is no context about when to choose this over other tools.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

update_invoice_draftUpdate invoice draftC

Update an existing draft invoice in e-conomic.

ParametersJSON Schema
NameRequiredDescriptionDefault
dateNoInvoice date (YYYY-MM-DD)
linesNoInvoice lines
dueDateNoDue date (YYYY-MM-DD)
currencyNoInvoice currency (ISO 4217)
layoutNumberNo
recipientNameNo
draftInvoiceNumberYesDraft invoice number
paymentTermsNumberNo
recipientVatZoneNumberNo

TDQS

C2.6/5.0
Behavior1/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Without annotations, the description carries the full burden for behavioral disclosure. It only says 'Update an existing draft invoice', which barely restates the tool name. There is no mention of whether the update is partial or full replacement, what happens to unspecified fields, or any side effects. This is a tautology of the title.

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 concise and free of fluff, but it is arguably too terse for the tool's complexity. It is a single sentence that sacrifices useful specifics. It earns a middle score for being short and clear, yet under-specified relative to the 9-parameter schema.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness1/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With 9 parameters, no annotations, and no output schema, this one-sentence description is severely incomplete. It does not explain required fields (beyond the schema), update semantics, return values, or any edge cases. The agent would have to rely entirely on the schema and guess significant behavioral aspects.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The description adds no meaning to the parameters. While five of nine properties have schema descriptions, the remaining four (layoutNumber, recipientName, paymentTermsNumber, recipientVatZoneNumber) lack any explanation, and the description does not compensate for these gaps or clarify how the nested 'lines' array behaves during an update.

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') and the resource ('existing draft invoice'), which distinguishes it from sibling tools like create_invoice_draft (new) and book_invoice_draft (booking). The word 'existing' is a specific differentiator.

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. It does not mention that it should be used for modifying an already-created draft, nor does it reference create_invoice_draft for new drafts. The only hint is 'existing', but no explicit usage context or exclusions are given.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

upsert_productUpsert productB

Create or update a product by productNumber.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYesProduct name
barCodeNoBarcode
costPriceNoCost price
salesPriceNoSales price
unitNumberNoUnit number
productNumberYesProduct number
departmentNumberNoDepartment number
productGroupNumberNoProduct group number (required when creating)

TDQS

B3.4/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description must carry the burden. It only says 'Create or update,' but does not disclose whether the operation is idempotent, what happens to existing fields on update, whether specific permissions are needed, or any side effects. This is inadequate for a mutation tool.

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 sentence that front-loads the operation ('Create or update') and identifies the resource ('product'). It is concise, clear, and every word earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For an 8-parameter mutation tool with no annotations and no output schema, the description is too sparse. It does not explain upsert behavior, distinguishing between create and update paths, or the significance of required vs optional parameters. The schema covers parameter details but not the behavioral semantics needed 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 description coverage is 100%, so parameters are fully documented in the schema. The description adds the key fact that productNumber is the lookup key, which is helpful but not substantial. It does not clarify upsert-specific requirements like productGroupNumber being required only on create, which is left to 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 'Create or update a product by productNumber.' This is a specific verb+resource+key, distinguishing it from sibling tools like list_products or update_customer. It precisely communicates the upsert operation and the unique identifier.

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: use this when you need to create or update a product. However, it does not explicitly mention when not to use it or contrast with alternatives. Since there is no other product-write tool among siblings, the context is clear but not fully explicit.

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. 17 tool updatesv1.0.0
    • First observedbook_invoice_draft
    • First observedcreate_invoice_draft
    • First observeddownload_invoice_pdf
    • First observedget_booked_invoice
    • First observedget_customer
    • First observedget_invoice_draft
    • First observedhello
    • First observedlist_booked_invoices
    • First observedlist_customer_groups
    • First observedlist_customers
    • First observedlist_invoice_drafts
    • First observedlist_payment_terms
    • First observedlist_products
    • First observedlist_vat_zones
    • First observedupdate_customer
    • First observedupdate_invoice_draft
    • First observedupsert_product

TDQS

B3.4/5.0

Scored across 17 tools

Disambiguation5/5

Each tool targets a distinct resource-action pair: customers, products, invoice drafts, booked invoices, and reference data. List vs. get operations are clearly separated, and even the 'hello' tool is unambiguous.

Naming Consistency4/5

Tools consistently use verb_noun snake_case (list_, get_, create_, update_, book_, download_, upsert_). The only outlier is 'hello', which breaks the pattern but is a trivial helper.

Tool Count4/5

At 17 tools, this is slightly above the typical 3-15 range, but the count is justified by covering customers, products, invoices, and reference data. No tool feels redundant.

Completeness4/5

The invoice workflow is well covered from draft creation through booking to PDF download. However, customers lack a create operation and products lack a single get operation, leaving minor gaps.

Maintenance

ActivityInactive
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    B
    quality
    A
    maintenance
    Enables interaction with the Estonian e-arveldaja (RIK e-Financials) REST API to manage financial records like invoices and journal entries using natural language. It supports automating purchase invoice entry from PDFs, reconciling bank transactions, and generating financial reports.
    130
    234 npm
    34
    Apache 2.0
  • A
    license
    C
    quality
    C
    maintenance
    Enables AI assistants to manage invoices, contacts, purchases, journal entries, and other accounting operations via the Fiken API.
    100
    13 npm
    1
    MIT
  • A
    license
    B
    quality
    D
    maintenance
    Enables AI agents to manage invoices, customers, suppliers, accounting entries, orders, and more through Fortnox's cloud accounting platform via natural language.
    20
    27 npm
    1
    MIT
  • A
    license
    Not graded
    quality
    D
    maintenance
    Enables AI assistants to interact with the SuperFaktura invoicing system for managing invoices, clients, and expenses via natural language.
    1
    Apache 2.0