Skip to main content
Glama
DojoCodingLabs

hacienda-cr MCP Server

hacienda-cr — Электронное выставление счетов Коста-Рика

Самый полный инструментарий с открытым исходным кодом для электронного выставления счетов в Коста-Рике.
SDK + CLI + MCP-сервер для выпуска электронных документов через API v4.4 Министерства финансов.

npm version CI License: MIT Node.js TypeScript


Почему hacienda-cr?

Выставление электронных счетов в Коста-Рике не должно быть головной болью. Между аутентификацией OAuth2, генерацией XML с определёнными пространствами имён, цифровой подписью XAdES-EPES, числовым ключом из 50 цифр и опросом статуса... слишком много случайной сложности.

hacienda-cr решает всё это в одном инструментарии:

  • SDK — библиотека TypeScript со строгой типизацией: аутентификация, XML, цифровая подпись, расчёт НДС, отправка и запрос.

  • CLI — инструмент командной строки hacienda для выпуска, подписания, проверки и запроса из терминала.

  • MCP Server — сервер Model Context Protocol, чтобы ИИ-ассистенты (Claude и др.) могли выставлять счета за вас.

Работает со всеми 7 типами документов + Сообщение получателя. Совместим с песочницей и продакшеном.


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 (для ИИ-ассистентов)

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

Вы можете сказать Клоду: "Создай счёт от Mi Empresa S.A. (ID 3101234567) для Cliente S.R.L. (ID 3109876543) за 2 часа консалтинга по ₡50 000 каждый с НДС 13%."


Поддерживаемые типы документов

Код

Тип документа

Builder из SDK

01

Электронный счёт-фактура

buildFacturaXml()

02

Электронный дебетовый авизо

buildNotaDebitoXml()

03

Электронный кредитовый авизо

buildNotaCreditoXml()

04

Электронный чек

buildTiqueteXml()

05

Электронный счёт-фактура на покупку

buildFacturaCompraXml()

06

Электронный экспортный счёт-фактура

buildFacturaExportacionXml()

07

Электронная квитанция об оплате

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

Жизненный цикл токена:

  • Access token истекает через ~5 минут (кэшируется в памяти, обновляется за 30 секунд до истечения)

  • Refresh token действует ~10 часов

  • getAccessToken() прозрачно обрабатывает обновление

Среды Hacienda:

Среда

Базовый URL 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

Создание документов

Полный пример электронного счёта-фактуры — поток одинаков для остальных типов:

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

Расчёт НДС

Утилиты для расчёта налогов, итогов по строкам и сводок в соответствии с нормативными требованиями 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

Освобождение от НДС:

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

Поддерживаемые ставки НДС: 0%, 0.5%, 1%, 2%, 4%, 8%, 13% (коды 01-11 из v4.4)

Числовой ключ

Каждый электронный документ требует уникальный числовой ключ из 50 цифр. SDK генерирует и разбирает его автоматически.

Структура: [506][ДДММГГ][ID 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

Каждый XML, отправляемый в Hacienda, должен быть подписан XAdES-EPES с использованием сертификата .p12 налогоплательщика (RSA 2048 + SHA-256). 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",
});

Запрос информации о налогоплательщиках

Ищите информацию о любом налогоплательщике через публичный API экономической деятельности Hacienda (не требует аутентификации):

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 — PIN-код сертификата .p12

Структурированное логирование

Встроенный логгер с настраиваемыми уровнями и поддержкой 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

REST API Hacienda вернул ошибку или был недоступен

AUTHENTICATION_FAILED

Не удалась аутентификация или жизненный цикл токена

SIGNING_FAILED

Не удалась операция подписания XAdES-EPES

INTERNAL_ERROR

Непредвиденная внутренняя ошибка


CLI — Справочник команд

npm install -g @dojocoding/hacienda-cli

Все команды поддерживают --json для машиночитаемого вывода.

hacienda auth login

Аутентификация через IDP Hacienda и сохранение профиля.

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

Подписать XML-документ сертификатом .p12 (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

Запросить экономическую деятельность налогоплательщика по ID (без аутентификации).

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

PIN-код файла сертификата .p12

HACIENDA_P12_PATH

Путь к файлу сертификата .p12


MCP Server — Интеграция с ИИ

Пакет @dojocoding/hacienda-mcp предоставляет SDK как MCP-сервер (Model Context Protocol), позволяя ИИ-ассистентам выставлять электронные счета в разговорном режиме.

Настройка с 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

Запросить информацию о налогоплательщике по ID.

draft_invoice

Сгенерировать черновик счёта со значениями по умолчанию.

Доступные ресурсы

URI

Описание

hacienda://schemas/factura

JSON-схема для создания счетов-фактур

hacienda://reference/document-types

Типы документов, коды и описания

hacienda://reference/tax-codes

Коды налогов, ставки НДС и единицы измерения

hacienda://reference/id-types

Типы идентификации и правила валидации


Разработка

Предварительные требования

  • Node.js 22+ (использует нативные fetch и crypto.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+ тестов)

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. Откройте pull request

Соглашения:

  • Файлы: kebab-case.ts

  • Типы/Классы: PascalCase

  • Функции/Переменные: camelCase

  • Константы: UPPER_SNAKE_CASE


Благодарности

Этот проект построен на новаторской работе коста-риканского open-source сообщества:

  • CRLibre/API_Hacienda — Оригинальный open-source API для электронного выставления счетов в Коста-Рике (PHP). Его документация, блок-схемы и ресурсы сообщества были бесценными справочными материалами для понимания API Hacienda. Спасибо всему сообществу CRLibre за то, что сделали электронное выставление счетов доступным для коста-риканских разработчиков.

  • CRLibre/fe-hacienda-cr-misc — Общие ресурсы и документация для электронного выставления счетов в Коста-Рике.


Лицензия

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