Documentación

Servidor MCP

Bloques incluye un servidor MCP (Model Context Protocol): el estándar abierto con el que asistentes y agentes IA — Claude, Claude Code, y cualquier cliente MCP — usan herramientas externas. Conectándolo, tu agente puede emitir boletas y facturas, consultar documentos, gestionar el catálogo y revisar tu consumo, conversando: "emite una boleta de S/ 118 por consultoría a CLIENTES VARIOS".

Endpoint y protocolo

PropiedadValor
URLPOST https://<tu-host>/api/mcp
TransporteStreamable HTTP, stateless: cada POST es una petición JSON-RPC independiente; no hay sesiones ni SSE (GET responde 405).
Versiones de protocolo2025-06-18, 2025-03-26, 2024-11-05.
AutenticaciónCabecera Authorization: Bearer sk_live_… — los mismos tokens con scopes de la API REST (Configuración → API). Sin token válido no se revela nada del servidor (401).
CapacidadesSolo tools (sin resources ni prompts en v1).

Cómo conectarlo

Claude Code

claude mcp add --transport http bloques https://<tu-host>/api/mcp \
  --header "Authorization: Bearer sk_live_..."

Listo: en la siguiente sesión verás las herramientas bloques disponibles. Verifica con claude mcp list.

claude.ai (conector personalizado)

En claude.ai ve a Settings → Connectors → Add custom connector y registra la URL https://<tu-host>/api/mcp. Como el servidor se autentica con cabecera Bearer (no OAuth), necesitas un plan/cliente que permita configurar cabeceras personalizadas para conectores; si tu cliente no lo permite, usa Claude Code o la API REST.

Otros clientes MCP (config JSON genérica)

mcp.json / configuración equivalente
{
  "mcpServers": {
    "bloques": {
      "type": "http",
      "url": "https://<tu-host>/api/mcp",
      "headers": {
        "Authorization": "Bearer sk_live_..."
      }
    }
  }
}

Cualquier cliente que soporte transporte http (Streamable HTTP) con cabeceras personalizadas funciona.

Herramientas

Cada token solo ve las herramientas que sus scopes permiten — un token de solo lectura ni siquiera sabe que create_document existe — y, cuando la herramienta pertenece a un módulo (como create_expense, del módulo Finanzas), solo si tu empresa tiene ese módulo activo. La lista que ve tu agente es, por eso, la intersección de las dos cosas.

