POP | Electronic Invoicing for Europe

Gere faturas eletrônicas em conformidade (Peppol UBL, PDF, FatturaPA XML) e envie-as diretamente para a Rede Peppol, o SdI italiano e outros.

Documentação

pop-mcp

Servidor MCP (Model Context Protocol) para POP — permitindo que LLMs gerem, enviem e gerenciem faturas eletrônicas italianas (FatturaPA/SdI), Peppol, KSeF, ZUGFeRD/Factur-X e faturas em PDF diretamente de assistentes de IA.

npm: @getpopapi/pop-mcp · Remoto: https://mcp.popapi.io/mcp

License: MIT Node.js


MCP Remoto (HTTP) — a forma mais rápida de começar

Não quer instalar nada? O pop-mcp roda como um servidor MCP hospedado e multi-tenant em:

https://mcp.popapi.io/mcp

Acesse popapi.io para obter uma chave de licença e aponte qualquer cliente compatível com MCP para essa URL com sua chave como token Bearer. Sem instalação local, sem variável de ambiente POP_API_KEY, sem etapa de build — esta é a forma recomendada de experimentar o pop-mcp para a maioria das pessoas. Use a configuração local via stdio abaixo apenas se você precisar especificamente de uma configuração do Claude Desktop executando um processo na sua própria máquina.

Como funciona

Este endpoint fala MCP 2026-07-28, que é totalmente stateless: não há handshake initialize nem sessão para abrir ou rastrear. Cada requisição é autocontida — ela nomeia sua própria versão de protocolo e capacidades — e o servidor a responde de forma independente. Por isso, este é um endpoint multi-tenant: ele nunca lê um POP_API_KEY fixo do próprio ambiente. Cada requisição deve carregar sua própria chave de licença POP como token Bearer:

Authorization: Bearer <your_license_key>

Um cabeçalho Authorization ausente ou malformado retorna um 401 com error_code: "unauthorized_user" antes que qualquer chamada à API POP seja feita. Uma chave inválida, porém bem formada, é passada diretamente para a API da POP e exibe qualquer erro que a POP retornar (unauthorized_user, insufficient_level, etc.) — o servidor não revalida chaves por conta própria.

Qualquer cliente MCP HTTP moderno pode se conectar: Claude (conector remoto), a OpenAI Responses API, n8n, MCP Inspector ou uma integração personalizada — não apenas o Claude Desktop. Todas as ferramentas de fatura, status, avançadas e de onboarding estão disponíveis; as ferramentas de onboarding usam seu próprio onboarding_token por chamada e não exigem a chave Bearer.

Exemplo com curl

Descubra as versões de protocolo e capacidades suportadas pelo servidor (opcional — os clientes também podem simplesmente chamar tools/list ou tools/call diretamente e tratar um erro de negociação de versão inline):

curl -X POST https://mcp.popapi.io/mcp \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer your_license_key_here" \
  -H "MCP-Protocol-Version: 2026-07-28" \
  -H "Mcp-Method: server/discover" \
  -d '{
    "jsonrpc": "2.0",
    "id": 1,
    "method": "server/discover",
    "params": { "_meta": { "io.modelcontextprotocol/protocolVersion": "2026-07-28", "io.modelcontextprotocol/clientCapabilities": {} } }
  }'

Liste as ferramentas disponíveis — cada requisição é autocontida, então o _meta (versão do protocolo + capacidades do cliente) viaja em cada chamada, não apenas na primeira:

curl -X POST https://mcp.popapi.io/mcp \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer your_license_key_here" \
  -H "MCP-Protocol-Version: 2026-07-28" \
  -H "Mcp-Method: tools/list" \
  -d '{
    "jsonrpc": "2.0",
    "id": 2,
    "method": "tools/list",
    "params": { "_meta": { "io.modelcontextprotocol/protocolVersion": "2026-07-28", "io.modelcontextprotocol/clientCapabilities": {} } }
  }'

O catálogo de ferramentas é idêntico para cada chave de licença, então as respostas de tools/list e server/discover carregam uma dica de cache público de uma hora (ttlMs: 3600000, cacheScope: "public") — clientes e gateways podem armazená-las em cache entre tenants.

