Skip to main content
Glama

checkbox-mcp

An MCP server for the API of Checkbox, a Ukrainian software cash register (ПРРО). It lets an AI assistant such as Claude answer questions about receipts, shifts, X/Z reports, goods and orders of your organization, and, only if you explicitly allow it, open and close shifts and create fiscal receipts.

Українською: README.uk.md

Unofficial. This project is not affiliated with or endorsed by Checkbox. "Checkbox" is a trademark of its owner. Use it at your own risk: receipts created through the write tools are real fiscal documents.

Status: 0.1.0, not yet verified on a live cash register. The server is built from the official OpenAPI document (version 2.108.3) and the public Checkbox wiki. All tests run against a mocked HTTP layer and check every request against a snapshot of that OpenAPI document. Nobody has run it against the real Checkbox API yet, neither with a test cashier nor with a production one. See Limitations.

What is a ПРРО, and what is Checkbox?

In Ukraine most businesses that sell to consumers have to register each sale with the State Tax Service (ДПС). The device or program that does this is a "registrar of settlement operations" (РРО). A ПРРО is the software variant: instead of a certified hardware cash register, a program signs every receipt with the cashier's electronic signature, sends it to the tax service and gets a fiscal number back. Work is organized in shifts (зміна): a cashier opens a shift, issues receipts, and closes the shift with a Z-report, the daily summary that goes to the tax service. Checkbox is one such ПРРО service; it offers web and mobile apps and a REST API, which is what this server talks to.

Related MCP server: moysklad-mcp-ru

Quick start

You need Node.js 20 or newer and the credentials of a Checkbox cashier. To try the server out, use the test cashier and test cash register that Checkbox creates for every account (see Trying it with Checkbox test data).

Not on npm yet. Until the first release is published, the npx -y @myradostudio/checkbox-mcp commands below will not work. Run the server from source instead: git clone https://github.com/myradostudio/checkbox-mcp, then npm install and npm run build in that folder, and use "command": "node" with "args": ["/absolute/path/to/checkbox-mcp/dist/index.js"] in the configurations below.

Claude Desktop

Add the server to claude_desktop_config.json (Settings → Developer → Edit Config):

{
  "mcpServers": {
    "checkbox": {
      "command": "npx",
      "args": ["-y", "@myradostudio/checkbox-mcp"],
      "env": {
        "CHECKBOX_PIN_CODE": "your cashier PIN code",
        "CHECKBOX_LICENSE_KEY": "your cash register license key"
      }
    }
  }
}

If the server does not start on Windows, use "command": "cmd" and "args": ["/c", "npx", "-y", "@myradostudio/checkbox-mcp"].

Claude Code

claude mcp add --transport stdio \
  --env CHECKBOX_PIN_CODE=your-pin-code \
  --env CHECKBOX_LICENSE_KEY=your-license-key \
  checkbox -- npx -y @myradostudio/checkbox-mcp

Cursor

Add the same block to ~/.cursor/mcp.json (all projects) or .cursor/mcp.json (one project):

{
  "mcpServers": {
    "checkbox": {
      "command": "npx",
      "args": ["-y", "@myradostudio/checkbox-mcp"],
      "env": {
        "CHECKBOX_PIN_CODE": "your cashier PIN code",
        "CHECKBOX_LICENSE_KEY": "your cash register license key"
      }
    }
  }
}

Any other MCP client that can start a local stdio server works the same way: run npx -y @myradostudio/checkbox-mcp with the environment variables below.

Then ask, for example:

  • "Which cashier are you signed in as, and is a shift open?"

  • "Show yesterday's receipts and the total by payment form."

  • "Find the Z-reports for last week and print the latest one."

  • "Is the cash register online? How many offline codes are left?"

Configuration

The server is configured with environment variables only. It validates them at startup and exits with an explanation on stderr if something is missing.

Variable

Required

Default

Purpose

CHECKBOX_PIN_CODE

one sign-in method

Cashier PIN code. The sign-in method Checkbox recommends. Needs CHECKBOX_LICENSE_KEY.

CHECKBOX_LOGIN

one sign-in method

Cashier login. Used with CHECKBOX_PASSWORD when no PIN code is set.

CHECKBOX_PASSWORD

with the login

Cashier password.

CHECKBOX_LICENSE_KEY

see purpose

License key of the cash register. Required for PIN sign-in, for write mode, and for the tools that report on "this" cash register (get_cash_register without an id, get_offline_status, get_periodical_report, list_shifts with scope cash_register).

CHECKBOX_API_URL

no

https://api.checkbox.ua

API origin. Must be https:// (plain http:// is accepted for localhost only).

CHECKBOX_ALLOW_WRITE

no

off

Set to 1 to register the write tools. Any other value than 1/true/yes/on or 0/false/no/off stops the server.

The PIN code and the license key are shown in the Checkbox personal cabinet, in the cashier and cash register sections. If both a PIN code and a login/password pair are set, the PIN code is used.

Tools

Money amounts are integers in kopecks (13550 means 135.50 UAH) and quantities are integers in thousandths (1000 means 1 piece, 2250 means 2.25 kg), exactly as in the Checkbox API. The server tells the model so.

Read tools (always available)

Tool

What it returns

API call

get_cashier_profile

The signed-in cashier, permissions, test flag, and the organization

GET /api/v1/cashier/me

list_cash_registers

Cash registers with fiscal number, address, online/offline mode, open shift

GET /api/v1/cash-registers

get_cash_register

One cash register by id, or the one the license key belongs to

GET /api/v1/cash-registers/{id} or GET /api/v1/cash-registers/info

get_offline_status

Available offline fiscal codes and time spent offline

GET /api/v1/cash-registers/get-offline-codes-count and …/get-offline-time

get_current_shift

The open shift of the cashier with its running balance

GET /api/v1/cashier/shift

list_shifts

Shifts of the cashier, or of the cash register

GET /api/v1/shifts or GET /api/v1/cash-registers/shifts

get_shift

One shift in full, including its Z-report once closed

GET /api/v1/shifts/{id}

search_receipts

Receipts by period, fiscal number, barcode, shift, cash register, branch

GET /api/v1/receipts/search

get_receipt

One receipt as JSON, or as printable text

GET /api/v1/receipts/{id} or …/{id}/text

