@frihet/mcp-server 1.7.0-beta.1 → 1.9.0-beta.1

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.
Files changed (65) hide show
  1. package/README.md +8 -6
  2. package/dist/__tests__/banking-tools.test.d.ts +18 -0
  3. package/dist/__tests__/banking-tools.test.d.ts.map +1 -0
  4. package/dist/__tests__/banking-tools.test.js +252 -0
  5. package/dist/__tests__/banking-tools.test.js.map +1 -0
  6. package/dist/__tests__/fiscal-tools.test.d.ts +20 -0
  7. package/dist/__tests__/fiscal-tools.test.d.ts.map +1 -0
  8. package/dist/__tests__/fiscal-tools.test.js +233 -0
  9. package/dist/__tests__/fiscal-tools.test.js.map +1 -0
  10. package/dist/__tests__/pos-tools.test.d.ts +16 -0
  11. package/dist/__tests__/pos-tools.test.d.ts.map +1 -0
  12. package/dist/__tests__/pos-tools.test.js +244 -0
  13. package/dist/__tests__/pos-tools.test.js.map +1 -0
  14. package/dist/__tests__/recurring-tools.test.d.ts +16 -0
  15. package/dist/__tests__/recurring-tools.test.d.ts.map +1 -0
  16. package/dist/__tests__/recurring-tools.test.js +166 -0
  17. package/dist/__tests__/recurring-tools.test.js.map +1 -0
  18. package/dist/__tests__/stay-tools.test.d.ts +17 -0
  19. package/dist/__tests__/stay-tools.test.d.ts.map +1 -0
  20. package/dist/__tests__/stay-tools.test.js +259 -0
  21. package/dist/__tests__/stay-tools.test.js.map +1 -0
  22. package/dist/__tests__/time-tools.test.d.ts +17 -0
  23. package/dist/__tests__/time-tools.test.d.ts.map +1 -0
  24. package/dist/__tests__/time-tools.test.js +199 -0
  25. package/dist/__tests__/time-tools.test.js.map +1 -0
  26. package/dist/client-interface.d.ts +89 -0
  27. package/dist/client-interface.d.ts.map +1 -1
  28. package/dist/client.d.ts +89 -0
  29. package/dist/client.d.ts.map +1 -1
  30. package/dist/client.js +145 -0
  31. package/dist/client.js.map +1 -1
  32. package/dist/index.js +0 -0
  33. package/dist/tools/banking.d.ts +19 -0
  34. package/dist/tools/banking.d.ts.map +1 -0
  35. package/dist/tools/banking.js +155 -0
  36. package/dist/tools/banking.js.map +1 -0
  37. package/dist/tools/fiscal.d.ts +22 -0
  38. package/dist/tools/fiscal.d.ts.map +1 -0
  39. package/dist/tools/fiscal.js +215 -0
  40. package/dist/tools/fiscal.js.map +1 -0
  41. package/dist/tools/pos.d.ts +15 -0
  42. package/dist/tools/pos.d.ts.map +1 -0
  43. package/dist/tools/pos.js +156 -0
  44. package/dist/tools/pos.js.map +1 -0
  45. package/dist/tools/recurring.d.ts +16 -0
  46. package/dist/tools/recurring.d.ts.map +1 -0
  47. package/dist/tools/recurring.js +67 -0
  48. package/dist/tools/recurring.js.map +1 -0
  49. package/dist/tools/register-all.d.ts +2 -2
  50. package/dist/tools/register-all.d.ts.map +1 -1
  51. package/dist/tools/register-all.js +14 -2
  52. package/dist/tools/register-all.js.map +1 -1
  53. package/dist/tools/shared.d.ts +169 -0
  54. package/dist/tools/shared.d.ts.map +1 -1
  55. package/dist/tools/shared.js +140 -0
  56. package/dist/tools/shared.js.map +1 -1
  57. package/dist/tools/stay.d.ts +6 -78
  58. package/dist/tools/stay.d.ts.map +1 -1
  59. package/dist/tools/stay.js +121 -343
  60. package/dist/tools/stay.js.map +1 -1
  61. package/dist/tools/time.d.ts +18 -0
  62. package/dist/tools/time.d.ts.map +1 -0
  63. package/dist/tools/time.js +134 -0
  64. package/dist/tools/time.js.map +1 -0
  65. package/package.json +3 -3
