Skip to main content
Glama
encorp-io

nulabg-mcp

by encorp-io

nulabg-mcp

CI npm Node.js License: MIT

MCP сървър за счетоводната платформа nula.bg. Дава на Claude и на други AI асистенти (Claude Desktop, Claude Code, Cursor, VS Code…) достъп до вашите фактури, покупки, OCR, клиенти, склад и банки чрез nula.bg API ключ.

Неофициален клиент. Проектът не е свързан с nula.bg. Работи върху публичното им REST API.

🇬🇧 In English: an MCP server for nula.bg, a Bulgarian cloud accounting platform — invoices, bills with OCR, customers, inventory, bank feeds and derived reports, over an API key. Read-only by default. Install the .mcpb bundle in Claude Desktop, or run npx -y nulabg-mcp with NULA_API_KEY set. The rest of this README is in Bulgarian, because the platform, its documents and its users are; the tool descriptions the model sees are in English. Issues and pull requests in either language are welcome.

Какво може

Модул (toolset)

Tools

Какво прави

core

nula_lookup_company

Справка за фирма по ЕИК или ДДС номер (Търговски регистър / VIES)

invoices

nula_search_invoices, nula_create_invoice, nula_update_invoice, nula_update_invoice_metadata, nula_get_invoice_pdf, nula_email_invoice, nula_delete_last_invoice

Търсене, издаване (с preview), редакция, платена/изпратена, категории, прикачени файлове, PDF, изпращане по имейл, изтриване на последната фактура

bills

nula_search_bills, nula_create_bill, nula_update_bill_categories

Покупки, вкл. протоколи по чл.117 ЗДДС

ocr

nula_ocr_upload, nula_ocr_status

Качване на до 10 документа от диска, изчакване на разпознаването, квота

customers

nula_search_customers

Клиенти и контрагенти

inventory

nula_search_items, nula_list_item_categories

Артикули, цени, сметки, наличности

banking

nula_list_bank_accounts, nula_list_bank_transactions

Банкови сметки и движения

insights

nula_receivables_report, nula_period_summary, nula_match_bank_transactions

Вземания с aging, обобщение за месец, предложения за равнение банка ↔ фактура

nra (изкл.)

nula_nra_declarations, nula_nra_refresh_result

Статус на декларациите към НАП (без подаване)

noi (изкл.)

nula_noi_documents, nula_noi_get_document

Документи към НОИ (Прил. 9/10/11)

21 tools при разрешени промени, 13 в режим само за четене (по подразбиране), 25 с включени nra и noi. При няколко фирми се появява и nula_list_companies.

Освен това има:

  • Prompts: issue-invoice, process-receipts, month-end-review, collect-overdue.

  • Resources: основанията за 0% ДДС, основанията за протоколи, всички стойности на enum-ите и PDF на фактура.

Примерни заявки:

  • „Издай фактура на ЕИК 123456789 за 10 часа консултации по 60 € без ДДС, платима по банка до 15 дни.“

  • „Качи всички PDF-и от ~/Documents/Фактури/Септември като покупки и ми покажи какво е разпознато.“

  • „Кои клиенти ми дължат пари от над 30 дни?“

  • „Сравни входящите плащания по банковата сметка за септември с неплатените фактури.“

Related MCP server: fiken-mcp

Инсталация

Нужен е API ключ от nula.bg, генериран от вашия акаунт в nula.bg. Ключът дава достъп до данните на фирмата, затова го пазете като парола.

🔒 По подразбиране сървърът е само за четене. Claude може да търси и чете, но не може да създава, редактира, изпраща или трие нищо в nula.bg. Така тестването и оценката са безопасни. За да разрешите промени, задайте NULA_READ_ONLY=false (в Claude Desktop: махнете отметката „Само четене“ в настройките на разширението).

Claude Desktop (препоръчително)

  1. Свалете nulabg-mcp-<версия>.mcpb от Releases.

  2. Отворете файла с двоен клик (или Settings → Extensions → Install Extension).

  3. Въведете API ключа. Той се пази в keychain-а на системата. „Само четене“ е включено по подразбиране.

Node.js не е нужен, защото Claude Desktop го съдържа.

Claude Code

claude mcp add nulabg --scope user --env NULA_API_KEY=<вашият-ключ> -- npx -y nulabg-mcp

С право на промени (след като сте тествали):

claude mcp add nulabg --scope user --env NULA_API_KEY=<вашият-ключ> --env NULA_READ_ONLY=false -- npx -y nulabg-mcp

Cursor / Windsurf / Claude Desktop (ръчно)

~/.cursor/mcp.json или claude_desktop_config.json:

{
  "mcpServers": {
    "nulabg": {
      "command": "npx",
      "args": ["-y", "nulabg-mcp"],
      "env": { "NULA_API_KEY": "<вашият-ключ>" }
    }
  }
}

VS Code

.vscode/mcp.json. Ключът се иска при стартиране и не се записва във файла:

{
  "inputs": [{ "type": "promptString", "id": "nula-key", "description": "nula.bg API key", "password": true }],
  "servers": {
    "nulabg": {
      "command": "npx",
      "args": ["-y", "nulabg-mcp"],
      "env": { "NULA_API_KEY": "${input:nula-key}" }
    }
  }
}

