wfirma-mcp
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., "@wfirma-mcpWhat are my unpaid invoices from last month?"
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.
wFirma MCP
Your accounting, one conversation away.
Connect wFirma to Claude, Codex, or any MCP client. Ask about invoices, expenses, contractors, and declarations in plain language. Your assistant reads the records directly, so you can skip the exports and copy-paste.
Nine accounting tools covering invoices, expenses, PIT/VAT/JPK/ZUS declarations, and revenue/VAT registers.
Read-only accounting access — records stay unchanged; login and filters can update session or saved-view settings.
Runs on your computer with your wFirma login. macOS Keychain support keeps credentials out of config files.
Try asking
Show my invoices for last month. Separate drafts and tell me if more pages are available.
Open this invoice and show its line items, VAT breakdown, and contractor details.
Pokaż ewidencję przychodów za ostatni miesiąc, z podziałem na stawki ryczałtu.
Related MCP server: ordis-mcp-server
Quick start
Requires Python 3.11+, uv, Git, and a wFirma account with password login. Supports macOS, Linux, and Windows.
1. Install
git clone https://github.com/tajchert/wfirma-mcp.git
cd wfirma-mcp
uv sync --lockedThis Python server uses uv. The commands below launch the installed executable directly, so your assistant needs no package manager on its PATH.
2. Add your login
macOS — save it to Keychain once:
uv run --locked wfirma-mcp --setup-keychainEnter your wFirma login and password in your terminal. The password is masked; allow Keychain access if macOS asks.
Copy .env.example to .env and fill in WFIRMA_LOGIN and WFIRMA_PASSWORD locally. On macOS/Linux, run chmod 600 .env. On Windows, restrict access through the file's Security settings.
Append --env-file /absolute/path/to/wfirma-mcp/.env to the client commands below. For Claude Desktop, replace "args": [] with:
"args": ["--env-file", "/absolute/path/to/wfirma-mcp/.env"]The file contains plaintext credentials; keep it private. .env is never loaded automatically. A saved macOS Keychain entry takes precedence; add --credential-source plain to bypass it. More credential options.
3. Connect your assistant
Replace /absolute/path/to/wfirma-mcp with your checkout's full path. On Windows, use C:\path\to\wfirma-mcp\.venv\Scripts\wfirma-mcp.exe; double the backslashes inside JSON strings.
Codex
codex mcp add wfirma -- "/absolute/path/to/wfirma-mcp/.venv/bin/wfirma-mcp"Restart or reconnect Codex after registration. Codex MCP guide.
Claude Code
claude mcp add --transport stdio --scope user wfirma -- "/absolute/path/to/wfirma-mcp/.venv/bin/wfirma-mcp"Run /mcp in Claude Code to check the connection. Claude Code MCP guide.
Claude Desktop
Open Settings → Developer → Edit Config and add the wfirma entry to claude_desktop_config.json. Keep any existing servers.
{
"mcpServers": {
"wfirma": {
"command": "/absolute/path/to/wfirma-mcp/.venv/bin/wfirma-mcp",
"args": []
}
}
}Save, fully quit, and reopen Claude Desktop. Desktop setup guide.
First message: “Use wFirma to check my active company, then show last month's invoices.” Your assistant starts the server automatically. Keep the checkout at its configured path.
What to know
Uses wFirma's browser interface; no official API key is needed. Browser changes may affect compatibility. MFA/CAPTCHA are not supported yet.
Lists return the current page and report whether more records exist. Saved filters can narrow results; ask your assistant to check the period and completeness before summarizing.
Supports reading records. Invoice creation, payments, declaration submission, PDFs, company switching, and tax calculations are not available.
Credentials stay local; session cookies stay in memory. Retrieved accounting data is shared with your connected assistant. Privacy details.
Reference & development
All tools and advanced setup · Browser interface · MIT license
uv run pytest -q
uv run ruff check src tests scriptsAvailable Tools
9 toolsget_contractorARead-onlyIdempotent
Read contractor basics using an ID from an invoice contractor link, not a company ID.
| Name | Required | Description | Default |
|---|---|---|---|
| contractor_id | Yes | Opaque ID from a previously returned record/link |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | Yes | |
| fields | Yes | |
| company_id | 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 useful context about the ID source and that it returns 'basics', but does not add behavioral detail beyond what the annotations and schema already provide.
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, front-loaded sentence communicates the action, resource, ID source, and an exclusion with minimal waste. Every phrase 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 single-parameter read operation with rich annotations and an output schema, the description is complete. It provides the key disambiguation about ID provenance and does not need to explain return values because the output schema exists.
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 100% and the parameter description already explains the ID is opaque and from a returned record/link. The tool description adds extra semantic value by specifying 'invoice contractor link' and excluding 'company ID', which helps the agent pick the correct identifier type.
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 ('Read'), a resource ('contractor basics'), and a precise ID source ('from an invoice contractor link, not a company ID'). This clearly differentiates the tool from sibling get/list tools and prevents confusion over what identifier to supply.
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 for when to use the tool: when you have an ID from an invoice contractor link. It also provides an explicit exclusion ('not a company ID'). It does not name a specific alternative tool, but the guidance is strong enough to route correct usage.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_declarationARead-onlyIdempotent
Read a declaration dialog. JPK returns a namespaced XML tree; PIT keeps calculation tables.
Inspect the document's actual period and version. Correction supersession is unresolved.
| Name | Required | Description | Default |
|---|---|---|---|
| declaration_id | Yes | Opaque ID from a previously returned record/link |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | Yes | |
| xml | No | |
| text | Yes | |
| tables | Yes | |
| company_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds meaningful behavioral detail beyond the readOnly/idempotent annotations: output format varies by declaration type, and correction supersession is an unresolved data-quality issue. This is valuable context that the agent cannot derive from annotations or the input schema.
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 compact: three sentences, each adding distinct information (purpose, output variants, caveat). It is front-loaded with the primary purpose and avoids filler, though the third sentence is terse enough that its practical implication could be clearer.
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 rich annotations, a described output schema, and a single fully documented parameter, the description covers the essential behavioral variations and a key caveat. It is complete enough for correct invocation; only an explicit tie to list_declarations or correction-handling policy 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 provides 100% coverage with a clear description of declaration_id as an opaque ID from a previously returned record/link. The tool description does not add parameter-specific meaning, but the schema already carries the full burden, so the 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 verb and resource: 'Read a declaration dialog' and elaborates on the two possible result shapes (JPK XML tree vs. PIT calculation tables). It is distinct from sibling list/get tools, though the term 'dialog' is somewhat domain-specific and not fully clarified.
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?
No explicit guidance is given about when to use this tool versus alternatives such as list_declarations or the other get_* tools. The advice to 'Inspect the document's actual period and version' is a post-call caution, not a usage-selection rule, and 'Correction supersession is unresolved' does not explain whether this tool should or should not be used for corrected declarations.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_invoiceARead-onlyIdempotent
Read an invoice detail dialog by a returned ID; preserves independent detail tables.
| Name | Required | Description | Default |
|---|---|---|---|
| invoice_id | Yes | Opaque ID from a previously returned record/link |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | Yes | |
| xml | No | |
| text | Yes | |
| tables | Yes | |
| company_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare read-only, idempotent, open-world, and non-destructive behavior. The description adds a meaningful behavioral trait beyond those annotations: 'preserves independent detail tables.' No contradiction with annotations is present.
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 compact sentence front-loads the operation and then adds the key behavioral qualifier. There is no filler or redundancy.
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 read operation with rich annotations and an output schema, the definition gives an agent what it needs to call the tool correctly. The phrase 'preserves independent detail tables' is slightly underspecified, but the output schema and annotation profile fill the remaining 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?
The schema fully documents the single parameter as an opaque ID from a previously returned record/link, and description coverage is 100%. The description's 'returned ID' phrase reinforces the schema but does not add new format, source, or lifecycle details.
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 operation ('Read an invoice detail dialog') on a clearly identified resource, and adds a distinguishing behavioral note about preserving independent detail tables. This separates it from sibling get_* and list_* tools without requiring schema inspection.
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 conditions use on 'a returned ID', which is a useful prerequisite. However, it never says when to prefer this over list_invoices or sibling get_* tools, and gives no exclusions or alternative tool names.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_revenue_registerARead-onlyIdempotent
Read the ryczałt revenue register for year+month, or the saved view if both omitted.
| Name | Required | Description | Default |
|---|---|---|---|
| year | No | ||
| month | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| rows | Yes | |
| model | Yes | |
| period | Yes | |
| filters | Yes | |
| complete | Yes | True only when all rows of the filtered table are returned |
| warnings | Yes | |
| table_url | Yes | |
| company_id | Yes | |
| pagination | Yes | |
| returned_count | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The read-only and idempotent behavior is already carried by annotations, and the description adds meaningful behavioral context beyond them: when both parameters are omitted, the tool returns the saved view. There is no contradiction 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 entire description is one efficient sentence with the main operation front-loadedcars and no extraneous detail. Every clause contributes to invocation behavior.
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?
Annotations and the presence of an output schema cover safety and return shape, so the description only needs to convey invocation logic. It covers the main period-based call and the saved-view fallback, though 'saved view' and partial-parameter behavior remain implicit.
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 description adds semantic structure by linking year and month together and defining the both-omitted fallback. However, with schema description coverage low, it leaves unclear what happens when only one of year/month is provided, and it does not elaborate on individual parameter meaning beyond the schema's basic type 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 names a specific verb ('Read') and resource ('ryczałt revenue register'), and it is clearly distinguishable from siblings such as get_vat_register. It also states a second mode ('saved view') without confusing the core purpose.
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 clear usage context: call with year and month to read that period, or with both omitted to get the saved view. It does not explicitly name alternative tools or exclusion conditions, so it stops short of full routing guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_vat_registerBRead-onlyIdempotent
Read the VAT sale/purchase register for its saved period; inspect period and complete.
| Name | Required | Description | Default |
|---|---|---|---|
| kind | No | sale |
Output Schema
| Name | Required | Description |
|---|---|---|
| rows | Yes | |
| model | Yes | |
| period | Yes | |
| filters | Yes | |
| complete | Yes | True only when all rows of the filtered table are returned |
| warnings | Yes | |
| table_url | Yes | |
| company_id | Yes | |
| pagination | Yes | |
| returned_count | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover read-only, idempotent, non-destructive, and open-world behavior. The description adds that the register is read for its saved period and that output can be inspected for period and completeness, which is useful context; however, the phrasing is ambiguous and no additional behavioral constraints such as period defaults or data availability are disclosed.
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 concise, front-loaded sentence with no filler. The second clause is compact but unclear ('period and complete'), which prevents a top score.
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 tool with a rich output schema and strong annotations, the minimal description is mostly adequate. The main gaps are sibling differentiation and clarification of what 'complete' means; neither is fatal because the output schema can fill return-value details.
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 bears some responsibility for parameter meaning. It does echo the 'sale/purchase' split of the kind enum, but it does not explain the default behavior, how the saved period is determined, or operational implications beyond what the schema's enum and default already encode. Added value is marginal.
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 an explicit verb and resource ('Read the VAT sale/purchase register') and notes that the register is period-scoped. However, it does not distinguish itself from get_revenue_register or other read-only siblings, and the phrase 'inspect period and complete' is ambiguous about whether 'complete' is a status flag, an adjective, or an action.
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?
Offers no guidance about when to choose this tool over get_revenue_register, get_invoice, get_declaration, or other siblings. The only usage signal is the purpose statement itself; there are no exclusions, prerequisites, or conditional routing cues.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_declarationsARead-onlyIdempotent
Read declarations for the saved period. VAT can mean VAT-UE; JPK has payable VAT.
Current page only. ZUS components remain separate. Paid/remaining is bookkeeping state.
| Name | Required | Description | Default |
|---|---|---|---|
| kind | No | tax |
Output Schema
| Name | Required | Description |
|---|---|---|
| rows | Yes | |
| model | Yes | |
| period | Yes | |
| filters | Yes | |
| complete | Yes | True only when all rows of the filtered table are returned |
| warnings | Yes | |
| table_url | Yes | |
| company_id | Yes | |
| pagination | Yes | |
| returned_count | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare read-only/idempotent behavior; the description adds meaningful semantics: VAT can mean VAT-UE, JPK includes payable VAT, ZUS components remain separate, and paid/remaining is bookkeeping state. These are important interpretation details beyond the structured 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?
Three short sentences, front-loaded with the primary purpose, followed by compact caveats. Every sentence contributes useful information without restating 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?
For a simple list tool with an output schema and read-only annotations, the description covers scope, page limitation, and semantic caveats well. However, it never defines what 'saved period' means or how an agent can access other pages, leaving minor operational gaps.
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 only parameter, kind, has no schema descriptions and the description only clarifies two of the four enum values (VAT, JPK). The 'tax' and 'zus' values remain mostly implicit, so the description partially compensates for the schema gap but not completely.
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 opens with 'Read declarations for the saved period,' identifying a clear verb and resource. It adds scope details like 'Current page only' but does not explicitly distinguish itself from siblings such as get_declaration or get_vat_register.
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?
Gives clear usage context: the saved period, current-page limitation, and separation of ZUS components. It does not explicitly state when not to use this tool or name alternative tools, but the context is sufficient for basic selection.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_expensesBRead-onlyIdempotent
Read the saved booked-expense or expense-draft view. Current page only; check complete.
Filters and booked-expense details are not validated. Currency display text is retained.
| Name | Required | Description | Default |
|---|---|---|---|
| drafts | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| rows | Yes | |
| model | Yes | |
| period | Yes | |
| filters | Yes | |
| complete | Yes | True only when all rows of the filtered table are returned |
| warnings | Yes | |
| table_url | Yes | |
| company_id | Yes | |
| pagination | Yes | |
| returned_count | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish read-only, idempotent, open-world, and non-destructive behavior. The description adds useful operational details beyond that: it is scoped to the current page, filters and booked-expense details are not validated, and currency display text is retained.
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, front-loaded with the verb and resource, and separates the caveats into a second paragraph. However, 'Current page only; check complete' is cryptic and reduces the clarity that the concise structure otherwise provides.
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 tool with one optional parameter, an output schema, and strong annotations, the core purpose and caveats are present. The main gaps are the implicit drafts parameter mapping and the ambiguous 'check complete' phrase, making the description adequate but not fully self-sufficient.
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 only parameter, drafts, has no schema description and the description never explicitly maps it to the 'expense-draft view' or states what true/false does. It hints at two views but leaves the agent to infer how the boolean selects between them.
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 clear verb ('Read') and identifies the resource ('saved booked-expense or expense-draft view'). It distinguishes this expense-focused tool from siblings like list_invoices and list_declarations, though the phrase 'Current page only; check complete' is ambiguous.
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 guidance about when to use this tool versus its siblings. 'Current page only' and the caveats describe limitations, not selection criteria, so an agent cannot tell when to prefer list_expenses over related list tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_invoicesARead-onlyIdempotent
Read one invoice page, including drafts. Supply year+month OR both ISO dates.
Without filters, use the saved view. Check period, other saved filters and complete; date-range boundary semantics and accounting recognition dates are not established.
| Name | Required | Description | Default |
|---|---|---|---|
| year | No | ||
| month | No | ||
| date_to | No | ||
| date_from | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| rows | Yes | |
| model | Yes | |
| period | Yes | |
| filters | Yes | |
| complete | Yes | True only when all rows of the filtered table are returned |
| warnings | Yes | |
| table_url | Yes | |
| company_id | Yes | |
| pagination | Yes | |
| returned_count | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnlyHint=true, idempotentHint=true, destructiveHint=false), so the description adds value by disclosing scope ('including drafts'), the saved-view default behavior, and an honest caveat that 'date-range boundary semantics and accounting recognition dates are not established.' No contradiction with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is short and front-loaded with purpose and usage, but the third sentence is telegraphic and confusing ('Check period, other saved filters and complete;'). The caveat content is valuable, but this dangling phrasing hurts readability and undercuts the 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 read-only tool with 4 optional parameters, an output schema, and rich annotations, the core essentials are covered: call modes, no-filter default, and known unknowns. However, pagination semantics ('one invoice page' — page size, how to advance) and explicit routing vs the get_invoice sibling are left open, and the cryptic caveat sentence muddies the precondition to '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. It does so by defining the valid combination pattern ('year+month OR both ISO dates'), which the schema's individually nullable properties do not convey. Per-parameter meaning still mostly relies on the schema's property descriptions, so it does not reach 5.
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 ('Read one invoice page') and adds a meaningful scope qualifier ('including drafts') that distinguishes it from the singular get_invoice sibling. However, it never names sibling alternatives explicitly, so it does not fully earn a 5.
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 first line gives a direct calling rule ('Supply year+month OR both ISO dates') and the second sentence explains the no-filter fallback ('Without filters, use the saved view'). This is clear usage context, but no alternative tools are mentioned or ruled out, so there are no exclusions as required for a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
session_statusARead-onlyIdempotent
Log in if needed and verify the active company. Never returns credentials or tokens.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| company_id | Yes | |
| authenticated | Yes | |
| company_pinned | Yes | |
| accounting_access | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds meaningful behavior beyond the annotations: it discloses a potential login side effect ('Log in if needed') and a security guarantee ('Never returns credentials or tokens'). The readOnlyHint, openWorldHint, and idempotentHint annotations already cover safety, and the description enriches them with session-specific context without contradicting them.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two short sentences with no filler. The primary action is front-loaded in the first sentence, and the security caveat is a distinct second sentence. 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 simple, zero-parameter utility, the description covers the login behavior and explicitly warns about credential leakage. An output schema exists, so return-value documentation is not required from the description. The only slight gap is lack of guidance on when to invoke it, but that is already captured under usage guidelines.
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 the schema is an empty object, so there is nothing for the description to clarify. The baseline for a 0-parameter tool is 4, and the description appropriately omits parameter details that would be irrelevant.
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 clear action: 'Log in if needed and verify the active company.' This is a specific verb+resource pair that goes beyond merely restating the name. It also distinguishes itself from siblings, which all target data records (contractors, invoices, registers), by focusing on session state.
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?
No explicit guidance is given about when to use this tool versus alternatives. There are no sibling session tools, but the description does not advise calling this before other API operations or explain scenarios where it is required. The usage context is left entirely to inference.
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.
9 tool updates
v0.3.0- First observed
get_contractor - First observed
get_declaration - First observed
get_invoice - First observed
get_revenue_register - First observed
get_vat_register - First observed
list_declarations - First observed
list_expenses - First observed
list_invoices - First observed
session_status
TDQS
Scored across 9 tools
Each tool targets a distinct resource and action: get_* tools read singular details while list_* tools read collections, and the two register tools are separated by tax type. There is no meaningful overlap between tool purposes, and the descriptions reinforce the boundaries.
The tools follow a consistent snake_case pattern with get_ for single-object reads and list_ for collection reads. The only deviation is session_status, which breaks the verb_noun pattern and would be more consistent as get_session_status.
Nine tools is a well-scoped size for an accounting data integration. Each tool earns its place by covering a distinct aspect of the domain, and the count is neither bloated nor too thin.
The surface covers core read operations for invoices, declarations, expenses, registers, contractors, and session state. Minor gaps exist: there is no contractor listing, no expense detail tool, and writes are entirely absent, but this may be intentional for a read-only reporting bridge.
Maintenance
Related MCP Connectors
wFirma.pl (Polish accounting) via MCP: invoices, contractors, payments, reports. Full read-write.
Connect Claude or Cursor to books, invoices, bills, payroll, and sealed closes.
QuickBooks Online in Claude and ChatGPT: 221 tools, full ledger, multi-company, Canada + US, FR/EN.
Invoicing, costs, KPiR, VAT and KSeF data from your Mobilna Faktura account (Poland).
Related MCP Servers
- AlicenseNot gradedqualityCmaintenanceProvides structured, read-mostly access to small-business back-office data including customers, invoices, and account notes, allowing Claude to query overdue invoices, revenue summaries, and more.MIT
- AlicenseAqualityCmaintenanceRead-only MCP server for the Ordis accounting API, exposing 11 typed tools to query financial data such as invoices, tax forms, KPIs, and more directly from Claude.11MIT
- FlicenseNot gradedqualityCmaintenanceEnables Claude to read weclapp data such as customers, invoices, and articles via a secure MCP server.-
- AlicenseAqualityBmaintenanceProvides read-only access to wFirma company data, invoices, contractors, expenses, and payments, letting AI assistants query the wFirma API v2 without modifying records.917 npm1MIT