MCP-Protocol-Version e Mcp-Method são obrigatórios em toda requisição (conforme SEP-2243) e devem corresponder exatamente ao _meta.protocolVersion e method do corpo, caso contrário o servidor rejeita a requisição com um 400 e erro JSON-RPC -32020 (HeaderMismatch). Requisições tools/call exigem adicionalmente um cabeçalho Mcp-Name correspondente a params.name.

Exemplo com MCP Inspector

npx @modelcontextprotocol/inspector

Configure-o para conectar a https://mcp.popapi.io/mcp com o cabeçalho Authorization: Bearer <your_license_key>.

Este endpoint roda como uma função serverless da Vercel (api/mcp.tssrc/mcpHandler.ts). Para executá-lo localmente: npx vercel dev (requer vercel link no projeto primeiro).


O que é POP?

POP é um serviço em nuvem para geração e entrega de faturas eletrônicas, com suporte a:

  • 🇮🇹 Faturamento eletrônico italiano (FatturaPA/SdI) — em conformidade com o D.Lgs. 127/2015
  • 🇪🇺 Peppol — faturamento B2B transfronteiriço pan-europeu (UBL 2.1)
  • 📄 Faturas em PDF — personalizadas, com entrega por e-mail
  • Validação — códigos fiscais, números de IVA, verificações pré-envio de documentos
  • 🗄️ Preservação — arquivamento legal italiano (conservazione sostitutiva)

Ferramentas Disponíveis (11 no total)

Criação de Faturas

FerramentaEndpointPlano
pop_create_sdi_invoicePOST /create-xmlQualquer
pop_create_peppol_invoicePOST /create-ublQualquer (Basic+ para enviar)
pop_create_pdf_invoicePOST /create-pdfQualquer (Basic+ para e-mail)
pop_create_ksef_invoicePOST /create-ksef-xmlQualquer (configuração KSeF para envio via provedor)
pop_create_zugferd_invoicePOST /create-zugferdQualquer
pop_sync_zoho_documentPOST /integration/zoho/syncConector Zoho obrigatório

Status e Recuperação

FerramentaEndpointPlano
pop_get_invoice_statusPOST /sdi/document-notificationsQualquer
pop_get_peppol_documentPOST /peppol/document-getBasic+
pop_get_sdi_documentPOST /sdi/document-getBasic+

Validação e SdI Avançado

FerramentaEndpointPlano
pop_verify_sdi_documentPOST /sdi/document-verifyBasic+
pop_preserve_documentPOST /sdi/document-preserveBasic+

Pré-requisitos

  • Node.js >= 20
  • Uma chave de licença POP
  • Para envio SdI/Peppol: integração ativa na sua conta POP (plano Basic/Growth)

Autenticação

Obtenha Sua Chave de Licença

Novo na POP? Visite popapi.io para criar sua conta e obter sua chave de licença.

Usuários somente de API podem ativar sua conta e obter um license_key com este fluxo:

  1. Abra https://popapi.io/otp-login/
  2. Informe seu endereço de e-mail
  3. Receba uma senha de uso único (OTP) por e-mail e informe-a
  4. Conclua o assistente de configuração
  5. Abra https://popapi.io/Conta > API
  6. Copie o license_key padrão gerado

Gerenciamento de Chaves

  • Sua conta inclui um license_key padrão, visível em Conta > API
  • Você pode gerar chaves adicionais vinculadas à mesma conta a partir dessa mesma página
  • Todo license_key deve ser tratado como uma credencial secreta — não o envie para o controle de versão

Primeiros Passos Recomendados

  1. Obtenha seu license_key
  2. Teste-o com GET /account-profile
  3. Envie uma requisição de geração de documento com um payload real
  4. Adicione integrações opcionais de entrega somente depois que a geração local funcionar

Instalação

Via npm (recomendado)

npm install -g @getpopapi/pop-mcp

A partir do Código-Fonte

git clone https://github.com/getpopapi/pop-mcp
cd pop-mcp
npm install
npm run build

Configuração

Defina sua chave de licença POP como uma variável de ambiente:

export POP_API_KEY=your_license_key_here

Opcional — use o ambiente de staging:

export POP_ENVIRONMENT=staging

