AI agents are starting to book rides, order food, and complete tasks inside apps. This walkthrough explores how Resy's existing customer journey maps to an MCP server that gives those agents structured, safe access to dining reservations.
Cardholder discovers restaurants through editorial content, SEO-driven articles, and curated lists on Resy.
Content & SEOFilters by date, party size, cuisine, location, and availability.
Structured QueryFrictionless mobile auth via SMS verification. Establishes identity and links to Amex cardholder profile.
AuthenticationSelect timeslot, hold reservation, confirm payment method, and finalize. If unavailable, join the waitlist.
TransactionModify, cancel, or coordinate across services: calendar conflict checks, messaging, travel time estimates, and guest invitations.
OrchestrationThese five phases are the customer journey. The MCP (Model Context Protocol) server replicates each one, giving agents the same path a human takes: discover, search, authenticate, transact, manage, and orchestrate across services to deliver a concierge-level experience.
The cardholder navigates Resy's UI, taps through filters, reads reviews, and confirms their own booking. Every decision has a visual confirmation step.
An AI agent traverses the same journey programmatically. It reads tool descriptions instead of UI labels, calls functions instead of tapping buttons, and needs guardrails instead of visual confirmations.
The MCP server mirrors the customer journey. Every tool maps to a journey phase, every parameter mirrors a UI input, and every access control replicates a visual gate (like the login screen or the "Confirm Booking" button).
Each journey phase is powered by specific API endpoints. These become the building blocks for MCP tool definitions.
id: string // Article identifier
{ title, body, restaurants[], tags[] }
category?: string
location?: string
{ articles: [{ id, title, summary }] }
type: "list" | "guide" | "featured"
location?: string
{ content: [{ title, items[], type }] }
city?: string // e.g. "new-york-ny"
lat?: number // Latitude (use with lng)
lng?: number // Longitude (use with lat)
date: string // YYYY-MM-DD
seats: number
query?: string // e.g. "Pizza"
activeView?: string // "list" | "map"
{ restaurants: [{ id, name, cuisine,
rating, price_range, available_slots[] }] }
city: string // e.g. "new-york-ny"
slug: string // e.g. "lartusi"
date: string // YYYY-MM-DD
seats: number
{ name, description, cuisine, rating,
photos[], reviews[], menu_url,
available_timeslots: [{ id, time, type }] }
phone: string // E.164 format
{ sent: true, expires_in: 300 }
phone: string
code: string // 6-digit SMS code
{ token: "eyJhb...", user_id: "u_123",
expires_at: "2026-04-15T..." }
id: string // Timeslot identifier
{ id, restaurant_id, time, type,
deposit_required, cancellation_policy }
timeslot_id: string
hold_until: string // ISO timestamp
{ hold_id: "h_456", expires_at: "...",
status: "held" }
id: string // User profile ID
{ name, email, phone,
payment_methods: [{ id, last4, type }],
dietary_preferences[] }
token: string // Payment token
{ card_id, last4, brand, status }
restaurant_id: string
timeslot_id: string
party_size: number
payment_method_id: string
special_requests?: string
{ reservation_id: "r_789",
confirmation_code: "RESY-ABC123",
status: "confirmed" }
restaurant_id: string
date: string // YYYY-MM-DD
time_window?: { earliest, latest }
party_size: number
notify_via?: "push" | "sms" | "email"
{ waitlist_id, position,
estimated_notify_time }
id: string // Waitlist entry identifier
{ status: "removed" }
id: string
party_size?: number
timeslot_id?: string
special_requests?: string
{ reservation_id, status: "modified",
updated_fields[] }
id: string // Reservation identifier
{ status: "cancelled",
cancellation_fee: null,
refund_amount: 0.00 }
Notice the hold pattern in the Booking section: the reservation flow uses a two-step commit. POST /reservations/hold creates a temporary lock, then POST /reservations finalizes. This pattern is critical for agentic experiences: it lets an AI agent secure a timeslot while the cardholder confirms, without risking a lost booking or an unauthorized charge.
The Model Context Protocol turns Resy's APIs into tools that any AI agent can discover, understand, and invoke. Tool descriptions become "UX for machines."
The MCP server is a translation layer: it wraps existing APIs with tool metadata that agents can reason about.
APIs are built for developers who read docs. MCP tools are built for AI agents that read descriptions. The tool's description, parameter names, and schema are the interface.
An agent doesn't browse Resy's API docs. It reads tool definitions at runtime and decides what to call based on the user's intent.
Read-only access. Search restaurants, check availability, view details.
Agent suggests + holds. Cardholder confirms the final action.
Agent books, modifies, cancels on cardholder's behalf autonomously.
The agent can start a reservation, but it can't finish one alone. It places a temporary hold, then asks the cardholder to confirm. No confirmation, no booking. The cardholder always has the final say.
Cancelling a reservation at a premium restaurant can trigger fees of $500+. That's why changes and cancellations require the cardholder to re-confirm. The agent can suggest and prepare the action, but anything with financial consequences needs a human in the loop.
"Get me into Carbone whenever something opens up." That's the whole prompt. The agent watches for cancellations, auto-holds the slot, and pings the cardholder to confirm. No commitment until they say yes.
This is where MCP shines. The Resy server handles the reservation. The Calendar server handles scheduling. The agent orchestrates both, checking for conflicts, estimating travel time from a prior event's location, and sending invites to dining companions. No single server does it all; the agent directs them.
The trust model for agent-initiated financial actions in a regulated environment. What gets exposed, what stays internal, and how we protect the cardholder.
| Data Element | Expose to Partner Agents? | Rationale |
|---|---|---|
| Restaurant name, cuisine, location | Expose | Public information needed for search and recommendation |
| Available timeslots | Expose | Core functionality; agent needs this to facilitate booking |
| Pricing / deposit amounts | Expose | Cardholder must know costs before committing |
| Cardholder name (first name only) | Partial | Personalization without full PII exposure |
| Payment method (last 4 digits) | Partial | Confirmation display only, never full card number |
| Cardholder calendar data | Partial | Agent sees "conflict at 7:30 PM" but never the event title, attendees, or details. Conflict checks happen server-side. |
| Full cardholder profile | Internal Only | PII stays server-side. Agent sees tokenized references. |
| Payment processing details | Internal Only | Handled entirely by Resy MCP server; agent never touches payment rails |
| Reservation history / frequency | Internal Only | Behavioral data stays internal to avoid profiling by third parties |
The MCP server acts as a data firewall. Partner AI agents get exactly what they need to facilitate the experience, and nothing more. The agent never sees a full card number, never accesses raw payment rails, and never gets behavioral history that could be used for competitive profiling.
The reservation flow uses a two-phase commit: hold, then confirm. This is the key safety mechanism for agentic booking.
create_reservation → MCP server places a configurable hold (e.g., 5 minutes)Different agent interactions require different permission levels, controlled via OAuth scopes.
restaurants:read Search and view restaurants (any agent)availability:read Check timeslot availabilityreservations:read View existing reservationsreservations:write Create reservations (requires cardholder auth)reservations:manage Modify/cancel (requires re-confirmation)waitlist:write Join/leave waitlists (no financial commitment)calendar:write Cross-server calendar access (delegated scope, agent sees conflict times but not event details)"You're authorizing actions on behalf of a cardholder through a third-party agent."
Three parties, three trust relationships:
Additional considerations for a regulated financial institution operating in the agentic space.
The MCP server should be paranoid by default. Start with the narrowest possible permissions, and expand only when the cardholder explicitly opts in. The same principle that governs card-not-present transactions.
Things I'd want to explore with the team:
Is the hold window configurable per restaurant, or platform-wide? High-demand spots might need shorter holds to avoid inventory lock-up.
Per-agent limits, per-cardholder limits, or both? How do you prevent a misbehaving agent from burning through availability?
How does Amex know which AI assistant is making a request? Does each partner get a unique identity, and can you revoke one without affecting others?
One-time blanket consent, or per-action? How granular should opt-in be before it becomes friction?
Start with read-only tools. Prove they work. Then let agents do more.
AI agents can search restaurants, check availability, and view details on behalf of the cardholder. No actions are taken. The agent is purely a research assistant for dining decisions.
The agent can suggest options and place temporary holds, but the cardholder always confirms. The hold pattern is the safety mechanism: nothing commits without human approval. This is where we prove the trust model works.
With established trust and proven safety patterns, AI agents can book, modify, and cancel reservations autonomously. The cardholder sets preferences and constraints ("Italian, under $50pp, near my hotel") and the agent handles the rest, including rebooking if plans change.
The Amex agent doesn't operate alone. It coordinates with airline agents, hotel agents, and restaurant agents to orchestrate complete travel experiences. "Book dinner near my hotel the night before my morning flight" becomes a multi-agent conversation.
Samsung's Galaxy S26 shipped with Gemini agent control in February 2026. The OS-level agent layer is here. Without an MCP server, these agents screen-scrape. With one, they get structured, permissioned access.
Samsung Unpacked February 2026: Gemini agent ordering food and booking rides on Galaxy S26
Whoever figures out the trust model for agent-initiated financial actions first wins the agentic finance space. Amex is uniquely positioned: you already have the cardholder trust, the merchant relationships, and now with Resy, the platform to prove it works.
Restaurant reservations are low-to-medium stakes ($50-$500 deposits). Perfect for building trust in agent-initiated financial actions before expanding to higher-stakes domains like travel or shopping.
Cancellation policies are well-defined and time-bound. If an agent makes a mistake, the blast radius is contained and the remedy path is clear.
When someone asks an AI to book a restaurant, the intent is unambiguous. Compare this to "buy me something nice": dining has structured inputs (date, time, party size) that reduce agent error.
Amex owns Resy. You control the API surface, the data model, and the trust boundaries. No third-party dependency for the initial proof of concept.
Resy is the proving ground. The patterns you build here (hold-before-commit, scoped OAuth for agents, cardholder re-confirmation for financial actions) become the template for agentic experiences across every Amex product: travel, shopping, financial planning. It all starts with "Book me a table for two on Friday."
Claude Code runs on my Mac mini with a Channels integration to Telegram. I message it tasks, it executes them against my repos, and replies with results. This is how I manage QuietFeed and other projects conversationally.
Built an autonomous pipeline that scans LinkedIn twice daily, classifies roles using Claude Haiku and Gemini, and texts me matches. Runs at $0.06/day. Published a 4-part series on the build.
A passion project. An RSS reader built with AI. React + Supabase + Vercel. Claude Code handles feature development, bug fixes, and test coverage. quietfeed.com
Native MCP integration for social media scheduling. I tell Claude what to post, and it handles the rest through Buffer's MCP server.
Delivered an AI-powered compliance copilot that guided power plant owners through plant profiles, compliance workflows, and cross-standard tasks, reducing manual effort and error rates.
AI copilot that accelerated compliance workflows for power plant operators.
Defined and drove development of an LLM-powered AI assistant that answers homeowner questions conversationally and drives users toward HVAC replacement and repair conversions.
Conversational AI that educates and connects homeowners to the sales team.
Increased platform security by implementing two-factor authentication and AI-driven fraud detection, reducing bot-driven attacks and strengthening customer trust.
AI-powered fraud detection and 2FA for eGift activation.
Created and launched co-branded partner sites reaching 11.5M users, enabling OpenID Connect-based authentication, pricing, feature gating, and theming for enterprise partnerships.
OAuth and OpenID Connect across 11.5M users and enterprise partners.