mcp-el-salvador-dte
Provides tools for El Salvador electronic invoicing (DTE), including IVA calculation, document-type catalog, and DUI/NIT validation.
README
mcp-el-salvador-dte
A small, focused Model Context Protocol (MCP) 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 for TypeScript, ESM, Node 18+, and the stdio transport.
- Author: Gerar Arévalo — github.com/Gerar12 · gcoder.dev
- License: MIT
What it is
The Documento Tributario Electrónico (DTE) 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):amountis the net subtotal; IVA is added on top.includesIva = true:amountalready includes IVA; it is broken out.
Values are rounded to 2 decimals, and subtotal + iva === total always holds.
// input
{ "amount": 100 }
// output
{ "subtotal": 100, "iva": 13, "total": 113 }
// 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 |
// 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.
// input
{ "dui": "01234567-8" }
// output
{ "valid": true }
// 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 avalid: falsefrom 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.
// 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: truemeans "well-formed", not "issued by Hacienda".
Install
Requires Node.js 18+.
# 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):
npm test
Start the server manually (it speaks JSON-RPC over stdio and waits for a client):
npm start
# or
node build/index.js
Run with npx (after publishing to npm)
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
{
"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:
{
"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
# 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
Recommended Servers
playwright-mcp
A Model Context Protocol server that enables LLMs to interact with web pages through structured accessibility snapshots without requiring vision models or screenshots.
Magic Component Platform (MCP)
An AI-powered tool that generates modern UI components from natural language descriptions, integrating with popular IDEs to streamline UI development workflow.
Audiense Insights MCP Server
Enables interaction with Audiense Insights accounts via the Model Context Protocol, facilitating the extraction and analysis of marketing insights and audience data including demographics, behavior, and influencer engagement.
VeyraX MCP
Single MCP tool to connect all your favorite tools: Gmail, Calendar and 40 more.
graphlit-mcp-server
The Model Context Protocol (MCP) Server enables integration between MCP clients and the Graphlit service. Ingest anything from Slack to Gmail to podcast feeds, in addition to web crawling, into a Graphlit project - and then retrieve relevant contents from the MCP client.
Kagi MCP Server
An MCP server that integrates Kagi search capabilities with Claude AI, enabling Claude to perform real-time web searches when answering questions that require up-to-date information.
E2B
Using MCP to run code via e2b.
Neon Database
MCP server for interacting with Neon Management API and databases
Exa Search
A Model Context Protocol (MCP) server lets AI assistants like Claude use the Exa AI Search API for web searches. This setup allows AI models to get real-time web information in a safe and controlled way.
Qdrant Server
This repository is an example of how to create a MCP server for Qdrant, a vector search engine.