list_reports

X- and Z-reports with totals per payment form

GET /api/v1/reports/search

get_report

One report as JSON, or as printable text

GET /api/v1/reports/{id} or …/{id}/text

get_periodical_report

The periodical report for a date range, as text

GET /api/v1/reports/periodical

search_goods

Goods from the Checkbox catalogue with prices and tax rates

GET /api/v1/goods

list_taxes

Tax rates configured for the organization

GET /api/v1/cashier/tax

list_orders

Orders (draft receipts placed by an external system)

GET /api/v1/orders

get_order

One order in full, including customer delivery details

GET /api/v1/orders/{id}

List tools return compact summaries and a pagination block. The page size defaults to 25 and is capped at 100 (50 for cash register shifts, the limit of that endpoint); next_offset tells the model how to continue.

Write tools (only with CHECKBOX_ALLOW_WRITE=1)

Tool

What it does

API call

open_shift

Opens a shift on the cash register of the license key

POST /api/v1/shifts

close_shift

Closes the current shift and creates its Z-report

POST /api/v1/shifts/close

create_sale_receipt

Creates and fiscalizes a sale receipt

POST /api/v1/receipts/sell

create_return_receipt

Creates and fiscalizes a return receipt

POST /api/v1/receipts/sell with is_return on every line

create_service_receipt

Puts cash into the register or takes it out

POST /api/v1/receipts/service

send_receipt_email

E-mails a copy of a receipt

POST /api/v1/receipts/{id}/email

send_receipt_sms

Sends a copy of a receipt by SMS/Viber (a Checkbox service billed separately)

POST /api/v1/receipts/{id}/sms

A receipt is a fiscal document. Once created it cannot be edited or deleted; a mistake can only be compensated with a separate return receipt. The same goes for an opened or closed shift.

Safety model

Fiscal receipts are legal documents, so the server is conservative by design.

  • Read-only unless you opt in. Without CHECKBOX_ALLOW_WRITE=1 the write tools are not registered at all: the model cannot see or call them. Every read tool issues only GET requests, and a test enforces that.

  • Honest annotations. Read tools carry readOnlyHint: true. Tools that create fiscal state (open_shift, close_shift, the three receipt tools) carry destructiveHint: true: strictly speaking they add data, but the result cannot be undone, and the hint is what makes MCP clients ask you for confirmation. No write tool claims to be idempotent. Whether and how confirmation is shown is up to your MCP client; keep per-call approval switched on for the write tools.

  • Strict input. Every tool rejects arguments it does not know, so a filter the API does not have is never silently ignored and a misspelled discount cannot produce a receipt with the wrong total. Write tools also reject non-integer amounts and malformed contacts before anything is sent.

  • No blind retries. The server never repeats a write on its own, except once after an HTTP 401, where the request was refused for authentication and a fresh token is needed. If a write ends without a definite answer (a timeout, a broken connection, a gateway error, HTTP 429, an unreadable response), the tool says that the outcome is unknown and how to check it. Every new receipt gets a UUID up front; Checkbox documents that it rejects a receipt whose id already exists, so a retry with that id cannot create a duplicate.

  • No bypass of Checkbox's own checks. close_shift does not expose the option that skips the check that a shift is closed by the program that opened it.

  • Credentials stay local. They are read from environment variables, used only for requests to CHECKBOX_API_URL, and never written to stdout, stderr or tool results. Redirects are not followed, so neither the license key nor a request body can end up on another host. The access token lives in memory and is revoked when the MCP client disconnects (best effort: a killed process cannot do that).

  • Less data to the model. List tools return summaries without customer contacts; the cashier's personal tax number is removed from every result. get_receipt and get_order do return full records, which can contain customer e-mail addresses, phone numbers and delivery addresses.

  • No telemetry, no logging of business data. stderr gets only startup messages (configuration problems and a one-line banner with the mode) and the type of a transport error. Requests and responses are never logged.

Two things the server cannot do for you. First, whatever a tool returns is sent to the AI model you use and to its provider; decide whether that is acceptable for your data. Second, names of goods, comments and other text stored in Checkbox reach the model as-is and could contain instructions written by someone else (prompt injection). That is one more reason to approve every write call yourself.

Trying it with Checkbox test data

This is what Checkbox documents; this project has not been run against it yet.

  • There is no separate sandbox host. According to the wiki, https://api.checkbox.ua is the single address for both testing and fiscal work. What makes a session a test is the cashier and the cash register you sign in with.

  • A test cashier and a test cash register appear in the Checkbox personal cabinet automatically after registration (wiki: test data). Test receipts are not sent to the tax service and are marked as test receipts. Checkbox limits them to 100 per month.

  • For the test cashier the password is the same as the login (wiki: authorization).

  • Checkbox warns never to use a production cashier or cash register for testing: incorrect data sent to the tax service has to be explained and can lead to a fine.

A reasonable first session: configure the server with the test cashier, leave CHECKBOX_ALLOW_WRITE unset, and call get_cashier_profile. It should show is_test: true. Only then consider write mode, with the test credentials.

Limitations

  • Not verified against the live API. Requests are checked against the OpenAPI document, which describes shapes, not behaviour. Response handling, error texts and the asynchronous status flow are implemented from the documentation.

  • One cashier per server instance, and one cash register for the tools that need the license key.

  • Not covered: offline mode operations (going offline/online, offline receipts), creating X-reports, prepayment and post-payment receipts, currency exchange, invoices and acquiring terminals, editing goods, delivery-service waybills (ЕТТН), webhooks, extended reports, receipt templates.

  • search_receipts cannot filter by status or type, because the API has no such parameter; the tool returns both fields for each receipt. By default the API returns only receipts created by the signed-in cashier.

  • Fiscalization is asynchronous. A new receipt or shift comes back in status CREATED; the model has to poll get_receipt or get_current_shift. The server does not wait.

  • In a return receipt, payments are sent as positive amounts. The OpenAPI document does not spell this out; it has to be confirmed on a test cash register.

  • No totals for most lists. The API reports a total only for orders, so the server can only say that there may be a next page.

  • Rate limits are not enforced by the server. Checkbox documents a limit of two new receipts per second per cash register (exceeding it blocks the register for 5 seconds) and blocks repeated views of the same receipt at three requests per second.

  • Tokens. Checkbox documents at most three valid tokens per cashier. The server signs in once per start, signs in again after an HTTP 401 only if its token is older than a minute, and signs out on disconnect; even so, a cashier who is also signed in elsewhere may be affected.

  • Do not mix programs within a shift. Checkbox warns that a shift opened through the API must not be operated from the Checkbox Kasa or Manager apps at the same time.

  • Fixed 30-second timeout per request.

