BeeL
NPM · @BEEL_ES/MCP · 2 COMPONENTS · SCANNED SEP 20
Spanish e-invoicing with VeriFactu (AEAT): issue invoices, manage customers, validate NIFs.
Available components
How this component scores in each security and reliability category. Every signal is checked automatically from public evidence about the published package, including repeated runs of it in an isolated sandbox, and we only credit what we can confirm. How we score → Why this is hard to score →
Supply Chain Security100
- No malware found by supply-chain analysis.Pass
- No known CVEs affecting this package version or its production dependencies.Pass
- No install/post-install scripts declared.Pass
- No production dependencies, so there is no dependency health to assess. View diagnostics → Pass
Provenance & Transparency100
- Source repository is publicly reachable at the declared URL. View diagnostics → Pass
- Cryptographically verified build provenance (signed, bound to beel-es/beel-mcp). View diagnostics → Pass
- Clear OSI-approved license (MIT).Pass
- Actively maintained (last published 20 days ago).Pass
- Publishes a security disclosure policy (SECURITY.md).Pass
Schema Quality & AI Usability75
- 100% of prompts and resources have a non-trivial description (not blank, and not just the item's name).Pass
- AI-judged instruction clarity (excellent).Pass
- Context-footprint check failed: tool/resource definitions use about 37628 tokens (~282/item across 133 items; 121 tools + 12 resources), over budget; trim descriptions and params. See how to fix → Fail
- Usage-examples check failed: none of the tools include examples. See how to fix → Fail
Stability & Change Management84
- Stability check failed: the tool surface changed between 0.3.1 and 0.5.0: 7 tool removals, 0 breaking changes, 6 additions. See how to fix → Fail
Tool Coverage95
- 100% of tools have a non-trivial description (not blank, and not just the tool's name).Pass
- 84% of tool parameters carry a description.Partial
- Structured output schemas are declared (1% of tools); any adoption earns full credit.Pass
Tool Safety100
- No prompt-injection markers were found in the server instructions, tool names or descriptions we captured.Pass
- All 17 tool(s) whose name or description implies an irreversible operation declare an MCP destructiveHint annotation.Pass
- An AI judge read all 123 captured unit(s) of tool text and found none that tries to manipulate the model reading it.Pass
Capabilities100
- Implements a supported MCP spec version (2025-11-25); the latest is 2026-07-28.Pass
- Supports UI / widget rendering.Pass
How do I install the BeeL MCP server?
BeeL runs locally as an npm package, launched with npx -y @beel_es/mcp. Ready-made configuration for Claude, Cursor, VS Code, Codex and 5 more is on this page, copied from each client's own documentation.
npm · @beel_es/mcp
claude mcp add es-beel-mcp -- npx -y @beel_es/mcp
{
"mcpServers": {
"es-beel-mcp": {
"command": "npx",
"args": [
"-y",
"@beel_es/mcp"
]
}
}
} {
"servers": {
"es-beel-mcp": {
"command": "npx",
"args": [
"-y",
"@beel_es/mcp"
]
}
}
} codex mcp add es-beel-mcp -- npx -y @beel_es/mcp
{
"$schema": "https://opencode.ai/config.json",
"mcp": {
"es-beel-mcp": {
"type": "local",
"command": [
"npx",
"-y",
"@beel_es/mcp"
],
"enabled": true
}
}
} openclaw mcp add es-beel-mcp --command npx --arg -y --arg @beel_es/mcp
mcp_servers:
es-beel-mcp:
command: "npx"
args: ["-y", "@beel_es/mcp"] {
"McpServers": {
"es-beel-mcp": {
"Transport": "stdio",
"Command": "npx",
"Arguments": [
"-y",
"@beel_es/mcp"
]
}
}
} assistant mcp add es-beel-mcp -t stdio -c npx -a -y @beel_es/mcp
{
"mcpServers": {
"es-beel-mcp": {
"command": "npx",
"args": [
"-y",
"@beel_es/mcp"
]
}
}
} Every change we have recorded for this component, newest first. Security-relevant changes are always shown. ▲ marks a change for the better, ▼ a change for the worse; unmarked changes are neutral.
- 20 Sept 26 +1
No change was recorded against any check on this day. Stability & Change Management went from 81 to 84.
- 18 Sept 26 +1
No change was recorded against any check on this day. Stability & Change Management went from 74 to 78.
- 15 Sept 26 +1
No change was recorded against any check on this day. Stability & Change Management went from 64 to 68.
- 13 Sept 26 +1
No change was recorded against any check on this day. Stability & Change Management went from 58 to 61.
- 11 Sept 26 +1
No change was recorded against any check on this day. Stability & Change Management went from 51 to 54.
- 9 Sept 26 +1
No change was recorded against any check on this day. Stability & Change Management went from 44 to 48.
- 7 Sept 26 +1
No change was recorded against any check on this day. Stability & Change Management went from 38 to 41.
- 5 Sept 26 +1
No change was recorded against any check on this day. Stability & Change Management went from 31 to 34.
Diagnostic detail from the automated scan of this channel: what the scanner observed at each step, so you can see exactly where a check passed or failed. It is informational only and never changes the trust score.
Captured 20 Sept 2026 · Analysed npm/@beel_es/mcp@0.5.0
Provenance Verified
A signed build attestation was found and verified, binding this exact artifact to the source repository it claims to come from.
| Result | Verified |
|---|---|
| Ecosystem | npm |
| Reason | Verified |
| Discovered via | Registry attestation endpoint |
| Source repo | beel-es/beel-mcp |
| Certificate issuer | https://token.actions.githubusercontent.com |
| Certificate SAN | https://github.com/beel-es/beel-mcp/.github/workflows/publish.yml@refs/tags/v0.5.0 |
| Rekor log index | 2650467297 |
| Predicate type | https://slsa.dev/provenance/v1 |
| Subject digest | sha512:ecdf573e9debf162b111be5a62316b312361b1629b28ca822dec313a5027f454df2b9e1abcbb23e90b29185136c448c2a8456249353a3eaa846f0878b |
Background: How many MCP packages publish verified provenance →
Dependencies 0 packages
| Packages resolved | 0 |
|---|---|
| Tree resolution | Complete |
Background: SBOMs and build attestations, explained →
The tools this component advertises to a client, with an estimated token cost for each. Expand a tool to see its parameters and schema. The per-tool counts are indicative and are not scored directly; the schema's total context footprint is one signal in Schema Quality & AI Usability. A tool's description is untrusted text the model reads on every call, which is what makes this list a security surface and not just an inventory: how tool poisoning works →
beel_patch_recurring_invoice ~417
Updates only the fields present in the body, leaving every other field of the recurring invoice template as it is. - **Omitted vs `null`:** an omitted field keeps its current value; a field sent as `null` is cleared, and only where the request schema documents the field as nullable. - **`lines`:** replaced as a whole, not patched line by line. The recipient survives the change, and an empty array is rejected. - **`payment_method`:** replaced as a whole together with `payment_iban`, `payment_swift` and `payment_term_days` — send them in the same request or they are dropped. - **Schedule:** `day_of_month` and `start_date` stay put unless you send them; sending `day_of_month` moves the next generation. `start_date` is only editable while the template has not generated any invoice yet. Endpoint: PATCH /v1/companies/{company_id}/recurring-invoices/{recurring_invoice_id} ⚠️ Fiscal guardrails — read before calling: - How BeeL derives the AEAT invoice type, and the rules each type imposes. (resource: beel://guardrails/invoice-types) - What regime_key means, where it lives, and which combinations are rejected. (resource: beel://guardrails/regime-keys) For the exhaustive rules and worked examples, call beel_docs_search.
| Name | Type | Req | Description |
|---|---|---|---|
| body | – | yes | – |
| company_id | string | yes | Unique identifier (UUID) of the company the operation acts on — its identifier, not its NIF. It is the only source of context: the account that owns it is derived from it, and the `BeeL-Active-Compan… |
| recurring_invoice_id | string | yes | – |
No output schema declared.
No examples provided.
beel_patch_series ~410
Updates only the fields present in the body, leaving every other field of the series as it is. - **Clearing a field:** a field sent as `null` is cleared, which only `description` supports. - **Numbering fields:** `code`, `format`, `counter_reset` and `initial_number` are rejected once the series has issued invoices (`numbering_locked` is `true`). - **`default_series`:** it cannot be used to clear the default. Sending `false` for the series that currently is the default answers `DEFAULT_CANNOT_BE_UNMARKED`, because it would leave the document type with active series and no default, and issuing without an explicit `series_id` would then fail with `SERIES_DEFAULT_NOT_FOUND`. Hand the default over with `PUT /v1/companies/{company_id}/series/{series_id}/default` on the new series, which unmarks the previous one. Sending `false` for a series that is not the default is a no-op. Endpoint: PATCH /v1/companies/{company_id}/series/{series_id} ⚠️ Fiscal guardrails — read before calling: - How invoice numbers are formed, and why numbering can never be rewritten. (resource: beel://guardrails/series-and-numbering) For the exhaustive rules and worked examples, call beel_docs_search.
| Name | Type | Req | Description |
|---|---|---|---|
| body | – | yes | – |
| company_id | string | yes | Unique identifier (UUID) of the company the operation acts on — its identifier, not its NIF. It is the only source of context: the account that owns it is derived from it, and the `BeeL-Active-Compan… |
| series_id | – | yes | Series ID |
No output schema declared.
No examples provided.
beel_patch_webhook_subscription ~303
Updates the fields present in the body — `url`, `events`, `active`, `account_relationship` — and leaves the rest untouched. - **`events`:** replaces the whole list, it does not add to it, so an event left out of it stops being delivered. - **`active`:** setting it to `false` stops deliveries without discarding the delivery history. A subscription we turned off ourselves (`deactivated_by: beel`) needs a successful test delivery before it can be turned back on. - **Signing secret:** not touched here. Rotate it with `POST /v1/accounts/{account_id}/webhooks/{webhook_id}/secret`. Endpoint: PATCH /v1/accounts/{account_id}/webhooks/{webhook_id}
| Name | Type | Req | Description |
|---|---|---|---|
| account_id | string | yes | Your own account, or an account you provisioned. It — not the credential, and not the `BeeL-Active-Company` header — decides which account the operation acts on. An account you do not reach answers `… |
| body | – | yes | – |
| webhook_id | string | yes | Subscription of the account in the path. A subscription of another account answers `404`, the same as one that does not exist: under the account resolved from `{account_id}` it simply is not there. |
No output schema declared.
No examples provided.
beel_provision_account ~466
Provisions a new account on BeeL and, when it is born with a holder, returns a single-use `claim_token` to deliver so they can set a password and take ownership. - **`email`:** send it to create the account with a holder. Omit it and the account is created with no person at all, no `person_id` and no `claim_token`; a holder can be added later with `POST /v1/accounts/{account_id}/claim-tokens`. - **`tax_profile`:** send it and the account comes back ready to invoice, with its NIF, default invoice series and VeriFactu configuration set up and its `company_id` in the response. Omit it and the account stays empty until its holder registers a NIF. - **`access_level`:** the access you retain over the account. Defaults to `NONE`; `OPERATE` requires a `tax_profile`. - **`external_ref`:** the idempotency key. Resending the same one returns the existing account rather than creating a second. - **Entitlement:** requires `manage_accounts`. ## Reactivation If you previously ended your management of this account (`DELETE /v1/accounts/{account_id}/management`) and its holder has not claimed it yet, provisioning the same email reactivates that account instead of creating a new one. The same account, holder, NIFs and invoices come back under your management, with the `external_ref` and `access_level` of this request, and it counts towards your billable usage again. Once the holder has claimed the account it is theirs, and only they can grant you access again. Endpoint: POST /v1/accounts
| Name | Type | Req | Description |
|---|---|---|---|
| body | – | yes | – |
| idempotency_key | string | – | Optional idempotency key for this operation. Omit it and one is derived from the request itself, which makes a blind retry safe but also collapses a SECOND, deliberately identical operation into the… |
No output schema declared.
No examples provided.
beel_put_member_grant ~237
Grants a `MEMBER` access to one company, or changes the `access_level` of an existing grant. Only the company in the path is touched. - **Scope:** the member's other grants are left exactly as they were. - **`access_level`:** `VIEW` or `OPERATE`. `NONE` is not accepted here — remove access by deleting the grant. - **Eligible members:** grants apply only to `MEMBER`. `OWNER` and `ADMIN` reach every company implicitly and cannot receive grants. Endpoint: PUT /v1/accounts/{account_id}/members/{member_id}/grants/{company_id}
| Name | Type | Req | Description |
|---|---|---|---|
| account_id | string | yes | Your own account, or an account you provisioned. It — not the credential — decides which account the operation acts on; a `403` is returned when you do not reach it, the same response an account that… |
| body | – | yes | – |
| company_id | string | yes | Unique identifier (UUID) of the company within the account. |
| member_id | string | yes | Membership unique UUID. |
No output schema declared.
No examples provided.
beel_retry_payment_event ~396
Reprocesses a payment event whose automatic invoicing did not complete, applying the configuration of the NIF as it stands now. Use it after fixing what caused the failure, for example a missing invoice series. - **`retry_available`:** only events where it is `true` can be retried. Read it instead of deriving retryability from `status` yourself; anything else returns `400`. - **Limit:** the status and the skip reason must admit reprocessing, and the event must still be under the limit of 3 retries (`retry_count`). Endpoint: POST /v1/companies/{company_id}/payment-connections/{provider}/events/{event_id}/retry
| Name | Type | Req | Description |
|---|---|---|---|
| company_id | string | yes | Unique identifier (UUID) of the company the events belong to — its identifier, not its NIF. It is the only source of context: the account that owns it is derived from it, and the `BeeL-Active-Company… |
| event_id | string | yes | Identifier of the payment event, as returned by the list operation. |
| idempotency_key | string | – | Optional idempotency key for this operation. Omit it and one is derived from the request itself, which makes a blind retry safe but also collapses a SECOND, deliberately identical operation into the… |
| provider | string | yes | Payment provider slug in **lowercase**. Currently only `stripe` (Stripe Connect) is operative; `woocommerce` and `shopify` are reserved for future providers. |
No output schema declared.
No examples provided.
beel_retry_webhook_delivery ~349
Re-sends the original payload of a delivery immediately. - **Payload:** the one captured when the event happened, not a fresh snapshot, so changes made to the entity since then are not reflected. - **History:** the outcome is recorded as a new entry and the original entry is kept as it was. `attempt_number` continues the same sequence, so it can exceed the 5 automatic attempts. Endpoint: POST /v1/accounts/{account_id}/webhooks/{webhook_id}/deliveries/{delivery_id}/retry
| Name | Type | Req | Description |
|---|---|---|---|
| account_id | string | yes | Your own account, or an account you provisioned. It — not the credential, and not the `BeeL-Active-Company` header — decides which account the operation acts on. An account you do not reach answers `… |
| delivery_id | string | yes | Delivery attempt of that subscription to replay. |
| idempotency_key | string | – | Optional idempotency key for this operation. Omit it and one is derived from the request itself, which makes a blind retry safe but also collapses a SECOND, deliberately identical operation into the… |
| webhook_id | string | yes | Subscription of the account in the path. A subscription of another account answers `404`, the same as one that does not exist: under the account resolved from `{account_id}` it simply is not there. |
No output schema declared.
No examples provided.
beel_rotate_webhook_secret ~303
Generates a new HMAC signing secret for a webhook subscription. - **Old secret:** **immediately invalidated**. Update your signature verification logic before rotating, to avoid missing events during the transition. - **New secret:** returned **once**, in this response only. It cannot be read again. Endpoint: POST /v1/accounts/{account_id}/webhooks/{webhook_id}/secret
| Name | Type | Req | Description |
|---|---|---|---|
| account_id | string | yes | Your own account, or an account you provisioned. It — not the credential, and not the `BeeL-Active-Company` header — decides which account the operation acts on. An account you do not reach answers `… |
| idempotency_key | string | – | Optional idempotency key for this operation. Omit it and one is derived from the request itself, which makes a blind retry safe but also collapses a SECOND, deliberately identical operation into the… |
| webhook_id | string | yes | Subscription of the account in the path. A subscription of another account answers `404`, the same as one that does not exist: under the account resolved from `{account_id}` it simply is not there. |
No output schema declared.
No examples provided.
beel_send_invoice ~250
Sends the invoice by email, attaching its PDF by default. When no recipient is given, the addresses configured on the customer are used. Endpoint: POST /v1/companies/{company_id}/invoices/{invoice_id}/send
| Name | Type | Req | Description |
|---|---|---|---|
| body | – | – | – |
| company_id | string | yes | Unique identifier (UUID) of the company the operation acts on — its identifier, not its NIF. It is the only source of context: the account that owns it is derived from it, and the `BeeL-Active-Compan… |
| idempotency_key | string | – | Optional idempotency key for this operation. Omit it and one is derived from the request itself, which makes a blind retry safe but also collapses a SECOND, deliberately identical operation into the… |
| invoice_id | – | yes | Invoice ID |
No output schema declared.
No examples provided.
beel_set_default_series ~259
Marks an invoice series as the default of its document type for this company, and unmarks the previous one. - **One per type:** only one series can be the default per company and document type. - **Must be active:** an inactive series is rejected with `400`. - **Idempotent:** repeating the call changes nothing. Endpoint: PUT /v1/companies/{company_id}/series/{series_id}/default ⚠️ Fiscal guardrails — read before calling: - How invoice numbers are formed, and why numbering can never be rewritten. (resource: beel://guardrails/series-and-numbering) For the exhaustive rules and worked examples, call beel_docs_search.
| Name | Type | Req | Description |
|---|---|---|---|
| company_id | string | yes | Unique identifier (UUID) of the company the operation acts on — its identifier, not its NIF. It is the only source of context: the account that owns it is derived from it, and the `BeeL-Active-Compan… |
| series_id | – | yes | Series ID to mark as default |
No output schema declared.
No examples provided.
beel_set_invoice_schedule ~315
Replaces the scheduling of a draft invoice, whether it had one or not, moving it to `SCHEDULED`. Both fields of the body are required. - **`scheduled_for`:** the date the invoice is processed on. Today or later; an earlier date is rejected with `422 SCHEDULED_DATE_IN_PAST`. - **`generation_mode`:** `DRAFT` leaves the invoice as a draft for manual review, `ISSUE_AND_SEND` issues and sends it automatically. There is no default. - **Availability:** requires the `scheduled_invoices` feature. Endpoint: PUT /v1/companies/{company_id}/invoices/{invoice_id}/schedule ⚠️ Fiscal guardrails — read before calling: - When an invoice can still be changed, and what to do once it cannot. (resource: beel://guardrails/invoice-state-machine) For the exhaustive rules and worked examples, call beel_docs_search.
| Name | Type | Req | Description |
|---|---|---|---|
| body | – | yes | – |
| company_id | string | yes | Unique identifier (UUID) of the company the operation acts on — its identifier, not its NIF. It is the only source of context: the account that owns it is derived from it, and the `BeeL-Active-Compan… |
| invoice_id | – | yes | Invoice ID |
No output schema declared.
No examples provided.
beel_set_invoice_status ~319
Sets the commercial status of an invoice. Any transition other than the ones below is rejected. - **`PAID`:** from `ISSUED`, `SENT` or `OVERDUE`. - **`SENT`:** from `ISSUED`. - **`ISSUED`:** from `SENT` only, to undo a `SENT` set by mistake. - **Not set here:** issuing and voiding are fiscal acts with their own operations (`POST …/{invoice_id}/issue`, `POST …/{invoice_id}/void`), and issuing is never undone. Endpoint: PUT /v1/companies/{company_id}/invoices/{invoice_id}/status ⚠️ Fiscal guardrails — read before calling: - When an invoice can still be changed, and what to do once it cannot. (resource: beel://guardrails/invoice-state-machine) For the exhaustive rules and worked examples, call beel_docs_search.
| Name | Type | Req | Description |
|---|---|---|---|
| body | – | yes | – |
| company_id | string | yes | Unique identifier (UUID) of the company the operation acts on — its identifier, not its NIF. It is the only source of context: the account that owns it is derived from it, and the `BeeL-Active-Compan… |
| invoice_id | – | yes | Invoice ID |
No output schema declared.
No examples provided.
beel_set_recurring_invoice_status ~352
Sets the lifecycle status of a recurring invoice template. This is how generation is paused and resumed. - **`PAUSED`:** stops automatic generation, keeping the schedule configuration intact. - **`ACTIVE`:** resumes generation and recalculates the next generation date from today. - **`COMPLETED`:** reached on its own when the schedule runs out. It cannot be set here; the body only accepts `ACTIVE` and `PAUSED`. - **Rejected transitions:** resuming a template that is already active, or one whose `pause.blocker` is still in effect. Endpoint: PUT /v1/companies/{company_id}/recurring-invoices/{recurring_invoice_id}/status ⚠️ Fiscal guardrails — read before calling: - How BeeL derives the AEAT invoice type, and the rules each type imposes. (resource: beel://guardrails/invoice-types) - What regime_key means, where it lives, and which combinations are rejected. (resource: beel://guardrails/regime-keys) For the exhaustive rules and worked examples, call beel_docs_search.
| Name | Type | Req | Description |
|---|---|---|---|
| body | – | yes | – |
| company_id | string | yes | Unique identifier (UUID) of the company the operation acts on — its identifier, not its NIF. It is the only source of context: the account that owns it is derived from it, and the `BeeL-Active-Compan… |
| recurring_invoice_id | string | yes | – |
No output schema declared.
No examples provided.
beel_skip_recurring_invoice ~330
Skips the next scheduled invoice generation and advances the generation date to the following period. Nothing is issued. Endpoint: POST /v1/companies/{company_id}/recurring-invoices/{recurring_invoice_id}/skip ⚠️ Fiscal guardrails — read before calling: - How BeeL derives the AEAT invoice type, and the rules each type imposes. (resource: beel://guardrails/invoice-types) - What regime_key means, where it lives, and which combinations are rejected. (resource: beel://guardrails/regime-keys) For the exhaustive rules and worked examples, call beel_docs_search.
| Name | Type | Req | Description |
|---|---|---|---|
| company_id | string | yes | Unique identifier (UUID) of the company the operation acts on — its identifier, not its NIF. It is the only source of context: the account that owns it is derived from it, and the `BeeL-Active-Compan… |
| idempotency_key | string | – | Optional idempotency key for this operation. Omit it and one is derived from the request itself, which makes a blind retry safe but also collapses a SECOND, deliberately identical operation into the… |
| recurring_invoice_id | string | yes | – |
No output schema declared.
No examples provided.
beel_test_webhook_subscription ~393
Sends a synthetic payload to the subscription's URL immediately, outside the normal delivery queue. Use it to verify that your endpoint is reachable and handles deliveries correctly before you rely on real events. - **Payload:** carries `"test": true` and synthetic data, and is signed like any other delivery, so it also exercises your signature check. - **Retries:** none. A failed test is not retried and does not appear in the delivery history. - **`Idempotency-Key`:** repeating the call with the same key returns the cached result without sending the test payload again. - **Result:** read `delivery_success`; a delivery your endpoint rejected is still a successful test run, not an error. Endpoint: POST /v1/accounts/{account_id}/webhooks/{webhook_id}/test
| Name | Type | Req | Description |
|---|---|---|---|
| account_id | string | yes | Your own account, or an account you provisioned. It — not the credential, and not the `BeeL-Active-Company` header — decides which account the operation acts on. An account you do not reach answers `… |
| idempotency_key | string | – | Optional idempotency key for this operation. Omit it and one is derived from the request itself, which makes a blind retry safe but also collapses a SECOND, deliberately identical operation into the… |
| webhook_id | string | yes | Subscription of the account in the path. A subscription of another account answers `404`, the same as one that does not exist: under the account resolved from `{account_id}` it simply is not there. |
No output schema declared.
No examples provided.
beel_update_invoice_customization ~193
Updates how the invoices of a company are rendered and delivered: PDF template, accent colour, invoice language and email language. Only the properties present in the request body are modified, and the logo is managed through the `logo` sub-resource. The change applies to invoices rendered after it and does not alter already issued documents. Endpoint: PUT /v1/companies/{company_id}/invoice-customization
| Name | Type | Req | Description |
|---|---|---|---|
| body | – | yes | – |
| company_id | string | yes | Unique identifier (UUID) of the company the operation acts on — its identifier, not its NIF. It is the only source of context: the account that owns it is derived from it, and the `BeeL-Active-Compan… |
No output schema declared.
No examples provided.
beel_update_me ~94
Updates the preferences of the authenticated person. Today the only mutable preference is `language`. It applies to the interface, to template names and colours in invoice customisation, and to the emails the person receives. It belongs to the person, not to a fiscal profile: the languages of invoices and of emails are separate settings of each company. Endpoint: PATCH /v1/me
| Name | Type | Req | Description |
|---|---|---|---|
| body | – | yes | – |
No output schema declared.
No examples provided.
beel_update_tax_configuration ~314
Updates the tax configuration of a company. Fields you omit keep their current value; `default_main_tax`, when sent, replaces the stored one wholesale. - **Regime coherence:** the main tax and its VeriFactu regime key must be coherent. Regime key `18` (equivalence surcharge) only exists for `IVA`, so pairing it with any other regime answers `422 INVALID_REGIME_KEY_FOR_TAX_TYPE`, with `details` naming the rejected key, the tax type and the keys that type admits. - **Surcharge:** applying the surcharge without regime key `18` answers `422` `RECARGO_REQUIRES_REGIME_RE`. - **Exemption reason:** `default_exemption_reason` travels with `default_main_tax` — sending the tax without a reason clears the stored one, and sending only the reason applies it to the tax already stored. Endpoint: PUT /v1/companies/{company_id}/tax-configuration
| Name | Type | Req | Description |
|---|---|---|---|
| body | – | yes | – |
| company_id | string | yes | Unique identifier (UUID) of the company the operation acts on — its identifier, not its NIF. It is the only source of context: the account that owns it is derived from it, and the `BeeL-Active-Compan… |
No output schema declared.
No examples provided.
beel_update_verifactu_configuration ~387
Replaces the VeriFactu configuration of a company. - **Writable fields:** only `enabled` and `apply_by_default`, and both are required — this is a full replacement, not a partial merge. The rest of the returned configuration is resolved server-side. - **Coherence:** `apply_by_default` cannot be true while `enabled` is false, which answers `422 APPLY_BY_DEFAULT_REQUIRES_ENABLED`. ## Turning it off Setting `enabled` to false stops sending this company's invoices to AEAT and starts the deregistration of the NIF with the VeriFactu provider. It does not deactivate the company: the activation is a fact of its own for the (company, environment) pair, so the company keeps issuing in that environment and stays `ready`. Releasing the NIF — and in Live freeing it for another account — is always `DELETE /v1/companies/{company_id}/activations`. Endpoint: PUT /v1/companies/{company_id}/verifactu-configuration ⚠️ Fiscal guardrails — read before calling: - Why an issued invoice may never reach AEAT, and how to tell before issuing. (resource: beel://guardrails/verifactu-gates) For the exhaustive rules and worked examples, call beel_docs_search.
| Name | Type | Req | Description |
|---|---|---|---|
| body | – | yes | – |
| company_id | string | yes | Unique identifier (UUID) of the company the operation acts on — its identifier, not its NIF. It is the only source of context: the account that owns it is derived from it, and the `BeeL-Active-Compan… |
No output schema declared.
No examples provided.
beel_validate_nif ~364
Checks a NIF or CIF against the AEAT register through VeriFactu and returns what the register says about it. It only reads the register: it creates nothing and stores no customer. - **`status`:** distinguishes a NIF found in the register from one that is syntactically correct but absent, and from a check that could not be completed because VeriFactu was unavailable — in which case the NIF is validated automatically once the service is back. - **`valid: true`:** means different things by holder. For an individual, AEAT matched NIF and name together. For a legal entity the name you sent is **not verified** at all — AEAT identifies a company by its CIF alone — so it says nothing about your name. - **`legal_name_verified`:** tells those two cases apart. - **`census_status`:** says whether an identified NIF is also deregistered or revoked. ## Invalid input - **Bad syntax is an answer, not an error:** it comes back `200` with `status: INVALID`, so a pre-validation flow never has to tell rejections apart by status code. - **A missing NIF is an error:** an absent or empty `nif` answers `422` `FIELD_BLANK`, with `details.field` naming it. Endpoint: POST /v1/nif/validate ⚠️ Fiscal guardrails — read before calling: - Why a name that does not match the census makes an invoice unsubmittable. (resource: beel://guardrails/nif-validation) For the exhaustive rules and worked examples, call beel_docs_search.
| Name | Type | Req | Description |
|---|---|---|---|
| body | – | yes | – |
No output schema declared.
No examples provided.
beel_void_invoice ~477
Voids an issued invoice of this company. The document is kept and its number is never reused. - **When to use it:** the operation never took place. If it did take place but with errors, issue a corrective invoice instead (`POST …/{invoice_id}/corrective`). - **`reason`:** required, at least 10 characters — it is fiscal data. - **VeriFactu:** when it is enabled for the invoice, a cancellation record is submitted to the AEAT. - **Proformas:** voiding an `ACTIVE` proforma is a plain status change with no fiscal effect — no corrective invoice, nothing submitted to the AEAT. The voided proforma is kept as the record of a rejected or withdrawn offer and stays listed. Endpoint: POST /v1/companies/{company_id}/invoices/{invoice_id}/void ⚠️ Fiscal guardrails — read before calling: - Choosing wrong here misreports to AEAT. The 30-second decision. (resource: beel://guardrails/cancel-vs-rectify) - When an invoice can still be changed, and what to do once it cannot. (resource: beel://guardrails/invoice-state-machine) For the exhaustive rules and worked examples, call beel_docs_search.
| Name | Type | Req | Description |
|---|---|---|---|
| body | – | yes | – |
| company_id | string | yes | Unique identifier (UUID) of the company the operation acts on — its identifier, not its NIF. It is the only source of context: the account that owns it is derived from it, and the `BeeL-Active-Compan… |
| idempotency_key | string | – | Optional idempotency key for this operation. Omit it and one is derived from the request itself, which makes a blind retry safe but also collapses a SECOND, deliberately identical operation into the… |
| invoice_id | – | yes | Invoice ID |
No output schema declared.
No examples provided.
What is the BeeL MCP server?
BeeL is an MCP server listed in the public MCP registry as es.beel/mcp. Spanish e-invoicing with VeriFactu (AEAT): issue invoices, manage customers, validate NIFs. This page covers its npm package (@beel_es/mcp).
Is the BeeL MCP server safe to use?
BeeL scores 93 out of 100 on VerifyMCP. We found no known CVEs affecting it as of 20 September 2026. It declares no install or post-install scripts. Its build provenance is signed and verified. 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 BeeL MCP server expose?
BeeL exposes 121 tools: beel_activate_company, beel_cancel_representation, beel_change_managed_access_level, beel_convert_proforma_to_invoice, beel_create_claim_token, and 116 more. Their descriptions and schemas cost roughly 37,184 tokens of context every time the server is loaded.
Is the BeeL MCP server still maintained?
BeeL is still listed as active in the MCP registry. We last reached this channel on 20 September 2026. Those dates come from our own scans of the registry and the channel itself, not from anything the publisher announced.
What licence is the BeeL MCP server under?
BeeL declares the MIT licence, which is OSI-approved. That covers the source only, and says nothing about the cost of any service it calls.