Skip to main content
Glama
DojoCodingLabs

hacienda-cr MCP Server

hacienda-cr — 코스타리카 전자 세금계산서

코스타리카 전자 세금계산서 발행을 위한 가장 완벽한 오픈소스 툴킷.
재무부(Hacienda) API v4.4에 전자 영수증을 발행하기 위한 SDK + CLI + MCP 서버.

npm version CI License: MIT Node.js TypeScript


왜 hacienda-cr인가?

코스타리카에서 전자 세금계산서를 발행하는 것은 골칫거리가 되어서는 안 됩니다. OAuth2 인증, 특정 네임스페이스가 있는 XML 생성, XAdES-EPES 디지털 서명, 50자리 숫자 키, 상태 폴링까지... 우발적 복잡성이 너무 많습니다.

hacienda-cr은 이 모든 것을 하나의 툴킷으로 해결합니다:

  • SDK — 엄격한 타입의 TypeScript 라이브러리: 인증, XML, 디지털 서명, IVA 계산, 전송 및 조회.

  • CLI — 터미널에서 발행, 서명, 검증, 조회를 위한 hacienda 명령줄 도구.

  • MCP Server — AI 어시스턴트(Claude 등)가 대신 세금계산서를 발행할 수 있게 해주는 Model Context Protocol 서버.

7가지 영수증 유형 + 수신자 메시지(Receptor Message)와 호환됩니다. 샌드박스 및 프로덕션 환경을 지원합니다.


Related MCP server: mcp-sii

2분 안에 시작하기

옵션 1: SDK (개발자용)

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)

옵션 2: CLI (터미널에서 세금계산서 발행)

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

옵션 3: MCP Server (AI 어시스턴트용)

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

Claude에게 이렇게 말할 수 있습니다: "Mi Empresa S.A.(법인번호 3101234567)가 Cliente S.R.L.(법인번호 3109876543)에게 시간당 ₡50,000, IVA 13%로 2시간 컨설팅 세금계산서를 생성해줘."


지원되는 영수증 유형

코드

영수증 유형

SDK 빌더

01

전자 세금계산서 (Factura Electrónica)

buildFacturaXml()

02

전자 차변 메모 (Nota de Débito Electrónica)

buildNotaDebitoXml()

03

전자 대변 메모 (Nota de Crédito Electrónica)

buildNotaCreditoXml()

04

전자 티켓 (Tiquete Electrónico)

buildTiqueteXml()

05

전자 구매 세금계산서 (Factura Electrónica de Compra)

buildFacturaCompraXml()

06

전자 수출 세금계산서 (Factura Electrónica de Exportación)

buildFacturaExportacionXml()

07

전자 지불 영수증 (Recibo Electrónico de Pago)

buildReciboPagoXml()

수신자 메시지 (수락/거부)

buildMensajeReceptorXml()


목차


SDK — 전체 문서

HaciendaClient

주요 진입점입니다. 인증, 키 생성, API 작업을 조율합니다.

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
});

옵션은 인스턴스화 시 Zod로 검증됩니다. 문제가 있으면 명확한 세부 정보와 함께 ValidationError가 발생합니다.

OAuth2 인증

Hacienda는 OAuth2 ROPC(Resource Owner Password Credentials)를 사용합니다. SDK가 토큰의 전체 수명 주기를 자동으로 관리합니다.

// 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();

토큰 수명 주기:

  • 액세스 토큰은 약 5분 후 만료됩니다(메모리에 캐시되고 30초 전에 갱신됨)

  • 리프레시 토큰은 약 10시간 동안 유효합니다

  • getAccessToken()은 갱신을 투명하게 처리합니다

Hacienda 환경:

환경

API 기본 URL

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

문서 생성

전자 세금계산서의 전체 예시 — 다른 유형도 동일한 흐름입니다:

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 검증:

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 계산

Hacienda 규정에 따라 세금, 라인별 합계, 요약을 계산하는 유틸리티입니다. 모든 금액은 소수점 5자리로 반올림됩니다.

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 면제:

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
      },
    },
  ],
};

지원되는 IVA 세율: 0%, 0.5%, 1%, 2%, 4%, 8%, 13% (v4.4의 코드 01-11)