Development

npm install
npm run lint          # tsc --noEmit over src/ and tests/
npm test              # builds dist/ and the tests, then runs them with node:test
npm run spec:update   # refreshes the OpenAPI snapshot from api.checkbox.ua
  • src/endpoints.ts is the catalogue of API operations the server calls. tests/spec.test.ts compares it with spec/checkbox-api.snapshot.json, a reduced copy of the official OpenAPI document (parameters, request schemas and security of those operations only).

  • Every tool test calls the tool through a real MCP client and passes each recorded request through assertMatchesSpec, which checks the path, query parameters, headers and body against that snapshot.

  • tests/e2e.test.ts starts the built server as a child process over stdio against a local HTTP mock.

  • To poke at the server by hand: npx @modelcontextprotocol/inspector node dist/index.js.

The server uses the official TypeScript SDK (@modelcontextprotocol/server) and zod; there are no other runtime dependencies.

Issues and pull requests are welcome. For security reports see SECURITY.md.

Built by

Built and maintained by Myrado Studio — custom MCP servers, AI agents and automation. Need an MCP server for your own system? https://myradostudio.com/en/mcp-server-development/

License

MIT © 2026 Myrado Studio

Available Tools

16 tools
get_cashier_profileWho am I: cashier and organizationA
Read-onlyIdempotent

Returns the cashier this server is signed in as: name, permissions, signature type, whether it is a test cashier (is_test), and the organization (title, EDRPOU, tax number, VAT status, offline and SMS settings). Call this first to learn whose data the other tools will show.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.3/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true, idempotentHint=true, destructiveHint=false, so the safety profile is covered. The description adds real value by disclosing the content of the response (including the is_test flag and organization tax/VAT/offline/SMS settings), which is meaningful since no output schema exists. It omits auth requirements and any caching/rate-limit behavior.

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

Conciseness4/5

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

Front-loaded with the action and subject, followed by a short imperative sentence telling the agent when to call it. The parenthetical field list is dense but earns its place because no output schema documents the return shape.

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

Completeness4/5

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

With no parameters and no output schema, the description carries the full burden of describing the return value and does so across both the cashier and organization objects. It is complete enough to call correctly, though it could note whether organization data is always present.

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

Parameters4/5

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

The tool takes zero parameters, so the schema imposes no semantic burden and the baseline for a no-param tool is 4. The description correctly implies a no-argument call by framing the result as the server's own identity.

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 ('Returns the cashier this server is signed in as') and enumerates the returned payload (name, permissions, signature type, is_test, organization fields). This clearly separates it from siblings like get_cash_register or get_current_shift, which operate on registers and shifts rather than identity.

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?

'Call this first to learn whose data the other tools will show' gives explicit ordering guidance and a clear context in which the tool is useful. It stops short of naming a when-not condition or an alternative, but no plausible alternative exists for an identity endpoint.

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

get_cash_registerGet a cash registerA
Read-onlyIdempotent

Returns one cash register (ПРРО). With cash_register_id: full details including offline_mode (true means the register works offline) and the open shift. Without it: the register that CHECKBOX_LICENSE_KEY belongs to, including its title, address, has_shift, is_test and the numbers of the last documents.

ParametersJSON Schema
NameRequiredDescriptionDefault
cash_register_idNoCash register id (UUID).

TDQS

A4.1/5.0
Behavior4/5

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

Annotations already declare readOnly, idempotent, openWorld and non-destructive, so the safety profile is covered. The description adds real behavioral context beyond that: what fields come back in each mode, the meaning of offline_mode, and that the open shift is included.

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 dense sentences with no filler; the core behavior is front-loaded and the conditional cases are laid out in a compact parallel structure.

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

Completeness4/5

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

With no output schema, the description carries the return-value burden and does enumerate the fields returned in each mode, which is adequate for a single-optional-param read tool. It stops short of describing nesting or error behavior, but nothing essential for invoking 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 100% and the schema documents the UUID pattern, so the baseline is 3. The description goes further by explaining the semantic consequence of supplying versus omitting cash_register_id, which is genuinely more than the schema conveys.

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 ('Returns one cash register (ПРРО)') and immediately differentiates the two operating modes via the presence or absence of cash_register_id. It does not name sibling tools like list_cash_registers, so it is clear but not sibling-differentiating.

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?

Explicitly describes the two calling contexts: with cash_register_id you get full details plus the open shift; without it you get the register bound to CHECKBOX_LICENSE_KEY. It gives clear context but names no alternative tool for listing multiple registers and states no exclusions.

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

get_current_shiftCurrent shift of the cashierA
Read-onlyIdempotent

Returns the active shift (зміна) of the signed-in cashier: status, opening time, cash register, running balance (cash and card sales, returns, service cash in/out) and per-tax totals. Tells you when the cashier has no open shift.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A3.8/5.0
Behavior4/5

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

Annotations already cover the safety profile (readOnlyHint, idempotentHint, destructiveHint=false, openWorldHint), so the bar is lower. The description adds genuinely non-annotated behavior: the exact content of the response and, importantly, the no-open-shift case, which tells the agent how to interpret an empty result.

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 the verb and resource, and every clause carries information. The parenthetical field list is dense but justified because there is no output schema to document the payload.

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

Completeness4/5

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

With no output schema, the description must sketch the return shape, and it does (status, opening time, register, balances, per-tax totals) plus the empty-state behavior. It stops short of explaining field formats or any auth/offline caveats for an openWorld tool, but nothing essential is missing for a parameterless read.

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?

Zero parameters, so the baseline is 4 and there is no schema surface the description needs to compensate for. The description correctly avoids inventing parameter details, though it also adds nothing here.

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 ('Returns the active shift of the signed-in cashier') and enumerates the payload (status, opening time, cash register, running balance, per-tax totals), so the agent knows exactly what comes back. It implicitly distinguishes itself from get_shift/list_shifts by being the no-argument, signed-in-user variant, but never names a sibling explicitly.

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

