supplier-statement-check
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@supplier-statement-checkCompare this supplier statement against our AP ledger and flag missing invoices."
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
Supplier statement reconciliation MCP server
MCP server for supplier statement and vendor statement open-item reconciliation checks against a supplied accounts payable ledger, with exact reference evidence. Compare supplied supplier statement and AP ledger open items, with complete exact-key evidence.
Works with Claude Desktop, Claude Code, Cursor and any Model Context Protocol client. Runs on your own machine: this one has no hosted endpoint, so install it from the bundle or from source.
Product page: https://mcp.zovo.one/s/supplier-statement-check - capabilities, free limits and supported installation paths.
Try the supplier statement open-item comparison in your browser before installing. Field values stay in the browser. It compares supplied open-item exports, not balances or payments, and makes no approval decision.
Install
Claude Desktop, one click. Download supplier-statement-check.mcpb from the bundle catalog and double-click it.
From source. The mirror is self-contained: every @theluckystrike/* dependency is vendored, so a fresh clone builds with no extra setup.
git clone https://github.com/theluckystrike/mcp-supplier-statement-check.git
cd mcp-supplier-statement-check
npm install && npm run buildThen point your client at the built entry point:
{
"mcpServers": {
"supplier-statement-check": {
"command": "node",
"args": ["/absolute/path/to/mcp-supplier-statement-check/dist/index.js"]
}
}
}
@theluckystrike/mcp-supplier-statement-checkis not published on npm yet, so annpx -y @theluckystrike/mcp-supplier-statement-checkcommand will fail. The three paths above are the working ones and each is exercised by CI.

Read-only mirror of mcp-servers/servers/supplier-statement-check. See MIRROR.md.
Compare a supplied supplier statement with an accounts-payable open-item export. Find invoices or credit notes present on only one side, conflicting outstanding amounts or dates, and repeated references that cannot be paired safely. This local MCP server preserves every original row and explains each finding. It checks two supplied open-item lists; it does not reconcile opening/closing balances, match payments, connect to an ERP, read PDFs, or approve payment.
Built by theluckystrike. MIT. Support: support@zovo.one.
Related MCP server: fincon
Try it before installing
Run the free supplier statement example in your browser. Use the synthetic example to inspect missing items and amount/date discrepancies. The browser proof and this server use the same comparison core. No account or API key is needed for the local server's free tier. Product and installation options.
Your task | Start here |
Compare supplier/vendor statement open items with an AP open-item export | This server: |
Find repeated invoice references across supplied invoice history | |
Check invoice lines against a purchase order and accepted receipts |
These comparisons require the relevant source data. They do not retrieve missing documents or authorize a payment. Full diagnostics and CSV remain free; the paid upgrade removes only the limit on saved report count.
Install
Requires Node.js 18 or newer and an MCP client. Claude Desktop can open the
supplier-statement-check.mcpb v0.25.0 package.
Other clients can build the source below. The npm package is not published;
npx @theluckystrike/mcp-supplier-statement-check is not an installation route.
git clone https://github.com/theluckystrike/mcp-servers.git
cd mcp-servers
npm install
node scripts/bootstrap-timezone.mjs
npm run build --workspace @theluckystrike/mcp-license
npm run build --workspace @theluckystrike/mcp-supplier-statement-checkThese commands build only the shared license dependency and this server. Replace
/absolute/path below with the source checkout location. If your MCP client cannot
find node, use its full executable path.
Claude Desktop: merge into mcpServers in
~/Library/Application Support/Claude/claude_desktop_config.json on macOS, or
%APPDATA%\Claude\claude_desktop_config.json on Windows:
{"mcpServers":{"supplier-statement-check":{"command":"node","args":["/absolute/path/mcp-servers/servers/supplier-statement-check/dist/index.js"]}}}Claude Code:
claude mcp add supplier-statement-check -- node /absolute/path/mcp-servers/servers/supplier-statement-check/dist/index.jsCursor: merge into .cursor/mcp.json in the project or ~/.cursor/mcp.json:
{"mcpServers":{"supplier-statement-check":{"type":"stdio","command":"node","args":["/absolute/path/mcp-servers/servers/supplier-statement-check/dist/index.js"]}}}VS Code: put the entry under servers in .vscode/mcp.json:
{"servers":{"supplier-statement-check":{"type":"stdio","command":"node","args":["/absolute/path/mcp-servers/servers/supplier-statement-check/dist/index.js"]}}}Windsurf's legacy Cascade agent: use the Claude Desktop mcpServers entry in
~/.codeium/windsurf/mcp_config.json. That file applies to Cascade; a different
agent can use a different configuration route.
Cline: open MCP Servers, Configure, Configure MCP Servers, and add:
{"mcpServers":{"supplier-statement-check":{"type":"stdio","command":"node","args":["/absolute/path/mcp-servers/servers/supplier-statement-check/dist/index.js"],"disabled":false,"autoApprove":[]}}}These are local stdio configurations. This server has no hosted endpoint or browser
chat connector. Reconnect your client, call license_status, then run the example
below. Tool discovery alone does not verify a comparison.
Tools
Tool | Input and result |
|
|
| Optional |
| Saved |
| Saved/preview |
| Saved |
| Saved/preview |
| No arguments; current offline tier and upgrade link. |
|
|
A missing item and a conflicting amount
Call supplier_statement_check with these synthetic inputs:
{
"as_of": "2026-10-26",
"statement_records": [
{"record_id":"S1","entity_id":"UK-1","supplier_id":"V-9","currency":"USD","document_type":"invoice","document_reference":"INV-001","document_date":"2026-10-01","outstanding_minor":12500},
{"record_id":"S2","entity_id":"UK-1","supplier_id":"V-9","currency":"USD","document_type":"invoice","document_reference":"INV-002","document_date":"2026-10-02","outstanding_minor":20000},
{"record_id":"S3","entity_id":"UK-1","supplier_id":"V-9","currency":"USD","document_type":"credit_note","document_reference":"CR-003","document_date":"2026-10-03","outstanding_minor":5000}
],
"ledger_records": [
{"record_id":"L1","entity_id":"UK-1","supplier_id":"V-9","currency":"USD","document_type":"invoice","document_reference":"INV-001","document_date":"2026-10-01","outstanding_minor":12500},
{"record_id":"L2","entity_id":"UK-1","supplier_id":"V-9","currency":"USD","document_type":"invoice","document_reference":"INV-002","document_date":"2026-10-04","outstanding_minor":19000},
{"record_id":"L4","entity_id":"UK-1","supplier_id":"V-9","currency":"USD","document_type":"invoice","document_reference":"INV-004","document_date":"2026-10-05","outstanding_minor":7000}
],
"save": false
}The result has four groups: one match, one discrepancy with both amount_mismatch
and date_mismatch, one item only in the statement, and one only in the ledger.
Every supplied row remains available. The credit note's amount is positive and is
not netted against invoices. No balance, loss or recoverable amount is calculated.
If you add another INV-001 within either side's exact scope, its entire group
becomes ambiguous_reference; the tool does not choose the convenient amount pair.
Exact input contract and comparison rules
Supply a real YYYY-MM-DD as_of date and two arrays, each with 0–1000 records.
At least one side must contain a record. The date declares the intended common
snapshot; the tool cannot verify export freshness and does not filter rows by date.
Prepare both lists with consistent open-item scope before comparing them.
Each record requires record_id, entity_id, supplier_id, uppercase three-letter
currency, document_type (invoice or credit_note), document_reference, real
ISO document_date, and positive safe-integer outstanding_minor. IDs/references
are 1–160 characters without surrounding whitespace or control characters. IDs
must be unique within a side; the two sides may use the same ID. Unknown fields,
impossible dates, year 0000, zero/negative/decimal/unsafe amounts and over-limit
arrays are rejected. Currency syntax is checked without an external currency list.
Amounts are currency minor units: USD 12500 means $125.00. Credit notes use positive
absolute outstanding amounts and compare only with credit notes. Neither side is
required to use a common supplier name, but its exact supplier_id must agree.
Different entities, suppliers, currencies and document types remain separate.
The join key is exact (entity_id, supplier_id, currency, document_type, document_reference). Leading zeros, punctuation, case, accents, Unicode forms and
lookalike characters remain significant. No supplier inference, reference cleanup,
greedy amount matching, payment allocation or currency conversion occurs.
Group status | Meaning |
| Exactly one row on each side; key, outstanding amount and document date agree. |
| One statement row has no exact-key ledger row. |
| One ledger row has no exact-key statement row. |
| Exactly one row on each side shares a key, but amount and/or date differs; |
| A key repeats on either side; all rows are retained without selecting pairs. |
Missing rows and disagreements can result from export timing or scope. Repeated
references can be legitimate. Even complete agreement between supplied lists is not
proof that the supplier balance is correct: two incomplete exports can agree. The
status no_discrepancies_in_supplied_open_items makes only that limited observation.
Saved reports never become hidden cross-call history; include both lists every time.
Groups and rows are deterministically sorted. Each source row belongs to exactly one group; the engine does not expand every possible record pair. A group refers to source IDs qualified by their statement/ledger side, so identical IDs across sides cannot overwrite evidence. No network or telemetry requests are made.
Free evidence, previews and CSV
Every check returns retrieval.report_id. Unsaved previews use preview:<UUID> and
remain in memory for 30 minutes for the last two checks in this process. A third
check, restart or expiry may evict a preview; resubmit the free check. Saved UUIDs
persist on disk. Preview data is not written to a browser or filesystem.
report_page supports statement_records, ledger_records, groups, and
group_members. Group pages contain summary metadata and side-specific member
counts. Read complete source members with section:"group_members" and the exact
group_id. Follow next_offset until null. Pages and CSV remain free even after
the saved-report cap is reached.
Responses use a 512 KiB escaped MCP text-envelope budget. Larger reports return a
paginated overview; pages can contain fewer rows than requested to fit that budget.
CSV uses one row per original source record with its side, original fields, group
and reasons. Formula-like text is escaped; JSON source values are unchanged. Export
returns CSV text, never writes to a supplied filename, and repeats the header on
each page. Retain one header when joining pages. Follow actual returned and
next_offset values rather than assuming the requested count was returned.
Free and Pro
Capability | Free | Pro |
Complete checks, discrepancy reasons and original source rows | Included, 1000 records per side | Same |
Preview pages and CSV | Included | Same |
Saved report count | 3 | No report-count cap |
Aggregate saved storage | 64 MiB | 64 MiB |
Per-file integrity bound | 8 MiB | 8 MiB |
Input, response, text and preview limits | Same documented bounds | Same |
save:true at the free cap returns the diagnostic and free preview with
saved:false, save_error:"free_saved_report_cap", and an upgrade link. Delete a
saved report to reuse a slot. Storage failures also preserve the diagnostic.
Get Pro: $19 one time.
All servers: $39 bundle. Set MCP_LICENSE_KEY or
call license_activate; keys verify offline. Pro removes only the saved-report
count cap. It adds no accounting data, accuracy guarantee, ERP access or safety
approval. The saved-history upgrade is a commercial hypothesis, not proven ROI.
All data stays local. Reports live under
${XDG_DATA_HOME:-~/.local/share}/mcp-servers/supplier-statement-check/.
XDG_DATA_HOME must be absolute with real directory ancestors. Private JSON files
are written atomically with cross-process mutation locks. Reads validate original
inputs and recompute evidence rather than trusting edited results. License
activation writes the shared local license configuration. Manage accounting-data
access, retention and backups yourself.
Development
npm run build --workspace @theluckystrike/mcp-supplier-statement-check
npm test --workspace @theluckystrike/mcp-supplier-statement-checkBuild Docker from the monorepo root with
docker build -f servers/supplier-statement-check/Dockerfile .. The standalone
mirror receives its own self-contained Dockerfile during mirror generation.
Tests cover the comparison oracle, strict inputs, scope/Unicode isolation, complete
source coverage, ambiguity, large free pages/CSV, safe storage, concurrent save
caps and actual stdio calls. Signed-license tests use the existing local private
signer when available and skip if it is absent. Private signing keys are not
packaged or required by users.
Available Tools
8 toolslicense_activateActivate licenseA
Activate a Pro key (MCPL1.xxx.yyy) from checkout: verified offline against a built-in public key, saved to your config file. A wrong, malformed or expired key is refused, unsaved. license_status reads it back.
| Name | Required | Description | Default |
|---|---|---|---|
| key | Yes | License key from the checkout confirmation page |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full behavioral burden. It discloses that verification happens offline against a built-in public key, that the key is persisted to the config file, and that invalid keys are refused and left unsaved. This is substantial transparency for an activation tool, though it could mention overwriting an existing key or the exact return behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences with no filler. The first sentence front-loads the main action, source, verification method, and persistence. The second sentence efficiently covers error handling and points to the related read-back tool. Every clause adds value.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given a single-parameter tool with no output schema and no annotations, the description covers activation behavior, verification mechanism, persistence, error outcomes, and how to read the result later. The only minor gap is an explicit statement of what the function returns upon success or failure, but the phrase 'refused, unsaved' implies a feedback mechanism. Overall, it is sufficiently complete for an agent to call it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema already documents the 'key' parameter at 100% coverage, so the baseline is 3. The description adds meaningful semantics by giving the concrete key format ('MCPL1.xxx.yyy'), confirming the key comes from the checkout page, and explaining that malformed or expired keys will be rejected. This goes beyond the schema's one-line description.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific action ('Activate a Pro key'), the exact key format ('MCPL1.xxx.yyy'), the source ('from checkout'), and the core mechanism ('verified offline against a built-in public key'). It also differentiates itself from the sibling license_status by noting that license_status reads the activation back, so there is no ambiguity about which tool does what.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives clear context: use this when you have a Pro key from checkout that needs to be activated. It also points to license_status as the read-back tool, which implies when to use a related sibling. It does not explicitly spell out 'do not use for checking status' or list other alternatives, but the context is strong enough to avoid misuse.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
license_statusLicense statusA
Report this server's licence state: product, tier free or pro, licence id, expiry, the key source and the upgrade URL. No arguments, no network. Explains a free-tier refusal; license_activate installs a key.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations are absent, so the description carries the full burden of behavioral disclosure. It discloses that the call is local ('no network') and argument-free, and it mentions a specific explanatory behavior. The word 'Report' implies read-only, though it does not explicitly state non-destructive or permission requirements; this is adequate for a status command.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences with no filler. The first sentence lists the output fields; the second adds constraints and the sibling pointer. Every clause contributes meaningful information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-parameter status tool with no output schema, the description lists the expected output fields, behavioral constraints, and the relevant alternative tool. Nothing an agent needs to call it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema has zero parameters and the description reinforces this with 'No arguments'. It adds value by listing the reported fields, helping an agent understand what the empty input will yield. The baseline for zero-parameter tools is high, and the description meets it.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('Report'), a clear resource ('this server's licence state'), and enumerates the exact fields returned. It also names the sibling 'license_activate' as the tool that does something different, so an agent can distinguish them immediately.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives explicit usage constraints: no arguments, no network, and explains a free-tier refusal. It also directs the agent to license_activate when the task is to install a key, serving as an explicit pointer to the relevant alternative.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
report_deleteDelete one saved open-item checkADestructive
Delete one local comparison report and free a saved-report slot. Does not alter accounting records.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true and idempotentHint=false, so the description's job is to add scope, and it does: deletion frees a saved-report slot (a side effect not visible in the schema) and explicitly does not touch accounting records. It stops short of stating irreversibility or what happens when the id does not exist.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences, front-loaded with the action and followed by the material blast-radius caveat. Nothing redundant or padded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-parameter destructive tool with full annotation coverage and no output schema, the description supplies the essential context: what is removed, what side effect occurs, and what is unaffected. Only irreversibility and not-found behavior are left unaddressed.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description carries the burden for the single 'id' parameter and says nothing about it. However, the schema's strict UUID-v4 pattern is self-documenting enough that an agent can supply a valid value, and 'one local comparison report' makes clear the id selects a single report.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description gives a specific verb and resource ('Delete one local comparison report') that maps cleanly onto the tool name, and it distinguishes the target as a local saved report rather than an accounting record. It does not explicitly name or contrast with siblings like report_get or report_list, but the delete semantics are unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied: it is for removing an unwanted saved report and freeing a slot, and the caveat that accounting records are untouched hints this is a cleanup action rather than a data-correction one. There is no explicit when-to-use/when-not guidance or reference to an alternative tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
report_export_csvExport complete open-item evidence as CSVARead-onlyIdempotent
Export free CSV pages from a saved report or unsaved preview. One row per supplied source item, with side, group and issues. Formula-like cells are escaped; no amount-loss or balance total is calculated.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | ||
| limit | No | ||
| offset | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover safety (readOnly, idempotent, non-destructive), and the description adds genuine value beyond them: formula-like cells are escaped and no amount-loss or balance total is computed, which tells the agent the output is not a reconciled financial total. It does not state response format or pagination metadata, keeping this short of a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two dense sentences with no filler, front-loading the export action and following with row-granularity and escaping behavior. Slightly harmed by the vague qualifier 'free', which costs a word without adding meaning.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description carries full burden of explaining the return value; it says one row per source item with side, group and issues, which is helpful, but stays silent on the CSV payload shape, pagination signaling, and how a 'preview:' id contrasts behaviorally with a saved report id.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the schema gives only types, defaults and a pattern without meaning. The description partially compensates by implying pagination ('pages') and the preview-vs-saved id distinction, but never explains limit/offset semantics or the 2000 cap, leaving the agent to read the schema constraints unaided.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb+resource (export CSV of a report) and adds scope detail about one row per source item with side, group and issues. It implicitly separates itself from report_page via the CSV export framing, but never names the sibling alternative explicitly, and the word 'free' is ambiguous in context.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is only implied: 'from a saved report or unsaved preview' hints at when the id is a preview token versus a saved report, but there is no explicit when-to-use, when-not, or reference to report_page/report_get for the non-export path. An agent must infer the routing decision from sibling names alone.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
report_getRead a saved open-item checkCRead-onlyIdempotent
Read a saved comparison with complete source evidence. Large reports return free paging instructions.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, non-destructive, closed-world, so safety is covered. The description adds real value by disclosing that results include 'complete source evidence' and that large reports return paging instructions, but it says nothing about what happens with an unknown or expired id.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short, front-loaded sentences with no filler; the core read behavior comes first and the paging note follows. Minor deduction because the second sentence is somewhat cryptic out of context.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description carries the burden of explaining returns, which it only partly does ('complete source evidence', paging). It omits where the id comes from and how this differs from report_list/report_page, leaving gaps for an agent choosing among seven sibling tools.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0% — the single `id` parameter is documented only by a UUID v4 regex pattern with no prose. The description never explains what the id identifies (a saved report id presumably from report_list), so it fails to compensate for the schema gap.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The verb 'Read' and the object 'a saved comparison' give a rough sense of the operation, but 'saved comparison' is vague relative to the tool's actual title ('saved open-item check'). Nothing distinguishes it from siblings like report_page or report_list, which an agent must infer from name alone.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no explicit when-to-use or when-not-to-use guidance. The clause 'Large reports return free paging instructions' faintly implies that paging is handled elsewhere (report_page), but no sibling is named and no selection criteria are given.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
report_listList saved open-item checksARead-onlyIdempotent
List saved report ids, timestamps and review-group counts. Free on both tiers; up to 100 reports per page.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| offset | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/non-destructive, so the safety profile is covered. The description adds genuinely non-derivable behavior: the call is free on both pricing tiers and is capped at 100 reports per page, which affects how an agent should plan paging and cost. It stops short of stating ordering or whether a total count is returned.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences with zero filler; the resource and returned fields come first and the cost/paging constraints follow. Nothing is repeated from the schema or annotations.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema and no parameter descriptions, the description does some heavy lifting by naming the returned fields, but leaves ordering, total-count behavior, and how to advance pages unstated. Adequate for a minimal list tool, but an agent still has open questions about paging through results.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the bare 'limit' and 'offset' properties carry no documented meaning. 'Up to 100 reports per page' partially compensates by tying page size to the limit parameter and implying offset-based paging, but it never explains offset semantics or default page size (20).
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (list) and resource (saved reports) and even enumerates the returned fields (ids, timestamps, review-group counts), which is more concrete than the vague title 'saved open-item checks'. It does not name or contrast with the obvious siblings (report_get, report_page, report_export_csv), so the agent must infer that this is the index-list call.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no explicit when-to-use or when-not-to-use guidance, and none of the siblings (report_get, report_page, report_export_csv) are referenced. 'Up to 100 reports per page' hints at paging but never tells the agent whether to page through this tool or use report_page instead.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
report_pageRead complete open-item evidence pagesCRead-onlyIdempotent
Read free pages of either source list, group summaries or one group’s source members. Unsaved previews last 30 minutes for the last two checks in this process.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | ||
| limit | No | ||
| offset | No | ||
| section | Yes | ||
| group_id | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, destructiveHint=false, and openWorldHint=false, so the safety profile is covered. The description adds one useful behavioral fact: unsaved previews last 30 minutes. However, it does not explain what a preview is, which sections produce previews, or how pagination interacts with preview expiry, and the phrase 'last two checks' is ambiguous.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is short and front-loads the read operation, but the second sentence is cryptic and the phrase 'free pages' is vague. Two sentences do not feel padded, yet they leave the reader with unresolved ambiguity rather than crisp operational guidance.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a paginated read tool with five parameters, zero schema descriptions, and no output schema, the description is insufficiently complete. It does not explain how to page through results, how section values map to the described content types, the role of group_id, or what preview identifiers look like. The 30-minute TTL is a useful fragment but does not compensate for the missing operational context.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0% for five parameters, so the description must compensate but mostly does not. It hints at section categories but never names the enum values or explains that group_id is required when section is group_members. The id format (report vs preview), limit maximum, and offset semantics are undocumented in both schema and description.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a read operation over pages of source lists, group summaries, or group members, which loosely maps to the section enum. However, the phrasing 'source list' and 'one group’s source members' does not align with the actual section values (statement_records, ledger_records, groups, group_members), leaving the agent to infer the mapping. It is distinguishable from report_list and report_get as a paginated section reader, but only weakly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no guidance on when to use report_page versus report_get, report_list, or report_export_csv. The mention of 'the last two checks in this process' is cryptic and does not clarify the selection criteria. No prerequisites, pagination continuation guidance, or exclusions are provided.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
supplier_statement_checkCompare supplier statement and AP open itemsC
Compare two supplied open-item lists of up to 1000 records each by exact entity, supplier, currency, document type and reference. Flag missing-side items, amount/date discrepancies and ambiguous repeated references. All evidence is free; no balance or payment approval.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already state that the tool is not read-only, non-destructive, non-idempotent and closed-world, so the description need not repeat safety traits. The description adds useful matching behavior and flag categories, but it is unclear how the 'supplied' lists are provided given the empty schema, and the closing statement about free evidence and no approval is ambiguous.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The definition is compact and front-loads the comparison criteria, which is good. The final sentence ('All evidence is free; no balance or payment approval') is cryptic and its relevance is not obvious, weakening an otherwise tight structure.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a comparison tool with no parameters and no output schema, the description should clarify how the two lists are supplied and what the result contains. It gives matching dimensions and flag types but leaves the core input mechanism unexplained and does not describe return values.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema has zero parameters, which would normally warrant a baseline of 4. However, the description explicitly refers to two supplied open-item lists of up to 1000 records each, implying input data that the empty schema does not represent, creating a material semantic mismatch.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: comparing two supplier/AP open-item lists, with named matching keys (entity, supplier, currency, document type, reference). It is clear what the tool does, though it does not explicitly differentiate itself from the sibling report/license tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no guidance on when to use this tool versus alternatives or what prerequisites must be met. The phrase 'two supplied open-item lists' implies inputs but never explains how or where those lists are supplied.
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.
8 tool updates
v0.25.0- First observed
license_activate - First observed
license_status - First observed
report_delete - First observed
report_export_csv - First observed
report_get - First observed
report_list - First observed
report_page - First observed
supplier_statement_check
TDQS
Scored across 8 tools
The tools are mostly distinct: license tools, the core comparison tool, and report tools have clear separate purposes. The main overlap is between report_get, report_page, and report_export_csv, but the descriptions clarify saved reports, paged evidence, and CSV export well enough to avoid serious confusion.
All tools use snake_case and generally follow a resource-prefix pattern (license_*, report_*, supplier_statement_check). Minor deviation: license_status names a state rather than an action, while other tools use action-oriented suffixes.
Eight tools is well-scoped for a supplier statement checking server with licensing and report handling. Each tool appears to earn its place without excessive surface area.
The set covers license state/activation, the core comparison operation, and report listing, retrieval, paging, deletion, and CSV export. A minor gap is the lack of an explicit save/create-report tool, though report persistence may be implicit in supplier_statement_check.
Maintenance
Related MCP Connectors
Reconcile business documents, inspect exact differences and evidence, and export reports.
Mechanically reconcile supplied purchase-order lines, invoice lines and goods receipts under expl...
Match bank receipts and payments to invoices with confidence, deductions and exceptions.
Turn bank statement PDFs into categorized, balance-checked transactions and reports.
Related MCP Servers
- FlicenseNot gradedqualityDmaintenanceSelf-serve MCPB demo for accounts payable invoice exception review. It performs deterministic matching across invoice, purchase order, goods receipt, vendor master, invoice history, tax code master, and payment rules.-
- FlicenseBqualityBmaintenanceEnables AI assistants to perform financial reconciliation with a deterministic proof engine: intake files, match transactions, verify proofs, resolve exceptions, and sign off on balanced journals under the user's authority.21-
- AlicenseAqualityBmaintenanceEnables LLM agents to query and reconcile an accounts-payable ledger through safe read-only SQL, deterministic invoice-to-payment matching, and exception explanations for underpayments, duplicates, currency mismatches, and overdue invoices. Ships with a synthetic ledger, golden-set evals, and a month-end review workflow so quality can be measured in CI.4MIT
- AlicenseAqualityAmaintenanceEnables users to review a supplied batch of supplier invoices or vendor bills for repeated references, normalized reference variations, and identical amount-and-date candidates, returning grouped evidence and exact review reasons from local history. Supports saved reports, CSV export, and use with MCP clients such as Claude Desktop, Claude Code, and Cursor.8MIT