Skip to main content
Glama
AnderRahe

Quaderno MCP Server

by AnderRahe

The Problem

Tax compliance across borders is a nightmare. Different VAT rates per country, tax ID validation against government databases, reverse charge rules, digital services taxes... and your AI assistant can't help because it has no access to real-time tax data.

Related MCP server: Qonto MCP Server

The Solution

This MCP server gives any AI assistant (Claude, GPT, etc.) direct access to Quaderno's tax engine. Ask in plain English, get accurate, compliant answers.

You: "What tax should I charge for a SaaS sale to a customer in Spain?"
AI:  IVA at 21% — status: taxable, currency: EUR

Tools

Tool

What it does

calculate_tax

Real-time tax rate calculation by country, postal code, and product type

validate_tax_id

Validate VAT/GST/ABN numbers against EU VIES, UK HMRC, and more

create_contact

Create customers and companies with full billing details

create_invoice

Generate tax-compliant invoices with automatic tax calculation

list_invoices

Search and filter invoices by contact, status, or date

Quick Start

1. Get your API key

Sign up at quaderno.io or create a free sandbox account for testing. Find your API key in Settings > API Keys.

2. Configure for Claude Desktop

Add to your config file:

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

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

{
  "mcpServers": {
    "quaderno": {
      "command": "node",
      "args": ["/path/to/quaderno-mcp-server/dist/index.js"],
      "env": {
        "QUADERNO_API_KEY": "sk_live_your_key_here",
        "QUADERNO_API_URL": "https://your-account.quadernoapp.com/api"
      }
    }
  }
}

For sandbox testing, use https://your-account.sandbox-quadernoapp.com/api

Examples

Tax calculation

"What's the VAT rate for selling digital services in Spain?"

{
  "country": "ES",
  "name": "IVA",
  "rate": 21.0,
  "tax_code": "eservice",
  "status": "taxable",
  "currency": "EUR"
}

Tax ID validation

"Is this Spanish tax ID valid? ESB86412491"

{
  "valid": true
}

Full invoicing flow

"Create a company contact for TechCorp in Madrid and invoice them 500 EUR for consulting"

The AI will chain create_contactcreate_invoice automatically, producing a tax-compliant invoice with the correct Spanish IVA applied.

Supported Tax Jurisdictions

Quaderno supports real-time tax calculation for 200+ countries and tax ID validation for:

  • EU: All 27 member states (VAT via VIES)

  • United Kingdom: VAT via HMRC

  • Switzerland: UID

  • Australia: ABN/GST

  • New Zealand: GST

  • Canada: Quebec QST

Development

git clone https://github.com/AnderRahe/quaderno-mcp-server.git
cd quaderno-mcp-server
npm install
cp .env.example .env   # Add your credentials
npm run build

Test with MCP Inspector

npx @modelcontextprotocol/inspector node ./dist/index.js

Environment Variables

Variable

Required

Description

QUADERNO_API_KEY

Yes

Your Quaderno private API key

QUADERNO_API_URL

Yes

Full API base URL including /api

Built With

License

MIT

Available Tools

5 tools
calculate_taxCalculate TaxA

Calculate the applicable tax rate for a transaction based on customer location, product type, and optionally a tax ID. Returns the tax rate, tax name, and whether reverse charge applies.

ParametersJSON Schema
NameRequiredDescriptionDefault
amountNoTransaction amount — used to calculate the tax amount
tax_idNoCustomer tax ID (e.g. VAT number). If valid, reverse charge may apply
to_cityNoCustomer city
tax_codeNoTax code for the product/service (e.g. eservice, saas, ebook, standard)
to_countryYesISO 3166-1 alpha-2 country code of the customer (e.g. DE, US, GB)
to_postal_codeNoCustomer postal code — required for US tax calculations

TDQS

A3.6/5.0
Behavior3/5

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

No annotations exist, so the description carries the full burden. It helpfully discloses the return content (tax rate, tax name, reverse-charge flag) which compensates for the missing output schema, but says nothing about edge cases such as jurisdiction-specific requirements, failure modes, or latency/auth considerations.

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 tight sentences: the purpose first, the return shape second. Every clause earns its place and nothing is padded.

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?

With no output schema, the description usefully states what comes back, and the 100%-covered input schema handles the inputs. It misses only operational edge cases (e.g. that postal code is mandatory for US) which the schema partly covers.

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 every parameter is already documented in the schema. The description only restates the main input categories (location, product type, tax ID) without adding syntax or value constraints, so 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?

Specific verb+resource ('Calculate the applicable tax rate for a transaction') with an explicit basis (customer location, product type, optional tax ID). It is clearly distinguished in kind from its siblings (validate_tax_id, create_invoice), though it never names or routes against them.

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?