Configuração do Claude Desktop

Adicione ao seu claude_desktop_config.json:

Se instalado via npm:

{
  "mcpServers": {
    "pop": {
      "command": "pop-mcp",
      "env": {
        "POP_API_KEY": "your_license_key_here"
      }
    }
  }
}

Se executado a partir do código-fonte:

{
  "mcpServers": {
    "pop": {
      "command": "node",
      "args": ["/path/to/pop-mcp/dist/cli.js"],
      "env": {
        "POP_API_KEY": "your_license_key_here"
      }
    }
  }
}

Locais dos arquivos de configuração:

  • macOS: ~/Library/Application Support/Claude/claude_desktop_config.json
  • Windows: %APPDATA%\Claude\claude_desktop_config.json
  • Linux: ~/.config/Claude/claude_desktop_config.json

Referência de Ferramentas

O license_key é sempre injetado automaticamente a partir de POP_API_KEY — nunca o passe manualmente.

pop_create_sdi_invoice

Gere um documento XML FatturaPA italiano. Opcionalmente, envie-o ao SdI (Sistema di Interscambio).

Entradas MCP:

ParâmetroTipoObrigatórioDescrição
dataobjectDados completos da fatura (veja Estrutura de Dados da Fatura)
submit_to_sdibooleanDefina true para enviar ao SdI. Requer plano Basic+ com integração SdI ativa. Padrão: false
integrationobjectSubstitui a configuração de integração. Substitui submit_to_sdi se definido.
environmentstringAmbiente de destino (ex.: "sandbox")

Opções de integração para integration.use:

  • "sdi-via-pop" ou "sdi" — Enviar via POP SdI
  • "pop-to-webhook" — Entregar a um webhook (requer id)
  • "fatture-in-cloud" — Entregar ao Fatture in Cloud

Payload da API enviado:

{
  "license_key": "YOUR_LICENSE_KEY",
  "user_agent": "pop-mcp",
  "user_agent_version": "1.0.0",
  "data": { "...invoice fields..." },
  "integration": { "use": "sdi-via-pop", "action": "create" }
}

integration é omitido quando submit_to_sdi é false e nenhuma substituição é fornecida (geração somente XML).


pop_create_peppol_invoice

Gere um documento Peppol UBL 2.1. Opcionalmente, envie-o à rede Peppol.

Entradas MCP:

ParâmetroTipoObrigatórioDescrição
dataobjectDados completos da fatura. customer_type deve ser "company" ou "freelance"
submit_to_peppolbooleanDefina true para enviar à rede Peppol. Requer plano Basic+. Padrão: false
integrationobjectSubstitui a configuração de integração
environmentstringAmbiente de destino

Opções de integração para integration.use:

  • "peppol-via-pop" ou "peppol" — Enviar via POP Peppol
  • "pop-to-webhook" — Entregar a um webhook (requer id)

Payload da API enviado:

{
  "license_key": "YOUR_LICENSE_KEY",
  "user_agent": "pop-mcp",
  "user_agent_version": "1.0.0",
  "data": { "...invoice fields..." },
  "integration": { "use": "peppol-via-pop", "action": "create" }
}

pop_create_pdf_invoice

Gere uma fatura em PDF personalizada. Opcionalmente, envie-a por e-mail para até 3 destinatários.

Entradas MCP:

ParâmetroTipoObrigatórioDescrição
dataobjectDados da fatura. Deve incluir data.pdf para configurações específicas de PDF
send_emailbooleanDefina true para enviar o PDF por e-mail (requer data.pdf.email_invoice, plano Basic+). Padrão: false
environmentstringAmbiente de destino

Campos de data.pdf:

CampoDescrição
doc_type_titleTítulo exibido no documento (ex.: "Invoice", "Receipt")
logo_urlURL do logotipo da empresa (HTTPS)
head.store_info_addressEndereço do fornecedor como string no cabeçalho
head.billing[]Matriz de endereço de cobrança do cliente
head.shipping[]Matriz de endereço de entrega (opcional)
email_invoice.toAté 3 endereços de e-mail dos destinatários
email_invoice.fromEndereço de resposta (reply-to)
footer_textMensagem personalizada de rodapé
total_taxValor total de impostos como string

