io.github.nubiia-dev/mcp-freematica

Official registry Finance and payments

Freemática ERP: invoicing, receivables, suppliers, accounting and HR through 300+ MCP tools

Install

Add this to your client's MCP configuration (Claude Desktop: claude_desktop_config.json; Cursor: .cursor/mcp.json; VS Code and others use the same "mcpServers" shape).

NPM package @nubiia/mcp-freematica
Claude Code
claude mcp add mcp-freematica -e 'FREEMATICA_AUTH_TOKEN=<your freematica_auth_token>' -e 'FREEMATICA_AUTH_COMPANY=<FREEMATICA_AUTH_COMPANY>' -e 'FREEMATICA_AUTH_ORGANIZATION=<FREEMATICA_AUTH_ORGANIZATION>' -e 'FREEMATICA_AUTH_APP=<FREEMATICA_AUTH_APP>' -e 'FREEMATICA_AUTH_SESSION=<your freematica_auth_session>' -e 'FREEMATICA_ENABLE_WRITES=false' -e 'FREEMATICA_BASE_URL=https://api-p01.clientservicepanel.com/restsat/api' -- npx -y @nubiia/mcp-freematica@0.11.2
JSON configuration (Claude Desktop, Cursor, VS Code)
{
    "mcpServers": {
        "mcp-freematica": {
            "command": "npx",
            "args": [
                "-y",
                "@nubiia/mcp-freematica@0.11.2"
            ],
            "env": {
                "FREEMATICA_AUTH_TOKEN": "<your freematica_auth_token>",
                "FREEMATICA_AUTH_COMPANY": "<FREEMATICA_AUTH_COMPANY>",
                "FREEMATICA_AUTH_ORGANIZATION": "<FREEMATICA_AUTH_ORGANIZATION>",
                "FREEMATICA_AUTH_APP": "<FREEMATICA_AUTH_APP>",
                "FREEMATICA_AUTH_SESSION": "<your freematica_auth_session>",
                "FREEMATICA_ENABLE_WRITES": "false",
                "FREEMATICA_BASE_URL": "https://api-p01.clientservicepanel.com/restsat/api"
            }
        }
    }
}

Environment variables

  • FREEMATICA_AUTH_TOKEN required secret Freemática API token (x-auth-token header).
  • FREEMATICA_AUTH_COMPANY required Freemática company identifier (x-auth-company header).
  • FREEMATICA_AUTH_ORGANIZATION required Freemática organization identifier (x-auth-organization header).
  • FREEMATICA_AUTH_APP required Freemática consuming application, e.g. pvss (x-auth-app header).
  • FREEMATICA_AUTH_SESSION required secret Freemática active session (x-auth-session header).
  • FREEMATICA_ENABLE_WRITES Set to true to register the create/update tools. Read-only by default.
  • FREEMATICA_BASE_URL Freemática API base URL. Change only for an alternative host.

Documentation

From the project's README on GitHub, refreshed weekly. Links open on GitHub.

Contents
  1. mcp-freematica
  2. Stack
  3. Tools expuestas
  4. Filtros tipados (FIQL interno)
  5. Modos de transporte
  6. Datos maestros disponibles
  7. Paginación
  8. IDs opacos en endpoints de detalle
  9. Configuración
  10. Troubleshooting
  11. Desarrollo
  12. Testing
  13. Endpoints HTTP
  14. Seguridad
  15. Cómo añadir una nueva operación
  16. Despliegue
  17. Publicar una nueva versión
  18. Especificaciones y diseño
  19. About Nubiia
  20. Author
  21. Links
  22. Licencia

mcp-freematica

MCP server que expone operaciones del API REST de Freemática (ERP: facturación, cartera, proveedores, contabilidad, personal) para ser consumidas por asistentes de IA como Claude.

Built and maintained by Nubiia — automatización e integraciones con IA para negocios (MCP, Holded, Pipedrive y más). ¿Quieres algo así para tu empresa? Escríbenos en nubiia.es.

Stack

  • TypeScript + Node.js ≥20
  • @modelcontextprotocol/sdk (stdio + Streamable HTTP transports)
  • Express + axios + zod
  • pino (logging estructurado)
  • Vitest + nock para tests

Tools expuestas