Usage Guidelines3/5

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

Usage is only implied: the 'signed-in cashier' scoping and the empty-shift note suggest when this tool is appropriate, but there is no explicit when-to-use, when-not-to-use, or pointer to get_shift/list_shifts for other cases. An agent must infer the routing from the absence of parameters.

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

get_offline_statusOffline mode statusA
Read-onlyIdempotent

Reports how the cash register behind CHECKBOX_LICENSE_KEY stands with offline mode: how many offline fiscal codes are available and whether that is enough, plus the offline sessions and total offline time, optionally limited to a period. Checkbox documents a limit of 36 hours offline in a row and 168 hours per month. Durations are passed through as the API returns them.

ParametersJSON Schema
NameRequiredDescriptionDefault
to_dateNoCount offline time up to this moment. ISO 8601 with a UTC offset, e.g. 2026-10-01T00:00:00+03:00 (Kyiv is +02:00 in winter, +03:00 in summer).
from_dateNoCount offline time from this moment. ISO 8601 with a UTC offset, e.g. 2026-10-01T00:00:00+03:00 (Kyiv is +02:00 in winter, +03:00 in summer).

TDQS

A4.2/5.0
Behavior4/5

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

Annotations already declare it read-only, idempotent, and non-destructive. The description adds valuable domain context by citing Checkbox's 36-hour and 168-hour offline limits and clarifying that durations are passed through as returned by the API, helping the agent interpret results. It does not mention rate limits or auth needs, but the annotations carry the safety profile well.

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 compact paragraph that front-loads the core purpose and then adds domain limits and a note on duration formatting. Every sentence contributes, though the final sentence about durations is slightly tangential and could be trimmed.

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?

With annotations covering the safety and idempotency profile and the schema fully documenting parameters, the description completes the picture by stating what is returned (codes, sufficiency, sessions, time) and the relevant business constraints. No output schema is needed, and nothing an agent requires 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.

Parameters3/5

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

Schema coverage is 100%, so both from_date and to_date are fully documented in the schema with format and timezone examples. The description mentions an optional period but adds no additional syntax or format details beyond what the schema provides, making the baseline 3 appropriate.

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

Purpose5/5

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

The description names a specific verb ('Reports') and resource ('offline mode status') and enumerates exactly what is returned: available offline fiscal codes, sufficiency, offline sessions, and total offline time. It is clearly distinguishable from siblings like get_current_shift or get_cash_register, which cover different domains.

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 usage by stating the optional period filter, which tells an agent it can query without dates for a full status or with dates for a bounded window. However, it does not explicitly state when to prefer this over other status tools or when-not to call it, keeping it below a 5.

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

get_orderGet an orderA
Read-onlyIdempotent

Returns one order in full: status, payment, the receipt draft with goods and payments, and the delivery details. The result contains personal data of the customer (name, phone number, address); do not repeat it unless the user asks for it.

ParametersJSON Schema
NameRequiredDescriptionDefault
order_idYesOrder id as returned by list_orders in the field "id" (UUID).
whole_organizationNoSet true to look the order up across the whole organization. Default false.

TDQS

A3.8/5.0
Behavior4/5

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

Annotations already declare readOnlyHint, idempotentHint, openWorldHint and destructiveHint=false, so safety is covered. The description adds genuinely new behavioral context: the result contains customer PII (name, phone, address) and there is an expectation not to echo it unprompted — a data-handling constraint the agent could not 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.

Conciseness5/5

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

Two sentences, zero filler. The return-content summary is front-loaded and the PII caveat follows immediately; every clause carries information.

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

Completeness4/5

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

With no output schema, the description usefully enumerates the returned sections (status, payment, receipt draft, delivery) and flags the PII, which is what an agent most needs to know before calling. It is slightly thin on lookup behavior — e.g. what happens if the order is not found, or how whole_organization affects visibility — but nothing essential is missing 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% and the order_id description already explains the UUID source (list_orders field "id") and whole_organization explains its own semantics. The description adds no parameter-level meaning, so the baseline of 3 applies.

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

Purpose4/5

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

States a specific verb and resource ("Returns one order") and enumerates what the payload contains: status, payment, receipt draft, delivery details. The singular "one order" implicitly distinguishes it from list_orders, but no sibling is named explicitly.

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

Usage Guidelines3/5

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

Usage is only implied: fetching a single order by id is the obvious reading, and the PII instruction ("do not repeat it unless the user asks") gives downstream handling guidance. There is no explicit statement of when to prefer this over search_receipts or get_receipt, nor any prerequisite for the order_id.

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

get_periodical_reportPeriodical report for a date rangeA
Read-onlyIdempotent

Returns the periodical report (періодичний звіт) of the cash register behind CHECKBOX_LICENSE_KEY for a date range, as printable text: totals built from the Z-reports of the period, by tax rate and payment form, returns, cash in the register and each Z-report with its number and date. The API offers this report as text only.

ParametersJSON Schema
NameRequiredDescriptionDefault
shortNoRequest the short form of the report. Default false.
to_dateYesEnd of the period. ISO 8601 with a UTC offset, e.g. 2026-10-01T00:00:00+03:00 (Kyiv is +02:00 in winter, +03:00 in summer).
from_dateYesStart of the period. ISO 8601 with a UTC offset, e.g. 2026-10-01T00:00:00+03:00 (Kyiv is +02:00 in winter, +03:00 in summer).

TDQS

A3.7/5.0
Behavior4/5

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

Annotations already declare readOnlyHint, idempotentHint and destructiveHint=false, so the safety profile is covered. The description adds genuinely useful context beyond them: the output is text-only via the API, and it enumerates what the report contains (totals by tax rate, payment form, returns, cash in register, each Z-report with number and date).

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 dense sentence that front-loads the verb, resource and scoping key, then lists the report contents. No filler or repetition, though the inline enumeration is long enough to be slightly heavy.

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

Completeness4/5

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

