Skip to main content
Glama
agente-dev

wFirma MCP

by agente-dev

wFirma MCP

Unofficial, read-only MCP server for the wFirma API v2 (api2.wfirma.pl). Gives MCP-compatible AI assistants typed, read-only access to company data, invoices, contractors, expenses, and payments — with credentials that never leave your machine and no commercial middleware between you and wFirma.

Not affiliated with wFirma. "wFirma" is a trademark of its respective owner.

Tools (9, all read-only)

Tool

Endpoint

wfirma_list_companies

GET /user_companies/find

wfirma_list_invoices

GET /invoices/find

wfirma_get_invoice

GET /invoices/get/{id}

wfirma_list_contractors

GET /contractors/find

wfirma_get_contractor

GET /contractors/get/{id}

wfirma_list_expenses

GET /expenses/find

wfirma_get_expense

GET /expenses/get/{id}

wfirma_list_payments

GET /payments/find

wfirma_get_payment

GET /payments/get/{id}

Every company-scoped tool requires the internal companyId returned by wfirma_list_companies. A Polish NIP is not accepted as a company id.

Related MCP server: InvoiceNinja MCP Server

Why read-only

The server intentionally contains no add, edit, delete, send, fiscalization, KSeF, or payment-mutation operation. The full list of excluded categories, reviewed against the official documentation at doc.wfirma.pl, is recorded in coverage-manifest.json. If you need writes, use wFirma's own tooling — not this server.

Setup

Credentials

wFirma API keys are created in your wFirma panel (Integrations → API). Required environment variables:

  • WFIRMA_ACCESS_KEY

  • WFIRMA_SECRET_KEY

  • WFIRMA_APP_KEY

See .env.example. Never commit real values.

Build

pnpm install
pnpm build      # → dist/index.js (self-contained esbuild bundle)
pnpm test       # all HTTP traffic is mocked; no live account needed

Claude Desktop / any stdio MCP client

{
  "mcpServers": {
    "wfirma": {
      "command": "node",
      "args": ["/absolute/path/to/wfirma-mcp/dist/index.js"],
      "env": {
        "WFIRMA_ACCESS_KEY": "your-access-key",
        "WFIRMA_SECRET_KEY": "your-secret-key",
        "WFIRMA_APP_KEY": "your-app-key"
      }
    }
  }
}

Claude Code / Cursor (scope: project)

claude mcp add wfirma -- node /absolute/path/to/wfirma-mcp/dist/index.js

Design notes

  • No runtime dependencies beyond the MCP SDK and zod. The client uses Node's stdlib https with a hard 20s timeout and a bounded response-size guard.

  • Fail-closed error taxonomy. Missing credentials, non-numeric company ids, oversized responses, and auth failures each raise a distinct wfirma_* error code instead of a generic failure.

  • No PII in logs. Tool parameters are never logged.

  • Coverage manifest. coverage-manifest.json maps every tool to its endpoint, risk class, and the test that proves it; a CI test enforces the manifest stays in sync with the source.

License

MIT

Available Tools

9 tools
wfirma_get_contractorGet wFirma contractorA
Read-onlyIdempotent

Read one contractor from one explicitly selected wFirma client company.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYeswFirma record id.
companyIdYesInternal wFirma company id returned by wfirma_list_companies. Never use a NIP here.

TDQS

A3.6/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the safety profile is covered. The description adds the 'explicitly selected client company' requirement, which is useful context, but it doesn't address not-found behavior, response structure, or verification details.

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

Conciseness5/5

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

A single, front-loaded sentence with zero filler. Every word earns its place, delivering the action, resource, and scope quickly.

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

Completeness4/5

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

For a low-complexity, 2-parameter read with rich annotations and fully described schema, the description is sufficient to select and invoke the tool. The only minor gap is no explicit statement about the return shape, but the verb 'Read' and resource name make that inferable.

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

Parameters3/5

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

Schema coverage is 100%: both parameters have meaningful descriptions, including the warning 'Never use a NIP here' for companyId. The description adds no additional parameter-level nuance, so the baseline 3 applies.

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

Purpose4/5

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

