From 6400c2d27d2554d2165b2c2de4acc21a5d146fc8 Mon Sep 17 00:00:00 2001 From: jubnl Date: Sat, 4 Apr 2026 00:09:28 +0200 Subject: [PATCH] fix(mcp): wire check_in/check_out times through hotel accommodation tools Adds optional check_in and check_out fields to create_reservation and link_hotel_accommodation so MCP clients can set accommodation times, matching the existing REST API behaviour. Closes #363 --- server/src/mcp/tools.ts | 20 ++++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/server/src/mcp/tools.ts b/server/src/mcp/tools.ts index fd3180c2..e1479078 100644 --- a/server/src/mcp/tools.ts +++ b/server/src/mcp/tools.ts @@ -509,10 +509,12 @@ export function registerTools(server: McpServer, userId: number): void { place_id: z.number().int().positive().optional().describe('Hotel place to link (hotel type only)'), start_day_id: z.number().int().positive().optional().describe('Check-in day (hotel type only; requires place_id and end_day_id)'), end_day_id: z.number().int().positive().optional().describe('Check-out day (hotel type only; requires place_id and start_day_id)'), + check_in: z.string().max(10).optional().describe('Check-in time (e.g. "15:00", hotel type only)'), + check_out: z.string().max(10).optional().describe('Check-out time (e.g. "11:00", hotel type only)'), assignment_id: z.number().int().positive().optional().describe('Link to a day assignment (restaurant, train, car, cruise, event, tour, activity, other)'), }, }, - async ({ tripId, title, type, reservation_time, location, confirmation_number, notes, day_id, place_id, start_day_id, end_day_id, assignment_id }) => { + async ({ tripId, title, type, reservation_time, location, confirmation_number, notes, day_id, place_id, start_day_id, end_day_id, check_in, check_out, assignment_id }) => { if (isDemoUser(userId)) return demoDenied(); if (!canAccessTrip(tripId, userId)) return noAccess(); @@ -542,8 +544,8 @@ export function registerTools(server: McpServer, userId: number): void { let accommodationId: number | null = null; if (type === 'hotel' && place_id && start_day_id && end_day_id) { const accResult = db.prepare( - 'INSERT INTO day_accommodations (trip_id, place_id, start_day_id, end_day_id, confirmation) VALUES (?, ?, ?, ?, ?)' - ).run(tripId, place_id, start_day_id, end_day_id, confirmation_number || null); + 'INSERT INTO day_accommodations (trip_id, place_id, start_day_id, end_day_id, check_in, check_out, confirmation) VALUES (?, ?, ?, ?, ?, ?, ?)' + ).run(tripId, place_id, start_day_id, end_day_id, check_in || null, check_out || null, confirmation_number || null); accommodationId = accResult.lastInsertRowid as number; } const result = db.prepare(` @@ -599,9 +601,11 @@ export function registerTools(server: McpServer, userId: number): void { place_id: z.number().int().positive().describe('The hotel place to link'), start_day_id: z.number().int().positive().describe('Check-in day ID'), end_day_id: z.number().int().positive().describe('Check-out day ID'), + check_in: z.string().max(10).optional().describe('Check-in time (e.g. "15:00")'), + check_out: z.string().max(10).optional().describe('Check-out time (e.g. "11:00")'), }, }, - async ({ tripId, reservationId, place_id, start_day_id, end_day_id }) => { + async ({ tripId, reservationId, place_id, start_day_id, end_day_id, check_in, check_out }) => { if (isDemoUser(userId)) return demoDenied(); if (!canAccessTrip(tripId, userId)) return noAccess(); const reservation = db.prepare('SELECT * FROM reservations WHERE id = ? AND trip_id = ?').get(reservationId, tripId) as Record | undefined; @@ -619,12 +623,12 @@ export function registerTools(server: McpServer, userId: number): void { const isNewAccommodation = !accommodationId; db.transaction(() => { if (accommodationId) { - db.prepare('UPDATE day_accommodations SET place_id = ?, start_day_id = ?, end_day_id = ? WHERE id = ?') - .run(place_id, start_day_id, end_day_id, accommodationId); + db.prepare('UPDATE day_accommodations SET place_id = ?, start_day_id = ?, end_day_id = ?, check_in = COALESCE(?, check_in), check_out = COALESCE(?, check_out) WHERE id = ?') + .run(place_id, start_day_id, end_day_id, check_in || null, check_out || null, accommodationId); } else { const accResult = db.prepare( - 'INSERT INTO day_accommodations (trip_id, place_id, start_day_id, end_day_id, confirmation) VALUES (?, ?, ?, ?, ?)' - ).run(tripId, place_id, start_day_id, end_day_id, reservation.confirmation_number || null); + 'INSERT INTO day_accommodations (trip_id, place_id, start_day_id, end_day_id, check_in, check_out, confirmation) VALUES (?, ?, ?, ?, ?, ?, ?)' + ).run(tripId, place_id, start_day_id, end_day_id, check_in || null, check_out || null, reservation.confirmation_number || null); accommodationId = accResult.lastInsertRowid as number; } db.prepare('UPDATE reservations SET place_id = ?, accommodation_id = ? WHERE id = ?')