With no output schema, the description usefully compensates by describing the returned text's content and noting the API is text-only. Combined with annotations covering the safety profile, an agent has nearly everything needed; only explicit sibling routing 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 description coverage is 100%, and the schema documents from_date, to_date and short with ISO 8601 examples, so baseline 3 applies. The description mentions the date range but adds no format or semantics beyond what the schema already provides, and never addresses the 'short' flag.

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 states a specific verb+resource: 'Returns the periodical report ... of the cash register ... for a date range.' It also enumerates the report's contents (Z-report totals by tax rate and payment form, returns, cash in register). It does not explicitly differentiate itself from siblings like get_report or list_reports, so it stops short of a 5.

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

Usage Guidelines3/5

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

Usage is implied by the date-range framing and the mention of CHECKBOX_LICENSE_KEY, but there is no explicit when-to-use vs when-not, and no routing to get_report or list_reports for other report types. Context is inferable but not stated.

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

get_receiptGet a receiptA
Read-onlyIdempotent

Returns one receipt (чек). format "json": the full record with goods, payments, taxes, discounts, fiscal number, status and the link to the tax service (tax_url). format "text": the receipt exactly as it is printed. A receipt that was created a moment ago can answer "still being created"; retry after a second.

ParametersJSON Schema
NameRequiredDescriptionDefault
formatNo"json" (default) returns the structured object; "text" returns the printable plain-text form.
receipt_idYesReceipt id: the UUID, or the 11-character short id.

TDQS

A3.8/5.0
Behavior4/5

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

Annotations already declare readOnly, idempotent and non-destructive, so the safety profile is covered. The description goes beyond them by disclosing the eventual-consistency behavior ('still being created'; retry after a second) and the concrete contents returned per format, which are not derivable from annotations.

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

Conciseness4/5

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

Front-loads the resource and scope, then the two format outcomes, then the retry caveat. Dense and mostly waste-free, though the parenthetical '(чек)' and the somewhat compressed format sentences slightly reduce readability.

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

Completeness4/5

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

With no output schema, the description correctly carries the burden of explaining return values and does so for both formats, plus the transient 'still being created' state. What it does not cover, such as error shape or whether tax_url may be absent for pending receipts, is minor.

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

Parameters4/5

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

Schema coverage is 100%, so baseline is 3. The description adds genuine meaning to the 'format' enum by enumerating what the json variant contains (goods, payments, taxes, discounts, fiscal number, status, tax_url) versus the literal printed text, beyond the schema's brief 'structured object' / 'printable plain-text form'.

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 ('Returns one receipt') and scopes it to a single record, which implicitly separates it from the sibling search_receipts. It does not name any sibling explicitly, so differentiation is inferable rather than stated.

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

Usage Guidelines3/5

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

Usage is implied (fetch a known receipt by id), and it adds a useful retry instruction for freshly created receipts. However, there is no explicit when-to-use-vs-alternatives guidance, e.g. nothing telling the agent to prefer search_receipts when the id is unknown.

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

get_reportGet an X or Z reportA
Read-onlyIdempotent

Returns one X- or Z-report. format "json": the full record with totals per payment form and per tax rate, receipt counts, rounding and cash balance. format "text": the report exactly as it is printed.

ParametersJSON Schema
NameRequiredDescriptionDefault
formatNo"json" (default) returns the structured object; "text" returns the printable plain-text form.
report_idYesReport id (UUID).

TDQS

A3.6/5.0
Behavior4/5

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

Annotations already declare readOnly/idempotent/non-destructive/openWorld, so the safety profile is covered. The description goes beyond them by disclosing exactly what the json payload contains (totals per payment form and tax rate, receipt counts, rounding, cash balance) and that text mode is the printed form — genuinely useful for a tool with no output schema.

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

Conciseness4/5

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

Two compact sentences, front-loaded with the tool's scope and followed by the format semantics. The internal field enumeration is dense but each item is informative; little wasted text.

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

Completeness4/5

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

With no output schema and full schema coverage, the description supplies the missing return-value context precisely. It omits only edge behavior (e.g., unknown/closed report ids), which is a minor gap for a read-only lookup.

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

Parameters4/5

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

Schema coverage is 100% and the enum descriptions already document the format parameter, so the baseline is 3. The description earns above baseline by spelling out the payload each format returns, giving the agent a reason to choose json vs text beyond the schema's bare wording.

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 ('Returns one X- or Z-report') and is distinguishable from list_reports and get_periodical_report by its singular, id-based retrieval scope. It does not explicitly contrast itself with those siblings, which keeps it short of a 5.

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

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 prefer this over list_reports or get_periodical_report, nor any prerequisite or precondition. Usage is only implied by the required report_id.

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

get_shiftGet a shiftA
Read-onlyIdempotent

Returns one shift (зміна) in full: status, cashier, cash register, balance, per-tax totals, the opening and closing transactions and the embedded Z-report once the shift is closed.

ParametersJSON Schema
NameRequiredDescriptionDefault
shift_idYesShift id (UUID).

TDQS

A3.5/5.0
Behavior4/5

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

Annotations already declare readOnlyHint, idempotentHint and non-destructive, so the safety profile is covered. The description adds real behavioral context beyond them: the payload is complete rather than partial, and the embedded Z-report is only present once the shift is closed, which is a conditional-state detail the annotations cannot convey.

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 front-loaded sentence with no preamble or filler. The long field enumeration is dense but each item is informative about the return shape, so it earns its space; it could have been trimmed slightly for a short description field.

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

Completeness4/5

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

With no output schema, the description carries the burden of describing the return value and does so thoroughly, including the conditional Z-report. What is missing is any guidance on usage relative to sibling shift tools and on the failure case 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 one parameter with 100% schema description coverage (shift_id, UUID with a regex pattern), so the schema fully carries parameter semantics. The description adds nothing about shift_id, its format, or where to obtain it, which is the baseline-3 outcome when the schema does the heavy lifting.

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

Purpose4/5

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

Specific verb (returns) plus resource (one shift) with an enumerated payload: status, cashier, cash register, balance, per-tax totals, opening/closing transactions, Z-report. It is clear what the tool does, but it never distinguishes itself from siblings like get_current_shift or list_shifts, so the by-id retrieval scope is only implied.

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 when-to-use, when-not-to-use, or alternative guidance is given. An agent must infer that this fetches a single shift by id and that get_current_shift or list_shifts cover the other cases; nothing in the text routes it.

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

