Quaderno MCP by usefulapi
by usefulapi.io · remote · no sign-in to list tools · v1.16.3 · published by io.usefulapi
MCP server for Quaderno — tax-rate calculation, invoices, contacts, products, receipts & expenses.
23 tools: 5 can delete or cancel things, 1 do something that can't be undone, 1 change things and 16 only read.
Scanned Oct 21, 2026
- Deletes or cancels5Claude Code: deny: see these tools
- Can't be undone1Claude Code: ask: see these tools
- Changes things1Claude Code: ask: see these tools
- Only reads16Claude Code: allow: see these tools
2 checks matched something in the tool definitions. No finding is not a safety guarantee. How the checks work.
claude mcp add --transport http quaderno https://quaderno.usefulapi.io/mcpFindings
Matches of fixed checks, with the text they matched.
- Warncalculate_tax
The server marks "calculate_tax" read-only (readOnlyHint: true), and its own name, description or input give the class "irreversible".
What this check looks forMatched text
annotations: {"readOnlyHint":true}; The input carries an amount (input.amount) and a currency, so it moves money.
- Warnquaderno_request
The server marks "quaderno_request" read-only (readOnlyHint: true), and its own name, description or input give the class "write".
What this check looks forMatched text
annotations: {"readOnlyHint":true}; The name "quaderno_request" says "request": a word for a change.
Tools
Open a tool for its reasons and full description. Descriptions are the publisher's own words, shown as they are.
23 tools
Deletes or cancels 5Claude Code: deny
create_contactMUTATES Quaderno data — create a contact (customer or vendor).No findings
Why it is in this group
- The name "create_contact" says "create": a word for a change.
- The server marks it destructive (destructiveHint: true).
Description, as the server wrote it MUTATES Quaderno data — create a contact (customer or vendor). Provide kind plus a name; use `fields` for any other Quaderno contact attribute (phone_1, region, postal_code, city, street_line_1/2, tax_status, language, discount, notes, processor/processor_id). Quaderno API: POST /contacts. Returns the created contact.
Annotations the server declares
- title: Create a contact
- destructiveHint: true
create_invoiceMUTATES Quaderno data — create an invoice for a contact.No findings
Why it is in this group
- The name "create_invoice" says "create": a word for a change.
- The server marks it destructive (destructiveHint: true).
Description, as the server wrote it MUTATES Quaderno data — create an invoice for a contact. Provide contact_id (or a contact via `fields`) and items; use `fields` for any other attribute (currency, issue_date, due_date, po_number, notes, tag_list, custom_metadata, payment_details). Each item = { description, quantity, unit_price, tax_1_name?, tax_1_rate?, discount_rate?, … }. Quaderno API: POST /invoices. Returns the created invoice (incl. permalink, pdf).
Annotations the server declares
- title: Create an invoice
- destructiveHint: true
create_itemMUTATES Quaderno data — create a product/item in the catalog.No findings
Why it is in this group
- The name "create_item" says "create": a word for a change.
- The input takes a statement or command to run (input.code), which can change anything it can reach.
- The server marks it destructive (destructiveHint: true).
Description, as the server wrote it MUTATES Quaderno data — create a product/item in the catalog. Provide name + unit_cost; use `fields` for any other attribute (code, description, tax_class, tax_type, currency, country, stock). Quaderno API: POST /items. Returns the created item.
Annotations the server declares
- title: Create a product (item)
- destructiveHint: true
create_transactionMUTATES Quaderno data — record a sale or refund transaction (Quaderno computes tax and produces the compliant document).No findings
Why it is in this group
- The name "create_transaction" says "create": a word for a change.
- The server marks it destructive (destructiveHint: true).
Description, as the server wrote it MUTATES Quaderno data — record a sale or refund transaction (Quaderno computes tax and produces the compliant document). Provide the customer, items, and payment. Use `fields` for any other attribute (date, currency, shipping_address, evidence, processor, processor_id, processor_fee_cents, exchange_rate, po_number, notes, tags, custom_metadata). Quaderno API: POST /transactions. Returns the created invoice/credit-note object.
Annotations the server declares
- title: Create a transaction
- destructiveHint: true
update_contactMUTATES Quaderno data — update an existing contact.No findings
Why it is in this group
- The name "update_contact" says "update": a word for a change.
- The server marks it destructive (destructiveHint: true).
Description, as the server wrote it MUTATES Quaderno data — update an existing contact. Only the fields you pass are changed; use `fields` for any attribute not typed here. Quaderno API: PUT /contacts/{id}. Returns the updated contact.
Annotations the server declares
- title: Update a contact
- destructiveHint: true
Can't be undone 1Claude Code: ask
calculate_taxCalculate the correct tax rate/amount for a sale given the customer's location and product.1 finding
Why it is in this group
- The input carries an amount (input.amount) and a currency, so it moves money.
- The server marks it read-only (readOnlyHint: true), but an annotation never lowers a class.
Findings
- Warn
The server marks "calculate_tax" read-only (readOnlyHint: true), and its own name, description or input give the class "irreversible".
What this check looks forMatched text
annotations: {"readOnlyHint":true}; The input carries an amount (input.amount) and a currency, so it moves money.
Description, as the server wrote it Calculate the correct tax rate/amount for a sale given the customer's location and product. This is Quaderno's flagship endpoint — it applies the right VAT / GST / US sales-tax rules per jurisdiction. READ-ONLY (no record is created). Quaderno API: GET /tax_rates/calculate. Returns { name, rate, country, region, county, city, tax_code, status (taxable|non_taxable|not_registered|reverse_charge), tax_amount, subtotal, total_amount }.
Annotations the server declares
- title: Calculate tax rate
- readOnlyHint: true
Changes things 1Claude Code: ask
quaderno_requestPower-user escape hatch: GET any Quaderno API path not wrapped by a dedicated tool.1 finding
Why it is in this group
- The name "quaderno_request" says "request": a word for a change.
- The server marks it read-only (readOnlyHint: true), but an annotation never lowers a class.
Findings
- Warn
The server marks "quaderno_request" read-only (readOnlyHint: true), and its own name, description or input give the class "write".
What this check looks forMatched text
annotations: {"readOnlyHint":true}; The name "quaderno_request" says "request": a word for a change.
Description, as the server wrote it Power-user escape hatch: GET any Quaderno API path not wrapped by a dedicated tool. READ-ONLY — only GET is allowed. Path is taken after /api (e.g. "/tax_ids", "/evidence"). Quaderno API: GET {path}.
Annotations the server declares
- title: Raw read request
- readOnlyHint: true
Only reads 16Claude Code: allow
get_contactFetch a single contact by id.No findings
Why it is in this group
- The name "get_contact" says "get": a word for reading.
Description, as the server wrote it Fetch a single contact by id. Quaderno API: GET /contacts/{id}.
Annotations the server declares
- title: Get a contact
- readOnlyHint: true
get_credit_noteFetch a single credit note by id.No findings
Why it is in this group
- The name "get_credit_note" says "get": a word for reading.
Description, as the server wrote it Fetch a single credit note by id. Quaderno API: GET /credit_notes/{id}.
Annotations the server declares
- title: Get a credit note
- readOnlyHint: true
get_expenseFetch a single expense by id.No findings
Why it is in this group
- The name "get_expense" says "get": a word for reading.
Description, as the server wrote it Fetch a single expense by id. Quaderno API: GET /expenses/{id}.
Annotations the server declares
- title: Get an expense
- readOnlyHint: true
get_invoiceFetch a single invoice by id (full object incl.No findings
Why it is in this group
- The name "get_invoice" says "get": a word for reading.
Description, as the server wrote it Fetch a single invoice by id (full object incl. items, taxes, payments, permalink, pdf). Quaderno API: GET /invoices/{id}.
Annotations the server declares
- title: Get an invoice
- readOnlyHint: true
get_itemFetch a single product/item by id.No findings
Why it is in this group
- The name "get_item" says "get": a word for reading.
Description, as the server wrote it Fetch a single product/item by id. Quaderno API: GET /items/{id}.
Annotations the server declares
- title: Get a product (item)
- readOnlyHint: true
get_receiptFetch a single receipt by id.No findings
Why it is in this group
- The name "get_receipt" says "get": a word for reading.
Description, as the server wrote it Fetch a single receipt by id. Quaderno API: GET /receipts/{id}.
Annotations the server declares
- title: Get a receipt
- readOnlyHint: true
list_contactsList contacts (customers/vendors), newest first.No findings
Why it is in this group
- The name "list_contacts" says "list": a word for reading.
Description, as the server wrote it List contacts (customers/vendors), newest first. Quaderno API: GET /contacts. Returns contact objects (id, kind, first_name, last_name, contact_name, email, country, tax_id, tax_status, …), wrapped as { data, pagination } when more pages exist.
Annotations the server declares
- title: List contacts
- readOnlyHint: true
list_credit_notesList credit notes (refund documents), newest first.No findings
Why it is in this group
- The name "list_credit_notes" says "list": a word for reading.
Description, as the server wrote it List credit notes (refund documents), newest first. Quaderno API: GET /credit_notes. Wrapped as { data, pagination } when more pages exist.
Annotations the server declares
- title: List credit notes
- readOnlyHint: true
list_expensesList expenses (bills you received), newest first.No findings
Why it is in this group
- The name "list_expenses" says "list": a word for reading.
Description, as the server wrote it List expenses (bills you received), newest first. Quaderno API: GET /expenses. Wrapped as { data, pagination } when more pages exist.
Annotations the server declares
- title: List expenses
- readOnlyHint: true
list_invoicesList invoices, newest first, with optional filters.No findings
Why it is in this group
- The name "list_invoices" says "list": a word for reading.
Description, as the server wrote it List invoices, newest first, with optional filters. Quaderno API: GET /invoices. Returns invoice objects (id, number, issue_date, due_date, currency, contact, items, taxes, payments, state, total_cents, subtotal_cents), wrapped as { data, pagination } when more pages exist.
Annotations the server declares
- title: List invoices
- readOnlyHint: true
list_itemsList products/items in the catalog, newest first.No findings
Why it is in this group
- The name "list_items" says "list": a word for reading.
Description, as the server wrote it List products/items in the catalog, newest first. Quaderno API: GET /items. Returns item objects (id, code, name, kind, product_type, unit_cost, tax_class, tax_type, currency, stock, …), wrapped as { data, pagination } when more pages exist.
Annotations the server declares
- title: List products (items)
- readOnlyHint: true
list_jurisdictionsList the tax jurisdictions (id, name, country, region) where the account is registered to collect tax.No findings
Why it is in this group
- The name "list_jurisdictions" says "list": a word for reading.
Description, as the server wrote it List the tax jurisdictions (id, name, country, region) where the account is registered to collect tax. Quaderno API: GET /jurisdictions.
Annotations the server declares
- title: List tax jurisdictions
- readOnlyHint: true
list_receiptsList receipts, newest first.No findings
Why it is in this group
- The name "list_receipts" says "list": a word for reading.
Description, as the server wrote it List receipts, newest first. Quaderno API: GET /receipts. Wrapped as { data, pagination } when more pages exist.
Annotations the server declares
- title: List receipts
- readOnlyHint: true
list_tax_codesList the product tax codes Quaderno supports (id, name, description) — used as the tax_code on products / tax calculations.No findings
Why it is in this group
- The name "list_tax_codes" says "list": a word for reading.
Description, as the server wrote it List the product tax codes Quaderno supports (id, name, description) — used as the tax_code on products / tax calculations. Quaderno API: GET /tax_codes.
Annotations the server declares
- title: List tax codes
- readOnlyHint: true
list_webhooksList the account's configured webhooks (id, url, events).No findings
Why it is in this group
- The name "list_webhooks" says "list": a word for reading.
Description, as the server wrote it List the account's configured webhooks (id, url, events). Quaderno API: GET /webhooks.
Annotations the server declares
- title: List webhooks
- readOnlyHint: true
pingVerify the API key and connection by pinging Quaderno.No findings
Why it is in this group
- The name "ping" says "ping": a word for reading.
Description, as the server wrote it Verify the API key and connection by pinging Quaderno. Returns account/authentication status. Quaderno API: GET /ping.
Annotations the server declares
- title: Ping (verify auth)
- readOnlyHint: true
This is not a safety rating, and no finding is not a safety guarantee. The groups and findings come from fixed checks of the tool definitions the server returned on the date shown, not from its code or what it does when called. How the checks work.
Install
Pinned to version 1.16.3. Values in angle brackets are yours to fill in.
claude mcp add --transport http quaderno https://quaderno.usefulapi.io/mcpRun in a terminal.
Claude Code permissions
Allow the reads, ask before a change, deny the deletes. Paste into .claude/settings.json.
{
"permissions": {
"allow": [
"mcp__quaderno__ping",
"mcp__quaderno__list_invoices",
"mcp__quaderno__get_invoice",
"mcp__quaderno__list_contacts",
"mcp__quaderno__get_contact",
"mcp__quaderno__list_items",
"mcp__quaderno__get_item",
"mcp__quaderno__list_credit_notes",
"mcp__quaderno__get_credit_note",
"mcp__quaderno__list_receipts",
"mcp__quaderno__get_receipt",
"mcp__quaderno__list_expenses",
"mcp__quaderno__get_expense",
"mcp__quaderno__list_tax_codes",
"mcp__quaderno__list_jurisdictions",
"mcp__quaderno__list_webhooks"
],
"ask": [
"mcp__quaderno__calculate_tax",
"mcp__quaderno__quaderno_request"
],
"deny": [
"mcp__quaderno__create_contact",
"mcp__quaderno__update_contact",
"mcp__quaderno__create_item",
"mcp__quaderno__create_invoice",
"mcp__quaderno__create_transaction"
]
}
}Tools that only read are allowed, tools that change things ask first, tools that delete or cancel are denied. It assumes the server is installed as quaderno. Review it before you use it.