ToolEndpoint FreemáticaDescripción
freematica_list_articulosGET /part/v1/articulosCatálogo de artículos/materiales/consumibles (referencias, familias, proveedores)
freematica_get_articuloGET /part/v1/articulos/{idreg}Detalle de un artículo
freematica_get_precio_articuloGET /pgrl/v1/precio-articulo/{idreg}Precios de venta de un artículo (PRECIO_VENTA, DESCUENTO, FACTURABLE)
freematica_list_materiales_asignados_serviciosGET /pvss/v2/contratos-servicios-materialLista de material asignado a servicios
freematica_get_master_data(24 endpoints según catalog)Devuelve un catálogo de datos maestros (tipos, geográficos, organizativos, inventario, financiero)
freematica_list_clientesGET /pgrl/v2/clientesLista paginada de clientes
freematica_get_clienteGET /pgrl/v2/clientes/{idReg}Detalle de un cliente
freematica_list_contactos_clientesGET /pgrl/v2/contactos-clientesLista paginada de contactos
freematica_list_oportunidades_negocioGET /pcrm/v2/oportunidades-negocioLista paginada de oportunidades
freematica_get_oportunidad_negocioGET /pcrm/v2/oportunidades-negocio/{idReg}Detalle de oportunidad
freematica_get_oportunidad_negocio_datos_ampliadosGET /pcrm/v2/oportunidades-negocio/{idReg}/datos-ampliadosDatos ampliados (puede 404)
freematica_get_ficha_prev_clienteGET /pprl/v2/ficha-prev-clienteFicha PRL de un cliente
freematica_list_vigilancia_saludGET /pprl/v1/vigilancia-saludLista paginada de registros de Vigilancia de la Salud
freematica_get_vigilancia_saludGET /pprl/v1/vigilancia-salud/{idreg}Detalle de un registro de Vigilancia de la Salud
freematica_list_personalGET /pers/v1/personalLista paginada de personas (RRHH)
freematica_get_personaGET /pers/v2/personal/{idreg}Detalle de una persona
freematica_list_calendariosGET /pgrl/v1/calendariosLista paginada de calendarios laborales
freematica_list_calendario_periodosGET /pgrl/v1/calendarios/{idreg}/periodosPeriodos de un calendario laboral
freematica_list_cartera_clientesGET /pcar/v1/cartera-clientesLista paginada de cartera de clientes (cobros, impagados)
freematica_get_cartera_clienteGET /pcar/v1/cartera-clientes/{idReg}Detalle de un documento de cartera
freematica_list_facturas_cabeceraGET /pven/v1/facturas-cabeceraLista paginada de facturas de ventas (cabecera)
freematica_get_factura_cabeceraGET /pven/v1/facturas-cabecera/{idReg}Detalle de una factura de venta
freematica_list_factura_lineasGET /pven/v1/facturas-cabecera/{idReg}/lineasLíneas de detalle de una factura de venta
freematica_list_factura_ivaGET /pven/v1/facturas-cabecera/{idReg}/ivaLíneas de IVA de una factura de venta
freematica_list_factura_vencimientosGET /pven/v1/facturas-cabecera/{idReg}/vencimientosVencimientos de cobro de una factura de venta
freematica_list_facturas_comprasGET /pcom/v1/facturas-cabeceraLista paginada de facturas de compras
freematica_get_factura_compraGET /pcom/v1/facturas-cabecera/{idReg}Detalle de una factura de compra
freematica_list_proveedoresGET /pgrl/v2/proveedoresLista paginada de proveedores
freematica_get_proveedorGET /pgrl/v2/proveedores/{idReg}Detalle de un proveedor
freematica_list_localizaciones_cobro_clientesGET /pgrl/v2/localizaciones-cobro-clientesLocalizaciones de cobro de clientes (SEPA, domiciliaciones)
freematica_list_localizaciones_pago_proveedoresGET /pgrl/v2/localizaciones-pago-proveedoresLocalizaciones de pago de proveedores
freematica_list_localizaciones_servicio_clientesGET /pgrl/v2/localizaciones-servicio-clientesLocalizaciones de servicio de clientes
freematica_list_cuentas_contablesGET /pcon/v2/cuentasPlan de cuentas contables (COD_CTA, COD_PLAN, etc.)
freematica_list_cuentas_analiticasGET /pcon/v2/cuentas-analiticasCatálogo de cuentas analíticas
freematica_export_asientosGET /pcon/v2/asientosExporta asientos contables de un período (CSV/JSON)
freematica_list_pedidos_compraGET /pcmp/v2/pedidosLista paginada de pedidos de compra (filtros nativos + FIQL + estado enum)
freematica_get_pedido_compraGET /pcmp/v2/pedidos/{idReg}Detalle de un pedido de compra (cabecera + proveedor + líneas)
freematica_list_albaranes_ventasGET /pven/v2/albaranes-ventasLista paginada de albaranes de ventas (filtros todos nativos, empresa requerido)
freematica_get_albaran_ventaGET /pven/v2/albaranes-ventas/{idReg}Detalle de un albarán de venta
freematica_list_albaranes_facturaGET /pven/v2/albaranes-facturasLista paginada de vinculaciones albarán↔factura (idReg nativo + FIQL)
freematica_get_albaran_facturaGET /pven/v2/albaranes-facturas/{idReg}Detalle de una vinculación albarán-factura
freematica_list_resultados_facturacionGET /pvss/v1/facturacion-resultadosResultados del proceso batch de facturación automática de vigilancia (FIQL)
freematica_list_contratosGET /pvss/v1/contratosLista paginada de cabeceras de contratos (solo filtros nativos: el API ignora FIQL aquí)
freematica_get_contratoGET /pvss/v1/contratos (scan)Busca un contrato por empresa + código natural (paginación interna + filtrado en cliente)
freematica_list_servicios_contratoGET /pvss/v1/contratos/{idReg}/serviciosServicios de un contrato
freematica_get_servicio_contratoGET /pvss/v2/contratos-servicios/{idReg}Detalle de un servicio de contrato
freematica_list_contratos_opcionalesGET /ppre/v2/contratos/opcionalesLista paginada de opcionales de contratos
freematica_get_contrato_opcionalesGET /ppre/v2/contratos/opcionales/{idReg}Detalle de un registro de opcionales
freematica_list_localizaciones_envio_clientesGET /pgrl/v2/localizaciones-envio-clientesLocalizaciones de envío de clientes
freematica_list_localizaciones_factura_clientesGET /pgrl/v2/localizaciones-factura-clientesLocalizaciones de factura de clientes
Tools de escritura (requieren FREEMATICA_ENABLE_WRITES=true)

