Skip to main content
Glama
DojoCodingLabs

hacienda-cr MCP Server

hacienda-cr — コスタリカ電子請求書

コスタリカで電子請求書を発行するための最も完全なオープンソースツールキット。
財務省の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サーバー — AIアシスタント(Claudeなど)が請求書を発行できるようにするModel Context Protocolサーバー。

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サーバー(AIアシスタント向け)

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

Claudeにこう伝えることができます:"Mi Empresa S.A.(法人番号3101234567)からCliente S.R.L.(法人番号3109876543)への請求書を作成してください。コンサルティング2時間、各₡50,000、IVA 13%で。"


対応している領収書タイプ

コード

領収書タイプ

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

トークンのライフサイクル:

  • アクセストークンは約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サーバー — 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+(ネイティブの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

ビルド(ゼロ設定)

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. プルリクエストを開く

規約:

  • ファイル:kebab-case.ts

  • 型/クラス:PascalCase

  • 関数/変数:camelCase

  • 定数:UPPER_SNAKE_CASE


謝辞

このプロジェクトは、コスタリカのオープンソースコミュニティの先駆的な取り組みの上に構築されています:

  • CRLibre/API_Hacienda — コスタリカの電子請求書発行のためのオリジナルのオープンソースAPI(PHP)。そのドキュメント、フローチャート、コミュニティリソースは、Hacienda APIを理解する上で非常に貴重な参考資料でした。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