list_cash_registersList cash registersA
Read-onlyIdempotent

Lists the cash registers (ПРРО) available to the cashier, each with its fiscal number, address, branch, online/offline mode and the currently open shift if there is one. Use the returned ids to filter receipts and reports.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoPage size. Default 25; values above the cap (100 unless stated otherwise) are clamped.
in_useNoFilter by whether the cash register is currently in use.
offsetNoNumber of records to skip, for paging. Default 0.
fiscal_numberNoFiscal number of the cash register.

TDQS

A4.1/5.0
Behavior4/5

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

Annotations already declare readOnly/idempotent/non-destructive, so the safety profile is covered. The description adds real context beyond them: results are scoped to registers 'available to the cashier' (an authorization boundary) and each entry conditionally includes the currently open shift.

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 with zero filler; the resource and returned fields come first and the downstream routing tip is second. Every clause earns its place.

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?

With no output schema, the description carries the return-value burden and does so by naming the fields each register carries, including the conditional open shift. Paging behavior is covered by the schema, so nothing an agent needs 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 description coverage is 100%, so limit, offset, in_use and fiscal_number are already fully documented in the schema. The description mentions none of the filtering parameters, so it adds no meaning beyond the structured fields; baseline 3 applies.

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

Purpose5/5

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

States a specific verb (Lists) and resource (cash registers / ПРРО), and enumerates the returned fields (fiscal number, address, branch, online/offline mode, open shift). An agent can distinguish it from the singular get_cash_register sibling without opening either schema.

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

Usage Guidelines3/5

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

The second sentence gives downstream usage ('use the returned ids to filter receipts and reports'), which implies context, but never states when to prefer this over get_cash_register, get_current_shift, or list_shifts. 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_ordersList ordersA
Read-onlyIdempotent

Lists orders (замовлення): draft receipts that an external system created in Checkbox, to be fiscalized by a courier after delivery and payment. Returns status, payment state and method, and the linked receipt id. Customer delivery details are left out here; get_order returns them.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoPage size. Default 25; values above the cap (100 unless stated otherwise) are clamped.
offsetNoNumber of records to skip, for paging. Default 0.
statusesNoOnly orders in these statuses.
newest_firstNoSort from newest to oldest. Default true.
delivered_to_dateNoOrders delivered before this moment. ISO 8601 with a UTC offset, e.g. 2026-10-01T00:00:00+03:00 (Kyiv is +02:00 in winter, +03:00 in summer).
external_order_idNoOrder id in the delivery service.
whole_organizationNoSet true to list orders of the whole organization. Default false.
delivered_from_dateNoOrders delivered from this moment. ISO 8601 with a UTC offset, e.g. 2026-10-01T00:00:00+03:00 (Kyiv is +02:00 in winter, +03:00 in summer).

TDQS

A4.3/5.0
Behavior4/5

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

Annotations already declare readOnlyHint, idempotentHint, openWorldHint and destructiveHint=false, so safety is covered. The description goes beyond that by explaining the domain lifecycle (external system creates, courier fiscalizes after delivery and payment) and by naming the fields returned (status, payment state and method, linked receipt id) plus what is deliberately excluded. Pagination and default-clamping behavior live only in the schema, not here.

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

Conciseness5/5

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

Two sentences, front-loaded with the core purpose and followed by the return/exclusion note. Every clause carries information: the domain definition, the lifecycle, the returned fields, and the routing hint. The Ukrainian gloss on 'orders' is a minor cost in a bilingual product context, not 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?

With no output schema, the description correctly compensates by enumerating the meaningful return fields and flagging the omitted ones with a pointer to get_order. All 8 optional parameters are fully documented in the schema, and the read-only annotation set covers the safety profile, so an agent has everything needed to call this correctly.

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

Parameters3/5

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

Schema description coverage is 100% across all 8 parameters, including formats, defaults and the ISO-8601 offset guidance, so the schema does the heavy lifting. The description adds no parameter-level meaning beyond what is already documented, which is the expected baseline when coverage is complete.

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 (Lists) plus the resource (orders) and then defines what an order actually is in this domain: a draft receipt created by an external system, pending fiscalization after delivery and payment. That definition alone separates it from receipt- and shift-oriented siblings, and it explicitly names get_order as the tool holding the omitted customer details.

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 clear context for when this is the right call (browsing draft/fiscalization-pending orders) and points to get_order for customer delivery details, which is a real alternative-selection signal. It stops short of stating exclusions such as whether fiscalized orders are included or when to prefer search_receipts instead.

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

list_reportsList X and Z reportsA
Read-onlyIdempotent

Lists X-reports (interim, non-fiscal) and Z-reports (end of shift) with receipt counts, cash balance and totals per payment form. Filter by period, shift, cash register, serial number or report type. Use get_report for tax breakdowns or the printable text.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoPage size. Default 25; values above the cap (100 unless stated otherwise) are clamped.
offsetNoNumber of records to skip, for paging. Default 0.
serialNoSerial number of the report.
to_dateNoReports before this moment. ISO 8601 with a UTC offset, e.g. 2026-10-01T00:00:00+03:00 (Kyiv is +02:00 in winter, +03:00 in summer).
from_dateNoReports from this moment. ISO 8601 with a UTC offset, e.g. 2026-10-01T00:00:00+03:00 (Kyiv is +02:00 in winter, +03:00 in summer).
shift_idsNoOnly reports of these shifts (UUIDs).
report_typeNoOnly X-reports or only Z-reports. Default: both.
newest_firstNoSort from newest to oldest. Default true.
cash_register_idsNoOnly reports of these cash registers (UUIDs).

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, open-world, so the safety profile is covered. The description contributes extra substance by describing the report contents returned. It does not mention pagination behavior or default caps, but with annotations this is above the required bar.

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 sentences, each earning its place: what is listed, how to filter, and where to go for alternatives. The core purpose is front-loaded before the routing hint.

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 filtered list with a rich 9-parameter schema and no output schema, the description supplies identity, content of results, filter axes and sibling routing. Only the return shape and paging behavior are left implicit, which the schema partly covers.

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 every parameter is already documented with patterns, defaults and constraints. The description's mention of the filterable dimensions (period, shift, cash register, serial, report type) mirrors the schema without adding format or semantics beyond it, making the baseline 3 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?