Por defecto el servidor es de solo lectura. Con FREEMATICA_ENABLE_WRITES=true se registran además estas tools de creación y actualización. No existe ninguna tool de borrado. Todas las escrituras dejan log de auditoría (operación + endpoint + campos a nivel info; body completo a nivel debug).

ToolEndpoint FreemáticaDescripción
freematica_create_contratoPOST /pvss/v2/contratosAlta de cabecera de contrato
freematica_update_contratoPUT /pvss/v2/contratos/{idReg}Actualización de cabecera de contrato
freematica_create_servicio_contratoPOST /pvss/v2/contratos/{idReg}/serviciosAlta de servicio (identificación derivada del idReg)
freematica_update_servicio_fechasPUT /pvss/v2/contratos/{id}/servicio/{id}Fechas inicio/fin del servicio (mecanismo de baja)
freematica_create_servicio_historico_preciosPOST /pvss/v2/contratos/{id}/servicios-historico-precios/{id}Alta de revisión de precios del servicio
freematica_update_servicio_historico_preciosPUT /pvss/v2/contratos/{id}/servicios-historico-precios/{id}Actualización de revisión de precios
freematica_create_servicio_facturacion_txtPOST /pvss/v2/contratos/{id}/servicios-facturacion-txt/{id}Alta de línea de texto de facturación
freematica_update_servicio_facturacionPUT /pvss/v2/contratos/{id}/servicios-facturacion/{id}Datos de facturación del servicio (precios hora, forma de pago…)
freematica_create_contrato_opcionalesPOST /ppre/v2/contratos/opcionalesAlta de opcionales de contrato
freematica_update_contrato_opcionalesPUT /ppre/v2/contratos/opcionales/{idReg}Actualización de opcionales de contrato
freematica_create_clientePOST /pgrl/v2/clientesAlta de cliente (idReg derivado de grupo+código)
freematica_update_clientePUT /pgrl/v2/clientes/{idReg}Actualización parcial de cliente (fetch+merge)
freematica_create_contacto_clientePOST /pgrl/v2/contactos-clientesAlta de contacto de cliente
freematica_update_contacto_clientePUT /pgrl/v2/contactos-clientes/{idReg}Actualización parcial de contacto (fetch+merge)
freematica_create_localizacion_clientePOST /pgrl/v2/localizaciones-{tipo}-clientesAlta de localización (tipo: cobro/envio/factura/servicio)
freematica_update_localizacion_clientePUT /pgrl/v2/localizaciones-{tipo}-clientes/{idReg}Actualización parcial de localización (fetch+merge)

Filtros tipados (FIQL interno)

El MCP expone parámetros tipados con zod al consumidor (Claude/LLM). Internamente, el cliente los traduce a sintaxis FIQL antes de llamar al API de Freemática. El consumidor nunca ve ni escribe FIQL.

Ejemplo
// El LLM llama:
freematica_list_cartera_clientes({
  empresa: '0001',
  fechaDocDesde: '2026-01-01',
  estado: 'pendiente',
});

