Skip to main content
Glama
jaakla

Merit MCP

by jaakla

Merit Unofficial MCP Server

CI PyPI Python License: MIT MCP

English summary: Unofficial MCP server and Python SDK for the Merit Aktiva accounting REST API. Exposes 11 tools (6 read tools with 50 read actions, 2 preview/confirm write tools), 3 workflow prompts, and 2 resources to AI coding assistants (Claude Code, Cursor, Windsurf, Gemini CLI, etc.). The write surface is intentionally minimal — customer create/update and restricted unsent sales invoice creation only. Confirmation creates a real accounting invoice that can affect the ledger before delivery—not an unposted draft. Payments, credit forms, item-creation fields, delivery flags, and other unsupported fields are rejected. Full read access to accounting data, write operations gated behind a two-step preview/confirm flow. Requires a Merit Aktiva Premium account and API credentials (MERIT_API_ID, MERIT_API_KEY). Run/install instantly via uvx. Experimental and unofficial — use at your own risk.


MCP server ja Pythoni SDK Merit Aktiva REST API jaoks. MCP server eksponeerib praegu 11 tööriista (6 lugemis-tööriista 50 action'iga, 2 kirjutamis-tööriista eelvaate/kinnituse vooluga), 3 töövoo prompti ja 2 ressurssi. See on mõeldud töötama MCP klientidega nagu Claude Code, Codex CLI, Cursor, Windsurf, Cline, Gemini CLI ja sarnased tööriistad.

Aktiivne arendus. See projekt areneb endiselt. MCP kiht on kasutatav, kuid see ei ole veel täisfunktsionaalne raamatupidamise töövoosüsteem. Kontrolli iga kirjutava operatsiooni tulemust live-raamatupidamisandmete vastu enne selle usaldamist.

Vastutusest loobumine

See on eksperimentaalne ja mitteametlik projekt. See ei ole seotud AS Merit Tarkvaraga, ei ole nende poolt toetatud ega ametlikult kinnitatud.

Kasutad seda täielikult omal vastutusel. See tarkvara saab lugeda ja muuta live-raamatupidamisandmeid, sh kliente, hankijaid, artikleid, arveid, makseid, makse ja dimensioone. Autorid ei vastuta vigaste kannete, kustutatud kirjete ega muu kaudse kahju eest.

Seda tarkvara kasutades nõustud, et:

  • vastutad ise kõigi loodud või muudetud raamatupidamisandmete kontrollimise eest

  • peaksid enne tähtsate live-andmete vastu kasutamist põhjalikult testima

  • tegemist on eksperimentaalse tarkvaraga ilma igasuguse garantiita

Related MCP server: e-arveldaja MCP Server

Kasutaja API võtmed

Server vajab järgmisi võtmeid, mille saab Meriti Aktivast Ettevõtte andmete > API Seadistustes, vajalik piisav kasutaja õiguste tase (haldaja) ja pakett (Premium või parem):

  • MERIT_API_ID

  • MERIT_API_KEY

  • MERIT_API_COUNTRY on valikuline, EE või PL, vaikimisi EE

Käsurea-vahendites saab need panna keskkonda (environment variables):

export MERIT_API_ID=your-api-id
export MERIT_API_KEY=your-api-key
export MERIT_API_COUNTRY=EE

Kui MERIT_API_ID või MERIT_API_KEY puudub, võib käivituda server seadistusrežiimis, aga kindlam on need seadistada json failis nagu kirjas allpool. Seadistusrežiimis:

  • get_setup_instructions jääb kättesaadavaks

  • ressursid jäävad kättesaadavaks

  • promptid jäävad kättesaadavaks

  • API-põhised tööriistad tagastavad seadistusjuhise ega kutsu Merit API-t

Paigaldus ja seadistus

Eeltingimused

  • Arvutisse peab olema paigaldatud uv — kaasaegne ja kiire Pythoni pakihaldur.

1. Lisa MCP server

Server käivitatakse lokaalselt taustal ja ühendub otse Meriti pilveteenusega. Kolmandaid osapooli ei kaasata.

Claude Code: (käsurealt)

claude mcp add merit-api -- uvx merit-unofficial-mcp-server

Teised tööriistad JSON-konfiguratsiooniga (nt. Claude Desktop, Cursor, Cline):

{
  "mcpServers": {
    "merit-api": {
      "command": "uvx",
      "args": ["merit-unofficial-mcp-server"],
      "env": {
        "MERIT_API_ID": "your-api-id-here",
        "MERIT_API_KEY": "your-api-key-here",
        "MERIT_API_COUNTRY": "EE"
      }
    }
  }
}

Seadistusfail Claude Desktop-is:

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

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

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

Codex CLI TOML-konfiguratsiooniga:

[mcp_servers.merit-api]
command = "uvx"
args = ["merit-unofficial-mcp-server"]

uvx tõmbab ja käivitab serveri otse PyPI registrist, tagades et alati on olemas vajalikud Pythoni moodulid ilma masinat risustamata.

Tööriist

Konfiguratsioonifail

Claude Code

~/.claude/settings.json või projekti .claude/settings.json

Codex CLI

~/.codex/config.toml

Gemini CLI

~/.gemini/settings.json

Cursor

projekti .cursor/mcp.json

Windsurf

~/.codeium/windsurf/mcp_config.json

Cline

VS Code seadetes cline.mcpServers all

2. Käivitamine lähtekoodist (arenduseks)

Kui soovite serverit lokaalselt muuta või testida, kloonige repositoorium ja käivitage see uv workspace toel:

git clone https://github.com/jaakla/merit_api.git
cd merit_api
# Paigalda lokaalsed sõltuvused (sh pytest arendustestide jaoks)
uv sync --all-extras
# Käivita MCP server otse lokaalsest koodist
uv run --package merit-unofficial-mcp-server merit-unofficial-mcp

MCP promptid

Server sisaldab kolme lihtsat näidisprompti, kuid kasutada saab ka mistahes teistsuguseid, keerukamaid käske:

Prompt

Kirjeldus

setup-merit-api

Selgitab, kuidas seadistada vajalikud keskkonnamuutujad ja server käivitada

create-sales-invoice

Juhendab assistenti kliendi leidmisel ja müügiarve loomisel

find-or-create-customer

Juhendab assistenti kliendi andmete otsimisel ja loomisel

Ressursid

Ressurss

Kirjeldus

merit://server/info

Serveri metaandmed, seadistusrežiimi staatus, toetatud env muutujad ja hoiatus

merit://tools/catalog

Tööriistade kataloog koos konsolideeritud tööriistade, nende action'ite ja nõutud väljadega

Tööriistad (tools)

Merit võimaldab kümneid erinevaid käske, see MCP server koondab need üldistatud tööriistadeks, et vältida liiga pikka nimekirja käskudest. Üldine tööriist kasutab action välja, et valida konkreetne Merit'i workflow.

Lugemise, Read-only tööriistad:

  • merit_read_master_data

  • merit_read_sales

  • merit_read_purchases

  • merit_read_financial

  • merit_read_inventory

  • merit_read_reports

Muutmise/kirjutamise tööriistad toimivad kahe käsuna, et vältida vigaste andmete sisestust:

  • merit_write_customers (eelvaade) ja merit_write_customers_confirm (kinnitatud muutmine) — ainult customer_upsert

  • merit_write_sales (eelvaade) ja merit_write_sales_confirm (kinnitatud muutmine) — ainult sales_invoice_create (saatmata raamatupidamisarve, mitte konteerimata mustand)

Kirjutamispind on tahtlikult minimaalne. Müügiarve saatmine (e-post/e-arve), kustutamine, kreeditarved, ostuarved, maksed ning maksude, dimensioonide ja artiklite muutmine ei ole MCP kirjutamistoimingutena saadaval. Kuluarvete jaoks kasuta näiteks Costpocketi integratsiooni või Meriti kasutajaliidest. SDK (merit-api pakett) säilitab kõik meetodid; piirang kehtib MCP kihile.

Saatmata arve ei ole konteerimata mustand. Eelvaade ei kirjuta midagi. *_confirm loob aga Meritis päris raamatupidamisarve, mis võib mõjutada pearaamatut ja aruandeid juba enne saatmist. Kontrolli andmeid enne kinnitamist. Kui vajad üksnes ilma raamatupidamismõjuta ettevalmistust, jää eelvaate juurde ja ära kinnita loomist.

Restricted sales-invoice profile

  • EUR and VAT-exclusive prices (PriceInclVat=false) only.

  • Existing customer by GUID; existing non-stock items by exact code, checked again at confirmation. Missing, ambiguous, stock, and unrecognized item records are refused.

  • Positive quantities, non-negative prices/taxes, positive net total; valid calendar dates and cent-rounded row/total consistency.

  • Unknown fields are rejected at every level, including embedded Payment, AccountingDoc, DelivNote, Item.Type, discounts, and rounding adjustments. These restrictions also apply to JSON-string payloads and confirmation calls.

  • Item lookup is not an atomic reservation. The integration relies on Merit's documented requirement for Item.Type when adding an item; this field is never forwarded. Live API behavior and company-specific VAT/accounting rules still require verification.

Merit's create-invoice documentation describes general-ledger records on invoice rows and does not document an unposted-draft mode for this endpoint. The MCP therefore promises an unsent accounting invoice, not a harmless saved draft. DelivNote is not treated as a draft-state switch.

Kirjutavad tööriistad on kahe sammuga. Esimene merit_write_* kutse ei tee Merit'is muudatusi: see tagastab eelvaate, confirmation_tool nime ja unikaalse confirmation_code väärtuse. Pärast eelvaate ülevaatamist tuleb sama action'i ja samade argumentidega kutsuda vastavat *_confirm tööriista ning anda kaasa confirmation_code ja confirmed=true. Kood on seotud konkreetsete argumentidega ja seda ei saa kasutada teise muudatuse kinnitamiseks.

NB! mõned AI mudelid püüavad olla "abivalmid" ja proovivad teha _confirm käsku automaatselt ise. Ole tähelepanelik, enne kui vajutad "Allow".

Kõigi tööriistade täielik action-kataloog on ressursis merit://tools/catalog.

Kasutusnäited

Kui MCP server on ühendatud, saad AI assistendiga suhelda eesti, inglise (tegelikult enamvähem mistahes) keeles.

Uuri põhiandmeid

"Näita kliente, mis vastavad nimele Acme"

Töövahend peaks kasutama merit_read_master_data tööriista action'iga customers_list ja filters={"Name": "Acme"}.

Loo või uuenda kliendi andmeid

"Loo uus klient Example OÜ"

Töövahend peaks koostama kliendi andmete faili ja kutsuma merit_write_customers tööriista action'iga customer_upsert.

Merit nõuab teatud (ja kahjuks mitte dokumenteeritud) minimaalset komplekti andmeid, seega esimene katse võib ebaõnnestuda. Siiski paremad AI mudelid oskavad neid automaatselt juurde otsida veebist, küsida kasutajalt ja ka mitu korda erinevalt andmeid proovida, kuni toimib.

Loo müügiarve

"Loo kliendile Acme müügiarve aprilli konsultatsiooniteenuse eest"

Töövahend saab kasutada merit_read_master_data action'iga customers_list, vajadusel find-or-create-customer, ja seejärel merit_write_sales action'iga sales_invoice_create. merit_write_sales tagastab eelvaate; arve luuakse alles merit_write_sales_confirm kutsega, kui kasutaja on eelvaate üle vaadanud.

Uuri sisestatud andmeid

"Mis pangad, kulukohad, projektid ja maksud Merit'is olemas on?"

Assistant saab kasutada merit_read_master_data tööriista action'eid banks_list, cost_centers_list, projects_list ja taxes_list.

Kontrolli seadistuse seisu

"Kontrolli, kas Merit MCP server on õigesti seadistatud ja saan Meritiga ühenduda"

Assistant saab kasutada get_setup_instructions ja merit://server/info.

SDK kasutamine

See repository sisaldab ka eraldi avatud koodiga Pythoni SDK projekti kataloogis merit_api/. Siit saad kontrollida, mida täpselt tarkvara teeb, ja arendusoskuse korral pakkuda välja koodiparandusi ja -täiendusi.

Näide:

from merit_api import MeritAPI

client = MeritAPI(api_id="YOUR_API_ID", api_key="YOUR_API_KEY")

customers = client.customers.get_list()
invoices = client.sales.get_invoices(
    PeriodStart="2024-01-01",
    PeriodEnd="2024-01-31",
)

SDK sisaldab praegu:

  • deterministlikku request body serialiseerimist signeerimiseks

  • seadistatavat timeouti ja retry käitumist (kordusi tehakse ainult idempotentsetele päringutele; muteerivaid kirjutusi nagu arve või makse loomine ei korrata, sest aegunud, kuid serveris juba kinnitatud päringu kordamine looks duplikaadi)

  • request/response logger hooke koos saladuste redaktsiooniga

  • valikulist idempotency headeri genereerimist (tähelepanu: Merit API ei dedubleeri selle headeri põhjal — see ei ole duplikaadivastane garantii, vaid valmidus juhuks, kui server seda kunagi toetab)

  • ostuarvete ja maksete duplikaadikaitset: vaikimisi ei looda sama tarnija + BillNo ostuarvet ega sama BillNo + summaga makset teist korda; möödaminekuks anna allow_duplicate=True

  • API taseme vigade haldust, eristust HTTP 200 vastustest

Uuendamine

Uuendamise viis sõltub sellest, kuidas serverit käivitad.

Kui kasutad uvx

Kuna server on avaldatud PyPI-s, laadib uvx automaatselt alla uusima versiooni. Kui soovite olemasolevat paigaldust käsitsi viimasele versioonile uuendada, käivitage:

uvx --upgrade merit-unofficial-mcp-server

Seejärel taaskäivita oma AI töövahend.

Kui jooksutad algkoodist, lokaalsest GIT checkout'ist

git pull
# Kuna kasutusel on uv workspace, siis uv sync teeb kõik automaatselt korda:
uv sync

Seejärel taaskäivita oma AI töövahend.

Arendus

Repositoorium on jaotatud ühisesse uv workspace'i kuuluvateks alamprojektideks:

  • merit_api/ SDK jaoks (pakett: merit-api)

  • mcp/ Pythoni MCP serveri jaoks (pakett: merit-unofficial-mcp-server)

  • root pyproject.toml workspace seadete jaoks

SDK testid:

uv run --package merit-api pytest

MCP testid:

uv run --package merit-unofficial-mcp-server pytest

SDK live integratsioonitestid on opt-in:

MERIT_API_INTEGRATION_TEST=true uv run --package merit-api pytest

Iga Merit päringu ja vastuse väljatrükkimiseks lisa MERIT_API_VERBOSE=true ja pytesti -s lipp:

MERIT_API_INTEGRATION_TEST=true MERIT_API_VERBOSE=true uv run --package merit-api pytest -s

Versiooni avaldamine (hooldajale)

Mõlemad paketid — merit-api (SDK) ja merit-unofficial-mcp-server (MCP server) — avaldatakse PyPI-sse käsitsi; automaatset CI avaldusvoogu ei ole. Versioonid hoitakse lukus, st kõik tõstetakse korraga samale numbrile.

  1. Tõsta versioon samale numbrile kõigis neljas kohas:

    • package.json — väli version

    • mcp/pyproject.tomlversion ning sõltuvuse pin merit-api>=X.Y.Z

    • merit_api/pyproject.tomlversion

  2. Lisa muudatused CHANGELOG.md-sse uue versiooni pealkirja alla.

  3. Värskenda lukufaili:

    uv lock
  4. Jooksuta testid:

    uv run --package merit-api pytest
    uv run --package merit-unofficial-mcp-server pytest
  5. Tee commit ja silt:

    git add -A
    git commit -m "release: vX.Y.Z"
    git tag -a vX.Y.Z -m "vX.Y.Z"
  6. Lükka GitHubi:

    git push origin main
    git push origin vX.Y.Z
  7. Ehita paketid (tulemused tekivad kausta dist/):

    uv build --package merit-api
    uv build --package merit-unofficial-mcp-server
  8. Avalda PyPI-sse — kõigepealt SDK (merit-api), sest MCP server sõltub sellest, ja alles siis MCP server. Vajab PyPI API tokenit (UV_PUBLISH_TOKEN keskkonnamuutuja või lipp --token):

    uv publish dist/merit_api-X.Y.Z*
    uv publish dist/merit_unofficial_mcp_server-X.Y.Z*

Pärast avaldamist laadib uvx merit-unofficial-mcp-server automaatselt uue versiooni.

npm pakett merit-unofficial-mcp on aegunud ega vaja enam avaldamist — kasutajad suunatakse uvx peale.

Hea teada

  • Kasuta tipptasemel AI/LLM mudeleid, kuigi need on pisut kallimad : Opus/Pro tase, ja mitte Light, mini või Haiku tase.

  • Praegune MCP server toetab ainult ühte ühendust korraga, ehk siis ühe ettevõttega tööd. Kui sa oled raamatupidamisfirma, kes soovib selle tasuta ja garaantiita koodi ning AI abil kõikide oma klientide raamatupidamist automaatselt hallata, siis olgu Jumala arm sinuga (loe: ei ole hea mõte).

  • Auditeerimiseks logi püsisalvestust ei ole

  • Dry-run kirjutusvooge veel ei ole — aga kirjutus käib läbi kontrolli, see peaks asendama dry-run enamuse juhtudel

  • Dokumentide sisestust mis nõuaks OCR töövoogu veel ei ole - nt ostuarvete sisestuseks kasuta muud AI tööriista või -mudelit, mis teeb selle tekstiks. PDF faili saab manusega ostuarvele lisada küll.

Litsents - tasuta, omal vastutusel

MIT

Available Tools

11 tools
get_setup_instructionsGet Setup InstructionsA
Read-onlyIdempotent

Report whether MERIT_API_ID and MERIT_API_KEY are configured, and explain how to set them when they are not.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already declare readOnlyHint and idempotentHint. The description adds meaningful context by specifying the exact environment variables checked and that the tool provides instructions when not configured. This goes beyond the annotations.

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

Conciseness5/5

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

The description is a single succinct sentence that conveys all necessary information with no unnecessary words. Every part is valuable.

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

Completeness5/5

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

Given zero parameters, present annotations, and an output schema, the description fully covers what the agent needs to know: it will report configuration status and optionally provide setup instructions.

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?

No parameters exist, so schema coverage is effectively 100%. The description does not need to elaborate on parameters; the baseline score of 4 applies.

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

Purpose5/5

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

The description clearly states the tool's purpose: to report whether MERIT_API_ID and MERIT_API_KEY are configured and provide setup instructions. This distinctively sets it apart from sibling tools which focus on data operations.

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

Usage Guidelines4/5

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

The description implicitly indicates when to use this tool (to check configuration status and get setup instructions). While it doesn't explicitly state when not to use it or list alternatives, the sibling tools are so different that usage context is clear.

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

merit_read_financialMerit Read FinancialB
Read-onlyIdempotent

Read-only tool. Read payments, banks, and GL information. Actions: payments_list: List payments.; payment_types_list: List payment types.; payment_imports_list: List payment imports for a bank.; expense_payments_list: List expense payments for a bank.; income_payments_list: List income payments for a bank.; gl_batches_list: List GL batches.; gl_batch_get: Fetch one GL batch by id.; gl_batches_full_list: List GL batches with full details.

ParametersJSON Schema
NameRequiredDescriptionDefault
idNo
actionYes
bank_idNo
filtersNo
payloadNo
confirmedNo
delivnoteNo
add_attachmentNo
confirmation_codeNo

TDQS

B3/5.0
Behavior3/5

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

Annotations already provide readOnlyHint, destructiveHint, and idempotentHint. The description's 'Read-only tool' is consistent with annotations but adds no additional behavioral context (e.g., rate limits, auth requirements). This is adequate given annotation coverage.

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

Conciseness3/5

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

The description is front-loaded with 'Read-only tool' and lists actions succinctly. However, the repetitive 'List ...' structure could be condensed, and the inclusion of periods and semicolons makes it slightly verbose. Adequate but not exemplary.

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

Completeness2/5

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

For a tool with 9 parameters, no output schema, and extensive sibling tools, the description is incomplete. It fails to explain parameter mechanics, filter usage, or return behavior, leaving significant gaps for an agent to select and invoke correctly.

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?

With 0% schema description coverage, the description must compensate but does not. It only lists possible values for the 'action' parameter, leaving id, filters, payload, etc. unexplained. The agent cannot infer correct parameter usage beyond action selection.

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

Purpose4/5

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

The description clearly states it is a read-only tool for payments, banks, and GL information, distinguishing it from write siblings. However, the purpose is presented as a list of actions rather than a concise single statement, slightly reducing clarity.

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 includes 'Read-only tool,' which implies it should not be used for writes, but it does not explicitly mention alternatives like merit_write_financial or specify when to use this vs. other read tools such as merit_read_purchases. Some guidance is present but incomplete.

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

merit_read_inventoryMerit Read InventoryC
Read-onlyIdempotent

Read-only tool. Read inventory, fixed asset, and pricing data. Actions: locations_list: List inventory locations.; movements_list: List inventory movements.; fixed_asset_locations_list: List fixed asset locations.; fixed_asset_responsible_persons_list: List fixed asset responsible persons.; fixed_assets_list: List fixed assets.; prices_list: List prices.; discounts_list: List discounts.; price_get: Fetch an effective price.

ParametersJSON Schema
NameRequiredDescriptionDefault
idNo
actionYes
bank_idNo
filtersNo
payloadNo
confirmedNo
delivnoteNo
add_attachmentNo
confirmation_codeNo

TDQS

C2.8/5.0
Behavior3/5

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

Annotations already provide readOnlyHint=true, destructiveHint=false, and idempotentHint=true. The description adds 'Read-only tool' but does not elaborate on permissions, rate limits, or side effects beyond what annotations convey.

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

Conciseness3/5

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

The description is relatively short but uses a run-on list with semicolons. It could be better structured (e.g., bullet points) and still concise.

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

Completeness2/5

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

Given the tool's complexity (9 parameters, no output schema, no enums), the description is insufficient. It does not cover parameter interactions, default behaviors, or the full scope of actions and their constraints.

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?

With 0% schema description coverage and 9 parameters, the description fails to explain the meaning of key parameters (e.g., action, id, filters, payload). Only action is mentioned via a list of sub-actions, but no enum or format details are provided.

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

Purpose4/5

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

The description clearly states it is a read-only tool for inventory, fixed asset, and pricing data with a list of actions. However, it does not explicitly differentiate from sibling tools like merit_read_financial or merit_read_master_data, which may have overlapping scope.

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?

While it identifies the tool as read-only, there is no guidance on when to use it versus alternative tools, nor does it explain which action to use in different scenarios. The description lacks context-specific usage recommendations.

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

merit_read_master_dataMerit Read Master DataC
Read-onlyIdempotent

Read-only tool. Read common master and reference data from Merit. Actions: customers_list: List customers with optional filters.; customer_groups_list: List customer groups.; vendors_list: List vendors with optional filters.; vendor_groups_list: List vendor groups.; items_list: List items with optional filters.; item_groups_list: List item groups.; taxes_list: List tax rates.; dimensions_list: List dimensions.; banks_list: List banks.; accounts_list: List accounts.; projects_list: List projects.; cost_centers_list: List cost centers.; departments_list: List departments.; units_list: List units of measure.; financial_years_list: List financial years.

ParametersJSON Schema
NameRequiredDescriptionDefault
idNo
actionYes
bank_idNo
filtersNo
payloadNo
confirmedNo
delivnoteNo
add_attachmentNo
confirmation_codeNo

TDQS

C2.9/5.0
Behavior3/5

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

Annotations already indicate readOnlyHint=true, destructiveHint=false, idempotentHint=true. The description reiterates 'Read-only tool' and lists actions, adding moderate value by specifying the type of data (master/reference), but does not disclose behaviors like rate limits, permissions, or response structure.

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 moderately concise; the action list is structured but somewhat lengthy. It front-loads the read-only nature, but a more compact grouping could improve readability without losing information.

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

Completeness2/5

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

Given no output schema and 0% parameter coverage, the description should explain what each action returns and how to use optional parameters. It fails to do so, leaving significant gaps for an agent to understand tool usage correctly.

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

Parameters2/5

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

Schema description coverage is 0%, so the description must compensate. Only the 'action' parameter is implicitly explained via the list of action values. Other critical parameters (id, filters, payload, etc.) are not described at all, leaving the agent to guess their purpose and format.

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

Purpose4/5

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

The description clearly states the tool is for reading master and reference data from Merit, and lists 18 specific actions (e.g., customers_list, accounts_list). The purpose is clear but does not differentiate from sibling read tools like merit_read_financial which may also list accounts or other overlapping actions.

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

Usage Guidelines2/5

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

No guidance is provided on when to use this tool versus the many other read tools (e.g., merit_read_financial, merit_read_inventory). The description simply enumerates actions without contextualizing scope or alternatives.

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

merit_read_purchasesMerit Read PurchasesA
Read-onlyIdempotent

Read-only tool. Read purchase invoices and purchase orders. Actions: invoices_list: List purchase invoices.; invoice_get: Fetch one purchase invoice by id.; orders_list: List purchase orders.

ParametersJSON Schema
NameRequiredDescriptionDefault
idNo
actionYes
bank_idNo
filtersNo
payloadNo
confirmedNo
delivnoteNo
add_attachmentNo
confirmation_codeNo

TDQS

A3.6/5.0
Behavior3/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 tool' adds no new safety context. It lists actions but lacks details on pagination, error behavior, or output structure, though not required given 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?

Description is short and front-loaded with 'Read-only tool,' then lists actions. No wasted words, though a list format could improve readability.

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

Completeness2/5

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

Description is incomplete given 9 parameters and no output schema. Only action parameter is explained; key details on filters, payload, and response are missing, making it insufficient for reliable invocation.

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?

With 0% schema coverage, the description must compensate but only explains the 'action' parameter values. Other 8 parameters (id, filters, payload, etc.) receive no explanation, leaving 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?

The description clearly states the tool reads purchase invoices and purchase orders, listing specific actions (invoices_list, invoice_get, orders_list), which distinguishes it from sibling read tools like merit_read_sales.

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 for purchase documents through naming and actions, but does not explicitly state when not to use it or compare with alternatives like merit_read_financial.

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

merit_read_reportsMerit Read ReportsC
Read-onlyIdempotent

Read-only tool. Read Merit reports and report continuations. Actions: customer_debts_get: Get customer debts report.; customer_payments_get: Get customer payment report.; more_data_get: Get continuation page for a report.; profit_report_get: Get statement of profit or loss.; balance_report_get: Get statement of financial position.; inventory_report_get: Get inventory report.; sales_report_get: Get sales report.; purchase_report_get: Get purchase report.

ParametersJSON Schema
NameRequiredDescriptionDefault
idNo
actionYes
bank_idNo
filtersNo
payloadNo
confirmedNo
delivnoteNo
add_attachmentNo
confirmation_codeNo

TDQS

C2.8/5.0
Behavior3/5

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

Annotations already provide readOnlyHint, destructiveHint, and idempotentHint. The description adds a list of actions but no additional behavioral details like pagination or error handling. 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.

Conciseness3/5

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

The description is fairly concise but the list of actions is run-on and could be better formatted. It front-loads 'Read-only tool' but is not particularly well-structured.

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

Completeness2/5

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

No output schema and no explanation of return values or continuation mechanism. Given the complexity (8 reports, 9 parameters), the description is incomplete and does not cover how to use the tool effectively.

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

Parameters2/5

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

Schema description coverage is 0%. The description lists the valid action values, which is critical, but does not explain the other 8 parameters (id, filters, payload, etc.). For a tool with 9 parameters, this is insufficient.

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

Purpose4/5

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

The description clearly states the tool reads Merit reports and lists eight specific actions, making the purpose clear. However, it does not differentiate from sibling read tools like merit_read_financial or merit_read_sales, which could cause confusion.

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

Usage Guidelines2/5

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

No guidance on when to use this tool versus the specific read tools (e.g., merit_read_financial). The description only says 'Read-only tool' but lacks any when-to-use or when-not-to-use instructions.

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

merit_read_salesMerit Read SalesA
Read-onlyIdempotent

Read-only tool. Read sales invoices, offers, and recurring invoice data. Actions: invoices_list: List sales invoices.; invoice_get: Fetch one sales invoice by id.; invoice_pdf_get: Fetch one sales invoice PDF by id.; offers_list: List sales offers.; offer_get: Fetch one sales offer by id.; recurring_invoices_list: List recurring invoices.; recurring_invoice_get: Fetch one recurring invoice by id.; recurring_invoice_addresses_list: List recurring invoice addresses.

ParametersJSON Schema
NameRequiredDescriptionDefault
idNo
actionYes
bank_idNo
filtersNo
payloadNo
confirmedNo
delivnoteNo
add_attachmentNo
confirmation_codeNo

TDQS

A3.6/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true, destructiveHint=false, idempotentHint=true. Description reinforces read-only behavior but adds no additional behavioral context beyond listing actions. No contradictions.

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

Conciseness4/5

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

Front-loaded with key purpose ('Read-only tool'). Actions listed in a structured format. Slightly long due to enumeration, but each line is concise. No unnecessary words.

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

Completeness2/5

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

While the action list is useful, the description fails to document parameter semantics, return values (no output schema), or provide examples. Given 9 parameters and zero schema descriptions, the tool definition is incomplete.

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 0%, so description must compensate. It enumerates valid action values in text, aiding the agent. However, it does not explain id, filters, payload, or other parameters, leaving significant gaps.

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 it is a read-only tool for sales invoices, offers, and recurring invoices. Lists all available actions. Distinguishes from sibling write tools like merit_write_sales.

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 states read-only nature, implying not for modifications. Does not provide explicit when-not-to-use or alternatives, but siblings are clearly write tools. Within the tool, actions list provides guidance on which action to use.

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

merit_write_customersMerit Write CustomersA
Read-only

Preview-only write tool. Does not execute changes; returns intended operation details and a confirmation_code for merit_write_customers_confirm. Create or update customers. Actions: customer_upsert: Create or update a customer.

ParametersJSON Schema
NameRequiredDescriptionDefault
idNo
actionYes
bank_idNo
filtersNo
payloadNo
confirmedNo
delivnoteNo
add_attachmentNo
confirmation_codeNo

TDQS

A3.9/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true and destructiveHint=false, and the description usefully explains WHY that is true — it is a dry-run that returns intended operations plus a confirmation_code rather than mutating. It leaves a real gap, though: the schema contains a 'confirmed' boolean that could plausibly execute the change, and the description never explains whether this tool can ever commit or how idempotency works across repeated previews.

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

Conciseness4/5

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

Three short sentences with the most decision-relevant fact (preview-only, no execution) placed first, which is exactly the right ordering. The final action gloss ('customer_upsert: Create or update a customer') restates the preceding sentence almost verbatim, so a small amount of text is not earning 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?

For a preview-write tool with 9 undocumented parameters and no output schema, the description covers the confirm workflow but omits the shape of the returned preview and the semantics of most inputs. It is enough to know which tool to call first, but not enough to call it correctly without opening the schema.

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

Parameters2/5

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

Schema description coverage is 0% across 9 parameters, so the description must carry parameter meaning and largely does not. Only 'action' (customer_upsert) and 'confirmation_code' are addressed; id, bank_id, filters, payload, confirmed, delivnote, and add_attachment are never explained, leaving an agent to guess what payload shape or filter syntax customer_upsert expects.

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+resource ('Create or update customers') and front-loads the distinguishing property ('Preview-only write tool. Does not execute changes'), so an agent can tell it apart from merit_write_customers_confirm and the read_* siblings immediately. It also enumerates the single supported action, customer_upsert.

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 makes the workflow condition explicit: this tool returns a confirmation_code that must be fed to merit_write_customers_confirm, implying you call this one first and only confirm afterwards. It never states when NOT to use it or what happens if the preview is skipped, so it stops short of full routing guidance.

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

merit_write_customers_confirmMerit Write Customers ConfirmA
Destructive

Confirmed mutating tool. Executes a previously previewed write operation from merit_write_customers when called with confirmation_code and confirmed=true. Create or update customers. Actions: customer_upsert: Create or update a customer.

ParametersJSON Schema
NameRequiredDescriptionDefault
idNo
actionYes
bank_idNo
filtersNo
payloadNo
confirmedNo
delivnoteNo
add_attachmentNo
confirmation_codeNo

TDQS

A3.5/5.0
Behavior4/5

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

Annotations already declare destructiveHint=true and idempotentHint=false; the description adds the confirmation gating contract (requires confirmation_code plus confirmed=true) and the two-step preview/confirm nature, which is genuinely useful beyond the annotations. It stops short of saying what data is destroyed or that repeats are non-idempotent.

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 key fact that this is the confirmed/executing half of a preview-confirm pair, and the sentences are short. The final 'Create or update customers' sentence is redundant with the action line that follows it.

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

Completeness2/5

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

For a destructive, non-idempotent write tool with nine mostly-optional parameters and no output schema, the description leaves critical gaps: what payload/filters must carry, how confirmation_code is obtained, and what side effects occur. It covers the workflow contract but not enough to call it correctly.

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

Parameters2/5

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

Schema description coverage is 0% across 9 parameters, so the description must compensate. It only explains confirmation_code and confirmed; id, bank_id, filters, payload, delivnote, and add_attachment are entirely undocumented anywhere, leaving the agent to guess what payload must contain.

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 operation ('Executes a previously previewed write operation from merit_write_customers') and names the action customer_upsert, which distinguishes it from merit_write_customers (preview) and merit_write_sales_confirm. The purpose is clear, though the trailing 'Create or update customers' restates the action rather than adding scope.

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

Usage Guidelines4/5

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

Gives the triggering condition explicitly ('when called with confirmation_code and confirmed=true') and ties this tool to a prior call to merit_write_customers. It communicates the preview-then-confirm workflow well but never states when NOT to use it (e.g., bypassing confirmation) or what happens if the code is stale.

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

merit_write_salesMerit Write SalesA
Read-only

Preview-only write tool. Does not execute changes; returns intended operation details and a confirmation_code for merit_write_sales_confirm. Create unsent accounting invoices, not unposted drafts. Delivery (email/e-invoice), deletion, and credit invoices are handled manually in Merit and are not exposed by this server. Actions: sales_invoice_create: Create an unsent accounting invoice through Merit v1 /sendinvoice, NOT an unposted draft. Restricted schema: Customer={Id: customer GUID}; DocDate, TransactionDate, DueDate as YYYYMMDD; InvoiceNo (string), CurrencyCode='EUR', PriceInclVat=false, singular InvoiceRow list, TaxAmount, TotalAmount (VAT-exclusive). Optional FComment and HComment text. Each row requires Item={Code, Description, UOMName}, Quantity>0, Price>=0, TaxId GUID, Account. Read items_list first; Code must exactly match an existing non-stock item. The server verifies items again at confirmation and refuses missing, stock, or unrecognized items. Do not supply Item.Type. Use InvoiceRow (singular), not InvoiceRows; UOMName belongs inside Item, not on the row. Resolve company-specific TaxId GUIDs via taxes_list; never invent them. TaxAmount entries are {TaxId, Amount>=0} and must cover exactly the row TaxIds. TotalAmount must be positive and match the sum of row Quantity × Price, rounded per row to cents. Unknown fields are rejected at every level, including Payment, AccountingDoc, DelivNote, discounts, rounding adjustments, and item-creation fields. Negative quantities/prices are not supported. Choose InvoiceNo using the company's numbering convention; no automatic allocation is provided. Confirmation creates a real, unsent accounting invoice in Merit. It can affect the ledger and reports before delivery; this is NOT an unposted draft. Only the preview is non-writing. Review before confirming; send manually in Merit.

ParametersJSON Schema
NameRequiredDescriptionDefault
idNo
actionYes
bank_idNo
filtersNo
payloadNo
confirmedNo
delivnoteNo
add_attachmentNo
confirmation_codeNo

TDQS

A4.8/5.0
Behavior5/5

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

Annotations already declare readOnlyHint=true and destructiveHint=false, but the description adds substantial behavioral context: preview returns a confirmation_code, confirmation creates a real unsent accounting invoice affecting the ledger and reports, items are re-verified at confirmation, and unknown fields are rejected at every level. This goes well beyond the annotations and does not contradict them.

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

Conciseness4/5

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

The description is long but front-loads the most important distinction (preview vs. confirmation) and each sentence carries operational constraints. There is some repetition around 'not an unposted draft' and the density could be better structured, but for the complexity involved it is reasonably efficient.

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

Completeness5/5

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

Given a 9-parameter write-preview tool with no output schema, the description is exceptionally complete: it covers the preview/confirm lifecycle, ledger impact, manual boundaries, payload shape, validation behavior, and field-level restrictions. Nothing essential for correct invocation appears 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 0%, so the description must carry parameter meaning, and it richly documents the payload structure, required field formats, singular InvoiceRow, TaxId resolution, and validation rules. However, several top-level parameters such as id, bank_id, filters, delivnote, and add_attachment are not explained, leaving gaps despite the strong payload coverage.

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

Purpose5/5

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

The description states a specific action and scope ('Preview-only write tool... returns intended operation details and a confirmation_code') and distinguishes this preview tool from the confirmation sibling. It further specifies that it creates unsent accounting invoices, not unposted drafts, making the resource and state unambiguous.

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

Usage Guidelines5/5

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

It explicitly says to use this tool for preview and then use merit_write_sales_confirm with the returned confirmation_code. It also names what is not exposed by this server (delivery, deletion, credit invoices) and clarifies that only the preview is non-writing, giving clear when-to-use and when-not-to-use guidance.

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

merit_write_sales_confirmMerit Write Sales ConfirmA
Destructive

Confirmed mutating tool. Executes a previously previewed write operation from merit_write_sales when called with confirmation_code and confirmed=true. Create unsent accounting invoices, not unposted drafts. Delivery (email/e-invoice), deletion, and credit invoices are handled manually in Merit and are not exposed by this server. Actions: sales_invoice_create: Create an unsent accounting invoice through Merit v1 /sendinvoice, NOT an unposted draft. Restricted schema: Customer={Id: customer GUID}; DocDate, TransactionDate, DueDate as YYYYMMDD; InvoiceNo (string), CurrencyCode='EUR', PriceInclVat=false, singular InvoiceRow list, TaxAmount, TotalAmount (VAT-exclusive). Optional FComment and HComment text. Each row requires Item={Code, Description, UOMName}, Quantity>0, Price>=0, TaxId GUID, Account. Read items_list first; Code must exactly match an existing non-stock item. The server verifies items again at confirmation and refuses missing, stock, or unrecognized items. Do not supply Item.Type. Use InvoiceRow (singular), not InvoiceRows; UOMName belongs inside Item, not on the row. Resolve company-specific TaxId GUIDs via taxes_list; never invent them. TaxAmount entries are {TaxId, Amount>=0} and must cover exactly the row TaxIds. TotalAmount must be positive and match the sum of row Quantity × Price, rounded per row to cents. Unknown fields are rejected at every level, including Payment, AccountingDoc, DelivNote, discounts, rounding adjustments, and item-creation fields. Negative quantities/prices are not supported. Choose InvoiceNo using the company's numbering convention; no automatic allocation is provided. Confirmation creates a real, unsent accounting invoice in Merit. It can affect the ledger and reports before delivery; this is NOT an unposted draft. Only the preview is non-writing. Review before confirming; send manually in Merit.

ParametersJSON Schema
NameRequiredDescriptionDefault
idNo
actionYes
bank_idNo
filtersNo
payloadNo
confirmedNo
delivnoteNo
add_attachmentNo
confirmation_codeNo

TDQS

A4.4/5.0
Behavior5/5

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

Annotations already flag destructiveHint=true and idempotentHint=false, but the description adds the consequences the annotations cannot convey: the result is a real unsent accounting invoice that affects the ledger and reports before delivery, it is explicitly not an unposted draft, the server re-verifies items at confirmation and refuses missing/stock/unrecognized ones, and unknown fields are rejected at every level.

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

Conciseness3/5

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

Front-loaded with the confirmation contract, but the body is dense and repeats the same point three times ('not unposted drafts', 'NOT an unposted draft', 'NOT an unposted draft'). A single statement of that constraint would free space for the undocumented top-level parameters.

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 destructive, 9-parameter write tool with no output schema, the description covers the mutation's real-world effect, the item re-validation behavior, and most payload constraints. It falls short only on the several top-level parameters left undocumented and the absence of any return/result expectation.

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 0%, so the description carries the full burden. It does heavy lifting on the payload shape (InvoiceRow singular, Item={Code,Description,UOMName}, Quantity>0, Price>=0, TaxId, TaxAmount, TotalAmount rules) and on confirmation_code/confirmed, but the top-level id, bank_id, filters, and delivnote parameters are never explained. Partial compensation, not full.

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 ('executes a previously previewed write operation from merit_write_sales') and pins the trigger condition (confirmation_code plus confirmed=true). It explicitly separates itself from the sibling merit_write_sales, which only previews, so an agent can distinguish the two 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 Guidelines5/5

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

Gives explicit sequencing ('Read items_list first', 'Resolve company-specific TaxId GUIDs via taxes_list'), states the preview-vs-confirm relationship with merit_write_sales, and names what is out of scope (delivery, deletion, credit invoices handled manually in Merit). When-not-to-use guidance is effectively present via 'Review before confirming; send manually in Merit.'

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. 4 tool updatesv0.6.0
    • Removedmerit_write_financial
    • Removedmerit_write_financial_confirm
    • Removedmerit_write_purchases
    • Removedmerit_write_purchases_confirm
  2. 14 tool updatesv0.5.0
    • Changedmerit_read_financial2 fields changed
      • changedInput schema / properties / filters / anyOf
        Previous value: -[
        -  {
        -    "additionalProperties": true,
        -    "type": "object"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "additionalProperties": true,
        +    "type": "object"
        +  },
        +  {
        +    "type": "string"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • changedInput schema / properties / payload / anyOf
        Previous value: -[
        -  {
        -    "additionalProperties": true,
        -    "type": "object"
        -  },
        -  {
        -    "items": {
        -      "additionalProperties": true,
        -      "type": "object"
        -    },
        -    "type": "array"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "additionalProperties": true,
        +    "type": "object"
        +  },
        +  {
        +    "items": {
        +      "additionalProperties": true,
        +      "type": "object"
        +    },
        +    "type": "array"
        +  },
        +  {
        +    "type": "string"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
    • Changedmerit_read_inventory2 fields changed
      • changedInput schema / properties / filters / anyOf
        Previous value: -[
        -  {
        -    "additionalProperties": true,
        -    "type": "object"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "additionalProperties": true,
        +    "type": "object"
        +  },
        +  {
        +    "type": "string"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • changedInput schema / properties / payload / anyOf
        Previous value: -[
        -  {
        -    "additionalProperties": true,
        -    "type": "object"
        -  },
        -  {
        -    "items": {
        -      "additionalProperties": true,
        -      "type": "object"
        -    },
        -    "type": "array"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "additionalProperties": true,
        +    "type": "object"
        +  },
        +  {
        +    "items": {
        +      "additionalProperties": true,
        +      "type": "object"
        +    },
        +    "type": "array"
        +  },
        +  {
        +    "type": "string"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
    • Changedmerit_read_master_data2 fields changed
      • changedInput schema / properties / filters / anyOf
        Previous value: -[
        -  {
        -    "additionalProperties": true,
        -    "type": "object"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "additionalProperties": true,
        +    "type": "object"
        +  },
        +  {
        +    "type": "string"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • changedInput schema / properties / payload / anyOf
        Previous value: -[
        -  {
        -    "additionalProperties": true,
        -    "type": "object"
        -  },
        -  {
        -    "items": {
        -      "additionalProperties": true,
        -      "type": "object"
        -    },
        -    "type": "array"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "additionalProperties": true,
        +    "type": "object"
        +  },
        +  {
        +    "items": {
        +      "additionalProperties": true,
        +      "type": "object"
        +    },
        +    "type": "array"
        +  },
        +  {
        +    "type": "string"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
    • Changedmerit_read_purchases2 fields changed
      • changedInput schema / properties / filters / anyOf
        Previous value: -[
        -  {
        -    "additionalProperties": true,
        -    "type": "object"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "additionalProperties": true,
        +    "type": "object"
        +  },
        +  {
        +    "type": "string"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • changedInput schema / properties / payload / anyOf
        Previous value: -[
        -  {
        -    "additionalProperties": true,
        -    "type": "object"
        -  },
        -  {
        -    "items": {
        -      "additionalProperties": true,
        -      "type": "object"
        -    },
        -    "type": "array"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "additionalProperties": true,
        +    "type": "object"
        +  },
        +  {
        +    "items": {
        +      "additionalProperties": true,
        +      "type": "object"
        +    },
        +    "type": "array"
        +  },
        +  {
        +    "type": "string"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
    • Changedmerit_read_reports2 fields changed
      • changedInput schema / properties / filters / anyOf
        Previous value: -[
        -  {
        -    "additionalProperties": true,
        -    "type": "object"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "additionalProperties": true,
        +    "type": "object"
        +  },
        +  {
        +    "type": "string"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • changedInput schema / properties / payload / anyOf
        Previous value: -[
        -  {
        -    "additionalProperties": true,
        -    "type": "object"
        -  },
        -  {
        -    "items": {
        -      "additionalProperties": true,
        -      "type": "object"
        -    },
        -    "type": "array"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "additionalProperties": true,
        +    "type": "object"
        +  },
        +  {
        +    "items": {
        +      "additionalProperties": true,
        +      "type": "object"
        +    },
        +    "type": "array"
        +  },
        +  {
        +    "type": "string"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
    • Changedmerit_read_sales2 fields changed
      • changedInput schema / properties / filters / anyOf
        Previous value: -[
        -  {
        -    "additionalProperties": true,
        -    "type": "object"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "additionalProperties": true,
        +    "type": "object"
        +  },
        +  {
        +    "type": "string"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • changedInput schema / properties / payload / anyOf
        Previous value: -[
        -  {
        -    "additionalProperties": true,
        -    "type": "object"
        -  },
        -  {
        -    "items": {
        -      "additionalProperties": true,
        -      "type": "object"
        -    },
        -    "type": "array"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "additionalProperties": true,
        +    "type": "object"
        +  },
        +  {
        +    "items": {
        +      "additionalProperties": true,
        +      "type": "object"
        +    },
        +    "type": "array"
        +  },
        +  {
        +    "type": "string"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
    • Changedmerit_write_customers2 fields changed
      • changedInput schema / properties / filters / anyOf
        Previous value: -[
        -  {
        -    "additionalProperties": true,
        -    "type": "object"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "additionalProperties": true,
        +    "type": "object"
        +  },
        +  {
        +    "type": "string"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • changedInput schema / properties / payload / anyOf
        Previous value: -[
        -  {
        -    "additionalProperties": true,
        -    "type": "object"
        -  },
        -  {
        -    "items": {
        -      "additionalProperties": true,
        -      "type": "object"
        -    },
        -    "type": "array"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "additionalProperties": true,
        +    "type": "object"
        +  },
        +  {
        +    "items": {
        +      "additionalProperties": true,
        +      "type": "object"
        +    },
        +    "type": "array"
        +  },
        +  {
        +    "type": "string"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
    • Changedmerit_write_customers_confirm2 fields changed
      • changedInput schema / properties / filters / anyOf
        Previous value: -[
        -  {
        -    "additionalProperties": true,
        -    "type": "object"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "additionalProperties": true,
        +    "type": "object"
        +  },
        +  {
        +    "type": "string"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • changedInput schema / properties / payload / anyOf
        Previous value: -[
        -  {
        -    "additionalProperties": true,
        -    "type": "object"
        -  },
        -  {
        -    "items": {
        -      "additionalProperties": true,
        -      "type": "object"
        -    },
        -    "type": "array"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "additionalProperties": true,
        +    "type": "object"
        +  },
        +  {
        +    "items": {
        +      "additionalProperties": true,
        +      "type": "object"
        +    },
        +    "type": "array"
        +  },
        +  {
        +    "type": "string"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
    • Changedmerit_write_financial2 fields changed
      • changedInput schema / properties / filters / anyOf
        Previous value: -[
        -  {
        -    "additionalProperties": true,
        -    "type": "object"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "additionalProperties": true,
        +    "type": "object"
        +  },
        +  {
        +    "type": "string"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • changedInput schema / properties / payload / anyOf
        Previous value: -[
        -  {
        -    "additionalProperties": true,
        -    "type": "object"
        -  },
        -  {
        -    "items": {
        -      "additionalProperties": true,
        -      "type": "object"
        -    },
        -    "type": "array"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "additionalProperties": true,
        +    "type": "object"
        +  },
        +  {
        +    "items": {
        +      "additionalProperties": true,
        +      "type": "object"
        +    },
        +    "type": "array"
        +  },
        +  {
        +    "type": "string"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
    • Changedmerit_write_financial_confirm2 fields changed
      • changedInput schema / properties / filters / anyOf
        Previous value: -[
        -  {
        -    "additionalProperties": true,
        -    "type": "object"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "additionalProperties": true,
        +    "type": "object"
        +  },
        +  {
        +    "type": "string"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • changedInput schema / properties / payload / anyOf
        Previous value: -[
        -  {
        -    "additionalProperties": true,
        -    "type": "object"
        -  },
        -  {
        -    "items": {
        -      "additionalProperties": true,
        -      "type": "object"
        -    },
        -    "type": "array"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "additionalProperties": true,
        +    "type": "object"
        +  },
        +  {
        +    "items": {
        +      "additionalProperties": true,
        +      "type": "object"
        +    },
        +    "type": "array"
        +  },
        +  {
        +    "type": "string"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
    • Changedmerit_write_purchases2 fields changed
      • changedInput schema / properties / filters / anyOf
        Previous value: -[
        -  {
        -    "additionalProperties": true,
        -    "type": "object"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "additionalProperties": true,
        +    "type": "object"
        +  },
        +  {
        +    "type": "string"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • changedInput schema / properties / payload / anyOf
        Previous value: -[
        -  {
        -    "additionalProperties": true,
        -    "type": "object"
        -  },
        -  {
        -    "items": {
        -      "additionalProperties": true,
        -      "type": "object"
        -    },
        -    "type": "array"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "additionalProperties": true,
        +    "type": "object"
        +  },
        +  {
        +    "items": {
        +      "additionalProperties": true,
        +      "type": "object"
        +    },
        +    "type": "array"
        +  },
        +  {
        +    "type": "string"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
    • Changedmerit_write_purchases_confirm2 fields changed
      • changedInput schema / properties / filters / anyOf
        Previous value: -[
        -  {
        -    "additionalProperties": true,
        -    "type": "object"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "additionalProperties": true,
        +    "type": "object"
        +  },
        +  {
        +    "type": "string"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • changedInput schema / properties / payload / anyOf
        Previous value: -[
        -  {
        -    "additionalProperties": true,
        -    "type": "object"
        -  },
        -  {
        -    "items": {
        -      "additionalProperties": true,
        -      "type": "object"
        -    },
        -    "type": "array"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "additionalProperties": true,
        +    "type": "object"
        +  },
        +  {
        +    "items": {
        +      "additionalProperties": true,
        +      "type": "object"
        +    },
        +    "type": "array"
        +  },
        +  {
        +    "type": "string"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
    • Changedmerit_write_sales2 fields changed
      • changedInput schema / properties / filters / anyOf
        Previous value: -[
        -  {
        -    "additionalProperties": true,
        -    "type": "object"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "additionalProperties": true,
        +    "type": "object"
        +  },
        +  {
        +    "type": "string"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • changedInput schema / properties / payload / anyOf
        Previous value: -[
        -  {
        -    "additionalProperties": true,
        -    "type": "object"
        -  },
        -  {
        -    "items": {
        -      "additionalProperties": true,
        -      "type": "object"
        -    },
        -    "type": "array"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "additionalProperties": true,
        +    "type": "object"
        +  },
        +  {
        +    "items": {
        +      "additionalProperties": true,
        +      "type": "object"
        +    },
        +    "type": "array"
        +  },
        +  {
        +    "type": "string"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
    • Changedmerit_write_sales_confirm2 fields changed
      • changedInput schema / properties / filters / anyOf
        Previous value: -[
        -  {
        -    "additionalProperties": true,
        -    "type": "object"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "additionalProperties": true,
        +    "type": "object"
        +  },
        +  {
        +    "type": "string"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • changedInput schema / properties / payload / anyOf
        Previous value: -[
        -  {
        -    "additionalProperties": true,
        -    "type": "object"
        -  },
        -  {
        -    "items": {
        -      "additionalProperties": true,
        -      "type": "object"
        -    },
        -    "type": "array"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "additionalProperties": true,
        +    "type": "object"
        +  },
        +  {
        +    "items": {
        +      "additionalProperties": true,
        +      "type": "object"
        +    },
        +    "type": "array"
        +  },
        +  {
        +    "type": "string"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
  3. 15 tool updatesv0.1.0
    • First observedget_setup_instructions
    • First observedmerit_read_financial
    • First observedmerit_read_inventory
    • First observedmerit_read_master_data
    • First observedmerit_read_purchases
    • First observedmerit_read_reports
    • First observedmerit_read_sales
    • First observedmerit_write_customers
    • First observedmerit_write_customers_confirm
    • First observedmerit_write_financial
    • First observedmerit_write_financial_confirm
    • First observedmerit_write_purchases
    • First observedmerit_write_purchases_confirm
    • First observedmerit_write_sales
    • First observedmerit_write_sales_confirm

TDQS

A3.5/5.0

Scored across 11 tools

Disambiguation4/5

Read tools are cleanly partitioned by domain (financial, inventory, master_data, purchases, reports, sales) with little overlap, and the preview/confirm write pairs are clearly distinguished by the _confirm suffix. Only minor conceptual overlap exists between merit_read_financial and merit_read_reports, which both surface monetary data.

Naming Consistency4/5

Names follow a strong merit_read_<domain> / merit_write_<domain> / merit_write_<domain>_confirm pattern throughout. The lone outlier is get_setup_instructions, which breaks both the merit_ prefix and the verb-noun domain convention.

Tool Count5/5

Eleven tools is well-scoped for an ERP surface, and reads are sensibly aggregated into multi-action domain tools (each carrying many sub-actions) rather than exploding into dozens of endpoints. Every tool earns its place.

Completeness3/5

Read coverage is broad across financials, inventory, master data, purchases, reports, and sales. However write operations are limited to customer upsert and sales invoice creation, with no vendor/purchase-order/item writes, no update/delete for existing records, and manual handling of delivery and credit notes leaving notable gaps.

Maintenance

ActivityMaintained
ResponsivenessUnresponsive

Related MCP Connectors

Related MCP Servers

  • A
    license
    B
    quality
    A
    maintenance
    Enables interaction with the Estonian e-arveldaja (RIK e-Financials) REST API to manage financial records like invoices and journal entries using natural language. It supports automating purchase invoice entry from PDFs, reconciling bank transactions, and generating financial reports.
    130
    297 npm
    34
    Apache 2.0
  • A
    license
    Not graded
    quality
    B
    maintenance
    Exposes ~60 tools for the Merit Aktiva accounting API, covering sales/purchase invoices, payments, customers, vendors, items, general ledger, offers, reference data, and reports with both read and write operations.
    8 npm
    MIT
  • A
    license
    Not graded
    quality
    B
    maintenance
    Hosted MCP server for Exact Online. Ask questions, pull reports, and prepare bookings you approve first.
    MIT