create_documentdocuments:write
Emite un comprobante electrónico a SUNAT (firma el XML UBL y lo transmite, devolviendo síncronamente el resultado accepted/rejected). factura exige cliente con RUC; boleta es para consumidores (DNI, u omite el cliente para CLIENTES VARIOS). Los precios son finales con IGV incluido. Consume el límite mensual del plan. Es una emisión fiscal real: el agente debe confirmar con el usuario antes de llamarla.
ArgumentoRequeridoDescripción
type"factura" o "boleta".
seriesNoSerie como F001/B001 (por defecto la activa).
issue_dateNoYYYY-MM-DD, por defecto hoy (Lima). Máx. 7 días atrás.
currencyNoPEN (por defecto) o USD.
customerFactura: síObjeto con id (cliente existente) o doc_type("6" RUC, "1" DNI, "4" CE, "7" pasaporte, "0" ninguno), doc_number, name, email, address.
items1–100 ítems: product_id o code (catálogo), o description + unit_price (línea libre); más quantity, unit_code, affectation (10/20/30).
paymentNo{ "type": "contado" | "credito", "installments": [{ "amount", "due_date" }] } — las cuotas deben sumar el total.
notesNoTexto libre impreso en el PDF.
send_emailNoEnviar PDF + XML al cliente (por defecto, configuración de la empresa).
idempotency_keyRecomendadoClave de reintento seguro: repetirla devuelve el documento original en vez de emitir dos veces.
get_documentdocuments:read
Recupera un documento emitido con sus ítems, estado SUNAT, totales y rutas de archivos. Acepta el UUID o el número completo tipo F001-42.
ArgumentoRequeridoDescripción
id_or_numberUUID del documento o número completo (serie-correlativo).
list_documentsdocuments:read
Lista documentos emitidos (los más recientes primero) con filtros opcionales.
ArgumentoRequeridoDescripción
fromNoFecha de emisión mínima (YYYY-MM-DD).
toNoFecha de emisión máxima (YYYY-MM-DD).
typeNofactura | boleta.
statusNoaccepted | rejected | error | processing.
qNoBúsqueda por número, nombre o documento del cliente.
pageNoPor defecto 1.
per_pageNoPor defecto 25, máx. 100.
get_document_filesdocuments:read
Devuelve las URLs de descarga (PDF, XML firmado, XML sin firmar, CDR, y un ZIP con el XML firmado y el CDR juntos) de un documento. Las URLs requieren la misma cabecera Authorization: Bearer usada para MCP.
ArgumentoRequeridoDescripción
idUUID del documento.
list_productsproducts:read
Lista el catálogo de productos activos (código, nombre, precio final con IGV, unidad, afectación).
ArgumentoRequeridoDescripción
qNoBúsqueda por nombre o código.
pageNoPor defecto 1 (100 por página).
create_productproducts:write
Crea un producto de catálogo. unit_price es el precio FINAL (IGV incluido cuando la afectación es 10 gravado).
ArgumentoRequeridoDescripción
codeCódigo único por empresa.
nameNombre del producto.
descriptionNoDescripción opcional.
unit_codeNoPor defecto NIU.
unit_pricePrecio final, mayor a 0.
currencyNoPEN (por defecto) | USD.
affectationNo"10" (por defecto) | "20" | "30".
search_customerscustomers:read
Busca en el directorio de clientes por nombre o número de documento.
ArgumentoRequeridoDescripción
qNoTexto de búsqueda; sin él lista los primeros clientes.
create_expenseexpenses:write · módulo Finanzas
Registra un gasto (dinero que sale): una compra a proveedor, un servicio, la planilla, el alquiler o un impuesto — con factura, boleta, recibo, ticket o sin ningún comprobante. Es contabilidad propia: no se envía nada a SUNAT, no consume correlativo y no cuenta contra el límite del plan. El total es lo que dice el papel y es el único monto obligatorio: Bloques sugiere el desglose con la tasa de IGV efectiva de tu empresa, salvo que envíes amounts — y entonces los seis componentes deben sumar el total exacto.
ArgumentoRequeridoDescripción
issue_dateYYYY-MM-DD, la fecha del comprobante del proveedor.
totalTotal del documento, IGV incluido. Acepta string ("118.00", exacto) o número.
doc_typeNo01 factura (por defecto) · 02 recibo por honorarios · 03 boleta · 04 liquidación de compra · 07/08 nota de crédito/débito recibida · 10 arrendamiento · 12 ticket · 13 banco/seguro · 14 servicios públicos · 00 sin comprobante. Fija el valor por defecto de credito_fiscal.
supplier_id / supplierNoEl UUID de un proveedor del directorio, o uno tipeado (doc_type, doc_number, name). Sin ninguno: PROVEEDOR VARIOS.
descriptionNoNombre corto del gasto — en qué se gastó, en pocas palabras («Compra de gaseosas para la tienda»). Máx. 200 caracteres. Se muestra en la lista de gastos y entra a la búsqueda. Es distinto de notes, la nota interna larga, y no tiene ningún efecto fiscal.
series / numberNoSerie y correlativo tal como vienen impresos (texto libre).
currency / exchange_rateNoPEN (por defecto) o USD; en USD el tipo de cambio es obligatorio.
amountsNoDesglose copiado del documento: base_gravada, igv, base_exonerada, base_inafecta, isc, otros_tributos. Debe sumar el total.
detractionNo{ code, rate, amount, constancy, date } — la tasa es fracción (0.12 = 12 %) y se guarda tal como se envía (es un snapshot de la constancia).
category_id / branch_id / cash_register_idNoUUIDs de la categoría, la sucursal y la caja a las que se imputa.
due_date / payment_termsNoVencimiento y contado | credito (cuentas por pagar).
itemsNoLíneas opcionales que reparten el total (por categoría o producto), no la fuente de los impuestos: si las envías, deben sumar el total.
deductible / is_fixed_asset / igv_destination / credito_fiscal / notesNoMarcas contables del gasto.
get_usagesin scope (cualquier token)
Documentos consumidos en el mes en curso contra el límite del plan (gratis: 10/mes; pro: 3000/mes; calendario America/Lima).

Sin argumentos.

Modelo de seguridad

  • Scopes por token filtran las herramientas visibles. tools/list solo devuelve lo que el token puede ejecutar; la superficie no autorizada permanece oculta (no solo bloqueada).
  • Los módulos filtran igual que los scopes. Una herramienta de un módulo que tu empresa no tiene activo no se lista, y llamarla igual falla — el servidor lo vuelve a verificar al ejecutar.
  • Gastos y dinero: escritura sin lectura. create_expense registra, pero ninguna herramienta lee gastos, saldos ni movimientos de dinero. Es deliberado: un agente puede anotar lo que se gastó sin poder consultar cuánta plata tienes ni en qué se va. Esa información se ve únicamente iniciando sesión en la app.
  • Aislamiento por empresa. Cada token pertenece a exactamente una empresa; toda herramienta opera únicamente sobre los datos de esa empresa. No existe forma de cruzar tenants.
  • Auditoría de cada llamada. Toda ejecución de herramienta queda registrada en la bitácora de eventos de la empresa (mcp.tool_call), con el token como actor. Las emisiones registran además qué token las originó.
  • Sin estado, sin divulgación anónima. El servidor no responde nada (ni siquiera su nombre) sin un Bearer válido, y no mantiene sesiones que secuestrar.

Recomendación: un token por agente, con scopes mínimos

Crea un token dedicado para cada agente y dale solo lo que necesita. Un agente de análisis o reportes: documents:read (+ products:read) — jamás podrá emitir. Un agente de caja: documents:write + documents:read. Evita * salvo para pruebas tuyas. Si un agente se comporta mal, revoca su token en Configuración → API y solo ese agente pierde acceso.

¿Vas a programar la integración tú mismo (o tu agente)? Sigue con la guía para agentes IA o apunta directamente a /llms-full.txt.