// El MCP construye internamente (valores siempre entre comillas simples):
// rquery=CARCL_EMP=='0001';CARCL_FECDOC=ge='2026-01-01';CARCL_SITCAR=='1'
Ventajas del patrón
  • El LLM solo necesita conocer los parámetros tipados con nombres semánticos en español.
  • La complejidad de la sintaxis FIQL queda encapsulada en el adapter interno (src/clients/fiql-builder.ts).
  • Los errores de validación son claros: "empresa debe ser string", no "FIQL parse error".
  • Los filtros booleanos (soloImpagados: true) se traducen automáticamente al operador FIQL correcto.
Más ejemplos
// Facturas pendientes de traspaso a contabilidad:
freematica_list_facturas_cabecera({
  empresa: '0001',
  traspasadoContabilidad: false,
});
// → rquery=FVC_CODEMP=='0001';FVC_TRASP_CONTAB=='0'

// Proveedor por nombre EXACTO (el API no soporta búsqueda parcial: =lk=
// responde 400 y los wildcards % devuelven 0 resultados). El filtro activo
// de proveedores post-filtra las bajas en cliente (FIQL no tiene IS NULL):
freematica_list_proveedores({
  nombre: 'LEJIAS PONS S.A.',
  activo: true,
});
// → rquery=NOMBRE_PRO=='LEJIAS PONS S.A.'

Modos de transporte

El binario soporta dos transportes seleccionables. La selección sigue este orden de precedencia:

  1. CLI flag: --transport=<modo>
  2. Variable de entorno: MCP_TRANSPORT=<modo>
  3. Default: stdio
ModoCuándo usarComando
stdioClaude Desktop, Claude Code, ejecución localmcp-freematica (default) o mcp-freematica --transport=stdio
httpNubiia, deploy como servicio webmcp-freematica --transport=http o MCP_TRANSPORT=http mcp-freematica
Configurar en Claude Desktop (stdio)

Edita ~/Library/Application Support/Claude/claude_desktop_config.json:

{
  "mcpServers": {
    "freematica": {
      "command": "npx",
      "args": ["-y", "@nubiia/mcp-freematica"],
      "env": {
        "FREEMATICA_AUTH_TOKEN": "...",
        "FREEMATICA_AUTH_COMPANY": "...",
        "FREEMATICA_AUTH_ORGANIZATION": "...",
        "FREEMATICA_AUTH_APP": "...",
        "FREEMATICA_AUTH_SESSION": "..."
      }
    }
  }
}

Reinicia Claude Desktop y las tools de freematica_* aparecerán disponibles.

Configurar en Claude Code (stdio)
claude mcp add freematica npx -y @nubiia/mcp-freematica \
  -e FREEMATICA_AUTH_TOKEN=... \
  -e FREEMATICA_AUTH_COMPANY=... \
  -e FREEMATICA_AUTH_ORGANIZATION=... \
  -e FREEMATICA_AUTH_APP=... \
  -e FREEMATICA_AUTH_SESSION=...
Configurar en Nubiia (HTTP)

Setear MCP_TRANSPORT=http en las variables de entorno del proceso, junto a las 5 FREEMATICA_AUTH_*. Resto de variables (puerto, origins) opcionales — ver tabla en "Configuración avanzada".

Datos maestros disponibles

La tool freematica_get_master_data acepta un parámetro catalog con uno de los 24 valores siguientes. Cada uno mapea a un endpoint específico de Freemática.

catalogEndpoint FreemáticaContenido
Tipos / clasificaciones
tipos-contratoGET /ppre/v2/tipos-contratoTipos de contrato comercial
tipo-instalacionGET /ppre/v1/tipo-instalacionTipos de instalación física
clases-serviciosGET /pvss/v1/clases-serviciosClases de servicio operativas
tipos-casosGET /pcrm/v2/tipos-casosTipos de caso CRM
subtipos-casosGET /pcrm/v2/subtipos-casosSubtipos de caso CRM
tipos-oportunidad-negocioGET /pcrm/v2/tipos-oportunidad-negocioTipos de oportunidad comercial
tipos-impuestosGET /pgrl/v2/tipos-impuestosIVA, IRPF, retenciones
naturalezas-abonoGET /pven/v1/naturalezas-abonoNaturalezas de abono comercial
incidencecodeGET /pvss/v2/incidencecodeCódigos de incidencia en servicios
claves-facturacionGET /pvss/v2/claves-facturacionClaves de facturación de servicios
Geográficos
paisesGET /pgrl/v1/paisesPaíses
nacionalidadesGET /pgrl/v1/nacionalidadesNacionalidades
provinciasGET /pgrl/v1/provinciasProvincias
poblacionesGET /pgrl/v2/poblacionesMunicipios
Organizativos
empresasGET /pgrl/v1/empresasEmpresas
delegacionesGET /pgrl/v1/delegaciones/agrupcodDelegaciones (listado global)
lineas-negocioGET /pgrl/v2/lineas-negocioLíneas de negocio
cargos-clientesGET /pgrl/v2/cargos-clientesCargos de contactos
calendariosGET /pgrl/v1/calendariosCalendarios laborales
seriesGET /pgrl/v2/seriesSeries de numeración de documentos
Inventario
familiasGET /part/v1/familiasFamilias de artículos
subfamiliasGET /part/v1/subfamiliasSubfamilias
lineasGET /part/v1/lineasLíneas de artículos
Financiero
bancosGET /pgrl/v2/bancosEntidades bancarias