Проверка на ключа от терминала:

NULA_API_KEY=<вашият-ключ> npx -y nulabg-mcp --check

Настройки

Променлива

По подразбиране

Описание

NULA_API_KEY

—

API ключ (задължителен, освен ако не ползвате NULA_PROFILES)

NULA_READ_ONLY

true

Само четене. Промени в nula.bg се разрешават само с изрично false (0, no, off). Всяка друга стойност, вкл. грешно изписана, оставя режима само за четене

NULA_TOOLSETS

core,invoices,bills,ocr,customers,inventory,banking,insights

Кои модули да са активни; all включва и nra, noi

NULA_CONFIRM_WRITES

elicit

Потвърждение в клиента преди създаване, изпращане и изтриване (ако клиентът поддържа elicitation); never го изключва

NULA_DEFAULT_CURRENCY

EUR

Валута за нови документи

NULA_DEFAULT_LANGUAGE

bg

Език на PDF и имейл (bg / en)

NULA_DEFAULT_INVOICE_CATEGORY

—

Категория за нови фактури (nula.bg изисква поне една)

NULA_DOWNLOAD_DIR

~/Downloads/nula

Къде се записват PDF и XML

NULA_FILE_ROOTS

~

Папки, от които може да се качват файлове (разделени с :, на Windows с ;)

NULA_PROFILES

—

Няколко фирми: {"firma-a":"ключ1","firma-b":"ключ2"} или път до JSON файл

NULA_DEFAULT_PROFILE

default или първият

Фирма по подразбиране при NULA_PROFILES

NULA_BILL_CALLBACK_URL

https://nula.bg/

Адрес, който nula.bg уведомява след създаване на покупка (вижте „Ограничения“)

NULA_BASE_URL

https://nula.bg

NULA_TIMEOUT_MS / NULA_MAX_CONCURRENCY / NULA_LOG_LEVEL

30000 / 4 / info

Няколко фирми (за счетоводители)

NULA_PROFILES='{"alfa":"ключ-1","beta":"ключ-2"}' NULA_DEFAULT_PROFILE=alfa npx -y nulabg-mcp

Всеки tool получава параметър company, а nula_list_companies показва наличните фирми без ключовете.

Безопасност

  • Преглед преди създаване. nula_create_invoice и nula_create_bill имат preview_only. Асистентът е инструктиран първо да покаже номер, редове и суми и да изчака потвърждение.

  • Потвърждение в клиента. Създаването, редакцията, изпращането по имейл и изтриването искат изрично „да“ чрез MCP elicitation, когато клиентът го поддържа. Tools, които изпращат или трият, са маркирани като destructive, така че клиентите искат одобрение.

  • Изтриване. nula.bg трие само последната фактура. Tool-ът изисква номера ѝ (expected_number), отказва, ако последната е друга, и отказва предварително, ако фактурата е осчетоводена (виж „Ограничения“).

  • Без повторни опити при запис. Заявки, които създават, променят, изпращат или трият, никога не се повтарят автоматично. При timeout отговорът казва „статусът е неизвестен, проверете преди нов опит“.

  • Файлове. Четат се само PDF, JPG и PNG (по съдържание, не по разширение), само от NULA_FILE_ROOTS, без скрити папки, до 10 MB. URL-и се приемат само https, без локални и вътрешни адреси.

  • Ключът. Не се логва и не се връща в отговори. Логовете отиват в stderr.

  • Само четене по подразбиране. Докато не зададете изрично NULA_READ_ONLY=false, tools, които създават, променят, изпращат или трият, изобщо не се регистрират, така че Claude не може да ги извика. При грешно изписана стойност сървърът остава само за четене.

  • Без подаване към НАП и НОИ. Подаването на декларации изисква КЕП и не е достъпно през този сървър.

Ограничения (v0.1)

  • Проверено срещу реален акаунт на 26.09.2026. Всички 13 read tools и операциите със запис (издаване, редакция, платена/изпратена, PDF, имейл) работят с истински данни. Форматите на отговорите са документирани в docs/research/nula-api-analysis.md §8–§9. Единственото, което не минава, е изтриването — виж по-долу. OCR, НАП и НОИ не са тествани, защото ключът няма достъп до тях.

  • OCR, НАП и НОИ изискват ключ с достъп до фирмата. С ключ, създаден в профила, тези endpoint-и връщат 403 „This token is not scoped to a team you can access“. Останалите модули работят.

  • Артикули: търсенето по SKU минава през обхождане на каталога, защото /open-cart/products/{sku} и getItemDetails връщат 404 дори за съществуващи артикули, а филтърът search не търси по SKU.

  • Покупка по id: /ocr/bill/{id} работи само за документи, минали през OCR; за останалите сървърът намира покупката в списъка.

  • „Изпратена“ фактура: nula.bg не връща такъв статус, затова nula_update_invoice_metadata иска и двата флага (is_paid и is_sent) или номера на фактурата.

  • Изтриването на фактура често е невъзможно през API-то. DELETE /api/v1/deleteInvoice се вика без параметри и трие последната издадена фактура, но връща HTTP 403 (с празно съобщение) за осчетоводен документ. Във фирма със счетоводен модул всички фактури излизат с has_accounting: true, тоест изтриването не минава и документът се маха ръчно от уеб приложението или с кредитно известие. Tool-ът проверява това предварително, вместо да праща обречена заявка.

  • Callback URL при покупки. createBill изисква callback_url. По подразбиране се подава адресът на самия nula.bg, така че данни не излизат към трети страни. Ако имате собствен webhook, задайте NULA_BILL_CALLBACK_URL.

  • Липсващи API операции. nula.bg API няма създаване или редакция на контрагент (клиентът се създава автоматично с първата фактура), GET на фактура по id, справки по ДДС и плащания.

