BeeL
REMOTE · MCP.BEEL.ES · 2 COMPONENTS · SCANNED SEP 21
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 against the live server, and we only credit what we can confirm. How we score → Why this is hard to score →
Endpoint Security94
- The endpoint's TLS certificate is valid, in date, and uses a strong key. View diagnostics → Pass
- The endpoint enforces authorisation, advertised via RFC 9728 protected-resource metadata. View diagnostics → Pass
- HTTPS is enforced; there's no plaintext access path. View diagnostics → Pass
- The HSTS (Strict-Transport-Security) header is present. View diagnostics → Pass
- DNSSEC check failed: this domain isn't protected by DNSSEC. See how to fix → View diagnostics → Fail
- The authorisation server offers only Dynamic Client Registration (RFC 7591), which MCP 2026-07-28 deprecated in favour of Client ID Metadata Documents. View diagnostics → Partial
Transport & Reachability0
- Transport blocked by authentication: the endpoint requires auth we don't have to verify streamable-http. See how to fix → View diagnostics → Unverified
Schema Quality & AI Usability0
- Schema blocked by authentication: the endpoint requires auth we don't have to read it. See how to fix → Unverified
Stability & Change Management0
- Stability not yet verified: not enough scan history yet (needs a 30-day window).Unverified
Tool Coverage0
- Tool coverage blocked by authentication: the endpoint requires auth we don't have to read its tools.Unverified
Tool Safety0
- Tool safety blocked by authentication: the endpoint requires auth we don't have to read its tools.Unverified
Capabilities0
- Capabilities blocked by authentication: the endpoint requires auth we don't have to read them. See how to fix → Unverified
Unverified: 6 categories
Categories scored 0 because we could not verify them: authentication we do not have, an unreachable endpoint, or not enough scan history. We only credit what we can confirm. Claim this server and supply a read-only token to verify it and lift the score.
How do I install the BeeL MCP server?
BeeL is a hosted endpoint at https://mcp.beel.es/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.
remote · mcp.beel.es
claude mcp add --transport http es-beel-mcp 'https://mcp.beel.es/mcp'
{
"mcpServers": {
"es-beel-mcp": {
"url": "https://mcp.beel.es/mcp"
}
}
} {
"servers": {
"es-beel-mcp": {
"type": "http",
"url": "https://mcp.beel.es/mcp"
}
}
} [mcp_servers.es-beel-mcp] url = "https://mcp.beel.es/mcp"
{
"$schema": "https://opencode.ai/config.json",
"mcp": {
"es-beel-mcp": {
"type": "remote",
"url": "https://mcp.beel.es/mcp",
"enabled": true
}
}
} openclaw mcp add es-beel-mcp --url 'https://mcp.beel.es/mcp' --transport streamable-http
mcp_servers:
es-beel-mcp:
url: "https://mcp.beel.es/mcp" {
"McpServers": {
"es-beel-mcp": {
"Transport": "http",
"Url": "https://mcp.beel.es/mcp"
}
}
} assistant mcp add es-beel-mcp -t streamable-http -u 'https://mcp.beel.es/mcp'
{
"mcpServers": {
"es-beel-mcp": {
"type": "http",
"url": "https://mcp.beel.es/mcp"
}
}
} The mcpServers block is a cross-client convention. Remote transports vary, so check your client's docs.
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.
- 18 Sept 26 −49
- Endpoint reachability: reachable → behind authorisation ▼ security
- Stability: 0.60 → unverified ▼ security
- Transport: pass → unverified ▼ security
- Tool safety: pass → unverified ▼ security
- Authorization: The endpoint enforces authorisation, advertised via RFC 9728 protected-resource metadata. security
- Schema quality: 100 → unverified ▼ functional
- Tool coverage: 100 → unverified ▼ functional
- Capabilities: pass → unverified ▼ functional
- 16 Sept 26 +1
No change was recorded against any check on this day. Stability & Change Management went from 53 to 57. That category is still filling its 30-day observation window: 16 days of observed history at the previous scan, 17 at this one. The score rises as the window fills, whether or not the server changes.
- 14 Sept 26 +1
No change was recorded against any check on this day. Stability & Change Management went from 47 to 50. That category is still filling its 30-day observation window: 14 days of observed history at the previous scan, 15 at this one. The score rises as the window fills, whether or not the server changes.
- 12 Sept 26 +1
No change was recorded against any check on this day. Stability & Change Management went from 40 to 43. That category is still filling its 30-day observation window: 12 days of observed history at the previous scan, 13 at this one. The score rises as the window fills, whether or not the server changes.
- 10 Sept 26 +1
No change was recorded against any check on this day. Stability & Change Management went from 33 to 37. That category is still filling its 30-day observation window: 10 days of observed history at the previous scan, 11 at this one. The score rises as the window fills, whether or not the server changes.
- 8 Sept 26 +1
No change was recorded against any check on this day. Stability & Change Management went from 27 to 30. That category is still filling its 30-day observation window: 8 days of observed history at the previous scan, 9 at this one. The score rises as the window fills, whether or not the server changes.
- 5 Sept 26 +1
No change was recorded against any check on this day. Stability & Change Management went from 17 to 20. That category is still filling its 30-day observation window: 5 days of observed history at the previous scan, 6 at this one. The score rises as the window fills, whether or not the server changes.
- 3 Sept 26 +1
No change was recorded against any check on this day. Stability & Change Management went from 10 to 13. That category is still filling its 30-day observation window: 3 days of observed history at the previous scan, 4 at this one. The score rises as the window fills, whether or not the server changes.
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 21 Sept 2026 · Probed https://mcp.beel.es/mcp
TLS valid
Negotiated TLS 1.3 with TLS_AES_128_GCM_SHA256 .
| Subject | Issuer | Valid from | Valid until | Key | Signature | Serial |
|---|---|---|---|---|---|---|
| CN=beel.es | CN=WE1,O=Google Trust Services,C=US | 11 Aug 2026 | 9 Nov 2026 | ECDSA 256 | ECDSA-SHA256 | 344c60005341dc180ecf90facb658f01 |
| SANs: beel.es, mcp.beel.es, *.mcp.beel.es | ||||||
| CN=WE1,O=Google Trust Services,C=US (CA) | CN=GTS Root R4,O=Google Trust Services LLC,C=US | 13 Dec 2023 | 20 Feb 2029 | ECDSA 256 | ECDSA-SHA384 | 7ff31977972c224a76155d13b6d685e3 |
| CN=GTS Root R4,O=Google Trust Services LLC,C=US (CA) | CN=GlobalSign Root CA,OU=Root CA,O=GlobalSign nv-sa,C=BE | 15 Nov 2023 | 28 Jan 2028 | ECDSA 384 | SHA256-RSA | 7fe530bf331343bedd821610493d8a1b |
Background: What to check on a remote MCP endpoint →
DNSSEC insecure
Validation of mcp.beel.es. — Not signed
| Zone | DS | Keys | Algorithms | Outcome |
|---|---|---|---|---|
| . | trust_anchor | 20326, 38696 | 8, 8 | Verified |
| es. | present | 54404 | 8 | Verified |
| beel.es. | absent | Unsigned (proven) parent-signed NSEC/NSEC3 proves an unsigned delegation |
Authentication Enforced and verified
The endpoint asked for a token and published valid RFC 9728 metadata describing how to get one.
| Result | Enforced and verified |
|---|---|
| Enforced | On connection |
| HTTP status | 401 |
WWW-Authenticate challenge Bearer realm="OAuth", resource_metadata="https://mcp.beel.es/.well-known/oauth-protected-resource/mcp", scope="accounts:read accounts:write companies:list companies:read companies:write configuration:read configuration:write customers:read customers:write emails:read invoices:read invoices:write logs:read members:read members:write nif:validate payment-connections:read payment-connections:write products:read products:write sandbox series:read series:write webhooks:read webhooks:write"
Bearer realm="OAuth", resource_metadata="https://mcp.beel.es/.well-known/oauth-protected-resource/mcp", scope="accounts:read accounts:write companies:list companies:read companies:write configuration:read configuration:write customers:read customers:write emails:read invoices:read invoices:write logs:read members:read members:write nif:validate payment-connections:read payment-connections:write products:read products:write sandbox series:read series:write webhooks:read webhooks:write" | Header | Value |
|---|---|
| strict-transport-security | max-age=15552000 |
| x-content-type-options | nosniff |
| www-authenticate | Bearer realm="OAuth", resource_metadata="https://mcp.beel.es/.well-known/oauth-protected-resource/mcp", scope="accounts:read accounts:write companies:list companies:read companies:write configuration:read configuration:write customers:read customers:write emails:read invoices:read invoices:write logs:read members:read members:write nif:validate payment-connections:read payment-connections:write products:read products:write sandbox series:read series:write webhooks:read webhooks:write" |
Protected resource metadata
| Document | https://mcp.beel.es/.well-known/oauth-protected-resource/mcp |
|---|---|
| Retrieved | Yes |
| Resource | https://mcp.beel.es/mcp |
| Authorisation server | https://mcp.beel.es |
Background: How OAuth 2.1 works in the 2026 MCP spec →
Transports 2 probes
| Transport | URL | Outcome | Status | Location |
|---|---|---|---|---|
| streamable-http | https://mcp.beel.es/mcp | Auth required | 401 | |
| http (plaintext) | http://mcp.beel.es/mcp | HTTPS enforced | 301 | https://mcp.beel.es/mcp |
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 hosted endpoint (https://mcp.beel.es/mcp).
Is the BeeL MCP server safe to use?
BeeL scores 38 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 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.
Does the BeeL MCP server require authentication?
Yes. BeeL 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 BeeL MCP server still maintained?
BeeL is still listed as active in the MCP registry. We last reached this channel on 21 September 2026. Those dates come from our own scans of the registry and the channel itself, not from anything the publisher announced.