Description clearly says 'Read one contractor' with a specific resource and scope ('from one explicitly selected wFirma client company'), which distinguishes it from list_contractors. It doesn't name a sibling tool, but the singular 'one' and 'explicitly selected' make the targeted nature clear.

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

Usage Guidelines3/5

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

The phrasing implies this tool is for retrieving a single contractor when you already have a specific companyId and id. However, it doesn't explicitly contrast with wfirma_list_contractors or other get_* tools, and gives no when-not-to-use guidance.

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

wfirma_get_expenseGet wFirma expenseA
Read-onlyIdempotent

Read one expense from one explicitly selected wFirma client company.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYeswFirma record id.
companyIdYesInternal wFirma company id returned by wfirma_list_companies. Never use a NIP here.

TDQS

A4.3/5.0
Behavior4/5

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

Annotations already declare readOnlyHint, idempotentHint, and destructiveHint=false, so the safety profile is established. The description adds useful behavioral context by emphasizing that the expense is a single record tied to an explicitly selected company, reinforcing the companyId requirement and the read-only nature.

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

Conciseness5/5

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

The description is a single, front-loaded sentence with no filler. Every word contributes meaning: it identifies the action, resource, count, and company-scoping requirement.

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

Completeness5/5

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

For a simple read operation with two required parameters, full schema coverage, and strong annotations, the description is complete. It addresses the key nuance of selecting one specific company and one specific expense, and no critical additional context is missing for an agent to invoke it correctly.

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

Parameters3/5

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

Schema description coverage is 100%, with both id and companyId having clear descriptions, including the warning not to use a NIP for companyId. The description does not add much parameter-level detail beyond the schema, but the schema already carries the semantic weight, so baseline 3 is appropriate.

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

Purpose5/5

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

The description clearly states a specific verb ('Read'), a specific resource ('one expense'), and a specific scope ('from one explicitly selected wFirma client company'). This distinguishes it from sibling tools like wfirma_list_expenses, wfirma_get_invoice, and wfirma_get_payment without needing to inspect schemas.

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

Usage Guidelines4/5

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

The description conveys clear usage context: use this when you need a single expense for a specific company, not a list. It does not explicitly name alternatives or exclusions, but the singular 'one expense' and the requirement of an explicitly selected company provide sufficient situational guidance.

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

wfirma_get_invoiceGet wFirma invoiceA
Read-onlyIdempotent

Read one invoice from one explicitly selected wFirma client company.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYeswFirma record id.
companyIdYesInternal wFirma company id returned by wfirma_list_companies. Never use a NIP here.

TDQS

A4.1/5.0
Behavior3/5

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

Annotations already declare readOnlyHint, idempotentHint, and destructiveHint=false, so the safety profile is covered. The description adds only that the company must be explicitly selected; it does not add behavioral details such as response shape or error conditions, but the annotation bar is high.

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

Conciseness5/5

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

A single sentence with no filler, front-loading the action ('Read one invoice') and then the scope. Every word earns its place.

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

Completeness5/5

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

For a low-complexity read-one tool with two fully documented parameters and read-only annotations, the description is sufficient. No output schema is present, but 'Read one invoice' clearly conveys the expected result.

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

Parameters3/5

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

Schema description coverage is 100%, with both parameters already documented (id as wFirma record id; companyId as internal id from wfirma_list_companies and 'Never use a NIP here'). The description's 'explicitly selected' phrase mildly reinforces companyId semantics but does not materially add beyond the schema.

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

Purpose5/5

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

The description uses a specific verb ('Read') and resource ('one invoice') and adds a scope qualifier ('from one explicitly selected wFirma client company'), making it easy to distinguish from list_invoices. The word 'one' explicitly sets it apart from sibling listing tools.

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

Usage Guidelines4/5

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

The phrase 'one explicitly selected wFirma client company' gives clear context: use this when a single invoice for a known company is needed. It does not, however, explicitly name alternatives such as wfirma_list_invoices for fetching multiple invoices.

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

wfirma_get_paymentGet wFirma paymentA
Read-onlyIdempotent

Read one payment from one explicitly selected wFirma client company.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYeswFirma record id.
companyIdYesInternal wFirma company id returned by wfirma_list_companies. Never use a NIP here.