Разработка

npm install
npm run build        # TypeScript → dist/
npm test             # unit + протоколни тестове (Vitest, фалшив nula.bg API)
npm run lint         # Biome
npm run inspect      # MCP Inspector срещу dist/cli.js
npm run pack:mcpb    # Claude Desktop bundle → nulabg-mcp-<версия>.mcpb
node dist/cli.js --list-tools

Стек:

  • TypeScript;

  • @modelcontextprotocol/server 2.x (MCP spec 2026-07-28, съвместим и с клиенти от 2025 г.);

  • zod 4;

  • Node.js ≥ 20.

Архитектура и решения: docs/SPEC.md. Проучване: docs/research/.

Release: стъпките и предварителните проверки са в docs/RELEASING.md. Накратко: вдигате версията в package.json, обновявате CHANGELOG.md и пускате tag vX.Y.Z; GitHub Actions публикува в npm с provenance, прикачва .mcpb към GitHub Release и обновява MCP Registry.

Принос

Issues и pull requests са добре дошли — на български или на английски. Най-полезни са докладите за несъответствия с истинското API (имена и типове на полета, без реални данни), защото официалната документация описва почти само заявките.

Лиценз

MIT © Encorp

Available Tools

13 tools
nula_get_invoice_pdfDownload invoice PDFA
Read-only

Download the PDF of an invoice in Bulgarian or English and save it locally (or return it inline).

ParametersJSON Schema
NameRequiredDescriptionDefault
numberNoInvoice number, used for the file name
deliveryNo"file" (default) saves to the download folder and returns the path; "embed" returns the file inline
languageNoDocument language (default from configuration)
invoice_idYesnula.bg internal id of the invoice

TDQS

A4.2/5.0
Behavior4/5

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

The annotations already declare readOnlyHint=true, and the description adds meaningful behavioral context beyond that: the PDF can be saved locally or returned inline, and language selection affects the document. This clarifies the local side effect while remaining consistent with the read-only hint.

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

Conciseness5/5

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

The description is a single concise sentence that front-loads the action and resource, then adds the two most important behavioral options. Every clause earns its place without redundant filler or schema repetition.

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

Completeness4/5

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

For a single-resource download operation with four well-documented parameters, the description covers the core behavior and output modes sufficiently. Since there is no output schema, a brief note on return values is present via 'save it locally (or return it inline)', which is adequate; error handling or prerequisites are not essential here.

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

Parameters3/5

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

Schema description coverage is 100%, so the parameters are already fully documented in the input schema. The description's mention of Bulgarian/English and inline vs. local save restates what the 'language' and 'delivery' parameter descriptions already provide, adding no new semantic detail.

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

Purpose5/5

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

The description uses a specific verb ('Download') and resource ('PDF of an invoice'), and adds scope with Bulgarian/English language support and two output modes (save locally or return inline). This clearly differentiates it from sibling tools like nula_search_invoices and nula_lookup_company, which operate on search/lookup rather than file retrieval.

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 makes the tool's purpose immediately clear: retrieve an invoice PDF. It does not explicitly state exclusions or alternatives, but none are needed because no sibling tool offers PDF retrieval; the closest siblings are for searching or listing invoices, so the usage context is unambiguous.

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

nula_list_bank_accountsList bank accountsA
Read-only

List the bank accounts (банкови сметки) connected in nula.bg, with their ids for nula_list_bank_transactions.

ParametersJSON Schema
NameRequiredDescriptionDefault
all_companiesNoInclude accounts of all the user's companies, not only this one

TDQS

A4.2/5.0
Behavior3/5

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

Annotations already provide readOnlyHint=true and openWorldHint=false, covering the read-only safety profile. The description adds that the tool returns account IDs, which is useful behavior context, but it does not disclose pagination, ordering, or the effect of all_companies. Given the annotation coverage, this is adequate but not rich.

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

Conciseness5/5

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

A single sentence that front-loads the action, names the resource, and states the purpose with zero filler. Every word earns its place.

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

Completeness4/5

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

For a simple read-only list tool with one optional parameter and no output schema, the description covers the purpose, scope, and downstream use. It does not explicitly mention that accounts are scoped to the current company context, but the all_companies parameter hints at that, so it is sufficiently complete.

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

Parameters3/5

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

Schema description coverage is 100%, so the all_companies parameter is fully documented in the input schema. The description does not add anything about this parameter, but the schema carries the meaning. Baseline 3 is appropriate.

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

Purpose5/5

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

The description states a specific verb ('List') and resource ('bank accounts connected in nula.bg') and further clarifies the output's purpose ('with their ids for nula_list_bank_transactions'). This clearly distinguishes it from sibling tools that handle invoices, bills, or other resources.

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

