Skip to main content

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

Project description

mcp-nfe-br ๐Ÿ‡ง๐Ÿ‡ท

English | Portugues (Brasil)

PyPI version Python License


Introduction

mcp-nfe-br is an MCP (Model Context Protocol) server providing tools for issuing and validating Brazilian electronic fiscal documents: NF-e (modelo 55), NFC-e (modelo 65), NFS-e Nacional (ADN), and CT-e (modelo 57). This server is part of the mcp-einvoicing-* / mcp-*-* family, built on mcp-einvoicing-core, which provides the base data model, HTTP/OAuth2 utilities, and shared MCP server infrastructure.

Current status (v0.6.1): NF-e/NFC-e (modelo 55/65, schema 4.00) and NFS-e Nacional (ADN, schema v1.01) generation, ICP-Brasil signing, XSD validation, and gated SEFAZ/ADN submission are implemented. CT-e (modelo 57) generation/signing/validation and SEFAZ event submission (cancelamento, Carta de Correรงรฃo) were added starting v0.6.0 โ€” v1 scope is intentionally narrow: modal rodoviรกrio only, ICMS CST 00 only, and no bundled/verified CT-e webservice endpoint table (every SEFAZ CT-e call requires an explicit endpoint_override). See the "CT-e (modelo 57)" tools section below and context-library/countries/br.md (in the source repo) for the full field-level reference.


Installation

Requirements

Using uv (recommended)

uv add mcp-nfe-br

Using pip

pip install mcp-nfe-br

From source

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

Configuration

Add the server to your MCP client configuration. For Claude Desktop, edit claude_desktop_config.json:

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

For a local development installation:

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

Environment variables

Variable Description Default
BR_READ_ONLY Set to 1 to disable SEFAZ write tools (br__submit_nfe, br__distribute_dfe, br__submit_nfse, br__cancel_nfse). Safe mode for exploration. The SEFAZ environment (production/homologation) is selected per call via the tp_amb argument. โ€”
BR_CTE_READ_ONLY Set to 1 to disable the CT-e write tools (br__submit_cte, br__cancel_cte, br__correct_cte). Kept distinct from BR_READ_ONLY so NF-e and CT-e can be gated independently. โ€”
LOG_LEVEL Log level: DEBUG, INFO, WARNING, ERROR INFO

Available tools

br__validate_cpf

Validates a CPF (Cadastro de Pessoas Fรญsicas), the individual taxpayer identification number, using the Receita Federal modulo 11 algorithm.

Parameter Type Required Description
cpf string yes CPF with or without ./- separators

Returns a TaxIdValidationResult with valid=True and the cleaned value (11 digits) on success, or valid=False with an error message in Portuguese.


br__validate_cnpj

Validates a CNPJ (Cadastro Nacional da Pessoa Jurรญdica), the business taxpayer identification number. Accepts both the traditional numeric format (14 digits) and the alphanumeric format introduced by NT 2026.004 (PL_010d), effective in homologation from 2026-06-01 and in production from 2026-07-01.

Parameter Type Required Description
cnpj string yes CNPJ with or without .///- separators

Returns a TaxIdValidationResult with valid=True and the cleaned value (14 characters) on success, or valid=False with an error message in Portuguese.

โš ๏ธ [Unverified]: the check-digit algorithm for the alphanumeric CNPJ format was implemented based on secondary sources, as the primary source ("NT Conjunta DFe 2025.001") is not yet available locally. See context-library/countries/br.md for details.


br__generate_nfe

Generates an unsigned NF-e/NFC-e 4.00 document (<NFe><infNFe>โ€ฆ</infNFe></NFe>) from a BRInvoice object.

Parameter Type Required Description
invoice object yes BRInvoice document (modelo 55 or 65, groups ide/emit/dest/det/total/transp/pag)

Returns {"xml": ..., "chave_acesso": ..., "warnings": [...]}. The warnings in Portuguese remind that the document is not signed (ICP-Brasil) and was not transmitted to SEFAZ. Both steps are the responsibility of a separate process.

Phase 1 coverage for per-item tax groups:

Tax Supported codes Behavior
ICMS CST 00 (normal regime) or CSOSN 102 (Simples Nacional) other codes raise DocumentGenerationError
PIS/COFINS CST 01/02 (rate-based) or 04-09 (non-taxed) group omitted if pis_cst/cofins_cst are None
IPI CST 00/49/50/99 (taxed) or other (non-taxed) group omitted if ipi_cst is None

[NEED: IBS/CBS/Imposto Seletivo โ€” Grupo UB/W03 (NT 2025.002-RTC) not yet modeled, see context-library/countries/br.md "Known gaps"].


br__validate_nfe_xml

Validates an NF-e/NFC-e 4.00 XML document against the official PL_010d XSD (local "unsigned" variant, see note below).

Parameter Type Required Description
xml_content string no* XML as a string
xml_base64 string no* Base64-encoded XML

* Exactly one of xml_content/xml_base64 must be provided.

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

[Inference]: the official XSD (nfe_v4.00.xsd/leiauteNFe_v4.00.xsd, PL_010d) requires <ds:Signature> as a mandatory child of <NFe>. Since Phase 1 generates unsigned documents, this tool validates against a local derived copy (nfe_v4.00_unsigned.xsd) where <ds:Signature> has been made optional (minOccurs="0"). Validation of signed documents (future phase) should use the official XSD without modifications.


br__build_access_key

Builds an access key (chNFe, 44 characters) with a modulo 11 check digit, from the components cUF, dhEmi, issuer CNPJ, model, series, and document number.

Parameter Type Required Description
c_uf string yes IBGE state code (2 digits)
dh_emi string yes Issue date/time (ISO 8601)
cnpj string yes Issuer CNPJ (numeric or alphanumeric PL_010d)
modelo string yes 55 (NF-e) or 65 (NFC-e)
serie string yes Document series
nnf string yes Document number
tp_emis string no Issuance type (default "1")
c_nf string no Random numeric code (cNF, 8 digits); auto-generated if omitted

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


CT-e (modelo 57) tools

CT-e (Conhecimento de Transporte Eletrรดnico) coverage started at v0.6.0. v1 scope is intentionally narrow: modal rodoviรกrio only (other modais raise an error), ICMS CST 00 (tributaรงรฃo normal) only, and no bundled/verified SEFAZ CT-e endpoint table โ€” every SEFAZ call below requires an explicit endpoint_override.

br__generate_cte

Generates an unsigned CT-e 4.00 document (<CTe><infCte>โ€ฆ</infCte></CTe>) from a BRCTeDocument object.

Parameter Type Required Description
cte object yes BRCTeDocument (modelo 57, modal rodoviรกrio, ICMS CST 00)

Returns {"xml": ..., "chave_acesso": ..., "warnings": [...]}.

br__validate_cte_xml

Validates a CT-e 4.00 XML document against the bundled PL_CTe_400 XSD (auto-selects the unsigned or official signed schema based on <ds:Signature> presence).

Parameter Type Required Description
xml_content string no* XML as a string
xml_base64 string no* Base64-encoded XML

* Exactly one of xml_content/xml_base64 must be provided.

br__consult_cte_sefaz_status

Checks SEFAZ CT-e webservice availability (CTeStatusServicoV4). Read-only, no confirmation required.

br__consult_cte

Queries a CT-e's status by access key (CTeConsultaV4). Read-only, no confirmation required โ€” it queries one already-known document, not a bulk data pull.

br__submit_cte

Submits a signed CT-e to SEFAZ authorization (CTeRecepcaoSincV4, synchronous). The payload is automatically GZip-compressed and Base64-encoded before transmission, per the CT-e MOC. Gated with a two-step confirmation (ConfirmationGate) and BR_CTE_READ_ONLY.

br__cancel_cte

Requests cancellation of an authorized CT-e (event 110111, CTeRecepcaoEventoV4). cStat=135 indicates the cancellation was homologated. Gated.

br__correct_cte

Issues a Carta de Correรงรฃo Eletrรดnica (event 110110, CTeRecepcaoEventoV4). Per Art. 58-B of CONVรŠNIO/SINIEF 06/89, a CC-e cannot alter tax values, party registration data, or the issue/departure date. Gated.

Not yet implemented: br__distribute_cte_dfe (CTeDistribuicaoDFe) โ€” the bundled specification confirms the request payload shape but not the webservice's method name, WSDL namespace, or message-wrapper element.


