Quaderno MCP Server
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., "@Quaderno MCP ServerWhat's the VAT rate for digital services in Spain?"
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.
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: EURTools
Tool | What it does |
| Real-time tax rate calculation by country, postal code, and product type |
| Validate VAT/GST/ABN numbers against EU VIES, UK HMRC, and more |
| Create customers and companies with full billing details |
| Generate tax-compliant invoices with automatic tax calculation |
| 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.jsonWindows:
%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_contact → create_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 buildTest with MCP Inspector
npx @modelcontextprotocol/inspector node ./dist/index.jsEnvironment Variables
Variable | Required | Description |
| Yes | Your Quaderno private API key |
| Yes | Full API base URL including |
Built With
Model Context Protocol SDK — Server framework
Quaderno API — Tax compliance engine
Zod — Schema validation
TypeScript + stdio transport
License
Available Tools
5 toolscalculate_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.
| Name | Required | Description | Default |
|---|---|---|---|
| amount | No | Transaction amount — used to calculate the tax amount | |
| tax_id | No | Customer tax ID (e.g. VAT number). If valid, reverse charge may apply | |
| to_city | No | Customer city | |
| tax_code | No | Tax code for the product/service (e.g. eservice, saas, ebook, standard) | |
| to_country | Yes | ISO 3166-1 alpha-2 country code of the customer (e.g. DE, US, GB) | |
| to_postal_code | No | Customer postal code — required for US tax calculations |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| city | No | City | |
| kind | Yes | Whether the contact is a person or a company | |
| No | Email address | ||
| region | No | State or region | |
| tax_id | No | Tax identification number (VAT, NIF, etc.) | |
| country | No | ISO 3166-1 alpha-2 country code | |
| phone_1 | No | Phone number | |
| language | No | Two-letter language code for invoices (e.g. en, es, de) | |
| last_name | No | Last name | |
| first_name | Yes | First name (or company name if kind=company) | |
| postal_code | No | Postal code | |
| street_line_1 | No | Street address line 1 | |
| street_line_2 | No | Street address line 2 |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| items | Yes | Line items for the invoice | |
| notes | No | Notes to appear on the invoice | |
| currency | No | ISO 4217 currency code (e.g. USD, EUR). Defaults to account currency | |
| tag_list | No | Comma-separated tags | |
| po_number | No | Purchase order number | |
| contact_id | No | ID of an existing Quaderno contact | |
| contact_name | No | Contact name — used if contact_id is not provided | |
| payment_details | No | Payment instructions |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| q | No | Search by contact name | |
| date | No | Filter by date (YYYY-MM-DD format) | |
| page | No | Page number for pagination (25 results per page) | |
| state | No | Filter by state (e.g. outstanding, paid, late, archived) |
TDQS
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.
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.
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.
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.
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.
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).
| Name | Required | Description | Default |
|---|---|---|---|
| tax_id | Yes | Tax identification number to validate | |
| country | Yes | ISO 3166-1 alpha-2 country code (e.g. DE, GB, AU) |
TDQS
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.
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.
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.
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.
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.
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.
5 tool updates
v1.0.0- First observed
calculate_tax - First observed
create_contact - First observed
create_invoice - First observed
list_invoices - First observed
validate_tax_id
TDQS
Scored across 5 tools
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.
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.
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.
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
Related MCP Connectors
EU/UK VAT compliance for AI agents: number validation, rate lookups, reverse-charge checks.
Validate EU, UK, AU VAT numbers for AI agents. EU ViDA e-invoicing compliance.
Connect your AI to your Well financial data - invoices, companies, contacts.
Compliant invoicing for freelancers: create, issue and track invoices from your AI agent.
Related MCP Servers
- AlicenseAqualityDmaintenanceEnables AI assistants to query and manage QuickBooks Online data through natural language, including customers, invoices, bills, vendors, accounts, and financial reports.7MIT

Qonto MCP Serverofficial
AlicenseNot gradedqualityDmaintenanceEnables AI assistants to access Qonto financial data including organization info, account balances, transaction history, and business operations through natural language.41MIT- AlicenseNot gradedqualityDmaintenanceConnects AI assistants to QuickBooks Online, enabling management of invoices, customers, expenses, and reports through natural language.MIT
- AlicenseNot gradedqualityDmaintenanceEnables AI assistants to manage business operations including invoicing, WooCommerce syncing, expense tracking, POS, inventory, and team management through natural language.31 npm2MIT