@nubiia/mcp-freematica 0.6.3 → 0.7.0
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 +63 -13
- package/dist/clients/freematica-client.d.ts +190 -1
- package/dist/clients/freematica-client.js +281 -1
- package/dist/clients/freematica-client.js.map +1 -1
- package/dist/config.d.ts +22 -1
- package/dist/config.js +29 -1
- package/dist/config.js.map +1 -1
- package/dist/schemas/contratos.d.ts +268 -5
- package/dist/schemas/contratos.js +402 -1
- package/dist/schemas/contratos.js.map +1 -1
- package/dist/server-instructions.js +44 -1
- package/dist/server-instructions.js.map +1 -1
- package/dist/server.d.ts +6 -0
- package/dist/server.js +2 -2
- package/dist/server.js.map +1 -1
- package/dist/tools/contratos/cabecera.d.ts +7 -0
- package/dist/tools/contratos/cabecera.js +128 -0
- package/dist/tools/contratos/cabecera.js.map +1 -0
- package/dist/tools/contratos/index.d.ts +21 -0
- package/dist/tools/contratos/index.js +31 -0
- package/dist/tools/contratos/index.js.map +1 -0
- package/dist/tools/contratos/materiales.d.ts +4 -0
- package/dist/tools/{contratos.js → contratos/materiales.js} +5 -11
- package/dist/tools/contratos/materiales.js.map +1 -0
- package/dist/tools/contratos/opcionales.d.ts +5 -0
- package/dist/tools/contratos/opcionales.js +106 -0
- package/dist/tools/contratos/opcionales.js.map +1 -0
- package/dist/tools/contratos/servicios.d.ts +5 -0
- package/dist/tools/contratos/servicios.js +215 -0
- package/dist/tools/contratos/servicios.js.map +1 -0
- package/dist/transports/http.d.ts +2 -0
- package/dist/transports/http.js +3 -1
- package/dist/transports/http.js.map +1 -1
- package/dist/transports/stdio.d.ts +2 -0
- package/dist/transports/stdio.js +3 -1
- package/dist/transports/stdio.js.map +1 -1
- package/dist/types/contratos.d.ts +29 -0
- package/dist/utils/idreg.d.ts +37 -0
- package/dist/utils/idreg.js +52 -0
- package/dist/utils/idreg.js.map +1 -0
- package/package.json +21 -4
- package/dist/tools/contratos.d.ts +0 -10
- package/dist/tools/contratos.js.map +0 -1
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import { FreematicaError } from '../../clients/base-client.js';
|
|
3
|
+
import { PaginationSchema } from '../../schemas/pagination.js';
|
|
4
|
+
import { CreateContratoShape, UpdateContratoShape, buildContratoBody, } from '../../schemas/contratos.js';
|
|
5
|
+
import { error, ok, okList } from '../helpers.js';
|
|
6
|
+
const LIST_TOOL_NAME = 'freematica_list_contratos';
|
|
7
|
+
const GET_TOOL_NAME = 'freematica_get_contrato';
|
|
8
|
+
const CREATE_TOOL_NAME = 'freematica_create_contrato';
|
|
9
|
+
const UPDATE_TOOL_NAME = 'freematica_update_contrato';
|
|
10
|
+
const LIST_DESCRIPTION = [
|
|
11
|
+
'Devuelve la lista paginada de cabeceras de contratos (módulo Contratos y Servicios).',
|
|
12
|
+
'',
|
|
13
|
+
'Endpoint: GET /pvss/v1/contratos. Cada item tiene campos CTRT_* (CTRT_EMP,',
|
|
14
|
+
'CTRT_DELEG, CTRT_COD, CTRT_DES, CTRT_FECHA, CTRT_COD_CLI, dirección,',
|
|
15
|
+
'CTRT_ABIERTO…) más `idReg` opaco (Base64 "EMP__DELEG__COD") que se usa en el',
|
|
16
|
+
'resto de tools de contratos.',
|
|
17
|
+
'',
|
|
18
|
+
'Filtros disponibles: SOLO empresa y delegacion (params nativos del API).',
|
|
19
|
+
'AVISO: el API ignora silenciosamente los filtros FIQL en este endpoint;',
|
|
20
|
+
'para localizar un contrato concreto usa freematica_get_contrato.',
|
|
21
|
+
].join('\n');
|
|
22
|
+
const GET_DESCRIPTION = [
|
|
23
|
+
'Busca una cabecera de contrato por sus códigos naturales (empresa + código',
|
|
24
|
+
'de contrato, opcionalmente delegación).',
|
|
25
|
+
'',
|
|
26
|
+
'No existe endpoint singular en el API y el listado ignora los filtros FIQL,',
|
|
27
|
+
'así que esta tool pagina el listado internamente (200 items por página) y',
|
|
28
|
+
'filtra en cliente. Puede requerir varias llamadas al API en datasets grandes.',
|
|
29
|
+
'Devuelve not_found si no hay coincidencia.',
|
|
30
|
+
].join('\n');
|
|
31
|
+
const CREATE_DESCRIPTION = [
|
|
32
|
+
'Da de alta una cabecera de contrato (módulo Contratos y Servicios).',
|
|
33
|
+
'',
|
|
34
|
+
'Endpoint: POST /pvss/v2/contratos — body VoContratos.',
|
|
35
|
+
'Requeridos: delegacion, descripcion (máx 40c), fecha, codCliente.',
|
|
36
|
+
'Si no se informa codContrato, Freemática asigna el código automáticamente.',
|
|
37
|
+
'',
|
|
38
|
+
'IMPORTANTE: el API no valida referencias de negocio en el spec (p. ej. que',
|
|
39
|
+
'codCliente exista); verifica los códigos con freematica_list_clientes antes.',
|
|
40
|
+
'Devuelve el contrato creado, incluido su idReg.',
|
|
41
|
+
].join('\n');
|
|
42
|
+
const UPDATE_DESCRIPTION = [
|
|
43
|
+
'Actualiza la cabecera de un contrato existente.',
|
|
44
|
+
'',
|
|
45
|
+
'Endpoint: PUT /pvss/v2/contratos/{idReg} — body VoContratos.',
|
|
46
|
+
'`idReg` es el identificador opaco del contrato (de freematica_list_contratos',
|
|
47
|
+
'o freematica_get_contrato). Solo se envían al API los campos informados.',
|
|
48
|
+
].join('\n');
|
|
49
|
+
/** Tools de cabecera de contrato: list/get (lectura) + create/update (escritura). */
|
|
50
|
+
export function registerCabeceraTools(server, client, opts) {
|
|
51
|
+
server.tool(LIST_TOOL_NAME, LIST_DESCRIPTION, {
|
|
52
|
+
...PaginationSchema,
|
|
53
|
+
empresa: z.string().max(4).optional().describe('Código de empresa (param nativo codEmpresa).'),
|
|
54
|
+
delegacion: z
|
|
55
|
+
.string()
|
|
56
|
+
.max(4)
|
|
57
|
+
.optional()
|
|
58
|
+
.describe('Código de delegación (param nativo codDelegacion).'),
|
|
59
|
+
order: z
|
|
60
|
+
.string()
|
|
61
|
+
.optional()
|
|
62
|
+
.describe('Orden de los registros. Ejemplo: "CTRT_FECHA desc".'),
|
|
63
|
+
}, { readOnlyHint: true, destructiveHint: false, openWorldHint: true }, async ({ page, items, empresa, delegacion, order }) => {
|
|
64
|
+
try {
|
|
65
|
+
const result = await client.listContratos({ page, items, empresa, delegacion, order });
|
|
66
|
+
return okList({
|
|
67
|
+
items: result.items,
|
|
68
|
+
total: result.total,
|
|
69
|
+
page,
|
|
70
|
+
itemsPerPage: items,
|
|
71
|
+
});
|
|
72
|
+
}
|
|
73
|
+
catch (err) {
|
|
74
|
+
if (err instanceof FreematicaError)
|
|
75
|
+
return error(err);
|
|
76
|
+
return error(err instanceof Error ? err : new Error(String(err)));
|
|
77
|
+
}
|
|
78
|
+
});
|
|
79
|
+
server.tool(GET_TOOL_NAME, GET_DESCRIPTION, {
|
|
80
|
+
empresa: z.string().max(4).describe('Código de empresa (CTRT_EMP). Ej: "02".'),
|
|
81
|
+
codContrato: z.string().max(10).describe('Código del contrato (CTRT_COD). Ej: "2304".'),
|
|
82
|
+
delegacion: z
|
|
83
|
+
.string()
|
|
84
|
+
.max(4)
|
|
85
|
+
.optional()
|
|
86
|
+
.describe('Código de delegación (CTRT_DELEG). Acota la búsqueda si se conoce.'),
|
|
87
|
+
}, { readOnlyHint: true, destructiveHint: false, openWorldHint: true }, async ({ empresa, codContrato, delegacion }) => {
|
|
88
|
+
try {
|
|
89
|
+
const contrato = await client.getContrato({ empresa, codContrato, delegacion });
|
|
90
|
+
return ok(contrato);
|
|
91
|
+
}
|
|
92
|
+
catch (err) {
|
|
93
|
+
if (err instanceof FreematicaError)
|
|
94
|
+
return error(err);
|
|
95
|
+
return error(err instanceof Error ? err : new Error(String(err)));
|
|
96
|
+
}
|
|
97
|
+
});
|
|
98
|
+
if (!opts.enableWrites)
|
|
99
|
+
return;
|
|
100
|
+
server.tool(CREATE_TOOL_NAME, CREATE_DESCRIPTION, CreateContratoShape, { readOnlyHint: false, destructiveHint: false, idempotentHint: false, openWorldHint: true }, async (args) => {
|
|
101
|
+
try {
|
|
102
|
+
const body = buildContratoBody(args);
|
|
103
|
+
const created = await client.createContrato(body);
|
|
104
|
+
return ok(created);
|
|
105
|
+
}
|
|
106
|
+
catch (err) {
|
|
107
|
+
if (err instanceof FreematicaError)
|
|
108
|
+
return error(err);
|
|
109
|
+
return error(err instanceof Error ? err : new Error(String(err)));
|
|
110
|
+
}
|
|
111
|
+
});
|
|
112
|
+
server.tool(UPDATE_TOOL_NAME, UPDATE_DESCRIPTION, UpdateContratoShape, { readOnlyHint: false, destructiveHint: true, idempotentHint: true, openWorldHint: true }, async ({ idReg, ...fields }) => {
|
|
113
|
+
try {
|
|
114
|
+
const body = buildContratoBody(fields);
|
|
115
|
+
if (Object.keys(body).length === 0) {
|
|
116
|
+
return error(new Error('Debes informar al menos un campo a actualizar además de idReg.'));
|
|
117
|
+
}
|
|
118
|
+
const updated = await client.updateContrato(idReg, body);
|
|
119
|
+
return ok(updated);
|
|
120
|
+
}
|
|
121
|
+
catch (err) {
|
|
122
|
+
if (err instanceof FreematicaError)
|
|
123
|
+
return error(err);
|
|
124
|
+
return error(err instanceof Error ? err : new Error(String(err)));
|
|
125
|
+
}
|
|
126
|
+
});
|
|
127
|
+
}
|
|
128
|
+
//# sourceMappingURL=cabecera.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cabecera.js","sourceRoot":"","sources":["../../../src/tools/contratos/cabecera.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
2
|
+
import type { FreematicaClient } from '../../clients/freematica-client.js';
|
|
3
|
+
import { type RegisterOptions } from './cabecera.js';
|
|
4
|
+
/**
|
|
5
|
+
* Registra las tools MCP del grupo "Contratos y Servicios" (módulos pvss y ppre).
|
|
6
|
+
*
|
|
7
|
+
* Lectura (siempre registradas):
|
|
8
|
+
* - freematica_list_contratos / freematica_get_contrato
|
|
9
|
+
* - freematica_list_servicios_contrato / freematica_get_servicio_contrato
|
|
10
|
+
* - freematica_list_contratos_opcionales / freematica_get_contrato_opcionales
|
|
11
|
+
* - freematica_list_materiales_asignados_servicios
|
|
12
|
+
*
|
|
13
|
+
* Escritura (solo si FREEMATICA_ENABLE_WRITES=true; nunca hay delete):
|
|
14
|
+
* - freematica_create_contrato / freematica_update_contrato
|
|
15
|
+
* - freematica_create_servicio_contrato / freematica_update_servicio_fechas
|
|
16
|
+
* - freematica_create_servicio_historico_precios / freematica_update_servicio_historico_precios
|
|
17
|
+
* - freematica_create_servicio_facturacion_txt / freematica_update_servicio_facturacion
|
|
18
|
+
* - freematica_create_contrato_opcionales / freematica_update_contrato_opcionales
|
|
19
|
+
*/
|
|
20
|
+
export declare function registerContratosTools(server: McpServer, client: FreematicaClient, opts?: RegisterOptions): void;
|
|
21
|
+
export type { RegisterOptions } from './cabecera.js';
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { logger } from '../../logger.js';
|
|
2
|
+
import { registerCabeceraTools } from './cabecera.js';
|
|
3
|
+
import { registerMaterialesTools } from './materiales.js';
|
|
4
|
+
import { registerOpcionalesTools } from './opcionales.js';
|
|
5
|
+
import { registerServiciosTools } from './servicios.js';
|
|
6
|
+
/**
|
|
7
|
+
* Registra las tools MCP del grupo "Contratos y Servicios" (módulos pvss y ppre).
|
|
8
|
+
*
|
|
9
|
+
* Lectura (siempre registradas):
|
|
10
|
+
* - freematica_list_contratos / freematica_get_contrato
|
|
11
|
+
* - freematica_list_servicios_contrato / freematica_get_servicio_contrato
|
|
12
|
+
* - freematica_list_contratos_opcionales / freematica_get_contrato_opcionales
|
|
13
|
+
* - freematica_list_materiales_asignados_servicios
|
|
14
|
+
*
|
|
15
|
+
* Escritura (solo si FREEMATICA_ENABLE_WRITES=true; nunca hay delete):
|
|
16
|
+
* - freematica_create_contrato / freematica_update_contrato
|
|
17
|
+
* - freematica_create_servicio_contrato / freematica_update_servicio_fechas
|
|
18
|
+
* - freematica_create_servicio_historico_precios / freematica_update_servicio_historico_precios
|
|
19
|
+
* - freematica_create_servicio_facturacion_txt / freematica_update_servicio_facturacion
|
|
20
|
+
* - freematica_create_contrato_opcionales / freematica_update_contrato_opcionales
|
|
21
|
+
*/
|
|
22
|
+
export function registerContratosTools(server, client, opts = { enableWrites: false }) {
|
|
23
|
+
registerMaterialesTools(server, client);
|
|
24
|
+
registerCabeceraTools(server, client, opts);
|
|
25
|
+
registerServiciosTools(server, client, opts);
|
|
26
|
+
registerOpcionalesTools(server, client, opts);
|
|
27
|
+
if (opts.enableWrites) {
|
|
28
|
+
logger.warn('FREEMATICA_ENABLE_WRITES=true: tools de escritura de contratos registradas (create/update, sin delete)');
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/tools/contratos/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AACzC,OAAO,EAAE,qBAAqB,EAAwB,MAAM,eAAe,CAAC;AAC5E,OAAO,EAAE,uBAAuB,EAAE,MAAM,iBAAiB,CAAC;AAC1D,OAAO,EAAE,uBAAuB,EAAE,MAAM,iBAAiB,CAAC;AAC1D,OAAO,EAAE,sBAAsB,EAAE,MAAM,gBAAgB,CAAC;AAExD;;;;;;;;;;;;;;;GAeG;AACH,MAAM,UAAU,sBAAsB,CACpC,MAAiB,EACjB,MAAwB,EACxB,OAAwB,EAAE,YAAY,EAAE,KAAK,EAAE;IAE/C,uBAAuB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACxC,qBAAqB,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,CAAC,CAAC;IAC5C,sBAAsB,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,CAAC,CAAC;IAC7C,uBAAuB,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,CAAC,CAAC;IAE9C,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC;QACtB,MAAM,CAAC,IAAI,CACT,wGAAwG,CACzG,CAAC;IACJ,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
2
|
+
import type { FreematicaClient } from '../../clients/freematica-client.js';
|
|
3
|
+
/** Tools de material asignado a servicios (solo lectura). */
|
|
4
|
+
export declare function registerMaterialesTools(server: McpServer, client: FreematicaClient): void;
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { FreematicaError } from '
|
|
2
|
-
import { error, okList } from '
|
|
1
|
+
import { FreematicaError } from '../../clients/base-client.js';
|
|
2
|
+
import { error, okList } from '../helpers.js';
|
|
3
3
|
const LIST_MATERIALES_TOOL_NAME = 'freematica_list_materiales_asignados_servicios';
|
|
4
4
|
const LIST_MATERIALES_TOOL_DESCRIPTION = [
|
|
5
5
|
'Devuelve la lista completa de material asignado a servicios.',
|
|
@@ -12,14 +12,8 @@ const LIST_MATERIALES_TOOL_DESCRIPTION = [
|
|
|
12
12
|
' - items: array de objetos VoContratosServMatAsignado',
|
|
13
13
|
' - count: número total de elementos',
|
|
14
14
|
].join('\n');
|
|
15
|
-
/**
|
|
16
|
-
|
|
17
|
-
* (Postman: app `pvss` → group `Contratos`).
|
|
18
|
-
*
|
|
19
|
-
* Add new tools here by calling `server.tool(...)` again. When this file grows
|
|
20
|
-
* past ~15 tools, split it into `src/tools/contratos/<entity>.ts`.
|
|
21
|
-
*/
|
|
22
|
-
export function registerContratosTools(server, client) {
|
|
15
|
+
/** Tools de material asignado a servicios (solo lectura). */
|
|
16
|
+
export function registerMaterialesTools(server, client) {
|
|
23
17
|
server.tool(LIST_MATERIALES_TOOL_NAME, LIST_MATERIALES_TOOL_DESCRIPTION, {}, { readOnlyHint: true, destructiveHint: false, openWorldHint: true }, async () => {
|
|
24
18
|
try {
|
|
25
19
|
const { items, total } = await client.getMaterialesAsignadosServicios();
|
|
@@ -32,4 +26,4 @@ export function registerContratosTools(server, client) {
|
|
|
32
26
|
}
|
|
33
27
|
});
|
|
34
28
|
}
|
|
35
|
-
//# sourceMappingURL=
|
|
29
|
+
//# sourceMappingURL=materiales.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"materiales.js","sourceRoot":"","sources":["../../../src/tools/contratos/materiales.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAC;AAE/D,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AAE9C,MAAM,yBAAyB,GAAG,gDAAgD,CAAC;AAEnF,MAAM,gCAAgC,GAAG;IACvC,8DAA8D;IAC9D,EAAE;IACF,uEAAuE;IACvE,kDAAkD;IAClD,EAAE;IACF,4EAA4E;IAC5E,wEAAwE;IACxE,wDAAwD;IACxD,sCAAsC;CACvC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAEb,6DAA6D;AAC7D,MAAM,UAAU,uBAAuB,CAAC,MAAiB,EAAE,MAAwB;IACjF,MAAM,CAAC,IAAI,CACT,yBAAyB,EACzB,gCAAgC,EAChC,EAAE,EACF,EAAE,YAAY,EAAE,IAAI,EAAE,eAAe,EAAE,KAAK,EAAE,aAAa,EAAE,IAAI,EAAE,EACnE,KAAK,IAA6B,EAAE;QAClC,IAAI,CAAC;YACH,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,MAAM,MAAM,CAAC,+BAA+B,EAAE,CAAC;YACxE,OAAO,MAAM,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,CAAmB,CAAC;QACpD,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAI,GAAG,YAAY,eAAe;gBAAE,OAAO,KAAK,CAAC,GAAG,CAAmB,CAAC;YACxE,OAAO,KAAK,CAAC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAmB,CAAC;QACtF,CAAC;IACH,CAAC,CACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
2
|
+
import type { FreematicaClient } from '../../clients/freematica-client.js';
|
|
3
|
+
import type { RegisterOptions } from './cabecera.js';
|
|
4
|
+
/** Tools de opcionales de contrato: list/get (lectura) + create/update (escritura). */
|
|
5
|
+
export declare function registerOpcionalesTools(server: McpServer, client: FreematicaClient, opts: RegisterOptions): void;
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import { FreematicaError } from '../../clients/base-client.js';
|
|
3
|
+
import { PaginationSchema } from '../../schemas/pagination.js';
|
|
4
|
+
import { CreateContratoOpcionalesShape, UpdateContratoOpcionalesShape, buildContratoOpcionalesBody, } from '../../schemas/contratos.js';
|
|
5
|
+
import { error, ok, okList } from '../helpers.js';
|
|
6
|
+
const LIST_TOOL_NAME = 'freematica_list_contratos_opcionales';
|
|
7
|
+
const GET_TOOL_NAME = 'freematica_get_contrato_opcionales';
|
|
8
|
+
const CREATE_TOOL_NAME = 'freematica_create_contrato_opcionales';
|
|
9
|
+
const UPDATE_TOOL_NAME = 'freematica_update_contrato_opcionales';
|
|
10
|
+
const LIST_DESCRIPTION = [
|
|
11
|
+
'Devuelve la lista paginada de registros de opcionales de contratos',
|
|
12
|
+
'(módulo Presupuestos y Contratos, ppre).',
|
|
13
|
+
'',
|
|
14
|
+
'Endpoint: GET /ppre/v2/contratos/opcionales. Cada item tiene campos CON2_*',
|
|
15
|
+
'(10 numéricos y 10 alfanuméricos de propósito libre, descuentos, garantías,',
|
|
16
|
+
'observaciones) más `idReg` opaco para el resto de tools de opcionales.',
|
|
17
|
+
].join('\n');
|
|
18
|
+
const GET_DESCRIPTION = [
|
|
19
|
+
'Devuelve el detalle de un registro de opcionales de contrato.',
|
|
20
|
+
'',
|
|
21
|
+
'Endpoint: GET /ppre/v2/contratos/opcionales/{idReg}.',
|
|
22
|
+
'`idReg` es el identificador opaco (campo "idReg" en los items de',
|
|
23
|
+
'freematica_list_contratos_opcionales).',
|
|
24
|
+
].join('\n');
|
|
25
|
+
const CREATE_DESCRIPTION = [
|
|
26
|
+
'Da de alta un registro de opcionales de contrato.',
|
|
27
|
+
'',
|
|
28
|
+
'Endpoint: POST /ppre/v2/contratos/opcionales — body VoContratosOpcionales.',
|
|
29
|
+
'Requeridos: empresa, delegacion, tipoContrato, numContrato, fechaContrato.',
|
|
30
|
+
'Los campos flexibles (CON2_OPC_NUM1..10, CON2_OPC_ALFA1..10, descuentos,',
|
|
31
|
+
'garantías) se pasan en camposAdicionales con su nombre nativo CON2_*.',
|
|
32
|
+
].join('\n');
|
|
33
|
+
const UPDATE_DESCRIPTION = [
|
|
34
|
+
'Actualiza un registro de opcionales de contrato existente.',
|
|
35
|
+
'',
|
|
36
|
+
'Endpoint: PUT /ppre/v2/contratos/opcionales/{idReg}.',
|
|
37
|
+
'Solo se envían al API los campos informados.',
|
|
38
|
+
].join('\n');
|
|
39
|
+
/** Tools de opcionales de contrato: list/get (lectura) + create/update (escritura). */
|
|
40
|
+
export function registerOpcionalesTools(server, client, opts) {
|
|
41
|
+
server.tool(LIST_TOOL_NAME, LIST_DESCRIPTION, {
|
|
42
|
+
...PaginationSchema,
|
|
43
|
+
order: z.string().optional().describe('Orden de los registros. Ejemplo: "CON2_FCHCONT desc".'),
|
|
44
|
+
}, { readOnlyHint: true, destructiveHint: false, openWorldHint: true }, async ({ page, items, order }) => {
|
|
45
|
+
try {
|
|
46
|
+
const result = await client.listContratosOpcionales({ page, items, order });
|
|
47
|
+
return okList({
|
|
48
|
+
items: result.items,
|
|
49
|
+
total: result.total,
|
|
50
|
+
page,
|
|
51
|
+
itemsPerPage: items,
|
|
52
|
+
});
|
|
53
|
+
}
|
|
54
|
+
catch (err) {
|
|
55
|
+
if (err instanceof FreematicaError)
|
|
56
|
+
return error(err);
|
|
57
|
+
return error(err instanceof Error ? err : new Error(String(err)));
|
|
58
|
+
}
|
|
59
|
+
});
|
|
60
|
+
server.tool(GET_TOOL_NAME, GET_DESCRIPTION, {
|
|
61
|
+
idReg: z
|
|
62
|
+
.string()
|
|
63
|
+
.min(1)
|
|
64
|
+
.describe('idReg opaco del registro (campo "idReg" en freematica_list_contratos_opcionales).'),
|
|
65
|
+
}, { readOnlyHint: true, destructiveHint: false, openWorldHint: true }, async ({ idReg }) => {
|
|
66
|
+
try {
|
|
67
|
+
const registro = await client.getContratoOpcionales(idReg);
|
|
68
|
+
return ok(registro);
|
|
69
|
+
}
|
|
70
|
+
catch (err) {
|
|
71
|
+
if (err instanceof FreematicaError)
|
|
72
|
+
return error(err);
|
|
73
|
+
return error(err instanceof Error ? err : new Error(String(err)));
|
|
74
|
+
}
|
|
75
|
+
});
|
|
76
|
+
if (!opts.enableWrites)
|
|
77
|
+
return;
|
|
78
|
+
server.tool(CREATE_TOOL_NAME, CREATE_DESCRIPTION, CreateContratoOpcionalesShape, { readOnlyHint: false, destructiveHint: false, idempotentHint: false, openWorldHint: true }, async (args) => {
|
|
79
|
+
try {
|
|
80
|
+
const body = buildContratoOpcionalesBody(args);
|
|
81
|
+
const created = await client.createContratoOpcionales(body);
|
|
82
|
+
return ok(created);
|
|
83
|
+
}
|
|
84
|
+
catch (err) {
|
|
85
|
+
if (err instanceof FreematicaError)
|
|
86
|
+
return error(err);
|
|
87
|
+
return error(err instanceof Error ? err : new Error(String(err)));
|
|
88
|
+
}
|
|
89
|
+
});
|
|
90
|
+
server.tool(UPDATE_TOOL_NAME, UPDATE_DESCRIPTION, UpdateContratoOpcionalesShape, { readOnlyHint: false, destructiveHint: true, idempotentHint: true, openWorldHint: true }, async ({ idReg, ...fields }) => {
|
|
91
|
+
try {
|
|
92
|
+
const body = buildContratoOpcionalesBody(fields);
|
|
93
|
+
if (Object.keys(body).length === 0) {
|
|
94
|
+
return error(new Error('Debes informar al menos un campo a actualizar además de idReg.'));
|
|
95
|
+
}
|
|
96
|
+
const updated = await client.updateContratoOpcionales(idReg, body);
|
|
97
|
+
return ok(updated);
|
|
98
|
+
}
|
|
99
|
+
catch (err) {
|
|
100
|
+
if (err instanceof FreematicaError)
|
|
101
|
+
return error(err);
|
|
102
|
+
return error(err instanceof Error ? err : new Error(String(err)));
|
|
103
|
+
}
|
|
104
|
+
});
|
|
105
|
+
}
|
|
106
|
+
//# sourceMappingURL=opcionales.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"opcionales.js","sourceRoot":"","sources":["../../../src/tools/contratos/opcionales.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
2
|
+
import type { FreematicaClient } from '../../clients/freematica-client.js';
|
|
3
|
+
import type { RegisterOptions } from './cabecera.js';
|
|
4
|
+
/** Tools de servicios de contrato: list/get (lectura) + create/update (escritura). */
|
|
5
|
+
export declare function registerServiciosTools(server: McpServer, client: FreematicaClient, opts: RegisterOptions): void;
|
|
@@ -0,0 +1,215 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import { FreematicaError } from '../../clients/base-client.js';
|
|
3
|
+
import { PaginationSchema } from '../../schemas/pagination.js';
|
|
4
|
+
import { CreateServicioShape, UpdateServicioFechasShape, ServicioHistoricoPreciosShape, CreateServicioFacturacionTxtShape, UpdateServicioFacturacionShape, buildServicioBody, buildHistoricoPreciosBody, buildFacturacionTxtBody, buildServicioFacturacionBody, } from '../../schemas/contratos.js';
|
|
5
|
+
import { decodeContratoIdReg, decodeServicioIdReg } from '../../utils/idreg.js';
|
|
6
|
+
import { error, ok, okList } from '../helpers.js';
|
|
7
|
+
const LIST_TOOL_NAME = 'freematica_list_servicios_contrato';
|
|
8
|
+
const GET_TOOL_NAME = 'freematica_get_servicio_contrato';
|
|
9
|
+
const CREATE_TOOL_NAME = 'freematica_create_servicio_contrato';
|
|
10
|
+
const UPDATE_FECHAS_TOOL_NAME = 'freematica_update_servicio_fechas';
|
|
11
|
+
const CREATE_HIST_TOOL_NAME = 'freematica_create_servicio_historico_precios';
|
|
12
|
+
const UPDATE_HIST_TOOL_NAME = 'freematica_update_servicio_historico_precios';
|
|
13
|
+
const CREATE_FACTXT_TOOL_NAME = 'freematica_create_servicio_facturacion_txt';
|
|
14
|
+
const UPDATE_FAC_TOOL_NAME = 'freematica_update_servicio_facturacion';
|
|
15
|
+
const LIST_DESCRIPTION = [
|
|
16
|
+
'Devuelve la lista paginada de servicios de un contrato.',
|
|
17
|
+
'',
|
|
18
|
+
'Endpoint: GET /pvss/v1/contratos/{idContrato}/servicios.',
|
|
19
|
+
'Cada item tiene campos CTRTS_* (CTRTS_COD, CTRTS_DES, CTRTS_TIPO,',
|
|
20
|
+
'CTRTS_FECALTA, CTRTS_FECFIN, CTRTS_CLASE…) más `idReg` opaco',
|
|
21
|
+
'(Base64 "EMP__DELEG__CTRT__COD") que se usa en las tools de escritura.',
|
|
22
|
+
].join('\n');
|
|
23
|
+
const GET_DESCRIPTION = [
|
|
24
|
+
'Devuelve el detalle de un servicio de contrato.',
|
|
25
|
+
'',
|
|
26
|
+
'Endpoint: GET /pvss/v2/contratos-servicios/{idreg}.',
|
|
27
|
+
'`idReg` es el identificador opaco del servicio (campo "idReg" en los items',
|
|
28
|
+
'de freematica_list_servicios_contrato).',
|
|
29
|
+
].join('\n');
|
|
30
|
+
const CREATE_DESCRIPTION = [
|
|
31
|
+
'Da de alta un servicio en un contrato existente (Alta servicio de Cuadrantes).',
|
|
32
|
+
'',
|
|
33
|
+
'Endpoint: POST /pvss/v2/contratos/{idReg}/servicios — body VoServicios.',
|
|
34
|
+
'Los campos requeridos por el API (empresa, delegación, código de contrato)',
|
|
35
|
+
'se derivan automáticamente del idContrato; solo hay que pasar los datos del',
|
|
36
|
+
'servicio. Si no se informa codServicio, lo asigna Freemática.',
|
|
37
|
+
'',
|
|
38
|
+
'NOTA: los precios del servicio NO van aquí; usa',
|
|
39
|
+
'freematica_create_servicio_historico_precios tras crear el servicio.',
|
|
40
|
+
].join('\n');
|
|
41
|
+
const UPDATE_FECHAS_DESCRIPTION = [
|
|
42
|
+
'Actualiza las fechas de inicio y/o fin de un servicio de contrato.',
|
|
43
|
+
'',
|
|
44
|
+
'Endpoint: PUT /pvss/v2/contratos/{idContrato}/servicio/{idServicio}.',
|
|
45
|
+
'Según el spec del API, este endpoint SOLO actualiza fecha inicio y fecha fin.',
|
|
46
|
+
'Informar fechaFin es la forma estándar de dar de baja un servicio (no existe',
|
|
47
|
+
'DELETE en el API).',
|
|
48
|
+
].join('\n');
|
|
49
|
+
const CREATE_HIST_DESCRIPTION = [
|
|
50
|
+
'Da de alta un registro de histórico de precios de un servicio.',
|
|
51
|
+
'',
|
|
52
|
+
'Endpoint: POST /pvss/v2/contratos/{idContrato}/servicios-historico-precios/{idServicio}.',
|
|
53
|
+
'Los precios de un servicio se gestionan como histórico versionado: cada alta',
|
|
54
|
+
'añade una revisión (precio hora global/diurna/nocturna/festiva, importe fijo,',
|
|
55
|
+
'% de incremento). Los campos de identificación se derivan de los idReg.',
|
|
56
|
+
].join('\n');
|
|
57
|
+
const UPDATE_HIST_DESCRIPTION = [
|
|
58
|
+
'Actualiza un registro de histórico de precios de un servicio.',
|
|
59
|
+
'',
|
|
60
|
+
'Endpoint: PUT /pvss/v2/contratos/{idContrato}/servicios-historico-precios/{idServicio}.',
|
|
61
|
+
].join('\n');
|
|
62
|
+
const CREATE_FACTXT_DESCRIPTION = [
|
|
63
|
+
'Da de alta una línea de texto de facturación de un servicio.',
|
|
64
|
+
'',
|
|
65
|
+
'Endpoint: POST /pvss/v2/contratos/{idContrato}/servicios-facturacion-txt/{idServicio}.',
|
|
66
|
+
'Los textos aparecen en las líneas de factura del servicio. Requerido: linea',
|
|
67
|
+
'(código de línea, 4c). Los campos de identificación se derivan de los idReg.',
|
|
68
|
+
].join('\n');
|
|
69
|
+
const UPDATE_FAC_DESCRIPTION = [
|
|
70
|
+
'Actualiza los datos de facturación de un servicio (precios hora, importe,',
|
|
71
|
+
'forma de pago, clave de facturación…).',
|
|
72
|
+
'',
|
|
73
|
+
'Endpoint: PUT /pvss/v2/contratos/{idContrato}/servicios-facturacion/{idServicio}.',
|
|
74
|
+
'Los campos más comunes tienen parámetro propio; el resto de los 42 campos',
|
|
75
|
+
'VoServiciosFac puede pasarse en camposAdicionales con su nombre nativo CTRTF_*.',
|
|
76
|
+
].join('\n');
|
|
77
|
+
/** Tools de servicios de contrato: list/get (lectura) + create/update (escritura). */
|
|
78
|
+
export function registerServiciosTools(server, client, opts) {
|
|
79
|
+
server.tool(LIST_TOOL_NAME, LIST_DESCRIPTION, {
|
|
80
|
+
idContrato: z
|
|
81
|
+
.string()
|
|
82
|
+
.min(1)
|
|
83
|
+
.describe('idReg opaco del contrato (campo "idReg" en freematica_list_contratos).'),
|
|
84
|
+
...PaginationSchema,
|
|
85
|
+
order: z.string().optional().describe('Orden de los registros. Ejemplo: "CTRTS_COD asc".'),
|
|
86
|
+
}, { readOnlyHint: true, destructiveHint: false, openWorldHint: true }, async ({ idContrato, page, items, order }) => {
|
|
87
|
+
try {
|
|
88
|
+
const result = await client.listServiciosContrato(idContrato, { page, items, order });
|
|
89
|
+
return okList({
|
|
90
|
+
items: result.items,
|
|
91
|
+
total: result.total,
|
|
92
|
+
page,
|
|
93
|
+
itemsPerPage: items,
|
|
94
|
+
});
|
|
95
|
+
}
|
|
96
|
+
catch (err) {
|
|
97
|
+
if (err instanceof FreematicaError)
|
|
98
|
+
return error(err);
|
|
99
|
+
return error(err instanceof Error ? err : new Error(String(err)));
|
|
100
|
+
}
|
|
101
|
+
});
|
|
102
|
+
server.tool(GET_TOOL_NAME, GET_DESCRIPTION, {
|
|
103
|
+
idReg: z
|
|
104
|
+
.string()
|
|
105
|
+
.min(1)
|
|
106
|
+
.describe('idReg opaco del servicio (campo "idReg" en freematica_list_servicios_contrato).'),
|
|
107
|
+
}, { readOnlyHint: true, destructiveHint: false, openWorldHint: true }, async ({ idReg }) => {
|
|
108
|
+
try {
|
|
109
|
+
const servicio = await client.getServicioContrato(idReg);
|
|
110
|
+
return ok(servicio);
|
|
111
|
+
}
|
|
112
|
+
catch (err) {
|
|
113
|
+
if (err instanceof FreematicaError)
|
|
114
|
+
return error(err);
|
|
115
|
+
return error(err instanceof Error ? err : new Error(String(err)));
|
|
116
|
+
}
|
|
117
|
+
});
|
|
118
|
+
if (!opts.enableWrites)
|
|
119
|
+
return;
|
|
120
|
+
server.tool(CREATE_TOOL_NAME, CREATE_DESCRIPTION, CreateServicioShape, { readOnlyHint: false, destructiveHint: false, idempotentHint: false, openWorldHint: true }, async ({ idContrato, ...fields }) => {
|
|
121
|
+
try {
|
|
122
|
+
const parts = decodeContratoIdReg(idContrato);
|
|
123
|
+
const body = buildServicioBody(parts, fields);
|
|
124
|
+
const created = await client.createServicioContrato(idContrato, body);
|
|
125
|
+
return ok(created);
|
|
126
|
+
}
|
|
127
|
+
catch (err) {
|
|
128
|
+
if (err instanceof FreematicaError)
|
|
129
|
+
return error(err);
|
|
130
|
+
return error(err instanceof Error ? err : new Error(String(err)));
|
|
131
|
+
}
|
|
132
|
+
});
|
|
133
|
+
server.tool(UPDATE_FECHAS_TOOL_NAME, UPDATE_FECHAS_DESCRIPTION, UpdateServicioFechasShape, { readOnlyHint: false, destructiveHint: true, idempotentHint: true, openWorldHint: true }, async ({ idContrato, idServicio, fechaAlta, fechaFin }) => {
|
|
134
|
+
try {
|
|
135
|
+
if (fechaAlta === undefined && fechaFin === undefined) {
|
|
136
|
+
return error(new Error('Debes informar fechaAlta y/o fechaFin.'));
|
|
137
|
+
}
|
|
138
|
+
const parts = decodeServicioIdReg(idServicio);
|
|
139
|
+
const body = {
|
|
140
|
+
CTRTS_EMP: parts.empresa,
|
|
141
|
+
CTRTS_DELEG: parts.delegacion,
|
|
142
|
+
CTRTS_CTRT: parts.codContrato,
|
|
143
|
+
CTRTS_COD: parts.codServicio,
|
|
144
|
+
};
|
|
145
|
+
if (fechaAlta !== undefined)
|
|
146
|
+
body['CTRTS_FECALTA'] = fechaAlta;
|
|
147
|
+
if (fechaFin !== undefined)
|
|
148
|
+
body['CTRTS_FECFIN'] = fechaFin;
|
|
149
|
+
const updated = await client.updateServicioFechas(idContrato, idServicio, body);
|
|
150
|
+
return ok(updated);
|
|
151
|
+
}
|
|
152
|
+
catch (err) {
|
|
153
|
+
if (err instanceof FreematicaError)
|
|
154
|
+
return error(err);
|
|
155
|
+
return error(err instanceof Error ? err : new Error(String(err)));
|
|
156
|
+
}
|
|
157
|
+
});
|
|
158
|
+
server.tool(CREATE_HIST_TOOL_NAME, CREATE_HIST_DESCRIPTION, ServicioHistoricoPreciosShape, { readOnlyHint: false, destructiveHint: false, idempotentHint: false, openWorldHint: true }, async ({ idContrato, idServicio, ...fields }) => {
|
|
159
|
+
try {
|
|
160
|
+
const parts = decodeServicioIdReg(idServicio);
|
|
161
|
+
const body = buildHistoricoPreciosBody(parts, fields);
|
|
162
|
+
const created = await client.createServicioHistoricoPrecios(idContrato, idServicio, body);
|
|
163
|
+
return ok(created);
|
|
164
|
+
}
|
|
165
|
+
catch (err) {
|
|
166
|
+
if (err instanceof FreematicaError)
|
|
167
|
+
return error(err);
|
|
168
|
+
return error(err instanceof Error ? err : new Error(String(err)));
|
|
169
|
+
}
|
|
170
|
+
});
|
|
171
|
+
server.tool(UPDATE_HIST_TOOL_NAME, UPDATE_HIST_DESCRIPTION, ServicioHistoricoPreciosShape, { readOnlyHint: false, destructiveHint: true, idempotentHint: true, openWorldHint: true }, async ({ idContrato, idServicio, ...fields }) => {
|
|
172
|
+
try {
|
|
173
|
+
const parts = decodeServicioIdReg(idServicio);
|
|
174
|
+
const body = buildHistoricoPreciosBody(parts, fields);
|
|
175
|
+
const updated = await client.updateServicioHistoricoPrecios(idContrato, idServicio, body);
|
|
176
|
+
return ok(updated);
|
|
177
|
+
}
|
|
178
|
+
catch (err) {
|
|
179
|
+
if (err instanceof FreematicaError)
|
|
180
|
+
return error(err);
|
|
181
|
+
return error(err instanceof Error ? err : new Error(String(err)));
|
|
182
|
+
}
|
|
183
|
+
});
|
|
184
|
+
server.tool(CREATE_FACTXT_TOOL_NAME, CREATE_FACTXT_DESCRIPTION, CreateServicioFacturacionTxtShape, { readOnlyHint: false, destructiveHint: false, idempotentHint: false, openWorldHint: true }, async ({ idContrato, idServicio, linea, texto, textoAmpliado }) => {
|
|
185
|
+
try {
|
|
186
|
+
const parts = decodeServicioIdReg(idServicio);
|
|
187
|
+
const body = buildFacturacionTxtBody(parts, { linea, texto, textoAmpliado });
|
|
188
|
+
const created = await client.createServicioFacturacionTxt(idContrato, idServicio, body);
|
|
189
|
+
return ok(created);
|
|
190
|
+
}
|
|
191
|
+
catch (err) {
|
|
192
|
+
if (err instanceof FreematicaError)
|
|
193
|
+
return error(err);
|
|
194
|
+
return error(err instanceof Error ? err : new Error(String(err)));
|
|
195
|
+
}
|
|
196
|
+
});
|
|
197
|
+
server.tool(UPDATE_FAC_TOOL_NAME, UPDATE_FAC_DESCRIPTION, UpdateServicioFacturacionShape, { readOnlyHint: false, destructiveHint: true, idempotentHint: true, openWorldHint: true }, async ({ idContrato, idServicio, ...fields }) => {
|
|
198
|
+
try {
|
|
199
|
+
const parts = decodeServicioIdReg(idServicio);
|
|
200
|
+
const body = buildServicioFacturacionBody(parts, fields);
|
|
201
|
+
// 4 claves de identificación siempre presentes; exigir al menos un dato más
|
|
202
|
+
if (Object.keys(body).length <= 4) {
|
|
203
|
+
return error(new Error('Debes informar al menos un campo de facturación a actualizar.'));
|
|
204
|
+
}
|
|
205
|
+
const updated = await client.updateServicioFacturacion(idContrato, idServicio, body);
|
|
206
|
+
return ok(updated);
|
|
207
|
+
}
|
|
208
|
+
catch (err) {
|
|
209
|
+
if (err instanceof FreematicaError)
|
|
210
|
+
return error(err);
|
|
211
|
+
return error(err instanceof Error ? err : new Error(String(err)));
|
|
212
|
+
}
|
|
213
|
+
});
|
|
214
|
+
}
|
|
215
|
+
//# sourceMappingURL=servicios.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"servicios.js","sourceRoot":"","sources":["../../../src/tools/contratos/servicios.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAC;AAE/D,OAAO,EAAE,gBAAgB,EAAE,MAAM,6BAA6B,CAAC;AAC/D,OAAO,EACL,mBAAmB,EACnB,yBAAyB,EACzB,6BAA6B,EAC7B,iCAAiC,EACjC,8BAA8B,EAC9B,iBAAiB,EACjB,yBAAyB,EACzB,uBAAuB,EACvB,4BAA4B,GAI7B,MAAM,4BAA4B,CAAC;AACpC,OAAO,EAAE,mBAAmB,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAChF,OAAO,EAAE,KAAK,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AAGlD,MAAM,cAAc,GAAG,oCAAoC,CAAC;AAC5D,MAAM,aAAa,GAAG,kCAAkC,CAAC;AACzD,MAAM,gBAAgB,GAAG,qCAAqC,CAAC;AAC/D,MAAM,uBAAuB,GAAG,mCAAmC,CAAC;AACpE,MAAM,qBAAqB,GAAG,8CAA8C,CAAC;AAC7E,MAAM,qBAAqB,GAAG,8CAA8C,CAAC;AAC7E,MAAM,uBAAuB,GAAG,4CAA4C,CAAC;AAC7E,MAAM,oBAAoB,GAAG,wCAAwC,CAAC;AAEtE,MAAM,gBAAgB,GAAG;IACvB,yDAAyD;IACzD,EAAE;IACF,0DAA0D;IAC1D,mEAAmE;IACnE,8DAA8D;IAC9D,wEAAwE;CACzE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAEb,MAAM,eAAe,GAAG;IACtB,iDAAiD;IACjD,EAAE;IACF,qDAAqD;IACrD,4EAA4E;IAC5E,yCAAyC;CAC1C,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAEb,MAAM,kBAAkB,GAAG;IACzB,gFAAgF;IAChF,EAAE;IACF,yEAAyE;IACzE,4EAA4E;IAC5E,6EAA6E;IAC7E,+DAA+D;IAC/D,EAAE;IACF,iDAAiD;IACjD,sEAAsE;CACvE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAEb,MAAM,yBAAyB,GAAG;IAChC,oEAAoE;IACpE,EAAE;IACF,sEAAsE;IACtE,+EAA+E;IAC/E,8EAA8E;IAC9E,oBAAoB;CACrB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAEb,MAAM,uBAAuB,GAAG;IAC9B,gEAAgE;IAChE,EAAE;IACF,0FAA0F;IAC1F,8EAA8E;IAC9E,+EAA+E;IAC/E,yEAAyE;CAC1E,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAEb,MAAM,uBAAuB,GAAG;IAC9B,+DAA+D;IAC/D,EAAE;IACF,yFAAyF;CAC1F,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAEb,MAAM,yBAAyB,GAAG;IAChC,8DAA8D;IAC9D,EAAE;IACF,wFAAwF;IACxF,6EAA6E;IAC7E,8EAA8E;CAC/E,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAEb,MAAM,sBAAsB,GAAG;IAC7B,2EAA2E;IAC3E,wCAAwC;IACxC,EAAE;IACF,mFAAmF;IACnF,2EAA2E;IAC3E,iFAAiF;CAClF,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAEb,sFAAsF;AACtF,MAAM,UAAU,sBAAsB,CACpC,MAAiB,EACjB,MAAwB,EACxB,IAAqB;IAErB,MAAM,CAAC,IAAI,CACT,cAAc,EACd,gBAAgB,EAChB;QACE,UAAU,EAAE,CAAC;aACV,MAAM,EAAE;aACR,GAAG,CAAC,CAAC,CAAC;aACN,QAAQ,CAAC,wEAAwE,CAAC;QACrF,GAAG,gBAAgB;QACnB,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,mDAAmD,CAAC;KAC3F,EACD,EAAE,YAAY,EAAE,IAAI,EAAE,eAAe,EAAE,KAAK,EAAE,aAAa,EAAE,IAAI,EAAE,EACnE,KAAK,EAAE,EAAE,UAAU,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,EAA2B,EAAE;QACpE,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,qBAAqB,CAAC,UAAU,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC;YACtF,OAAO,MAAM,CAAC;gBACZ,KAAK,EAAE,MAAM,CAAC,KAAK;gBACnB,KAAK,EAAE,MAAM,CAAC,KAAK;gBACnB,IAAI;gBACJ,YAAY,EAAE,KAAK;aACpB,CAAmB,CAAC;QACvB,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAI,GAAG,YAAY,eAAe;gBAAE,OAAO,KAAK,CAAC,GAAG,CAAmB,CAAC;YACxE,OAAO,KAAK,CAAC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAmB,CAAC;QACtF,CAAC;IACH,CAAC,CACF,CAAC;IAEF,MAAM,CAAC,IAAI,CACT,aAAa,EACb,eAAe,EACf;QACE,KAAK,EAAE,CAAC;aACL,MAAM,EAAE;aACR,GAAG,CAAC,CAAC,CAAC;aACN,QAAQ,CAAC,iFAAiF,CAAC;KAC/F,EACD,EAAE,YAAY,EAAE,IAAI,EAAE,eAAe,EAAE,KAAK,EAAE,aAAa,EAAE,IAAI,EAAE,EACnE,KAAK,EAAE,EAAE,KAAK,EAAE,EAA2B,EAAE;QAC3C,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,mBAAmB,CAAC,KAAK,CAAC,CAAC;YACzD,OAAO,EAAE,CAAC,QAAQ,CAAmB,CAAC;QACxC,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAI,GAAG,YAAY,eAAe;gBAAE,OAAO,KAAK,CAAC,GAAG,CAAmB,CAAC;YACxE,OAAO,KAAK,CAAC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAmB,CAAC;QACtF,CAAC;IACH,CAAC,CACF,CAAC;IAEF,IAAI,CAAC,IAAI,CAAC,YAAY;QAAE,OAAO;IAE/B,MAAM,CAAC,IAAI,CACT,gBAAgB,EAChB,kBAAkB,EAClB,mBAAmB,EACnB,EAAE,YAAY,EAAE,KAAK,EAAE,eAAe,EAAE,KAAK,EAAE,cAAc,EAAE,KAAK,EAAE,aAAa,EAAE,IAAI,EAAE,EAC3F,KAAK,EAAE,EAAE,UAAU,EAAE,GAAG,MAAM,EAAE,EAA2B,EAAE;QAC3D,IAAI,CAAC;YACH,MAAM,KAAK,GAAG,mBAAmB,CAAC,UAAU,CAAC,CAAC;YAC9C,MAAM,IAAI,GAAG,iBAAiB,CAAC,KAAK,EAAE,MAAwB,CAAC,CAAC;YAChE,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,sBAAsB,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC;YACtE,OAAO,EAAE,CAAC,OAAO,CAAmB,CAAC;QACvC,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAI,GAAG,YAAY,eAAe;gBAAE,OAAO,KAAK,CAAC,GAAG,CAAmB,CAAC;YACxE,OAAO,KAAK,CAAC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAmB,CAAC;QACtF,CAAC;IACH,CAAC,CACF,CAAC;IAEF,MAAM,CAAC,IAAI,CACT,uBAAuB,EACvB,yBAAyB,EACzB,yBAAyB,EACzB,EAAE,YAAY,EAAE,KAAK,EAAE,eAAe,EAAE,IAAI,EAAE,cAAc,EAAE,IAAI,EAAE,aAAa,EAAE,IAAI,EAAE,EACzF,KAAK,EAAE,EAAE,UAAU,EAAE,UAAU,EAAE,SAAS,EAAE,QAAQ,EAAE,EAA2B,EAAE;QACjF,IAAI,CAAC;YACH,IAAI,SAAS,KAAK,SAAS,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;gBACtD,OAAO,KAAK,CACV,IAAI,KAAK,CAAC,wCAAwC,CAAC,CAClC,CAAC;YACtB,CAAC;YACD,MAAM,KAAK,GAAG,mBAAmB,CAAC,UAAU,CAAC,CAAC;YAC9C,MAAM,IAAI,GAA4B;gBACpC,SAAS,EAAE,KAAK,CAAC,OAAO;gBACxB,WAAW,EAAE,KAAK,CAAC,UAAU;gBAC7B,UAAU,EAAE,KAAK,CAAC,WAAW;gBAC7B,SAAS,EAAE,KAAK,CAAC,WAAW;aAC7B,CAAC;YACF,IAAI,SAAS,KAAK,SAAS;gBAAE,IAAI,CAAC,eAAe,CAAC,GAAG,SAAS,CAAC;YAC/D,IAAI,QAAQ,KAAK,SAAS;gBAAE,IAAI,CAAC,cAAc,CAAC,GAAG,QAAQ,CAAC;YAC5D,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,oBAAoB,CAAC,UAAU,EAAE,UAAU,EAAE,IAAI,CAAC,CAAC;YAChF,OAAO,EAAE,CAAC,OAAO,CAAmB,CAAC;QACvC,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAI,GAAG,YAAY,eAAe;gBAAE,OAAO,KAAK,CAAC,GAAG,CAAmB,CAAC;YACxE,OAAO,KAAK,CAAC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAmB,CAAC;QACtF,CAAC;IACH,CAAC,CACF,CAAC;IAEF,MAAM,CAAC,IAAI,CACT,qBAAqB,EACrB,uBAAuB,EACvB,6BAA6B,EAC7B,EAAE,YAAY,EAAE,KAAK,EAAE,eAAe,EAAE,KAAK,EAAE,cAAc,EAAE,KAAK,EAAE,aAAa,EAAE,IAAI,EAAE,EAC3F,KAAK,EAAE,EAAE,UAAU,EAAE,UAAU,EAAE,GAAG,MAAM,EAAE,EAA2B,EAAE;QACvE,IAAI,CAAC;YACH,MAAM,KAAK,GAAG,mBAAmB,CAAC,UAAU,CAAC,CAAC;YAC9C,MAAM,IAAI,GAAG,yBAAyB,CAAC,KAAK,EAAE,MAAgC,CAAC,CAAC;YAChF,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,8BAA8B,CAAC,UAAU,EAAE,UAAU,EAAE,IAAI,CAAC,CAAC;YAC1F,OAAO,EAAE,CAAC,OAAO,CAAmB,CAAC;QACvC,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAI,GAAG,YAAY,eAAe;gBAAE,OAAO,KAAK,CAAC,GAAG,CAAmB,CAAC;YACxE,OAAO,KAAK,CAAC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAmB,CAAC;QACtF,CAAC;IACH,CAAC,CACF,CAAC;IAEF,MAAM,CAAC,IAAI,CACT,qBAAqB,EACrB,uBAAuB,EACvB,6BAA6B,EAC7B,EAAE,YAAY,EAAE,KAAK,EAAE,eAAe,EAAE,IAAI,EAAE,cAAc,EAAE,IAAI,EAAE,aAAa,EAAE,IAAI,EAAE,EACzF,KAAK,EAAE,EAAE,UAAU,EAAE,UAAU,EAAE,GAAG,MAAM,EAAE,EAA2B,EAAE;QACvE,IAAI,CAAC;YACH,MAAM,KAAK,GAAG,mBAAmB,CAAC,UAAU,CAAC,CAAC;YAC9C,MAAM,IAAI,GAAG,yBAAyB,CAAC,KAAK,EAAE,MAAgC,CAAC,CAAC;YAChF,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,8BAA8B,CAAC,UAAU,EAAE,UAAU,EAAE,IAAI,CAAC,CAAC;YAC1F,OAAO,EAAE,CAAC,OAAO,CAAmB,CAAC;QACvC,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAI,GAAG,YAAY,eAAe;gBAAE,OAAO,KAAK,CAAC,GAAG,CAAmB,CAAC;YACxE,OAAO,KAAK,CAAC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAmB,CAAC;QACtF,CAAC;IACH,CAAC,CACF,CAAC;IAEF,MAAM,CAAC,IAAI,CACT,uBAAuB,EACvB,yBAAyB,EACzB,iCAAiC,EACjC,EAAE,YAAY,EAAE,KAAK,EAAE,eAAe,EAAE,KAAK,EAAE,cAAc,EAAE,KAAK,EAAE,aAAa,EAAE,IAAI,EAAE,EAC3F,KAAK,EAAE,EAAE,UAAU,EAAE,UAAU,EAAE,KAAK,EAAE,KAAK,EAAE,aAAa,EAAE,EAA2B,EAAE;QACzF,IAAI,CAAC;YACH,MAAM,KAAK,GAAG,mBAAmB,CAAC,UAAU,CAAC,CAAC;YAC9C,MAAM,IAAI,GAAG,uBAAuB,CAAC,KAAK,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,aAAa,EAAE,CAAC,CAAC;YAC7E,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,4BAA4B,CAAC,UAAU,EAAE,UAAU,EAAE,IAAI,CAAC,CAAC;YACxF,OAAO,EAAE,CAAC,OAAO,CAAmB,CAAC;QACvC,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAI,GAAG,YAAY,eAAe;gBAAE,OAAO,KAAK,CAAC,GAAG,CAAmB,CAAC;YACxE,OAAO,KAAK,CAAC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAmB,CAAC;QACtF,CAAC;IACH,CAAC,CACF,CAAC;IAEF,MAAM,CAAC,IAAI,CACT,oBAAoB,EACpB,sBAAsB,EACtB,8BAA8B,EAC9B,EAAE,YAAY,EAAE,KAAK,EAAE,eAAe,EAAE,IAAI,EAAE,cAAc,EAAE,IAAI,EAAE,aAAa,EAAE,IAAI,EAAE,EACzF,KAAK,EAAE,EAAE,UAAU,EAAE,UAAU,EAAE,GAAG,MAAM,EAAE,EAA2B,EAAE;QACvE,IAAI,CAAC;YACH,MAAM,KAAK,GAAG,mBAAmB,CAAC,UAAU,CAAC,CAAC;YAC9C,MAAM,IAAI,GAAG,4BAA4B,CAAC,KAAK,EAAE,MAAmC,CAAC,CAAC;YACtF,4EAA4E;YAC5E,IAAI,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC;gBAClC,OAAO,KAAK,CACV,IAAI,KAAK,CAAC,+DAA+D,CAAC,CACzD,CAAC;YACtB,CAAC;YACD,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,yBAAyB,CAAC,UAAU,EAAE,UAAU,EAAE,IAAI,CAAC,CAAC;YACrF,OAAO,EAAE,CAAC,OAAO,CAAmB,CAAC;QACvC,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAI,GAAG,YAAY,eAAe;gBAAE,OAAO,KAAK,CAAC,GAAG,CAAmB,CAAC;YACxE,OAAO,KAAK,CAAC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAmB,CAAC;QACtF,CAAC;IACH,CAAC,CACF,CAAC;AACJ,CAAC"}
|
|
@@ -4,6 +4,8 @@ export interface HttpTransportConfig {
|
|
|
4
4
|
port: number;
|
|
5
5
|
client: FreematicaClient;
|
|
6
6
|
allowedOrigins: string;
|
|
7
|
+
/** Override del flag de escrituras; si se omite se lee FREEMATICA_ENABLE_WRITES. */
|
|
8
|
+
enableWrites?: boolean;
|
|
7
9
|
}
|
|
8
10
|
export interface HttpAppResult {
|
|
9
11
|
app: express.Application;
|
package/dist/transports/http.js
CHANGED
|
@@ -4,6 +4,7 @@ import rateLimit from 'express-rate-limit';
|
|
|
4
4
|
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
|
+
import { loadWritesConfig } from '../config.js';
|
|
7
8
|
import { createFreematicaServer } from '../server.js';
|
|
8
9
|
import { VERSION } from '../version.js';
|
|
9
10
|
import { logger } from '../logger.js';
|
|
@@ -60,7 +61,8 @@ export async function createHttpApp(config) {
|
|
|
60
61
|
if (transport.sessionId)
|
|
61
62
|
sessions.delete(transport.sessionId);
|
|
62
63
|
};
|
|
63
|
-
const
|
|
64
|
+
const enableWrites = config.enableWrites ?? loadWritesConfig().FREEMATICA_ENABLE_WRITES;
|
|
65
|
+
const server = createFreematicaServer({ client: config.client, enableWrites });
|
|
64
66
|
await server.connect(transport);
|
|
65
67
|
await transport.handleRequest(req, res, req.body);
|
|
66
68
|
return;
|