Skip to content

e-Boekhouden MCP by usefulapi

by usefulapi.io · remote · no sign-in to list tools · v1.3.3 · published by io.usefulapi

Read e-Boekhouden relations, invoices, ledgers, bookings and products; create relations, invoices.

Deletes · 4Changes · 4

25 tools: 4 can delete or cancel things, 4 change things and 17 only read.

Scanned Oct 21, 2026

4 checks matched something in the tool definitions. No finding is not a safety guarantee. How the checks work.

claude mcp add --transport http e-boekhouden https://e-boekhouden.usefulapi.io/mcp

Findings

Matches of fixed checks, with the text they matched.

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

    Matched text

    annotations: {"readOnlyHint":true}; The name "eboekhouden_list_relations" says "list": a word for reading.

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

    Matched text

    annotations: {"readOnlyHint":true}; The name "eboekhouden_list_outstanding_invoices" says "list": a word for reading.

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

    Matched text

    annotations: {"readOnlyHint":true}; The name "eboekhouden_list_ledgers" says "list": a word for reading.

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

    Matched text

    annotations: {"readOnlyHint":true}; The name "eboekhouden_list_products" says "list": a word for reading.

    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.

25 tools

Deletes or cancels 4Claude Code: deny
  • eboekhouden_create_invoiceCreate a sales invoice for a relation.No findings

    Why it is in this group

    • The name "eboekhouden_create_invoice" says "create": a word for a change.
    • The server marks it destructive (destructiveHint: true).
    Description, as the server wrote it
    Create a sales invoice for a relation. PERMANENT: the API cannot change or delete invoices afterwards, and an invoice number is used up. The invoice is created only: it is NOT e-mailed to the customer, NOT booked as a mutation and no direct debit is set. Needs relation_id, template_id (eboekhouden_list_invoice_templates), term_of_payment in days and at least one item with a ledger_id. Returns the new id and invoice number. POST /v1/invoice.

    Annotations the server declares

    • title: Create an invoice
    • destructiveHint: true
  • eboekhouden_create_productCreate a product or service.No findings

    Why it is in this group

    • The name "eboekhouden_create_product" 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
    Create a product or service. Needs code, description, a sale VAT code and a ledger id, and exactly one of price_excl or price_incl. Returns the new id. POST /v1/product.

    Annotations the server declares

    • title: Create a product
    • destructiveHint: true
  • eboekhouden_create_relationCreate a new relation (customer or supplier) in the administration.No findings

    Why it is in this group

    • The name "eboekhouden_create_relation" 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
    Create a new relation (customer or supplier) in the administration. Only name is required; the code is generated when omitted. Returns the new id and code. POST /v1/relation.

    Annotations the server declares

    • title: Create a relation
    • destructiveHint: true
  • eboekhouden_update_relationChange fields of an existing relation.No findings

    Why it is in this group

    • The name "eboekhouden_update_relation" says "update": 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
    Change fields of an existing relation. The tool first reads the relation, then sends its current values with your changes on top (the API requires name on every update), so fields you do not pass keep their values. This overwrites the current values of the fields you pass. GET + PATCH /v1/relation/{id}.

    Annotations the server declares

    • title: Update a relation
    • destructiveHint: true
    • idempotentHint: true