Respuesta: { catalog, items, count, total }. Patrón típico de uso: llamar primero al catálogo correspondiente cuando otra tool devuelva IDs crípticos para resolverlos a nombres humanos.

Paginación

Todas las tools freematica_list_* aceptan dos parámetros opcionales:

  • page (int, ≥1, default 1): página a recuperar, 1-indexed.
  • items (int, 1..50, default 20): items por página.

La respuesta incluye siempre total (total de elementos en el dataset) para que el LLM pueda iterar páginas.

El parámetro está bloqueado en page >= 1 porque el API real de Freemática trata page=0 como "devuelve TODO el dataset" (varios MB en endpoints grandes como clientes). Verificado empíricamente.

IDs opacos en endpoints de detalle

Las tools freematica_get_* requieren un id que NO es el código natural (COD_CLI, ID_OPORTUNIDAD) sino el campo idReg que aparece en los items del listado correspondiente. Es un string opaco base64 como MV9fMTAwMA==.

Si pasas un código natural, el API responde not_found.

Patrón típico de uso desde el LLM:

  1. freematica_list_clientes(page=1, items=20) → encontrar el cliente que interesa.
  2. Tomar el campo idReg de ese item.
  3. freematica_get_cliente(id="<idReg>") → detalle completo.

Configuración

El servidor lee toda su configuración de variables de entorno al arrancar. Si falta alguna obligatoria, el proceso muere con un mensaje claro listando qué falta — no acepta requests hasta que la configuración sea válida.

Variables de entorno obligatorias
VariableDescripción
FREEMATICA_AUTH_TOKENHeader x-auth-token para autenticar con la API de Freemática.
FREEMATICA_AUTH_COMPANYHeader x-auth-company. Identifica la empresa dentro del API.
FREEMATICA_AUTH_ORGANIZATIONHeader x-auth-organization. Identifica la organización.
FREEMATICA_AUTH_APPHeader x-auth-app. Identifica la aplicación que consume (p.ej. pvss).
FREEMATICA_AUTH_SESSIONHeader x-auth-session. Identifica la sesión activa.
Configuración avanzada

Variables de entorno opcionales para tuning de comportamiento en producción:

VariableDefaultDescripción
FREEMATICA_BASE_URLhttps://api-p01.clientservicepanel.com/restsat/apiBase URL del API de Freemática. Cambiar solo si Freemática cambia el host o se usa un entorno alternativo.
FREEMATICA_TIMEOUT_MS30000Timeout por petición en milisegundos. Si el upstream no responde en este tiempo, el request se cancela con network_error.
FREEMATICA_MAX_RETRIES3Número máximo de reintentos para errores 5xx y errores de red. Los errores 4xx nunca se reintentan.
FREEMATICA_CIRCUIT_BREAKER_THRESHOLD5Número de operaciones lógicas fallidas consecutivas (post-retry-exhaustion) necesarias para abrir el circuit breaker.
FREEMATICA_CIRCUIT_BREAKER_TIMEOUT_MS30000Tiempo en ms que el circuit breaker permanece abierto antes de pasar a half-open.
FREEMATICA_MAX_RESPONSE_SIZE_MB10Tamaño máximo de respuesta aceptada del upstream en MB. Respuestas mayores se truncan con aviso en el campo truncated.
FREEMATICA_ENABLE_WRITESfalseRegistra las tools de escritura (freematica_create_* / freematica_update_*). Sin ella el servidor es de solo lectura. Valores: true/false/1/0.
MCP_TRANSPORTstdioTransporte: stdio (para Claude Desktop/Code) o http (para Nubiia). Equivale al flag --transport=.
MCP_PORT3000Puerto TCP donde el servidor MCP expone /mcp y /health. Ignorado en modo stdio.
MCP_ALLOWED_ORIGINS*CORS: lista de orígenes permitidos separados por coma, o * para todos. En producción restringir al dominio de Nubiia. Ignorado en modo stdio.
LOG_LEVELinfoNivel de log para pino: fatal, error, warn, info, debug, trace. En producción usar info. En desarrollo usar debug.
De dónde salen las credenciales x-auth-*

