Skip to content

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.

Deletes · 5Final · 1Changes · 1

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

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/mcp

Findings

Matches of fixed checks, with the text they matched.

2 warn
  • The server marks "calculate_tax" read-only (readOnlyHint: true), and its own name, description or input give the class "irreversible".

    Matched text

    annotations: {"readOnlyHint":true}; The input carries an amount (input.amount) and a currency, so it moves money.

    What this check looks for
  • The server marks "quaderno_request" read-only (readOnlyHint: true), and its own name, description or input give the class "write".

    Matched text

    annotations: {"readOnlyHint":true}; The name "quaderno_request" says "request": a word for a change.

    What this check looks for

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".

      Matched text

      annotations: {"readOnlyHint":true}; The input carries an amount (input.amount) and a currency, so it moves money.

      What this check looks for
    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".

      Matched text

      annotations: {"readOnlyHint":true}; The name "quaderno_request" says "request": a word for a change.

      What this check looks for
    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/mcp

Run in a terminal.

Claude Code permissions

Allow the reads, ask before a change, deny the deletes. Paste into .claude/settings.json.

.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.