숫자 키

각 전자 영수증에는 고유한 50자리 숫자 키가 필요합니다. SDK가 자동으로 생성하고 파싱합니다.

구조: [506][DDMMYY][법인번호 12자리][지점 3][터미널 5][문서 유형 2][일련번호 10][상황 1][보안 코드 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"

상황 코드:

  • 1 정상 (표준 온라인 전송)

  • 2 비상 (Hacienda 시스템 장애)

  • 3 오프라인 (인터넷 없음)

XAdES-EPES 디지털 서명

Hacienda에 전송되는 모든 XML은 납세자의 .p12 인증서(RSA 2048 + SHA-256)를 사용하여 XAdES-EPES로 서명되어야 합니다. SDK가 전체 서명 프로세스를 처리합니다.

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

전송 및 상태 조회

간소화된 옵션 — submitAndWait (권장):

문서를 전송하고 Hacienda가 처리할 때까지 기다립니다. 폴링을 자동으로 처리합니다.

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);
}

세부 옵션 — 완전한 제어:

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);
}

영수증 목록 및 조회:

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

지수 백오프 재시도:

import { withRetry } from "@dojocoding/hacienda-sdk";

const resultado = await withRetry(() => submitDocument(httpClient, solicitud), {
  maxAttempts: 3,
  delayMs: 1000,
  backoff: "exponential",
});

납세자 조회

