BeeL.
Faturamento eletrônico espanhol com VeriFactu (AEAT): emitir faturas, gerenciar clientes, validar NIFs.
Documentação
Servidor MCP BeeL — Facturação eletrónica VeriFactu para agentes de IA
Servidor MCP de facturação eletrónica espanhola com VeriFactu (AEAT): cria, emite e retifica faturas a partir de Claude, ChatGPT, Cursor ou VS Code.
Servidor MCP para facturação eletrónica espanhola com conformidade VeriFactu — emite, corrige e regista faturas na AEAT diretamente do seu agente de IA.
beel.es · Documentação da API · Guia MCP · npm
Um servidor MCP (Model Context Protocol) que permite a um agente de IA emitir faturas eletrónicas espanholas legalmente conformes — registo VeriFactu na AEAT, tipos de fatura F1/F2, retificações R1–R5, validação de NIF contra o censo, e as chaves de regime que a regulamentação exige. Ligue-o ao Claude, ChatGPT, Cursor ou VS Code e o seu agente pode tratar da faturação espanhola — facturación electrónica e factura electrónica VeriFactu — de ponta a ponta, sem que escreva uma única chamada de API.
Não é um wrapper gerado em torno de uma API. Três coisas tornam-no utilizável por um modelo:
- As ferramentas derivam do contrato OpenAPI público, pelo que o esquema de entrada de cada ferramenta é o esquema real da operação — enums, itens de linha, chaves de regime e tudo o resto. A superfície não pode divergir da API.
- Uma política de inclusão de ferramentas decide o que um agente deve realmente receber. Transferências binárias, uploads multipart, infraestrutura de webhooks, operações que apenas uma sessão de navegador pode autenticar, e as obsoletas são excluídas por regra, não manualmente.
- Proteções fiscais viajam com as ferramentas: os invariantes que um wrapper gerado perderia, tanto como documentação que o modelo lê como como verificações pré-voo que impedem um pedido não conforme antes de se tornar um documento fiscal.
Um único código, dois transportes: o servidor remoto alojado em
https://mcp.beel.es/mcp (Streamable HTTP + OAuth — um início de sessão por utilizador, nada para
instalar), e um servidor local stdio construído a partir deste repositório para uso sem cabeça, onde
uma chave de API funciona e um início de sessão baseado em navegador não.
Início rápido
Adicione https://mcp.beel.es/mcp como conector no Claude, ChatGPT, Cursor ou VS Code e
inicie sessão com a sua conta BeeL. Nada para instalar e sem chave de API para gerir: o servidor atua
com as suas próprias credenciais, e o fluxo OAuth é descoberto a partir do URL.
# Claude Code
claude mcp add --transport http beel https://mcp.beel.es/mcp
Essa é toda a configuração para uso interativo. Continue a ler apenas se precisar do servidor local.
Executar localmente
Use o servidor local quando o OAuth não puder: um trabalho agendado que emite faturas, um pipeline de CI, ou qualquer processo sem cabeça onde ninguém esteja presente para concluir um início de sessão no navegador. Autentica com uma chave de API em vez disso.
Requer Node ≥ 20.
// Claude Desktop / Claude Code MCP config
{
"mcpServers": {
"beel": {
"command": "npx",
"args": ["-y", "@beel_es/mcp"],
"env": { "BEEL_API_KEY": "beel_sk_test_xxx" }
}
}
}
# Claude Code
claude mcp add beel --env BEEL_API_KEY=beel_sk_test_xxx -- npx -y @beel_es/mcp
Chaves com prefixo beel_sk_test_ são seguras para experimentar; beel_sk_live_ emite documentos
fiscais reais.
As versões são publicadas a partir de CI através de npm publicação
confiável, pelo que têm proveniência: o npm
regista o commit e o fluxo de trabalho exatos de onde cada compilação veio. Verifique com npm audit signatures.
Cada versão também é anunciada no MCP
Registry como es.beel/mcp, listando ambos
os transportes, para que os clientes que navegam no registry encontrem o servidor sem serem apontados
para ele. O nome é autenticado por um registo DNS em beel.es, pelo que diz que o servidor vem
de nós e não meramente de algum repositório.
Uma listagem anterior sob io.github.beel-es/beel-mcp (v0.2.2) foi retirada quando o nome
mudou. Os nomes do registry são identidades em vez de rótulos, pelo que uma renomeação é uma nova entrada em vez
de um redirecionamento; ambos apontam para o mesmo pacote npm e o mesmo servidor alojado.
O que fornece
- 125 ferramentas de API derivadas de
openapi/public-api.yaml— faturas, clientes, produtos, faturas recorrentes, séries e configuração fiscal, validação de NIF, empresas. - 7 ferramentas sintéticas para as quais a API não tem um único endpoint:
beel_docs_search,beel_docs_get,beel_docs_listsobre a documentação (o endpoint de pesquisa do site de docs e o Markdown de uma página de cada vez, ou algumas das suas secções numa chamada: uma página longa responde com o seu índice);beel_rules_listebeel_rules_getsobre o catálogo de regras fiscais (por id, vários ids de uma vez, domínio, palavra-chave ou código de erro);beel_schema_get, os campos dos esquemas de pedido e resposta como declarações compactas semelhantes a TypeScript do contrato incluído (por nome de esquema, ou por nome de ferramenta para a sua consulta, corpo e tipo de retorno); ebeel_get_setup_status, que reporta por NIF exatamente o que falta antes de poder emitir, a única próxima ação a tomar, e os ids a partir dos quais uma integração começa (empresa, série padrão por tipo de documento, estado VeriFactu e padrões fiscais). - Recursos de proteção sob
beel://guardrails/*— as regras fiscais, um recurso por domínio, os guias de uso da API, ebeel://guardrails/errors, um catálogo de cada código de erro com a ação que exige. Os domínios e guias que se aplicam são nomeados na descrição de cada ferramenta que restringem. - 7 prompts de fluxo de trabalho que codificam a ordem segura de operações para os fluxos onde a
ordem é o que os torna seguros:
issue-invoice(validar NIF → escolher F1/F2 → verificar as portas VeriFactu → emitir),fix-invoice(anular vs corrigir),onboard-nif,setup-representation,invite-member,connect-paymentseupgrade-integration. - Visualizador de PDF de fatura inline (MCP Apps): gerar um PDF de fatura abre-o num painel lateral em hosts que o suportam.
Um catálogo gerado de cada ferramenta, com os âmbitos que cada uma requer, vive em
docs.beel.es/mcp/tools (npm run tools:catalog).
O que deliberadamente não é uma ferramenta
Transferências binárias (pré-visualização de PDF, ZIP em massa, exportação Excel/CSV), uploads multipart (importação CSV/Holded,
submissão de PDF assinado), infraestrutura de webhooks, operações que apenas uma sessão de navegador
pode autenticar, e cada operação deprecated. Um agente não pode conduzi-las, e cada uma
custa contexto que uma ferramenta utilizável precisa. As regras estão em
src/policy/tool-policy.ts.
As proteções fiscais
A faturação eletrónica espanhola tem invariantes que um LLM errará a partir do esquema sozinho — anular uma fatura que deveria ter sido corrigida, usar R1 numa fatura simplificada, editar algo que a AEAT já registou. O servidor aborda isso em três camadas, e a diferença entre elas importa:
1. Consultivo — duas fontes, mantidas separadas de propósito:
- As regras fiscais são o catálogo que o site de documentação publica em
docs.beel.es/api/rules.json: cada regra tem um id (COR-002), uma declaração, por que existe, a sua base legal, os códigos de erro que a aplicam e exemplos. O servidor lê em tempo de execução (em cache, como os outros ficheiros de docs) e serve através debeel_rules_list/beel_rules_gete um recurso por domínio (beel://guardrails/corrective, …). Nada fiscal é redigitado aqui. Um instantâneo do catálogo acompanha o pacote como recurso de recurso para quando o host de docs está inacessível;npm run sync:rulesé o seu único escritor, e um teste falha se foi editado manualmente. Os antigos URIsbeel://guardrails/cancel-vs-rectify,invoice-typeseregime-keysainda resolvem, para os domínios que os substituíram. - Os guias de uso da API —
src/guardrails/rules/*.md— cobrem o que não é uma regra fiscal mas ainda assim tropeça um agente: como uma linha declara o seu preço, como uma série é configurada, em que empresa uma operação atua, como ler a validação de NIF e a prontidão de emissão, e qual ferramenta executa cada operação de fatura. Ligam a ids de regras em vez de os reafirmar.
Os domínios e guias que se aplicam são nomeados na descrição de cada ferramenta que restringem, para que a restrição viaje com a chamada.
2. Aplicado — src/guardrails/validate.ts, verificado antes de o pedido ser enviado, para que um
payload mau nunca consuma uma chave de idempotência:
| Verificação | Código |
|---|---|
| Exatamente um campo de preço por linha | LINE_UNIT_PRICE_XOR_DECLARED_TOTAL |
| Sem desconto num total declarado | LINE_DECLARED_TOTAL_FORBIDS_DISCOUNT |
| Sem retenção de IRPF numa fatura simplificada (F2) | SIMPLIFICADA_FORBIDS_IRPF |
Sem nif ou alternative_id no destinatário de uma fatura simplificada (F2) | SIMPLIFIED_INVOICE_FORBIDS_IDENTIFIED_RECIPIENT |
Sobretaxa de equivalência apenas sob regime 18, e 18 apenas com um | SURCHARGE_REQUIRES_REGIME / REGIME_REQUIRES_SURCHARGE |
| O formato da série pode distinguir os seus períodos de reinício | SERIES_ANNUAL_REQUIRES_YEAR / SERIES_MONTHLY_REQUIRES_MONTH_AND_YEAR |
| A numeração só é inicializada na chamada que ativa a empresa | NUMBERING_REQUIRES_ACTIVATION |
As linhas SUPLIDO carregam a sua referência de origem | verificado localmente |
Texto de isenção apenas sob razão OTRO | verificado localmente |
As retificações passam pela sua própria operação, não type: CORRECTIVE | verificado localmente |
3. Explicado — a API BeeL já responde bem: o seu message é escrito para um
humano no idioma do chamador, error.details carrega os detalhes, e o campo RFC 7807
type liga a uma página de documentação para esse código exato. O
servidor retransmite tudo isso intacto, e adiciona apenas as duas coisas que uma resposta não pode
carregar: o remédio como uma chamada de ferramenta — os docs dirigem-se a alguém com o painel
aberto ("crie uma série nas definições"), um agente precisa de beel_set_default_series — e
se repetir pode possivelmente ajudar, que é o que impede um agente de fazer loop num 403
que precisa de um administrador. Quando o código é um que uma regra publicada cita, o erro também
nomeia essa regra (id, título, ligação). src/guardrails/catalog.ts contém apenas códigos onde um desses
se aplica; qualquer outra coisa passa, porque uma paráfrase seria pior do que o
original e divergiria dele. Os blockers[] aninhados de EMISSION_NOT_READY são o
caso mais claro: chegam como strings nuas sem mensagem e sem ligação, e cada um
sai a nomear a ferramenta que o limpa.
A API BeeL é a autoridade em tudo isto. Cada regra aplicada espelha uma rejeição
que o contrato documenta, pelo que o pré-voo é um subconjunto estrito do que a API recusa: só
pode tornar a falha mais rápida e melhor explicada, nunca permitir algo que a API
rejeitaria. Regras que dependem de estado do lado do servidor — correspondência do censo AEAT, o teto F2 de €3 000,
se uma série existe — permanecem consultivas de propósito, porque adivinhá-las
localmente rejeitaria faturas válidas. Defina BEEL_DISABLE_PREFLIGHT=1 para contornar as verificações
locais completamente.
Listas curadas manualmente são ancoradas por testes: cada código catalogado deve ainda aparecer no
contrato, cada operationId verificado deve ainda resolver para uma ferramenta real, e cada
referência de proteção deve apontar para uma proteção que existe. Uma renomeação de API falha CI em vez
de desligar silenciosamente uma verificação fiscal.
Configuração
Apenas servidor local
| Variável | Propósito |
|---|---|
BEEL_API_KEY | Chave de API. O prefixo seleciona o ambiente: beel_sk_test_ → Teste, beel_sk_live_ → Produção. |
BEEL_ENV / BEEL_CONFIG_DIR | Opcional. Com BEEL_API_KEY não definido, recorre ao ~/.config/beel/config.json da CLI (beel login); BEEL_ENV (test/live, padrão test) escolhe qual chave armazenada. |
Partilhado
| Variável | Finalidade |
|---|---|
BEEL_BASE_URL | URL base da API. Padrão https://app.beel.es/api. |
BEEL_DOCS_URL | Fonte de documentação para as ferramentas de docs e regras. Padrão https://docs.beel.es. |
BEEL_REQUEST_TIMEOUT_MS | Limite máximo para uma única chamada de API. Padrão 30000. |
BEEL_DISABLE_PREFLIGHT | Defina como 1 para ignorar as proteções obrigatórias. |
Todos os padrões estão em src/shared/defaults.ts; nada é codificado duas vezes. As
variáveis de implantação remota estão documentadas em DEPLOY.md.
O servidor inicia e lista as ferramentas sem nenhuma credencial — ele só gera erro quando uma
ferramenta de API é realmente chamada. Requisições POST carregam um Idempotency-Key estável
derivado da própria requisição, então um agente que tenta novamente "criar fatura" nunca pode
gerar uma segunda fatura.
Autohospedagem
O servidor remoto roda em Cloudflare Workers. Consulte DEPLOY.md para o namespace KV, o cliente OAuth que o BeeL deve ter registrado e os segredos envolvidos.
Desenvolvimento
npm ci
npm run dev # stdio server from source
npm test # vitest
npm run typecheck # both the Node and the Worker configs
npm run build # single-file bundle to dist/index.js
npm run inspect # MCP Inspector against the local build
npm run spec:verify # the vendored contract still matches its lock
npm run sync:rules # refresh the bundled rules snapshot from docs.beel.es
openapi/public-api.yaml é uma cópia gerada do contrato da API, e
openapi/spec.lock.json registra sua versão, contagem de operações e hash. O CI falha se os
dois discordarem, o que mantém um contrato versionado honesto. Consulte
CONTRIBUTING.md.
O restante do ecossistema de desenvolvedores BeeL
Tudo abaixo deriva do mesmo contrato OpenAPI, então o vocabulário — tipos de fatura, chaves de regime, séries, estados VeriFactu — é idêntico onde quer que você o encontre.
| API REST | O próprio contrato. Todo o resto é uma projeção dele |
| CLI | A mesma superfície a partir de um terminal, com sandbox por padrão |
| Nó n8n | Faturamento dentro de um fluxo de trabalho sem código |
| Plugin Claude Code | Implemente, audite e mantenha uma integração BeeL |
| Documentação legível por máquina | llms.txt para agentes que preferem ler a adivinhar |
FAQ
O que é o servidor MCP BeeL? Um servidor MCP que expõe a faturação eletrônica VeriFactu espanhola como ferramentas que um agente de IA pode chamar — para que Claude, ChatGPT, Cursor ou VS Code possam criar clientes, emitir faturas F1/F2, registrá-las na AEAT e enviar corretivos R1–R5 em seu nome.
Como conecto o faturamento VeriFactu ao Claude / ChatGPT / Cursor?
Adicione https://mcp.beel.es/mcp como conector e faça login com sua conta BeeL — veja
Início rápido. Nada para instalar e nenhuma chave de API para colar
no uso interativo.
É realmente compatível com VeriFactu? Sim. As faturas são registradas na AEAT sob VeriFactu, a numeração e as séries seguem a regulamentação, e as proteções fiscais impedem requisições não conformes antes que elas se tornem um documento fiscal.
VeriFactu ou TicketBAI? Este servidor tem como alvo o VeriFactu, o sistema nacional da AEAT. O TicketBAI (regime do País Basco) está fora do escopo.
Posso usá-lo sem um agente de IA? Sim — é um servidor MCP padrão, então qualquer cliente compatível com MCP funciona, e a mesma superfície de faturamento está disponível como API REST, CLI e nó n8n.
Contribuição
Relatórios de bugs e pull requests são bem-vindos — veja CONTRIBUTING.md
para saber como o projeto está organizado e quais convenções são essenciais, e
Discussões para perguntas. Issues
marcadas como good first issue
são um bom ponto de partida. Espera-se que todos os participantes sigam o
Código de Conduta. Problemas de segurança devem ser enviados para
security@beel.es em vez de uma issue pública; veja SECURITY.md.
Licença
MIT © BeeL.