Skip to main content
Glama
uol-mcp

uol-mcp

by jakubbegera

uol-mcp

Model Context Protocol server for UOL Účetnictví — ask Claude, Cursor or any other MCP client about your bookkeeping: issued and received invoices, who owes you money, uploaded documents, contacts.

Unofficial. Not affiliated with or endorsed by UOL a.s. It talks to the public UOL REST API with your own API token.

Česky

Status: v0.6 — read-only by default, opt-in writes. What changed: CHANGELOG.md.

What it can do

Tool

Answers

get_business_snapshot

How the company is doing, in one call: this month vs last, VAT, receivables, documents to process, bank

get_financial_overview

Revenue, expenses and profit per month from the general ledger, largest accounts

get_vat_overview

VAT per filing period: to pay or excess deduction, due date, final or estimate

get_bank_balances

Bank balances per account and currency (UOL keeps monthly snapshots)

get_company

Company name, IČO, DIČ, address, VAT filing period; doubles as a connection check

search_sales_invoices, get_sales_invoice

Issued invoices with line items, VAT and payment status

search_purchase_invoices, get_purchase_invoice

Received invoices

list_receivables

Who owes you, how much, how long overdue — totals per currency

export_sales_invoice

PDF or ISDOC of an issued invoice, saved to disk (ISDOC is also returned as XML)

search_contacts, get_contact

Customers and suppliers by name, IČO or DIČ, with addresses and bank accounts

list_uploaded_documents, get_uploaded_document, download_uploaded_document

Documents uploaded for the accountant, their state and files

list_codebook

Currencies, departments, contracts, price lists, own bank accounts, …

api_get

Read-only GET of any other /v1/… endpoint

Example questions: "Jak si letos stojíme?", "Kolik zaplatím DPH za tento kvartál?", "Kdo mi dluží víc než 30 dní?", "Je faktura 2026000123 zaplacená?", "Na čem nejvíc utrácíme?", "Stáhni mi PDF poslední vydané faktury."

More read tools are available as opt-in toolsets (UOL_TOOLSETS): ledger (general-ledger postings, internal documents), banking (bank movements, petty-cash documents) and warehouse (products, stock levels, orders).

Ready-made prompts (slash commands in most clients): monthly_review, vat_check, overdue_followup (drafts reminders, sends nothing), process_inbox, and with write access issue_invoice (builds a sales invoice from your description, shows a dry run and creates a draft once you confirm). The uol://guide resource explains the domain to the model.

The uol-ucetnictvi skill goes further: Claude issues an invoice the way you always invoice that customer (DUZP rule, due days, products, line texts and bank account learned from your earlier invoices to them) and reads revenue, profit, VAT and receivables the way an accountant does (unbooked months, estimates, deadlines). Install it in Claude Desktop or claude.ai by zipping the skills/uol-ucetnictvi folder and uploading it under Settings → Capabilities → Skills, or in Claude Code by copying the folder to ~/.claude/skills/.

The server knows the API's quirks: invoice status valid means draft, payment status exists only for issued invoices, credit notes come with positive amounts, revenue and expenses have to be read from the ledger (excluding year-end closing entries), purchase invoices ignore issue-date filters, files have three different download shapes, and the rate limit (30 requests / 10 s) is respected client-side. See docs/DESIGN.md.

Related MCP server: bokio-mcp