Architecture

mcp-nfe-br/
โ”œโ”€โ”€ src/
โ”‚   โ””โ”€โ”€ mcp_nfe_br/
โ”‚       โ”œโ”€โ”€ __init__.py
โ”‚       โ”œโ”€โ”€ server.py              # MCP entry point and tool registration
โ”‚       โ”œโ”€โ”€ models/
โ”‚       โ”‚   โ”œโ”€โ”€ __init__.py
โ”‚       โ”‚   โ””โ”€โ”€ invoice.py         # BRInvoice, BRInvoiceLine, NFeModelo, TipoOperacao
โ”‚       โ”œโ”€โ”€ standards/
โ”‚       โ”‚   โ”œโ”€โ”€ __init__.py
โ”‚       โ”‚   โ””โ”€โ”€ nfe_generator.py   # NFeGenerator โ€” generates unsigned NF-e/NFC-e 4.00
โ”‚       โ”œโ”€โ”€ validators/
โ”‚       โ”‚   โ”œโ”€โ”€ __init__.py
โ”‚       โ”‚   โ””โ”€โ”€ nfe_xsd.py         # NFeXSDValidator โ€” validates against PL_010d XSD (unsigned variant)
โ”‚       โ”œโ”€โ”€ schemas/nfe/           # Bundled XSDs (official + "_unsigned" variants)
โ”‚       โ”œโ”€โ”€ 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/                     # Normative material (XSDs, MOC, Technical Notes, not published)
โ”œโ”€โ”€ audit/
โ”‚   โ”œโ”€โ”€ audit_vs_core.py
โ”‚   โ””โ”€โ”€ report.json
โ”œโ”€โ”€ .github/workflows/publish.yml
โ”œโ”€โ”€ pyproject.toml
โ”œโ”€โ”€ RELEASE.md
โ””โ”€โ”€ LICENSE

Relationship with mcp-einvoicing-core

mcp-einvoicing-core provides:

  • Base Pydantic models for invoices, parties, line items, and validation results (InvoiceDocument, InvoiceLineItem, TaxIdValidationResult)
  • Shared MCP server infrastructure (EInvoicingMCPServer)
  • HTTP/OAuth2 client, token cache, structured logging, exception hierarchy

mcp-nfe-br adds Brazil-specific logic:

  • BRInvoice (extends InvoiceDocument, as NF-e/NFC-e has no EN 16931 lineage)
  • Group I fields (NCM, CFOP, ICMS/IPI/PIS/COFINS) in BRInvoiceLine
  • CPF/CNPJ validation (including the alphanumeric CNPJ from NT 2026.004)

Contributing

Contributions are welcome. Please open an issue to discuss significant changes before submitting a 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

License

This project is licensed under Apache 2.0. See LICENSE for details.


Changelog

See RELEASE.md for the full version history.

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.6.2.tar.gz (504.4 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.6.2-py3-none-any.whl (303.8 kB view details)

Uploaded Python 3

File details

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

File metadata

  • Download URL: mcp_nfe_br-0.6.2.tar.gz
  • Upload date:
  • Size: 504.4 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.6.2.tar.gz
Algorithm Hash digest
SHA256 9d6bf1014dc41a725a331b7817c892d544eb38075e1bec6ec8f2cdf1af31b7a3
MD5 56dd18937f2a2e65ef9ccdb940afed4c
BLAKE2b-256 c3b6f0b97d0557dd83be2091e08b4357c1369d8e5597db01ab93b248ceedb923

See more details on using hashes here.

Provenance

The following attestation bundles were made for mcp_nfe_br-0.6.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.6.2-py3-none-any.whl.

File metadata

  • Download URL: mcp_nfe_br-0.6.2-py3-none-any.whl
  • Upload date:
  • Size: 303.8 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.6.2-py3-none-any.whl
Algorithm Hash digest
SHA256 4b11dc6e053cec16153c9865d260f9cbfde94835b8e7cba8019a271b36a8808e
MD5 73fd88a648486e48de104147fede1520
BLAKE2b-256 d25958ffb5865f6c9eeea168c60865d60c028b540ed355078c5341be152fe097

See more details on using hashes here.

Provenance

The following attestation bundles were made for mcp_nfe_br-0.6.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