Las 5 credenciales x-auth-* son preexistentes — el Postman collection de Freemática no expone un endpoint de login, así que estas credenciales se obtienen fuera de banda (típicamente por el departamento de IT de Freemática o tu integrador).

  • Pide los 5 valores al responsable técnico de Freemática (o recupéralos de tu gestor de secretos si ya están provisionados).
  • NO comitees credenciales reales. El repositorio tiene .env.* en .gitignore (excepto .env.example).
  • Si las credenciales caducan, el MCP devolverá invalid_token en todas las llamadas. Renovarlas implica reiniciar el proceso (no hay refresh automático).
Configuración en Nubiia (producción)

Nubiia despliega el servidor MCP y se encarga de inyectar las variables de entorno. En el panel de Nubiia:

  1. Crea un MCP server apuntando a la URL del contenedor desplegado (por ejemplo https://freematica-mcp.example.com/mcp).
  2. Añade las variables de entorno listadas arriba en la sección de secretos.
  3. Recomendado: setear MCP_ALLOWED_ORIGINS al dominio exacto desde el que Claude/Nubiia conecta, no *.
  4. Verifica con el endpoint GET /health que el servidor está vivo antes de habilitar el MCP en Claude.
Configuración local (desarrollo)

Para desarrollo local crea un .env (o .env.local) en la raíz:

cp .env.example .env
# Edita .env y rellena los 5 FREEMATICA_AUTH_*

Luego arranca con:

set -a; source .env; set +a
npm run dev

O todo en una línea:

node --env-file=.env --import tsx src/index.ts
Verificación de la configuración
  1. Sin env vars — el proceso debe morir inmediatamente con un mensaje listando las 5 variables que faltan:
     node dist/index.js
     # [freematica-mcp] FATAL: Invalid configuration:
     #   - FREEMATICA_AUTH_TOKEN: Required
     #   - FREEMATICA_AUTH_COMPANY: Required
     #   ...
  2. Con env vars válidas (modo HTTP) — arranca con MCP_TRANSPORT=http y el proceso queda escuchando; /health devuelve { "status": "ok", "version": "0.5.0", "sessions": 0 }:

     MCP_TRANSPORT=http node dist/index.js &
     curl http://localhost:3000/health

    En modo stdio (default) no hay endpoints HTTP — el server escucha JSON-RPC por stdin/stdout.

Troubleshooting

invalid_token en todas las llamadas

Las credenciales x-auth-* han caducado o son incorrectas. Pasos:

  1. Verificar que las 5 variables FREEMATICA_AUTH_* están seteadas correctamente.
  2. Contactar al responsable técnico de Freemática para renovar el token/sesión.
  3. Reiniciar el proceso del MCP tras actualizar las variables (el cliente no refresca credenciales en caliente).
network_error — upstream Freemática caído

El API de Freemática no está respondiendo. Puede ser:

  • Mantenimiento programado del upstream.
  • Circuit breaker activo tras varios fallos consecutivos (ver logs: Circuit breaker opened).
  • Problema de red entre el servidor y api-p01.clientservicepanel.com.

Pasos:

  1. Verificar en los logs si hay circuitBreaker: "open" — si es así, esperar FREEMATICA_CIRCUIT_BREAKER_TIMEOUT_MS ms (default 30s) para que pase a half-open.
  2. Verificar conectividad al upstream: curl https://api-p01.clientservicepanel.com/.
  3. Aumentar FREEMATICA_TIMEOUT_MS si el upstream es lento (default 30s puede ser insuficiente en algunas redes).
rate_limit_exceeded — throttling de Freemática

Freemática devuelve 429. El MCP reintenta automáticamente honrando el header Retry-After si está presente. Si el problema persiste:

  1. Reducir la frecuencia de llamadas desde Claude.
  2. Aumentar FREEMATICA_MAX_RETRIES (default 3) si los reintentos no son suficientes.
  3. Contactar a Freemática para revisar los límites de rate asignados a la cuenta.
Response truncated en freematica_export_asientos

El endpoint de exportación de asientos devuelve demasiados registros para un rango de fechas amplio. Pasos:

  1. Usar un rango de fechas más corto: en lugar de un trimestre, exportar mes a mes.
  2. Añadir filtros adicionales: filtrar por empresa, delegación o cuenta específica.
  3. Si el volumen esperado es grande por diseño, aumentar FREEMATICA_MAX_RESPONSE_SIZE_MB (default 10 MB).
El pre-commit hook falla al hacer git commit

Lint o formato detectaron errores en los ficheros staged. Pasos:

  1. Revisar el output del hook: indicará qué fichero y qué regla falló.
  2. Ejecutar npm run lint:fix y npm run format para corregir automáticamente.
  3. Hacer git add de los ficheros corregidos antes de volver a intentar el commit.

Desarrollo

npm install
npm run dev           # arranca con tsx (hot reload)
npm test              # ejecuta vitest una vez
npm run test:watch    # watcher
npm run test:coverage # coverage report
npm run lint
npm run lint:fix
npm run format
npm run typecheck
npm run build         # compila a dist/
npm start             # ejecuta dist/index.js

Testing

Tests unitarios e integración
# Ejecutar todos los tests
npm test

# Ejecutar con coverage report
npm test -- --coverage

# Ejecutar un archivo concreto
npm test -- tests/fiql-builder.property.test.ts

Los tests están en tests/ organizados por tipo:

  • tests/clients/ — tests de los clientes HTTP (con nock)
  • tests/schemas/ — tests de los schemas Zod
  • tests/tools/ — tests de los handlers MCP (unit + integration)
  • tests/fiql-builder.*.test.ts — tests unitarios y property-based del FIQL builder
  • tests/pagination-edge-cases.test.ts — edge cases del adapter de paginación
  • tests/coverage-gaps.test.ts — cobertura específica de ramas no cubiertas

Coverage thresholds (configurados en vitest.config.ts):

  • Global statements: ≥85%
  • src/clients/: ≥90%
  • src/schemas/: ≥90%
  • src/tools/: ≥85%
Testing manual con MCP Inspector

Para probar el servidor MCP de forma interactiva, usa MCP Inspector.

Ver instrucciones detalladas en docs/testing-e2e.md.

Endpoints HTTP

MétodoPathDescripción
POST/mcpJSON-RPC del MCP (envía initialize la primera vez)
GET/mcpStream SSE (requiere Mcp-Session-Id)
DELETE/mcpTerminar sesión
GET/healthHealthcheck

Seguridad

[!IMPORTANT] El endpoint /mcp no autentica al cliente. Cualquiera con acceso de red al puerto puede invocar las tools usando las credenciales de Freemática que el servidor tiene configuradas en sus variables de entorno. Como todas las tools son de solo lectura, esto equivale a acceso de lectura a los datos de la empresa (cartera, facturación, clientes, personal…).

Por tanto, al desplegar en modo HTTP:

  • Nunca expongas el puerto directamente a internet. Despliega siempre detrás de un gateway / reverse-proxy que haga la autenticación y autorización del cliente (es el modelo con el que opera Nubiia).
  • Restringe MCP_ALLOWED_ORIGINS al dominio exacto desde el que se conecta, en lugar del valor por defecto *. Si arrancas con *, el servidor emite un warning en el log. Ten en cuenta que CORS solo protege frente a navegadores; no frente a clientes como curl.
  • Trata las 5 credenciales FREEMATICA_AUTH_* como secretos. Inyéctalas vía gestor de secretos, nunca en el repositorio (.env* está en .gitignore).

Buenas prácticas ya incluidas en el servidor:

  • Los headers x-auth-* se eliminan de cualquier log (incluido debug/trace) y los bodies de petición nunca se loguean.
  • Rate limiting (120 req/min por IP) en /mcp y /health, límite de body de 1 MB, y expiración automática de sesiones inactivas.
  • Los valores de los filtros FIQL se escapan para prevenir inyección de operadores de consulta.

Cómo añadir una nueva operación

  1. Tipar la respuesta en src/types/<grupo>.ts.
  2. Añadir método al FreematicaClient (src/clients/freematica-client.ts):
     getContratosServicios(): Promise<VoContratosServicios[]> {
       return this.get<VoContratosServicios[]>('/pvss/v1/contratos-servicios');
     }
  3. Añadir server.tool(...) en src/tools/<grupo>.ts (o crear el archivo si el grupo es nuevo).
  4. Si el grupo es nuevo: registrar register<Grupo>Tools(server, client) en src/server.ts.
  5. Tests: un test del método del client (con nock) + un test del handler de la tool.

Patrón inspirado en mcp-nevent y mcp-holded.

Despliegue

Pensado para ejecutarse dentro de Nubiia. La plataforma se encarga del deploy y de inyectar las variables de entorno. Tienes 3 opciones:

Opción 1 — Instalar como paquete npm (recomendada)

El paquete se publica como @nubiia/mcp-freematica en el registry público de npm cuando se crea un tag v* en main.

# Instalar y ejecutar (no requiere autenticación)
npm install -g @nubiia/mcp-freematica
mcp-freematica   # binario instalado, lee env vars y arranca el server
Opción 2 — Docker
docker build -t mcp-freematica .
docker run --env-file .env -p 3000:3000 mcp-freematica
Opción 3 — Clone + build
git clone https://github.com/nubiia-dev/mcp-freematica.git
cd mcp-freematica
npm ci && npm run build
node dist/index.js

Publicar una nueva versión

  1. Bump de versión en package.json (semver).
  2. Commit + merge a main.
  3. Crear y empujar un tag con prefijo v:
     git tag v0.5.0
     git push origin v0.5.0
  4. El workflow .github/workflows/publish.yml se dispara, valida (lint + typecheck + test + build) y publica en npm.

Especificaciones y diseño

  • v0.1.0 spec: docs/superpowers/specs/2026-05-18-freematica-mcp-design.md (bootstrap inicial)
  • v0.1.0 plan: docs/superpowers/plans/2026-05-18-freematica-mcp.md
  • v0.2.0 spec: docs/superpowers/specs/2026-05-19-stdio-transport-design.md (stdio support)
  • v0.2.0 plan: docs/superpowers/plans/2026-05-19-stdio-transport.md
  • v0.3.0 spec: docs/superpowers/specs/2026-05-19-master-data-tool-design.md (master data tool)
  • v0.3.0 plan: docs/superpowers/plans/2026-05-19-master-data-tool.md
  • v0.4.0 spec: docs/superpowers/specs/2026-05-20-commercial-tools-design.md (commercial tools + envelope unwrap fix)
  • v0.4.0 plan: docs/superpowers/plans/2026-05-20-commercial-tools.md
  • v0.4.1: hotfix de catálogos delegaciones (endpoint cambiado a /agrupcod) y tipos-marcajes (eliminado — endpoint roto). Ver CHANGELOG.
  • ADRs de arquitectura: docs/adr/ (ver índice en ese directorio)
  • API: apidocs/Freematica API - Complete Collection.postman_collection.json
  • CHANGELOG: CHANGELOG.md

About Nubiia

This MCP server is built and maintained by Nubiia.

Nubiia ayuda a empresas a automatizar procesos e integrar sus herramientas con IA: servidores MCP a medida, integraciones con ERPs y CRMs (Freemática, Holded, Pipedrive…), y agentes que conectan tus datos de negocio con asistentes como Claude. Este @nubiia/mcp-freematica es un ejemplo open source de lo que hacemos.

👉 ¿Quieres una integración o automatización con IA para tu negocio? nubiia.es · ✉️ hola@nubiia.es

Author

Built by Nubiia — nubiia.es · hola@nubiia.es

Maintainer: Samuel Fraga — GitHub

Licencia

MIT — ver LICENSE.

Frequently asked questions

What is io.github.nubiia-dev/mcp-freematica?

Freemática ERP: invoicing, receivables, suppliers, accounting and HR through 300+ MCP tools

How do I install io.github.nubiia-dev/mcp-freematica?

It runs on your machine. In Claude Code: claude mcp add mcp-freematica -e 'FREEMATICA_AUTH_TOKEN=<your freematica_auth_token>' -e 'FREEMATICA_AUTH_COMPANY=<FREEMATICA_AUTH_COMPANY>' -e 'FREEMATICA_AUTH_ORGANIZATION=<FREEMATICA_AUTH_ORGANIZATION>' -e 'FREEMATICA_AUTH_APP=<FREEMATICA_AUTH_APP>' -e 'FREEMATICA_AUTH_SESSION=<your freematica_auth_session>' -e 'FREEMATICA_ENABLE_WRITES=false' -e 'FREEMATICA_BASE_URL=https://api-p01.clientservicepanel.com/restsat/api' -- npx -y @nubiia/mcp-freematica@0.11.2. For other clients, paste the JSON configuration from this page into their MCP settings.

Does io.github.nubiia-dev/mcp-freematica need an API key?

Yes. It expects FREEMATICA_AUTH_TOKEN, FREEMATICA_AUTH_COMPANY, FREEMATICA_AUTH_ORGANIZATION, FREEMATICA_AUTH_APP, FREEMATICA_AUTH_SESSION, which you set in its configuration.

Is io.github.nubiia-dev/mcp-freematica open source?

Yes. Its code is on GitHub under the MIT license.

Who maintains io.github.nubiia-dev/mcp-freematica?

It is published by nubiia-dev. AI.tn lists it but does not maintain or endorse it.

From the official MCP Registry. Listing is not an endorsement: review a server's code and permissions before giving it access to your data.