TDQS

A3.8/5.0
Behavior3/5

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

Annotations already declare this as read-only, idempotent, and non-destructive, so the description does not need to restate those traits. The phrase 'explicitly selected wFirma client company' adds useful scoping context, but the description discloses no additional behavioral details such as error cases or special constraints beyond the schema.

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

Conciseness5/5

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

The description is a single concise sentence that is front-loaded with the key facts: read, one payment, and company scoping. Every word earns its place, with no filler or repetition of the tool name.

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

Completeness4/5

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

For a simple read operation with fully documented parameters and safety annotations, the description is largely sufficient. It does not describe the return payload or error behavior despite no output schema, but the verb 'read one payment' and the tool's getter pattern make the expected result reasonably clear.

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

Parameters3/5

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

Schema description coverage is 100%, so both parameters already have clear documentation, including the caution not to use a NIP for companyId. The description adds no new parameter-level meaning beyond reinforcing that the company must be explicitly selected.

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

Purpose5/5

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

The description 'Read one payment from one explicitly selected wFirma client company' uses a specific verb and resource, and makes the singular scope clear. This distinguishes it from sibling tools like wfirma_list_payments, which would retrieve multiple payments, and from other getters targeting different resource types.

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

Usage Guidelines3/5

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

The description implies this tool is for retrieving a single payment after choosing a specific company, but it does not explicitly say when to prefer it over alternatives such as wfirma_list_payments. Context is present, but exclusions and alternative-selection guidance are left to inference.

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

wfirma_list_companiesList wFirma companiesA
Read-onlyIdempotent

Discover the client companies available to this wFirma accounting-office account. Returns internal company ids and NIPs separately.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.1/5.0
Behavior4/5

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. Beyond that, the description adds useful behavioral detail: it returns internal company ids and NIPs separately, and notes the account-scoped availability. This is meaningful extra context beyond the annotations.

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

Conciseness5/5

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

Two short sentences with no filler. The main purpose is front-loaded and the return detail is concise. Every word earns its place.

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

Completeness4/5

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

For a simple parameterless list tool with no output schema, the description provides the essential purpose, scope, and a hint at the return shape (internal company ids and NIPs). It could be slightly more explicit about what 'internal company ids' means or whether additional fields are included, but it is largely complete.

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

Parameters4/5

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

The tool has zero parameters, so the schema already fully covers parameter semantics. The description adds relevant context about the output (ids and NIPs) but is not required to explain parameters. Baseline 4 applies for a parameterless tool.

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

Purpose4/5

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

The description clearly states a specific verb ('Discover') and resource ('client companies available to this wFirma accounting-office account'), but it does not explicitly differentiate from sibling tools like wfirma_list_contractors. It is clear but lacks explicit sibling differentiation.

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

Usage Guidelines4/5

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

The description provides clear context: use it to discover client companies available to the account. It does not mention exclusions or alternatives, but the context is strong enough for an agent to infer when this tool applies.

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

wfirma_list_contractorsList wFirma contractorsA
Read-onlyIdempotent

List contractors for one explicitly selected wFirma client company.

ParametersJSON Schema
NameRequiredDescriptionDefault
pageNoPage number, starting at 1.
limitNoRecords per page, up to 100.
companyIdYesInternal wFirma company id returned by wfirma_list_companies. Never use a NIP here.

TDQS

A4/5.0
Behavior3/5

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 no behavioral detail beyond the scoping constraint 'for one explicitly selected wFirma client company,' which is more about usage context than behavior. It does not contradict the annotations.

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

Conciseness5/5

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

The description is a single, front-loaded sentence with zero wasted words. It states the verb, resource, and scope immediately, making it easy for an agent to parse quickly.

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

Completeness4/5

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

Given the simple list operation, 100% schema coverage, and rich annotations, the description is nearly complete. It could explicitly mention pagination or that companyId comes from wfirma_list_companies, but the schema already provides that. The description adequately conveys the core operation and selection requirement.

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

Parameters3/5

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