States a specific verb (Lists) and resource (X-reports and Z-reports), and goes further by defining each type ('interim, non-fiscal' vs 'end of shift') and the payload returned (receipt counts, cash balance, totals per payment form). An agent can tell it apart from get_report and the shift/receipt siblings without opening a schema.

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

Usage Guidelines4/5

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

Explicitly routes to get_report for tax breakdowns or printable text, which is a clean alternative-selection rule. It also lists the filter dimensions, giving context for when this tool applies. It stops short of stating when NOT to use it (e.g. single-report retrieval), so a 4 rather than a 5.

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

list_shiftsList shiftsA
Read-onlyIdempotent

Lists shifts (зміни) with status, open and close times, balance and the Z-report reference. scope "cashier" (default) lists shifts of the signed-in cashier; scope "cash_register" lists shifts of the cash register behind CHECKBOX_LICENSE_KEY, whoever opened them (page size capped at 50). Use get_shift for the full record.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoPage size. Default 25; values above the cap (100 unless stated otherwise) are clamped.
scopeNoWhose shifts to list. Default "cashier".
offsetNoNumber of records to skip, for paging. Default 0.
to_dateNoOnly shifts up to this moment. ISO 8601 with a UTC offset, e.g. 2026-10-01T00:00:00+03:00 (Kyiv is +02:00 in winter, +03:00 in summer).
statusesNoOnly shifts in these statuses.
from_dateNoOnly shifts from this moment. ISO 8601 with a UTC offset, e.g. 2026-10-01T00:00:00+03:00 (Kyiv is +02:00 in winter, +03:00 in summer).
newest_firstNoSort from newest to oldest. Default true.

TDQS

A4.3/5.0
Behavior4/5

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

Annotations already cover the safety profile (readOnlyHint, idempotentHint, destructiveHint=false, openWorldHint), so the bar is lower, yet the description adds two real behavioral facts: the page-size cap of 50 for this endpoint and the CHECKBOX_LICENSE_KEY requirement for cash_register scope. It does not describe ordering guarantees or result-shape nuances, but those are minor here.

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?

Dense but front-loaded: the resource and returned fields come first, then scope semantics, then the alternative-tool pointer. Every sentence carries information, though the parenthetical license key and cap clauses make it slightly heavy for a list tool.

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

Completeness4/5

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

With no output schema, the description carries the burden of describing what is returned and does list the key fields (status, times, balance, Z-report reference). Paging and filtering are fully covered by the schema, so the remaining gap is only the absence of sorting/response-shape detail, which is not material for a 7-param list tool.

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

Parameters4/5

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

Schema coverage is 100%, so baseline is 3; the description still adds meaning by explaining the semantics of the scope enum (whose shifts are returned, license gating) and by overriding the generic page-size cap with an endpoint-specific 50. It adds nothing for limit/offset/from_date/to_date/statuses beyond what the schema already documents.

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 gives a specific verb and resource ("Lists shifts") and enumerates the returned fields (status, open/close times, balance, Z-report reference). It explicitly distinguishes itself from the sibling get_shift ("Use get_shift for the full record"), so an agent can route between them without opening schemas.

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

Usage Guidelines4/5

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

It states the default scope behavior and the condition for the alternative ("scope 'cash_register' lists shifts of the cash register behind CHECKBOX_LICENSE_KEY, whoever opened them"), and names get_shift as the fuller alternative. It stops short of stating when a shift listing is inappropriate (e.g., for a single known shift), leaving one inference to the agent.

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

list_taxesList tax ratesA
Read-onlyIdempotent

