Skip to main content
Glama
DojoCodingLabs

hacienda-cr MCP Server

hacienda-cr — Costa Rica Electronic Invoicing

The most complete open-source toolkit for electronic invoicing in Costa Rica.
SDK + CLI + MCP Server to issue electronic receipts against the Ministry of Finance's v4.4 API.

npm version CI License: MIT Node.js TypeScript


Why hacienda-cr?

Issuing electronic invoices in Costa Rica shouldn't be a headache. Between OAuth2 authentication, XML generation with specific namespaces, XAdES-EPES digital signature, the 50-digit numeric key, and status polling... there's too much accidental complexity.

hacienda-cr solves all of that in a single toolkit:

  • SDK — TypeScript library with strict typing: auth, XML, digital signature, VAT calculation, submission and query.

  • CLIhacienda command-line tool to issue, sign, validate, and query from the terminal.

  • MCP Server — Model Context Protocol server so AI assistants (Claude, etc.) can issue invoices for you.

Works with all 7 receipt types + Receptor Message. Compatible with sandbox and production.


Related MCP server: mcp-sii

Get started in 2 minutes

Option 1: SDK (for developers)

npm install @dojocoding/hacienda-sdk
import { HaciendaClient, DocumentType, Situation } from "@dojocoding/hacienda-sdk";

// 1. Crear el cliente
const client = new HaciendaClient({
  environment: "sandbox",
  credentials: {
    idType: "02", // Cédula Jurídica
    idNumber: "3101234567",
    password: process.env.HACIENDA_PASSWORD!,
  },
});

// 2. Autenticarse
await client.authenticate();

// 3. Generar la clave numérica
const clave = client.buildClave({
  date: new Date(),
  taxpayerId: "3101234567",
  documentType: DocumentType.FACTURA_ELECTRONICA,
  sequence: 1,
  situation: Situation.NORMAL,
});

// 4. Construir XML, firmar y enviar (ver ejemplo completo abajo)

Option 2: CLI (to invoice from the terminal)

npm install -g @dojocoding/hacienda-cli

# Autenticarse
hacienda auth login --cedula-type 02 --cedula 3101234567

# Crear borrador interactivo
hacienda draft --interactive

# Validar antes de enviar
hacienda validate factura.json

# Enviar (vista previa primero)
hacienda submit factura.json --dry-run

# Consultar contribuyente
hacienda lookup 3101234567

Option 3: MCP Server (for AI assistants)

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

You can tell Claude: "Create an invoice from Mi Empresa S.A. (ID 3101234567) to Cliente S.R.L. (ID 3109876543) for 2 hours of consulting at ₡50,000 each with 13% VAT."


Supported receipt types

Code

Receipt type

SDK Builder

01

Electronic Invoice

buildFacturaXml()

02

Electronic Debit Note

buildNotaDebitoXml()

03

Electronic Credit Note

buildNotaCreditoXml()

04

Electronic Ticket

buildTiqueteXml()

05

Electronic Purchase Invoice

buildFacturaCompraXml()

06

Electronic Export Invoice

buildFacturaExportacionXml()

07

Electronic Payment Receipt

buildReciboPagoXml()

Receptor Message (acceptance/rejection)

buildMensajeReceptorXml()


Table of contents


SDK — Complete documentation

HaciendaClient

The main entry point. Orchestrates authentication, key generation, and API operations.

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

Options are validated at instantiation with Zod. If something is wrong, it throws ValidationError with clear details.

OAuth2 Authentication

Hacienda uses OAuth2 ROPC (Resource Owner Password Credentials). The SDK handles the entire token lifecycle automatically.

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

Token lifecycle:

  • Access token expires in ~5 minutes (cached in memory, refreshed 30s before)

  • Refresh token lasts ~10 hours

  • getAccessToken() handles the refresh transparently

Hacienda environments:

Environment

API base 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

Document creation

Complete example of an Electronic Invoice — the flow is the same for the other types:

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 validation:

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

VAT calculation

Utilities to calculate taxes, line totals, and summaries according to Hacienda regulations. All amounts are rounded to 5 decimal places.

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

VAT exemptions:

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

Supported VAT rates: 0%, 0.5%, 1%, 2%, 4%, 8%, 13% (codes 01-11 of v4.4)

Numeric key

Each electronic receipt requires a unique 50-digit numeric key. The SDK generates and parses it automatically.