Schema description coverage is 100%, so the schema already documents all three parameters in detail, including the warning that companyId is an internal id from wfirma_list_companies and never a NIP. The description adds no additional parameter meaning beyond reinforcing that the company must be explicitly selected.

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

Purpose5/5

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

The description uses the specific verb 'List' with the resource 'contractors' and adds the crucial qualifier 'for one explicitly selected wFirma client company.' This clearly distinguishes it from listing all companies or getting a single contractor, and aligns with the required companyId parameter.

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

Usage Guidelines4/5

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

The description implies a usage precondition: the agent must have already selected a specific wFirma client company. It does not explicitly name alternatives like wfirma_get_contractor or wfirma_list_companies, but the 'one explicitly selected' phrasing gives clear context that this is not a cross-company listing tool.

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

wfirma_list_expensesList wFirma expensesA
Read-onlyIdempotent

List expenses for one explicitly selected wFirma client company.

ParametersJSON Schema
NameRequiredDescriptionDefault
pageNoPage number, starting at 1.
limitNoRecords per page, up to 100.
companyIdYesInternal wFirma company id returned by wfirma_list_companies. Never use a NIP here.

TDQS

A3.8/5.0
Behavior3/5

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 well covered. The description adds the behavioral constraint that listing is scoped to a single selected company, but it does not disclose pagination behavior or return characteristics beyond what the schema implies.

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

Conciseness5/5

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

The description is a single concise sentence that front-loads the action and resource. There is no filler, redundancy, or unnecessary detail.

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

Completeness4/5

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

For a simple read-only list tool with three self-documenting parameters and comprehensive annotations, this description is nearly complete. It could explicitly mention the returned format, but list semantics combined with page/limit parameters make invocation unambiguous.

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

Parameters3/5

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

Schema description coverage is 100%, with meaningful descriptions for page, limit, and companyId, including the warning never to use a NIP. The description only restates the company scoping requirement and adds no new parameter-level meaning.

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

Purpose4/5

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

The description clearly states the action ('List') and resource ('expenses') and narrows scope to one explicitly selected client company. It differentiates from a single-expense getter by its plural listing nature, but it does not explicitly distinguish it from sibling list tools.

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

Usage Guidelines4/5

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

The phrase 'for one explicitly selected wFirma client company' implies a required prerequisite: the caller must know which company to use and must supply an internal company id. The description gives clear context but does not explicitly say when to use this tool instead of alternatives like wfirma_get_expense.

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

wfirma_list_invoicesList wFirma invoicesA
Read-onlyIdempotent

List invoices for one explicitly selected wFirma client company.

ParametersJSON Schema
NameRequiredDescriptionDefault
pageNoPage number, starting at 1.
limitNoRecords per page, up to 100.
companyIdYesInternal wFirma company id returned by wfirma_list_companies. Never use a NIP here.

TDQS

A3.8/5.0
Behavior3/5

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

Annotations already declare readOnlyHint, idempotentHint, and non-destructive behavior, so the safety profile is covered. The description adds the scoping behavior (one selected company) but does not disclose pagination behavior, result shape, or ordering.

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

Conciseness5/5

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

A single front-loaded sentence that communicates the verb, resource, and scope with no filler. Every word adds meaning.

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

Completeness4/5

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

For a simple paginated list with fully documented parameters and safety annotations, the description plus schema is largely complete. The absence of an output schema is minor because the tool is a straightforward list operation, though an explicit note about the return shape would make it fully complete.

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

Parameters3/5

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

Input schema description coverage is 100%, with companyId, page, and limit fully documented, including the note to never use a NIP. The description reinforces the companyId scope but does not add meaning beyond what the schema already provides.

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

Purpose5/5

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

The description uses a specific verb ('List') and resource ('invoices') and adds a clear scoping constraint ('one explicitly selected wFirma client company'). This distinguishes it from sibling tools like wfirma_get_invoice (single invoice) and wfirma_list_expenses (different document type).

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

Usage Guidelines3/5

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

The phrase 'for one explicitly selected wFirma client company' implies a prerequisite: the agent must first select a company and supply its companyId. However, the description does not explicitly state when to choose this over alternatives such as wfirma_get_invoice or wfirma_list_expenses.

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