Getting an API token

  1. Open the API tokens page of your UOL tenant (path /api_tokens, e.g. https://firma.ucetnictvi.uol.cz/api_tokens) and create a token.

  2. The UOL user needs the REST API permission. A dedicated user with only the rights you want the assistant to have is a good idea.

Your tenant is the first part of your UOL address: https://firma.ucetnictvi.uol.cz → firma.

Want to try it first? UOL_TENANT=demo uses UOL's public DEMO company, no token needed.

Configuration

Variable

Meaning

UOL_TENANT

demo, your tenant name (firma), a host prefix (firma.sandbox) or the full https://….uol.cz URL

UOL_EMAIL

E-mail you log into UOL with

UOL_TOKEN

API token

UOL_DOWNLOAD_DIR

Where exported and downloaded files go (default ~/Downloads/uol-mcp)

UOL_TOOLSETS

Comma-separated: core, insights (these two are the default), ledger, banking, warehouse, or all

UOL_ACCESS

read (default), write or full — see Writing

UOL_ACCOUNTS, UOL_DEFAULT_ACCOUNT

Several companies in one server — see Several companies; UOL_ACCOUNT_<NAME>_ACCESS sets one account's level

UOL_PROFILES_FILE

The same from a JSON file

UOL_UPLOAD_DIRS

Folders upload_document may read from (default ~/Downloads, ~/Desktop, ~/Documents; :-separated, ; on Windows). The HTTP server has no default: without this variable it accepts only content_base64

UOL_AUDIT_LOG

File that records every write as a JSON line

UOL_TIMEOUT_MS

Timeout of one UOL request (default 30000)

UOL_DEBUG

1 logs requests to stderr (never credentials)

Claude Desktop

Settings → Developer → Edit Config, then add:

{
  "mcpServers": {
    "uol": {
      "command": "npx",
      "args": ["-y", "uol-mcp"],
      "env": {
        "UOL_TENANT": "firma",
        "UOL_EMAIL": "you@example.com",
        "UOL_TOKEN": "your-token"
      }
    }
  }
}

Claude Code

claude mcp add uol -e UOL_TENANT=firma -e UOL_EMAIL=you@example.com -e UOL_TOKEN=your-token -- npx -y uol-mcp

Cursor / VS Code

Cursor (.cursor/mcp.json) uses the same mcpServers block as Claude Desktop. VS Code (.vscode/mcp.json):

{
  "servers": {
    "uol": {
      "type": "stdio",
      "command": "npx",
      "args": ["-y", "uol-mcp"],
      "env": { "UOL_TENANT": "firma", "UOL_EMAIL": "you@example.com", "UOL_TOKEN": "your-token" }
    }
  }
}

Docker

docker run -i --rm -e UOL_TENANT=firma -e UOL_EMAIL=you@example.com -e UOL_TOKEN=your-token -v "$HOME/Downloads/uol-mcp:/data" ghcr.io/jakubbegera/uol-mcp

Exported and downloaded files are written to /data inside the container; the -v mount keeps them. In an MCP client config, use docker as the command and the rest as args.

Claude Desktop extension

Each release ships uol-mcp.mcpb. Open it to install, then fill in tenant, e-mail and token in the form; the token is stored as a secret. bash scripts/build-mcpb.sh builds the bundle from source.

HTTP server (self-hosting)

MCP_TRANSPORT=http MCP_AUTH_TOKEN=$(openssl rand -hex 32) UOL_TENANT=firma UOL_EMAIL=you@example.com UOL_TOKEN=your-token npx -y uol-mcp

The endpoint is http://127.0.0.1:3000/mcp (HOST, PORT to change; /health for probes). Two modes:

  • One tenant: UOL credentials in the server's env. Clients must send Authorization: Bearer <MCP_AUTH_TOKEN>; the server refuses to start without the token.

  • Pass-through: no UOL credentials in the env. Each client sends its own X-UOL-Tenant, X-UOL-Email and X-UOL-Token headers with every request; the server stores nothing. MCP_AUTH_TOKEN is optional on localhost.

Over HTTP, exported invoices and downloaded documents come back inside the tool result instead of being saved on the server, and upload_document takes the file as content_base64 — it reads no paths on the server unless UOL_UPLOAD_DIRS is set. In Docker, bind to all interfaces and publish the port: docker run -p 3000:3000 -e MCP_TRANSPORT=http -e HOST=0.0.0.0 -e MCP_AUTH_TOKEN=… -e MCP_ALLOWED_HOSTS=mcp.example.com ….

Variable

Meaning

MCP_TRANSPORT

http starts the HTTP server (same as --http)

HOST, PORT

Bind address, default 127.0.0.1:3000

MCP_AUTH_TOKEN

Bearer token clients must send, at least 32 characters; required in one-tenant mode and whenever HOST is not a loopback address

MCP_ALLOWED_HOSTS

Accepted Host names (comma-separated); required when HOST is not a loopback address

MCP_ALLOWED_ORIGINS

Browser origins allowed to call the endpoint (none by default)

The server speaks plain HTTP: anywhere beyond localhost, put it behind a reverse proxy that terminates TLS. The server refuses to start on a non-loopback address without MCP_AUTH_TOKEN and MCP_ALLOWED_HOSTS.

Check the setup

UOL_TENANT=firma UOL_EMAIL=you@example.com UOL_TOKEN=your-token npx -y uol-mcp doctor

Writing (opt-in)

With UOL_ACCESS=write these tools appear:

Tool

Does

upload_document

Uploads a PDF to UOL's document inbox for the accountant (only from UOL_UPLOAD_DIRS)

create_sales_invoice

Creates an issued invoice for an existing contact — a draft unless issue: true

update_sales_invoice

Changes or issues a draft invoice (UOL doesn't allow editing issued ones)

create_purchase_invoice

Books a received invoice from an existing supplier

create_contact, update_contact

Adds or changes a customer / supplier (refuses a duplicate IČO)

create_payment_demand

Creates a payment demand (upomínka) for unpaid invoices of one customer — never sends it

mark_document_processed, pair_uploaded_document, tag_uploaded_document, untag_uploaded_document

The accountant's inbox: state, link to the booked record, tags

UOL_ACCESS=full adds delete_sales_invoice (drafts only), repair_sales_invoice (storno or back to draft for issued invoices) and api_request (a raw write to any endpoint).

Invoice lines need a UOL product (list_codebook with kind: products lists them). Every write supports dry_run (shows exactly what would be sent), creates are safe to retry (idempotency key), and the tools are marked so clients ask you before running them. Set UOL_AUDIT_LOG to keep a record of every write.

Several companies

Accountants with several clients on UOL can serve them all from one server. List the accounts in UOL_ACCOUNTS and give each one its own variables (name upper-cased, - becomes _):

"env": {
  "UOL_ACCOUNTS": "firma,novak",
  "UOL_ACCOUNT_FIRMA_TENANT": "firma",
  "UOL_ACCOUNT_FIRMA_EMAIL": "ja@firma.cz",
  "UOL_ACCOUNT_FIRMA_TOKEN": "op://Private/UOL firma/credential",
  "UOL_ACCOUNT_NOVAK_TENANT": "novak",
  "UOL_ACCOUNT_NOVAK_EMAIL": "ja@firma.cz",
  "UOL_ACCOUNT_NOVAK_TOKEN": "op://Private/UOL novak/credential",
  "UOL_ACCOUNT_NOVAK_LABEL": "Novák s.r.o."
}

The first account is the default (or set UOL_DEFAULT_ACCOUNT). With the 1Password CLI, start the server as op run -- node …/dist/index.js and the op:// references are replaced by the tokens at startup — nothing secret sits in the config. uol-mcp doctor checks every account.

Alternatively, point UOL_PROFILES_FILE at a JSON file:

{
  "default": "firma",
  "accounts": {
    "firma": { "tenant": "firma", "email": "ja@firma.cz", "token_env": "UOL_TOKEN_FIRMA" },
    "novak": { "tenant": "novak", "email": "ja@firma.cz", "token_env": "UOL_TOKEN_NOVAK", "label": "Novák s.r.o." }
  }
}

token_env names an environment variable holding the token, so the file needs no secrets (an inline token works too; keep such a file chmod 600). The server then offers list_accounts, and every tool takes an account argument — "Kdo dluží firmě Novák?" goes to the right tenant. Each account keeps its own rate limit.

Accounts can have their own access level: with UOL_ACCESS=write and UOL_ACCOUNT_NOVAK_ACCESS=read (or "access": "read" in the profiles file), writes to Novák are refused while the other account can still write. list_accounts shows each account's level.

Privacy and safety

  • Read-only unless you set UOL_ACCESS=write. Text inside invoices, notes and documents is treated as data: review what the assistant proposes to write before you approve it.

  • Whatever the tools return goes to the AI model your client uses. Accounting data contains personal data of your contacts and employees — use a plan whose terms you are comfortable with.

  • Credentials are used only for https://*.uol.cz and are never written to logs or tool output.

  • Downloaded files are saved under UOL_DOWNLOAD_DIR only, readable by the owner, and never replace an existing file (a taken name gets a (1) suffix). Downloads over 50 MB are refused.

  • The model is told that text coming from UOL (invoices, notes, documents) is data, never instructions.

From source

Requires Node.js 22+.

git clone https://github.com/jakubbegera/uol-mcp.git
cd uol-mcp
npm install
npm run build

Then point your client at node /path/to/uol-mcp/dist/index.js instead of npx -y uol-mcp.

Development

npm test                 # unit + MCP-level tests against recorded DEMO responses
npm run typecheck
npm run smoke            # calls every tool against the live DEMO tenant
npm run record-fixtures  # refreshes test/fixtures/demo from the DEMO tenant
bash scripts/build-mcpb.sh  # builds build/uol-mcp.mcpb
docker build -t uol-mcp .

CI runs the type check, tests, npm audit, a Trivy scan of the Docker image, CodeQL and, on pull requests, dependency review; Dependabot keeps dependencies, actions and the base image current.

Releases are cut by pushing a v* tag; after a maintainer approves the release environment, .github/workflows/release.yml publishes to npm, GHCR, the GitHub release (MCPB bundle) and the MCP Registry.

Design notes, API facts and the roadmap are in docs/DESIGN.md.

Contributing

Contributions are welcome — see CONTRIBUTING.md. Report security problems privately as described in SECURITY.md.

License

MIT

Available Tools

18 tools
api_getRaw UOL GETA
Read-onlyIdempotent

Read-only GET of any UOL REST path (spec: https://api.uol.cz/openapi.yaml) for data no other tool covers — e.g. /v1/accounting_records, /v1/bank_movements, /v1/products, /v1/warehouse/statuses, /v1/sales_orders. Returns the raw JSON (amounts as strings, invoice status "valid" = draft); large answers are cut to fit. Prefer the dedicated tools.

NameRequiredDescriptionDefault
pathYesPath under the API root starting with /v1/, e.g. /v1/products
queryNoQuery parameters, e.g. {"page": 1, "per_page": 50}

Output Schema

NameRequiredDescription
dataYes
pathYes
truncatedYes

TDQS

A4.3/5.0
Behavior5/5

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

Annotations already declare readOnly/idempotent/non-destructive, so the bar is lower, yet the description still adds non-obvious behavior: raw JSON is returned, amounts come back as strings, invoice status "valid" actually means draft, and large responses are truncated to fit. Those are exactly the traits an agent cannot infer from annotations or schema.

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

Conciseness4/5

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

The core verb and scope are front-loaded in the first clause, with the routing rule right behind it. The long parenthetical example list and embedded spec URL make it slightly dense, but each element carries usable 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?

For an open-world generic REST passthrough, it covers the essentials: scope, precedence, path format, the spec reference for unlisted endpoints, and known data quirks. An output schema exists, so return structure needn't be explained, though the truncation behavior could say how severe the cutoff is.

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 both `path` (with an example) and `query` (with a page/per_page example). The description's only additions are alternative example paths and the /v1/ prefix constraint, which the schema also states — hence the baseline 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?

States a specific verb and resource ("Read-only GET of any UOL REST path") and immediately scopes it against siblings with "for data no other tool covers" plus concrete example endpoints. The only thing keeping it from a 5 is that the purpose is intrinsically generic — a catch-all escape hatch — rather than one well-defined resource.

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?

Gives an explicit fallback rule ("Prefer the dedicated tools"), an explicit when-to-use condition ("data no other tool covers"), a list of representative paths, and a spec link for everything not covered. An agent can decide between this and the dedicated tools without further inference.

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

download_uploaded_documentDownload uploaded documentA
Read-onlyIdempotent

Saves the original file of an uploaded document on the machine running uol-mcp and returns its path.

NameRequiredDescriptionDefault
document_idYes

Output Schema

NameRequiredDescription
file_nameYes
file_pathYesAbsolute path of the saved file on the machine running uol-mcp; null when the file is embedded in the result (HTTP transport)
size_bytesYes
document_idYes
content_typeYes

TDQS

A3.6/5.0
Behavior4/5

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

The description adds real context beyond the annotations by disclosing the side effect that a file is written to the server's filesystem and that the return value is a path. It does not cover overwrite behavior, target directory conventions, or failure modes. The filesystem write is a local side effect but does not meaningfully contradict readOnlyHint, which concerns the remote data store.

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?

One sentence, front-loaded with the action and ending with what is returned. No filler or redundant restatement of the title.

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?

It is a simple one-parameter tool with an output schema, and the description explains both the action and the shape of the result, so there is little missing. The only notable gap is the absent guidance on document_id provenance and on filesystem target behavior.

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?

Schema description coverage is 0%, so document_id is completely undocumented in the schema. The description only implies that the value refers to an uploaded document; it gives no format, source, or validity guidance to compensate for the coverage gap.

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?

States a specific verb and resource: it "saves the original file of an uploaded document" and returns its path. That clearly separates it from get_uploaded_document and list_uploaded_documents, which deal in metadata rather than the file itself, though neither sibling is named explicitly.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

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

Usage is implied rather than stated: the phrase "on the machine running uol-mcp" hints this is for when you need a local copy of the file. There is no explicit when-to-use, no mention of how it differs from get_uploaded_document, and no note about where a document_id can be obtained.

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

export_sales_invoiceExport issued invoice (PDF / ISDOC)A
Read-onlyIdempotent

Downloads an issued (sales) invoice rendered by UOL and saves it on the machine running uol-mcp. format=isdoc also returns the ISDOC XML (Czech e-invoice standard), which is readable line by line. ISDOC exists only for issued (confirmed) invoices. Received invoices cannot be exported through the API.

NameRequiredDescriptionDefault
formatNopdf
invoice_idYesinvoice_id from search_sales_invoices

Output Schema

NameRequiredDescription
formatYes
file_nameYes
file_pathYesAbsolute path of the saved file on the machine running uol-mcp; null when the file is embedded in the result (HTTP transport)
invoice_idYes
size_bytesYes
content_typeYes

TDQS

A4.1/5.0
Behavior4/5

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

Annotations already cover the safety profile (readOnly, idempotent, non-destructive), and the description adds real context on top: the call writes a file to the machine running uol-mcp, a side effect not captured by readOnlyHint. It also discloses that ISDOC output is XML readable line by line and that the format is only available for confirmed issued invoices.

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?

Three short sentences, front-loaded with the core action and file-write behavior, followed by the format variant and the eligibility restriction. No filler or repetition of the title.

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

Completeness4/5

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

With an output schema present, return-shape explanation is unnecessary, and the description covers the action, the format option, and the invoice-type restriction. A minor gap is any hint about where the saved file lands or how the caller learns the path, which is left entirely to the output schema.

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 50% — invoice_id is documented in the schema, format is not — but the description compensates by explaining what format=isdoc actually yields (Czech e-invoice XML, line-by-line readable) rather than just restating the enum. The default of pdf is only implied by the schema, not discussed.

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?

States a specific verb and resource: 'Downloads an issued (sales) invoice rendered by UOL and saves it on the machine running uol-mcp,' plus the format=isdoc variant. This distinguishes export-to-file from metadata retrieval siblings like get_sales_invoice, though it never names that sibling explicitly.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

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

Gives an explicit exclusion: 'ISDOC exists only for issued (confirmed) invoices' and 'Received invoices cannot be exported through the API,' which steers agents away from using it on purchase invoices. It stops short of naming an alternative tool for received invoices or explaining when PDF should be preferred over ISDOC.

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

get_bank_balancesBank balancesA
Read-onlyIdempotent

Balances of the company's own bank accounts, per account and summed per currency. UOL stores monthly opening-balance snapshots (1st of the month), not live balances; always quote the as_of date.

NameRequiredDescriptionDefault
historyNoAlso return every snapshot, newest first (up to 120)

Output Schema

NameRequiredDescription
noteYes
historyYes
accountsYes
truncatedYesTrue when UOL had more snapshots than one call reads
by_currencyYes

TDQS

A4/5.0
Behavior4/5

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

Annotations already cover the safety profile (readOnly, idempotent, non-destructive), so the description's job is to add semantics — and it does, disclosing the snapshot/staleness model and the reporting obligation around as_of. That is exactly the kind of non-obvious behavior an agent would otherwise get wrong. It does not mention freshness lag beyond the monthly cadence or any account-visibility limits.

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, both load-bearing, with the resource definition front-loaded and the staleness caveat immediately after. No restatement of the name or title and no filler.

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?

An output schema exists, so return values need no explanation, and the description covers the one thing that would cause misuse: treating snapshots as live balances. What is missing is positioning relative to the many sibling financial tools, which would help an agent choose correctly. Otherwise complete for a one-parameter read 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?

There is a single optional parameter and the schema documents it fully, including the default and the 120-snapshot cap. The description adds no additional meaning about what history does or when to request it, so the schema carries the load. Baseline 3 is appropriate given 100% schema description coverage.

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?

States a specific resource and its shape: the company's own bank accounts, broken out per account and summed per currency. That is far more informative than the title alone and distinguishes it from sibling overview tools by naming the granularity. It stops short of explicitly naming the sibling it replaces (e.g. get_financial_overview or get_business_snapshot).

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?

Gives a concrete usage constraint that changes how the agent interprets results: the data is monthly opening-balance snapshots dated the 1st, not live balances, and the as_of date must always be quoted. It does not say when to prefer this over the other financial sibling tools, so no explicit exclusions are offered.

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

get_business_snapshotBusiness snapshotA
Read-onlyIdempotent

"How is the company doing?" in one call: this month vs last month (revenue, expenses, profit, whether booked yet), the VAT period due next and the running one, unpaid and overdue receivables, uploaded documents waiting for the accountant, and bank balances. Sections that fail (e.g. missing permission) are null and listed in errors; sections read only partly are listed in incomplete. Use the dedicated tools for detail.

NameRequiredDescriptionDefault

No parameters

Output Schema

NameRequiredDescription
bankYesUOL stores monthly opening-balance snapshots (1st of the month), not live balances; always quote the as_of date.
as_ofYes
errorsYes
companyYes
incompleteYesSections where UOL had more rows than one call reads; their figures may be too low
this_monthYes
receivablesYes
vat_due_nextYesThe period whose return and payment are due next — what will be paid
booked_throughYesDate of the latest revenue or expense posting: the ledger is booked up to here; later months are not booked yet
previous_monthYes
vat_current_periodYesThe running period, still open
documents_to_processYesUploaded documents in state unprocessed

TDQS

A4.7/5.0
Behavior5/5

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

Beyond the general read-only hints provided in annotations, the description provides vital behavioral context. It explicitly states how the tool handles partial data or failure, detailing that missing permissions result in null/error listings and how partial reads are flagged ('listed in incomplete').

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 highly dense yet exceptionally well-structured. It begins with a compelling high-level hook, uses a comprehensive list to enumerate scope, and ends with actionable behavior instructions, maximizing information density per sentence.

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 tool is a complex aggregate, pulling data from many different categories (VAT, bank balances, receivables, documents). Because it has zero inputs, the description must account for its entire scope and behavior upon success or partial failure, which it does thoroughly.

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?

Since the input schema is empty (0 parameters), the description cannot add semantic meaning to inputs. Given the 100% schema description coverage and zero parameters, the baseline high score 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 defines the tool as providing a consolidated, high-level summary of financial health ('How is the company doing?'). It explicitly lists the aggregated data points (revenue, VAT, receivables, etc.), distinguishing its function as an overview tool from the granular sibling tools provided.

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 definition provides clear guidance on its appropriate use by advising the agent to 'Use the dedicated tools for detail.' This sets an explicit boundary for when the agent should pivot to specialized functions rather than relying on this broad tool.

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

get_companyCompany detailsA
Read-onlyIdempotent

The accounting entity of this UOL tenant: name, IČO, DIČ, address and VAT filing period. Also a quick check that uol-mcp is connected.

NameRequiredDescriptionDefault

No parameters

Output Schema

NameRequiredDescription
webYes
nameYes
emailYes
phoneYes
vatinYesDIČ
tenantYes
addressYes
registerYes
valid_fromYes
vat_periodYes
legal_entityYestrue = company (právnická osoba), false = sole trader
company_numberYesIČO

TDQS

A3.5/5.0
Behavior3/5

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

Annotations already declare readOnlyHint, idempotentHint, destructiveHint=false and openWorldHint=true, so the safety and side-effect profile is fully covered. The description adds that this doubles as a connection check, which is a useful behavioral note, but says nothing about caching, freshness of the VAT period data, or whether it fails when the tenant is unauthenticated.

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?

Two sentences with no filler, and the returned fields are front-loaded ahead of the connectivity note. The opening is an elliptical noun fragment ('The accounting entity of this UOL tenant: ...') rather than a full clause, which is slightly less readable but not wasteful.

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 zero-parameter read tool with a published output schema, the description covers purpose, payload contents, and an extra use case, so nothing essential is missing. The only gap is the absence of any hint that the data is tenant-scoped and requires an authenticated connection, which the openWorldHint implies but does not state.

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 tool takes zero parameters and the schema is empty, so there is no parameter meaning the description could add; baseline 4 applies for zero-param tools. The description does implicitly confirm no scoping input is needed (tenant is inferred), but that is incidental rather than deliberate parameter documentation.

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?

Names a specific resource — the tenant's accounting entity — and enumerates what it returns (name, IČO, DIČ, address, VAT filing period), so the agent immediately knows the payload. It is a noun phrase rather than an explicit verb, and it does not differentiate itself from siblings such as get_business_snapshot or get_financial_overview, but the resource is unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

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

The second sentence supplies a concrete secondary use case — verifying that uol-mcp connectivity works — which is genuine usage guidance. However, there are no conditions for when to prefer this over get_business_snapshot or get_financial_overview for tenant-level data, and no exclusions, so the routing guidance is only implied.

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

get_contactGet contactB
Read-onlyIdempotent

One contact with all addresses, bank accounts and default payment terms.

NameRequiredDescriptionDefault
contact_idYescontact_id, e.g. from search_contacts or an invoice

Output Schema

NameRequiredDescription
cityYes
nameYes
noteYes
emailYes
vatinYesDIČ
hiddenYes
countryYes
addressesYes
vat_payerYes
contact_idYesUsable with get_contact and as buyer_id / seller_id / customer_id filters
external_idYes
bank_accountsYes
company_numberYesIČO
taxable_personYesBusiness (osoba povinná k dani) vs private person
unreliable_payerYesFlagged as nespolehlivý plátce DPH
days_till_due_dateYesDefault payment term in days

TDQS

B3/5.0
Behavior3/5

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

Annotations already declare readOnly, idempotent, non-destructive and open-world, so safety is covered. The description adds what the response contains (addresses, bank accounts, default payment terms), which is useful payload context, but says nothing about lookup failure behavior for an unknown contact_id. Since an output schema exists, omitting return formatting is acceptable.

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?

One short, front-loaded sentence fragment with no filler. It is efficient, though the fragment form leaves the action unstated rather than making the sentence tighter.

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 single-parameter read tool with an output schema and full annotation coverage, most of the agent's needs are met by structured fields. The description covers payload scope but not the retrieval verb or fallback behavior when no contact matches.

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 single required contact_id is documented with sourcing hints, so the schema does the heavy lifting. The description adds only the implicit signal that contact_id resolves to exactly one record. Baseline 3 applies.

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

Purpose3/5

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

The description is a noun phrase naming the resource and its payload ('One contact with all addresses, bank accounts and default payment terms') rather than a verb+resource statement, so retrieval must be inferred from the tool name. It does implicitly differentiate from the list-oriented sibling search_contacts by saying 'One contact', but never states that explicitly.

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?

There is no guidance on when to call this versus search_contacts or the invoice tools, and no mention of what contact_id source to prefer. The only hint is inside the schema ('e.g. from search_contacts or an invoice'), not the description.

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

get_financial_overviewRevenue, expenses and profit by monthA
Read-onlyIdempotent

Revenue (výnosy, class 6), expenses (náklady, class 5) and profit per month from the general ledger — the same basis as the UOL web dashboard, so payroll, rent and other internal documents count, not just invoices. Amounts are net of VAT, in the home currency. The current month is still running, and months the accountant has not booked yet have booked=false — say so instead of reporting zero. Also returns the largest revenue and expense accounts (with names) for the whole window.

NameRequiredDescriptionDefault
monthsNoMonths ending with the current one

Output Schema

NameRequiredDescription
as_ofYes
monthsYes
totalsYes
truncatedYesTrue when the ledger had more postings than one call reads; use fewer months
booked_throughYesDate of the latest revenue or expense posting: the ledger is booked up to here; later months are not booked yet
revenue_by_accountYes
current_vs_previousYes
expenses_by_accountYes

TDQS

A4/5.0
Behavior4/5

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

Beyond the readOnly/idempotent annotations, the description discloses genuinely non-obvious traits: amounts are net of VAT and in home currency, the current month is still running, unbooked months return booked=false, and the response includes the largest revenue and expense accounts with names. It does not cover cost or latency for a ledger-wide aggregation, but the semantic caveats an agent needs to avoid misreporting are all present.

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?

Two dense sentences, front-loaded with the scope before the caveats, and the Czech/class-6/class-5 parenthetical earns its place by anchoring the ledger mapping. The 'same basis as the UOL web dashboard' clause is slightly indirect but pays off by ruling out the invoice-only interpretation. Minor tightening possible, but nothing is padding.

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?

An output schema exists, so return values need not be explained, and the description instead spends its budget on the traps: running current month, booked=false, net-of-VAT amounts, home currency. For a single-optional-parameter read tool with full annotation coverage, nothing an agent needs in order to call it and report results honestly is missing.

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 single parameter 'months' already documents 'Months ending with the current one' with defaults and bounds. The description reinforces that figures are 'per month' and that the current month is partial, but adds no new meaning about the months parameter itself (e.g., no note that the window also drives the top-accounts summary, though that is inferable).

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?

States a specific resource set (revenue, expenses, profit per month) drawn from a named source (the general ledger) and explicitly pins the accounting basis: 'the same basis as the UOL web dashboard, so payroll, rent and other internal documents count, not just invoices.' That basis statement is what separates it from invoice-centric siblings like get_sales_invoice or list_receivables, so an agent can route correctly without opening the schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

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

There is no explicit when-to-use or when-not-to-use guidance relative to siblings such as get_vat_overview or get_business_snapshot, which plausibly overlap. What exists instead is interpretive guidance — 'say so instead of reporting zero' for unbooked months — which is valuable but governs reading the output, not selecting the tool. Usage is strongly implied by the scope sentence rather than stated.

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

get_purchase_invoiceGet received invoiceB
Read-onlyIdempotent

One received (purchase) invoice with line items, VAT and payment symbols.

NameRequiredDescriptionDefault
invoice_idYesinvoice_id from search_purchase_invoices

Output Schema

NameRequiredDescription
vatYesSum of VAT amounts
noteYes
typeYes
itemsYes
totalYesTotal including VAT (Celkem s DPH)
numberYesSupplier's invoice number
sellerYes
statusYesdraft = koncept (UOL "valid"), issued = vystavená ("confirmed"), cancelled = storno ("invalid")
currencyYes
due_dateYes
tax_dateYesDUZP — taxable supply date
invoice_idYesInternal id, usable with get_purchase_invoice
issue_dateYes
external_idYes
vat_amountsYesUOL vat1..vat3 amounts in rate order
department_idYes
exchange_rateYes
received_dateYes
payment_methodYes
constant_symbolYes
specific_symbolYes
variable_symbolYes
total_without_vatYesTax base (Celkem bez DPH)

TDQS

B3.2/5.0
Behavior3/5

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

The annotations already declare readOnlyHint=true, idempotentHint=true, destructiveHint=false and openWorldHint=true, so the safety and idempotency profile needs no restating. The description does add useful content about what the response holds (line items, VAT, payment symbols), but it says nothing about not-found behavior, error cases, or what the openWorld flag means for external data freshness.

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?

A single short line with no filler and the scope qualifier front-loaded. It is slightly under-specified as a sentence fragment rather than a statement of what the tool does, but nothing is wasted.

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, carries rich annotations, has a fully described schema and an output schema, so the description does not need to explain returns in depth. It could have stated the retrieval-in-by-ID semantics and pointed at search_purchase_invoices, but almost everything an agent needs sits in structured fields.

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?

There is a single parameter at 100% schema description coverage, so the schema already carries the meaning and even names the producing tool. The description adds nothing about the ID's format or source, which is the correct baseline for a fully documented one-parameter schema.

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?

It names a specific resource, a received (purchase) invoice, and enumerates what comes back (line items, VAT, payment symbols), which cleanly separates it from the sibling get_sales_invoice. The only weakness is the absence of an explicit verb, since the fragment reads as an object rather than an action.

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?

It supplies no guidance on when to call this or when to call search_purchase_invoices instead, nor any prerequisite such as needing the ID first. The workflow hint only appears in the schema as 'invoice_id from search_purchase_invoices', so the agent has to infer the lookup pattern from structured fields rather than the description.

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

get_sales_invoiceGet issued invoiceA
Read-onlyIdempotent

One issued (sales) invoice with line items, VAT, payment symbols, own bank account and payments received. Use export_sales_invoice for the PDF or ISDOC. Earlier invoices to the same buyer show how they are usually issued (DUZP, due days, products, line texts, bank account) — a template for a new one.

NameRequiredDescriptionDefault
invoice_idYesinvoice_id from search_sales_invoices

Output Schema

NameRequiredDescription
vatYesSum of VAT amounts
noteYes
textYesIntroductory text printed on the invoice
typeYes
buyerYes
itemsYes
totalYesTotal including VAT (Celkem s DPH)
numberYesEvidence number shown on the invoice
statusYesdraft = koncept (UOL "valid"), issued = vystavená ("confirmed"), cancelled = storno ("invalid")
paymentYes
currencyYes
due_dateYes
paymentsYes
tax_dateYesDUZP — taxable supply date
invoice_idYesInternal id, usable with get_sales_invoice
issue_dateYes
contract_idYesContract (zakázka), if any
external_idYes
vat_amountsYesUOL vat1..vat3 amounts in rate order
department_idYes
exchange_rateYes
payment_methodYes
bank_account_idYesOwn bank account the buyer pays to (list_codebook my_bank_accounts)
constant_symbolYes
specific_symbolYes
variable_symbolYes
linked_invoice_idYesE.g. the original invoice of a corrective invoice
total_without_vatYesTax base (Celkem bez DPH)

TDQS

A4.2/5.0
Behavior4/5

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

Annotations already declare readOnly, idempotent, non-destructive and open-world, so the safety profile is handled. The description adds real behavioral context beyond them: the response payload composition (line items, VAT, payment symbols, bank account, payments received) and the downstream workflow it supports. It is silent on error behavior or cross-company scoping, which keeps it from a 5.

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

Conciseness5/5

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

Two sentences, payload description front-loaded, then alternative-tool routing followed by the practical template use case. No filler or repetition of the title.

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

Completeness4/5

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

With an output schema present and rich annotations, the description only needs to cover purpose, differentiation and when to reach for it - all of which it does. Minor omission: it does not say whether the lookup is scoped to the authenticated company or what happens for an unknown id.

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?

There is a single parameter with 100% schema description coverage, and the schema itself notes the id comes from search_sales_invoices. The description adds no further meaning about invoice_id, so the baseline 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 names a specific resource (one issued sales invoice) and enumerates exactly what it carries: line items, VAT, payment symbols, own bank account and payments received. It also explicitly separates itself from export_sales_invoice, so an agent can distinguish it from the nearest sibling without inspecting the schema.

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 explicitly routes the PDF/ISDOC case to export_sales_invoice and states a concrete use case: review earlier invoices to the same buyer as a template for issuing a new one. It does not name search_sales_invoices as the way to obtain the id, but the input schema covers that link.

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

get_uploaded_documentGet uploaded documentB
Read-onlyIdempotent

One uploaded document with its original file name, tags and the bookkeeping records it was paired with. Pairings identify the record by type and internal gid, not by invoice number.

NameRequiredDescriptionDefault
document_idYes

Output Schema

NameRequiredDescription
noteYes
tagsYesNull when the UOL user may not read tags
stateYesunprocessed = waiting for the accountant, processed, error
formatYes
pairingsYes
file_nameYes
created_atYes
created_byYes
document_idYes
content_typeYes
uploaded_viaYesweb, api, an e-mail address or an OIDC client id

TDQS

B3/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, so the safety profile needs no restating. The description does add one genuinely useful behavioral note — that pairings reference records by type and internal gid rather than invoice number — which steers the agent away from expecting a human-readable invoice identifier. It says nothing about behavior for unknown or deleted document ids, which is the remaining gap.

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

Conciseness4/5

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

Two sentences, front-loaded with what is returned, with no filler. The second sentence is a caveat that earns its place, though the opening is a bare noun phrase rather than a verb-led statement of action.

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 single-parameter read tool with an output schema and full safety annotations, most of the burden is already carried by structured fields, so the description is nearly sufficient. What remains missing is where document_id comes from and what happens on a miss — details an agent needs to invoke this correctly on the first try.

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?

Schema description coverage is 0% and the description never mentions document_id, so it adds no meaning beyond the bare string type in the schema. An agent must guess the expected format (internal id, UUID, file key) and whether the id comes from list_uploaded_documents.

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 names a specific resource and enumerates what it carries: original file name, tags, and paired bookkeeping records. The lead phrase "One uploaded document" distinguishes it from the plural sibling list_uploaded_documents, though it never states the retrieval verb explicitly and does not call out download_uploaded_document as the byte-returning alternative.

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?

There is no guidance on when to reach for this tool versus list_uploaded_documents or download_uploaded_document, and no prerequisites or error conditions are mentioned. The only implicit usage signal is the singular "One uploaded document," which the agent must infer.

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

get_vat_overviewVAT by filing periodA
Read-onlyIdempotent

VAT (DPH) per filing period, newest first: output VAT, input VAT, amount to pay or excess deduction, due date. The filing period (monthly / quarterly) comes from the company settings. Closed periods use UOL's "DPH" closing document (exact). Open periods are estimated from issued invoices — output VAT by DUZP, input VAT by the later of DUZP and the receipt date: proformas skipped, corrective invoices counted as credit notes, internal documents and reverse charge not included.

NameRequiredDescriptionDefault
periodsNoNumber of periods; default 4 for monthly payers, 2 for quarterly

Output Schema

NameRequiredDescription
as_ofYes
methodYes
periodsYes
truncatedYes
vat_periodYes

TDQS

A4.1/5.0
Behavior5/5

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

Annotations already declare readOnly, idempotent, non-destructive, but the description adds substantive behavior: closed periods come from UOL's exact DPH closing document while open periods are estimates computed with stated rules (output VAT by DUZP, input VAT by later of DUZP and receipt date). It also discloses what is excluded (proformas skipped, corrective invoices as credit notes, internal documents and reverse charge omitted), which is exactly the accuracy caveat an agent needs.

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

Conciseness4/5

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

Front-loaded with the resource and returned values before the caveats, and each clause carries real information (estimation rules, exclusions). The second sentence is a long run-on with semicolons, but trimming it would lose material accuracy caveats.

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 read-only reporting tool with an output schema and fully documented parameters, the definition covers derivation, accuracy, ordering and exclusions well. It is slightly silent on scope (which company/workspace the figures belong to and how far back the periods extend), but that is minor given the surrounding sibling tools.

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 single `periods` parameter already documents its 1-12 range and the 4/2 default per payer type. The description mentions monthly/quarterly periods only as a company-settings fact, not as parameter meaning, so it adds nothing beyond the schema — the 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 names the resource precisely (VAT/DPH per filing period) and enumerates the returned figures: output VAT, input VAT, amount to pay or excess deduction, due date, plus the sort order (newest first). No sibling tool covers VAT, so an agent can identify this tool from the description alone.

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?

Implicit usage: an agent learns the filing period (monthly/quarterly) is taken from company settings rather than passed as a parameter, which is useful routing context. However, there is no explicit when-to-use statement and no pointer to alternatives such as get_financial_overview for a broader picture, so guidance stays implied.

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

list_codebookList codebookA
Read-onlyIdempotent

Reference data (číselníky) used by invoices and documents: currencies, countries, departments (střediska), contracts (zakázky), price lists, product categories, predefined texts, document templates, payment rules, own bank accounts, petty cashes (pokladny), document tags and products (the product_id invoice lines need). Records are returned as UOL sends them, minus audit fields.

NameRequiredDescriptionDefault
kindYes
pageNoPage number, starting at 1
limitNoRows per page (max 250)

Output Schema

NameRequiredDescription
kindYes
itemsYes
paginationYes

TDQS

A3.6/5.0
Behavior3/5

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

Annotations already declare readOnlyHint, idempotentHint, destructiveHint=false and openWorldHint, so the safety profile is covered. The description adds one genuinely useful behavioral detail: records come back 'as UOL sends them, minus audit fields', which tells the agent the response shape is a stripped passthrough. It says nothing about ordering, caching, or size characteristics of the upstream source.

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?

Purpose is front-loaded in the first clause and the response-shape caveat is isolated in a short second sentence. The long enumerated list is somewhat run-on and partly duplicates the enum, but the glosses make the repetition earn its place. No filler or marketing language.

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 an output schema present and a simple three-parameter surface, the description covers what the agent needs: what the tool returns, that audit fields are stripped, and why each kind matters. The only gap is that it does not indicate whether results are paginated further or how to locate a specific record by ID, which a sibling lookup tool might handle.

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 67%, and the uncovered parameter is the critical 'kind' enum. The description compensates well by glossing each value, including Czech operational terms (střediska, zakázky, pokladny) and the practical note that 'products' supplies the product_id needed by invoice lines. Page/limit semantics are already documented in the schema, so no further detail is required there.

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 opens with a specific verb-plus-resource framing ('Reference data (číselníky) used by invoices and documents') and enumerates the exact kinds of reference data the tool returns. An agent can immediately tell this is a catalog/lookup tool. It does not name a sibling, but no sibling in the list overlaps with this function, so differentiation is less critical.

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 is implied rather than stated: the parenthetical '(the product_id invoice lines need)' hints at the key downstream use case of fetching product IDs before building invoice lines. There is no explicit when-to-use versus when-not-to-use guidance and no mention of alternatives for looking up a single record.

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

list_receivablesReceivables (who owes us)A
Read-onlyIdempotent

Receivables of issued (sales) invoices — pohledávky: totals per currency plus the matching invoices, most overdue first by default. Answers "who owes me money", "what is overdue", "has customer X paid". Covers sales invoices only: the UOL API exposes no payment status for received (purchase) invoices.

NameRequiredDescriptionDefault
sortNodays_overdue
limitNoInvoices to list; totals always cover every match
stateNounpaid
customer_idNoContact id from search_contacts
due_date_toNoDate as YYYY-MM-DD
overdue_onlyNoOnly unpaid invoices past their due date
due_date_fromNoDate as YYYY-MM-DD
issue_date_toNoDate as YYYY-MM-DD
issue_date_fromNoDate as YYYY-MM-DD

Output Schema

NameRequiredDescription
as_ofYesToday in Europe/Prague; overdue is computed against this date
totalsYes
invoicesYes
truncatedYesTrue when UOL had more rows than one call reads; narrow the filters
match_countYes

TDQS

A3.9/5.0
Behavior4/5

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

Annotations already declare readOnly, idempotent, non-destructive and open-world, so the safety bar is largely met. The description goes beyond them by disclosing a real data limitation (the UOL API exposes no payment status for received/purchase invoices) and the default ordering (most overdue first), both of which affect how results may be interpreted. It does not discuss pagination or truncation behavior, though the schema's limit description partly covers that.

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?

Three tight sentences, front-loaded with the resource and return shape before the usage questions and the scope caveat. The Czech term "pohledávky" is domain flavor that earns little for an agent, but it costs only a clause.

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 an output schema present, the definition needn't explain return values, and annotations cover the safety profile; the description supplies the remaining essentials — scope limits and default ordering. The main residual gap is guidance on when this beats search_sales_invoices for overlapping invoice-level queries.

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 high (78%) and enums are self-explanatory, so the schema carries most parameter meaning. The description only echoes the default sort ("most overdue first by default") and does not clarify interactions such as how state, overdue_only and the date ranges combine. That is baseline-level added value.

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 names a specific resource and result shape: "Receivables of issued (sales) invoices — totals per currency plus the matching invoices," plus a default ordering. It also bounds the resource (sales invoices only, no purchase-invoice payment status). It stops short of explicitly contrasting with the sibling search_sales_invoices, which an agent must still disambiguate on its own.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

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

Concrete triggering questions ("who owes me money", "what is overdue", "has customer X paid") give the agent clear contexts to reach for this tool, and the closing sentence is an explicit when-not for purchase invoices. There is no explicit routing to alternatives such as search_sales_invoices or get_financial_overview for the overlapping receivable-total case.

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

list_uploaded_documentsList uploaded documentsA
Read-onlyIdempotent

Documents uploaded to UOL for the accountant (nahrané doklady: receipts, received invoices as PDF/images), newest first. state=unprocessed lists what the accountant has not processed yet.

NameRequiredDescriptionDefault
pageNoPage number, starting at 1
limitNoRows per page (max 100)
stateNo
created_toNoUploaded before this day (Prague time)
created_fromNoUploaded on or after this day (Prague time)

Output Schema

NameRequiredDescription
documentsYes
paginationYes

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, idempotentHint=true, destructiveHint=false and openWorldHint=true, so the safety profile is covered. The description adds useful behavior beyond that: results are returned newest first and the state field reflects the accountant's processing workflow. It says nothing about pagination behavior, result volume, or what happens with empty filters.

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?

Two compact sentences with no filler, front-loading what the resource is and its ordering before the filter hint. The Czech term in parentheses is minor clutter but serves disambiguation for a domain-specific resource.

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?

An output schema exists, so return values need not be explained, and annotations cover the safety profile. For a five-optional-parameter list tool the description covers identity, ordering and the most important filter; only sibling routing and the remaining filter semantics are left implicit.

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 80%, so the schema already documents page, limit, created_from and created_to, and the enum values are supplied. The description adds meaning only for state=unprocessed, leaving processed/error and the date filters to the schema. Baseline 3 is appropriate when the schema does most of the work.

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?

States a specific verb and resource ('Documents uploaded to UOL for the accountant'), plus the concrete content types (receipts, received invoices as PDF/images) and the sort order (newest first). It does not explicitly distinguish itself from siblings like get_uploaded_document or download_uploaded_document, though the list-vs-get contrast is implied by the name.

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?

Provides one concrete usage cue — 'state=unprocessed lists what the accountant has not processed yet' — which tells the agent when that filter matters. It gives no guidance on when to pick this over get_uploaded_document/download_uploaded_document, nor any prerequisites, so usage is implied rather than spelled out.

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

search_contactsSearch contactsA
Read-onlyIdempotent

Search customers and suppliers (kontakty / adresář) by name, IČO or DIČ. Returns contact_id values for the invoice and receivable filters.

NameRequiredDescriptionDefault
nameNoName as UOL matches it; for part of a name use query
pageNoPage number, starting at 1
limitNoRows per page (max 100)
queryNoFull-text: name, contact id or note
vatinNoDIČ, e.g. CZ12345678
countryNoISO country code, e.g. CZ
company_numberNoIČO
include_hiddenNo
taxable_personNotrue = businesses only, false = private persons only

Output Schema

NameRequiredDescription
contactsYes
paginationYes

TDQS

A3.6/5.0
Behavior3/5

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

Annotations already declare readOnlyHint, idempotentHint, and non-destructive behavior, so the safety profile is covered. The description adds that results are contact_id values usable as filters elsewhere, which is useful context, but it says nothing about pagination defaults, hidden contacts, or result volume.

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 short sentences with zero waste; the resource and searchable fields come first and the downstream use of contact_id follows. Nothing is padded or 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?

With nine optional parameters and an output schema present, the definition is largely complete: return values need not be explained, and the contact_id note is a bonus. The one gap is the absence of any statement about default behavior when no filters are supplied.

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 89%, so the schema already explains nearly every parameter, including the IČO and DIČ mapping. The description's mention of name/IČO/DIČ mostly restates that, adding no syntax or precedence guidance (e.g. name vs query).

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?

States a specific verb and resource ('Search customers and suppliers') plus the searchable identifiers (name, IČO, DIČ), so the agent knows exactly what the tool does. It does not explicitly distinguish itself from the sibling get_contact, which retrieves a single contact, leaving that routing to inference.

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 sentence 'Returns contact_id values for the invoice and receivable filters' implies a clear usage context: call this to obtain IDs needed by invoice/receivable tools. However, it never states when not to use it, what happens with zero parameters, or how it relates to get_contact for single-record lookups.

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

search_purchase_invoicesSearch received invoicesA
Read-onlyIdempotent

Search received (purchase) invoices — přijaté faktury. UOL ignores issue-date filters on this endpoint, so filter by tax_date_* (DUZP) or received_date_*. The UOL API exposes no payment status for purchase invoices.

NameRequiredDescriptionDefault
pageNoPage number, starting at 1
typeNo
limitNoRows per page (max 100)
queryNoFull-text: invoice number, supplier name or text
numberNoPartial match of the supplier's invoice number
currencyNoISO code, e.g. EUR
seller_idNoContact id from search_contacts
total_maxNo
total_minNo
due_date_toNoDate as YYYY-MM-DD
tax_date_toNoDate as YYYY-MM-DD
due_date_fromNoDate as YYYY-MM-DD
tax_date_fromNoDate as YYYY-MM-DD
variable_symbolNo
received_date_toNoDate as YYYY-MM-DD
received_date_fromNoDate as YYYY-MM-DD

Output Schema

NameRequiredDescription
invoicesYes
paginationYes

TDQS

A4.2/5.0
Behavior4/5

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

Annotations already declare readOnlyHint, idempotentHint, non-destructive and openWorld, so safety is covered. The description adds two pieces of non-obvious behavioral context the annotations cannot convey: the API silently ignores issue-date filters on this endpoint, and the UOL API exposes no payment status for purchase invoices, which warns the agent away from an unavailable filter or expected field.

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?

Three short sentences, front-loaded with the resource identification followed by the two constraints that matter before calling. The Czech gloss and the filter caveat each earn their place; nothing is redundant, though the phrasing is slightly terse for a 16-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?

For a 16-parameter, all-optional search tool with an output schema present, the description covers what structured fields cannot: the identity of the resource, which date filters actually work, and a data limitation (no payment status). Pagination, formats and limits are already documented in the schema, so nothing an agent needs in order to call it correctly is missing.

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

Parameters4/5

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

Schema coverage is 75%, so the schema already documents most parameters, but several date fields (tax_date_from/to, received_date_from/to, due_date_from/to) exist with identical YYYY-MM-DD descriptions and no differentiation. The description resolves that ambiguity by naming tax_date_* as DUZP and marking it and received_date_* as the working date filters, which is real added 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 states a specific verb and resource ('Search received (purchase) invoices') plus the Czech equivalent 'přijaté faktury', which unambiguously separates it from sibling search_sales_invoices and get_purchase_invoice. An agent can tell it is a filtered list operation on the received-invoice resource without opening the schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

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

It gives one concrete usage rule — because UOL ignores issue-date filters on this endpoint, filter by tax_date_* (DUZP) or received_date_* instead — which is genuinely actionable. However, it never says when to pick this over get_purchase_invoice (single-record lookup) or search_sales_invoices (direction), and gives no exclusions or prerequisites, so the routing guidance is only partial.

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

search_sales_invoicesSearch issued invoicesA
Read-onlyIdempotent

Search issued (sales) invoices — vydané faktury — newest first. Each row includes payment status from UOL receivables. Use tax_date_* (DUZP) for accounting-period questions, issue_date_* for "issued in". Drafts and cancelled invoices are listed too; check status. For "who owes me money" prefer list_receivables.

NameRequiredDescriptionDefault
pageNoPage number, starting at 1
typeNo
limitNoRows per page (max 100)
queryNoFull-text: invoice number, buyer name or text
numberNoPartial match of the invoice number
buyer_idNoContact id from search_contacts
total_maxNo
total_minNoTotal including VAT
due_date_toNoDate as YYYY-MM-DD
tax_date_toNoDate as YYYY-MM-DD
due_date_fromNoDate as YYYY-MM-DD
issue_date_toNoDate as YYYY-MM-DD
tax_date_fromNoDate as YYYY-MM-DD
issue_date_fromNoDate as YYYY-MM-DD
variable_symbolNo

Output Schema

NameRequiredDescription
invoicesYes
paginationYes

TDQS

A4.8/5.0
Behavior5/5

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

Beyond the annotations (which already declare readOnly/idempotent/non-destructive), the description discloses default sort order, that each row carries payment status derived from UOL receivables, and that drafts and cancelled invoices are included so callers must check status. That inclusion caveat is exactly the kind of non-obvious behavior an agent needs and cannot get from the schema or hints.

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?

Four compact sentences, front-loaded with the core identity and ordering, then the date semantics, then the completeness caveat, then the alternative routing. No filler or restatement of the title.

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

Completeness4/5

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

For a 15-parameter search tool with rich annotations and an output schema, the description covers the decision-relevant semantics: what is searched, ordering, result completeness, and sibling routing. The enum meaning of type (corrective/proforma/penalty) and amount filters are left to the schema, a minor residual gap.

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 80%, so the baseline is 3; the description earns a bump by disambiguating the three date families (tax/issue/due) that the schema only labels as "Date as YYYY-MM-DD". It leaves other parameters such as type enum values and variable_symbol unelaborated, but the highest-risk ambiguity is resolved.

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?

States a specific verb and resource ("Search issued (sales) invoices"), gives the Czech alias "vydané faktury", and notes the default ordering (newest first). It is clearly separable from siblings search_purchase_invoices and list_receivables, the latter of which is named explicitly.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

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

Gives explicit routing rules: use tax_date_* (DUZP) for accounting-period questions versus issue_date_* for "issued in", and defer to list_receivables for "who owes me money". Both when-to-use and when-to-use-something-else are stated.

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. 18 tool updatesv0.6.1
    • First observedapi_get
    • First observeddownload_uploaded_document
    • First observedexport_sales_invoice
    • First observedget_bank_balances
    • First observedget_business_snapshot
    • First observedget_company
    • First observedget_contact
    • First observedget_financial_overview
    • First observedget_purchase_invoice
    • First observedget_sales_invoice
    • First observedget_uploaded_document
    • First observedget_vat_overview
    • First observedlist_codebook
    • First observedlist_receivables
    • First observedlist_uploaded_documents
    • First observedsearch_contacts
    • First observedsearch_purchase_invoices
    • First observedsearch_sales_invoices

TDQS

A3.6/5.0

Scored across 18 tools

Disambiguation4/5

The tools target clearly distinct resources and actions (sales vs purchase invoices, contacts, documents, receivables, VAT, bank, financials), and descriptions explicitly cross-reference each other to steer selection (e.g. prefer list_receivables over search_sales_invoices for 'who owes me money'). Minor overlap remains between get_business_snapshot and the dedicated overview tools, and api_get acts as a catch-all that could tempt misselection, but the guidance to prefer dedicated tools mitigates this.

Naming Consistency4/5

Nearly all tools follow a consistent verb_noun pattern: get_, search_, list_, export_, download_ (get_sales_invoice, search_contacts, list_receivables, etc.). The only deviation is api_get (noun_verb), which is a reasonable special-case escape hatch but breaks the otherwise uniform convention.

Tool Count4/5

At 18 tools it sits in the heavier band, but for a full accounting domain (invoices, contacts, documents, VAT, bank, ledger, codebooks) each tool maps to a distinct need. The set is slightly large but no tool feels redundant; a couple of the overview tools could arguably be folded together.

Completeness4/5

The read surface is comprehensive: invoices, contacts, uploaded documents, receivables, VAT, bank balances, financial overview, snapshot and codebooks, with api_get as a fallback for uncovered endpoints. Gaps are mostly API-imposed (no purchase-invoice export, no purchase payment status) plus the entire absence of write operations, which limits it to a read-only reporting server.

Maintenance

ActivityMaintained
ResponsivenessNo recent community issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    B
    quality
    A
    maintenance
    Enables interaction with the QuickBooks Online Accounting API to manage customers, invoices, expenses, and payments through MCP-compatible clients. It supports comprehensive financial workflows and the generation of reports like Profit and Loss or Balance Sheets.
    138
    2
    Apache 2.0
  • A
    license
    A
    quality
    C
    maintenance
    Enables MCP clients to read and write Bokio accounting data for one company through 85 tools covering invoices, customers, suppliers, journal entries, chart of accounts, fiscal years, items, tags, uploads, SIE export, and bank payments.
    40
    96 npm
    MIT
  • A
    license
    B
    quality
    C
    maintenance
    Enables querying and managing a live accounting ledger, including transactions, balances, VAT summaries, deadlines, and documents, from any MCP client.
    86
    107 npm
    MIT
  • A
    license
    Not graded
    quality
    B
    maintenance
    Enables MCP-capable clients to read and write directly in epago accounting, including chart of accounts, transactions, invoices, payments, receipts, and tax reports.
    MIT