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


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.

Maintenance

ActivityMaintained
ResponsivenessNo issues

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

Related MCP Servers

  • F
    license
    Not graded
    quality
    F
    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
    1
    MIT
  • A
    license
    Not graded
    quality
    A
    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

Latest Blog Posts

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