@@ -1,219 +1,73 @@
1
1
  /**
2
2
  * Stay tools for the Frihet MCP server.
3
3
  *
4
- * Covers property management, reservations, operations (cleaning, occupancy),
5
- * iCal channel sync, and guest compliance — all routed to api.frihet.io/v1/stay/*.
4
+ * Wave 4 5 tools for vacation rental management:
5
+ * list_reservations, get_reservation, create_reservation,
6
+ * list_properties, sync_channel
7
+ *
8
+ * ERP backend endpoints land separately (Frihet-ERP S2 sprint).
9
+ * Tools target /v1/stay/reservations, /v1/stay/properties, /v1/stay/channels.
6
10
  */
7
11
  import { z } from "zod/v4";
8
- import { withToolLogging, formatPaginatedResponse, formatRecord, listContent, getContent, mutateContent, enrichResponse, READ_ONLY_ANNOTATIONS, CREATE_ANNOTATIONS, UPDATE_ANNOTATIONS, paginatedOutput, actionResultOutput, } from "./shared.js";
9
- /* ------------------------------------------------------------------ */
10
- /* Output schemas */
11
- /* ------------------------------------------------------------------ */
12
- export const propertyItemOutput = z.object({
13
- id: z.string(),
14
- name: z.string(),
15
- type: z.string().optional(),
16
- address: z.string().optional(),
17
- maxGuests: z.number().optional(),
18
- bedrooms: z.number().optional(),
19
- bathrooms: z.number().optional(),
20
- active: z.boolean().optional(),
21
- licenseNumber: z.string().optional(),
22
- createdAt: z.string().optional(),
23
- updatedAt: z.string().optional(),
24
- }).passthrough();
25
- export const reservationItemOutput = z.object({
26
- id: z.string(),
27
- propertyId: z.string(),
28
- propertyName: z.string().optional(),
29
- guestName: z.string(),
30
- guestEmail: z.string().optional(),
31
- guestPhone: z.string().optional(),
32
- checkIn: z.string(),
33
- checkOut: z.string(),
34
- status: z.string().optional(),
35
- totalAmount: z.number().optional(),
36
- nightlyRate: z.number().optional(),
37
- numGuests: z.number().optional(),
38
- channel: z.string().optional(),
39
- notes: z.string().optional(),
40
- createdAt: z.string().optional(),
41
- updatedAt: z.string().optional(),
42
- }).passthrough();
43
- export const cleaningTaskItemOutput = z.object({
44
- id: z.string(),
45
- propertyId: z.string(),
46
- propertyName: z.string().optional(),
47
- reservationId: z.string().optional(),
48
- status: z.string().optional(),
49
- scheduledAt: z.string().optional(),
50
- completedAt: z.string().optional(),
51
- assignedTo: z.string().optional(),
52
- notes: z.string().optional(),
53
- createdAt: z.string().optional(),
54
- updatedAt: z.string().optional(),
55
- }).passthrough();
56
- export const occupancyStatsOutput = z.object({
57
- from: z.string(),
58
- to: z.string(),
59
- occupancyRate: z.number().optional(),
60
- totalRevenue: z.number().optional(),
61
- adr: z.number().optional(),
62
- revPAR: z.number().optional(),
63
- totalNights: z.number().optional(),
64
- occupiedNights: z.number().optional(),
65
- reservationsCount: z.number().optional(),
66
- byProperty: z.array(z.object({
67
- propertyId: z.string(),
68
- propertyName: z.string().optional(),
69
- occupancyRate: z.number().optional(),
70
- revenue: z.number().optional(),
71
- adr: z.number().optional(),
72
- }).passthrough()).optional(),
73
- }).passthrough();
74
- export const complianceStatusOutput = z.object({
75
- total: z.number(),
76
- verified: z.number(),
77
- pending: z.number(),
78
- expired: z.number().optional(),
79
- byProperty: z.array(z.object({
80
- propertyId: z.string(),
81
- propertyName: z.string().optional(),
82
- verified: z.number(),
83
- pending: z.number(),
84
- total: z.number(),
85
- }).passthrough()).optional(),
86
- }).passthrough();
87
- /* ------------------------------------------------------------------ */
88
- /* Tool registration */
89
- /* ------------------------------------------------------------------ */
12
+ import { withToolLogging, formatPaginatedResponse, formatRecord, listContent, getContent, mutateContent, READ_ONLY_ANNOTATIONS, CREATE_ANNOTATIONS, UPDATE_ANNOTATIONS, paginatedOutput, reservationItemOutput, propertyItemOutput, } from "./shared.js";
90
13
  export function registerStayTools(server, client) {
91
- // -- list_properties --
92
- server.registerTool("list_properties", {
93
- title: "List Properties (Stay)",
94
- description: "List all Stay properties with optional filters. " +
95
- "Returns properties the authenticated user manages, sorted by name. " +
96
- "Use active=true to list only active rentals. " +
97
- "/ Lista todas las propiedades de Stay con filtros opcionales. " +
98
- "Devuelve las propiedades del usuario autenticado, ordenadas por nombre. " +
99
- "Usa active=true para listar solo alquileres activos.",
100
- annotations: READ_ONLY_ANNOTATIONS,
101
- inputSchema: {
102
- active: z
103
- .boolean()
104
- .optional()
105
- .describe("Filter by active/inactive status / Filtrar por estado activo/inactivo"),
106
- type: z
107
- .string()
108
- .optional()
109
- .describe("Filter by property type (apartment, house, room, villa...) / Filtrar por tipo de propiedad"),
110
- limit: z
111
- .number().int().min(1).max(100)
112
- .optional()
113
- .describe("Max results per page (1-100, default 50) / Resultados por pagina"),
114
- offset: z
115
- .number().int().min(0)
116
- .optional()
117
- .describe("Number of results to skip / Resultados a saltar"),
118
- after: z
119
- .string()
120
- .optional()
121
- .describe("Cursor for cursor-based pagination / Cursor de paginacion"),
122
- },
123
- outputSchema: paginatedOutput(propertyItemOutput),
124
- }, async ({ active, type, limit, offset, after }) => withToolLogging("list_properties", async () => {
125
- const result = await client.listStayProperties({ active, type, limit, offset, after });
126
- const hints = enrichResponse("stay_properties", "list", result.data);
127
- return {
128
- content: [listContent(formatPaginatedResponse("properties", result))],
129
- structuredContent: { ...result, ...hints },
130
- };
131
- }));
132
- // -- get_property --
133
- server.registerTool("get_property", {
134
- title: "Get Property (Stay)",
135
- description: "Get full details of a Stay property by its ID. " +
136
- "Returns address, capacity, license number, pricing, and active status. " +
137
- "/ Obtiene los detalles completos de una propiedad de Stay por su ID. " +
138
- "Devuelve direccion, capacidad, numero de licencia, precios y estado activo.",
139
- annotations: READ_ONLY_ANNOTATIONS,
140
- inputSchema: {
141
- id: z.string().describe("Property ID / ID de la propiedad"),
142
- },
143
- outputSchema: propertyItemOutput,
144
- }, async ({ id }) => withToolLogging("get_property", async () => {
145
- const result = await client.getStayProperty(id);
146
- return {
147
- content: [getContent(formatRecord("Property", result))],
148
- structuredContent: result,
149
- };
150
- }));
151
14
  // -- list_reservations --
152
15
  server.registerTool("list_reservations", {
153
- title: "List Reservations (Stay)",
154
- description: "List Stay reservations with optional filters by date range, property, status, or channel. " +
155
- "Sorted by check-in date descending. " +
156
- "Example: propertyId='abc', from='2026-06-01', to='2026-06-30', status='confirmed' " +
157
- "/ Lista reservas de Stay con filtros opcionales por fecha, propiedad, estado o canal. " +
158
- "Ordenadas por fecha de entrada descendente.",
16
+ title: "List Reservations",
17
+ description: "List all reservations for the workspace, with optional filters by " +
18
+ "property, status, or date range. Returns guest, dates, channel, and total. " +
19
+ "/ Lista todas las reservas del espacio de trabajo, con filtros opcionales " +
20
+ "por propiedad, estado o rango de fechas.",
159
21
  annotations: READ_ONLY_ANNOTATIONS,
160
22
  inputSchema: {
161
23
  propertyId: z
162
24
  .string()
163
25
  .optional()
164
- .describe("Filter by property ID / Filtrar por ID de propiedad"),
165
- from: z
166
- .string()
167
- .optional()
168
- .describe("Check-in on or after this date (YYYY-MM-DD) / Fecha de entrada desde"),
169
- to: z
170
- .string()
171
- .optional()
172
- .describe("Check-in on or before this date (YYYY-MM-DD) / Fecha de entrada hasta"),
26
+ .describe("Filter by property ID / Filtrar por propiedad"),
173
27
  status: z
174
- .enum(["pending", "confirmed", "checked_in", "checked_out", "cancelled", "no_show"])
28
+ .enum(["confirmed", "pending", "cancelled", "completed", "no_show"])
175
29
  .optional()
176
30
  .describe("Filter by reservation status / Filtrar por estado"),
177
- channel: z
31
+ checkInFrom: z
178
32
  .string()
179
33
  .optional()
180
- .describe("Filter by channel (airbnb, booking, direct...) / Filtrar por canal"),
181
- limit: z
182
- .number().int().min(1).max(100)
34
+ .describe("Check-in from date YYYY-MM-DD / Entrada desde (YYYY-MM-DD)"),
35
+ checkInTo: z
36
+ .string()
183
37
  .optional()
184
- .describe("Max results per page (1-100) / Resultados por pagina"),
185
- offset: z
186
- .number().int().min(0)
38
+ .describe("Check-in to date YYYY-MM-DD / Entrada hasta (YYYY-MM-DD)"),
39
+ fields: z
40
+ .string()
187
41
  .optional()
188
- .describe("Number of results to skip / Resultados a saltar"),
42
+ .describe("Comma-separated fields to return / Campos a devolver"),
43
+ limit: z.number().int().min(1).max(100).optional().describe("Max results (1-100)"),
44
+ offset: z.number().int().min(0).optional().describe("Offset for pagination / Desplazamiento"),
189
45
  after: z
190
46
  .string()
191
47
  .optional()
192
48
  .describe("Cursor for cursor-based pagination / Cursor de paginacion"),
193
49
  },
194
50
  outputSchema: paginatedOutput(reservationItemOutput),
195
- }, async ({ propertyId, from, to, status, channel, limit, offset, after }) => withToolLogging("list_reservations", async () => {
196
- const result = await client.listStayReservations({ propertyId, from, to, status, channel, limit, offset, after });
197
- const hints = enrichResponse("stay_reservations", "list", result.data);
51
+ }, async (args) => withToolLogging("list_reservations", async () => {
52
+ const result = await client.listReservations(args);
198
53
  return {
199
54
  content: [listContent(formatPaginatedResponse("reservations", result))],
200
- structuredContent: { ...result, ...hints },
55
+ structuredContent: result,
201
56
  };
202
57
  }));
203
58
  // -- get_reservation --
204
59
  server.registerTool("get_reservation", {
205
- title: "Get Reservation (Stay)",
206
- description: "Get full details of a Stay reservation by its ID. " +
207
- "Returns guest info, dates, amounts, channel, and status. " +
208
- "/ Obtiene los detalles completos de una reserva de Stay por su ID. " +
209
- "Devuelve datos del huesped, fechas, importes, canal y estado.",
60
+ title: "Get Reservation",
61
+ description: "Get a single reservation by ID. Returns full booking details: guest, " +
62
+ "property, dates, channel, payment status, and notes. " +
63
+ "/ Obtiene una reserva por ID. Devuelve todos los detalles de la reserva.",
210
64
  annotations: READ_ONLY_ANNOTATIONS,
211
65
  inputSchema: {
212
- id: z.string().describe("Reservation ID / ID de la reserva"),
66
+ id: z.string().describe("Reservation ID / ID de reserva"),
213
67
  },
214
68
  outputSchema: reservationItemOutput,
215
69
  }, async ({ id }) => withToolLogging("get_reservation", async () => {
216
- const result = await client.getStayReservation(id);
70
+ const result = await client.getReservation(id);
217
71
  return {
218
72
  content: [getContent(formatRecord("Reservation", result))],
219
73
  structuredContent: result,
@@ -221,201 +75,125 @@ export function registerStayTools(server, client) {
221
75
  }));
222
76
  // -- create_reservation --
223
77
  server.registerTool("create_reservation", {
224
- title: "Create Reservation (Stay)",
225
- description: "Create a new Stay reservation. Requires property ID, guest name, check-in and check-out dates. " +
226
- "Check-in and check-out must be in YYYY-MM-DD format, check-out after check-in. " +
227
- "/ Crea una nueva reserva de Stay. Requiere ID de propiedad, nombre del huesped y fechas. " +
228
- "Las fechas deben estar en formato YYYY-MM-DD, check-out despues de check-in.",
78
+ title: "Create Reservation",
79
+ description: "Create a new reservation manually (not via channel sync). Requires property ID, " +
80
+ "check-in/check-out dates, and guest count. Optionally provide a guest ID or " +
81
+ "inline guest data to create a new guest. " +
82
+ "/ Crea una nueva reserva manualmente. Requiere propiedad, fechas y numero de huespedes.",
229
83
  annotations: CREATE_ANNOTATIONS,
230
84
  inputSchema: {
231
- propertyId: z.string().describe("Property ID / ID de la propiedad"),
232
- guestName: z.string().describe("Guest full name / Nombre completo del huesped"),
233
- guestEmail: z.string().optional().describe("Guest email / Email del huesped"),
234
- guestPhone: z.string().optional().describe("Guest phone / Telefono del huesped"),
235
- checkIn: z.string().describe("Check-in date (YYYY-MM-DD) / Fecha de entrada"),
236
- checkOut: z.string().describe("Check-out date (YYYY-MM-DD) / Fecha de salida"),
237
- numGuests: z.number().int().min(1).optional().describe("Number of guests / Numero de huespedes"),
238
- nightlyRate: z.number().optional().describe("Nightly rate in EUR / Precio por noche en EUR"),
239
- totalAmount: z.number().optional().describe("Total amount in EUR (override auto-calc) / Importe total en EUR"),
240
- channel: z.string().optional().describe("Booking channel (airbnb, booking, direct...) / Canal de reserva"),
241
- status: z
242
- .enum(["pending", "confirmed"])
85
+ propertyId: z.string().describe("Property ID / ID de propiedad"),
86
+ guestId: z
87
+ .string()
243
88
  .optional()
244
- .describe("Initial status (default: confirmed) / Estado inicial"),
245
- notes: z.string().optional().describe("Internal notes / Notas internas"),
246
- },
247
- outputSchema: reservationItemOutput,
248
- }, async (input) => withToolLogging("create_reservation", async () => {
249
- const result = await client.createStayReservation(input);
250
- const hints = enrichResponse("stay_reservations", "create", result);
251
- return {
252
- content: [mutateContent(formatRecord("Reservation created", result))],
253
- structuredContent: { ...result, ...hints },
254
- };
255
- }));
256
- // -- update_reservation --
257
- server.registerTool("update_reservation", {
258
- title: "Update Reservation (Stay)",
259
- description: "Update an existing Stay reservation using PATCH semantics. Only provided fields are changed. " +
260
- "Use status='cancelled' to cancel a reservation, or update dates, guest info, or amounts. " +
261
- "/ Actualiza una reserva de Stay existente. Solo se modifican los campos proporcionados. " +
262
- "Usa status='cancelled' para cancelar una reserva.",
263
- annotations: UPDATE_ANNOTATIONS,
264
- inputSchema: {
265
- id: z.string().describe("Reservation ID / ID de la reserva"),
266
- guestName: z.string().optional().describe("Guest name / Nombre del huesped"),
267
- guestEmail: z.string().optional().describe("Guest email / Email del huesped"),
268
- guestPhone: z.string().optional().describe("Guest phone / Telefono del huesped"),
269
- checkIn: z.string().optional().describe("Check-in date (YYYY-MM-DD) / Fecha de entrada"),
270
- checkOut: z.string().optional().describe("Check-out date (YYYY-MM-DD) / Fecha de salida"),
271
- numGuests: z.number().int().min(1).optional().describe("Number of guests / Numero de huespedes"),
272
- nightlyRate: z.number().optional().describe("Nightly rate in EUR / Precio por noche"),
273
- totalAmount: z.number().optional().describe("Total amount in EUR / Importe total"),
274
- status: z
275
- .enum(["pending", "confirmed", "checked_in", "checked_out", "cancelled", "no_show"])
89
+ .describe("Existing guest ID (if known) / ID de huesped existente"),
90
+ guest: z
91
+ .object({
92
+ name: z.string().describe("Guest full name / Nombre completo del huesped"),
93
+ email: z.string().optional().describe("Guest email / Email del huesped"),
94
+ phone: z.string().optional().describe("Guest phone / Telefono del huesped"),
95
+ idDocument: z
96
+ .string()
97
+ .optional()
98
+ .describe("DNI/passport number / Numero de DNI o pasaporte"),
99
+ country: z
100
+ .string()
101
+ .optional()
102
+ .describe("Country ISO 3166-1 alpha-2 (e.g. ES, DE) / Pais"),
103
+ })
104
+ .optional()
105
+ .describe("New guest data (used if guestId not provided) / Datos del nuevo huesped si no se proporciona guestId"),
106
+ checkIn: z.string().describe("Check-in date YYYY-MM-DD / Fecha de entrada"),
107
+ checkOut: z.string().describe("Check-out date YYYY-MM-DD / Fecha de salida"),
108
+ guestCount: z.number().int().min(1).describe("Number of guests / Numero de huespedes"),
109
+ channelId: z
110
+ .string()
111
+ .optional()
112
+ .describe("Booking channel ID (Airbnb, Booking.com, Direct) / Canal de reserva"),
113
+ totalAmount: z
114
+ .number()
115
+ .nonnegative()
276
116
  .optional()
277
- .describe("Reservation status / Estado de la reserva"),
117
+ .describe("Total amount in workspace currency / Importe total"),
118
+ currency: z
119
+ .string()
120
+ .optional()
121
+ .describe("ISO 4217 currency (defaults to workspace currency) / Divisa"),
278
122
  notes: z.string().optional().describe("Internal notes / Notas internas"),
279
123
  },
280
124
  outputSchema: reservationItemOutput,
281
- }, async ({ id, ...data }) => withToolLogging("update_reservation", async () => {
282
- const result = await client.updateStayReservation(id, data);
283
- const hints = enrichResponse("stay_reservations", "update", result);
125
+ }, async (args) => withToolLogging("create_reservation", async () => {
126
+ const result = await client.createReservation(args);
284
127
  return {
285
- content: [mutateContent(formatRecord("Reservation updated", result))],
286
- structuredContent: { ...result, ...hints },
128
+ content: [mutateContent(formatRecord("Reservation created", result))],
129
+ structuredContent: result,
287
130
  };
288
131
  }));
289
- // -- list_cleaning_tasks --
290
- server.registerTool("list_cleaning_tasks", {
291
- title: "List Cleaning Tasks (Stay)",
292
- description: "List cleaning tasks for Stay properties, optionally filtered by status or property. " +
293
- "Useful for operations management and cleaning schedule overview. " +
294
- "Statuses: pending, in_progress, done, skipped. " +
295
- "/ Lista tareas de limpieza para propiedades de Stay, con filtro opcional por estado o propiedad. " +
296
- "Estados: pending, in_progress, done, skipped.",
132
+ // -- list_properties --
133
+ server.registerTool("list_properties", {
134
+ title: "List Properties",
135
+ description: "List all rental properties for the workspace. Returns name, address, " +
136
+ "capacity, owner info, and license number. " +
137
+ "/ Lista todas las propiedades de alquiler vacacional. Devuelve nombre, " +
138
+ "direccion, capacidad, datos del propietario y numero de licencia.",
297
139
  annotations: READ_ONLY_ANNOTATIONS,
298
140
  inputSchema: {
299
- status: z
300
- .enum(["pending", "in_progress", "done", "skipped"])
301
- .optional()
302
- .describe("Filter by task status / Filtrar por estado de la tarea"),
303
- propertyId: z
141
+ q: z
304
142
  .string()
305
143
  .optional()
306
- .describe("Filter by property ID / Filtrar por ID de propiedad"),
307
- from: z
308
- .string()
144
+ .describe("Search by name or address / Buscar por nombre o direccion"),
145
+ isActive: z
146
+ .boolean()
309
147
  .optional()
310
- .describe("Scheduled on or after this date (YYYY-MM-DD) / Fecha programada desde"),
311
- to: z
148
+ .describe("Filter by active status / Filtrar por activas"),
149
+ fields: z
312
150
  .string()
313
151
  .optional()
314
- .describe("Scheduled on or before this date (YYYY-MM-DD) / Fecha programada hasta"),
315
- limit: z
316
- .number().int().min(1).max(100)
317
- .optional()
318
- .describe("Max results per page / Resultados por pagina"),
319
- offset: z
320
- .number().int().min(0)
321
- .optional()
322
- .describe("Results to skip / Resultados a saltar"),
152
+ .describe("Comma-separated fields to return / Campos a devolver"),
153
+ limit: z.number().int().min(1).max(100).optional().describe("Max results (1-100)"),
154
+ offset: z.number().int().min(0).optional().describe("Offset / Desplazamiento"),
323
155
  after: z
324
156
  .string()
325
157
  .optional()
326
158
  .describe("Cursor for cursor-based pagination / Cursor de paginacion"),
327
159
  },
328
- outputSchema: paginatedOutput(cleaningTaskItemOutput),
329
- }, async ({ status, propertyId, from, to, limit, offset, after }) => withToolLogging("list_cleaning_tasks", async () => {
330
- const result = await client.listStayCleaningTasks({ status, propertyId, from, to, limit, offset, after });
331
- return {
332
- content: [listContent(formatPaginatedResponse("cleaning tasks", result))],
333
- structuredContent: result,
334
- };
335
- }));
336
- // -- get_occupancy_stats --
337
- server.registerTool("get_occupancy_stats", {
338
- title: "Get Occupancy Stats (Stay)",
339
- description: "Get occupancy rate, total revenue, ADR (average daily rate), and RevPAR for a date range. " +
340
- "Optionally filtered to a specific property. " +
341
- "Returns per-property breakdown when propertyId is not specified. " +
342
- "/ Obtiene tasa de ocupacion, ingresos totales, ADR y RevPAR para un rango de fechas. " +
343
- "Filtro opcional por propiedad. Devuelve desglose por propiedad si no se especifica.",
344
- annotations: READ_ONLY_ANNOTATIONS,
345
- inputSchema: {
346
- from: z.string().describe("Start date (YYYY-MM-DD) / Fecha de inicio"),
347
- to: z.string().describe("End date (YYYY-MM-DD) / Fecha de fin"),
348
- propertyId: z
349
- .string()
350
- .optional()
351
- .describe("Limit to a specific property / Limitar a una propiedad especifica"),
352
- },
353
- outputSchema: occupancyStatsOutput,
354
- }, async ({ from, to, propertyId }) => withToolLogging("get_occupancy_stats", async () => {
355
- const result = await client.getStayOccupancyStats({ from, to, propertyId });
160
+ outputSchema: paginatedOutput(propertyItemOutput),
161
+ }, async (args) => withToolLogging("list_properties", async () => {
162
+ const result = await client.listProperties(args);
356
163
  return {
357
- content: [getContent(formatRecord("Occupancy stats", result))],
164
+ content: [listContent(formatPaginatedResponse("properties", result))],
358
165
  structuredContent: result,
359
166
  };
360
167
  }));
361
- // -- sync_ical_channel --
362
- server.registerTool("sync_ical_channel", {
363
- title: "Sync iCal Channel (Stay)",
364
- description: "Trigger an iCal feed sync for a property channel (Airbnb, Booking.com, etc.). " +
365
- "The channel must already be configured in the property settings. " +
366
- "Returns the result of the sync including new/updated/deleted reservations count. " +
367
- "/ Dispara la sincronizacion del feed iCal para un canal de propiedad. " +
368
- "El canal debe estar configurado en los ajustes de la propiedad. " +
369
- "Devuelve el resultado incluyendo el numero de reservas nuevas/actualizadas/eliminadas.",
168
+ // -- sync_channel --
169
+ server.registerTool("sync_channel", {
170
+ title: "Sync Channel",
171
+ description: "Trigger a manual sync of a booking channel (Airbnb, Booking.com, etc.). " +
172
+ "Pulls new reservations and/or pushes calendar updates. Returns sync status and counts. " +
173
+ "/ Dispara sincronizacion manual de un canal de reservas. Importa reservas nuevas " +
174
+ "y/o envia actualizaciones de calendario.",
370
175
  annotations: UPDATE_ANNOTATIONS,
371
176
  inputSchema: {
372
- propertyId: z.string().describe("Property ID / ID de la propiedad"),
373
- channelId: z.string().describe("Channel ID to sync / ID del canal a sincronizar"),
374
- },
375
- outputSchema: actionResultOutput,
376
- }, async ({ propertyId, channelId }) => withToolLogging("sync_ical_channel", async () => {
377
- const result = await client.syncStayIcalChannel(propertyId, channelId);
378
- return {
379
- content: [mutateContent(formatRecord("iCal sync result", result))],
380
- structuredContent: result,
381
- };
382
- }));
383
- // -- get_compliance_status --
384
- server.registerTool("get_compliance_status", {
385
- title: "Get Guest Compliance Status (Stay)",
386
- description: "Get an overview of guest compliance status across properties. " +
387
- "Returns counts of verified, pending, and expired guest documents. " +
388
- "Critical for Spanish STR legal compliance (SES.HOSPEDAJES / parte de viajeros). " +
389
- "Optionally scope to a single property. " +
390
- "/ Obtiene un resumen del estado de cumplimiento de huespedes en las propiedades. " +
391
- "Devuelve conteos de documentos verificados, pendientes y caducados. " +
392
- "Critico para cumplimiento legal STR espanol (SES.HOSPEDAJES / parte de viajeros).",
393
- annotations: READ_ONLY_ANNOTATIONS,
394
- inputSchema: {
395
- propertyId: z
396
- .string()
177
+ channelId: z.string().describe("Channel ID / ID de canal"),
178
+ direction: z
179
+ .enum(["pull", "push", "both"])
397
180
  .optional()
398
- .describe("Scope to a specific property / Limitar a una propiedad especifica"),
399
- from: z
400
- .string()
401
- .optional()
402
- .describe("Check-in on or after this date (YYYY-MM-DD) / Fecha de entrada desde"),
403
- to: z
404
- .string()
405
- .optional()
406
- .describe("Check-in on or before this date (YYYY-MM-DD) / Fecha de entrada hasta"),
181
+ .describe("Sync direction: pull (import reservations), push (export calendar), or both (default). " +
182
+ "/ Direccion: pull (importar), push (exportar) o both (ambas, por defecto)."),
407
183
  },
408
- outputSchema: complianceStatusOutput,
409
- }, async ({ propertyId, from, to }) => withToolLogging("get_compliance_status", async () => {
410
- const result = await client.getStayComplianceStatus({ propertyId, from, to });
411
- const warnings = [];
412
- const rec = result;
413
- if (typeof rec.pending === "number" && rec.pending > 0) {
414
- warnings.push(`${rec.pending} guest(s) with pending compliance documents — submit to SES.HOSPEDAJES before check-in`);
415
- }
184
+ outputSchema: z.object({
185
+ channelId: z.string(),
186
+ status: z.enum(["ok", "partial", "failed"]),
187
+ pulledCount: z.number().int().nonnegative(),
188
+ pushedCount: z.number().int().nonnegative(),
189
+ errors: z.array(z.string()).optional(),
190
+ lastSyncAt: z.string(),
191
+ }),
192
+ }, async ({ channelId, direction }) => withToolLogging("sync_channel", async () => {
193
+ const result = await client.syncChannel(channelId, direction ?? "both");
416
194
  return {
417
- content: [getContent(formatRecord("Compliance status", result))],
418
- structuredContent: { ...result, ...(warnings.length > 0 ? { _warnings: warnings } : {}) },
195
+ content: [mutateContent(formatRecord("Channel sync", result))],
196
+ structuredContent: result,
419
197
  };
420
198
  }));
421
199
  }
@@ -1 +1 @@
1
- {"version":3,"file":"stay.js","sourceRoot":"","sources":["../../src/tools/stay.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"stay.js","sourceRoot":"","sources":["../../src/tools/stay.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ /**
2
+ * Time tracking tools for the Frihet MCP server — Wave 6 (4 tools).
3
+ *
4
+ * Tools:
5
+ * 1. list_time_entries — list timesheets (filter: user, project, date range)
6
+ * 2. create_time_entry — log time (project, hours, description, billable flag)
7
+ * 3. update_time_entry — modify existing time entry
8
+ * 4. delete_time_entry — soft delete (Trust Area: requires confirm)
9
+ *
10
+ * REST surface: /v1/time/entries
11
+ *
12
+ * NOTE: ERP backend endpoints /v1/time/* are planned. Tools are wired
13
+ * and will surface 404 errors until the backend ships.
14
+ */
15
+ import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
16
+ import type { IFrihetClient } from "../client-interface.js";
17
+ export declare function registerTimeTools(server: McpServer, client: IFrihetClient): void;
18
+ //# sourceMappingURL=time.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"time.d.ts","sourceRoot":"","sources":["../../src/tools/time.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAEzE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAgB5D,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,aAAa,GAAG,IAAI,CAiJhF"}