Usage is implied by the description—you call it to determine a transaction's tax treatment—but there is no explicit when-to-use, when-not, or relationship to validate_tax_id, which an agent might otherwise confuse it with.

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

create_contactCreate ContactB

Create a new contact (customer or company) in Quaderno. The contact can later be referenced when creating invoices.

ParametersJSON Schema
NameRequiredDescriptionDefault
cityNoCity
kindYesWhether the contact is a person or a company
emailNoEmail address
regionNoState or region
tax_idNoTax identification number (VAT, NIF, etc.)
countryNoISO 3166-1 alpha-2 country code
phone_1NoPhone number
languageNoTwo-letter language code for invoices (e.g. en, es, de)
last_nameNoLast name
first_nameYesFirst name (or company name if kind=company)
postal_codeNoPostal code
street_line_1NoStreet address line 1
street_line_2NoStreet address line 2

TDQS

B3.3/5.0
Behavior2/5

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

No annotations are provided, so the description carries the full burden. It does not state permission requirements, what happens on duplicate email/tax_id, whether tax_id is validated, or whether creation is idempotent — significant gaps for a mutation tool whose sibling validate_tax_id exists.

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, front-loaded with the core action and scope, with zero filler. Every clause contributes.

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

Completeness3/5

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

For a 13-parameter mutation tool with no output schema and no annotations, the description is adequate but thin. It conveys what is created and its downstream use, but omits permissions, failure modes, and any hint of the returned identifier an agent would need to reference the contact later.

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 every parameter (including the kind enum and the first_name-as-company-name nuance) is already documented in the schema. The description adds no parameter-level meaning beyond that, so the baseline of 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?

Names a specific verb and resource ('Create a new contact') and clarifies the scope with '(customer or company)'. It does not explicitly differentiate itself from siblings like create_invoice, though the mention that contacts are referenced when creating invoices gives a loose relational cue.

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 second sentence implies the tool is used when you need a contact to later attach to invoices, which gives implied context. However, there is no explicit when-to-use/when-not guidance, no prerequisites, and no named alternatives among siblings.

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

create_invoiceCreate InvoiceC

Create a tax-compliant invoice in Quaderno. You can reference an existing contact by ID or provide a contact name. Items include description, quantity, and unit price.

ParametersJSON Schema
NameRequiredDescriptionDefault
itemsYesLine items for the invoice
notesNoNotes to appear on the invoice
currencyNoISO 4217 currency code (e.g. USD, EUR). Defaults to account currency
tag_listNoComma-separated tags
po_numberNoPurchase order number
contact_idNoID of an existing Quaderno contact
contact_nameNoContact name — used if contact_id is not provided
payment_detailsNoPayment instructions

TDQS

C2.9/5.0
Behavior2/5

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

With no annotations, the description carries the full behavioral burden. 'Tax-compliant' implies tax handling, but there is no disclosure of auth requirements, whether the invoice is created as draft or finalized, idempotency, or side effects such as contact auto-creation when contact_name is supplied.

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

Conciseness4/5

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

Two tight sentences, front-loaded with the core action, with zero filler. It is efficient, though the second sentence largely duplicates schema content.

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

Completeness3/5

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

A mutation tool with 8 parameters, no annotations, and no output schema, so the description should say more about the response or lifecycle. Implicit coverage of the contact reference helps, but return value and post-creation state are left unstated.

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 8 parameters and the baseline is 3. The description restates the item structure (description, quantity, unit price) and the contact lookup behavior, but adds no format, default, or constraint detail beyond the schema.

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

Purpose4/5

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

States a specific verb and resource ('Create a tax-compliant invoice in Quaderno') and outlines what an invoice contains, distinguishing it from list_invoices and create_contact by implication. It never names a sibling explicitly, so the differentiation is only implicit.

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

Usage Guidelines2/5

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

The description offers no when-to-use or when-not guidance, and no prerequisites (e.g. contact must exist first, or that create_contact precedes this). The contact-by-ID-or-name note is parameter help, not usage routing, so there is effectively no alternative-selection guidance.

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

list_invoicesList InvoicesB

List invoices from your Quaderno account. Supports filtering by contact name, state, and date.

ParametersJSON Schema
NameRequiredDescriptionDefault
qNoSearch by contact name
dateNoFilter by date (YYYY-MM-DD format)
pageNoPage number for pagination (25 results per page)
stateNoFilter by state (e.g. outstanding, paid, late, archived)

TDQS

B3.2/5.0
Behavior2/5

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

