Skip to main content

MCP server for Brazilian electronic invoicing (NF-e / NFC-e)

Project description

mcp-nfe-br 🇧🇷

PyPI version Python License


Introdução

mcp-nfe-br é um servidor MCP (Model Context Protocol) que fornece ferramentas para a emissão e validação de documentos fiscais eletrônicos brasileiros: NF-e (modelo 55) e NFC-e (modelo 65), conforme o leiaute XML versão 4.00 da SEFAZ. Este servidor faz parte da família mcp-einvoicing-* / mcp-*-*, construída sobre mcp-einvoicing-core, que fornece o modelo de dados base, utilitários HTTP/OAuth2, e a infraestrutura comum de servidores MCP.

Status atual (v0.2.0): fase 1 do roadmap — validação de CPF/CNPJ, geração de XML NF-e/NFC-e (não assinado) e validação contra o XSD oficial (PL_010d, variante sem assinatura). Assinatura digital ICP-Brasil e integração com os webservices da SEFAZ estão planejadas para versões futuras — os documentos gerados são não assinados e não são transmitidos à SEFAZ por este servidor. NFS-e (nota fiscal de serviços) e CT-e (conhecimento de transporte) são fases posteriores, fora do escopo desta versão.

English summary

mcp-nfe-br is an MCP (Model Context Protocol) server providing tools for Brazilian electronic fiscal documents: NF-e (modelo 55) and NFC-e (modelo 65), per SEFAZ XML schema 4.00. It is part of the mcp-*-* family built on mcp-einvoicing-core.

Current status (v0.2.0): Phase 1 of the roadmap — CPF/CNPJ tax-ID validation, unsigned NF-e/NFC-e XML generation, and XSD validation against the official PL_010d schema (unsigned variant). ICP-Brasil digital signing and SEFAZ webservice submission are planned for future releases — generated documents are unsigned and are not transmitted to SEFAZ by this server. NFS-e and CT-e are later phases, out of scope for this version.


Instalação

Requisitos

Usando uv (recomendado)

uv add mcp-nfe-br

Usando pip

pip install mcp-nfe-br

A partir do código-fonte

git clone https://github.com/cmendezs/mcp-nfe-br.git
cd mcp-nfe-br
uv sync --all-extras

Configuração

Adicione o servidor à configuração do seu cliente MCP. Para o Claude Desktop, edite claude_desktop_config.json:

{
  "mcpServers": {
    "nfe-br": {
      "command": "uvx",
      "args": ["mcp-nfe-br"]
    }
  }
}

Para uma instalação local de desenvolvimento:

{
  "mcpServers": {
    "nfe-br": {
      "command": "uv",
      "args": ["run", "mcp-nfe-br"],
      "cwd": "/path/to/mcp-nfe-br"
    }
  }
}

Variáveis de ambiente

Variável Descrição Padrão
BR_READ_ONLY Defina como 1 para desativar as ferramentas de escrita SEFAZ (br__submit_nfe, br__distribute_dfe). Modo seguro para exploração. O ambiente SEFAZ (produção/homologação) é selecionado por chamada via o argumento tp_amb.
LOG_LEVEL Nível de log: DEBUG, INFO, WARNING, ERROR INFO

Ferramentas disponíveis

br__validate_cpf

Valida um CPF (Cadastro de Pessoas Físicas) — número de identificação fiscal de pessoa física, conforme o algoritmo módulo 11 da Receita Federal.

Parâmetro Tipo Obrigatório Descrição
cpf string sim CPF com ou sem separadores ./-

Retorna um TaxIdValidationResult com valid=True e o valor limpo (11 dígitos) em caso de sucesso, ou valid=False com mensagem de erro em português.


br__validate_cnpj

Valida um CNPJ (Cadastro Nacional da Pessoa Jurídica) — número de identificação fiscal de pessoa jurídica. Aceita tanto o formato numérico tradicional (14 dígitos) quanto o formato alfanumérico introduzido pela NT 2026.004 (PL_010d), com vigência em homologação a partir de 2026-06-01 e em produção a partir de 2026-07-01.

Parâmetro Tipo Obrigatório Descrição
cnpj string sim CNPJ com ou sem separadores .///-

Retorna um TaxIdValidationResult com valid=True e o valor limpo (14 caracteres) em caso de sucesso, ou valid=False com mensagem de erro em português.

