Model Context Protocol server for Marriott Bonvoy account management, hotel search, and reservation booking via persistent Chrome session
Marriott MCP has 19 tools with explicit schemas and descriptions. Naming is verb-prefixed (marriott_*) and action-oriented. Most tools have 50-150 char descriptions, which is acceptable but could be more LLM-optimized. Input schemas are present for all tools with type definitions and property descriptions. However, several critical gaps: (1) output schemas are NOT documented, LLMs cannot predict response structure; (2) error handling lacks recovery guidance (e.g., 'sold_out' mentioned in instructions but not in tool responses); (3) destructive tools (marriott_reservation_*) lack explicit confirmation/dry-run patterns despite elicitation support; (4) parameter descriptions are sometimes vague (e.g., 'user_said' in marriott_book lacks format guidance); (5) no pagination guidance for tools returning lists (marriott_activity, marriott_stays). Tool composition is reasonable, each tool has one clear responsibility. Naming conventions are consistent (marriott_<action>). Security: passwords accepted as parameters in marriott_login (though env var alternative provided), which is a moderate risk.
Structured Bonvoy activity via GraphQL (not the 3-month HTML filter). months default 240. types=all|stay|bonus. Returns entries, type_counts, points_by_type.
Rates and property URL for one hotel. REQUIRED: property_id, checkin, checkout. Returns session, dates applied, property_url, rate_lines. Do not invent Marriott URLs.
Quote rooms, ask in Grok chat, then checkout. No captcha bypass. Stages: choose_room, confirm_price, checkout.
Click a button or link by visible name (Select, View rates, Continue). Not captcha.
Click cookie/consent buttons (Accept All). Does not solve captchas.
Fill a text input by label (e.g. 'Destination', 'Check-in'). Does not fill passwords or cards.
Output schemas not documented. LLMs cannot predict response structure for any tool. marriott_search, marriott_activity, marriott_stays, marriott_page return complex objects but no schema is visible in code.
Destructive tools (marriott_reservation_create, _modify, _cancel) accept user_confirmed and confirm_token but lack explicit dry-run or confirmation response pattern. Elicitation is mentioned in instructions but not formalized in tool definitions.
marriott_book has vague parameter descriptions: 'user_said' and 'user_confirmed' lack format/type guidance. 'option_id' and 'quote_id' are undocumented. Schema shows these as required in some flows but not others.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | C | 67 | 2026-07-28+ | v2 |
Read-only navigation to a marriott.com URL. Rejects non-marriott hosts. No writes.
Signs into Bonvoy using MARRIOTT_EMAIL/MARRIOTT_PASSWORD from server env, or email/password arguments. Does not cancel or delete anything. Do not pass passwords in chat if env is already set.
Read-only My Account / trips dashboard (points, elite, nights).
Opens the persistent Chrome session on marriott.com home. Not destructive.
Extract the current marriott.com page: rooms, rates, buttons, confirmation_number, overlays. Structured errors: sold_out, payment_required, login_expired, akamai_denied. Does not click.
File a bug report with title, what_happened, tool name, arguments, and raw log. Secrets are redacted.
Cancel a Marriott reservation. Requires elicitation/confirm before execution.
Create a new Marriott reservation. Requires elicitation/confirm before execution.
Modify an existing Marriott reservation. Requires elicitation/confirm before execution.
Search marriott.com for properties. REQUIRED: destination, checkin, checkout. Returns session.signed_in, dates actually applied on the site (MM/DD/YYYY), and properties[{name, property_id, url}]. Do NOT web-search hotels. Uses the persistent Bonvoy Chrome session.
Read-only. Returns signed_in, URL, title, member first name. Example: call with no arguments after connect.
Read-only GraphQL stay/activity list. months default 240 (20 years). types=stay|all|bonus. property_contains filters one hotel. Paginates until exhausted. Does not delete.
Read-only upcoming reservations. Never cancels.
marriott_login accepts password as a parameter. Although env var alternative (MARRIOTT_PASSWORD) is documented, passing secrets as parameters risks logging and trace exposure. Should enforce env-only or use secure input pattern.
Pagination not formalized. marriott_activity and marriott_stays accept page_size but no cursor/offset or total_count guidance. Large result sets could exhaust context window without explicit limits.