wfirma_list_paymentsList wFirma paymentsA
Read-onlyIdempotent

List payments for one explicitly selected wFirma client company.

ParametersJSON Schema
NameRequiredDescriptionDefault
pageNoPage number, starting at 1.
limitNoRecords per page, up to 100.
companyIdYesInternal wFirma company id returned by wfirma_list_companies. Never use a NIP here.

TDQS

A4/5.0
Behavior3/5

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 the scoping constraint ('one explicitly selected company') but does not add behavioral context such as pagination behavior, ordering, output shape, or rate limits. This is adequate but not rich.

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

Conciseness5/5

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

The description is a single front-loaded sentence with no filler. Every word contributes meaning, and the core scoping requirement is stated immediately.

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

Completeness4/5

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

For a simple read-only list operation with fully described parameters and safety annotations, the description is nearly complete. The only minor gap is that no output schema exists and the description does not hint at the returned payment fields, but 'List payments' plus the get_payment sibling makes the expected behavior reasonably clear.

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

Parameters3/5

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

Schema description coverage is 100%, so the structured schema already documents all three parameters clearly. The description reinforces the need for an explicit company selection but does not add parameter-level meaning beyond what the schema provides. Baseline 3 is appropriate.

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

Purpose5/5

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

The description uses a specific verb and resource: 'List payments' for a scoped entity ('one explicitly selected wFirma client company'). This clearly distinguishes the operation from sibling list tools for expenses, invoices, and contractors, and from the singular wfirma_get_payment.

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

Usage Guidelines4/5

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

The description clearly establishes the usage context: payments are listed per explicitly selected company, not across companies. The parameter description further reinforces this by stating companyId comes from wfirma_list_companies and never a NIP. It does not explicitly name alternative tools or when-not conditions, so it stops short of a 5.

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

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections. Dates show when Glama detected each change.

  1. 9 tool updatesv1.0.0
    • First observedwfirma_get_contractor
    • First observedwfirma_get_expense
    • First observedwfirma_get_invoice
    • First observedwfirma_get_payment
    • First observedwfirma_list_companies
    • First observedwfirma_list_contractors
    • First observedwfirma_list_expenses
    • First observedwfirma_list_invoices
    • First observedwfirma_list_payments

TDQS

A4.1/5.0
Disambiguation5/5

Each tool maps to a distinct resource and action: list/get pairs for expenses, invoices, contractors, and payments, plus a separate company discovery tool. There is no meaningful overlap between resources, and the list/get distinction is clear.

Naming Consistency5/5

All tool names follow the same `wfirma_list_<resource>` or `wfirma_get_<resource>` pattern. The naming is predictable and consistent across the entire server.

Tool Count5/5

Nine tools is well-scoped for this server: four entities each have list/get operations, plus one company discovery tool. Nothing feels redundant or excessive.

Completeness4/5

The server provides complete read-side coverage for expenses, invoices, contractors, and payments, with company discovery to support scoping. The only minor gap is the absence of write operations, but the descriptions suggest this is an intentionally read-focused accounting data access server.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Resources

Unclaimed servers have limited discoverability.

Looking for Admin?

If you are the server author, to access and configure the admin panel.

Related MCP Connectors

Related MCP Servers

  • A
    license
    A
    quality
    B
    maintenance
    Look up Polish companies from any AI assistant: registry data (KRS, REGON, CEIDG), VAT white list checks before payments, and financial statements of 4.4M businesses. Read-only tools backed by official public registers.
    4
    MIT
  • F
    license
    Not graded
    quality
    C
    maintenance
    Enables read-only access to InvoiceNinja data, including invoices, expenses, clients, and tax reports, for AI assistants like Claude.
    1
    -
  • A
    license
    Not graded
    quality
    F
    maintenance
    Provides read-only access to Trading 212 accounts, enabling AI assistants to retrieve portfolio positions, account summaries, instrument data, and transaction history.
    27
    5
    MIT
  • A
    license
    Not graded
    quality
    C
    maintenance
    Provides 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

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/agente-dev/wfirma-mcp'

If you have feedback or need assistance with the MCP directory API, please join our Discord server