Skip to main content
Glama
DojoCodingLabs

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).

npm version CI License: MIT Node.js TypeScript


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 hacienda zum 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-sdk
import { 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 3101234567

Option 3: MCP Server (für KI-Assistenten)

npm install -g @dojocoding/hacienda-mcp
hacienda-mcp

Du 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

01

Elektronische Rechnung

buildFacturaXml()

02

Elektronische Belastungsanzeige

buildNotaDebitoXml()

03

Elektronische Gutschrift

buildNotaCreditoXml()

04

Elektronischer Bon

buildTiqueteXml()

05

Elektronische Einkaufsrechnung

buildFacturaCompraXml()

06

Elektronische Exportrechnung

buildFacturaExportacionXml()

07

Elektronischer Zahlungsbeleg

buildReciboPagoXml()

—

Empfängernachricht (Annahme/Ablehnung)

buildMensajeReceptorXml()


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

sandbox

api.comprobanteselectronicos.go.cr/recepcion-sandbox/v1/

rut-stag

api-stag

production

api.comprobanteselectronicos.go.cr/recepcion/v1/

rut

api-prod

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   = 254250

IVA-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:

  • 1 Normal (Standard-Online-Versand)

  • 2 Notfall (Ausfall des Hacienda-Systems)

  • 3 Ohne 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 DER

Versand 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 IDP

  • HACIENDA_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

VALIDATION_FAILED

Zod-Validierung oder Geschäftsregeln fehlgeschlagen

API_ERROR

Die REST-API von Hacienda gab einen Fehler zurück oder war nicht erreichbar

AUTHENTICATION_FAILED

Authentifizierung oder Token-Lebenszyklus fehlgeschlagen

SIGNING_FAILED

XAdES-EPES-Signaturvorgang fehlgeschlagen

INTERNAL_ERROR

Unerwarteter interner Fehler


CLI — Befehlsreferenz

npm install -g @dojocoding/hacienda-cli

Alle 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 3101234567

Argument

Beschreibung

--cedula-type

01 (Physisch), 02 (Juristisch), 03 (DIMEX), 04 (NITE)

--cedula

Identifikationsnummer

--password

Passwort des IDP (oder HACIENDA_PASSWORD verwenden)

--environment

sandbox (Standard) oder production

--profile

Name des Profils (Standard: default)

hacienda auth status

Aktuellen Authentifizierungsstatus anzeigen.

hacienda auth status
hacienda auth status --profile produccion
hacienda auth status --json

hacienda auth switch

Zwischen Authentifizierungsprofilen wechseln.

hacienda auth switch            # Listar perfiles disponibles
hacienda auth switch produccion # Cambiar a un perfil específico

hacienda 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 JSON

hacienda status

Den Verarbeitungsstatus eines Belegs anhand seines Schlüssels abfragen.

hacienda status 50601012400310123456700100001010000000001199999999

hacienda list

Kürzliche Belege von Hacienda auflisten.

hacienda list
hacienda list --limit 50 --offset 0
hacienda list --json

hacienda get

Vollständige Details eines Belegs anhand seines Schlüssels abrufen.

hacienda get 50601012400310123456700100001010000000001199999999

hacienda 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.xml

hacienda validate

Eine Rechnungsdatei (JSON oder XML) gegen Schemata und Geschäftsregeln validieren.

hacienda validate factura.json
hacienda validate documento.xml
hacienda validate factura.json --json

hacienda lookup

Wirtschaftliche Aktivitäten eines Steuerpflichtigen anhand der Cédula abfragen (ohne Authentifizierung).

hacienda lookup 3101234567
hacienda lookup 3101234567 --json

hacienda 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.json

Vorlagen: factura (Standard), nota-credito, nota-debito, tiquete

Umgebungsvariablen

Variable

Beschreibung

HACIENDA_PASSWORD

Passwort des IDP für die Authentifizierung

HACIENDA_P12_PIN

PIN der Zertifikatsdatei .p12

HACIENDA_P12_PATH

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

create_invoice

Eine Elektronische Rechnung aus strukturierten Daten erstellen. Berechnet Steuern, generiert Schlüssel und baut XML.

check_status

Verarbeitungsstatus anhand des 50-stelligen numerischen Schlüssels abfragen.

list_documents

Kürzliche elektronische Belege mit optionalen Filtern auflisten.

get_document

Vollständige Details eines Belegs anhand des Schlüssels abrufen.

lookup_taxpayer

Steuerpflichtigeninformationen anhand der Cédula abfragen.

draft_invoice

Rechnungsentwurf mit Standardwerten generieren.

Verfügbare Ressourcen

URI

Beschreibung

hacienda://schemas/factura

JSON-Schema für die Erstellung von Rechnungen

hacienda://reference/document-types

Belegarten, Codes und Beschreibungen

hacienda://reference/tax-codes

Steuercodes, MwSt-Sätze und Maßeinheiten

hacienda://reference/id-types

Identifikationstypen und Validierungsregeln


Entwicklung

Voraussetzungen

  • Node.js 22+ (verwendet natives fetch und crypto.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 typecheck

Projektstruktur

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.yaml

Einzelne Pakete bauen

pnpm --filter @dojocoding/hacienda-sdk build
pnpm --filter @dojocoding/hacienda-sdk test
pnpm --filter @dojocoding/hacienda-sdk test clave.spec.ts

Technologie-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

  1. Forke das Repository

  2. Erstelle einen Branch (git checkout -b feature/mi-feature)

  3. Nimm deine Änderungen mit Tests vor

  4. Führe pnpm test && pnpm lint && pnpm typecheck aus

  5. Öffne einen Pull Request

Konventionen:

  • Dateien: kebab-case.ts

  • Typen/Klassen: PascalCase

  • Funktionen/Variablen: camelCase

  • Konstanten: 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

MIT


Related MCP Connectors

Related MCP Servers

  • F
    license
    Not graded
    quality
    D
    maintenance
    An 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
    -
  • A
    license
    A
    quality
    B
    maintenance
    Open-source MCP server for Chile's SII free invoicing system, enabling AI agents to query issued and received tax documents.
    12
    4
    MIT
  • A
    license
    Not graded
    quality
    C
    maintenance
    MCP 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