Hacienda의 공개 경제활동 API를 사용하여 모든 납세자의 정보를 검색합니다(인증 불필요):

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})`);
}

설정 관리

설정은 ~/.hacienda-cr/config.toml에 저장되며 여러 프로필(예: 샌드박스, 프로덕션, 다른 회사)을 지원합니다.

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");

보안: 비밀번호와 PIN은 절대 설정 파일에 저장되지 않습니다. 항상 환경 변수로 전달됩니다:

  • HACIENDA_PASSWORD — IDP 비밀번호

  • HACIENDA_P12_PIN — .p12 인증서 PIN

구조화된 로깅

구성 가능한 수준과 JSON 지원(프로덕션에 이상적)이 있는 통합 로거입니다.

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;

오류 처리

SDK의 모든 오류는 일관된 처리를 위해 HaciendaError를 확장합니다:

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);
  }
}

오류 코드 (HaciendaErrorCode):

코드

설명

VALIDATION_FAILED

Zod 검증 또는 비즈니스 규칙 실패

API_ERROR

Hacienda REST API가 오류를 반환했거나 연결 불가

AUTHENTICATION_FAILED

인증 또는 토큰 수명 주기 실패

SIGNING_FAILED

XAdES-EPES 서명 작업 실패

INTERNAL_ERROR

예기치 않은 내부 오류


CLI — 명령어 참조

npm install -g @dojocoding/hacienda-cli

모든 명령은 기계가 읽을 수 있는 출력을 위해 --json을 지원합니다.

hacienda auth login

Hacienda IDP로 인증하고 프로필을 저장합니다.

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

인자

설명

--cedula-type

01 (개인), 02 (법인), 03 (DIMEX), 04 (NITE)

--cedula

신분증 번호

--password

IDP 비밀번호 (또는 HACIENDA_PASSWORD 사용)

--environment

sandbox (기본값) 또는 production

--profile

프로필 이름 (기본값: default)

hacienda auth status

현재 인증 상태를 표시합니다.

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

hacienda auth switch

인증 프로필 간 전환합니다.

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

hacienda submit

전자 영수증을 Hacienda에 전송합니다.

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

키로 영수증의 처리 상태를 조회합니다.

hacienda status 50601012400310123456700100001010000000001199999999

hacienda list

Hacienda에서 최근 영수증을 나열합니다.

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

hacienda get

키로 영수증의 전체 세부 정보를 가져옵니다.

hacienda get 50601012400310123456700100001010000000001199999999

hacienda sign

.p12 인증서로 XML 문서에 서명합니다 (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

세금계산서 파일(JSON 또는 XML)을 스키마 및 비즈니스 규칙에 대해 검증합니다.

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

hacienda lookup

법인번호로 납세자의 경제활동을 조회합니다 (인증 불필요).

hacienda lookup 3101234567
hacienda lookup 3101234567 --json

hacienda draft

전송을 위한 JSON 세금계산서 초안을 대화형으로 생성합니다.

hacienda draft                                       # Modo interactivo
hacienda draft --no-interactive                      # Plantilla en blanco
hacienda draft --template nota-credito --output nc.json

템플릿: factura (기본값), nota-credito, nota-debito, tiquete

환경 변수

변수

설명

HACIENDA_PASSWORD

인증을 위한 IDP 비밀번호

HACIENDA_P12_PIN

.p12 인증서 파일의 PIN

HACIENDA_P12_PATH

.p12 인증서 파일 경로


MCP Server — AI 통합

@dojocoding/hacienda-mcp 패키지는 SDK를 MCP 서버(Model Context Protocol)로 노출하여 AI 어시스턴트가 대화형으로 전자 세금계산서를 발행할 수 있게 합니다.

Claude Desktop 설정

claude_desktop_config.json에 다음을 추가하세요:

{
  "mcpServers": {
    "hacienda-cr": {
      "command": "npx",
      "args": ["-y", "@dojocoding/hacienda-mcp"]
    }
  }
}

사용 가능한 도구

도구

설명

create_invoice

구조화된 데이터에서 전자 세금계산서를 생성합니다. 세금을 계산하고 키를 생성하며 XML을 구성합니다.

check_status

50자리 숫자 키로 처리 상태를 조회합니다.

list_documents

선택적 필터로 최근 전자 영수증을 나열합니다.

get_document

키로 영수증의 전체 세부 정보를 가져옵니다.

lookup_taxpayer

법인번호로 납세자 정보를 조회합니다.

draft_invoice

기본값으로 세금계산서 초안을 생성합니다.

사용 가능한 리소스

URI

설명

hacienda://schemas/factura

송장 생성을 위한 JSON 스키마

hacienda://reference/document-types

증빙 유형, 코드 및 설명

hacienda://reference/tax-codes

세금 코드, IVA 세율 및 측정 단위

hacienda://reference/id-types

식별 유형 및 검증 규칙


개발

사전 요구 사항

  • Node.js 22+ (네이티브 fetchcrypto.subtle 사용)

  • pnpm 9+

시작하기

git clone https://github.com/DojoCodingLabs/hacienda-cr.git
cd hacienda-cr
pnpm install
pnpm build
pnpm test
pnpm lint
pnpm typecheck

프로젝트 구조

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

개별 패키지 빌드

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

기술 스택

도구

용도

TypeScript (strict)

언어

pnpm workspaces + Turborepo

모노레포 관리

tsup

빌드 (zero-config)

Vitest

테스팅 (780+ tests)

ESLint + Prettier

린트 및 포맷

Zod

런타임 검증 + 타입 추론

fast-xml-parser

XML 생성 및 파싱

citty

CLI 프레임워크

@modelcontextprotocol/sdk

MCP 프레임워크

xadesjs / xmldsigjs

XAdES-EPES 디지털 서명

기여하기

  1. 저장소를 포크하세요

  2. 브랜치를 생성하세요 (git checkout -b feature/mi-feature)

  3. 테스트와 함께 변경 사항을 작성하세요

  4. pnpm test && pnpm lint && pnpm typecheck를 실행하세요

  5. 풀 리퀘스트를 여세요

규칙:

  • 파일: kebab-case.ts

  • 타입/클래스: PascalCase

  • 함수/변수: camelCase

  • 상수: UPPER_SNAKE_CASE


감사의 말

이 프로젝트는 코스타리카 오픈소스 커뮤니티의 선구적인 작업 위에 구축되었습니다:

  • CRLibre/API_Hacienda — 코스타리카 전자 송장 발행을 위한 원본 오픈소스 API (PHP). 해당 문서, 흐름도 및 커뮤니티 리소스는 Hacienda API를 이해하는 데 귀중한 참고 자료였습니다. CRLibre 커뮤니티 전체가 코스타리카 개발자들에게 전자 송장 발행을 접근 가능하게 만들어 주신 것에 감사드립니다.

  • CRLibre/fe-hacienda-cr-misc — 코스타리카 전자 송장 발행을 위한 공유 리소스 및 문서.


라이선스

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