Lists the tax rates configured for the organization: numeric code, letter symbol, label, rate and extra rate in percent, and whether the tax is included in the price. The numeric code is what a receipt line refers to in its tax list.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.2/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true, idempotentHint=true and destructiveHint=false, so the safety profile is covered structurally. The description adds real value beyond that by disclosing the shape of the returned records and the cross-entity meaning of the numeric code (what a receipt line's tax list points at), which no annotation conveys. It stops short of noting ordering, pagination, or empty-result behavior, so it is not a 5.

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

Conciseness5/5

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

Two sentences, front-loaded with the action and resource, then the returned field set. Every clause carries information the agent cannot get from the empty schema or the annotations, and the receipt-line note is a compact cross-reference rather than 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?

With no parameters, no output schema, and read-only annotations, the description carries the burden of describing the return payload and does so field by field. It could be slightly more complete by indicating whether the list is exhaustive or how it is ordered, but nothing essential to invoking the tool 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?

The tool takes no parameters, so the baseline is 4 and there is nothing in the schema for the description to compensate for. The fields it lists are output attributes rather than inputs, which is the right thing to document here.

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 ("Lists the tax rates configured for the organization") and enumerates the exact fields returned, including the numeric code, symbol, label, rate, extra rate, and price-inclusion flag. No sibling in the provided set (receipts, orders, registers, shifts, reports) overlaps with tax-rate configuration, so an agent can route to it unambiguously.

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 agent can infer this is the lookup for tax-rate definitions, reinforced by the note that receipt lines refer to the numeric code. There is no explicit when-to-use statement, no prerequisite mention, and with zero parameters there are no filtering alternatives to distinguish from.

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

search_goodsSearch the goods catalogueA
Read-onlyIdempotent

Searches the goods catalogue (номенклатура) kept in Checkbox. Returns code, name, price in kopecks, barcode, UKTZED code, group, tax rates and stock count where the organization tracks it. The catalogue can be empty when the organization does not keep its goods in Checkbox.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoPage size. Default 25; values above the cap (100 unless stated otherwise) are clamped.
queryNoSearch text.
offsetNoNumber of records to skip, for paging. Default 0.
group_idNoOnly goods of this group (UUID).

TDQS

A3.7/5.0
Behavior4/5

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

Annotations already declare readOnly, idempotent, openWorld and non-destructive, so the safety profile is covered. The description adds real value beyond that: the exact return fields (code, name, price in kopecks, barcode, UKTZED, group, tax rates, stock count) including a unit convention, plus the caveat that the catalogue may be empty for organizations that don't track goods in Checkbox.

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 sentences, front-loaded with purpose, then returns, then the empty-catalogue caveat; nothing is redundant. The return-field enumeration is long but earns its place since there is no output schema.

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

Completeness4/5

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

With no output schema, the description carries the return-shape burden and does so, and it flags the empty-result scenario. Remaining gaps are minor: no mention of search-match semantics, total-count/paging behavior, or that limit/offset come from the schema.

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

Parameters3/5

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

Schema description coverage is 100%, with limit/offset clamping, default values and the group_id UUID pattern all documented in the schema itself. The description adds no syntax or behavioral detail about query matching (substring, prefix, fuzzy) or how group_id interacts with query, so the 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?

States a specific verb (searches) and resource (the goods catalogue / номенклатура in Checkbox), and no sibling tool touches goods, so the agent can route here unambiguously versus receipts, orders, shifts, or reports. The parenthetical local term also disambiguates the domain vocabulary.

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 never says when to reach for this tool over alternatives, nor how the parameters select behavior (full scan vs query vs group_id filtering). The only conditional statement is about the catalogue being empty, which is a data caveat rather than usage guidance.

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

search_receiptsSearch receiptsA
Read-onlyIdempotent

Finds receipts (чеки) by period, fiscal number, barcode, shift, cash register or branch. Returns a summary per receipt: type (SELL, RETURN, SERVICE_IN, SERVICE_OUT, ...), status (DONE means fiscalized), fiscal number, totals, goods and payments. The API has no filter by status or type, so filter the returned rows yourself. By default only receipts created by the signed-in cashier are returned. Use get_receipt for the full record.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoPage size. Default 25; values above the cap (100 unless stated otherwise) are clamped.
offsetNoNumber of records to skip, for paging. Default 0.
barcodeNoBarcode of the receipt.
to_dateNoReceipts before this moment. ISO 8601 with a UTC offset, e.g. 2026-10-01T00:00:00+03:00 (Kyiv is +02:00 in winter, +03:00 in summer).
from_dateNoReceipts from this moment. ISO 8601 with a UTC offset, e.g. 2026-10-01T00:00:00+03:00 (Kyiv is +02:00 in winter, +03:00 in summer).
shift_idsNoOnly receipts of these shifts (UUIDs).
branch_idsNoOnly receipts of these branches (UUIDs).
fiscal_codeNoFiscal number of the receipt.
all_cashiersNoSet true to ask for receipts of every cashier instead of only the signed-in one. Whether that is allowed depends on the cashier permissions in Checkbox.
newest_firstNoSort from newest to oldest. Default true.
cash_register_idsNoOnly receipts of these cash registers (UUIDs).

TDQS

A4.5/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, openWorld), and the description adds two genuinely useful behavioral facts: results are scoped to the signed-in cashier by default, and the API cannot filter by status or type. The stated return fields are helpful too, though the default-scope detail partially overlaps the all_cashiers schema description.

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?

Front-loaded with purpose and filter dimensions, then return shape, then the API limitation, then the sibling routing hint. Every sentence carries distinct information with no filler.

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

Completeness5/5

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

For an 11-parameter read tool with no output schema, the description compensates well by summarizing the returned row fields and flagging the client-side filtering requirement and default cashier scoping. Nothing essential to correct invocation is missing.

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

Parameters3/5

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

Schema description coverage is 100% and all 11 parameters are documented there, including defaults, caps, ISO 8601 format and UUID patterns. The description restates the filter dimensions but adds no syntax or format detail beyond the schema, so the baseline of 3 applies.

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

Purpose5/5

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

States a specific verb (Finds) and resource (receipts) and enumerates the exact filter dimensions available: period, fiscal number, barcode, shift, cash register, branch. This makes it immediately distinguishable from siblings like get_receipt or search_goods.

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?

Names the alternative tool and the condition that selects it: 'Use get_receipt for the full record.' It also warns that status/type filtering must be done client-side, which tells the agent this is a broad list-and-filter tool rather than a targeted lookup.

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. 16 tool updatesv0.1.0
    • First observedget_cash_register
    • First observedget_cashier_profile
    • First observedget_current_shift
    • First observedget_offline_status
    • First observedget_order
    • First observedget_periodical_report
    • First observedget_receipt
    • First observedget_report
    • First observedget_shift
    • First observedlist_cash_registers
    • First observedlist_orders
    • First observedlist_reports
    • First observedlist_shifts
    • First observedlist_taxes
    • First observedsearch_goods
    • First observedsearch_receipts

TDQS

A3.9/5.0

Scored across 16 tools

Disambiguation5/5

Each tool targets a distinct resource and action: cash registers, cashier profile, taxes, offline status, shifts, receipts, reports, goods, and orders. The only apparent overlap (get_current_shift vs list_shifts/get_shift) is resolved by descriptions that specify active shift, list, and full record respectively.

Naming Consistency5/5

All 16 tools use consistent snake_case with clear verb_noun patterns (get_, list_, search_). No mixed conventions or vague names are present.

Tool Count4/5

16 tools is slightly above the typical 3–15 range, but the surface is well organized by resource and each tool appears to serve a distinct query need. There is no obvious redundancy, though the count is on the heavier side.

Completeness2/5

The tool surface is entirely read-only: no create, update, delete, open/close shift, create/fiscalize receipt, or manage goods/orders operations. For a Checkbox fiscalization server, these are significant gaps that would block common agent workflows.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    D
    maintenance
    Enables AI assistants to interact with SmartKasa Ukrainian POS system through natural language, managing shops, products, inventory, sales receipts, employees, and fiscal reports with full API coverage.
    1
    MIT
  • A
    license
    A
    quality
    A
    maintenance
    Provides AI assistants with direct access to the Moysklad (МойСклад) JSON API for reading inventory, products, orders, and reports, and creating/posted documents with safety controls.
    36
    51 PyPI
    2
    MIT
  • F
    license
    Not graded
    quality
    C
    maintenance
    Enables AI assistants to query a retail and food-service point-of-sale database through predefined business tools for sales summaries, top products, margins, stagnant inventory, cash reconciliation, and optional stock adjustments, returning formatted markdown answers.
    -
  • A
    license
    B
    quality
    A
    maintenance
    Enables AI assistants to query and manage self-hosted accounting data—invoices, balances, and books—through natural language, with read-only tools by default and optional scoped write operations.
    30
    77 PyPI
    AGPL 3.0