Usage Guidelines5/5

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

The description explicitly links this tool to nula_list_bank_transactions by stating the IDs are intended for that downstream tool. This gives the agent a concrete trigger: invoke this tool when bank account IDs are needed for listing transactions. It effectively names the alternative and the condition for use.

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

nula_list_bank_transactionsList bank transactionsA
Read-only

List bank transactions (банкови движения) of one account for a period. Get account ids from nula_list_bank_accounts.

ParametersJSON Schema
NameRequiredDescriptionDefault
pageNoPage number, starting at 1
limitNoMax records to return from the page (default 25)
date_toNo
date_fromNo
bank_account_idYesnula.bg internal id of the bank account

TDQS

A3.7/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true and openWorldHint=false, so the safe, non-destructive nature is covered. The description adds useful context that the operation is scoped to one account and can be time-bounded. It does not discuss pagination behavior or how omitted date filters are handled, but those are partially visible in the schema.

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

Conciseness5/5

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

Two short sentences, front-loaded with the core action and scope, no filler. The cross-reference to nula_list_bank_accounts is directly useful and earns its place.

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

Completeness3/5

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

The tool is read-only and simple, and the key prerequisite for the required parameter is provided. However, the lack of an output schema means the description could have mentioned the return shape, and the phrasing 'for a period' may mislead an agent into thinking date filters are mandatory when the schema marks them optional.

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

Parameters3/5

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

The schema already describes page, limit, and bank_account_id, and provides date format patterns. The description adds meaning to bank_account_id by identifying it as an internal id obtainable from nula_list_bank_accounts, and 'for a period' maps loosely to date_from/date_to. It does not clarify that the date parameters are optional, leaving some semantic ambiguity.

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?

Clearly states the operation ('List bank transactions'), scopes it to a single account and a period, and distinguishes it from nula_list_bank_accounts (accounts vs transactions) and nula_match_bank_transactions (list vs match). The Bulgarian gloss reinforces meaning without adding noise.

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

Usage Guidelines3/5

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

The description gives a valuable prerequisite: get account ids from nula_list_bank_accounts. However, it does not explicitly state when to prefer this tool over alternatives like nula_match_bank_transactions, nor does it describe scenarios where this tool should not be used. The usage context is implied rather than directly stated.

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

nula_list_item_categoriesList item categoriesA
Read-only

List item categories (категории на артикули) that have at least one item.

ParametersJSON Schema
NameRequiredDescriptionDefault
pageNoPage number, starting at 1
per_pageNo

TDQS

A3.8/5.0
Behavior4/5

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

The readOnlyHint annotation already signals a safe read operation, and the description adds a meaningful behavioral detail: empty categories are excluded. This goes beyond the structured annotations and helps set expectations about the result set.

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

Conciseness5/5

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

The description is a single, focused sentence that front-loads the core purpose and adds the key filtering condition without extra wording. Including the Bulgarian equivalent is a minor addition but does not hurt clarity.

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

Completeness4/5

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

For a simple read-only listing tool with optional pagination and no output schema, the description captures the essential selection and inclusion behavior. It could mention pagination defaults or result format, but those are less critical given the schema constraints and annotations.

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

Parameters3/5

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

The description does not explain the pagination parameters, and the schema only documents 'page', not 'per_page'. However, both parameter names are reasonably self-explanatory and the constraints (min, max) provide additional guidance, so the gap is moderate rather than severe.

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

Purpose4/5

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

The description clearly states the action ('List') and resource ('item categories'), and adds a meaningful constraint: only categories with at least one item are returned. It is unambiguous, though it does not explicitly distinguish itself from sibling tools.

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 inclusion criterion 'that have at least one item' implies when this tool is useful, but there is no explicit guidance on when to prefer it over alternatives like nula_search_items or nula_lookup_company. The usage context is inferable rather than directly stated.

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

nula_lookup_companyLook up a company (ЕИК / VAT)A
Read-only

Look up a company (фирма) by Bulgarian EIK (ЕИК/БУЛСТАТ), EU VAT number or name via nula.bg (Commercial Register / VIES). Use it BEFORE creating an invoice or bill for a counterparty you have not seen, to get the exact legal name and VAT number. Never invent an EIK.

ParametersJSON Schema
NameRequiredDescriptionDefault
eikNoBulgarian EIK/BULSTAT (ЕИК)
nameNoCompany name (partial names may work for Bulgarian companies)
vat_numberNoVAT number with country prefix, e.g. BG123456789 or DE123456789

TDQS

A3.9/5.0
Behavior3/5

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

With readOnlyHint=true already declared, the description doesn't need to restate safety. It adds useful context: the lookup happens via external sources ('Commercial Register / VIES') and warns 'Never invent an EIK', which is a behavioral constraint. However, it omits details like potential multiple results for name searches or error behavior, which would be relevant for an agent. The description is adequate but not rich.

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

Conciseness5/5

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

The description is two sentences, each earning its place: the first states the core capability, the second adds critical usage guidance. It is front-loaded with the verb and resource, and no filler or redundancy exists. The warning 'Never invent an EIK' is a valuable addition in the same sentence.

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

