@nubiia/mcp-freematica 0.6.1 → 0.6.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +30 -0
- package/dist/config.d.ts +17 -78
- package/dist/index.js +2 -1
- package/dist/index.js.map +1 -1
- package/dist/schemas/cartera.d.ts +10 -2
- package/dist/schemas/facturas-electronicas.d.ts +5 -1
- package/dist/schemas/filters.d.ts +3 -37
- package/dist/schemas/master-data.d.ts +26 -1
- package/dist/schemas/pedidos-compras.d.ts +10 -2
- package/dist/server.js +2 -1
- package/dist/server.js.map +1 -1
- package/dist/tools/prl.d.ts +2 -22
- package/dist/tools/prl.js +1 -1
- package/dist/transports/http.js +12 -2
- package/dist/transports/http.js.map +1 -1
- package/dist/version.d.ts +1 -0
- package/dist/version.js +27 -0
- package/dist/version.js.map +1 -0
- package/package.json +5 -5
package/README.md
CHANGED
|
@@ -409,6 +409,36 @@ Ver instrucciones detalladas en [docs/testing-e2e.md](docs/testing-e2e.md).
|
|
|
409
409
|
| DELETE | `/mcp` | Terminar sesión |
|
|
410
410
|
| GET | `/health` | Healthcheck |
|
|
411
411
|
|
|
412
|
+
## Seguridad
|
|
413
|
+
|
|
414
|
+
> [!IMPORTANT]
|
|
415
|
+
> **El endpoint `/mcp` no autentica al cliente.** Cualquiera con acceso de red al
|
|
416
|
+
> puerto puede invocar las tools usando las credenciales de Freemática que el
|
|
417
|
+
> servidor tiene configuradas en sus variables de entorno. Como todas las tools
|
|
418
|
+
> son de **solo lectura**, esto equivale a acceso de lectura a los datos de la
|
|
419
|
+
> empresa (cartera, facturación, clientes, personal…).
|
|
420
|
+
|
|
421
|
+
Por tanto, al desplegar en modo HTTP:
|
|
422
|
+
|
|
423
|
+
- **Nunca expongas el puerto directamente a internet.** Despliega siempre detrás
|
|
424
|
+
de un gateway / reverse-proxy que haga la autenticación y autorización del
|
|
425
|
+
cliente (es el modelo con el que opera Nubiia).
|
|
426
|
+
- **Restringe `MCP_ALLOWED_ORIGINS`** al dominio exacto desde el que se conecta,
|
|
427
|
+
en lugar del valor por defecto `*`. Si arrancas con `*`, el servidor emite un
|
|
428
|
+
warning en el log. Ten en cuenta que CORS solo protege frente a navegadores;
|
|
429
|
+
no frente a clientes como `curl`.
|
|
430
|
+
- **Trata las 5 credenciales `FREEMATICA_AUTH_*` como secretos.** Inyéctalas vía
|
|
431
|
+
gestor de secretos, nunca en el repositorio (`.env*` está en `.gitignore`).
|
|
432
|
+
|
|
433
|
+
Buenas prácticas ya incluidas en el servidor:
|
|
434
|
+
|
|
435
|
+
- Los headers `x-auth-*` se eliminan de cualquier log (incluido `debug`/`trace`)
|
|
436
|
+
y los bodies de petición nunca se loguean.
|
|
437
|
+
- Rate limiting (120 req/min por IP) en `/mcp` y `/health`, límite de body de
|
|
438
|
+
1 MB, y expiración automática de sesiones inactivas.
|
|
439
|
+
- Los valores de los filtros FIQL se escapan para prevenir inyección de
|
|
440
|
+
operadores de consulta.
|
|
441
|
+
|
|
412
442
|
## Cómo añadir una nueva operación
|
|
413
443
|
|
|
414
444
|
1. **Tipar la respuesta** en `src/types/<grupo>.ts`.
|
package/dist/config.d.ts
CHANGED
|
@@ -6,31 +6,11 @@ declare const AuthConfigSchema: z.ZodObject<{
|
|
|
6
6
|
FREEMATICA_AUTH_ORGANIZATION: z.ZodString;
|
|
7
7
|
FREEMATICA_AUTH_APP: z.ZodString;
|
|
8
8
|
FREEMATICA_AUTH_SESSION: z.ZodString;
|
|
9
|
-
},
|
|
10
|
-
FREEMATICA_BASE_URL: string;
|
|
11
|
-
FREEMATICA_AUTH_TOKEN: string;
|
|
12
|
-
FREEMATICA_AUTH_COMPANY: string;
|
|
13
|
-
FREEMATICA_AUTH_ORGANIZATION: string;
|
|
14
|
-
FREEMATICA_AUTH_APP: string;
|
|
15
|
-
FREEMATICA_AUTH_SESSION: string;
|
|
16
|
-
}, {
|
|
17
|
-
FREEMATICA_AUTH_TOKEN: string;
|
|
18
|
-
FREEMATICA_AUTH_COMPANY: string;
|
|
19
|
-
FREEMATICA_AUTH_ORGANIZATION: string;
|
|
20
|
-
FREEMATICA_AUTH_APP: string;
|
|
21
|
-
FREEMATICA_AUTH_SESSION: string;
|
|
22
|
-
FREEMATICA_BASE_URL?: string | undefined;
|
|
23
|
-
}>;
|
|
9
|
+
}, z.core.$strip>;
|
|
24
10
|
declare const HttpConfigSchema: z.ZodObject<{
|
|
25
|
-
MCP_PORT: z.ZodDefault<z.
|
|
11
|
+
MCP_PORT: z.ZodDefault<z.ZodCoercedNumber<unknown>>;
|
|
26
12
|
MCP_ALLOWED_ORIGINS: z.ZodDefault<z.ZodString>;
|
|
27
|
-
},
|
|
28
|
-
MCP_PORT: number;
|
|
29
|
-
MCP_ALLOWED_ORIGINS: string;
|
|
30
|
-
}, {
|
|
31
|
-
MCP_PORT?: number | undefined;
|
|
32
|
-
MCP_ALLOWED_ORIGINS?: string | undefined;
|
|
33
|
-
}>;
|
|
13
|
+
}, z.core.$strip>;
|
|
34
14
|
/**
|
|
35
15
|
* Configuración de hardening del cliente HTTP.
|
|
36
16
|
*
|
|
@@ -38,61 +18,20 @@ declare const HttpConfigSchema: z.ZodObject<{
|
|
|
38
18
|
* configuración explícita en la mayoría de los entornos.
|
|
39
19
|
*/
|
|
40
20
|
declare const HardeningConfigSchema: z.ZodObject<{
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
* Por defecto: info.
|
|
56
|
-
*/
|
|
57
|
-
LOG_LEVEL: z.ZodDefault<z.ZodEnum<["trace", "debug", "info", "warn", "error", "fatal"]>>;
|
|
58
|
-
/**
|
|
59
|
-
* Número de fallos consecutivos antes de abrir el circuit breaker.
|
|
60
|
-
* Por defecto: 5.
|
|
61
|
-
*/
|
|
62
|
-
FREEMATICA_CIRCUIT_BREAKER_THRESHOLD: z.ZodDefault<z.ZodNumber>;
|
|
63
|
-
/**
|
|
64
|
-
* Tiempo en ms que el circuit breaker permanece abierto antes de pasar
|
|
65
|
-
* a half-open para intentar recuperarse.
|
|
66
|
-
* Por defecto: 30000 (30 segundos).
|
|
67
|
-
*/
|
|
68
|
-
FREEMATICA_CIRCUIT_BREAKER_TIMEOUT_MS: z.ZodDefault<z.ZodNumber>;
|
|
69
|
-
/**
|
|
70
|
-
* Tamaño máximo de respuesta aceptado por freematica_export_asientos en
|
|
71
|
-
* megabytes. Si la respuesta del API supera este umbral, los datos se
|
|
72
|
-
* truncan y se añade un campo `warning` a la respuesta de la tool.
|
|
73
|
-
*
|
|
74
|
-
* Se recomienda usar rangos de fecha cortos (max. 1 mes) para evitar
|
|
75
|
-
* alcanzar este límite.
|
|
76
|
-
*
|
|
77
|
-
* Por defecto: 10 (10 MB).
|
|
78
|
-
* Mínimo: 1 MB. Máximo: 500 MB.
|
|
79
|
-
*/
|
|
80
|
-
FREEMATICA_MAX_RESPONSE_SIZE_MB: z.ZodDefault<z.ZodNumber>;
|
|
81
|
-
}, "strip", z.ZodTypeAny, {
|
|
82
|
-
FREEMATICA_TIMEOUT_MS: number;
|
|
83
|
-
FREEMATICA_MAX_RETRIES: number;
|
|
84
|
-
LOG_LEVEL: "trace" | "debug" | "info" | "warn" | "error" | "fatal";
|
|
85
|
-
FREEMATICA_CIRCUIT_BREAKER_THRESHOLD: number;
|
|
86
|
-
FREEMATICA_CIRCUIT_BREAKER_TIMEOUT_MS: number;
|
|
87
|
-
FREEMATICA_MAX_RESPONSE_SIZE_MB: number;
|
|
88
|
-
}, {
|
|
89
|
-
FREEMATICA_TIMEOUT_MS?: number | undefined;
|
|
90
|
-
FREEMATICA_MAX_RETRIES?: number | undefined;
|
|
91
|
-
LOG_LEVEL?: "trace" | "debug" | "info" | "warn" | "error" | "fatal" | undefined;
|
|
92
|
-
FREEMATICA_CIRCUIT_BREAKER_THRESHOLD?: number | undefined;
|
|
93
|
-
FREEMATICA_CIRCUIT_BREAKER_TIMEOUT_MS?: number | undefined;
|
|
94
|
-
FREEMATICA_MAX_RESPONSE_SIZE_MB?: number | undefined;
|
|
95
|
-
}>;
|
|
21
|
+
FREEMATICA_TIMEOUT_MS: z.ZodDefault<z.ZodCoercedNumber<unknown>>;
|
|
22
|
+
FREEMATICA_MAX_RETRIES: z.ZodDefault<z.ZodCoercedNumber<unknown>>;
|
|
23
|
+
LOG_LEVEL: z.ZodDefault<z.ZodEnum<{
|
|
24
|
+
error: "error";
|
|
25
|
+
trace: "trace";
|
|
26
|
+
debug: "debug";
|
|
27
|
+
info: "info";
|
|
28
|
+
warn: "warn";
|
|
29
|
+
fatal: "fatal";
|
|
30
|
+
}>>;
|
|
31
|
+
FREEMATICA_CIRCUIT_BREAKER_THRESHOLD: z.ZodDefault<z.ZodCoercedNumber<unknown>>;
|
|
32
|
+
FREEMATICA_CIRCUIT_BREAKER_TIMEOUT_MS: z.ZodDefault<z.ZodCoercedNumber<unknown>>;
|
|
33
|
+
FREEMATICA_MAX_RESPONSE_SIZE_MB: z.ZodDefault<z.ZodCoercedNumber<unknown>>;
|
|
34
|
+
}, z.core.$strip>;
|
|
96
35
|
export type AuthConfig = z.infer<typeof AuthConfigSchema>;
|
|
97
36
|
export type HttpConfig = z.infer<typeof HttpConfigSchema>;
|
|
98
37
|
export type HardeningConfig = z.infer<typeof HardeningConfigSchema>;
|
package/dist/index.js
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
import { loadAuthConfig } from './config.js';
|
|
3
3
|
import { FreematicaClient } from './clients/freematica-client.js';
|
|
4
|
+
import { VERSION } from './version.js';
|
|
4
5
|
function parseArg(name) {
|
|
5
6
|
const prefix = `--${name}=`;
|
|
6
7
|
const arg = process.argv.find((a) => a.startsWith(prefix));
|
|
@@ -44,7 +45,7 @@ async function main() {
|
|
|
44
45
|
if (TRANSPORT !== 'stdio') {
|
|
45
46
|
console.error(`[freematica-mcp] Unknown transport "${TRANSPORT}". Valid: stdio, http. Defaulting to stdio.`);
|
|
46
47
|
}
|
|
47
|
-
console.error(`[freematica-mcp] Starting stdio transport
|
|
48
|
+
console.error(`[freematica-mcp] Starting stdio transport v${VERSION} | base=${auth.FREEMATICA_BASE_URL}`);
|
|
48
49
|
const { startStdio } = await import('./transports/stdio.js');
|
|
49
50
|
await startStdio({ client });
|
|
50
51
|
}
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAC7C,OAAO,EAAE,gBAAgB,EAAE,MAAM,gCAAgC,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -7,7 +7,11 @@ import { z } from 'zod';
|
|
|
7
7
|
* - `cancelado` → `CARCL_SITCAR==2`
|
|
8
8
|
* - `derivado` → `CARCL_SITCAR==3`
|
|
9
9
|
*/
|
|
10
|
-
export declare const EstadoCarteraEnum: z.ZodEnum<
|
|
10
|
+
export declare const EstadoCarteraEnum: z.ZodEnum<{
|
|
11
|
+
pendiente: "pendiente";
|
|
12
|
+
cancelado: "cancelado";
|
|
13
|
+
derivado: "derivado";
|
|
14
|
+
}>;
|
|
11
15
|
export type EstadoCartera = z.infer<typeof EstadoCarteraEnum>;
|
|
12
16
|
/** Mapa de enum lógico → valor numérico FIQL en `CARCL_SITCAR`. */
|
|
13
17
|
export declare const ESTADO_CARTERA_FIQL_MAP: Record<EstadoCartera, string>;
|
|
@@ -45,7 +49,11 @@ export declare const ListCarteraFiltersSchema: {
|
|
|
45
49
|
fechaDocHasta: z.ZodOptional<z.ZodString>;
|
|
46
50
|
fechaVencimientoDesde: z.ZodOptional<z.ZodString>;
|
|
47
51
|
fechaVencimientoHasta: z.ZodOptional<z.ZodString>;
|
|
48
|
-
estado: z.ZodOptional<z.ZodEnum<
|
|
52
|
+
estado: z.ZodOptional<z.ZodEnum<{
|
|
53
|
+
pendiente: "pendiente";
|
|
54
|
+
cancelado: "cancelado";
|
|
55
|
+
derivado: "derivado";
|
|
56
|
+
}>>;
|
|
49
57
|
soloImpagados: z.ZodOptional<z.ZodBoolean>;
|
|
50
58
|
referencia: z.ZodOptional<z.ZodString>;
|
|
51
59
|
page: z.ZodDefault<z.ZodNumber>;
|
|
@@ -52,7 +52,11 @@ export type ListFacturasElectronicasFilters = {
|
|
|
52
52
|
*/
|
|
53
53
|
export declare const ListFacturasDocumentosFiltersSchema: {
|
|
54
54
|
documents: z.ZodOptional<z.ZodString>;
|
|
55
|
-
documentType: z.ZodOptional<z.ZodEnum<
|
|
55
|
+
documentType: z.ZodOptional<z.ZodEnum<{
|
|
56
|
+
PDF: "PDF";
|
|
57
|
+
XML: "XML";
|
|
58
|
+
ERROR: "ERROR";
|
|
59
|
+
}>>;
|
|
56
60
|
};
|
|
57
61
|
export type ListFacturasDocumentosFilters = {
|
|
58
62
|
documents?: string;
|
|
@@ -14,13 +14,7 @@ import { z } from 'zod';
|
|
|
14
14
|
export declare const DateRangeSchema: z.ZodObject<{
|
|
15
15
|
fechaDesde: z.ZodOptional<z.ZodString>;
|
|
16
16
|
fechaHasta: z.ZodOptional<z.ZodString>;
|
|
17
|
-
},
|
|
18
|
-
fechaDesde?: string | undefined;
|
|
19
|
-
fechaHasta?: string | undefined;
|
|
20
|
-
}, {
|
|
21
|
-
fechaDesde?: string | undefined;
|
|
22
|
-
fechaHasta?: string | undefined;
|
|
23
|
-
}>;
|
|
17
|
+
}, z.core.$strip>;
|
|
24
18
|
export type DateRange = z.infer<typeof DateRangeSchema>;
|
|
25
19
|
/**
|
|
26
20
|
* Filtros de identidad para entidades de Freemática.
|
|
@@ -37,17 +31,7 @@ export declare const IdentityFiltersSchema: z.ZodObject<{
|
|
|
37
31
|
grupoCliente: z.ZodOptional<z.ZodString>;
|
|
38
32
|
codProveedor: z.ZodOptional<z.ZodString>;
|
|
39
33
|
grupoProveedor: z.ZodOptional<z.ZodString>;
|
|
40
|
-
},
|
|
41
|
-
codProveedor?: string | undefined;
|
|
42
|
-
codCliente?: string | undefined;
|
|
43
|
-
grupoCliente?: string | undefined;
|
|
44
|
-
grupoProveedor?: string | undefined;
|
|
45
|
-
}, {
|
|
46
|
-
codProveedor?: string | undefined;
|
|
47
|
-
codCliente?: string | undefined;
|
|
48
|
-
grupoCliente?: string | undefined;
|
|
49
|
-
grupoProveedor?: string | undefined;
|
|
50
|
-
}>;
|
|
34
|
+
}, z.core.$strip>;
|
|
51
35
|
export type IdentityFilters = z.infer<typeof IdentityFiltersSchema>;
|
|
52
36
|
/**
|
|
53
37
|
* Schema base para tools que necesitan paginación + rango de fechas + filtros
|
|
@@ -70,23 +54,5 @@ export declare const BaseFiltersSchema: z.ZodObject<{
|
|
|
70
54
|
fechaHasta: z.ZodOptional<z.ZodString>;
|
|
71
55
|
page: z.ZodDefault<z.ZodNumber>;
|
|
72
56
|
items: z.ZodDefault<z.ZodNumber>;
|
|
73
|
-
},
|
|
74
|
-
page: number;
|
|
75
|
-
items: number;
|
|
76
|
-
codProveedor?: string | undefined;
|
|
77
|
-
codCliente?: string | undefined;
|
|
78
|
-
fechaDesde?: string | undefined;
|
|
79
|
-
fechaHasta?: string | undefined;
|
|
80
|
-
grupoCliente?: string | undefined;
|
|
81
|
-
grupoProveedor?: string | undefined;
|
|
82
|
-
}, {
|
|
83
|
-
codProveedor?: string | undefined;
|
|
84
|
-
codCliente?: string | undefined;
|
|
85
|
-
page?: number | undefined;
|
|
86
|
-
items?: number | undefined;
|
|
87
|
-
fechaDesde?: string | undefined;
|
|
88
|
-
fechaHasta?: string | undefined;
|
|
89
|
-
grupoCliente?: string | undefined;
|
|
90
|
-
grupoProveedor?: string | undefined;
|
|
91
|
-
}>;
|
|
57
|
+
}, z.core.$strip>;
|
|
92
58
|
export type BaseFilters = z.infer<typeof BaseFiltersSchema>;
|
|
@@ -15,7 +15,32 @@ import { z } from 'zod';
|
|
|
15
15
|
*/
|
|
16
16
|
export declare const MASTER_DATA_CATALOGS: readonly ["tipos-contrato", "tipo-instalacion", "clases-servicios", "tipos-casos", "subtipos-casos", "tipos-oportunidad-negocio", "tipos-impuestos", "naturalezas-abono", "incidencecode", "claves-facturacion", "paises", "nacionalidades", "provincias", "poblaciones", "empresas", "delegaciones", "lineas-negocio", "cargos-clientes", "calendarios", "series", "familias", "subfamilias", "lineas", "bancos"];
|
|
17
17
|
export type MasterDataCatalog = typeof MASTER_DATA_CATALOGS[number];
|
|
18
|
-
export declare const MasterDataCatalogSchema: z.ZodEnum<
|
|
18
|
+
export declare const MasterDataCatalogSchema: z.ZodEnum<{
|
|
19
|
+
"tipos-contrato": "tipos-contrato";
|
|
20
|
+
"tipo-instalacion": "tipo-instalacion";
|
|
21
|
+
"clases-servicios": "clases-servicios";
|
|
22
|
+
"tipos-casos": "tipos-casos";
|
|
23
|
+
"subtipos-casos": "subtipos-casos";
|
|
24
|
+
"tipos-oportunidad-negocio": "tipos-oportunidad-negocio";
|
|
25
|
+
"tipos-impuestos": "tipos-impuestos";
|
|
26
|
+
"naturalezas-abono": "naturalezas-abono";
|
|
27
|
+
incidencecode: "incidencecode";
|
|
28
|
+
"claves-facturacion": "claves-facturacion";
|
|
29
|
+
paises: "paises";
|
|
30
|
+
nacionalidades: "nacionalidades";
|
|
31
|
+
provincias: "provincias";
|
|
32
|
+
poblaciones: "poblaciones";
|
|
33
|
+
empresas: "empresas";
|
|
34
|
+
delegaciones: "delegaciones";
|
|
35
|
+
"lineas-negocio": "lineas-negocio";
|
|
36
|
+
"cargos-clientes": "cargos-clientes";
|
|
37
|
+
calendarios: "calendarios";
|
|
38
|
+
series: "series";
|
|
39
|
+
familias: "familias";
|
|
40
|
+
subfamilias: "subfamilias";
|
|
41
|
+
lineas: "lineas";
|
|
42
|
+
bancos: "bancos";
|
|
43
|
+
}>;
|
|
19
44
|
/**
|
|
20
45
|
* Mapeo catálogo → endpoint REST de Freemática.
|
|
21
46
|
*
|
|
@@ -27,7 +27,11 @@ import { z } from 'zod';
|
|
|
27
27
|
*
|
|
28
28
|
* TODO(TD-152): verificar contra API real cuando esté disponible.
|
|
29
29
|
*/
|
|
30
|
-
export declare const EstadoPedidoEnum: z.ZodEnum<
|
|
30
|
+
export declare const EstadoPedidoEnum: z.ZodEnum<{
|
|
31
|
+
pendiente: "pendiente";
|
|
32
|
+
bloqueado: "bloqueado";
|
|
33
|
+
recibido: "recibido";
|
|
34
|
+
}>;
|
|
31
35
|
export type EstadoPedido = z.infer<typeof EstadoPedidoEnum>;
|
|
32
36
|
/**
|
|
33
37
|
* Genera la expresión FIQL para el filtro de estado de pedido de compra.
|
|
@@ -82,7 +86,11 @@ export declare const ListPedidosCompraFiltersSchema: {
|
|
|
82
86
|
fechaEntregaDesde: z.ZodOptional<z.ZodString>;
|
|
83
87
|
fechaEntregaHasta: z.ZodOptional<z.ZodString>;
|
|
84
88
|
referencia: z.ZodOptional<z.ZodString>;
|
|
85
|
-
estado: z.ZodOptional<z.ZodEnum<
|
|
89
|
+
estado: z.ZodOptional<z.ZodEnum<{
|
|
90
|
+
pendiente: "pendiente";
|
|
91
|
+
bloqueado: "bloqueado";
|
|
92
|
+
recibido: "recibido";
|
|
93
|
+
}>>;
|
|
86
94
|
page: z.ZodDefault<z.ZodNumber>;
|
|
87
95
|
items: z.ZodDefault<z.ZodNumber>;
|
|
88
96
|
};
|
package/dist/server.js
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
2
2
|
import { FREEMATICA_MCP_INSTRUCTIONS } from './server-instructions.js';
|
|
3
|
+
import { VERSION } from './version.js';
|
|
3
4
|
import { registerAlbaranesTools } from './tools/albaranes.js';
|
|
4
5
|
import { registerCalendariosTools } from './tools/calendarios.js';
|
|
5
6
|
import { registerCarteraTools } from './tools/cartera.js';
|
|
@@ -18,7 +19,7 @@ import { registerPersonalTools } from './tools/personal.js';
|
|
|
18
19
|
import { registerPrlTools } from './tools/prl.js';
|
|
19
20
|
import { registerProveedoresTools } from './tools/proveedores.js';
|
|
20
21
|
export function createFreematicaServer(opts) {
|
|
21
|
-
const server = new McpServer({ name: 'freematica-mcp', version:
|
|
22
|
+
const server = new McpServer({ name: 'freematica-mcp', version: VERSION }, { instructions: FREEMATICA_MCP_INSTRUCTIONS });
|
|
22
23
|
registerContratosTools(server, opts.client);
|
|
23
24
|
registerMasterDataTools(server, opts.client);
|
|
24
25
|
registerClientesTools(server, opts.client);
|
package/dist/server.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAEpE,OAAO,EAAE,2BAA2B,EAAE,MAAM,0BAA0B,CAAC;AACvE,OAAO,EAAE,sBAAsB,EAAE,MAAM,sBAAsB,CAAC;AAC9D,OAAO,EAAE,wBAAwB,EAAE,MAAM,wBAAwB,CAAC;AAClE,OAAO,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAC1D,OAAO,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AAC5D,OAAO,EAAE,8BAA8B,EAAE,MAAM,+BAA+B,CAAC;AAC/E,OAAO,EAAE,yBAAyB,EAAE,MAAM,yBAAyB,CAAC;AACpE,OAAO,EAAE,sBAAsB,EAAE,MAAM,sBAAsB,CAAC;AAC9D,OAAO,EAAE,4BAA4B,EAAE,MAAM,6BAA6B,CAAC;AAC3E,OAAO,EAAE,iCAAiC,EAAE,MAAM,kCAAkC,CAAC;AACrF,OAAO,EAAE,2BAA2B,EAAE,MAAM,4BAA4B,CAAC;AACzE,OAAO,EAAE,2BAA2B,EAAE,MAAM,2BAA2B,CAAC;AACxE,OAAO,EAAE,uBAAuB,EAAE,MAAM,wBAAwB,CAAC;AACjE,OAAO,EAAE,iCAAiC,EAAE,MAAM,kCAAkC,CAAC;AACrF,OAAO,EAAE,2BAA2B,EAAE,MAAM,4BAA4B,CAAC;AACzE,OAAO,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AAC5D,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAClD,OAAO,EAAE,wBAAwB,EAAE,MAAM,wBAAwB,CAAC;AAMlE,MAAM,UAAU,sBAAsB,CAAC,IAAmC;IACxE,MAAM,MAAM,GAAG,IAAI,SAAS,CAC1B,EAAE,IAAI,EAAE,gBAAgB,EAAE,OAAO,EAAE,OAAO,EAAE,EAC5C,EAAE,YAAY,EAAE,2BAA2B,EAAE,CAC9C,CAAC;IAEF,sBAAsB,CAAC,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;IAC5C,uBAAuB,CAAC,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;IAC7C,qBAAqB,CAAC,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;IAC3C,8BAA8B,CAAC,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;IACpD,iCAAiC,CAAC,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;IACvD,oBAAoB,CAAC,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;IAC1C,2BAA2B,CAAC,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;IACjD,4BAA4B,CAAC,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;IAClD,2BAA2B,CAAC,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;IACjD,wBAAwB,CAAC,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;IAC9C,2BAA2B,CAAC,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;IACjD,yBAAyB,CAAC,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;IAC/C,gBAAgB,CAAC,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;IACtC,qBAAqB,CAAC,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;IAC3C,wBAAwB,CAAC,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;IAC9C,iCAAiC,CAAC,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;IACvD,sBAAsB,CAAC,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;IAE5C,OAAO,MAAM,CAAC;AAChB,CAAC"}
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAEpE,OAAO,EAAE,2BAA2B,EAAE,MAAM,0BAA0B,CAAC;AACvE,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACvC,OAAO,EAAE,sBAAsB,EAAE,MAAM,sBAAsB,CAAC;AAC9D,OAAO,EAAE,wBAAwB,EAAE,MAAM,wBAAwB,CAAC;AAClE,OAAO,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAC1D,OAAO,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AAC5D,OAAO,EAAE,8BAA8B,EAAE,MAAM,+BAA+B,CAAC;AAC/E,OAAO,EAAE,yBAAyB,EAAE,MAAM,yBAAyB,CAAC;AACpE,OAAO,EAAE,sBAAsB,EAAE,MAAM,sBAAsB,CAAC;AAC9D,OAAO,EAAE,4BAA4B,EAAE,MAAM,6BAA6B,CAAC;AAC3E,OAAO,EAAE,iCAAiC,EAAE,MAAM,kCAAkC,CAAC;AACrF,OAAO,EAAE,2BAA2B,EAAE,MAAM,4BAA4B,CAAC;AACzE,OAAO,EAAE,2BAA2B,EAAE,MAAM,2BAA2B,CAAC;AACxE,OAAO,EAAE,uBAAuB,EAAE,MAAM,wBAAwB,CAAC;AACjE,OAAO,EAAE,iCAAiC,EAAE,MAAM,kCAAkC,CAAC;AACrF,OAAO,EAAE,2BAA2B,EAAE,MAAM,4BAA4B,CAAC;AACzE,OAAO,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AAC5D,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAClD,OAAO,EAAE,wBAAwB,EAAE,MAAM,wBAAwB,CAAC;AAMlE,MAAM,UAAU,sBAAsB,CAAC,IAAmC;IACxE,MAAM,MAAM,GAAG,IAAI,SAAS,CAC1B,EAAE,IAAI,EAAE,gBAAgB,EAAE,OAAO,EAAE,OAAO,EAAE,EAC5C,EAAE,YAAY,EAAE,2BAA2B,EAAE,CAC9C,CAAC;IAEF,sBAAsB,CAAC,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;IAC5C,uBAAuB,CAAC,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;IAC7C,qBAAqB,CAAC,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;IAC3C,8BAA8B,CAAC,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;IACpD,iCAAiC,CAAC,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;IACvD,oBAAoB,CAAC,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;IAC1C,2BAA2B,CAAC,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;IACjD,4BAA4B,CAAC,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;IAClD,2BAA2B,CAAC,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;IACjD,wBAAwB,CAAC,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;IAC9C,2BAA2B,CAAC,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;IACjD,yBAAyB,CAAC,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;IAC/C,gBAAgB,CAAC,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;IACtC,qBAAqB,CAAC,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;IAC3C,wBAAwB,CAAC,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;IAC9C,iCAAiC,CAAC,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;IACvD,sBAAsB,CAAC,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;IAE5C,OAAO,MAAM,CAAC;AAChB,CAAC"}
|
package/dist/tools/prl.d.ts
CHANGED
|
@@ -7,32 +7,12 @@ import type { FreematicaClient } from '../clients/freematica-client.js';
|
|
|
7
7
|
* Se usa en los tests y dentro del handler. NO se pasa directamente a server.tool
|
|
8
8
|
* porque ZodEffects no es ZodRawShapeCompat.
|
|
9
9
|
*/
|
|
10
|
-
export declare const FichaPrevClienteRefinedSchema: z.
|
|
10
|
+
export declare const FichaPrevClienteRefinedSchema: z.ZodObject<{
|
|
11
11
|
codCliente: z.ZodOptional<z.ZodString>;
|
|
12
12
|
grupoCliente: z.ZodOptional<z.ZodNumber>;
|
|
13
13
|
codLocalizacionServicio: z.ZodOptional<z.ZodNumber>;
|
|
14
14
|
codigoFicha: z.ZodOptional<z.ZodString>;
|
|
15
|
-
},
|
|
16
|
-
codCliente?: string | undefined;
|
|
17
|
-
grupoCliente?: number | undefined;
|
|
18
|
-
codLocalizacionServicio?: number | undefined;
|
|
19
|
-
codigoFicha?: string | undefined;
|
|
20
|
-
}, {
|
|
21
|
-
codCliente?: string | undefined;
|
|
22
|
-
grupoCliente?: number | undefined;
|
|
23
|
-
codLocalizacionServicio?: number | undefined;
|
|
24
|
-
codigoFicha?: string | undefined;
|
|
25
|
-
}>, {
|
|
26
|
-
codCliente?: string | undefined;
|
|
27
|
-
grupoCliente?: number | undefined;
|
|
28
|
-
codLocalizacionServicio?: number | undefined;
|
|
29
|
-
codigoFicha?: string | undefined;
|
|
30
|
-
}, {
|
|
31
|
-
codCliente?: string | undefined;
|
|
32
|
-
grupoCliente?: number | undefined;
|
|
33
|
-
codLocalizacionServicio?: number | undefined;
|
|
34
|
-
codigoFicha?: string | undefined;
|
|
35
|
-
}>;
|
|
15
|
+
}, z.core.$strip>;
|
|
36
16
|
/**
|
|
37
17
|
* Registra las tools MCP del dominio PRL (Prevención de Riesgos Laborales).
|
|
38
18
|
*
|
package/dist/tools/prl.js
CHANGED
|
@@ -176,7 +176,7 @@ export function registerPrlTools(server, client) {
|
|
|
176
176
|
codigoFicha,
|
|
177
177
|
});
|
|
178
178
|
if (!validation.success) {
|
|
179
|
-
const msg = validation.error.
|
|
179
|
+
const msg = validation.error.issues.map((e) => e.message).join('; ');
|
|
180
180
|
return error(new Error(msg));
|
|
181
181
|
}
|
|
182
182
|
try {
|
package/dist/transports/http.js
CHANGED
|
@@ -5,6 +5,8 @@ import { randomUUID } from 'node:crypto';
|
|
|
5
5
|
import { StreamableHTTPServerTransport } from '@modelcontextprotocol/sdk/server/streamableHttp.js';
|
|
6
6
|
import { isInitializeRequest } from '@modelcontextprotocol/sdk/types.js';
|
|
7
7
|
import { createFreematicaServer } from '../server.js';
|
|
8
|
+
import { VERSION } from '../version.js';
|
|
9
|
+
import { logger } from '../logger.js';
|
|
8
10
|
const SESSION_TTL_MS = 30 * 60 * 1000; // 30 min
|
|
9
11
|
export async function createHttpApp(config) {
|
|
10
12
|
const app = express();
|
|
@@ -12,6 +14,14 @@ export async function createHttpApp(config) {
|
|
|
12
14
|
const origins = config.allowedOrigins === '*'
|
|
13
15
|
? true
|
|
14
16
|
: config.allowedOrigins.split(',').map((s) => s.trim());
|
|
17
|
+
// Aviso de seguridad: el endpoint /mcp no autentica al cliente. Un CORS
|
|
18
|
+
// abierto en transporte HTTP amplía la superficie expuesta a navegadores.
|
|
19
|
+
// En producción, restringir MCP_ALLOWED_ORIGINS y desplegar SIEMPRE detrás
|
|
20
|
+
// de un gateway/reverse-proxy con autenticación.
|
|
21
|
+
if (origins === true) {
|
|
22
|
+
logger.warn({ allowedOrigins: '*' }, 'MCP_ALLOWED_ORIGINS="*": el endpoint /mcp acepta cualquier origen y NO autentica al cliente. ' +
|
|
23
|
+
'No lo expongas directamente a internet sin un gateway con autenticación delante.');
|
|
24
|
+
}
|
|
15
25
|
app.use(cors({
|
|
16
26
|
origin: origins,
|
|
17
27
|
exposedHeaders: ['Mcp-Session-Id'],
|
|
@@ -24,8 +34,8 @@ export async function createHttpApp(config) {
|
|
|
24
34
|
standardHeaders: true,
|
|
25
35
|
legacyHeaders: false,
|
|
26
36
|
});
|
|
27
|
-
app.get('/health', (_req, res) => {
|
|
28
|
-
res.json({ status: 'ok', version:
|
|
37
|
+
app.get('/health', mcpRateLimit, (_req, res) => {
|
|
38
|
+
res.json({ status: 'ok', version: VERSION, sessions: sessions.size });
|
|
29
39
|
});
|
|
30
40
|
// POST /mcp — JSON-RPC handler
|
|
31
41
|
app.post('/mcp', mcpRateLimit, async (req, res) => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"http.js","sourceRoot":"","sources":["../../src/transports/http.ts"],"names":[],"mappings":"AAAA,OAAO,OAAwC,MAAM,SAAS,CAAC;AAC/D,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,SAAS,MAAM,oBAAoB,CAAC;AAC3C,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,6BAA6B,EAAE,MAAM,oDAAoD,CAAC;AACnG,OAAO,EAAE,mBAAmB,EAAE,MAAM,oCAAoC,CAAC;AAEzE,OAAO,EAAE,sBAAsB,EAAE,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"http.js","sourceRoot":"","sources":["../../src/transports/http.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare const VERSION: string;
|
package/dist/version.js
ADDED
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { readFileSync } from 'node:fs';
|
|
2
|
+
import { fileURLToPath } from 'node:url';
|
|
3
|
+
import { dirname, join } from 'node:path';
|
|
4
|
+
/**
|
|
5
|
+
* Versión del paquete leída dinámicamente de `package.json`.
|
|
6
|
+
*
|
|
7
|
+
* Evita versiones hardcodeadas y desincronizadas en distintos puntos del
|
|
8
|
+
* servidor (handshake MCP, endpoint `/health`, logs de arranque).
|
|
9
|
+
*
|
|
10
|
+
* El módulo siempre está a un nivel por debajo de la raíz del paquete tanto en
|
|
11
|
+
* `src/version.ts` (dev con tsx) como en `dist/version.js` (compilado), por lo
|
|
12
|
+
* que `../package.json` resuelve correctamente en ambos casos. npm incluye
|
|
13
|
+
* `package.json` en la raíz del paquete instalado.
|
|
14
|
+
*/
|
|
15
|
+
const moduleDir = dirname(fileURLToPath(import.meta.url));
|
|
16
|
+
function readVersion() {
|
|
17
|
+
try {
|
|
18
|
+
const raw = readFileSync(join(moduleDir, '..', 'package.json'), 'utf8');
|
|
19
|
+
const pkg = JSON.parse(raw);
|
|
20
|
+
return pkg.version ?? '0.0.0';
|
|
21
|
+
}
|
|
22
|
+
catch {
|
|
23
|
+
return '0.0.0';
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
export const VERSION = readVersion();
|
|
27
|
+
//# sourceMappingURL=version.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"version.js","sourceRoot":"","sources":["../src/version.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAE1C;;;;;;;;;;GAUG;AACH,MAAM,SAAS,GAAG,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;AAM1D,SAAS,WAAW;IAClB,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,YAAY,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,EAAE,cAAc,CAAC,EAAE,MAAM,CAAC,CAAC;QACxE,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAgB,CAAC;QAC3C,OAAO,GAAG,CAAC,OAAO,IAAI,OAAO,CAAC;IAChC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,OAAO,CAAC;IACjB,CAAC;AACH,CAAC;AAED,MAAM,CAAC,MAAM,OAAO,GAAW,WAAW,EAAE,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@nubiia/mcp-freematica",
|
|
3
|
-
"version": "0.6.
|
|
3
|
+
"version": "0.6.3",
|
|
4
4
|
"description": "MCP server for Freemática REST API (consumed by Claude via Nubiia)",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/index.js",
|
|
@@ -56,7 +56,7 @@
|
|
|
56
56
|
"express-rate-limit": "^8.3.1",
|
|
57
57
|
"pino": "^10.3.1",
|
|
58
58
|
"uuid": "^14.0.0",
|
|
59
|
-
"zod": "^
|
|
59
|
+
"zod": "^4.4.3"
|
|
60
60
|
},
|
|
61
61
|
"lint-staged": {
|
|
62
62
|
"*.{ts,js}": [
|
|
@@ -69,18 +69,18 @@
|
|
|
69
69
|
"devDependencies": {
|
|
70
70
|
"@types/cors": "^2.8.19",
|
|
71
71
|
"@types/express": "^4.17.21",
|
|
72
|
-
"@types/node": "^
|
|
72
|
+
"@types/node": "^26.0.1",
|
|
73
73
|
"@types/uuid": "^10.0.0",
|
|
74
74
|
"@typescript-eslint/eslint-plugin": "^8.0.0",
|
|
75
75
|
"@typescript-eslint/parser": "^8.0.0",
|
|
76
76
|
"@vitest/coverage-v8": "^3.2.6",
|
|
77
77
|
"@vitest/ui": "^3.2.6",
|
|
78
78
|
"dotenv": "^16.0.0",
|
|
79
|
-
"eslint": "^
|
|
79
|
+
"eslint": "^10.6.0",
|
|
80
80
|
"fast-check": "^4.8.0",
|
|
81
81
|
"husky": "^9.1.7",
|
|
82
82
|
"lint-staged": "^16.4.0",
|
|
83
|
-
"nock": "^
|
|
83
|
+
"nock": "^14.0.16",
|
|
84
84
|
"pino-pretty": "^13.1.3",
|
|
85
85
|
"prettier": "^3.3.0",
|
|
86
86
|
"tsx": "^4.6.0",
|