hacienda-cr MCP Server
Click on "Install Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@hacienda-cr MCP ServerCreate a factura electrónica for Cliente S.A. cédula 3109876543 for ₡100,000 + 13% IVA"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
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.
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.
CLI —
haciendacommand-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-sdkimport { 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 3101234567Option 3: MCP Server (for AI assistants)
npm install -g @dojocoding/hacienda-mcp
hacienda-mcpYou 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 |
| Electronic Invoice |
|
| Electronic Debit Note |
|
| Electronic Credit Note |
|
| Electronic Ticket |
|
| Electronic Purchase Invoice |
|
| Electronic Export Invoice |
|
| Electronic Payment Receipt |
|
— | Receptor Message (acceptance/rejection) |
|
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 |
|
|
|
|
|
|
|
|
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 = 254250VAT 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:
1Normal (standard online submission)2Contingency (Hacienda system failure)3No 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 DERSubmission 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 passwordHACIENDA_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 |
| Zod validation or business rules failed |
| Hacienda REST API returned an error or was unreachable |
| Authentication or token lifecycle failed |
| XAdES-EPES signing operation failed |
| Unexpected internal error |
CLI — Command reference
npm install -g @dojocoding/hacienda-cliAll 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 3101234567Argument | Description |
|
|
| Identification number |
| IDP password (or use |
|
|
| Profile name (default: |
hacienda auth status
Show current authentication status.
hacienda auth status
hacienda auth status --profile produccion
hacienda auth status --jsonhacienda auth switch
Switch between authentication profiles.
hacienda auth switch # Listar perfiles disponibles
hacienda auth switch produccion # Cambiar a un perfil específicohacienda 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 JSONhacienda status
Check the processing status of a receipt by its key.
hacienda status 50601012400310123456700100001010000000001199999999hacienda list
List recent receipts from Hacienda.
hacienda list
hacienda list --limit 50 --offset 0
hacienda list --jsonhacienda get
Get full details of a receipt by its key.
hacienda get 50601012400310123456700100001010000000001199999999hacienda 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.xmlhacienda 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 --jsonhacienda lookup
Look up a taxpayer's economic activities by ID (no authentication).
hacienda lookup 3101234567
hacienda lookup 3101234567 --jsonhacienda 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.jsonTemplates: factura (default), nota-credito, nota-debito, tiquete
Environment variables
Variable | Description |
| IDP password for authentication |
| PIN for the .p12 certificate file |
| 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 an Electronic Invoice from structured data. Calculates taxes, generates key, and builds XML. |
| Check processing status by 50-digit numeric key. |
| List recent electronic receipts with optional filters. |
| Get full details of a receipt by key. |
| Look up taxpayer information by ID. |
| Generate an invoice draft with default values. |
Available resources
URI | Description |
| JSON schema for invoice creation |
| Document types, codes, and descriptions |
| Tax codes, VAT rates, and units of measure |
| Identification types and validation rules |
Development
Prerequisites
Node.js 22+ (uses native
fetchandcrypto.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 typecheckProject 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.yamlBuilding individual packages
pnpm --filter @dojocoding/hacienda-sdk build
pnpm --filter @dojocoding/hacienda-sdk test
pnpm --filter @dojocoding/hacienda-sdk test clave.spec.tsTech 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
Fork the repository
Create a branch (
git checkout -b feature/mi-feature)Make your changes with tests
Run
pnpm test && pnpm lint && pnpm typecheckOpen a pull request
Conventions:
Files:
kebab-case.tsTypes/Classes:
PascalCaseFunctions/Variables:
camelCaseConstants:
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
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.
This server cannot be installed
Maintenance
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
Costa Rica Hacienda v4.4: AI agents submit and query electronic invoices, stateless BYO.
- ZapierOAuthcom.zapier
Hosted MCP server connecting AI assistants to 9,000+ apps and 40,000+ actions via Zapier.
MCP server unifying ERPs, CRMs, APIs and knowledge base for Claude, ChatGPT and Gemini.
Mexico CFDI 4.0 invoices for AI agents - issue, query, cancel facturas via Facturapi.
Related MCP Servers
- FlicenseNot gradedqualityFmaintenanceAn 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-
- AlicenseAqualityBmaintenanceOpen-source MCP server for Chile's SII free invoicing system, enabling AI agents to query issued and received tax documents.121MIT
- AlicenseNot gradedqualityDmaintenanceMCP server enabling AI assistants to manage invoices, contacts, products, and other accounting data through the Bukku API.6MIT
- AlicenseNot gradedqualityAmaintenanceMCP 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
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
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