Changes things 4Claude Code: ask
  • eboekhouden_list_ledgersThe ledger accounts (grootboekrekeningen): id, code, description and category (BAL balance, VW profit and loss, FIN, DEB, CRED, AF6, AF19, AFOVERIG, VOOR, BTWRC, AF).1 finding

    Why it is in this group

    • The name "eboekhouden_list_ledgers" says "list": a word for reading.
    • The input takes a statement or command to run (input.code), which can change anything it can reach.
    • The server marks it read-only (readOnlyHint: true), but an annotation never lowers a class.

    Findings

    • Warn

      The server marks "eboekhouden_list_ledgers" read-only (readOnlyHint: true), and its own name, description or input give the class "write".

      Matched text

      annotations: {"readOnlyHint":true}; The name "eboekhouden_list_ledgers" says "list": a word for reading.

      What this check looks for
    Description, as the server wrote it
    The ledger accounts (grootboekrekeningen): id, code, description and category (BAL balance, VW profit and loss, FIN, DEB, CRED, AF6, AF19, AFOVERIG, VOOR, BTWRC, AF). Use the id as ledger_id in other tools. Paged: pass next_offset as offset. GET /v1/ledger.

    Annotations the server declares

    • title: List ledgers (chart of accounts)
    • readOnlyHint: true
  • eboekhouden_list_outstanding_invoicesOpen (unpaid) invoices: debtors (D, sales invoices customers still owe) or creditors (C, purchase invoices still to be paid).1 finding

    Why it is in this group

    • The name "eboekhouden_list_outstanding_invoices" says "list": a word for reading.
    • The description's first verb is "open": 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 "eboekhouden_list_outstanding_invoices" read-only (readOnlyHint: true), and its own name, description or input give the class "write".

      Matched text

      annotations: {"readOnlyHint":true}; The name "eboekhouden_list_outstanding_invoices" says "list": a word for reading.

      What this check looks for
    Description, as the server wrote it
    Open (unpaid) invoices: debtors (D, sales invoices customers still owe) or creditors (C, purchase invoices still to be paid). Paged: pass next_offset as offset. GET /v1/mutation/invoice/outstanding.

    Annotations the server declares

    • title: List outstanding invoices
    • readOnlyHint: true
  • eboekhouden_list_productsList products and services (articles) with price, VAT code, ledger and unit, optionally by code or group code.1 finding

    Why it is in this group

    • The name "eboekhouden_list_products" says "list": a word for reading.
    • The input takes a statement or command to run (input.code), which can change anything it can reach.
    • The server marks it read-only (readOnlyHint: true), but an annotation never lowers a class.

    Findings

    • Warn

      The server marks "eboekhouden_list_products" read-only (readOnlyHint: true), and its own name, description or input give the class "write".

      Matched text

      annotations: {"readOnlyHint":true}; The name "eboekhouden_list_products" says "list": a word for reading.

      What this check looks for
    Description, as the server wrote it
    List products and services (articles) with price, VAT code, ledger and unit, optionally by code or group code. Paged: pass next_offset as offset. GET /v1/product.

    Annotations the server declares

    • title: List products
    • readOnlyHint: true
  • eboekhouden_list_relationsList relations (customers and suppliers of the administration), optionally filtered (filters combine with AND).1 finding

    Why it is in this group

    • The name "eboekhouden_list_relations" says "list": a word for reading.
    • The input takes a statement or command to run (input.code), which can change anything it can reach.
    • The server marks it read-only (readOnlyHint: true), but an annotation never lowers a class.

    Findings

    • Warn

      The server marks "eboekhouden_list_relations" read-only (readOnlyHint: true), and its own name, description or input give the class "write".

      Matched text

      annotations: {"readOnlyHint":true}; The name "eboekhouden_list_relations" says "list": a word for reading.

      What this check looks for
    Description, as the server wrote it
    List relations (customers and suppliers of the administration), optionally filtered (filters combine with AND). Text filters match exactly unless match is contains or starts_with. Paged: pass next_offset as offset. GET /v1/relation.

    Annotations the server declares

    • title: List or search relations
    • readOnlyHint: true