No annotations are provided, so the description carries the full behavioral burden. It does not state that the operation is read-only, whether results are paginated (only the schema hints at page), auth requirements, or what the response contains. The filter context is thin for a tool with zero annotation coverage.

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

Conciseness4/5

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

Two tight sentences with the core purpose front-loaded and filtering scope second. No filler, though the second sentence largely echoes schema fields.

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

Completeness3/5

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

For a zero-required-param list tool the description is adequate, but with no output schema and no annotations it omits return shape, pagination behavior, and safety profile. It covers the minimum needed to invoke, not the full behavioral picture.

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 all four params (q, date, page, state) are already documented. The description restates three of them (contact name, state, date) but ignores pagination and adds no syntax or format detail beyond the schema. 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?

States a specific verb+resource: 'List invoices from your Quaderno account.' An agent can distinguish this from create_invoice and create_contact by the 'List' verb. It stops short of differentiating scope from any sibling list tool, but none exists here.

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 sentence 'Supports filtering by ...' implies when the tool is useful, but there is no explicit when-to-use guidance or exclusion relative to siblings (e.g., create_invoice, calculate_tax). Usage is only implied by the read-oriented 'List' verb.

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

validate_tax_idValidate Tax IDB

Validate a tax identification number (VAT, GST, ABN, etc.). Supports EU VAT numbers, UK VAT, Switzerland, Australia, New Zealand, and Canada (Quebec).

ParametersJSON Schema
NameRequiredDescriptionDefault
tax_idYesTax identification number to validate
countryYesISO 3166-1 alpha-2 country code (e.g. DE, GB, AU)

TDQS

B3/5.0
Behavior2/5

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

With no annotations, the description carries the full behavioral burden and falls short. It does not say whether validation is a pure format/checksum check or a live registry lookup, what happens with an unsupported country, whether it throws or returns a boolean/status, or whether auth is required. Only the supported-region list adds any behavioral context.

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

Conciseness4/5

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

Two compact sentences with no filler, and the core action is front-loaded. It could be tightened slightly, but nothing is wasted.

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

Completeness2/5

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

With no output schema and no annotations, the description must explain what a validation result looks like and what unsupported or invalid input produces, and it does neither. For a pure-input validation utility whose only value is its verdict, this is a substantial gap.

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

Parameters4/5

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

Schema coverage is 100%, so both parameters are documented in the schema and the baseline is 3. The description adds real meaning for the country parameter by enumerating the supported jurisdictions (EU, UK, Switzerland, Australia, New Zealand, Canada/Quebec), which effectively communicates the valid range of country inputs.

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 gives a specific verb (validate) and resource (tax identification number) and enumerates the identifier types covered (VAT, GST, ABN). It does not explicitly differentiate itself from siblings like calculate_tax, but those are clearly different operations, so the tool is unambiguous.

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

Usage Guidelines2/5

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

There is no guidance on when to call this tool versus the siblings — e.g. whether it should be used as a preflight check before create_invoice or create_contact. Usage is only implied by the tool name, with no conditions, prerequisites, or alternatives named.

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

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 5 tool updatesv1.0.0
    • First observedcalculate_tax
    • First observedcreate_contact
    • First observedcreate_invoice
    • First observedlist_invoices
    • First observedvalidate_tax_id

TDQS

A3.5/5.0

Scored across 5 tools

Disambiguation5/5

Each tool has a distinct verb+resource focus: tax calculation, tax ID validation, contact creation, invoice creation, and invoice listing. No two tools overlap in triggering conditions.

Naming Consistency5/5

All names use snake_case with a leading verb (calculate_, validate_, create_, list_) and are consistent in structure. There is no camelCase mixing or vague naming.

Tool Count5/5

Five tools is well-scoped for a focused tax and invoicing integration. Each tool earns its place, and the set is not bloated or trivially thin.

Completeness3/5

Core create/list flows for invoices and contacts are present, but there is no get/update/delete for invoices or contacts, and no invoice retrieval by ID. These are notable lifecycle gaps that can block common correction or lookup workflows.

Maintenance

ActivityInactive
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    A
    quality
    D
    maintenance
    Enables AI assistants to query and manage QuickBooks Online data through natural language, including customers, invoices, bills, vendors, accounts, and financial reports.
    7
    MIT
  • A
    license
    Not graded
    quality
    D
    maintenance
    Enables AI assistants to access Qonto financial data including organization info, account balances, transaction history, and business operations through natural language.
    41
    MIT
  • A
    license
    Not graded
    quality
    D
    maintenance
    Connects AI assistants to QuickBooks Online, enabling management of invoices, customers, expenses, and reports through natural language.
    MIT