hacienda-cr MCP Server
hacienda-cr — Elektronische Rechnungsstellung Costa Rica
Das umfassendste Open-Source-Toolkit für elektronische Rechnungsstellung in Costa Rica.
SDK + CLI + MCP-Server zur Ausstellung elektronischer Belege gegen die API v4.4 des Ministeriums für Finanzen (Ministerio de Hacienda).
Warum hacienda-cr?
Elektronische Rechnungen in Costa Rica auszustellen, sollte kein Kopfschmerz sein. Zwischen OAuth2-Authentifizierung, XML-Erzeugung mit spezifischen Namespaces, digitaler Signatur XAdES-EPES, dem 50-stelligen numerischen Schlüssel und dem Abfragen des Status ... gibt es zu viel zufällige Komplexität.
hacienda-cr löst das alles in einem einzigen Toolkit:
SDK — TypeScript-Bibliothek mit strenger Typisierung: Auth, XML, digitale Signatur, IVA-Berechnung, Versand und Abfrage.
CLI — Befehlszeilentool
haciendazum Ausstellen, Signieren, Validieren und Abfragen über das Terminal.MCP Server — Server für das Model Context Protocol, damit KI-Assistenten (Claude usw.) Rechnungen für dich ausstellen können.
Funktioniert mit allen 7 Belegarten + Empfängernachricht. Kompatibel mit Sandbox und Produktion.
Related MCP server: mcp-sii
In 2 Minuten loslegen
Option 1: SDK (für Entwickler)
npm install @dojocoding/hacienda-sdkimport { HaciendaClient, DocumentType, Situation } from "@dojocoding/hacienda-sdk";
// 1. Crear el cliente
const client = new HaciendaClient({
environment: "sandbox",
credentials: {
idType: "02", // Cédula Jurídica
idNumber: "3101234567",
password: process.env.HACIENDA_PASSWORD!,
},
});
// 2. Autenticarse
await client.authenticate();
// 3. Generar la clave numérica
const clave = client.buildClave({
date: new Date(),
taxpayerId: "3101234567",
documentType: DocumentType.FACTURA_ELECTRONICA,
sequence: 1,
situation: Situation.NORMAL,
});
// 4. Construir XML, firmar y enviar (ver ejemplo completo abajo)Option 2: CLI (zum Rechnungen ausstellen über das Terminal)
npm install -g @dojocoding/hacienda-cli
# Autenticarse
hacienda auth login --cedula-type 02 --cedula 3101234567
# Crear borrador interactivo
hacienda draft --interactive
# Validar antes de enviar
hacienda validate factura.json
# Enviar (vista previa primero)
hacienda submit factura.json --dry-run
# Consultar contribuyente
hacienda lookup 3101234567Option 3: MCP Server (für KI-Assistenten)
npm install -g @dojocoding/hacienda-mcp
hacienda-mcpDu kannst Claude sagen: "Erstelle eine Rechnung von Mi Empresa S.A. (Cédula 3101234567) an Cliente S.R.L. (Cédula 3109876543) für 2 Stunden Beratung zu je ₡50.000 mit 13% IVA."
Unterstützte Belegarten
Code | Belegart | SDK-Builder |
| Elektronische Rechnung |
|
| Elektronische Belastungsanzeige |
|
| Elektronische Gutschrift |
|
| Elektronischer Bon |
|
| Elektronische Einkaufsrechnung |
|
| Elektronische Exportrechnung |
|
| Elektronischer Zahlungsbeleg |
|
— | Empfängernachricht (Annahme/Ablehnung) |
|
Inhaltsverzeichnis
SDK — Vollständige Dokumentation
HaciendaClient
Der wichtigste Einstiegspunkt. Orchestriert Authentifizierung, Schlüsselerzeugung und API-Operationen.
import { HaciendaClient } from "@dojocoding/hacienda-sdk";
const client = new HaciendaClient({
// Requerido
environment: "sandbox", // "sandbox" | "production"
credentials: {
idType: "02", // "01"=Física, "02"=Jurídica, "03"=DIMEX, "04"=NITE
idNumber: "3101234567", // Cédula de 9-12 dígitos
password: process.env.HACIENDA_PASSWORD!,
},
// Opcional
p12Path: "/ruta/al/certificado.p12", // Para firma digital
p12Pin: process.env.HACIENDA_P12_PIN, // PIN del .p12
fetchFn: customFetch, // Implementación fetch personalizada
});Die Optionen werden beim Instanziieren mit Zod validiert. Wenn etwas falsch ist, wird ValidationError mit klaren Details ausgelöst.
OAuth2-Authentifizierung
Hacienda verwendet OAuth2 ROPC (Resource Owner Password Credentials). Das SDK verwaltet den gesamten Lebenszyklus des Tokens automatisch.
// Autenticarse (obtiene access + refresh token)
await client.authenticate();
// Verificar estado
console.log(client.isAuthenticated); // true
// Obtener token válido (refresca automáticamente si expiró)
const token = await client.getAccessToken();
// Forzar re-autenticación
client.invalidate();
await client.authenticate();Lebenszyklus des Tokens:
Access-Token läuft in ~5 Minuten ab (wird im Speicher gecacht, 30 Sekunden vorher erneuert)
Refresh-Token hält ~10 Stunden
getAccessToken()übernimmt die Erneuerung transparent
Hacienda-Umgebungen:
Umgebung | Basis-URL der API | IDP Realm | Client ID |
|
|
|
|
|
|
|
|
Erstellung von Dokumenten
Vollständiges Beispiel einer Elektronischen Rechnung — der Ablauf ist für die anderen Belegarten gleich:
import {
buildFacturaXml,
calculateLineItemTotals,
calculateInvoiceSummary,
buildClave,
DocumentType,
Situation,
} from "@dojocoding/hacienda-sdk";
import type { LineItemInput } from "@dojocoding/hacienda-sdk";
// 1. Definir las líneas de detalle
const lineas: LineItemInput[] = [
{
numeroLinea: 1,
codigoCabys: "8310100000000", // Código CABYS (13 dígitos)
cantidad: 2,
unidadMedida: "Unid",
detalle: "Servicios de desarrollo web",
precioUnitario: 50000,
esServicio: true,
impuesto: [
{
codigo: "01", // IVA
codigoTarifaIVA: "08", // Tarifa general 13%
tarifa: 13,
},
],
},
{
numeroLinea: 2,
codigoCabys: "4321000000000",
cantidad: 1,
unidadMedida: "Unid",
detalle: "Laptop",
precioUnitario: 500000,
esServicio: false,
impuesto: [
{
codigo: "01",
codigoTarifaIVA: "08",
tarifa: 13,
},
],
descuento: [
{
montoDescuento: 25000,
codigoDescuento: "01",
naturalezaDescuento: "Descuento por volumen",
},
],
},
];
// 2. Calcular totales por línea (agrega montoTotal, subTotal, impuestoNeto, etc.)
const lineasCalculadas = lineas.map(calculateLineItemTotals);
// 3. Calcular resumen de factura (ResumenFactura)
const resumen = calculateInvoiceSummary(lineasCalculadas);
// 4. Generar la clave numérica
const clave = buildClave({
date: new Date(),
taxpayerId: "3101234567",
documentType: DocumentType.FACTURA_ELECTRONICA,
sequence: 1,
situation: Situation.NORMAL,
});
// 5. Consecutivo
const numeroConsecutivo = "00100001010000000001";
// 6. Armar la factura y generar XML
const factura = {
clave,
proveedorSistemas: "3101234567", // Cédula del proveedor de sistemas (v4.4)
codigoActividadEmisor: "620100",
numeroConsecutivo,
fechaEmision: new Date().toISOString(),
emisor: {
nombre: "Mi Empresa S.A.",
identificacion: { tipo: "02", numero: "3101234567" },
ubicacion: {
provincia: "1",
canton: "01",
distrito: "01",
otrasSenas: "100m norte del parque central",
},
correoElectronico: "facturacion@miempresa.co.cr",
},
receptor: {
nombre: "Cliente S.R.L.",
identificacion: { tipo: "02", numero: "3109876543" },
correoElectronico: "pagos@cliente.co.cr",
},
condicionVenta: "01", // Contado
detalleServicio: lineasCalculadas,
resumenFactura: {
...resumen,
// v4.4: los medios de pago van dentro del ResumenFactura, con monto
medioPago: [{ tipoMedioPago: "01", totalMedioPago: resumen.totalComprobante }],
},
};
const xml = buildFacturaXml(factura);XML-Validierung:
import { validateFacturaInput } from "@dojocoding/hacienda-sdk";
const resultado = validateFacturaInput(datosFactura);
if (!resultado.valid) {
for (const err of resultado.errors) {
console.error(`${err.path}: ${err.message}`);
}
}IVA-Berechnung
Hilfsfunktionen zur Berechnung von Steuern, Zeilensummen und Zusammenfassungen gemäß den Vorschriften von Hacienda. Alle Beträge werden auf 5 Dezimalstellen gerundet.
import { round5, calculateLineItemTotals, calculateInvoiceSummary } from "@dojocoding/hacienda-sdk";
import type { LineItemInput, CalculatedLineItem, InvoiceSummary } from "@dojocoding/hacienda-sdk";
const item: LineItemInput = {
numeroLinea: 1,
codigoCabys: "8310100000000",
cantidad: 3,
unidadMedida: "Sp",
detalle: "Horas de consultoría",
precioUnitario: 75000,
esServicio: true,
impuesto: [{ codigo: "01", codigoTarifaIVA: "08", tarifa: 13 }],
};
const calculado: CalculatedLineItem = calculateLineItemTotals(item);
// calculado.montoTotal = 225000 (3 × ₡75.000)
// calculado.subTotal = 225000 (sin descuentos)
// calculado.impuestoNeto = 29250 (₡225.000 × 13%)
// calculado.montoTotalLinea = 254250 (₡225.000 + ₡29.250)
const resumen: InvoiceSummary = calculateInvoiceSummary([calculado]);
// resumen.totalServGravados = 225000
// resumen.totalImpuesto = 29250
// resumen.totalComprobante = 254250IVA-Befreiungen:
const itemExonerado: LineItemInput = {
// ...campos base
impuesto: [
{
codigo: "01",
codigoTarifaIVA: "08",
tarifa: 13,
exoneracion: {
tipoDocumento: "01",
numeroDocumento: "AL-001-2025",
nombreInstitucion: "99", // código de institución (Nota v4.4)
fechaEmision: "2025-01-01T00:00:00",
tarifaExonerada: 13, // puntos de tarifa exonerados
},
},
],
};Unterstützte IVA-Sätze: 0%, 0.5%, 1%, 2%, 4%, 8%, 13% (Codes 01-11 der v4.4)
Numerischer Schlüssel
Jeder elektronische Beleg erfordert einen eindeutigen 50-stelligen numerischen Schlüssel. Das SDK generiert und parst ihn automatisch.
Struktur: [506][DDMMYY][Cédula 12 Stellen][Filiale 3][Terminal 5][Belegart 2][Fortlaufende Nummer 10][Situation 1][Sicherheitscode 8]
import { buildClave, parseClave, DocumentType, Situation } from "@dojocoding/hacienda-sdk";
// Generar clave
const clave = buildClave({
date: new Date("2025-07-15"),
taxpayerId: "3101234567",
documentType: DocumentType.FACTURA_ELECTRONICA,
sequence: 42,
situation: Situation.NORMAL,
branch: "001", // Opcional, default "001"
pos: "00001", // Opcional, default "00001"
});
// => "50615072500310123456700100001010000000042112345678"
// Parsear clave existente
const parsed = parseClave(clave);
// parsed.countryCode => "506"
// parsed.date => Date(2025-07-15)
// parsed.taxpayerId => "003101234567"
// parsed.documentType => "01"
// parsed.sequence => 42
// parsed.situation => "1"
// parsed.securityCode => "12345678"Situationscodes:
1Normal (Standard-Online-Versand)2Notfall (Ausfall des Hacienda-Systems)3Ohne Internet (offline)
Digitale Signatur XAdES-EPES
Jedes an Hacienda gesendete XML muss mit XAdES-EPES unter Verwendung des .p12-Zertifikats des Steuerpflichtigen (RSA 2048 + SHA-256) signiert sein. Das SDK übernimmt den gesamten Signaturprozess.
import { readFileSync } from "node:fs";
import { signXml, signAndEncode, loadP12 } from "@dojocoding/hacienda-sdk";
const p12Buffer = readFileSync("/ruta/al/certificado.p12");
const pin = process.env.HACIENDA_P12_PIN!;
// Firmar XML (retorna XML firmado como string)
const xmlFirmado = await signXml(xml, p12Buffer, pin);
// Firmar y codificar en Base64 (listo para enviar a la API)
const xmlBase64 = await signAndEncode(xml, p12Buffer, pin);
// Cargar .p12 para inspeccionar el certificado
const credenciales = await loadP12(p12Buffer, pin);
// credenciales.privateKey — CryptoKey para firma
// credenciales.certificateDer — Certificado codificado en DERVersand und Statusabfrage
Vereinfachte Option — submitAndWait (empfohlen):
Sendet das Dokument und wartet, bis Hacienda es verarbeitet. Übernimmt das Polling automatisch.
import { submitAndWait, HttpClient } from "@dojocoding/hacienda-sdk";
const httpClient = new HttpClient({
baseUrl: "https://api.comprobanteselectronicos.go.cr/recepcion-sandbox/v1",
getToken: () => client.getAccessToken(),
});
const resultado = await submitAndWait(
httpClient,
{
clave: "50601...",
fecha: new Date().toISOString(),
emisor: {
tipoIdentificacion: "02",
numeroIdentificacion: "3101234567",
},
comprobanteXml: xmlBase64Firmado,
},
{
pollIntervalMs: 3000, // Consultar cada 3 segundos (default)
timeoutMs: 60000, // Timeout a 60 segundos (default)
onPoll: (status, intento) => {
console.log(`Intento ${intento}: ${status.status}`);
},
},
);
if (resultado.accepted) {
console.log("¡Comprobante aceptado por Hacienda!");
} else {
console.log("Rechazado:", resultado.rejectionReason);
}Granulare Option — volle Kontrolle:
import { submitDocument, getStatus, isTerminalStatus } from "@dojocoding/hacienda-sdk";
// Enviar
const response = await submitDocument(httpClient, solicitud);
// Consultar estado
const status = await getStatus(httpClient, "50601...");
if (isTerminalStatus(status.status)) {
console.log("Estado final:", status.status);
}Belege auflisten und abfragen:
import { listComprobantes, getComprobante } from "@dojocoding/hacienda-sdk";
const lista = await listComprobantes(httpClient, {
offset: 0,
limit: 10,
fechaEmisionDesde: "2025-01-01",
fechaEmisionHasta: "2025-12-31",
});
const detalle = await getComprobante(httpClient, "50601...");Wiederholungen mit exponentiellem Backoff:
import { withRetry } from "@dojocoding/hacienda-sdk";
const resultado = await withRetry(() => submitDocument(httpClient, solicitud), {
maxAttempts: 3,
delayMs: 1000,
backoff: "exponential",
});Abfrage von Steuerpflichtigen
Suche Informationen zu jedem Steuerpflichtigen über die öffentliche API für wirtschaftliche Aktivitäten von Hacienda (keine Authentifizierung erforderlich):
import { lookupTaxpayer } from "@dojocoding/hacienda-sdk";
const info = await lookupTaxpayer("3101234567");
console.log(info.nombre); // "MI EMPRESA S.A."
console.log(info.tipoIdentificacion); // "02"
for (const actividad of info.actividades) {
console.log(`${actividad.codigo}: ${actividad.descripcion} (${actividad.estado})`);
}Konfigurationsverwaltung
Die Konfiguration wird in ~/.hacienda-cr/config.toml mit Unterstützung für mehrere Profile gespeichert (z. B. Sandbox, Produktion, verschiedene Unternehmen).
import {
loadConfig,
saveConfig,
listProfiles,
deleteProfile,
getNextSequence,
resetSequence,
} from "@dojocoding/hacienda-sdk";
// Guardar un perfil
await saveConfig(
{
environment: "sandbox",
cedula_type: "02",
cedula: "3101234567",
p12_path: "/ruta/al/certificado.p12",
},
"miempresa",
);
// Cargar un perfil
const config = await loadConfig("miempresa");
// Listar perfiles
const perfiles = await listProfiles();
// Eliminar un perfil
await deleteProfile("perfil-viejo");
// Gestión de consecutivos (numeración automática)
const consecutivo = await getNextSequence("02", "3101234567", "01", "001", "00001");
await resetSequence("02", "3101234567", "01", "001", "00001");Sicherheit: Passwörter und PINs werden niemals in Konfigurationsdateien gespeichert. Sie werden immer über Umgebungsvariablen übergeben:
HACIENDA_PASSWORD— Passwort des IDPHACIENDA_P12_PIN— PIN des .p12-Zertifikats
Strukturierte Protokollierung
Integrierter Logger mit konfigurierbaren Stufen und JSON-Unterstützung (ideal für die Produktion).
import { Logger, LogLevel, noopLogger } from "@dojocoding/hacienda-sdk";
const logger = new Logger({
level: LogLevel.DEBUG, // DEBUG, INFO, WARN, ERROR, SILENT
format: "text", // "text" | "json"
context: "mi-app",
});
logger.debug("Token refrescado", { expiresIn: 300 });
logger.info("Comprobante enviado", { clave: "50601..." });
logger.warn("Rate limit acercándose");
logger.error("Envío falló", { statusCode: 500 });
// Logger silencioso (suprime toda salida)
const silencioso = noopLogger;Fehlerbehandlung
Alle SDK-Fehler erweitern HaciendaError für eine einheitliche Behandlung:
import {
HaciendaError,
ValidationError,
ApiError,
AuthenticationError,
SigningError,
} from "@dojocoding/hacienda-sdk";
try {
await client.authenticate();
const xml = buildFacturaXml(factura);
const firmado = await signAndEncode(xml, p12, pin);
const resultado = await submitAndWait(httpClient, solicitud);
} catch (err) {
if (err instanceof ValidationError) {
// Fallo de validación (esquema Zod o reglas de negocio)
console.error("Validación:", err.message, err.details);
} else if (err instanceof AuthenticationError) {
// Fallo de autenticación o ciclo de vida del token
console.error("Auth:", err.message);
} else if (err instanceof SigningError) {
// Fallo de firma XAdES-EPES (certificado malo, PIN incorrecto, etc.)
console.error("Firma:", err.message);
} else if (err instanceof ApiError) {
// Error HTTP/red de la API de Hacienda
console.error("API:", err.message, err.statusCode, err.responseBody);
} else if (err instanceof HaciendaError) {
// Cualquier otro error del SDK
console.error(`[${err.code}]`, err.message);
}
}Fehlercodes (HaciendaErrorCode):
Code | Beschreibung |
| Zod-Validierung oder Geschäftsregeln fehlgeschlagen |
| Die REST-API von Hacienda gab einen Fehler zurück oder war nicht erreichbar |
| Authentifizierung oder Token-Lebenszyklus fehlgeschlagen |
| XAdES-EPES-Signaturvorgang fehlgeschlagen |
| Unerwarteter interner Fehler |
CLI — Befehlsreferenz
npm install -g @dojocoding/hacienda-cliAlle Befehle unterstützen --json für maschinenlesbare Ausgabe.
hacienda auth login
Mit dem IDP von Hacienda authentifizieren und das Profil speichern.
hacienda auth login \
--cedula-type 02 \
--cedula 3101234567 \
--environment sandbox \
--profile default
# Contraseña por variable de entorno (recomendado)
export HACIENDA_PASSWORD="tu-contraseña"
hacienda auth login --cedula-type 02 --cedula 3101234567Argument | Beschreibung |
|
|
| Identifikationsnummer |
| Passwort des IDP (oder |
|
|
| Name des Profils (Standard: |
hacienda auth status
Aktuellen Authentifizierungsstatus anzeigen.
hacienda auth status
hacienda auth status --profile produccion
hacienda auth status --jsonhacienda auth switch
Zwischen Authentifizierungsprofilen wechseln.
hacienda auth switch # Listar perfiles disponibles
hacienda auth switch produccion # Cambiar a un perfil específicohacienda submit
Einen elektronischen Beleg an Hacienda senden.
hacienda submit factura.json --dry-run # Vista previa del XML
hacienda submit factura.json # Enviar de verdad
hacienda submit factura.json --json # Salida JSONhacienda status
Den Verarbeitungsstatus eines Belegs anhand seines Schlüssels abfragen.
hacienda status 50601012400310123456700100001010000000001199999999hacienda list
Kürzliche Belege von Hacienda auflisten.
hacienda list
hacienda list --limit 50 --offset 0
hacienda list --jsonhacienda get
Vollständige Details eines Belegs anhand seines Schlüssels abrufen.
hacienda get 50601012400310123456700100001010000000001199999999hacienda sign
Ein XML-Dokument mit .p12-Zertifikat signieren (XAdES-EPES).
hacienda sign factura.xml --p12 cert.p12 --pin 1234 --output firmado.xml
hacienda sign factura.xml --p12 cert.p12 --pin 1234 # stdout
# Con variables de entorno
export HACIENDA_P12_PATH=/ruta/al/cert.p12
export HACIENDA_P12_PIN=1234
hacienda sign factura.xml --output firmado.xmlhacienda validate
Eine Rechnungsdatei (JSON oder XML) gegen Schemata und Geschäftsregeln validieren.
hacienda validate factura.json
hacienda validate documento.xml
hacienda validate factura.json --jsonhacienda lookup
Wirtschaftliche Aktivitäten eines Steuerpflichtigen anhand der Cédula abfragen (ohne Authentifizierung).
hacienda lookup 3101234567
hacienda lookup 3101234567 --jsonhacienda draft
Interaktiv einen Rechnungsentwurf im JSON-Format für den Versand erstellen.
hacienda draft # Modo interactivo
hacienda draft --no-interactive # Plantilla en blanco
hacienda draft --template nota-credito --output nc.jsonVorlagen: factura (Standard), nota-credito, nota-debito, tiquete
Umgebungsvariablen
Variable | Beschreibung |
| Passwort des IDP für die Authentifizierung |
| PIN der Zertifikatsdatei .p12 |
| Pfad zur Zertifikatsdatei .p12 |
MCP Server — KI-Integration
Das Paket @dojocoding/hacienda-mcp stellt das SDK als MCP-Server bereit (Model Context Protocol), sodass KI-Assistenten elektronische Rechnungen auf konversationelle Weise ausstellen können.
Konfiguration mit Claude Desktop
Füge dies zur claude_desktop_config.json hinzu:
{
"mcpServers": {
"hacienda-cr": {
"command": "npx",
"args": ["-y", "@dojocoding/hacienda-mcp"]
}
}
}Verfügbare Werkzeuge
Werkzeug | Beschreibung |
| Eine Elektronische Rechnung aus strukturierten Daten erstellen. Berechnet Steuern, generiert Schlüssel und baut XML. |
| Verarbeitungsstatus anhand des 50-stelligen numerischen Schlüssels abfragen. |
| Kürzliche elektronische Belege mit optionalen Filtern auflisten. |
| Vollständige Details eines Belegs anhand des Schlüssels abrufen. |
| Steuerpflichtigeninformationen anhand der Cédula abfragen. |
| Rechnungsentwurf mit Standardwerten generieren. |
Verfügbare Ressourcen
URI | Beschreibung |
| JSON-Schema für die Erstellung von Rechnungen |
| Belegarten, Codes und Beschreibungen |
| Steuercodes, MwSt-Sätze und Maßeinheiten |
| Identifikationstypen und Validierungsregeln |
Entwicklung
Voraussetzungen
Node.js 22+ (verwendet natives
fetchundcrypto.subtle)pnpm 9+
Erste Schritte
git clone https://github.com/DojoCodingLabs/hacienda-cr.git
cd hacienda-cr
pnpm install
pnpm build
pnpm test
pnpm lint
pnpm typecheckProjektstruktur
hacienda-cr/
├── packages/
│ ├── sdk/ # @dojocoding/hacienda-sdk — Core: auth, XML, firma, API
│ ├── cli/ # @dojocoding/hacienda-cli — Binario `hacienda` (citty)
│ └── mcp/ # @dojocoding/hacienda-mcp — Servidor MCP
├── shared/ # @dojocoding/hacienda-shared — Tipos, constantes, enums compartidos
├── turbo.json # Configuración de Turborepo
├── vitest.workspace.ts
└── pnpm-workspace.yamlEinzelne Pakete bauen
pnpm --filter @dojocoding/hacienda-sdk build
pnpm --filter @dojocoding/hacienda-sdk test
pnpm --filter @dojocoding/hacienda-sdk test clave.spec.tsTechnologie-Stack
Werkzeug | Zweck |
TypeScript (strict) | Sprache |
pnpm workspaces + Turborepo | Monorepo-Verwaltung |
tsup | Build (Zero-Config) |
Vitest | Tests (780+ Tests) |
ESLint + Prettier | Linting und Formatierung |
Zod | Runtime-Validierung + Typinferenz |
fast-xml-parser | XML-Erzeugung und -Parsing |
citty | CLI-Framework |
@modelcontextprotocol/sdk | MCP-Framework |
xadesjs / xmldsigjs | Digitale Signatur XAdES-EPES |
Beitragen
Forke das Repository
Erstelle einen Branch (
git checkout -b feature/mi-feature)Nimm deine Änderungen mit Tests vor
Führe
pnpm test && pnpm lint && pnpm typecheckausÖffne einen Pull Request
Konventionen:
Dateien:
kebab-case.tsTypen/Klassen:
PascalCaseFunktionen/Variablen:
camelCaseKonstanten:
UPPER_SNAKE_CASE
Danksagungen
Dieses Projekt baut auf der Pionierarbeit der costa-ricanischen Open-Source-Community auf:
CRLibre/API_Hacienda — Die ursprüngliche Open-Source-API für elektronische Rechnungsstellung in Costa Rica (PHP). Ihre Dokumentation, Flussdiagramme und Community-Ressourcen waren unschätzbare Referenzen zum Verständnis der Hacienda-API. Dank an die gesamte CRLibre-Community, die elektronische Rechnungsstellung für tico-Entwickler zugänglich gemacht hat.
CRLibre/fe-hacienda-cr-misc — Gemeinsame Ressourcen und Dokumentation für elektronische Rechnungsstellung in Costa Rica.
Lizenz
This server cannot be deployed
Maintenance
Related MCP Connectors
Costa Rica Hacienda v4.4: AI agents submit and query electronic invoices, stateless BYO.
Official Timbrix MCP server: stamp, cancel, and query Mexican CFDI 4.0 invoices from AI agents.
- ZapierOAuthcom.zapier
Hosted MCP server connecting AI assistants to 9,000+ apps and 40,000+ actions via Zapier.
MCP server unifying ERPs, CRMs, APIs and knowledge base for Claude, ChatGPT and Gemini.
Related MCP Servers
- FlicenseNot gradedqualityDmaintenanceAn MCP server that integrates with the FacturaScripts ERP system, providing resources and tools to manage clients, products, invoices, accounting entries, and business analytics through natural language.10-
- AlicenseAqualityBmaintenanceOpen-source MCP server for Chile's SII free invoicing system, enabling AI agents to query issued and received tax documents.124MIT
- AlicenseNot gradedqualityAmaintenanceMCP server enabling AI assistants to manage invoices, contacts, products, and other accounting data through the Bukku API.9MIT
- AlicenseNot gradedqualityCmaintenanceMCP server for SRI electronic invoicing in Ecuador, enabling AI agents to emit invoices, credit notes, retention documents, and more via natural language through the Cobra API.MIT