Only reads 17Claude Code: allow
  • eboekhouden_get_cost_centerOne cost center.No findings

    Why it is in this group

    • The name "eboekhouden_get_cost_center" says "get": a word for reading.
    Description, as the server wrote it
    One cost center. GET /v1/costcenter/{id}.

    Annotations the server declares

    • title: Get a cost center
    • readOnlyHint: true
  • eboekhouden_get_invoiceOne invoice with its items, amounts and relation.No findings

    Why it is in this group

    • The name "eboekhouden_get_invoice" says "get": a word for reading.
    Description, as the server wrote it
    One invoice with its items, amounts and relation. GET /v1/invoice/{id}.

    Annotations the server declares

    • title: Get an invoice
    • readOnlyHint: true
  • eboekhouden_get_ledgerOne ledger account.No findings

    Why it is in this group

    • The name "eboekhouden_get_ledger" says "get": a word for reading.
    Description, as the server wrote it
    One ledger account. GET /v1/ledger/{id}.

    Annotations the server declares

    • title: Get a ledger
    • readOnlyHint: true
  • eboekhouden_get_ledger_balanceThe balance of one ledger, optionally per cost center and for a period (from/to).No findings

    Why it is in this group

    • The name "eboekhouden_get_ledger_balance" says "get": a word for reading.
    Description, as the server wrote it
    The balance of one ledger, optionally per cost center and for a period (from/to). GET /v1/ledger/{id}/balance.

    Annotations the server declares

    • title: Get a ledger's balance
    • readOnlyHint: true
  • eboekhouden_get_memberOne member; only available to clubs and associations.No findings

    Why it is in this group

    • The name "eboekhouden_get_member" says "get": a word for reading.
    Description, as the server wrote it
    One member; only available to clubs and associations. GET /v1/member/{id}.

    Annotations the server declares

    • title: Get a member (clubs and associations)
    • readOnlyHint: true
  • eboekhouden_get_mutationOne mutation with its rows (ledger, VAT code, amount, relation, invoice number).No findings

    Why it is in this group

    • The name "eboekhouden_get_mutation" says "get": a word for reading.
    Description, as the server wrote it
    One mutation with its rows (ledger, VAT code, amount, relation, invoice number). GET /v1/mutation/{id}.

    Annotations the server declares

    • title: Get a mutation (booking)
    • readOnlyHint: true
  • eboekhouden_get_productOne product with price, VAT code, ledger, unit and stock setting.No findings

    Why it is in this group

    • The name "eboekhouden_get_product" says "get": a word for reading.
    Description, as the server wrote it
    One product with price, VAT code, ledger, unit and stock setting. GET /v1/product/{id}.

    Annotations the server declares

    • title: Get a product
    • readOnlyHint: true
  • eboekhouden_get_relationOne relation with all its fields (addresses, e-mail addresses, VAT and KvK number, IBAN, payment term, ledger).No findings

    Why it is in this group

    • The name "eboekhouden_get_relation" says "get": a word for reading.
    Description, as the server wrote it
    One relation with all its fields (addresses, e-mail addresses, VAT and KvK number, IBAN, payment term, ledger). GET /v1/relation/{id}.

    Annotations the server declares

    • title: Get a relation
    • readOnlyHint: true
  • eboekhouden_list_cost_centersList cost centers (kostenplaatsen), optionally by parent id or description.No findings

    Why it is in this group

    • The name "eboekhouden_list_cost_centers" says "list": a word for reading.
    Description, as the server wrote it
    List cost centers (kostenplaatsen), optionally by parent id or description. Paged: pass next_offset as offset. GET /v1/costcenter.

    Annotations the server declares

    • title: List cost centers
    • readOnlyHint: true
  • eboekhouden_list_email_templatesList e-mail templates.No findings

    Why it is in this group

    • The name "eboekhouden_list_email_templates" says "list": a word for reading.
    Description, as the server wrote it
    List e-mail templates. Paged: pass next_offset as offset. GET /v1/emailtemplate.

    Annotations the server declares

    • title: List e-mail templates
    • readOnlyHint: true
  • eboekhouden_list_invoice_templatesList invoice templates (the template_id for eboekhouden_create_invoice), optionally by name, type (E editor, A advanced) or active.No findings

    Why it is in this group

    • The name "eboekhouden_list_invoice_templates" says "list": a word for reading.
    Description, as the server wrote it
    List invoice templates (the template_id for eboekhouden_create_invoice), optionally by name, type (E editor, A advanced) or active. Paged: pass next_offset as offset. GET /v1/invoicetemplate.

    Annotations the server declares

    • title: List invoice templates
    • readOnlyHint: true
  • eboekhouden_list_invoicesSearch the invoices created in the invoicing module, by invoice number, relation or date (exact, or from/to).No findings

    Why it is in this group

    • The name "eboekhouden_list_invoices" says "list": a word for reading.
    Description, as the server wrote it
    Search the invoices created in the invoicing module, by invoice number, relation or date (exact, or from/to). Paged: pass next_offset as offset. GET /v1/invoice.

    Annotations the server declares

    • title: List or search invoices
    • readOnlyHint: true
  • eboekhouden_list_ledger_balancesThe balances of all ledgers (a trial balance), optionally per cost center and for a period (from/to).No findings

    Why it is in this group

    • The name "eboekhouden_list_ledger_balances" says "list": a word for reading.
    Description, as the server wrote it
    The balances of all ledgers (a trial balance), optionally per cost center and for a period (from/to). GET /v1/ledger/balances.

    Annotations the server declares

    • title: List all ledger balances
    • readOnlyHint: true
  • eboekhouden_list_membersList members; only available to clubs and associations (others get error MEM_056).No findings

    Why it is in this group

    • The name "eboekhouden_list_members" says "list": a word for reading.
    Description, as the server wrote it
    List members; only available to clubs and associations (others get error MEM_056). Paged: pass next_offset as offset. GET /v1/member.

    Annotations the server declares

    • title: List members (clubs and associations)
    • readOnlyHint: true
  • eboekhouden_list_mutationsSearch the bookkeeping mutations: type 1 invoice received, 2 invoice sent, 3 invoice payment received, 4 invoice payment sent, 5 money received, 6 money sent, 7 general journal ent…No findings

    Why it is in this group

    • The name "eboekhouden_list_mutations" says "list": a word for reading.
    Description, as the server wrote it
    Search the bookkeeping mutations: type 1 invoice received, 2 invoice sent, 3 invoice payment received, 4 invoice payment sent, 5 money received, 6 money sent, 7 general journal entry. Filter by type, mutation number, description, invoice number or date. Paged: pass next_offset as offset. GET /v1/mutation.

    Annotations the server declares

    • title: List or search mutations (bookings)
    • readOnlyHint: true
  • eboekhouden_list_product_groupsAll product groups.No findings

    Why it is in this group

    • The name "eboekhouden_list_product_groups" says "list": a word for reading.
    Description, as the server wrote it
    All product groups. GET /v1/product/groups.

    Annotations the server declares

    • title: List product groups
    • readOnlyHint: true
  • eboekhouden_list_unitsList product units (piece, hour, ...) with their ids.No findings

    Why it is in this group

    • The name "eboekhouden_list_units" says "list": a word for reading.
    Description, as the server wrote it
    List product units (piece, hour, ...) with their ids. Paged: pass next_offset as offset. GET /v1/unit.

    Annotations the server declares

    • title: List units
    • 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.3.3. Values in angle brackets are yours to fill in.

