MCP server and CLI tool for automated UCSD study room booking via EMS
This MCP server implements 4 study room booking tools with adequate schemas and descriptions, but lacks depth in error handling guidance and output documentation. All tools have explicit JSON Schema definitions with proper type declarations and parameter descriptions. Tool descriptions are present and reasonably clear (range 68-136 characters), meeting baseline length requirements. However, the server lacks documented output schemas, meaning LLMs cannot predict response structure for planning downstream actions. Error handling is basic, exceptions are caught but recovery guidance is minimal. The 'login' tool exposes credentials as parameters, violating the secret-injection pattern. The 'book_room' tool's room_name parameter is under-constrained (accepts free-form strings without validation). Overall, the tools are functional but would benefit from stricter parameter validation, output schema documentation, and clearer error recovery paths.
Book a specific study room. Use search_rooms first to find available rooms.
Cancel a study room reservation. Requires date and reason. Ask the user to choose a cancel reason before calling. Valid reasons: Bad Weather, Changed Date, Changed Location, Lack of Funding, Lack of Interest, Lack of Resources, Lack of Time to Plan, Other. If multiple reservations on the same date, specify room_name.
Authenticate via UCSD SSO + Duo Push. Use when session is expired. Opens a browser and requires Duo approval.
List current reservations. Returns upcoming bookings with date, time, room, status, and reservation ID.
Search for available UCSD Price Center Study Rooms (Rooms 1-8) by date and time range.
Credentials exposed as tool parameters. 'login' tool requires username and password as direct parameters, which violates secret-injection pattern. Credentials will appear in agent traces and logs.
No output schemas documented. Tools return TextContent responses, but the structure of parsed results (e.g., room availability, reservation details) is not formally specified. LLMs cannot plan multi-step sequences or extract specific fields without guessing.
Weak error recovery guidance. Exception handling catches SessionExpiredError, DateUnavailableError, and BookingError but returns minimal context. Errors like 'Session expired: <e>' do not explain WHY the error occurred or what the agent should try next.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-22 | F | 11 | 2026-07-28+ | v2 |
| 2026-03-09 | F | 42 | - | v1 |
room_name parameter lacks enum constraints and validation. Accepts free-form strings like 'Price Center Study Room 2' with no explicit list of valid room names. search_rooms returns room.name but book_room does not validate that the name matches available options.
No pagination support. my_events and search_rooms do not expose limit/offset or next_cursor parameters. If a user has many reservations or large time windows with dozens of rooms, results could exceed context limits.
book_room response is plain text status rather than structured object. Response like 'Room booked: ID 12345' cannot be parsed reliably by LLMs. Should return a JSON object with {room_id, reservation_id, booked_time_start, booked_time_end}.
login tool lacks idempotency documentation. Calling login multiple times in succession could create duplicate session states or cause unexpected session state transitions. Should document whether multiple logins reset the session or are idempotent.
Parameter descriptions lack format specifications. Time parameters (start_time, end_time) specify 'HH:MM' format in descriptions, but date format example is missing concrete constraints (does YYYY-MM-DD reject 2024-1-1?). Should include validation rules or regex patterns.