Completeness3/5

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

The tool has no output schema, so the description should clarify what is returned. It states 'get the exact legal name and VAT number', but doesn't specify the response structure or whether name searches may return multiple matches. The tool is simple with all optional parameters, but the lack of return-type information leaves the agent guessing about the result shape. While not severely incomplete, it's a noticeable gap.

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

Parameters3/5

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

The schema already provides full descriptions for all three parameters (coverage 100%), including patterns and examples. The description only says you can look up by EIK, VAT, or name, which mirrors the schema without adding new semantics. Since the schema already carries the burden, a baseline score of 3 is appropriate.

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

Purpose5/5

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

The description states a specific verb ('Look up') and the resource ('a company by Bulgarian EIK, EU VAT number or name via nula.bg'). The purpose is unambiguous and clearly distinct from sibling tools like invoice/bill management or customer search. The added usage context (before creating an invoice) further disambiguates its role.

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

Usage Guidelines4/5

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

The description explicitly states when to use this tool: 'Use it BEFORE creating an invoice or bill for a counterparty you have not seen'. This provides clear contextual guidance. However, it does not mention alternatives (e.g., nula_search_customers) or explicitly state when not to use it, so it stops short of a full when/when-not contrast.

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

nula_match_bank_transactionsSuggest bank ↔ invoice matchesA
Read-only

Suggest which incoming bank transactions pay which unpaid sales invoices (by amount, invoice number in the payment reason, customer name/EIK). Only suggestions: nothing is changed. Mark invoices paid with nula_update_invoice_metadata after the user agrees.

ParametersJSON Schema
NameRequiredDescriptionDefault
date_toYes
date_fromYes
bank_account_idYesnula.bg internal id of the bank account

TDQS

A4.3/5.0
Behavior5/5

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

The description goes beyond the readOnlyHint annotation by clarifying that no changes are made and by specifying the exact follow-up action (using another tool after user consent). This adds valuable behavioral context without contradicting annotations.

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

Conciseness5/5

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

Two efficient sentences front-load the primary purpose and include the key constraint (non-destructive) and a distinct follow-up action. No fluff or redundancy.

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

Completeness4/5

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

For a simple read-only suggestion tool, the description covers the core behavior and follow-up, but does not describe return format or any edge cases. Given the tool's low complexity and the presence of annotations, this is reasonably complete, though mentioning the output (a list of suggested matches) would be a minor addition.

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 coverage is only 33% (only bank_account_id has a description). The description does not explain the date_from and date_to parameters or how they relate to the matching logic. It mentions matching criteria but not the role of each parameter, leaving gaps that the schema doesn't fill.

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

Purpose5/5

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

The description clearly states the tool's function: suggesting matches between bank transactions and unpaid invoices, with specific matching criteria (amount, invoice number, customer name/EIK). It distinguishes itself from purely search or update tools by being a suggestion-only operation.

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

Usage Guidelines4/5

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

It explicitly says 'Only suggestions: nothing is changed' and instructs to use nula_update_invoice_metadata after user agreement, giving clear when-to-use and follow-up guidance. It does not explicitly name alternative tools for when not to use, but the instruction to not modify data is implicit differentiation.

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

nula_ocr_statusOCR uploads and quotaA
Read-only

List documents sent to OCR (newest first) with their recognition status, or get one recognised document with its lines (give document_type and id). Also reports the remaining OCR quota.

ParametersJSON Schema
NameRequiredDescriptionDefault
idNoUpload id; requires document_type
limitNoMax records (default 20)
sinceNoOnly uploads changed since this ISO 8601 time
statusNo
document_typeNobill = покупка (purchase), invoice = продажба (sale)
include_quotaNoInclude remaining scans (default true)

TDQS

A4.2/5.0
Behavior4/5

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

Annotations already mark the operation as read-only, and the description adds useful behavioral context: results are ordered newest first, single-document retrieval returns recognised lines, and the remaining OCR quota is included. This goes beyond the annotations without contradicting them.

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

Conciseness5/5

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

Two compact sentences cover the main listing behavior, the single-document mode with its required parameters, and the quota reporting. Information is front-loaded and 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?

With no output schema, the description appropriately names key return concepts: recognition status, document lines, and OCR quota. Given the schema's coverage of parameters and the read-only annotation, the description is sufficiently complete for an agent to know what this tool returns and when to call it.

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

Parameters3/5

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

Schema coverage is high at 83%, so the schema documents most parameters such as limit, since, id, and include_quota. The description reinforces the id/document_type pairing and the quota flag but does not add meaning for status or limit beyond the schema, keeping it at the baseline.

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

Purpose5/5

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

The description names a specific verb and resource ('List documents sent to OCR'), states the sorting ('newest first'), and defines the second mode ('get one recognised document with its lines'). It leaves no ambiguity about what the tool does and is clearly distinct from the sibling tools, none of which cover OCR.

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

Usage Guidelines4/5

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

The description gives a clear conditional: use the listing mode by default, or provide 'document_type and id' to fetch a single recognised document with lines. It does not explicitly name alternatives or exclusions, but the sibling context shows no overlapping OCR tool, and the two-mode instruction is enough for an agent to choose correctly.

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

