@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 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
- }, "strip", z.ZodTypeAny, {
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.ZodNumber>;
11
+ MCP_PORT: z.ZodDefault<z.ZodCoercedNumber<unknown>>;
26
12
  MCP_ALLOWED_ORIGINS: z.ZodDefault<z.ZodString>;
27
- }, "strip", z.ZodTypeAny, {
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
- * Timeout por petición HTTP en milisegundos.
43
- * Por defecto: 30000 (30 segundos).
44
- */
45
- FREEMATICA_TIMEOUT_MS: z.ZodDefault<z.ZodNumber>;
46
- /**
47
- * Número máximo de reintentos para errores 5xx y errores de red.
48
- * Los errores 4xx nunca se reintentan.
49
- * Por defecto: 3.
50
- */
51
- FREEMATICA_MAX_RETRIES: z.ZodDefault<z.ZodNumber>;
52
- /**
53
- * Nivel de logging de pino.
54
- * Valores válidos: trace | debug | info | warn | error | fatal.
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 v0.6.0 | base=${auth.FREEMATICA_BASE_URL}`);
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":"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"}
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<["pendiente", "cancelado", "derivado"]>;
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<["pendiente", "cancelado", "derivado"]>>;
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<["PDF", "XML", "ERROR"]>>;
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
- }, "strip", z.ZodTypeAny, {
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
- }, "strip", z.ZodTypeAny, {
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
- }, "strip", z.ZodTypeAny, {
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<["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"]>;
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<["pendiente", "bloqueado", "recibido"]>;
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<["pendiente", "bloqueado", "recibido"]>>;
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: '0.6.0' }, { instructions: FREEMATICA_MCP_INSTRUCTIONS });
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);
@@ -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"}
@@ -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.ZodEffects<z.ZodObject<{
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
- }, "strip", z.ZodTypeAny, {
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.errors.map((e) => e.message).join('; ');
179
+ const msg = validation.error.issues.map((e) => e.message).join('; ');
180
180
  return error(new Error(msg));
181
181
  }
182
182
  try {
@@ -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: '0.4.1', sessions: sessions.size });
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":"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"}
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;
@@ -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.1",
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": "^3.23.8"
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": "^20.10.0",
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": "^9.0.0",
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": "^13.5.0",
83
+ "nock": "^14.0.16",
84
84
  "pino-pretty": "^13.1.3",
85
85
  "prettier": "^3.3.0",
86
86
  "tsx": "^4.6.0",