icount-mcp
This server lets an AI agent connect to an iCount Israeli accounting account to manage documents and clients via MCP.
Verify the API token/connection with
icount_test_connection.Create documents (invoices, receipts, orders, offers, deliveries, etc.) with line items, client details, payments, and optional emailing.
Search documents by type, status, client, date range, or number; fetch full document details.
Cancel, close/mark-paid, and convert documents between types; get printable PDF URLs.
Create, update, fetch, list, and permanently delete client records.
List a client's open/unpaid documents (outstanding balance).
Supports read/write annotations and irreversible-operation warnings so MCP clients can prompt appropriately.
Provides tools for creating and managing iCount accounting documents and clients, enabling AI agents to interact with iCount's API for invoicing, receipts, orders, offers, and client management.
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., "@icount-mcpCreate an invoice for a new client named ACME for 1,500 ILS"
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.
icount-mcp
An MCP server for iCount — Israeli cloud accounting/invoicing software. Lets any MCP-compatible AI agent (Claude Code, Claude Desktop, Cursor, Windsurf, n8n, etc.) create and manage iCount documents (invoices, receipts, orders, offers...) and clients directly from a conversation.
Runs as a local stdio server — no hosting, no OAuth flow, just a static API token.
Unofficial, community-built integration. Not affiliated with or endorsed by iCount. You are responsible for the documents and data this creates in your own iCount account.
Keep your MCP client's tool-approval prompts on for this server. It acts on real financial records, and
icount_cancel_document/icount_delete_clientare irreversible. See SECURITY.md.
Requirements
Node.js 18+
An iCount account with an API Token (not your login user/pass — see below)
Related MCP server: FreeAgent MCP Server
Getting your API token
Log in to your iCount account.
Go to אזור אישי → הגדרות → API (Personal area → Settings → API).
Create a new API Token.
Copy it — you'll need it below. It looks like
API3E8-XXXXXXXX-XXXXXXXX-XXXXXXXXXXXXXXXX.
This is iCount API v3, which authenticates with a single static Bearer token — unlike the legacy
create_doc.php API, which used cid/user/pass. Only the token works with this server.
Install
Nothing to clone or install — npx fetches and runs it on demand. Just add it to your MCP client
config with your token:
{
"mcpServers": {
"icount": {
"command": "npx",
"args": ["-y", "icount-mcp"],
"env": {
"ICOUNT_API_TOKEN": "API3E8-XXXXXXXX-XXXXXXXX-XXXXXXXXXXXXXXXX"
}
}
}
}That file is .mcp.json in your project (Claude Code), claude_desktop_config.json (Claude Desktop),
~/.cursor/mcp.json (Cursor), or the equivalent for your client. On Windows, some clients need
"command": "npx.cmd".
Claude Code
claude mcp add icount --env ICOUNT_API_TOKEN=API3E8-... -- npx -y icount-mcpPin a version
npx -y icount-mcp always runs the latest published version. To pin:
{ "command": "npx", "args": ["-y", "icount-mcp@0.3.1"] }Or install it once, globally, and skip the npx download entirely:
npm install -g icount-mcp{ "command": "icount-mcp", "env": { "ICOUNT_API_TOKEN": "API3E8-..." } }From source (development)
git clone https://github.com/davidkotler/icount-mcp.git
cd icount-mcp
npm install
cp .env.example .env # then paste your token into it{ "command": "node", "args": ["/absolute/path/to/icount-mcp/src/index.js"] }npm test # offline: no iCount account or network neededThe token can come from either the env block or a .env file — the env block wins when both are
set. A .env is looked for next to the package and in the working directory; with npx you'll want
the env block.
Configuration
Variable | Required | Default | What it does |
| yes | — | Your iCount API v3 token |
| no |
| Per-request timeout, clamped to 1s–300s |
Verify it's working
Ask your agent to "test the icount connection" — it should call icount_test_connection and get back
basic account/API info.
Tools
Documents
Tool | What it does | |
| Verify the token works | read |
| Create an invoice, receipt, order, offer, etc. | write |
| Search documents by type, status, client, date range (needs ≥1 filter) | read |
| Fetch full details of one document | read |
| Cancel a document (iCount has no hard delete) | ⚠️ irreversible |
| Mark a document closed/paid | write |
| Convert a document to another type (e.g. offer → order) | write |
| Get a printable/viewable PDF URL | read |
Clients
Tool | What it does | |
| Create a client record directly (no document) | write |
| Update an existing client's fields | write |
| Fetch a client's details | read |
| List clients (bounded — returns | read |
| Really delete a client — no cancel-only restriction here | ⚠️ irreversible |
| One client's outstanding/unpaid documents (needs a client id/email/name) | read |
Every tool carries MCP tool annotations
(readOnlyHint / destructiveHint / idempotentHint / openWorldHint), so a well-behaved client
knows which calls are safe to run without asking and which need your confirmation.
Document types (doctype): invoice, invrec (חשבונית מס-קבלה), receipt, refund, order, offer,
delivery, deal.
⚠️ Important: real tax documents need a payment breakdown
invoice, invrec, receipt, and refund are real fiscal documents. Creating them without a
payment object will fail with an opaque "יצירת המסמך נכשלה" ("document creation failed") error —
even though the client record may already have been created as a side effect before validation failed.
{
"doctype": "receipt",
"clientName": "Some Client",
"items": [{ "description": "Service", "quantity": 1, "unitprice": 100 }],
"payment": { "method": "cash", "sum": 100 }
}payment.method is one of cash, creditcard, cheque, banktransfer. For testing purposes, prefer
order or offer doctypes instead — they're non-tax documents with no payment requirement, and (like
all iCount documents) can't be hard-deleted, only cancelled.
Search quirks
iCount's doc/search has two behaviours worth knowing about, both verified against a live account:
At least one filter is required. An unfiltered search is rejected; pass a
doctype, client,docnum, or date range. This server catches that locally, without a wasted round trip.A very broad date range can be refused with
too_many_results. Narrow the range or add filters —maxResultsdoes not raise iCount's server-side limit.
A search that legitimately matches nothing returns { "docs": [], "matched": 0 }. iCount itself
reports that case as a failure; this server normalises it to an empty result so your agent doesn't
conclude something broke.
Development notes / how this was verified
iCount's public documentation (apiv3.icount.co.il/docs/iCount/) is a JS-rendered Postman page that
isn't easy to scrape. The endpoint map used here (/api/v3.php/<module>/<method>) was cross-checked
against the open-source n8n-nodes-icount node (MIT
licensed) and then empirically verified against a live iCount account: every tool in this server was
exercised end-to-end (including a full create → update → delete client lifecycle, and a real receipt
creation + cancellation) before being shipped.
Security
Short version: this is a local stdio server that talks only to a hardcoded https://api.icount.co.il,
never logs your token, redacts it from error messages, times out every request, and keeps stdout
reserved for JSON-RPC. It adds no confirmation step of its own — the model can call every tool, so
leave your client's approval prompts on. Full threat model in SECURITY.md.
Roadmap / not yet implemented
Client contacts (
client/get_contacts,add_contact,update_contact,delete_contact)Client upsert-by-VAT/email (
client/find+client/create_or_update)doc/update_doc_income_type,doc/list(superseded here by the more flexibledoc/search)Expenses, suppliers, inventory, CRM, and time-tracking modules (separate iCount API areas entirely)
Contributing
PRs welcome — see CONTRIBUTING.md for setup, how to verify a change against a
live account without wrecking it, and what CI enforces. main is protected: fork, branch, and open
a PR. Please also read the Code of Conduct.
Security issues go to a private advisory, never a public issue.
License
MIT
Available Tools
14 toolsicount_cancel_documentCancel documentADestructive
Cancel an existing document (iCount has no hard delete — this is the only way to void one). Irreversible: confirm the document number with the user before calling.
| Name | Required | Description | Default |
|---|---|---|---|
| docnum | Yes | The document number as shown in iCount | |
| reason | No | Cancellation reason, stored on the record | |
| doctype | Yes | ||
| refundCc | No | Also reverse the credit-card charge, if any (fails if there wasn't one) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark destructiveHint=true, but the description adds the irreversibility warning and instructs to confirm the document number with the user. This is valuable behavioral context beyond the annotations, specifying a safety precaution.
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 fluff. It front-loads the core purpose, then adds the critical irreversibility warning. Every word earns its place.
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?
It provides essential context: the only way to void, irreversibility, and a user-confirmation requirement. It doesn't describe success/failure behavior but that's acceptable for a cancellation tool, and the output schema is absent. The description is sufficient for correct invocation.
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 75% (doctype has no description but has enum). The description adds no parameter-specific information—it doesn't elaborate on docnum, reason, or refundCc. Since the schema already covers most parameters, a baseline of 3 is appropriate.
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 clearly states the action: "Cancel an existing document". It further differentiates from siblings by noting iCount has no hard delete and this is the only way to void one, which distinguishes it from close, convert, or other document operations.
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?
It explicitly states this is the only way to void a document, giving strong usage context. It doesn't name alternative tools but the statement implies when to use (when voiding) and when not (for other operations). This is clear enough for an agent to select it appropriately.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
icount_close_documentClose documentA
Mark a document as closed/paid, optionally linking it to base documents it settles.
| Name | Required | Description | Default |
|---|---|---|---|
| docnum | Yes | The document number as shown in iCount | |
| basedOn | No | Base documents this closure settles, e.g. an offer this order fulfills | |
| doctype | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations indicate non-readonly, non-destructive, open-world, non-idempotent. The description aligns: it marks as closed/paid, which is a mutation but not destructive. It adds meaningful context: linking base documents settles them, implying a relationship update. It does not contradict; it clarifies the state transition and the optional linkage, which is 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, concise sentence that captures the core functionality and the key optional aspect (linking base documents) without extraneous detail. It is front-loaded with the primary action and outcome. No wasted words.
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 the tool's moderate complexity (3 params, nested objects in basedOn), the description is quite complete. It does not describe return values (no output schema), but that is acceptable. It covers the main purpose and the optional behavior of basedOn. It lacks details on edge cases or side effects, but for a closure operation, the description sufficiently informs the agent.
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 coverage is 67%: doctype and docnum are documented in the schema with descriptions ('The document number as shown in iCount'). The description adds value for 'basedOn' by explaining its purpose ('Base documents this closure settles, e.g. an offer this order fulfills'), which goes beyond the schema's 'Base documents this closure settles'. However, it does not clarify the exact structure of 'basedOn' beyond what schema provides.
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 clearly states the action ('Mark a document as closed/paid') and the resource ('document'), with a specific outcome. It distinguishes from siblings like icount_cancel_document (cancels vs closes) and icount_convert_document (converts vs closes) implicitly, though it does not explicitly name alternatives. The verb 'Mark' is specific enough to indicate a state change rather than full deletion or creation.
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 a clear sense of when to use it: to close a document, optionally linking base documents. It distinguishes from creation and cancellation by context, but it does not explicitly state when not to use it (e.g., for cancellation) or name alternatives. It implies usage in the context of finalizing a document after it is paid or fulfilled.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
icount_convert_documentConvert documentA
Convert a document to another type (e.g. offer -> order). Omit conversionType to first list the valid conversion options for this document; pass one of those values back in conversionType to perform the actual conversion.
| Name | Required | Description | Default |
|---|---|---|---|
| docnum | Yes | The document number as shown in iCount | |
| doctype | Yes | ||
| conversionType | No | A value returned by a prior call to this tool without conversionType |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate this is a mutating, non-idempotent operation. The description adds the discovery mechanism (listing options first), which is a behavioral trait beyond annotations. However, it does not disclose side effects such as whether the original document is modified or if a new one is created, nor does it mention error conditions. With annotations present, the added value is moderate, so a 3 is appropriate.
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 zero filler. It front-loads the primary action, then immediately explains the necessary two-step usage. Every sentence earns its place, making it highly concise and well-structured.
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?
The description covers the essential usage pattern completely, including the discovery step and the actual conversion. It does not detail return values (no output schema) or prerequisites like document existence, but these are not critical for an agent to invoke the tool correctly. The two-step workflow is fully explained, which is the main complexity.
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 coverage is 67% (docnum and conversionType have descriptions; doctype is only an enum). The description adds critical semantics for conversionType by explaining the two-step workflow, which goes beyond the schema's simple 'value returned by a prior call'. This enriches the parameter understanding and justifies a score above the baseline 3.
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 clearly states the action (convert a document to another type) with a concrete example (offer -> order). It distinguishes this tool from siblings like create, cancel, or close because conversion is a unique operation. The verb and resource are specific and 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?
The description explicitly explains the two-step usage pattern: omit conversionType to list valid options, then pass one back to perform the conversion. This is clear guidance on how to invoke the tool correctly. While it doesn't mention alternatives, the operation is distinct from sibling tools, so no exclusion is needed.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
icount_create_clientCreate clientA
Create a new client/recipient record directly, without also creating a document.
| Name | Required | Description | Default |
|---|---|---|---|
| city | No | ||
| name | Yes | Client name | |
| No | |||
| notes | No | ||
| phone | No | ||
| vatId | No | VAT/ID number (ח.פ / ע.מ) | |
| mobile | No | ||
| address | No | ||
| paymentTerms | No | Payment terms in days | |
| customClientId | No | Your own external id for this client |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate readOnlyHint=false, openWorldHint=true, idempotentHint=false, and destructiveHint=false, so the description does not need to restate these. It adds a minor behavioral distinction ('without also creating a document') but does not disclose potential side effects (e.g., whether a client ID is returned, or any uniqueness constraints). This is adequate but not rich.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, concise sentence that front-loads the core action and key distinction. There is no wasted text, and it is easy to parse quickly.
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 create operation with 10 parameters and no output schema, the description is minimal but functional. It does not mention return values (e.g., the new client ID) or potential errors, and it does not point to related tools for verification. Given the complexity, more guidance (e.g., noting that the client ID is returned and can be used in subsequent calls) would improve completeness.
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 only 40% (name, vatId, paymentTerms, customClientId have descriptions). The tool description adds no extra meaning for the remaining six parameters, such as `paymentTerms` interpretation or `customClientId` usage. Given the low coverage, the description should compensate but does not, leaving agents dependent on parameter names alone.
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 clearly states the action ('Create a new client/recipient record') and explicitly distinguishes it from creating a document. This differentiates it from sibling tools like icount_create_document, making the purpose 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?
The description implies when to use this tool ('directly, without also creating a document'), signaling this is the right choice when only a client record is needed. However, it does not explicitly mention alternatives like icount_update_client for existing clients or note any prerequisites, leaving some inference to the agent.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
icount_create_documentCreate documentA
Create a document (invoice, receipt, order, offer, etc.) in iCount. Prefer non-tax types (order/offer) for testing since iCount has no hard delete, only cancel. Real tax documents (receipt/invrec) require a payment breakdown or iCount will reject them.
| Name | Required | Description | Default |
|---|---|---|---|
| lang | No | Document language (default he) | |
| items | Yes | Line items for the document | |
| doctype | Yes | iCount document type | |
| dueDate | No | Due date | |
| payment | No | Required for real tax documents (receipt/invrec) — iCount rejects those doctypes without an actual payment breakdown. Not needed for order/offer/delivery/deal. | |
| clientId | No | Existing iCount client id — reuses that client instead of creating/matching by name | |
| comments | No | Free-text note printed on the document | |
| currency | No | Currency code, e.g. ILS, USD (default ILS) | |
| issueDate | No | Issue date, defaults to today | |
| sendEmail | No | Email the document to the client after creation | |
| clientCity | No | ||
| clientName | No | Client name (used when clientId is not given) | |
| clientEmail | No | ||
| clientPhone | No | ||
| clientVatId | No | Client VAT/ID number (ח.פ / ע.מ) | |
| clientAddress | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate readOnlyHint=false, destructiveHint=false, idempotentHint=false, and openWorldHint=true. The description adds valuable behavioral context: iCount has no hard delete (only cancel), and tax documents are rejected without a payment breakdown. It also implicitly warns that creation may have side effects (email sending, no deletion). It doesn't mention rate limits or auth, but the annotations cover the safety profile, so a 4 is appropriate.
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, front-loaded with the core purpose, and every sentence earns its place. The first sentence states what the tool does; the second provides critical usage guidance. No fluff, no repetition of schema details.
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 complex tool with 16 parameters, nested objects, and no output schema, the description covers the most important behavioral constraints (payment requirement, no hard delete, testing preference). It doesn't describe the return value, but with no output schema, that's a gap. However, the description is strong enough on the critical decision points that an agent can call it correctly. A 4 is fair.
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 75%, so the schema already documents most parameters. The description adds meaning beyond the schema by explaining the payment requirement for tax documents and the testing preference for non-tax types. It also clarifies the relationship between clientId and clientName (reuse vs. create/match). This is meaningful added value, though the schema still carries most of the parameter documentation burden.
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 ('Create') and resource ('a document in iCount'), enumerates the document types, and distinguishes this tool from siblings like icount_cancel_document and icount_convert_document. It also adds practical guidance about which doctypes to prefer for testing, which makes the purpose even clearer.
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 explicitly says when to use this tool (creating any iCount document) and gives concrete guidance: prefer non-tax types (order/offer) for testing because iCount has no hard delete, and real tax documents (receipt/invrec) require a payment breakdown or they will be rejected. This is actionable and goes beyond generic 'use this to create documents'.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
icount_delete_clientDelete clientADestructive
Permanently delete a client record. Unlike documents, this is a real, irreversible delete — confirm with the user first, and prefer it only for clients with no associated documents.
| Name | Required | Description | Default |
|---|---|---|---|
| clientId | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already state destructiveHint=true and readOnlyHint=false, but the description adds substantial behavioral context: the delete is 'real, irreversible,' requires user confirmation, and should only be used for clients without associated documents. This goes beyond the annotations and gives the agent actionable safety guidance.
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, front-loaded with the core purpose and then adding necessary caveats. Every word earns its place; there is no redundant filler or repetition of schema/annotation data.
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?
The description covers purpose, irreversibility, confirmation, and usage constraints, which is strong for a simple one-parameter delete tool. However, it does not explain what happens if called on a client that does have associated documents (e.g., error, cascade, or block). Since no output schema exists, a brief note on expected outcome would make it fully complete.
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 must compensate for the sole parameter, clientId. The description does not explicitly define clientId, but its meaning is implied by the tool name and purpose ('delete a client record'). This is adequate for a single obvious parameter, but the description adds no explicit parameter-level detail such as format or source.
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 begins with a specific verb and resource: 'Permanently delete a client record.' It also distinguishes this tool from document-related operations by noting 'Unlike documents, this is a real, irreversible delete,' which differentiates it from sibling tools like cancel_document or close_document. The scope is 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?
The description provides clear conditions for use: 'confirm with the user first' and 'prefer it only for clients with no associated documents.' This gives an explicit when-not condition. However, it does not name an alternative tool (e.g., update_client) for cases where deletion is not appropriate, so it falls short of full alternatives guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
icount_get_clientGet clientARead-onlyIdempotent
Fetch full details of a single client by id.
| Name | Required | Description | Default |
|---|---|---|---|
| clientId | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, openWorldHint=true, idempotentHint=true, and destructiveHint=false, covering the safety profile. The description adds that the result contains 'full details', which is a useful expectation of the output, but it does not discuss errors, rate limits, or other behavioral traits.
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 entire description is one short sentence with no filler. It is front-loaded with the action and object, making it easy to scan.
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 simple read operation with one parameter and annotations covering safety, the description is adequate. It communicates the return scope ('full details') but does not describe the exact fields or error cases, which is a minor gap given the lack of an output schema.
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 only defines clientId as a non-empty string; the description's 'by id' clarifies that this parameter is the client identifier. It adds little beyond that, leaving the source or format of the id unspecified.
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 the verb 'Fetch' and the resource 'full details of a single client by id', clearly distinguishing this from sibling list or search tools. The phrase 'single client by id' differentiates it from list_clients and get_client_open_docs.
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 provides no explicit guidance on when to use this tool over alternatives like list_clients or get_client_open_docs. It only describes the operation, leaving the agent to infer that it should be used when a specific client id is known.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
icount_get_client_open_docsGet client open documentsARead-onlyIdempotent
List one client's open (unpaid/unsettled) documents — their outstanding balance. Requires a client: pass clientId (preferred), email, or clientName. There is no all-clients mode; for that, use icount_search_documents with status 0.
| Name | Required | Description | Default |
|---|---|---|---|
| No | Identify the client by email instead of id | ||
| doctype | No | ||
| clientId | No | Preferred identifier, from icount_list_clients | |
| getItems | No | Include line items on each document | |
| clientName | No | Identify the client by exact name instead of id |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the read-only, idempotent, and non-destructive nature of this tool. The description adds value beyond annotations by stating that a client identifier is mandatory, defining 'open' as unpaid/unsettled, and disclosing the absence of an all-clients mode. It also clarifies that the result represents an outstanding balance, which is useful operational context.
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 three sentences long and front-loaded with the core purpose, followed by identifier options and the sibling alternative. There is no filler, and every sentence contributes to correct tool selection and invocation.
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 5-parameter tool with no output schema, the description covers the key operational constraints: mandatory client reference, no all-clients mode, and the meaning of 'open'. It does not detail the response shape beyond outstanding balance, but the core use case and invocation requirements are sufficiently specified.
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?
With 80% schema description coverage, most parameters are already documented in the input schema. The description adds extra meaning by marking clientId as the preferred identifier and presenting email/clientName as alternatives, which is not obvious from the schema's 0 required parameters. It does not cover doctype, but the enum provides sufficient constraints.
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 ('List one client's open documents') and further clarifies 'open' as unpaid/unsettled. It explicitly differentiates from the sibling icount_search_documents by noting there is no all-clients mode and directing the agent to that alternative. This makes the tool's purpose distinct from icount_get_document and icount_list_clients.
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?
It gives explicit when-to-use guidance: the caller must provide one of clientId, email, or clientName, with clientId preferred. It also provides a when-not condition by stating 'There is no all-clients mode; for that, use icount_search_documents with status 0.' This clearly orients the agent among sibling tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
icount_get_documentGet documentARead-onlyIdempotent
Fetch full details of a single existing document by type and number.
| Name | Required | Description | Default |
|---|---|---|---|
| docnum | Yes | The document number as shown in iCount | |
| doctype | Yes | ||
| getItems | No | Include line items (default true) | |
| getPdfLink | No | Include a direct PDF link (default false) | |
| getPayments | No | Include payment breakdown (default true) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already communicate read-only, idempotent, non-destructive behavior, so the description does not need to restate safety. It adds only that the document must already exist, without describing response shape, error behavior, or the effect of the optional flags. This is adequate but not rich contextual disclosure.
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?
A single sentence that front-loads the core action and identifier without extraneous phrasing. Every word earns its place.
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 read-only fetch by known identifiers, the description is nearly sufficient: it states scope and identity, while optional parameters are explained in the schema. It falls slightly short because there is no output schema and the description only vaguely promises 'full details' without hinting at the response or failure behavior.
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 high (80%), and the schema already documents doctype, docnum, getItems, getPdfLink, and getPayments with their defaults. The description reinforces that doctype/docnum identify the document but adds no additional meaning beyond the schema, matching the baseline for high schema coverage.
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 names a specific verb ('Fetch'), a clear resource ('a single existing document'), and the identifying criteria ('by type and number'). It distinguishes this from siblings like search_documents (search vs exact fetch) and get_document_url (URL only vs full details).
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 implies the right context: use when you already know the doctype and docnum and want the full object, rather than when searching or listing. However, it never explicitly names alternatives or says when not to use it, so the usage guidance remains implicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
icount_get_document_urlGet document PDF URLARead-onlyIdempotent
Get a viewable/printable URL (PDF) for an existing document.
| Name | Required | Description | Default |
|---|---|---|---|
| lang | No | UI language for the request (default he) | |
| docnum | Yes | The document number as shown in iCount | |
| docLang | No | Language the document itself is rendered in | |
| doctype | Yes | ||
| emailTo | No | Log this address against the generated link, for tracking | |
| hideIls | No | Hide ILS-equivalent prices (foreign-currency docs only) | |
| original | No | Original vs. copy watermark (default true = original) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With annotations already providing readOnlyHint, openWorldHint, idempotentHint, and destructiveHint=false, the description adds useful behavioral context by clarifying that the operation returns a viewable/printable PDF URL rather than a document payload or a rendered PDF file. It also implicitly confirms no write side-effects are involved, consistent with 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single clear sentence with no filler. It front-loads the core action ('Get'), the resource ('URL (PDF)'), and the condition ('existing document'), earning every word.
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 the rich schema (7 parameters, enums, high coverage) and the presence of safety annotations, the description covers the essential return nature (PDF URL) and scope (existing document) without needing to restate schema details. It would benefit from mentioning whether the URL is temporary or persistent, but the core knowledge needed for correct selection and invocation is present.
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 86%, so the input schema already documents most parameters. The description itself does not add parameter-level meaning beyond indicating the output is a PDF URL, but with such high schema coverage, that is acceptable at the baseline level.
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 ('Get') and resource ('viewable/printable URL (PDF) for an existing document'), clearly distinguishing it from sibling tools like icount_get_document, which returns document data rather than a PDF URL. The phrase 'existing document' also narrows the scope and prevents confusion with create/update 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?
Usage context is implied: use this when you need a PDF URL for an already-existing document. However, the description does not explicitly state when not to use it or name alternatives, so an agent must infer the choice from sibling tool names and context signals rather than receiving direct routing guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
icount_list_clientsList clientsARead-onlyIdempotent
List clients in the account. Returns { total, returned, clients } so you can tell when the list was truncated.
| Name | Required | Description | Default |
|---|---|---|---|
| maxResults | No | Default 100 | |
| detailLevel | No | 0=basic ... 10=complete (default 1). High values return a lot of data. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover read-only, idempotent, and non-destructive behavior. The description adds value by revealing the return shape and explicitly warning that results can be truncated, which helps the agent interpret the response.
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?
One focused sentence communicates both the core operation and the return envelope. No filler or redundant restatement of the title.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple list tool with two optional, well-documented parameters and no output schema, the description plus annotations are largely sufficient. It would benefit from hinting about pagination or alternative tools, but that is not a major gap here.
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 input schema has 100% description coverage for maxResults and detailLevel, so the description does not need to repeat parameter details. It adds no deeper semantics beyond implying that returned/truncated counts matter, which is already suggested by the schema.
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?
Description states a specific verb and resource: 'List clients in the account.' This clearly distinguishes it from sibling operations like create/update/get/delete client and from broader document 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?
The account-level scope gives clear context for when to use it: when you need to enumerate clients in the account. It does not explicitly name or exclude sibling tools, but the purpose is clear enough to route an agent appropriately.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
icount_search_documentsSearch documentsARead-onlyIdempotent
Search existing iCount documents by type, status, client, date range, or document number. At least one filter is required. A search that matches nothing returns { docs: [], matched: 0 } — that is a normal empty result, not an error. A very broad date range can be rejected as too_many_results; narrow it rather than raising maxResults, which does not lift that limit.
| Name | Required | Description | Default |
|---|---|---|---|
| vatId | No | ||
| docnum | No | ||
| offset | No | Pagination offset | |
| status | No | 0=open, 1=closed, 2=partially closed | |
| doctype | No | ||
| endDate | No | Range end | |
| clientId | No | ||
| sortField | No | ||
| sortOrder | No | ||
| startDate | No | Range start | |
| clientName | No | ||
| maxResults | No | Default 100 | |
| clientEmail | No | ||
| detailLevel | No | 0=basic ... 10=complete (default 1). High values return a lot of data. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds valuable behavioral context beyond the annotations: it specifies the exact empty-result format (`{ docs: [], matched: 0 }`) and explains that a broad date range may be rejected as `too_many_results`, with guidance to narrow rather than increase maxResults. This complements the readOnlyHint, openWorldHint, and idempotentHint annotations without contradiction.
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 concise (two sentences) and front-loaded with the core purpose. The second sentence delivers crucial usage warnings without unnecessary fluff. Every sentence earns its place, making it efficient for an agent to parse.
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 the tool has 14 parameters and no output schema, the description covers the essential usage constraints (at least one filter, empty-result format, too_many_results handling) but leaves parameter-level details to the schema, which is only 43% covered. It does not explain response structure beyond the empty case, nor does it clarify defaults for maxResults or detailLevel (though those are in schema descriptions). It is adequate but not comprehensive for such a parameter-rich tool.
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?
With only 43% schema description coverage, the description should compensate for the many undocumented parameters (vatId, docnum, clientId, clientName, clientEmail, sortField, sortOrder). It only lists filter categories generically (type, status, client, date range, document number) without explaining individual parameter semantics or their relationships. This is insufficient given the low coverage.
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 clearly states the tool's function: searching existing iCount documents by multiple specific filter criteria (type, status, client, date range, document number). It distinguishes itself from siblings like icount_get_document (which retrieves a single document) and icount_get_client_open_docs (which is client-specific), making the purpose 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?
It explicitly states that at least one filter is required, which is a key usage constraint. It also advises on handling 'too_many_results' by narrowing the date range rather than raising maxResults. However, it does not explicitly mention when to use this tool versus alternatives (e.g., using icount_get_document for a known document ID), though the purpose is clear enough that an agent can infer it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
icount_test_connectionTest iCount connectionARead-onlyIdempotent
Verify the configured iCount API token works by fetching basic app/account info.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the safety profile is fully covered. The description adds that the call fetches basic app/account info, but does not disclose error behavior or what exactly is returned. This is acceptable for a simple health-check tool but not rich 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single sentence conveys the purpose, target, and method with no filler or repeated information. Every word earns its place.
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 connection test with annotations covering side effects, the description is complete: it states what is verified and how. No output schema exists, but the description's mention of 'basic app/account info' gives sufficient context about the likely return value.
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 tool has zero parameters and schema coverage is 100%, so there is no parameter burden for the description to carry. This matches the baseline 4 for parameterless tools; the description does not need to compensate for missing schema information.
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 clearly identifies the action ('Verify'), the specific resource ('configured iCount API token'), and the mechanism ('fetching basic app/account info'). This is distinct from all sibling CRUD/document tools and is not a tautology of the tool name.
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 makes the connection-testing purpose obvious and clearly separates it from the document/client operations listed as siblings. It does not explicitly state 'use this before other calls' or name exclusions, but the context is clear enough that an agent would know when to use it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
icount_update_clientUpdate clientAIdempotent
Update fields on an existing client. Only fields provided are changed.
| Name | Required | Description | Default |
|---|---|---|---|
| city | No | ||
| name | No | ||
| No | |||
| notes | No | ||
| phone | No | ||
| vatId | No | VAT/ID number (ח.פ / ע.מ) | |
| mobile | No | ||
| address | No | ||
| clientId | Yes | ||
| paymentTerms | No | Payment terms in days | |
| customClientId | No | Your own external id for this client |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark this as a non-read-only, non-destructive, idempotent operation. The description adds the important behavioral trait that only provided fields are changed, preventing an agent from assuming a full replace. It does not cover error handling or side effects, but the annotation coverage lowers the bar and the partial-update statement is meaningful.
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 short sentences, front-loaded with the main action and followed by a crucial caveat. There is no repetition of schema details or unnecessary context, so every word earns its place.
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 the 11 parameters and no output schema, an agent still needs to know which identifier to use when both clientId and customClientId exist, and what the response indicates. The description covers the core update operation but leaves these operational details to inference, making it adequate but not comprehensive.
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 only 27%, with 8 of 11 parameters having no descriptions. The description does not explain individual field meanings, such as the difference between phone and mobile or the semantics of customClientId, and it fails to compensate for the low coverage. The partial-update concept is helpful but does not resolve field-level ambiguity.
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 uses a specific verb ('update') and resource ('existing client'), making the tool's purpose unambiguous. It also adds the partial-update qualifier 'Only fields provided are changed,' which differentiates it from create or replace operations among the sibling 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?
The description clearly implies this tool is for modifying an existing client, which is enough to distinguish it from icount_create_client or icount_delete_client. However, it does not explicitly state when not to use it or name any alternative tools, so it falls just short of full guidance.
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.
13 tool updates
v0.3.2- Changed
icount_cancel_document4 fields changed- removed
Input schema / additionalPropertiesRemoved value: -false - added
Input schema / properties / docnum / anyOfAdded value: +[ + { + "minLength": 1, + "type": "string" + }, + { + "exclusiveMinimum": 0, + "maximum": 9007199254740991, + "type": "integer" + } +] - added
Input schema / properties / docnum / descriptionAdded value: +"The document number as shown in iCount" - removed
Input schema / properties / docnum / typeRemoved value: -[ - "string", - "number" -]
- Changed
icount_close_document9 fields changed- removed
Input schema / additionalPropertiesRemoved value: -false - removed
Input schema / properties / basedOn / items / additionalPropertiesRemoved value: -false - added
Input schema / properties / basedOn / items / properties / docnum / anyOfAdded value: +[ + { + "minLength": 1, + "type": "string" + }, + { + "exclusiveMinimum": 0, + "maximum": 9007199254740991, + "type": "integer" + } +] - added
Input schema / properties / basedOn / items / properties / docnum / descriptionAdded value: +"The document number as shown in iCount" - removed
Input schema / properties / basedOn / items / properties / docnum / typeRemoved value: -[ - "string", - "number" -] - added
Input schema / properties / basedOn / items / properties / doctype / enumAdded value: +[ + "invoice", + "invrec", + "receipt", + "refund", + "order", + "offer", + "delivery", + "deal" +] - added
Input schema / properties / docnum / anyOfAdded value: +[ + { + "minLength": 1, + "type": "string" + }, + { + "exclusiveMinimum": 0, + "maximum": 9007199254740991, + "type": "integer" + } +] - added
Input schema / properties / docnum / descriptionAdded value: +"The document number as shown in iCount" - removed
Input schema / properties / docnum / typeRemoved value: -[ - "string", - "number" -]
- Changed
icount_convert_document4 fields changed- removed
Input schema / additionalPropertiesRemoved value: -false - added
Input schema / properties / docnum / anyOfAdded value: +[ + { + "minLength": 1, + "type": "string" + }, + { + "exclusiveMinimum": 0, + "maximum": 9007199254740991, + "type": "integer" + } +] - added
Input schema / properties / docnum / descriptionAdded value: +"The document number as shown in iCount" - removed
Input schema / properties / docnum / typeRemoved value: -[ - "string", - "number" -]
- Changed
icount_create_client6 fields changed- removed
Input schema / additionalPropertiesRemoved value: -false - added
Input schema / properties / email / patternAdded value: +"^(?:[A-Za-z0-9_'+\\-]+\\.)*[A-Za-z0-9_'+\\-]*[A-Za-z0-9_+-]@(?:[A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$" - added
Input schema / properties / name / minLengthAdded value: +1 - added
Input schema / properties / paymentTerms / maximumAdded value: +9007199254740991 - added
Input schema / properties / paymentTerms / minimumAdded value: +0 - changed
Input schema / properties / paymentTerms / typePrevious value: -"number"New value: +"integer"
- Changed
icount_create_document23 fields changed- removed
Input schema / additionalPropertiesRemoved value: -false - added
Input schema / properties / clientEmail / patternAdded value: +"^(?:[A-Za-z0-9_'+\\-]+\\.)*[A-Za-z0-9_'+\\-]*[A-Za-z0-9_+-]@(?:[A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$" - added
Input schema / properties / currency / patternAdded value: +"^[A-Za-z]{3}$" - changed
Input schema / properties / dueDate / descriptionPrevious value: -"YYYY-MM-DD"New value: +"Due date" - added
Input schema / properties / dueDate / patternAdded value: +"^\\d{4}-\\d{2}-\\d{2}$" - changed
Input schema / properties / issueDate / descriptionPrevious value: -"YYYY-MM-DD, defaults to today"New value: +"Issue date, defaults to today" - added
Input schema / properties / issueDate / patternAdded value: +"^\\d{4}-\\d{2}-\\d{2}$" - removed
Input schema / properties / items / items / additionalPropertiesRemoved value: -false - added
Input schema / properties / items / items / properties / description / minLengthAdded value: +1 - added
Input schema / properties / items / maxItemsAdded value: +500 - removed
Input schema / properties / payment / additionalPropertiesRemoved value: -false - changed
Input schema / properties / payment / properties / cardNumber / descriptionPrevious value: -"Last 4 digits"New value: +"Last 4 digits only — never send a full PAN" - changed
Input schema / properties / payment / properties / date / descriptionPrevious value: -"Payment date, YYYY-MM-DD (defaults to today)"New value: +"Payment date (defaults to today)" - added
Input schema / properties / payment / properties / date / patternAdded value: +"^\\d{4}-\\d{2}-\\d{2}$" - added
Input schema / properties / payment / properties / expMonth / maximumAdded value: +12 - added
Input schema / properties / payment / properties / expMonth / minimumAdded value: +1 - changed
Input schema / properties / payment / properties / expMonth / typePrevious value: -"number"New value: +"integer" - added
Input schema / properties / payment / properties / expYear / maximumAdded value: +9007199254740991 - added
Input schema / properties / payment / properties / expYear / minimumAdded value: +-9007199254740991 - changed
Input schema / properties / payment / properties / expYear / typePrevious value: -"number"New value: +"integer" - added
Input schema / properties / payment / properties / numOfPayments / exclusiveMinimumAdded value: +0 - added
Input schema / properties / payment / properties / numOfPayments / maximumAdded value: +9007199254740991 - changed
Input schema / properties / payment / properties / numOfPayments / typePrevious value: -"number"New value: +"integer"
- Changed
icount_delete_client2 fields changed- removed
Input schema / additionalPropertiesRemoved value: -false - added
Input schema / properties / clientId / minLengthAdded value: +1
- Changed
icount_get_client2 fields changed- removed
Input schema / additionalPropertiesRemoved value: -false - added
Input schema / properties / clientId / minLengthAdded value: +1
- Changed
icount_get_client_open_docs4 fields changed- removed
Input schema / additionalPropertiesRemoved value: -false - added
Input schema / properties / clientId / descriptionAdded value: +"Preferred identifier, from icount_list_clients" - changed
Input schema / properties / clientName / descriptionPrevious value: -"Filter by client name instead of id"New value: +"Identify the client by exact name instead of id" - changed
Input schema / properties / email / descriptionPrevious value: -"Filter by client email instead of id"New value: +"Identify the client by email instead of id"
- Changed
icount_get_document4 fields changed- removed
Input schema / additionalPropertiesRemoved value: -false - added
Input schema / properties / docnum / anyOfAdded value: +[ + { + "minLength": 1, + "type": "string" + }, + { + "exclusiveMinimum": 0, + "maximum": 9007199254740991, + "type": "integer" + } +] - added
Input schema / properties / docnum / descriptionAdded value: +"The document number as shown in iCount" - removed
Input schema / properties / docnum / typeRemoved value: -[ - "string", - "number" -]
- Changed
icount_get_document_url5 fields changed- removed
Input schema / additionalPropertiesRemoved value: -false - added
Input schema / properties / docnum / anyOfAdded value: +[ + { + "minLength": 1, + "type": "string" + }, + { + "exclusiveMinimum": 0, + "maximum": 9007199254740991, + "type": "integer" + } +] - added
Input schema / properties / docnum / descriptionAdded value: +"The document number as shown in iCount" - removed
Input schema / properties / docnum / typeRemoved value: -[ - "string", - "number" -] - added
Input schema / properties / emailTo / patternAdded value: +"^(?:[A-Za-z0-9_'+\\-]+\\.)*[A-Za-z0-9_'+\\-]*[A-Za-z0-9_+-]@(?:[A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$"
- Changed
icount_list_clients6 fields changed- removed
Input schema / additionalPropertiesRemoved value: -false - added
Input schema / properties / detailLevelAdded value: +{ + "description": "0=basic ... 10=complete (default 1). High values return a lot of data.", + "maximum": 10, + "minimum": 0, + "type": "integer" +} - changed
Input schema / properties / maxResults / descriptionPrevious value: -"Truncate to this many results (default: all)"New value: +"Default 100" - added
Input schema / properties / maxResults / maximumAdded value: +1000 - added
Input schema / properties / maxResults / minimumAdded value: +1 - changed
Input schema / properties / maxResults / typePrevious value: -"number"New value: +"integer"
- Changed
icount_search_documents19 fields changed- removed
Input schema / additionalPropertiesRemoved value: -false - changed
Input schema / properties / detailLevel / descriptionPrevious value: -"0=basic ... 10=complete (default 1)"New value: +"0=basic ... 10=complete (default 1). High values return a lot of data." - changed
Input schema / properties / detailLevel / typePrevious value: -"number"New value: +"integer" - added
Input schema / properties / docnum / exclusiveMinimumAdded value: +0 - added
Input schema / properties / docnum / maximumAdded value: +9007199254740991 - changed
Input schema / properties / docnum / typePrevious value: -"number"New value: +"integer" - changed
Input schema / properties / endDate / descriptionPrevious value: -"YYYY-MM-DD"New value: +"Range end" - added
Input schema / properties / endDate / patternAdded value: +"^\\d{4}-\\d{2}-\\d{2}$" - added
Input schema / properties / maxResults / descriptionAdded value: +"Default 100" - changed
Input schema / properties / maxResults / minimumPrevious value: -0New value: +1 - changed
Input schema / properties / maxResults / typePrevious value: -"number"New value: +"integer" - added
Input schema / properties / offset / maximumAdded value: +9007199254740991 - added
Input schema / properties / offset / minimumAdded value: +0 - changed
Input schema / properties / offset / typePrevious value: -"number"New value: +"integer" - changed
Input schema / properties / startDate / descriptionPrevious value: -"YYYY-MM-DD"New value: +"Range start" - added
Input schema / properties / startDate / patternAdded value: +"^\\d{4}-\\d{2}-\\d{2}$" - added
Input schema / properties / status / anyOfAdded value: +[ + { + "const": 0, + "type": "number" + }, + { + "const": 1, + "type": "number" + }, + { + "const": 2, + "type": "number" + } +] - removed
Input schema / properties / status / enumRemoved value: -[ - 0, - 1, - 2 -] - removed
Input schema / properties / status / typeRemoved value: -"number"
- Changed
icount_update_client7 fields changed- removed
Input schema / additionalPropertiesRemoved value: -false - added
Input schema / properties / clientId / minLengthAdded value: +1 - added
Input schema / properties / email / patternAdded value: +"^(?:[A-Za-z0-9_'+\\-]+\\.)*[A-Za-z0-9_'+\\-]*[A-Za-z0-9_+-]@(?:[A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$" - added
Input schema / properties / name / minLengthAdded value: +1 - added
Input schema / properties / paymentTerms / maximumAdded value: +9007199254740991 - added
Input schema / properties / paymentTerms / minimumAdded value: +0 - changed
Input schema / properties / paymentTerms / typePrevious value: -"number"New value: +"integer"
14 tool updates
v0.2.0- First observed
icount_cancel_document - First observed
icount_close_document - First observed
icount_convert_document - First observed
icount_create_client - First observed
icount_create_document - First observed
icount_delete_client - First observed
icount_get_client - First observed
icount_get_client_open_docs - First observed
icount_get_document - First observed
icount_get_document_url - First observed
icount_list_clients - First observed
icount_search_documents - First observed
icount_test_connection - First observed
icount_update_client
TDQS
Scored across 14 tools
Each tool targets a distinct resource and action, cleanly separating document operations from client operations and from connection testing. The only near-overlapping pair, get_client_open_docs and search_documents, is explicitly differentiated in the descriptions.
All tools share the icount_ prefix and follow a verb_noun snake_case pattern: create_document, get_client, list_clients, cancel_document. The compound get_client_open_docs is slightly longer but still fits the same predictable naming convention.
14 tools is well within the appropriate range for a domain covering documents and clients. Every tool has a clear purpose, and there are no apparent redundant or filler tools.
Client CRUD is fully covered, and the document lifecycle is strong with create, get, search, cancel, close, convert, URL fetching, and open-document lookup. Minor gaps exist: there is no document update operation, and no unfiltered list-all-documents endpoint, though cancel/recreate and filtered search provide reasonable workarounds.
Maintenance
Related MCP Connectors
Automate 1,000+ services from any MCP-compatible AI agent: build Applets, run actions and queries.
Let AI agents query data and act across all your business apps via MCP.
Connect Exact Online to your AI assistant via MCP. Manage Exact Online with natural language.
Log, query, and edit expenses, budgets, and accounts in Ledgy from any MCP-compatible AI assistant.
Related MCP Servers
- FlicenseBqualityDmaintenanceMCP server for DACH accounting automation. Connect AI assistants to sevDesk and Lexoffice — create invoices, manage contacts, handle bookings and vouchers for German-speaking businesses.1527 npm-
- AlicenseNot gradedqualityCmaintenanceMCP server for the FreeAgent accounting API, enabling LLMs to securely access and manage accounting data including contacts, invoices, bills, bank transactions, and more.5 npm1MIT
- AlicenseAqualityCmaintenanceMCP server for creating and fiscalizing invoices via solo.com.hr API. Enables AI agents to generate invoices, retrieve invoice details, list invoices, and check next invoice number.4MIT
- AlicenseBqualityCmaintenanceEnables AI assistants to interact with the BuchhaltungsButler accounting API via MCP, providing tools for managing receipts, transactions, invoices, postings, and master data directly from Claude Desktop and other MCP-compatible clients.236 npmMIT