nula_period_summarySales and purchases summaryB
Read-only

Summary for a month or period: number and totals of sales and purchases, VAT charged vs VAT on purchases, top customers and suppliers. Indicative only: this is NOT the official VAT return (справка-декларация).

ParametersJSON Schema
NameRequiredDescriptionDefault
monthNoMonth as YYYY-MM
date_toNo
date_fromNo

TDQS

B3.4/5.0
Behavior3/5

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

The annotations include readOnlyHint=true and openWorldHint=false, so the description doesn't need to explain that operations are read-only. The description adds critical context by explicitly stating that the summary is 'indicative only' and NOT the official VAT return, which is valuable for setting expectations. However, it doesn't disclose other behavioral traits like performance characteristics or whether it covers partial periods, which might be relevant. No contradiction with annotations.

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

Conciseness4/5

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

The description is concise, front-loaded with the core purpose, and includes a clear limitation. It does not waste words or restate the title. The structure is effective for quick comprehension.

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

Completeness3/5

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

Given the tool has a simple output, no output schema, and readOnly annotation, the description covers the main purpose and an important limitation (not official VAT return). However, it leaves ambiguity about how to specify a custom period (via date_from/date_to) and what happens if neither month nor dates are provided. The tool is moderately complex with 3 optional parameters, and the description could be more explicit about parameter interactions and output contents.

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 only 33%, with only the 'month' parameter described. The description mentions 'month or period' but doesn't clarify how to specify a period (e.g., using date_from and date_to) or whether both are required together. It adds some context beyond the schema but doesn't fully compensate for the low coverage on the two date parameters.

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

Purpose4/5

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

The description clearly states that the tool provides a summary of sales and purchases for a month or period, including counts, totals, VAT, and top customers/suppliers. It distinguishes itself from sibling tools like nula_search_invoices or nula_receivables_report by focusing on aggregation rather than individual records. However, it does not explicitly differentiate from potential summary siblings, but given the list, it stands out as the only summary tool.

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

Usage Guidelines3/5

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

The description implies usage for monthly/period summaries but does not explicitly state when to use this over alternatives. It doesn't say 'use when you need aggregated totals' or direct the agent to other tools for detailed data. The mention of 'indicative only' hints at limitations but not at alternative tools. This leaves some 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.

nula_receivables_reportReceivables and overdue invoicesA
Read-only

Unpaid and overdue sales invoices (вземания, просрочени фактури) as of a date, grouped by customer with aging buckets (0–30 / 31–60 / 61–90 / 90+ days overdue). Read-only.

ParametersJSON Schema
NameRequiredDescriptionDefault
as_ofNoReference date (default today)
date_fromNoOnly invoices issued from this date (default: 12 months before as_of)
customer_eikNo
min_days_overdueNoOnly invoices at least this many days overdue

TDQS

A4.4/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true, so the description's 'Read-only' is redundant but not contradictory. The description adds useful behavioral context: it groups by customer, provides aging buckets with specific day ranges, and is as-of a date. It does not disclose pagination or output format, but for a read-only report tool with no output schema, the description covers the key behavior. No contradiction with annotations.

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

Conciseness5/5

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

The description is a single, dense sentence that front-loads the core purpose, includes the aging-bucket detail, and ends with 'Read-only.' Every word earns its place; no filler or repetition.

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

Completeness4/5

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

For a read-only report tool with 4 optional parameters and no output schema, the description is nearly complete. It explains the report's content, grouping, and aging buckets. It could mention that the output is a list/table and whether it includes totals, but the absence of an output schema makes that a minor gap. The read-only annotation covers safety, so the description doesn't need to repeat it.

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

Parameters4/5

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

Schema description coverage is 75%, so the schema documents most parameters. The description adds meaning by explaining the report's structure (aging buckets, grouping by customer), which helps an agent understand how parameters like min_days_overdue and date_from affect the output. It doesn't detail every parameter, but the schema already covers them. A 4 is justified because the description complements the schema well.

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 ('Unpaid and overdue sales invoices... as of a date'), a clear resource (receivables/overdue invoices), and a distinctive grouping/aging-bucket structure. It also includes Bulgarian terms for disambiguation and explicitly says 'Read-only', which distinguishes it from mutation tools. It is clearly differentiated from siblings like nula_search_invoices (which searches invoices) and nula_period_summary (which summarizes periods).

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 when to use it: when you need receivables/aging as of a date, grouped by customer. It does not explicitly name alternatives or exclusions, but the context signals and sibling list make the use case clear. A 4 is appropriate because the context is clear but there is no explicit 'use this instead of X' guidance.

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

nula_search_billsSearch purchase billsA
Read-only

Find purchase documents (покупки, входящи фактури от доставчици) by period, supplier or number. Pass bill_id to get one bill in full with its lines.

ParametersJSON Schema
NameRequiredDescriptionDefault
pageNoPage number, starting at 1
limitNoMax records to return from the page (default 25)
numberNoSupplier's document number
bill_idNoGet this bill in full, with lines
date_toNo
date_fromNo
supplier_eikNo
supplier_nameNo
response_formatNo"concise" (default) returns key fields; "detailed" adds lines and the raw nula.bg record
supplier_vat_numberNo

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 and openWorldHint=false, so the safety profile is covered. The description adds meaningful behavior beyond that: passing bill_id returns a single bill in full with its lines, while the normal search filters by period, supplier, or number. It does not detail pagination or result shape, but those are partially handled by the schema.

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