claude mcp add --transport http e-boekhouden https://e-boekhouden.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__e-boekhouden__eboekhouden_get_relation",
      "mcp__e-boekhouden__eboekhouden_list_invoices",
      "mcp__e-boekhouden__eboekhouden_get_invoice",
      "mcp__e-boekhouden__eboekhouden_list_mutations",
      "mcp__e-boekhouden__eboekhouden_get_mutation",
      "mcp__e-boekhouden__eboekhouden_get_ledger",
      "mcp__e-boekhouden__eboekhouden_get_ledger_balance",
      "mcp__e-boekhouden__eboekhouden_list_ledger_balances",
      "mcp__e-boekhouden__eboekhouden_get_product",
      "mcp__e-boekhouden__eboekhouden_list_product_groups",
      "mcp__e-boekhouden__eboekhouden_list_cost_centers",
      "mcp__e-boekhouden__eboekhouden_get_cost_center",
      "mcp__e-boekhouden__eboekhouden_list_units",
      "mcp__e-boekhouden__eboekhouden_list_invoice_templates",
      "mcp__e-boekhouden__eboekhouden_list_email_templates",
      "mcp__e-boekhouden__eboekhouden_list_members",
      "mcp__e-boekhouden__eboekhouden_get_member"
    ],
    "ask": [
      "mcp__e-boekhouden__eboekhouden_list_relations",
      "mcp__e-boekhouden__eboekhouden_list_outstanding_invoices",
      "mcp__e-boekhouden__eboekhouden_list_ledgers",
      "mcp__e-boekhouden__eboekhouden_list_products"
    ],
    "deny": [
      "mcp__e-boekhouden__eboekhouden_create_relation",
      "mcp__e-boekhouden__eboekhouden_update_relation",
      "mcp__e-boekhouden__eboekhouden_create_product",
      "mcp__e-boekhouden__eboekhouden_create_invoice"
    ]
  }
}

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 e-boekhouden. Review it before you use it.