# e-Boekhouden MCP by usefulapi (remote · e-boekhouden.usefulapi.io)

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

- Trust score: 64/100 (medium)
- Registry status: active
- Liveness: live
- Owner verified: no
- Last scored: 2026-10-17

## Components

- remote · `e-boekhouden.usefulapi.io`: 64/100 (this document), [markdown](https://verifymcp.io/servers/io-usefulapi-e-boekhouden/e-boekhouden.md), [page](https://verifymcp.io/servers/io-usefulapi-e-boekhouden/e-boekhouden)

## Channel facts

- Endpoint: `https://e-boekhouden.usefulapi.io/mcp`
- Transports: `streamable-http`
- Auth: `required`
- Version: `1.0.0`

## Trust breakdown

How this component scores in each security and reliability category. Every signal is checked automatically against the live server, and we only credit what we can confirm. Scores are 0–100 per category. Scoring method: https://verifymcp.io/docs/scoring (what has changed: https://verifymcp.io/docs/scoring/changelog)

Scored 2026-10-17.

- **Endpoint Security**: 78/100
  - The endpoint's TLS certificate is valid, in date, and uses a strong key.
  - Authorisation is enforced on tool calls, advertised via RFC 9728 protected-resource metadata. Discovery is public, which costs nothing: no tool can be invoked without a token.
  - HTTPS enforcement could not be verified: the plaintext port redirected somewhere other than https, so enforcement is unproven.
  - HSTS check failed: the Strict-Transport-Security header is absent.
  - DNSSEC check failed: this domain isn't protected by DNSSEC.
  - The authorisation server offers only Dynamic Client Registration (RFC 7591), which MCP 2026-07-28 deprecated in favour of Client ID Metadata Documents.
- **Transport & Reachability**: 0/100
  - Transport check failed: declared streamable-http, but the endpoint redirected instead of responding directly.
- **Schema Quality & AI Usability**: 78/100
  - 100% of prompts and resources have a non-trivial description (not blank, and not just the item's name).
  - AI-judged instruction clarity (good).
  - Context-footprint check failed: tool/resource definitions use about 3979 tokens (~159/item across 25 items; 25 tools + 0 resources), over budget; trim descriptions and params.
  - Usage-examples check failed: none of the tools include examples.
- **Stability & Change Management**: 17/100
  - Stability observed for 5 of 30 days with no destabilising changes; credit accrues until the full window elapses.
- **Tool Coverage**: 94/100
  - 100% of tools have a non-trivial description (not blank, and not just the tool's name).
  - 83% of tool parameters carry a description.
- **Tool Safety**: 100/100
  - No prompt-injection markers were found in the server instructions, tool names or descriptions we captured.
  - We read all 25 captured tool definition(s), and no name or description among them implies an irreversible operation.
  - An AI judge read all 26 captured unit(s) of tool text and found none that tries to manipulate the model reading it.
- **Capabilities**: 60/100
  - Spec-recency check failed: implements MCP spec 2025-06-18; the latest is 2026-07-28.

## Install

### How do I install the e-Boekhouden MCP by usefulapi server?

e-Boekhouden MCP by usefulapi is a hosted endpoint at https://e-boekhouden.usefulapi.io/mcp, so there is nothing to install locally. Ready-made configuration for Claude, Cursor, VS Code, Codex and 5 more is on this page, copied from each client's own documentation.

### Claude

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

### Cursor

```json
{
  "mcpServers": {
    "io-usefulapi-e-boekhouden": {
      "url": "https://e-boekhouden.usefulapi.io/mcp"
    }
  }
}
```

### VS Code

```json
{
  "servers": {
    "io-usefulapi-e-boekhouden": {
      "type": "http",
      "url": "https://e-boekhouden.usefulapi.io/mcp"
    }
  }
}
```

### Codex

```toml
[mcp_servers.io-usefulapi-e-boekhouden]
url = "https://e-boekhouden.usefulapi.io/mcp"
```

### opencode

```json
{
  "$schema": "https://opencode.ai/config.json",
  "mcp": {
    "io-usefulapi-e-boekhouden": {
      "type": "remote",
      "url": "https://e-boekhouden.usefulapi.io/mcp",
      "enabled": true
    }
  }
}
```

### OpenClaw

```bash
openclaw mcp add io-usefulapi-e-boekhouden --url 'https://e-boekhouden.usefulapi.io/mcp' --transport streamable-http
```

### Hermes

```yaml
mcp_servers:
  io-usefulapi-e-boekhouden:
    url: "https://e-boekhouden.usefulapi.io/mcp"
```

### Netclaw

```json
{
  "McpServers": {
    "io-usefulapi-e-boekhouden": {
      "Transport": "http",
      "Url": "https://e-boekhouden.usefulapi.io/mcp"
    }
  }
}
```

### Vellum

```bash
assistant mcp add io-usefulapi-e-boekhouden -t streamable-http -u 'https://e-boekhouden.usefulapi.io/mcp'
```

### Other

```json
{
  "mcpServers": {
    "io-usefulapi-e-boekhouden": {
      "type": "http",
      "url": "https://e-boekhouden.usefulapi.io/mcp"
    }
  }
}
```

The mcpServers block is a cross-client convention. Remote transports vary, so check your client's docs.

## Changelog

Every change recorded for this component, newest first. Days that predate change tracking, or that we cannot explain, say so: "we were watching and nothing happened" and "we were not watching" are different claims.

### 2026-10-17 (score 64, +1)

No change was recorded against any check on this day. Stability & Change Management went from 13 to 17. That category is still filling its 30-day observation window: 4 days of observed history at the previous scan, 5 at this one. The score rises as the window fills, whether or not the server changes.

### 2026-10-15 (score 63, +1)

No change was recorded against any check on this day. Stability & Change Management went from 7 to 10. That category is still filling its 30-day observation window: 2 days of observed history at the previous scan, 3 at this one. The score rises as the window fills, whether or not the server changes.

### 2026-10-14 (score 62, +3)

- [security] The server rewrote its instructions, which are the text every model session reads
- [functional] The server now declares the “prompts” capability
- [functional] First check of Schema quality: 100
- [functional] New prompt “getting_started”
- [functional] Server version: 1.0.0 → 1.1.0

### 2026-10-13 (score 59, 0)

- [functional improvement] Stability: unverified → 0.03

### 2026-10-12 (score 59)

First indexed and scored.

## MCP tools (25)

### `eboekhouden_list_relations` (~202 tokens)

List or search relations

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.

Input parameters:

- `city` (string): Primary city.
- `code` (string): Relation code.
- `contact` (string): Contact information.
- `email` (string): E-mail address.
- `limit` (integer): Results per page, 1-2000 (default 50).
- `match` (string): How the text filters match: exact (default), contains or starts_with (case-insensitive wildcard match; % and ? in the text are wildcards).
- `name` (string): (Company) name.
- `offset` (integer): Number of results to skip (default 0). Use next_offset from the previous reply.
- `type` (string): Business (B) or Private (P).

### `eboekhouden_get_relation` (~65 tokens)

Get a relation

One relation with all its fields (addresses, e-mail addresses, VAT and KvK number, IBAN, payment term, ledger). GET /v1/relation/{id}.

Input parameters:

- `id` (integer, required): The relation id (from eboekhouden_list_relations).

### `eboekhouden_list_invoices` (~206 tokens)

List or search invoices

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.

Input parameters:

- `date` (string): Only this exact date (yyyy-mm-dd).
- `date_from` (string): From this date, inclusive (yyyy-mm-dd).
- `date_to` (string): Up to this date, inclusive (yyyy-mm-dd).
- `invoice_number` (string): Invoice number.
- `limit` (integer): Results per page, 1-2000 (default 50).
- `match` (string): How the text filters match: exact (default), contains or starts_with (case-insensitive wildcard match; % and ? in the text are wildcards).
- `offset` (integer): Number of results to skip (default 0). Use next_offset from the previous reply.
- `relation_id` (integer): Only invoices of this relation.

### `eboekhouden_get_invoice` (~48 tokens)

Get an invoice

One invoice with its items, amounts and relation. GET /v1/invoice/{id}.

Input parameters:

- `id` (integer, required): The invoice id (from eboekhouden_list_invoices).

### `eboekhouden_list_outstanding_invoices` (~182 tokens)

List outstanding invoices

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.

Input parameters:

- `invoice_number` (string): Only this invoice number.
- `kind` (string, required): D = debtors (customers owing you), C = creditors (suppliers you still owe).
- `limit` (integer): Results per page, 1-2000 (default 50).
- `match` (string): How the text filters match: exact (default), contains or starts_with (case-insensitive wildcard match; % and ? in the text are wildcards).
- `offset` (integer): Number of results to skip (default 0). Use next_offset from the previous reply.

### `eboekhouden_list_mutations` (~291 tokens)

List or search mutations (bookings)

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.

Input parameters:

- `date` (string): Only this exact date (yyyy-mm-dd).
- `date_from` (string): From this date, inclusive (yyyy-mm-dd).
- `date_to` (string): Up to this date, inclusive (yyyy-mm-dd).
- `description` (string): Description.
- `id` (integer): Mutation number.
- `invoice_number` (string): Invoice number.
- `limit` (integer): Results per page, 1-2000 (default 50).
- `match` (string): How the text filters match: exact (default), contains or starts_with (case-insensitive wildcard match; % and ? in the text are wildcards).
- `offset` (integer): Number of results to skip (default 0). Use next_offset from the previous reply.
- `type` (integer): Mutation type 1-7 (1 invoice received, 2 invoice sent, 3 payment received, 4 payment sent, 5 money received, 6 money sent, 7 journal entry).

### `eboekhouden_get_mutation` (~57 tokens)

Get a mutation (booking)

One mutation with its rows (ledger, VAT code, amount, relation, invoice number). GET /v1/mutation/{id}.

Input parameters:

- `id` (integer, required): The mutation number (from eboekhouden_list_mutations).

### `eboekhouden_list_ledgers` (~203 tokens)

List ledgers (chart of accounts)

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.

Input parameters:

- `category` (string): Category, e.g. BAL, VW, FIN, DEB, CRED.
- `code` (string): Ledger code.
- `limit` (integer): Results per page, 1-2000 (default 50).
- `match` (string): How the text filters match: exact (default), contains or starts_with (case-insensitive wildcard match; % and ? in the text are wildcards).
- `offset` (integer): Number of results to skip (default 0). Use next_offset from the previous reply.

### `eboekhouden_get_ledger` (~43 tokens)

Get a ledger

One ledger account. GET /v1/ledger/{id}.

Input parameters:

- `id` (integer, required): The ledger id (from eboekhouden_list_ledgers).

### `eboekhouden_get_ledger_balance` (~116 tokens)

Get a ledger's balance

The balance of one ledger, optionally per cost center and for a period (from/to). GET /v1/ledger/{id}/balance.

Input parameters:

- `cost_center_id` (integer): Only mutations of this cost center.
- `from` (string): Balance over the period starting at this date (the difference), instead of the actual balance.
- `id` (integer, required): The ledger id (from eboekhouden_list_ledgers).
- `to` (string): The balance at this date, inclusive (default today).

### `eboekhouden_list_ledger_balances` (~103 tokens)

List all ledger balances

The balances of all ledgers (a trial balance), optionally per cost center and for a period (from/to). GET /v1/ledger/balances.

Input parameters:

- `cost_center_id` (integer): Only mutations of this cost center.
- `from` (string): Balance over the period starting at this date (the difference), instead of the actual balance.
- `to` (string): The balance at this date, inclusive (default today).

### `eboekhouden_list_products` (~159 tokens)

List products

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.

Input parameters:

- `code` (string): Product code.
- `group_code` (string): Product group code (from eboekhouden_list_product_groups).
- `limit` (integer): Results per page, 1-2000 (default 50).
- `match` (string): How the text filters match: exact (default), contains or starts_with (case-insensitive wildcard match; % and ? in the text are wildcards).
- `offset` (integer): Number of results to skip (default 0). Use next_offset from the previous reply.

### `eboekhouden_get_product` (~51 tokens)

Get a product

One product with price, VAT code, ledger, unit and stock setting. GET /v1/product/{id}.

Input parameters:

- `id` (integer, required): The product id (from eboekhouden_list_products).

### `eboekhouden_list_product_groups` (~23 tokens)

List product groups

All product groups. GET /v1/product/groups.

### `eboekhouden_list_cost_centers` (~145 tokens)

List cost centers

List cost centers (kostenplaatsen), optionally by parent id or description. Paged: pass next_offset as offset. GET /v1/costcenter.

Input parameters:

- `description` (string): Description.
- `limit` (integer): Results per page, 1-2000 (default 50).
- `match` (string): How the text filters match: exact (default), contains or starts_with (case-insensitive wildcard match; % and ? in the text are wildcards).
- `offset` (integer): Number of results to skip (default 0). Use next_offset from the previous reply.
- `parent_id` (string): Parent cost center id.

### `eboekhouden_get_cost_center` (~46 tokens)

Get a cost center

One cost center. GET /v1/costcenter/{id}.

Input parameters:

- `id` (integer, required): The cost center id (from eboekhouden_list_cost_centers).

### `eboekhouden_list_units` (~139 tokens)

List units

List product units (piece, hour, ...) with their ids. Paged: pass next_offset as offset. GET /v1/unit.

Input parameters:

- `limit` (integer): Results per page, 1-2000 (default 50).
- `match` (string): How the text filters match: exact (default), contains or starts_with (case-insensitive wildcard match; % and ? in the text are wildcards).
- `offset` (integer): Number of results to skip (default 0). Use next_offset from the previous reply.
- `plural` (string): Plural form.
- `singular` (string): Singular form.

### `eboekhouden_list_invoice_templates` (~183 tokens)

List invoice templates

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.

Input parameters:

- `active` (boolean): Only active (true) or inactive (false) templates.
- `limit` (integer): Results per page, 1-2000 (default 50).
- `match` (string): How the text filters match: exact (default), contains or starts_with (case-insensitive wildcard match; % and ? in the text are wildcards).
- `name` (string): Template name.
- `offset` (integer): Number of results to skip (default 0). Use next_offset from the previous reply.
- `type` (string): Editor (E) or advanced (A).

### `eboekhouden_list_email_templates` (~77 tokens)

List e-mail templates

List e-mail templates. Paged: pass next_offset as offset. GET /v1/emailtemplate.

Input parameters:

- `limit` (integer): Results per page, 1-2000 (default 50).
- `offset` (integer): Number of results to skip (default 0). Use next_offset from the previous reply.

### `eboekhouden_list_members` (~160 tokens)

List members (clubs and associations)

List members; only available to clubs and associations (others get error MEM_056). Paged: pass next_offset as offset. GET /v1/member.

Input parameters:

- `city` (string): City.
- `email` (string): E-mail address.
- `limit` (integer): Results per page, 1-2000 (default 50).
- `match` (string): How the text filters match: exact (default), contains or starts_with (case-insensitive wildcard match; % and ? in the text are wildcards).
- `member_number` (string): Member number.
- `name` (string): Name.
- `offset` (integer): Number of results to skip (default 0). Use next_offset from the previous reply.

### `eboekhouden_get_member` (~46 tokens)

Get a member (clubs and associations)

One member; only available to clubs and associations. GET /v1/member/{id}.

Input parameters:

- `id` (integer, required): The member id (from eboekhouden_list_members).

### `eboekhouden_create_relation` (~312 tokens)

Create a relation

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.

Input parameters:

- `address` (string)
- `bic` (string)
- `city` (string)
- `code` (string): Relation code (max 15; generated when empty on create).
- `company_registration_number` (string): Chamber of Commerce (KvK) number; digits only.
- `contact` (string): Contact person.
- `country` (string)
- `email_address` (string)
- `email_address_invoice` (string): Address invoices are sent to.
- `email_address_reminder` (string): Address payment reminders are sent to.
- `gender` (string): m = male, v = female, a = department.
- `iban` (string)
- `ledger_id` (integer): Ledger id of this relation (from eboekhouden_list_ledgers).
- `mobile_phone_number` (string)
- `name` (string, required): The (company) name (max 100).
- `note` (string)
- `phone_number` (string)
- `postal_code` (string)
- `salutation` (string)
- `term_of_payment` (integer): Default payment term in days.
- `type` (string): Business (B, default) or Private (P).
- `vat_number` (string)
- `website` (string)

### `eboekhouden_update_relation` (~375 tokens)

Update a relation

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

Input parameters:

- `address` (string)
- `bic` (string)
- `city` (string)
- `code` (string): Relation code (max 15; generated when empty on create).
- `company_registration_number` (string): Chamber of Commerce (KvK) number; digits only.
- `contact` (string): Contact person.
- `country` (string)
- `email_address` (string)
- `email_address_invoice` (string): Address invoices are sent to.
- `email_address_reminder` (string): Address payment reminders are sent to.
- `gender` (string): m = male, v = female, a = department.
- `iban` (string)
- `id` (integer, required): The relation id (from eboekhouden_list_relations).
- `inactive` (boolean): Mark the relation inactive (true) or active (false).
- `ledger_id` (integer): Ledger id of this relation (from eboekhouden_list_ledgers).
- `mobile_phone_number` (string)
- `name` (string): The (company) name (max 100).
- `note` (string)
- `phone_number` (string)
- `postal_code` (string)
- `salutation` (string)
- `term_of_payment` (integer): Default payment term in days.
- `type` (string): Business (B, default) or Private (P).
- `vat_number` (string)
- `website` (string)

### `eboekhouden_create_product` (~274 tokens)

Create a product

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.

Input parameters:

- `active` (boolean): Whether the product is active.
- `code` (string, required): Product code (max 20).
- `cost_center_id` (integer): Cost center id from eboekhouden_list_cost_centers.
- `description` (string, required): Product description.
- `group_id` (integer): Product group id from eboekhouden_list_product_groups.
- `in_stock_management` (boolean): Include in automatic stock management.
- `ledger_id` (integer, required): Revenue ledger id (from eboekhouden_list_ledgers).
- `price_excl` (number): Price excluding VAT (not with price_incl).
- `price_incl` (number): Price including VAT (not with price_excl).
- `purchase_price_excl` (number): Purchase price excluding VAT.
- `unit_id` (integer): Unit id from eboekhouden_list_units.
- `vat` (string, required): Sale VAT code of the account's country, e.g. HOOG_VERK_21, LAAG_VERK_9, BE_21_VERK or GEEN (purchase codes are refused by the API).

### `eboekhouden_create_invoice` (~256 tokens)

Create an invoice

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.

Input parameters:

- `date` (string): Invoice date yyyy-mm-dd (default today).
- `in_ex_vat` (string): Whether price_per_unit includes (IN) or excludes (EX) VAT.
- `invoice_number` (string): Invoice number; must end with a number. Generated when omitted.
- `items` (array, required): 1-200 invoice items.
- `reference` (string): Payment reference.
- `relation_id` (integer, required): The relation id (from eboekhouden_list_relations).
- `template_id` (integer, required): The invoice template id (from eboekhouden_list_invoice_templates).
- `term_of_payment` (integer, required): Payment term in days.
- `text` (string): Text on the invoice.

## Diagnostics

Captured diagnostic sections: TLS, DNSSEC, Authorisation, Transports. The full working is on the page: https://verifymcp.io/servers/io-usefulapi-e-boekhouden/e-boekhouden#diagnostics

## Score history

- 2026-10-17: 64
- 2026-10-16: 63
- 2026-10-15: 63
- 2026-10-14: 62
- 2026-10-13: 59
- 2026-10-12: 59

## Common questions

### What is the e-Boekhouden MCP by usefulapi server?

e-Boekhouden MCP by usefulapi is listed in the public MCP registry as io.usefulapi/e-boekhouden. Read e-Boekhouden relations, invoices, ledgers, bookings and products; create relations, invoices. This page covers its hosted endpoint (https://e-boekhouden.usefulapi.io/mcp).

### Is the e-Boekhouden MCP by usefulapi server safe to use?

e-Boekhouden MCP by usefulapi scores 64 out of 100 on VerifyMCP. That is a record of what we were able to check automatically, not an endorsement. The category breakdown on this page shows every signal behind the number, including the ones we could not confirm.

### What tools does the e-Boekhouden MCP by usefulapi server expose?

e-Boekhouden MCP by usefulapi exposes 25 tools: eboekhouden_list_relations, eboekhouden_get_relation, eboekhouden_list_invoices, eboekhouden_get_invoice, eboekhouden_list_outstanding_invoices, and 20 more. Their descriptions and schemas cost roughly 3,762 tokens of context every time the server is loaded.

### Does the e-Boekhouden MCP by usefulapi server require authentication?

Yes. e-Boekhouden MCP by usefulapi asked us for credentials when we connected, so you will need to authorise it in your MCP client before it can do anything.

### Is the e-Boekhouden MCP by usefulapi server still maintained?

e-Boekhouden MCP by usefulapi is still listed as active in the MCP registry. We last reached this channel on 17 October 2026. Those dates come from our own scans of the registry and the channel itself, not from anything the publisher announced.

## Links

- Remote endpoint: https://e-boekhouden.usefulapi.io/mcp
- Repository: https://github.com/m190/usefulapi-mcp
- Website: https://usefulapi.io/e-boekhouden/
- Changelog RSS feed: https://verifymcp.io/servers/io-usefulapi-e-boekhouden/e-boekhouden.xml
- Changelog JSON feed: https://verifymcp.io/servers/io-usefulapi-e-boekhouden/e-boekhouden.json
- HTML version of this page: https://verifymcp.io/servers/io-usefulapi-e-boekhouden/e-boekhouden
