mcp-el-salvador-dte
by Gerar12
README.md
# mcp-el-salvador-dte
A small, focused [Model Context Protocol (MCP)](https://modelcontextprotocol.io) server that exposes **El Salvador electronic invoicing (DTE) and fiscal helpers** as tools an LLM can call: IVA calculation, the official DTE document-type catalog, and DUI / NIT validation.
Built with the official [`@modelcontextprotocol/sdk`](https://www.npmjs.com/package/@modelcontextprotocol/sdk) for TypeScript, ESM, Node 18+, and the stdio transport.
- **Author:** Gerar Arévalo — [github.com/Gerar12](https://github.com/Gerar12) · [gcoder.dev](https://gcoder.dev)
- **License:** MIT
## What it is
The [Documento Tributario Electrónico (DTE)](https://www.mh.gob.sv/) is El Salvador's mandatory electronic invoicing standard, administered by the Ministerio de Hacienda. This server bundles a few pure, deterministic helpers that come up constantly when building DTE integrations, and makes them available to any MCP-capable client (Claude Desktop, Claude Code, etc.).
## Tools
| Tool | Input | Output |
| --- | --- | --- |
| `calculate_iva` | `{ amount: number, includesIva?: boolean }` | `{ subtotal, iva, total }` |
| `list_dte_types` | _(none)_ | `{ types: [{ code, name }] }` |
| `validate_dui` | `{ dui: string }` | `{ valid, reason? }` |
| `validate_nit` | `{ nit: string }` | `{ valid, normalized, reason? }` |
### `calculate_iva`
El Salvador IVA (VAT) is **13%**.
- `includesIva = false` (default): `amount` is the net subtotal; IVA is added on top.
- `includesIva = true`: `amount` already includes IVA; it is broken out.
Values are rounded to 2 decimals, and `subtotal + iva === total` always holds.
```jsonc
// input
{ "amount": 100 }
// output
{ "subtotal": 100, "iva": 13, "total": 113 }
```
```jsonc
// input
{ "amount": 113, "includesIva": true }
// output
{ "subtotal": 100, "iva": 13, "total": 113 }
```
### `list_dte_types`
Returns the 11 official DTE document types (code — name):
| Code | Name |
| --- | --- |
| 01 | Factura (Consumidor Final) |
| 03 | Comprobante de Crédito Fiscal (CCF) |
| 04 | Nota de Remisión |
| 05 | Nota de Crédito |
| 06 | Nota de Débito |
| 07 | Comprobante de Retención |
| 08 | Comprobante de Liquidación |
| 09 | Documento Contable de Liquidación |
| 11 | Factura de Exportación |
| 14 | Factura de Sujeto Excluido |
| 15 | Comprobante de Donación |
```jsonc
// output (abridged)
{ "types": [ { "code": "01", "name": "Factura (Consumidor Final)" }, ... ] }
```
### `validate_dui`
Validates a Salvadoran **DUI** (Documento Único de Identidad): 8 digits, a hyphen, then 1 check digit (e.g. `01234567-8`).
It checks the format **and** the modulo-10 check digit. The 8 base digits are weighted `9, 8, 7, 6, 5, 4, 3, 2` (left to right); the expected check digit is `(10 - (weightedSum % 10)) % 10`.
```jsonc
// input
{ "dui": "01234567-8" }
// output
{ "valid": true }
```
```jsonc
// input
{ "dui": "01234567-9" }
// output
{ "valid": false, "reason": "Invalid check digit: expected 8, got 9" }
```
> **Honesty note on the DUI check digit.** The modulo-10 algorithm above is a
> widely-used community algorithm and was verified in this repo against known-valid
> DUIs (`00016297-5`, `01234567-8`). It is **not** reproduced from an official,
> government-published specification. If your use case is high-stakes (e.g. legally
> rejecting a real person's ID), treat a `valid: false` from the check-digit test as
> "likely a typo, please re-check" rather than an authoritative rejection. The format
> check (`^\d{8}-\d$`) is unambiguous; the check-digit step is best-effort.
### `validate_nit`
Validates the **format only** of an El Salvador **NIT** (Número de Identificación Tributaria): 14 digits, commonly formatted `NNNN-NNNNNN-NNN-N`. Input is accepted with or without hyphens/whitespace, and a canonically hyphenated `normalized` value is returned.
```jsonc
// input
{ "nit": "06141234560012" }
// output
{ "valid": true, "normalized": "0614-123456-001-2" }
```
> **Honesty note on NIT.** This is **format/length validation only** — it does not
> verify a check digit. NIT check-digit rules are not consistently documented in
> public sources, so shipping a check-digit validator here would imply a correctness
> guarantee that cannot be honestly backed up. A `valid: true` means "well-formed",
> not "issued by Hacienda".
## Install
Requires Node.js 18+.
```bash
# clone, then:
npm install
npm run build
```
Run the tests (unit tests for the pure functions + an stdio smoke test that boots the server and performs a full MCP handshake):
```bash
npm test
```
Start the server manually (it speaks JSON-RPC over stdio and waits for a client):
```bash
npm start
# or
node build/index.js
```
### Run with npx (after publishing to npm)
```bash
npx mcp-el-salvador-dte
```
## Add to Claude Desktop
Edit your `claude_desktop_config.json`:
- macOS: `~/Library/Application Support/Claude/claude_desktop_config.json`
- Windows: `%APPDATA%\Claude\claude_desktop_config.json`
```jsonc
{
"mcpServers": {
"el-salvador-dte": {
"command": "node",
"args": ["/absolute/path/to/mcp-el-salvador-dte/build/index.js"]
}
}
}
```
Once published to npm you can instead use:
```jsonc
{
"mcpServers": {
"el-salvador-dte": {
"command": "npx",
"args": ["-y", "mcp-el-salvador-dte"]
}
}
}
```
Restart Claude Desktop, and the four tools will appear.
## Add to Claude Code
```bash
# local build
claude mcp add el-salvador-dte -- node /absolute/path/to/mcp-el-salvador-dte/build/index.js
# or, after publishing to npm
claude mcp add el-salvador-dte -- npx -y mcp-el-salvador-dte
```
## Project layout
```
src/lib.ts Pure, side-effect-free domain logic (unit-tested directly)
src/index.ts MCP server: registers the 4 tools over stdio
test/ node:test unit tests + stdio smoke test
```
## License
MIT © 2026 Gerar Arévalo
TDQS
A4.4/5.0
Scored across 4 tools
Disambiguation5/5
Each tool has a unique and clear purpose: IVA calculation, listing DTE types, and validation of DUI and NIT. There is no overlap or ambiguity.
Naming Consistency5/5
All tools follow a consistent verb_noun pattern using snake_case (calculate_iva, list_dte_types, validate_dui, validate_nit).
Tool Count5/5
With 4 tools, the server is well-scoped for its domain of Salvadoran tax and ID validation. Each tool serves a distinct need without being excessive.
Completeness3/5
The server provides essential validation and information tools but lacks the core DTE generation and submission functionality implied by its name. Missing create or process DTE tools is a notable gap.
Maintenance
ActivityInactive
ResponsivenessNo issues