⚠️ [Unverified]: o algoritmo de dígito verificador para o formato alfanumérico do CNPJ foi implementado com base em fontes secundárias, pois a fonte primária ("NT Conjunta DFe 2025.001") ainda não está disponível localmente. Veja context-library/countries/br.md para detalhes.


br__generate_nfe

Gera um documento NF-e/NFC-e 4.00 não assinado (<NFe><infNFe>…</infNFe></NFe>) a partir de um objeto BRInvoice.

Parâmetro Tipo Obrigatório Descrição
invoice object sim Documento BRInvoice (modelo 55 ou 65, grupos ide/emit/dest/det/total/transp/pag)

Retorna {"xml": ..., "chave_acesso": ..., "warnings": [...]}. Os avisos em português lembram que o documento não está assinado (ICP-Brasil) e não foi transmitido à SEFAZ — ambas as etapas ficam a cargo de um processo separado.

Cobertura da fase 1 para os grupos de tributos por item:

Tributo Códigos suportados Comportamento
ICMS CST 00 (regime normal) ou CSOSN 102 (Simples Nacional) outros códigos geram DocumentGenerationError
PIS/COFINS CST 01/02 (alíquota) ou 04-09 (não tributado) grupo omitido se pis_cst/cofins_cst forem None
IPI CST 00/49/50/99 (tributado) ou outro (não tributado) grupo omitido se ipi_cst for None

[NEED: IBS/CBS/Imposto Seletivo — Grupo UB/W03 (NT 2025.002-RTC) ainda não modelado, ver context-library/countries/br.md "Known gaps"].


br__validate_nfe_xml

Valida um XML NF-e/NFC-e 4.00 contra o XSD oficial PL_010d (variante local "sem assinatura" — veja nota abaixo).

Parâmetro Tipo Obrigatório Descrição
xml_content string não* XML como string
xml_base64 string não* XML codificado em base64

* Exatamente um de xml_content/xml_base64 deve ser informado.

Retorna {"valid": bool, "errors": [...], "metadata": {"schema_version": ...}}.

[Inference]: o XSD oficial (nfe_v4.00.xsd/leiauteNFe_v4.00.xsd, PL_010d) exige <ds:Signature> como filho obrigatório de <NFe>. Como a fase 1 gera documentos não assinados, esta ferramenta valida contra uma cópia derivada local (nfe_v4.00_unsigned.xsd) onde <ds:Signature> passou a ser opcional (minOccurs="0"). A validação de documentos assinados (fase futura) deve usar o XSD oficial sem modificações.


br__build_access_key

Monta uma chave de acesso (chNFe, 44 caracteres) com dígito verificador módulo 11, a partir dos componentes cUF, dhEmi, CNPJ do emitente, modelo, série e número do documento.

Parâmetro Tipo Obrigatório Descrição
c_uf string sim Código IBGE da UF (2 dígitos)
dh_emi string sim Data/hora de emissão (ISO 8601)
cnpj string sim CNPJ do emitente (numérico ou alfanumérico PL_010d)
modelo string sim 55 (NF-e) ou 65 (NFC-e)
serie string sim Série do documento
nnf string sim Número do documento
tp_emis string não Forma de emissão (padrão "1")
c_nf string não Código numérico aleatório (cNF, 8 dígitos); gerado automaticamente se omitido

Retorna {"chave_acesso": ..., "cnf": ...}.


Arquitetura

mcp-nfe-br/
├── src/
│   └── mcp_nfe_br/
│       ├── __init__.py
│       ├── server.py              # ponto de entrada MCP e registro de ferramentas
│       ├── models/
│       │   ├── __init__.py
│       │   └── invoice.py         # BRInvoice, BRInvoiceLine, NFeModelo, TipoOperacao
│       ├── standards/
│       │   ├── __init__.py
│       │   └── nfe_generator.py   # NFeGenerator — gera NF-e/NFC-e 4.00 não assinada
│       ├── validators/
│       │   ├── __init__.py
│       │   └── nfe_xsd.py         # NFeXSDValidator — valida contra XSD PL_010d (variante sem assinatura)
│       ├── schemas/nfe/           # XSDs bundled (oficiais + variantes "_unsigned")
│       ├── tools/
│       │   ├── __init__.py
│       │   ├── validation.py      # br__validate_cpf, br__validate_cnpj
│       │   └── generation.py      # br__generate_nfe, br__validate_nfe_xml, br__build_access_key
│       └── utils/
│           ├── __init__.py
│           ├── document_ids.py    # validate_cpf, validate_cnpj
│           └── access_key.py      # build_access_key, access_key_check_digit
├── tests/
│   ├── conftest.py
│   ├── fixtures/
│   ├── test_tools/
│   │   ├── test_validation.py
│   │   └── test_generation.py
│   ├── test_standards/
│   │   └── test_nfe_generator.py
│   ├── test_validators/
│   │   └── test_nfe_xsd.py
│   └── test_utils/
│       └── test_access_key.py
├── specs/nfe/                     # material normativo (XSDs, MOC, Notas Técnicas — não publicado)
├── audit/
│   ├── audit_vs_core.py
│   └── report.json
├── .github/workflows/publish.yml
├── pyproject.toml
├── RELEASE.md
└── LICENSE