Conciseness5/5

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

Two short sentences carry all essential information, starting with the tool's main function and then the special bill_id behavior. There is no filler, no repetition of the title, and no unnecessary detail.

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

Completeness4/5

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

For a read-only search tool with no required parameters, the description plus schema covers the main invocation paths: list search by period/supplier/number and single-bill retrieval by bill_id. Minor gaps remain around how response_format=detailed interacts with bill_id and the lack of output-shape or error notes, but these are not blocking for correct selection and basic invocation.

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

Parameters4/5

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

The schema documents page, limit, number, bill_id, and response_format; the description supplies semantic grouping for the five undocumented parameters: date_from/date_to as 'period', supplier_eik/supplier_name/supplier_vat_number as 'supplier', and 'number'. This adds real meaning beyond the raw schema, though it stops short of explaining exact-match vs partial-match behavior.

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

Purpose5/5

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

The description uses a specific verb ('Find') and a clear resource ('purchase documents'), reinforced with Bulgarian equivalents, and explicitly names the search dimensions: period, supplier, and number. It also explains the bill_id path for fetching one bill in full with lines, distinguishing this from sales-invoice siblings like nula_search_invoices.

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

Usage Guidelines3/5

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

The description makes the tool's context clear: this is the purchase-bill search tool, and the bill_id mode is stated. However, it never names an alternative such as nula_search_invoices or says when not to use this tool, so the agent must infer the boundary from the word 'purchase'. No exclusions or alternative routing are provided.

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

nula_search_customersSearch customersA
Read-only

Find customers/counterparties (клиенти, контрагенти) by name, EIK or VAT number, or get one by id. nula.bg has no API to create customers directly: nula_create_invoice creates a missing customer automatically.

ParametersJSON Schema
NameRequiredDescriptionDefault
pageNoPage number, starting at 1
limitNoMax records to return from the page (default 25)
searchNoName, EIK or VAT number
customer_idNonula.bg internal id of the customer
response_formatNo"concise" (default) returns key fields; "detailed" adds lines and the raw nula.bg record

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, so the safety profile is covered. The description adds meaningful behavioral context: it explains that nula.bg has no direct customer-creation API and that nula_create_invoice auto-creates missing customers. This helps an agent understand the system's behavior beyond the schema. It doesn't mention pagination or response details, but those are partially covered by the schema's page/limit/response_format parameters.

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 no filler. The core search capability is front-loaded, and the note about nula_create_invoice is a valuable addition that earns its place. Every sentence contributes.

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 search tool with 100% schema coverage and no output schema, the description is nearly complete. It covers what the tool does, the search keys, and the key system constraint (no direct customer creation). The only minor gap is that it doesn't explicitly mention pagination behavior, but the schema's page/limit parameters already cover that.

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 all five parameters. The description adds a little semantic value by grouping the search parameter as 'Name, EIK or VAT number' and mentioning 'get one by id', but it doesn't add meaning beyond what the schema already provides. Baseline 3 is appropriate.

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

Purpose5/5

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

The description states a specific verb ('Find') and resource ('customers/counterparties'), and enumerates the search keys: name, EIK, VAT number, or id. It also distinguishes itself from the sibling create-invoice flow by noting that nula.bg has no direct customer-creation API, which helps an agent understand the tool's role in the broader workflow.

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

Usage Guidelines4/5

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

The description clearly implies when to use this tool: when you need to find a customer by name, EIK, VAT, or id. It also gives a useful exclusion/alternative note: nula_create_invoice creates a missing customer automatically, so an agent knows not to expect a create-customer tool. It doesn't explicitly say 'use this instead of nula_lookup_company', but the search-by-EIK/VAT framing is enough context.

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

nula_search_invoicesSearch sales invoicesA
Read-only

Find sales documents (фактури, проформи, дебитни/кредитни известия) by period, customer, type or number. Pass number to get one document in full, including its lines. Without document_type, proformas are excluded.

ParametersJSON Schema
NameRequiredDescriptionDefault
pageNoPage number, starting at 1
limitNoMax records to return from the page (default 25)
numberNoExact document number; returns that document in full, with its lines
date_toNoEnd of period (YYYY-MM-DD), inclusive
date_fromNoStart of period (YYYY-MM-DD), by date
customer_eikNo
customer_nameNo
document_typeNo
response_formatNo"concise" (default) returns key fields; "detailed" adds lines and the raw nula.bg record
customer_vat_numberNo

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 and openWorldHint=false, covering the safety profile. The description adds meaningful behavioral context beyond annotations: the default exclusion of proformas when document_type is absent, and the full-document behavior when `number` is supplied.

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, all earning their place. The main action and scope are front-loaded, followed by the two most important behavioral caveats. No filler or repetition of obvious type 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 a read-only search tool with no required parameters and no output schema, the description provides enough orientation: search facets, the number shortcut, and the proforma default. Output expectations are largely covered by the response_format parameter schema, so the definition is complete for correct invocation.

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

