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
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections. Dates show when Glama detected each change.
No tool schema history has been recorded yet.
This server cannot be installed
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Connectors
Costa Rica Hacienda v4.4: AI agents submit and query electronic invoices, stateless BYO.
- 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.
Mexico CFDI 4.0 invoices for AI agents - issue, query, cancel facturas via Facturapi.
Related MCP Servers
- FlicenseNot gradedqualityFmaintenanceAn 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.121MIT
- AlicenseNot gradedqualityDmaintenanceMCP server enabling AI assistants to manage invoices, contacts, products, and other accounting data through the Bukku API.6MIT
- AlicenseNot gradedqualityAmaintenanceMCP 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
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/DojoCodingLabs/hacienda-cr'
If you have feedback or need assistance with the MCP directory API, please join our Discord server