Payload da API enviado:

{
  "license_key": "YOUR_LICENSE_KEY",
  "user_agent": "pop-mcp",
  "user_agent_version": "1.0.0",
  "data": {
    "...invoice fields...",
    "pdf": {
      "doc_type_title": "Invoice",
      "logo_url": "https://example.com/logo.png",
      "head": { "store_info_address": "Via Roma 1, 00100 Roma IT", "billing": [] },
      "total_tax": "22.00",
      "email_invoice": { "to": ["customer@example.com"] }
    }
  }
}

pop_create_ksef_invoice

Gere uma fatura ou nota de crédito XML KSeF FA(3) polonesa. Opcionalmente, envie-a por meio de uma integração configurada com provedor KSeF.

Entradas MCP:

ParâmetroTipoObrigatórioDescrição
dataobjectDados completos da fatura para geração KSeF FA(3)
integrationobjectConfiguração opcional de envio ao provedor KSeF: { use: "ksef" | "ksef-via-pop", action }
environmentstringAmbiente de destino (ex.: "sandbox")

Regras de domínio específicas do KSeF:

  • Somente Polônia — transfer_lender.personal_data.tax_id_vat.country_id deve ser "PL" com um NIP de 10 dígitos como id_code
  • customer_type deve ser "company" ou "freelance" (sem pessoas físicas)
  • nature é sempre obrigatório no nível superior para KSeF (diferente de SdI/Peppol, onde só é exigido com IVA 0%) — reutiliza os mesmos códigos de natureza SdI (N1, N2.1, N2.2, N3.1, N3.2, N4, ...) para derivar a variante fiscal interna do KSeF
  • transmitter_data não é usado (conceito exclusivo do SdI)
  • payment_data.payment_details aceita apenas MP01, MP02/MP03, MP05, MP08 — outros códigos de método de pagamento são rejeitados no momento da geração
  • A geração de XML base está disponível em qualquer plano; o envio via provedor por meio de integration.use: "ksef" requer um plano Basic+ e o fornecedor já cadastrado como entidade legal KSeF no painel da POP

Payload da API enviado:

{
  "license_key": "YOUR_LICENSE_KEY",
  "user_agent": "pop-mcp",
  "user_agent_version": "1.0.0",
  "data": { "...invoice fields...", "nature": "N1" },
  "integration": { "use": "ksef", "action": "create" }
}

integration é omitido completamente para geração local somente XML (sem envio via provedor).

Retorna: XML FA(3) bruto (application/xml) para geração local, ou JSON (com um UUID) quando enviado por meio de uma integração com provedor.


pop_create_zugferd_invoice

Gere um pacote de documentos ZUGFeRD/Factur-X: um PDF visual, um XML CII EN16931 e um PDF/A-3 híbrido com o XML incorporado.

Entradas MCP:

ParâmetroTipoObrigatórioDescrição
dataobjectDados completos da fatura para geração ZUGFeRD/Factur-X
environmentstringAmbiente de destino (ex.: "sandbox")
Esta ferramenta não possui parâmetro integration — a geração ZUGFeRD é apenas local, sem etapa de envio/entrega.

Payload da API enviado:

{
  "license_key": "YOUR_LICENSE_KEY",
  "user_agent": "pop-mcp",
  "user_agent_version": "1.0.0",
  "data": { "...invoice fields..." }
}

Retorna: JSON com metadados de geração e três anexos codificados em Base64:

{
  "success": true,
  "data": {
    "valid": true,
    "profile": "EN16931",
    "attachments": {
      "pdf": { "filename": "...", "mime": "application/pdf", "content_base64": "..." },
      "xml": { "filename": "...", "mime": "application/xml", "content_base64": "..." },
      "hybrid_pdf": { "filename": "...", "mime": "application/pdf", "content_base64": "..." }
    },
    "validation": { "...": "..." },
    "errors": [],
    "warnings": []
  }
}

pop_get_invoice_status

Recupere o status de processamento e as notificações SdI para uma fatura enviada.

Entradas MCP:

ParâmetroTipoObrigatórioDescrição
uuidstring (UUID)UUID da fatura retornado por pop_create_sdi_invoice quando submit_to_sdi=true
response_format"markdown" | "json"Formato de saída. Padrão: "markdown"
environmentstringAmbiente de destino