Parameters3/5

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

With schema description coverage around 60%, the description only partially compensates. It reiterates the `number` behavior already present in the schema and adds the proforma-default nuance for document_type. The generic mention of "customer" gives little semantic value for the three undocumented customer-related parameters.

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

Purpose5/5

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

Description opens with a specific verb and resource: "Find sales documents", enumerates the document types in Bulgarian, and lists search dimensions (period, customer, type, number). This clearly distinguishes the tool from sales-oriented siblings like nula_search_bills and nula_get_invoice_pdf.

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?

Provides clear, actionable usage context: passing `number` returns a full document with lines, and omitting `document_type` excludes proformas. It does not explicitly name sibling alternatives or when-not-to-use conditions, but the sales scope plus parameter guidance makes invocation conditions clear.

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

nula_search_itemsSearch items and stockA
Read-only

Find products/services (артикули) with prices and available stock (наличност). Give sku for an exact match, or query/name to match the name. Use it before invoicing to reuse the correct item name, sku and price.

ParametersJSON Schema
NameRequiredDescriptionDefault
skuNoExact SKU (Арт. номер), model or barcode
nameNoSame as query (matches the name)
pageNoPage number, starting at 1
queryNoText to match in the item name
per_pageNoDefault 25
response_formatNo"concise" (default) returns key fields; "detailed" adds lines and the raw nula.bg record

TDQS

A4.4/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true and openWorldHint=false, so the read-only nature is known. The description adds useful behavior context: it returns price/stock data, supports exact SKU matching, and name-based matching. It does not contradict annotations.

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

Conciseness5/5

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

Two sentences with no filler. The core action and result are front-loaded, and the usage guidance is compact. The parenthetical Bulgarian terms add clarity for the target domain without bloating the description.

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 search tool with 6 optional parameters, the description covers the key behavioral expectations: what is searched, what is returned, and when to call it. Pagination and response_format are already documented in the schema. Without an output schema, a more explicit statement of returned fields would push this to a 5.

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

Parameters4/5

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

Schema description coverage is 100%, so the schema already documents each parameter. The description adds value by clarifying the relationship between sku and query/name: 'Give sku for an exact match, or query/name to match the name.' This goes beyond the raw field descriptions.

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

Purpose5/5

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

The description starts with a specific verb and resource: 'Find products/services (артикули) with prices and available stock (наличност).' It clearly identifies the domain (items/stock) and differentiates this from sibling tools like nula_search_invoices or nula_search_customers.

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

Usage Guidelines4/5

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

The description explicitly tells the agent when to use it: 'Use it before invoicing to reuse the correct item name, sku and price.' It also gives guidance on how to search: exact sku versus query/name. It stops short of naming excluded alternatives or when not to use it, so it earns 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.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 13 tool updatesv0.1.0
    • First observednula_get_invoice_pdf
    • First observednula_list_bank_accounts
    • First observednula_list_bank_transactions
    • First observednula_list_item_categories
    • First observednula_lookup_company
    • First observednula_match_bank_transactions
    • First observednula_ocr_status
    • First observednula_period_summary
    • First observednula_receivables_report
    • First observednula_search_bills
    • First observednula_search_customers
    • First observednula_search_invoices
    • First observednula_search_items

TDQS

A3.8/5.0

Scored across 13 tools

Disambiguation4/5

Each tool targets a distinct resource or action: company lookup, invoices, bills, receivables, OCR, customers, items, bank data, and period summaries. The only mild overlap is nula_lookup_company vs. nula_search_customers, but the descriptions clarify that one is an external registry check and the other searches internal counterparties.

Naming Consistency4/5

All tools use the nula_ prefix and snake_case, with mostly verb_noun patterns like search_invoices, get_invoice_pdf, list_bank_accounts, and match_bank_transactions. A few names such as nula_ocr_status, nula_period_summary, and nula_receivables_report drop the verb, so the pattern is not perfectly uniform but remains readable.

Tool Count5/5

13 tools is a well-scoped size for an accounting/CRM data-access server. Each tool covers a distinct aspect of the domain without redundancy or bloat.

Completeness2/5

The tool set is almost entirely read-only, yet several descriptions reference missing mutation tools such as nula_create_invoice and nula_update_invoice_metadata. This creates dead ends for core workflows like creating invoices/bills or completing invoice matching by actually marking invoices paid.

Maintenance

ActivityNo data
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    B
    maintenance
    Provides AI assistants with direct access to HLedger accounting data and functionality, enabling natural language queries for balances, reports, journal entries, and financial analysis.
    15 npm
    65
    MIT
  • A
    license
    C
    quality
    C
    maintenance
    Enables AI assistants to manage invoices, contacts, purchases, journal entries, and other accounting operations via the Fiken API.
    100
    7 npm
    1
    MIT
  • F
    license
    Not graded
    quality
    C
    maintenance
    Enables read-only access to InvoiceNinja data, including invoices, expenses, clients, and tax reports, for AI assistants like Claude.
    1
    -
  • A
    license
    A
    quality
    A
    maintenance
    Enables AI assistants to interact with Quipu accounting data via natural language, including invoicing, expenses, contacts, and Spanish VAT reporting.
    18
    27 npm
    MIT