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


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