Payload da API enviado:

{
  "license_key": "YOUR_LICENSE_KEY",
  "integration": { "uuid": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx" }
}

Status de notificação SdI: pending · accepted · rejected · delivery

O processamento SdI é assíncrono e pode levar de minutos a horas. Tente novamente se nenhuma notificação for retornada ainda.


pop_get_peppol_document

Recupere um documento Peppol da rede por UUID.

Entradas MCP:

ParâmetroTipoObrigatórioDescrição
uuidstring (UUID)UUID do documento Peppol de pop_create_peppol_invoice
zonestring (2 caracteres)Código do país do ponto de acesso Peppol (ex.: "BE" para Bélgica). Obrigatório para algumas regiões.
response_format"markdown" | "json"Formato de saída. Padrão: "markdown"
environmentstringAmbiente de destino

Payload da API enviado:

{
  "license_key": "YOUR_LICENSE_KEY",
  "integration": { "uuid": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx", "zone": "IT" }
}

zone é omitido do payload se não for fornecido.


pop_get_sdi_document

Recupere um documento SdI (FatturaPA) arquivado do armazenamento POP por UUID.

Entradas MCP:

ParâmetroTipoObrigatórioDescrição
uuidstring (UUID)UUID do documento SdI
response_format"markdown" | "json"Formato de saída. Padrão: "markdown"
environmentstringAmbiente de destino

Payload da API enviado:

{
  "license_key": "YOUR_LICENSE_KEY",
  "integration": { "uuid": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx" }
}

Requer: plano Basic+ com integração SdI ativa.


pop_verify_sdi_document

Valide um documento XML SdI para conformidade antes do envio. Não envia o documento.

Entradas MCP:

ParâmetroTipoObrigatórioDescrição
xml_base64stringO documento XML SdI codificado como uma string Base64
environmentstringAmbiente de destino

Payload da API enviado:

{
  "license_key": "YOUR_LICENSE_KEY",
  "skip_business_check": true,
  "integration": { "xml": "<base64-encoded-xml-string>" }
}

Verificações de validação realizadas: conformidade com esquema XML · formato do código fiscal · validade do número de IVA · presença de campos obrigatórios · consistência de valores

Requer: plano Basic+ com integração SdI ativa e empresa registrada.


pop_preserve_document

Arquive um documento SdI em armazenamento digital certificado de longo prazo (conservazione sostitutiva). A lei italiana exige que as faturas sejam preservadas por 10 anos.

Entradas MCP:

ParâmetroTipoObrigatórioDescrição
uuidstring (UUID)UUID do documento SdI a ser arquivado
environmentstringAmbiente de destino

Payload da API enviado:

{
  "license_key": "YOUR_LICENSE_KEY",
  "integration": { "uuid": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx" }
}

Importante: Chame esta ferramenta apenas quando pop_get_invoice_status retornar o status RC (Ricevuta di Consegna) ou MC (Mancata Consegna). Não chame para os status NS, EC, SE ou DT.

Requer: plano Basic+ com integração SdI ativa.


Exemplos de Uso

Gerar uma Fatura Italiana Simples (Somente XML)

Pergunte ao seu assistente de IA:

"Crie uma fatura FatturaPA para 1000€ + 22% de IVA para Rossi SRL (IVA IT12345678901, Milão). Minha empresa é Bianchi SRL (IVA IT98765432109, Roma), usando pagamento por transferência bancária para IBAN IT60X0542811101000000123456."

Enviar Fatura para o SdI

"Crie e envie para o SdI uma fatura #45 para serviços de consultoria, 500€ + 22% de IVA para o cliente Mario Rossi (código fiscal RSSMRA80A01H501U) em Roma."

Verificar Status da Fatura Após o Envio

"Qual é o status da fatura SdI com UUID abc123-def456-...?"

Gerar PDF com Entrega por E-mail

"Crie uma fatura em PDF para o pedido #123 e envie por e-mail para customer@example.com."

Verificar Documento SdI Antes do Envio

"Verifique o documento SdI com UUID abc123-... para conformidade antes do envio."


Requisitos do Plano

RecursoFreeBasic/GrowthPro
Geração de XML (local)
Geração de PDF
Envio SdI
Envio Peppol
Entrega de PDF por e-mail
Verificação de documento SdI
Preservação de documentos

Testes

MCP Inspector (Interativo)

npm run inspector
# or
npx @modelcontextprotocol/inspector dist/cli.js

Teste Rápido de Fumaça

POP_API_KEY=your_key node -e "
import('./dist/cli.js').catch(e => {
  if (e.message.includes('stdin')) process.exit(0);
  console.error(e); process.exit(1);
});
"

Listagem de Esquema da Ferramenta de Teste

echo '{"jsonrpc":"2.0","id":1,"method":"tools/list","params":{}}' | POP_API_KEY=test node dist/cli.js

Desenvolvimento

# Run with auto-reload
npm run dev

# Build
npm run build

# Clean build artifacts
npm run clean

Estrutura de Dados da Fatura

O parâmetro data para criação de fatura segue a estrutura FatturaPA:

data
├── id                    Invoice/order ID (numeric)
├── filename              Output filename without extension (e.g. 'IT99900088876_00009')
├── type                  "invoice" | "credit_note"
├── version               "FPR12" | "FPA12"
├── sdi_type              7-char SDI code ('0000000' for private individuals)
├── customer_type         "private" | "company" | "freelance" | "pa"
├── nature                VAT exemption code (required when rate is 0%, e.g. 'N2.1', 'N6.1')
├── transmitter_data
│   ├── transmitter_id    { country_id, id_code }
│   ├── progressive       Transmission progressive ID (e.g. '00001')
│   ├── transmitter_format  "FPR12" | "FPA12"
│   ├── sdi_code          7-char code
│   ├── transmitter_contact { phone, email }
│   └── recipient_pec     PEC email (alternative to sdi_code)
├── transfer_lender       Supplier/seller
│   ├── personal_data     { tax_id_vat: { country_id, id_code, tax_regime }, company_name }
│   ├── place             { address, zip_code, city, province_id, country_id }
│   └── contact           { phone, email }
├── transferee_client     Customer/buyer
│   ├── personal_data     { tax_id_vat, tax_id_code (fiscal code for IT private), company_name }
│   └── place             { address, zip_code, city, province_id, country_id }
├── invoice_body
│   ├── general_data      { doc_type (TD01|TD04), date (YYYY-MM-DD), invoice_number, currency }
│   └── total_document_amount
├── order_items[]
│   ├── description, quantity, unit
│   ├── unit_price, total_price
│   ├── rate              VAT rate as string (e.g. '22.00')
│   ├── total_tax         VAT amount (number)
│   └── item_type         "product" | "shipping" | "fee"
├── payment_data
│   ├── terms_payment     TP01 (instalment) | TP02 (full) | TP03 (advance)
│   ├── payment_details   MP01 (Cash) | MP02 (Check) | MP05 (Bank Transfer) | MP08 (Credit Card) | ...
│   ├── payment_amount
│   ├── beneficiary       Required for MP05 (bank transfer)
│   ├── financial_institution  Required for MP05
│   └── iban              Required for MP05
├── purchase_order_data   (optional) { id, date }
├── connected_invoice_data[]  (required for credit notes) { id, date }
├── overrides             (optional) { language, bollo_force_apply }
└── pdf                   (only for pop_create_pdf_invoice)
    ├── doc_type_title
    ├── logo_url
    ├── head              { store_info_address, billing[], shipping[] }
    ├── total_tax
    ├── email_invoice     { to[] (max 3), from }
    └── footer_text

Referência de Erros

Código de ErroSignificadoSolução
unauthorized_userChave de licença inválidaVerifique POP_API_KEY
insufficient_levelPlano muito baixoFaça upgrade do plano POP
business_not_registeredNenhum perfil de empresaRegistre-se em popapi.io
integration_inactiveSdI/Peppol não habilitadoAtive em popapi.io
pop_api_email_limit>3 destinatários de e-mailReduza para no máximo 3
pop_api_email_not_allowedO plano não permite e-mailFaça upgrade para Basic+

Projetos Relacionados


Licença

MIT © getpopapi