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.
Power your agent
The publisher's own command. Not a PlugMCP endpoint.
Host a copy with our keys and logs.
npx -y @nubiia/[email protected]Claude Code has no install link for a local command. Copy the command below and run it in a terminal.
FREEMATICA_AUTH_TOKEN=<secret> FREEMATICA_AUTH_COMPANY=<value> FREEMATICA_AUTH_ORGANIZATION=<value> FREEMATICA_AUTH_APP=<value> FREEMATICA_AUTH_SESSION=<secret> FREEMATICA_ENABLE_WRITES=<value> FREEMATICA_BASE_URL=<value> claude mcp add io.github.nubiia-dev-mcp-freematica -- npx -y @nubiia/mcp-freematica@0.11.2Run in a terminal.
{ "mcpServers": { "io.github.nubiia-dev-mcp-freematica": { "command": "npx", "args": [ "-y", "@nubiia/[email protected]" ], "env": { "FREEMATICA_AUTH_TOKEN": "<secret>", "FREEMATICA_AUTH_COMPANY": "<value>", "FREEMATICA_AUTH_ORGANIZATION": "<value>", "FREEMATICA_AUTH_APP": "<value>", "FREEMATICA_AUTH_SESSION": "<secret>", "FREEMATICA_ENABLE_WRITES": "<value>", "FREEMATICA_BASE_URL": "<value>" } } }}claude_desktop_config.json
Remote URL or a command on your machine? How the two installs differ
Run on PlugMCP
A new server you create. It is not this listing's official endpoint. Use the publisher install when you want their URL and their credentials.
LaunchFrom the publisher
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.
@modelcontextprotocol/sdk (stdio + Streamable HTTP transports)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).
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.
// 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'
src/clients/fiql-builder.ts).soloImpagados: true) se traducen automáticamente al operador FIQL correcto.// 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.'
El binario soporta dos transportes seleccionables. La selección sigue este orden de precedencia:
--transport=<modo>MCP_TRANSPORT=<modo>stdioEdita ~/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.
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=...
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".
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.
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.
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 >= 1porque el API real de Freemática tratapage=0como "devuelve TODO el dataset" (varios MB en endpoints grandes comoclientes). Verificado empíricamente.
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:
freematica_list_clientes(page=1, items=20) → encontrar el cliente que interesa.idReg de ese item.freematica_get_cliente(id="<idReg>") → detalle completo.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 opcionales para tuning de comportamiento en producción:
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).
.env.* en .gitignore (excepto .env.example).invalid_token en todas las llamadas. Renovarlas implica reiniciar el proceso (no hay refresh automático).Nubiia despliega el servidor MCP y se encarga de inyectar las variables de entorno. En el panel de Nubiia:
https://freematica-mcp.example.com/mcp).MCP_ALLOWED_ORIGINS al dominio exacto desde el que Claude/Nubiia conecta, no *.GET /health que el servidor está vivo antes de habilitar el MCP en Claude.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
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
# ...
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.
invalid_token en todas las llamadasLas credenciales x-auth-* han caducado o son incorrectas. Pasos:
FREEMATICA_AUTH_* están seteadas correctamente.network_error — upstream Freemática caídoEl API de Freemática no está respondiendo. Puede ser:
Circuit breaker opened).api-p01.clientservicepanel.com.Pasos:
circuitBreaker: "open" — si es así, esperar FREEMATICA_CIRCUIT_BREAKER_TIMEOUT_MS ms (default 30s) para que pase a half-open.curl https://api-p01.clientservicepanel.com/.FREEMATICA_TIMEOUT_MS si el upstream es lento (default 30s puede ser insuficiente en algunas redes).rate_limit_exceeded — throttling de FreemáticaFreemática devuelve 429. El MCP reintenta automáticamente honrando el header Retry-After si está presente. Si el problema persiste:
FREEMATICA_MAX_RETRIES (default 3) si los reintentos no son suficientes.Response truncated en freematica_export_asientosEl endpoint de exportación de asientos devuelve demasiados registros para un rango de fechas amplio. Pasos:
FREEMATICA_MAX_RESPONSE_SIZE_MB (default 10 MB).git commitLint o formato detectaron errores en los ficheros staged. Pasos:
npm run lint:fix y npm run format para corregir automáticamente.git add de los ficheros corregidos antes de volver a intentar el commit.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
# 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 Zodtests/tools/ — tests de los handlers MCP (unit + integration)tests/fiql-builder.*.test.ts — tests unitarios y property-based del FIQL buildertests/pagination-edge-cases.test.ts — edge cases del adapter de paginacióntests/coverage-gaps.test.ts — cobertura específica de ramas no cubiertasCoverage thresholds (configurados en vitest.config.ts):
Para probar el servidor MCP de forma interactiva, usa MCP Inspector.
Ver instrucciones detalladas en docs/testing-e2e.md.
[!IMPORTANT] El endpoint
/mcpno 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:
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.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:
x-auth-* se eliminan de cualquier log (incluido debug/trace)
y los bodies de petición nunca se loguean./mcp y /health, límite de body de
1 MB, y expiración automática de sesiones inactivas.src/types/<grupo>.ts.FreematicaClient (src/clients/freematica-client.ts):
getContratosServicios(): Promise<VoContratosServicios[]> {
return this.get<VoContratosServicios[]>('/pvss/v1/contratos-servicios');
}
server.tool(...) en src/tools/<grupo>.ts (o crear el archivo si el grupo es nuevo).register<Grupo>Tools(server, client) en src/server.ts.Patrón inspirado en mcp-nevent y mcp-holded.
Pensado para ejecutarse dentro de Nubiia. La plataforma se encarga del deploy y de inyectar las variables de entorno. Tienes 3 opciones:
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
docker build -t mcp-freematica .
docker run --env-file .env -p 3000:3000 mcp-freematica
git clone https://github.com/nubiia-dev/mcp-freematica.git
cd mcp-freematica
npm ci && npm run build
node dist/index.js
package.json (semver).main.v:
git tag v0.5.0
git push origin v0.5.0
.github/workflows/publish.yml se dispara, valida (lint + typecheck + test + build) y publica en npm.docs/superpowers/specs/2026-05-18-freematica-mcp-design.md (bootstrap inicial)docs/superpowers/plans/2026-05-18-freematica-mcp.mddocs/superpowers/specs/2026-05-19-stdio-transport-design.md (stdio support)docs/superpowers/plans/2026-05-19-stdio-transport.mddocs/superpowers/specs/2026-05-19-master-data-tool-design.md (master data tool)docs/superpowers/plans/2026-05-19-master-data-tool.mddocs/superpowers/specs/2026-05-20-commercial-tools-design.md (commercial tools + envelope unwrap fix)docs/superpowers/plans/2026-05-20-commercial-tools.mddelegaciones (endpoint cambiado a /agrupcod) y tipos-marcajes (eliminado — endpoint roto). Ver CHANGELOG.docs/adr/ (ver índice en ese directorio)apidocs/Freematica API - Complete Collection.postman_collection.jsonCHANGELOG.mdThis 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 · ✉️ [email protected]
Built by Nubiia — nubiia.es · [email protected]
Maintainer: Samuel Fraga — GitHub
MIT — ver LICENSE.
© 2026 MCP Directory.
Freemática ERP: invoicing, receivables, suppliers, accounting and HR through 300+ MCP tools
{ "mcpServers": { "io.github.nubiia-dev-mcp-freematica": { "command": "npx", "args": [ "-y", "@nubiia/[email protected]" ], "env": { "FREEMATICA_AUTH_TOKEN": "<secret>", "FREEMATICA_AUTH_COMPANY": "<value>", "FREEMATICA_AUTH_ORGANIZATION": "<value>", "FREEMATICA_AUTH_APP": "<value>", "FREEMATICA_AUTH_SESSION": "<secret>", "FREEMATICA_ENABLE_WRITES": "<value>", "FREEMATICA_BASE_URL": "<value>" } } }}Tools
No tool list yet. Remote servers get one after the first health check.
FAQ
Copy the stdio config for Cursor, Claude Desktop, Claude Code, or VS Code on this page. It uses the publisher's install, not a PlugMCP proxy.
The publisher lists these environment variables: FREEMATICA_AUTH_TOKEN, FREEMATICA_AUTH_COMPANY, FREEMATICA_AUTH_ORGANIZATION, FREEMATICA_AUTH_APP, FREEMATICA_AUTH_SESSION, FREEMATICA_ENABLE_WRITES, FREEMATICA_BASE_URL.
MCP Freematica runs locally over stdio.
Last checked 2026-11-10. Freemática ERP: invoicing, receivables, suppliers, accounting and HR through 300+ MCP tools