Structure: [506][DDMMYY][cédula 12 dígitos][sucursal 3][terminal 5][tipo doc 2][consecutivo 10][situación 1][código seguridad 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"

Situation codes:

  • 1 Normal (standard online submission)

  • 2 Contingency (Hacienda system failure)

  • 3 No internet (offline)

XAdES-EPES digital signature

Every XML sent to Hacienda must be signed with XAdES-EPES using the taxpayer's .p12 certificate (RSA 2048 + SHA-256). The SDK handles the entire signing process.

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

Submission and status query

Simplified option — submitAndWait (recommended):

Submits the document and waits for Hacienda to process it. Handles polling automatically.

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

Granular option — full control:

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

List and query receipts:

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

Retries with exponential backoff:

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

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

Taxpayer lookup

Look up information for any taxpayer using Hacienda's public economic activities API (no authentication required):

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

Configuration management

Configuration is stored in ~/.hacienda-cr/config.toml with support for multiple profiles (e.g., sandbox, production, different companies).

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

Security: Passwords and PINs are never stored in configuration files. They always go through environment variables:

  • HACIENDA_PASSWORD — IDP password

  • HACIENDA_P12_PIN — .p12 certificate PIN

Structured logging

Built-in logger with configurable levels and JSON support (ideal for production).

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;

Error handling

All SDK errors extend HaciendaError for uniform handling:

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

Error codes (HaciendaErrorCode):

Code

Description

VALIDATION_FAILED

Zod validation or business rules failed

API_ERROR

Hacienda REST API returned an error or was unreachable

AUTHENTICATION_FAILED

Authentication or token lifecycle failed

SIGNING_FAILED

XAdES-EPES signing operation failed

INTERNAL_ERROR

Unexpected internal error


CLI — Command reference

npm install -g @dojocoding/hacienda-cli

All commands support --json for machine-readable output.

hacienda auth login

Authenticate with Hacienda's IDP and save the profile.

hacienda auth login \
  --cedula-type 02 \
  --cedula 3101234567 \
  --environment sandbox \
  --profile default

# Contraseña por variable de entorno (recomendado)
export HACIENDA_PASSWORD="tu-contraseña"
hacienda auth login --cedula-type 02 --cedula 3101234567

Argument

Description

--cedula-type

01 (Physical), 02 (Legal), 03 (DIMEX), 04 (NITE)

--cedula

Identification number

--password

IDP password (or use HACIENDA_PASSWORD)

--environment

sandbox (default) or production

--profile

Profile name (default: default)

hacienda auth status

Show current authentication status.

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

hacienda auth switch

Switch between authentication profiles.

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

hacienda submit

Submit an electronic receipt to 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

Check the processing status of a receipt by its key.

hacienda status 50601012400310123456700100001010000000001199999999

hacienda list

List recent receipts from Hacienda.

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

hacienda get

Get full details of a receipt by its key.

hacienda get 50601012400310123456700100001010000000001199999999

hacienda sign

Sign an XML document with a .p12 certificate (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

Validate an invoice file (JSON or XML) against schemas and business rules.

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

hacienda lookup

Look up a taxpayer's economic activities by ID (no authentication).

hacienda lookup 3101234567
hacienda lookup 3101234567 --json

hacienda draft

Interactively create a JSON invoice draft for submission.

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

Templates: factura (default), nota-credito, nota-debito, tiquete

Environment variables

Variable

Description

HACIENDA_PASSWORD

IDP password for authentication

HACIENDA_P12_PIN

PIN for the .p12 certificate file

HACIENDA_P12_PATH

Path to the .p12 certificate file


MCP Server — AI integration

The @dojocoding/hacienda-mcp package exposes the SDK as an MCP server (Model Context Protocol), allowing AI assistants to issue electronic invoices conversationally.

Configuration with Claude Desktop

Add this to claude_desktop_config.json:

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

Available tools

Tool

Description

create_invoice

Create an Electronic Invoice from structured data. Calculates taxes, generates key, and builds XML.

check_status

Check processing status by 50-digit numeric key.

list_documents

List recent electronic receipts with optional filters.

get_document

Get full details of a receipt by key.

lookup_taxpayer

Look up taxpayer information by ID.

draft_invoice

Generate an invoice draft with default values.

Available resources

URI

Description

hacienda://schemas/factura

JSON schema for invoice creation

hacienda://reference/document-types

Document types, codes, and descriptions

hacienda://reference/tax-codes

Tax codes, VAT rates, and units of measure

hacienda://reference/id-types

Identification types and validation rules


Development

Prerequisites

  • Node.js 22+ (uses native fetch and crypto.subtle)

  • pnpm 9+

Getting started

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

Project structure

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

Building individual packages

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

Tech stack

Tool

Purpose

TypeScript (strict)

Language

pnpm workspaces + Turborepo

Monorepo management

tsup

Build (zero-config)

Vitest

Testing (780+ tests)

ESLint + Prettier

Linting and formatting

Zod

Runtime validation + type inference

fast-xml-parser

XML generation and parsing

citty

CLI framework

@modelcontextprotocol/sdk

MCP framework

xadesjs / xmldsigjs

XAdES-EPES digital signature

Contributing

  1. Fork the repository

  2. Create a branch (git checkout -b feature/mi-feature)

  3. Make your changes with tests

  4. Run pnpm test && pnpm lint && pnpm typecheck

  5. Open a pull request

Conventions:

  • Files: kebab-case.ts

  • Types/Classes: PascalCase

  • Functions/Variables: camelCase

  • Constants: UPPER_SNAKE_CASE


Acknowledgments

This project builds on the pioneering work of the Costa Rican open-source community:

  • CRLibre/API_Hacienda — The original open-source API for electronic invoicing in Costa Rica (PHP). Its documentation, flow diagrams, and community resources were invaluable references for understanding the Hacienda API. Thanks to the entire CRLibre community for making electronic invoicing accessible to Costa Rican developers.

  • CRLibre/fe-hacienda-cr-misc — Shared resources and documentation for electronic invoicing in Costa Rica.


License

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