@frihet/mcp-server 1.6.0 → 1.7.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.
@@ -0,0 +1,422 @@
1
+ /**
2
+ * Stay tools for the Frihet MCP server.
3
+ *
4
+ * Covers property management, reservations, operations (cleaning, occupancy),
5
+ * iCal channel sync, and guest compliance — all routed to api.frihet.io/v1/stay/*.
6
+ */
7
+ 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
+ /* ------------------------------------------------------------------ */
90
+ 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
+ // -- list_reservations --
152
+ 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.",
159
+ annotations: READ_ONLY_ANNOTATIONS,
160
+ inputSchema: {
161
+ propertyId: z
162
+ .string()
163
+ .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"),
173
+ status: z
174
+ .enum(["pending", "confirmed", "checked_in", "checked_out", "cancelled", "no_show"])
175
+ .optional()
176
+ .describe("Filter by reservation status / Filtrar por estado"),
177
+ channel: z
178
+ .string()
179
+ .optional()
180
+ .describe("Filter by channel (airbnb, booking, direct...) / Filtrar por canal"),
181
+ limit: z
182
+ .number().int().min(1).max(100)
183
+ .optional()
184
+ .describe("Max results per page (1-100) / Resultados por pagina"),
185
+ offset: z
186
+ .number().int().min(0)
187
+ .optional()
188
+ .describe("Number of results to skip / Resultados a saltar"),
189
+ after: z
190
+ .string()
191
+ .optional()
192
+ .describe("Cursor for cursor-based pagination / Cursor de paginacion"),
193
+ },
194
+ 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);
198
+ return {
199
+ content: [listContent(formatPaginatedResponse("reservations", result))],
200
+ structuredContent: { ...result, ...hints },
201
+ };
202
+ }));
203
+ // -- get_reservation --
204
+ 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.",
210
+ annotations: READ_ONLY_ANNOTATIONS,
211
+ inputSchema: {
212
+ id: z.string().describe("Reservation ID / ID de la reserva"),
213
+ },
214
+ outputSchema: reservationItemOutput,
215
+ }, async ({ id }) => withToolLogging("get_reservation", async () => {
216
+ const result = await client.getStayReservation(id);
217
+ return {
218
+ content: [getContent(formatRecord("Reservation", result))],
219
+ structuredContent: result,
220
+ };
221
+ }));
222
+ // -- create_reservation --
223
+ 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.",
229
+ annotations: CREATE_ANNOTATIONS,
230
+ 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"])
243
+ .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"])
276
+ .optional()
277
+ .describe("Reservation status / Estado de la reserva"),
278
+ notes: z.string().optional().describe("Internal notes / Notas internas"),
279
+ },
280
+ 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);
284
+ return {
285
+ content: [mutateContent(formatRecord("Reservation updated", result))],
286
+ structuredContent: { ...result, ...hints },
287
+ };
288
+ }));
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.",
297
+ annotations: READ_ONLY_ANNOTATIONS,
298
+ 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
304
+ .string()
305
+ .optional()
306
+ .describe("Filter by property ID / Filtrar por ID de propiedad"),
307
+ from: z
308
+ .string()
309
+ .optional()
310
+ .describe("Scheduled on or after this date (YYYY-MM-DD) / Fecha programada desde"),
311
+ to: z
312
+ .string()
313
+ .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"),
323
+ after: z
324
+ .string()
325
+ .optional()
326
+ .describe("Cursor for cursor-based pagination / Cursor de paginacion"),
327
+ },
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 });
356
+ return {
357
+ content: [getContent(formatRecord("Occupancy stats", result))],
358
+ structuredContent: result,
359
+ };
360
+ }));
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.",
370
+ annotations: UPDATE_ANNOTATIONS,
371
+ 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()
397
+ .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"),
407
+ },
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
+ }
416
+ return {
417
+ content: [getContent(formatRecord("Compliance status", result))],
418
+ structuredContent: { ...result, ...(warnings.length > 0 ? { _warnings: warnings } : {}) },
419
+ };
420
+ }));
421
+ }
422
+ //# sourceMappingURL=stay.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stay.js","sourceRoot":"","sources":["../../src/tools/stay.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@frihet/mcp-server",
3
- "version": "1.6.0",
4
- "description": "AI-native MCP server for business management — invoices, expenses, deposits, clients, products, quotes, webhooks, CRM. 62 tools. Remote endpoint at mcp.frihet.io (zero install). Works with Claude, Cursor, Windsurf, Cline.",
3
+ "version": "1.7.0-beta.1",
4
+ "description": "AI-native MCP server for business management — invoices, expenses, deposits, clients, products, quotes, webhooks, CRM, e-invoicing. 66 tools. Remote endpoint at mcp.frihet.io (zero install). Works with Claude, Cursor, Windsurf, Cline.",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
7
7
  "bin": {
@@ -9,6 +9,7 @@
9
9
  },
10
10
  "scripts": {
11
11
  "build": "tsc",
12
+ "test": "npm run build && node --test dist/__tests__/einvoice-tools.test.js",
12
13
  "start": "node dist/index.js",
13
14
  "postinstall": "node scripts/postinstall.js || true",
14
15
  "prepublishOnly": "npm run build"