Relação com mcp-einvoicing-core

mcp-einvoicing-core fornece:

  • Modelos Pydantic base para faturas, partes, itens e resultados de validação (InvoiceDocument, InvoiceLineItem, TaxIdValidationResult)
  • Infraestrutura comum de servidor MCP (EInvoicingMCPServer)
  • Cliente HTTP/OAuth2, cache de tokens, logging estruturado, hierarquia de exceções

mcp-nfe-br adiciona a lógica específica do Brasil:

  • BRInvoice (extensão de InvoiceDocument — NF-e/NFC-e não tem ascendência EN 16931)
  • Campos de Grupo I (NCM, CFOP, ICMS/IPI/PIS/COFINS) em BRInvoiceLine
  • Validação de CPF/CNPJ (incluindo o CNPJ alfanumérico da NT 2026.004)

Contribuindo

Contribuições são bem-vindas. Abra uma issue para discutir mudanças significativas antes de enviar um pull request.

git clone https://github.com/cmendezs/mcp-nfe-br.git
cd mcp-nfe-br
uv sync --all-extras
uv run pytest
uv run ruff check src/mcp_nfe_br tests audit
uv run mypy src/mcp_nfe_br

Other e-invoicing MCP servers

Country Server
🌍 Global mcp-einvoicing-core
🇧🇪 Belgium mcp-einvoicing-be
🇧🇷 Brazil mcp-nfe-br
🇫🇷 France mcp-facture-electronique-fr
🇩🇪 Germany mcp-einvoicing-de
🇮🇹 Italy mcp-fattura-elettronica-it
🇵🇱 Poland mcp-ksef-pl
🇪🇸 Spain mcp-facturacion-electronica-es

Licença

Este projeto está licenciado sob Apache 2.0 — veja LICENSE para detalhes.


Changelog

Veja RELEASE.md para o histórico completo de versões.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

mcp_nfe_br-0.5.2.tar.gz (250.8 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

mcp_nfe_br-0.5.2-py3-none-any.whl (170.2 kB view details)

Uploaded Python 3

File details

Details for the file mcp_nfe_br-0.5.2.tar.gz.

File metadata

  • Download URL: mcp_nfe_br-0.5.2.tar.gz
  • Upload date:
  • Size: 250.8 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for mcp_nfe_br-0.5.2.tar.gz
Algorithm Hash digest
SHA256 79651c1bffdb0b867359181d2ce6660ec4daacaf06aafdc2993f7c25f148b71c
MD5 c5327eff46115ff685e10d1d3f44a1b7
BLAKE2b-256 e9d40f9704fb1949f50f67c74ccf8cf46bcc710d2e0833dc08336116af281d65

See more details on using hashes here.

Provenance

The following attestation bundles were made for mcp_nfe_br-0.5.2.tar.gz:

Publisher: publish.yml on cmendezs/mcp-nfe-br

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file mcp_nfe_br-0.5.2-py3-none-any.whl.

File metadata

  • Download URL: mcp_nfe_br-0.5.2-py3-none-any.whl
  • Upload date:
  • Size: 170.2 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for mcp_nfe_br-0.5.2-py3-none-any.whl
Algorithm Hash digest
SHA256 e7365da528977623d448e03c80ff3109c993e7ec5342c8042012ab8292b63327
MD5 6ce31a157cbf3e2b1a61d05e521d9bea
BLAKE2b-256 62b13b8442648a9f53d6a54a7a254b59e035c47221a11fa35c8bc16c9f00bc61

See more details on using hashes here.

Provenance

The following attestation bundles were made for mcp_nfe_br-0.5.2-py3-none-any.whl:

Publisher: publish.yml on cmendezs/mcp-nfe-br

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page