{"id":"59f10208-e213-436a-98d5-4f874b2bf8ee","entityType":"agent","slug":"clawhub-chrischall-resy","name":"resy","canonicalUrl":"https://www.xpersona.co/agent/clawhub-chrischall-resy","canonicalPath":"/agent/clawhub-chrischall-resy","generatedAt":"2026-10-10T17:35:16.841Z","source":"CLAWHUB","claimStatus":"UNCLAIMED","verificationTier":"NONE","summary":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"medium","updatedAt":"2026-10-10T14:42:53.521Z","emptyReason":null},"description":"Manage Resy restaurant reservations via MCP — search venues, book tables, list and cancel reservations, manage favorites, and subscribe to Priority Notify. Triggers on phrases like \"book a table at\", \"find me a reservation\", \"what reservations do I have\", \"cancel my Resy\", \"add to my Resy hit list\", or any request involving restaurant reservations on Resy. Requires resy-mcp installed and the resy server registered (see Setup below).","descriptionLabel":"Source description","evidenceSummary":"Capability contract not published. No trust telemetry is available yet. 1.4K downloads reported by the source. Last updated 10/10/2026.","installCommand":"clawhub skill install s17cjx1a349nz5apaqp02vgz4h85728z:resy","sourceUrl":"https://clawhub.ai/chrischall/resy","homepage":"https://clawhub.ai/chrischall/skills/resy","primaryLinks":[{"label":"View on ClawHub","url":"https://clawhub.ai/chrischall/resy","kind":"source"},{"label":"Homepage","url":"https://clawhub.ai/chrischall/skills/resy","kind":"homepage"}],"safetyScore":84,"overallRank":62,"popularityScore":63,"trustScore":null,"claimedByName":null,"isOwner":false,"seoDescription":"resy technical dossier on Xpersona with agent coverage, OPENCLEW support, and live trust metadata."},"coverage":{"evidence":{"source":"public-profile","verified":false,"confidence":"medium","updatedAt":"2026-10-10T14:42:53.521Z","emptyReason":null},"protocols":[{"protocol":"OPENCLEW","label":"OpenClaw","status":"self-declared","notes":"Declared in the public agent profile."}],"capabilities":[],"verifiedCount":0,"selfDeclaredCount":1,"capabilityMatrix":{"rows":[{"key":"OPENCLEW","type":"protocol","support":"unknown","confidenceSource":"profile","notes":"Listed on profile"}],"flattenedTokens":"protocol:OPENCLEW|unknown|profile"}},"adoption":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"medium","updatedAt":"2026-10-10T14:42:53.521Z","emptyReason":null},"stars":null,"forks":null,"downloads":1379,"packageName":null,"latestVersion":"1.3.3","tractionLabel":"1.4K downloads"},"release":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"medium","updatedAt":"2026-10-10T14:42:53.520Z","emptyReason":null},"lastUpdatedAt":"2026-10-10T14:42:53.521Z","lastCrawledAt":"2026-10-10T14:42:53.520Z","lastIndexedAt":null,"nextCrawlAt":"2026-10-11T14:42:53.520Z","lastVerifiedAt":null,"highlights":[{"version":"1.3.3","createdAt":"2026-10-09T23:27:08.436Z","changelog":"- Removed deprecated file: skill-card.md. - SKILL.md updated with expanded documentation for `MCP_CONFIRM_ELICITATION` environment variable and confirmation workflows in `resy_book` and `resy_cancel`. - Clarified booking behavior when `allow_duplicate` is true and how payment methods are handled in previews. - Improved cancellation outcome reporting, now explicitly describing the `cancelled` boolean and `outcome` states. - No changes to user-facing commands or integration requirements.","fileCount":3,"zipByteSize":6020},{"version":"1.3.2","createdAt":"2026-10-07T13:42:57.999Z","changelog":"- Removed the skill-card.md file. - No changes to core skill functionality. - Documentation and setup instructions remain unchanged.","fileCount":3,"zipByteSize":5666},{"version":"1.3.1","createdAt":"2026-10-05T02:52:32.596Z","changelog":"- Removed the file skill-card.md. - No changes to functionality or user interactions. - Documentation and setup remain unchanged.","fileCount":3,"zipByteSize":5618},{"version":"1.3.0","createdAt":"2026-10-03T01:45:58.758Z","changelog":"- Updated the booking tool documentation for clarity on the confirmation flow and slot selection (in SKILL.md). - Removed the obsolete skill-card.md file. - No interface or tool changes; documentation improvements only.","fileCount":3,"zipByteSize":5696},{"version":"1.2.2","createdAt":"2026-09-28T14:00:22.350Z","changelog":"- Removed the file skill-card.md. - No changes to functionality; this update only removes documentation or metadata.","fileCount":3,"zipByteSize":5513},{"version":"1.2.1","createdAt":"2026-09-25T16:03:34.351Z","changelog":"- Removed the skill-card.md file. - No changes to features or functionality. - Documentation and skill interface remain unchanged.","fileCount":3,"zipByteSize":5552},{"version":"1.2.0","createdAt":"2026-09-24T15:12:35.764Z","changelog":"- Added user confirmation step to booking and cancellation actions, using a `confirmToken` when client-side prompts aren't supported. - Updated the `resy_book` tool: now requires explicit confirmation via prompt or `confirmToken` to complete a reservation. - Updated the `resy_cancel` tool: cancellation now prompts for confirmation, or requires a `confirmToken` if prompting is not supported. - Changed parameter in `resy_book` from `confirm` to `confirmToken`. - Removed the file: skill-card.md.","fileCount":3,"zipByteSize":5787},{"version":"1.1.3","createdAt":"2026-09-23T21:42:37.946Z","changelog":"- Updated booking instructions: resy_book now supports a two-step \"preview then confirm\" flow, requiring previewed time, slot_type, and terms_token when confirming a reservation. - Added new options to resy_book: slot_type, terms_token, allow_closest_time, allow_duplicate, confirm. - Detailed how booking confirmation picks the exact shown slot and how to avoid accidental duplicates. - Improved workflow examples to illustrate preview and confirm usage. - Removed the skill-card.md file.","fileCount":3,"zipByteSize":5367}]},"execution":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"low","updatedAt":null,"emptyReason":"No published capability contract is available yet."},"installCommand":"clawhub skill install s17cjx1a349nz5apaqp02vgz4h85728z:resy","setupComplexity":"low","setupSteps":["Install using `clawhub skill install s17cjx1a349nz5apaqp02vgz4h85728z:resy` in an isolated environment before connecting it to live workloads.","No published capability contract is available yet, so validate auth and request/response behavior manually.","Review the upstream CLAWHUB listing at https://clawhub.ai/chrischall/resy before using production credentials."],"contract":{"contractStatus":"missing","authModes":[],"requires":[],"forbidden":[],"supportsMcp":false,"supportsA2a":false,"supportsStreaming":false,"inputSchemaRef":null,"outputSchemaRef":null,"dataRegion":null,"contractUpdatedAt":null,"sourceUpdatedAt":null,"freshnessSeconds":null},"invocationGuide":{"preferredApi":{"snapshotUrl":"https://www.xpersona.co/api/v1/agents/clawhub-chrischall-resy/snapshot","contractUrl":"https://www.xpersona.co/api/v1/agents/clawhub-chrischall-resy/contract","trustUrl":"https://www.xpersona.co/api/v1/agents/clawhub-chrischall-resy/trust"},"curlExamples":["curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-chrischall-resy/snapshot\"","curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-chrischall-resy/contract\"","curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-chrischall-resy/trust\""],"jsonRequestTemplate":{"query":"summarize this repo","constraints":{"maxLatencyMs":2000,"protocolPreference":["OPENCLEW"]}},"jsonResponseTemplate":{"ok":true,"result":{"summary":"...","confidence":0.9},"meta":{"source":"CLAWHUB","generatedAt":"2026-10-10T17:35:16.837Z"}},"retryPolicy":{"maxAttempts":3,"backoffMs":[500,1500,3500],"retryableConditions":["HTTP_429","HTTP_503","NETWORK_TIMEOUT"]}},"endpoints":{"dossierUrl":"https://www.xpersona.co/api/v1/agents/clawhub-chrischall-resy/dossier","snapshotUrl":"https://www.xpersona.co/api/v1/agents/clawhub-chrischall-resy/snapshot","contractUrl":"https://www.xpersona.co/api/v1/agents/clawhub-chrischall-resy/contract","trustUrl":"https://www.xpersona.co/api/v1/agents/clawhub-chrischall-resy/trust"}},"reliability":{"evidence":{"source":"runtime-metrics","verified":false,"confidence":"low","updatedAt":null,"emptyReason":"No trust, reliability, or runtime telemetry is available."},"trust":{"status":"unavailable","handshakeStatus":"UNKNOWN","verificationFreshnessHours":null,"reputationScore":null,"p95LatencyMs":null,"successRate30d":null,"fallbackRate":null,"attempts30d":null,"trustUpdatedAt":null,"trustConfidence":"unknown","sourceUpdatedAt":null,"freshnessSeconds":null},"decisionGuardrails":{"doNotUseIf":["Contract metadata is missing or unavailable for deterministic execution."],"safeUseWhen":[],"riskFlags":["missing_or_unavailable_contract","trust_data_unavailable","schema_references_missing"],"operationalConfidence":"low"},"executionMetrics":{"observedLatencyMsP50":null,"observedLatencyMsP95":null,"estimatedCostUsd":null,"uptime30d":null,"rateLimitRpm":null,"rateLimitBurst":null,"lastVerifiedAt":null,"verificationSource":null},"runtimeMetrics":{"successRate":null,"avgLatencyMs":null,"avgCostUsd":null,"hallucinationRate":null,"retryRate":null,"disputeRate":null,"p50Latency":null,"p95Latency":null,"lastUpdated":null}},"benchmarks":{"evidence":{"source":"no-benchmark-data","verified":false,"confidence":"low","updatedAt":null,"emptyReason":"No benchmark suites or observed failure patterns are available."},"suites":[],"failurePatterns":[]},"artifacts":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"medium","updatedAt":"2026-10-10T14:42:53.521Z","emptyReason":null},"readme":"Skill: resy\n\nOwner: chrischall\n\nSummary: Manage Resy restaurant reservations via MCP — search venues, book tables, list and cancel reservations, manage favorites, and subscribe to Priority Notify. Triggers on phrases like \"book a table at\", \"find me a reservation\", \"what reservations do I have\", \"cancel my Resy\", \"add to my Resy hit list\", or any request involving restaurant reservations on Resy. Requires resy-mcp installed and the resy server registered (see Setup below).\n\nTags: latest:1.3.3\n\nVersion history:\n\nv1.3.3 | 2026-10-09T23:27:08.436Z | auto\n\n- Removed deprecated file: skill-card.md.\n- SKILL.md updated with expanded documentation for `MCP_CONFIRM_ELICITATION` environment variable and confirmation workflows in `resy_book` and `resy_cancel`.\n- Clarified booking behavior when `allow_duplicate` is true and how payment methods are handled in previews.\n- Improved cancellation outcome reporting, now explicitly describing the `cancelled` boolean and `outcome` states.\n- No changes to user-facing commands or integration requirements.\n\nv1.3.2 | 2026-10-07T13:42:57.999Z | auto\n\n- Removed the skill-card.md file.\n- No changes to core skill functionality.\n- Documentation and setup instructions remain unchanged.\n\nv1.3.1 | 2026-10-05T02:52:32.596Z | auto\n\n- Removed the file skill-card.md.\n- No changes to functionality or user interactions.\n- Documentation and setup remain unchanged.\n\nv1.3.0 | 2026-10-03T01:45:58.758Z | auto\n\n- Updated the booking tool documentation for clarity on the confirmation flow and slot selection (in SKILL.md).\n- Removed the obsolete skill-card.md file.\n- No interface or tool changes; documentation improvements only.\n\nv1.2.2 | 2026-09-28T14:00:22.350Z | auto\n\n- Removed the file skill-card.md.\n- No changes to functionality; this update only removes documentation or metadata.\n\nv1.2.1 | 2026-09-25T16:03:34.351Z | auto\n\n- Removed the skill-card.md file.\n- No changes to features or functionality.\n- Documentation and skill interface remain unchanged.\n\nv1.2.0 | 2026-09-24T15:12:35.764Z | auto\n\n- Added user confirmation step to booking and cancellation actions, using a `confirmToken` when client-side prompts aren't supported.\n- Updated the `resy_book` tool: now requires explicit confirmation via prompt or `confirmToken` to complete a reservation.\n- Updated the `resy_cancel` tool: cancellation now prompts for confirmation, or requires a `confirmToken` if prompting is not supported.\n- Changed parameter in `resy_book` from `confirm` to `confirmToken`.\n- Removed the file: skill-card.md.\n\nv1.1.3 | 2026-09-23T21:42:37.946Z | auto\n\n- Updated booking instructions: resy_book now supports a two-step \"preview then confirm\" flow, requiring previewed time, slot_type, and terms_token when confirming a reservation.\n- Added new options to resy_book: slot_type, terms_token, allow_closest_time, allow_duplicate, confirm.\n- Detailed how booking confirmation picks the exact shown slot and how to avoid accidental duplicates.\n- Improved workflow examples to illustrate preview and confirm usage.\n- Removed the skill-card.md file.\n\nv1.1.2 | 2026-09-23T15:43:42.056Z | auto\n\n- Removed the file skill-card.md.\n- No changes to user-facing features or functionality.\n\nv1.1.1 | 2026-09-21T04:14:11.176Z | auto\n\n- Removed the skill-card.md file.\n- No changes to SKILL.md content or functionality.\n- Maintenance release; no user-facing impact.\n\nv1.1.0 | 2026-09-20T02:50:40.796Z | auto\n\n- Removed the file: skill-card.md\n- No user-facing changes to functionality.\n\nv1.0.0 | 2026-09-19T11:19:51.263Z | auto\n\n- Removed the file skill-card.md.\n- No changes made to skill functionality or documentation content.\n\nv0.14.4 | 2026-09-15T19:26:08.178Z | auto\n\n- Removed the file skill-card.md.\n- No user-facing features or interface changes. This is a documentation cleanup only.\n\nv0.14.3 | 2026-09-14T14:10:48.790Z | auto\n\n- Removed the file skill-card.md.\n- No changes to skill functionality or user-facing behavior.\n\nv0.14.2 | 2026-09-10T17:14:43.597Z | auto\n\n- Removed the file skill-card.md, cleaning up unused documentation.\n- No user-facing functionality changes.\n\nv0.14.1 | 2026-09-10T16:46:04.977Z | auto\n\n- Removed the file skill-card.md.\n- No changes to core features or user-facing functionality.\n\nv0.14.0 | 2026-09-10T13:47:56.324Z | auto\n\n- Removed the file skill-card.md.\n- No functional changes to skill behavior or features in this version.\n\nv0.13.3 | 2026-09-09T19:43:55.455Z | auto\n\n- Removed the file skill-card.md.\n- No changes to core functionality or usage.\n- Documentation and all operational instructions remain unchanged.\n\nv0.13.2 | 2026-09-08T02:58:15.542Z | auto\n\n- Removed the file skill-card.md.\n- No changes to functionality or documentation within SKILL.md.\n\nv0.13.1 | 2026-09-05T00:51:19.503Z | auto\n\n- Added support for a view parameter (\"compact\" | \"full\") to several tools, allowing control over included media fields in responses.\n- Updated SKILL.md with detailed documentation on the new view parameter and its effect on responses.\n- Removed skill-card.md file.\n- No impact to API endpoints or behavior beyond response shaping and documentation improvements.\n\nv0.13.0 | 2026-09-04T22:21:45.232Z | auto\n\n- Removed the redundant skill-card.md file.\n- No changes to functionality or setup.\n\nv0.12.0 | 2026-09-02T19:14:37.608Z | auto\n\nVersion 0.12.0 of the resy skill\n\n- No file changes detected for this release.\n- Functionality, features, and documentation remain unchanged from the previous version.\n\nv0.11.0 | 2026-09-02T18:05:49.737Z | auto\n\nNo user-visible changes detected in this version.  \n(The SKILL.md file remains unchanged aside from possible whitespace or formatting updates, and no code changes were detected.)\n\nv0.10.0 | 2026-09-02T17:13:19.647Z | auto\n\n- Removed the skill-card.md file.\n- No user-facing functionality changes; internal documentation cleanup only.\n\nv0.9.1 | 2026-09-02T02:58:39.953Z | auto\n\n- Removed the file: skill-card.md\n- No functional or feature changes; documentation cleanup only.\n\nv0.9.0 | 2026-08-31T00:22:36.330Z | auto\n\n- Removed the file skill-card.md.\n- No functional or user-facing changes to the skill's features or documentation.\n\nv0.8.0 | 2026-08-29T13:54:24.675Z | auto\n\n- Removed the skill-card.md file.\n- No user-facing changes to features or documented functionality.\n\nv0.7.0 | 2026-08-28T11:35:15.831Z | auto\n\n- Adds full skill documentation and usage guide in SKILL.md.\n- Lists and describes all supported tools: searching, booking, managing reservations, favorites, and Priority Notify.\n- Details setup instructions for both npx and source installs.\n- Explains authentication, usage workflows, and important notes.\n- Clarifies default geo, required environment variables, and error handling tips.\n\nArchive index:\n\nArchive v1.3.3: 3 files, 6020 bytes\n\nFiles: skill-card.md (1888b), SKILL.md (11085b), _meta.json (123b)\n\nFile v1.3.3:SKILL.md\n\n---\nname: resy\ndescription: Manage Resy restaurant reservations via MCP — search venues, book tables, list and cancel reservations, manage favorites, and subscribe to Priority Notify. Triggers on phrases like \"book a table at\", \"find me a reservation\", \"what reservations do I have\", \"cancel my Resy\", \"add to my Resy hit list\", or any request involving restaurant reservations on Resy. Requires resy-mcp installed and the resy server registered (see Setup below).\n---\n\n# resy-mcp\n\nMCP server for Resy — natural-language restaurant reservation management. Uses Resy's private web-app API with email + password auth.\n\n- **npm:** [npmjs.com/package/resy-mcp](https://www.npmjs.com/package/resy-mcp)\n- **Source:** [github.com/chrischall/resy-mcp](https://github.com/chrischall/resy-mcp)\n\n> ⚠️ Resy does not publish an official API. This server uses the same private endpoints the Resy web app calls, with the public web-app `api_key` and user-level auth via email + password. Use at your own discretion.\n\n## Setup\n\n### Option A — npx (recommended)\n\nAdd to `.mcp.json` in your project or `~/.claude/mcp.json`:\n\n```json\n{\n  \"mcpServers\": {\n    \"resy\": {\n      \"command\": \"npx\",\n      \"args\": [\"-y\", \"resy-mcp\"],\n      \"env\": {\n        \"RESY_EMAIL\": \"you@example.com\",\n        \"RESY_PASSWORD\": \"yourpassword\"\n      }\n    }\n  }\n}\n```\n\n### Option B — from source\n\n```bash\ngit clone https://github.com/chrischall/resy-mcp\ncd resy-mcp\nnpm install && npm run build\n```\n\nThen add to `.mcp.json`:\n\n```json\n{\n  \"mcpServers\": {\n    \"resy\": {\n      \"command\": \"node\",\n      \"args\": [\"/path/to/resy-mcp/dist/bundle.js\"],\n      \"env\": {\n        \"RESY_EMAIL\": \"you@example.com\",\n        \"RESY_PASSWORD\": \"yourpassword\"\n      }\n    }\n  }\n}\n```\n\nOr place `.env` in the project directory with `RESY_EMAIL=` and `RESY_PASSWORD=`.\n\n## Authentication\n\n- `RESY_EMAIL` + `RESY_PASSWORD` are required. The client logs in lazily on first request via `POST /3/auth/password`, caches the returned token for the process lifetime, and re-logs automatically on 401 / 419 / auth-like 500 responses.\n- `RESY_API_KEY` is optional. If unset, the client uses the public web-app key baked into resy.com's JS bundle. Override only if Resy rotates it.\n\n## Tools\n\n### User\n| Tool | Description |\n|------|-------------|\n| `resy_get_profile(view?)` | Current user profile — name, email, phone, booking count, member-since. Payment method IDs are stripped. |\n| `resy_list_payment_methods(view?)` | List saved payment methods (`id`, `brand`, `last_four`, `exp_month`, `exp_year`, `is_default`). The `id` feeds `resy_book`'s `payment_method_id`. |\n\n### Venues\n| Tool | Description |\n|------|-------------|\n| `resy_search_venues(date, party_size, query?, lat?, lng?, limit?, radius_meters?, view?)` | Search venues with availability for a date + party size. Defaults to NYC geo. |\n| `resy_find_slots(venue_id, date, party_size, lat?, lng?)` | List bookable slots at a venue — each includes a short-lived `config_token`. |\n| `resy_get_venue(venue_id)` | Full venue details. |\n\n### Reservations\n| Tool | Description |\n|------|-------------|\n| `resy_book(venue_id, date, party_size, desired_time?, slot_type?, terms_token?, allow_closest_time?, lat?, lng?, payment_method_id?, allow_duplicate?, confirmToken?)` | Composite: find fresh slot → details → book. It books ONLY the exact previewed slot. `desired_time` is \"HH:MM\" (24h); an unavailable time returns the available times unless `allow_closest_time: true` previews the nearest. `slot_type` picks a seating (Dining Room / Bar / Patio) when several share a time. On a client without prompts, the preview comes back as `confirmation-required` with a `confirmToken` bound to that slot's time, seating type and terms; after the user approves, repeat the call with the preview's time as `desired_time` and the `confirmToken` (see `MCP_CONFIRM_MODE`). On a client with prompts (unless the server sets `MCP_CONFIRM_ELICITATION=off`, which sends every client down the `confirmToken` path), call again with `desired_time` + `slot_type` + `terms_token` (a fingerprint of the seating type and cancellation/payment terms) from the preview and the user is prompted. If the slot, its type or its terms changed, nothing is booked and a fresh preview is returned. The booking refuses if you already hold a reservation at that venue that date (e.g. an earlier timed-out call that went through) unless `allow_duplicate: true` — checked before you are asked to confirm, so an approval is never wasted; with `allow_duplicate: true` the preview lists the existing reservation(s). Uses default payment method unless `payment_method_id` is supplied; either way the preview names the card (brand and last-4), and an id that is not one of your saved cards is refused. |\n| `resy_list_reservations(scope?)` | List reservations. `scope`: `upcoming` (default), `past`, or `all`. Each result includes the `resy_token` needed for cancellation. |\n| `resy_cancel(resy_token, confirmToken?)` | Cancel by `resy_token` (`rr://…`). Asks the user to confirm first (the Resy account, venue, date, time, party size, any fee): a prompt where the client supports one (unless `MCP_CONFIRM_ELICITATION=off`), otherwise a preview plus `confirmToken` that a repeat call passes back. Returns `cancelled` (always a boolean — `true` only when confirmed) and `outcome` (`cancelled` / `not_cancelled` / `unknown`), set from an explicit success/failure in Resy's response, and otherwise by checking whether the reservation is still listed. On `outcome: \"unknown\"` the reservation may still have been cancelled — check `resy_list_reservations` before retrying. |\n\n### Favorites\n| Tool | Description |\n|------|-------------|\n| `resy_list_favorites(view?)` | List favorited venues (\"hit list\"). |\n| `resy_add_favorite(venue_id)` | Add a venue to favorites. |\n| `resy_remove_favorite(venue_id)` | Remove from favorites. |\n\n### Priority Notify\n| Tool | Description |\n|------|-------------|\n| `resy_list_notify(view?)` | List Priority Notify subscriptions. |\n| `resy_add_notify(venue_id, date, party_size, time_start?, time_end?)` | Subscribe to notifications when slots open. `time_start` / `time_end` are HH:MM (24h); default window 18:00–21:00. |\n| `resy_remove_notify(notify_id)` | Cancel a Priority Notify subscription. |\n\n## Response shape (`view`)\n\nFive read tools take `view: \"compact\" | \"full\"` — `resy_get_profile`,\n`resy_list_payment_methods`, `resy_list_favorites`, `resy_list_notify` and\n`resy_search_venues` — and **`compact` is the default**. The slim rung arrives\nwithout being asked for, because an efficiency a caller has to know about and\nrequest is one that usually is not requested.\n\n**Compact strips image and avatar URLs here, and nothing else.** There is no\nfield projection: this server holds no captured fixture or documented field\nlist for Resy's payloads, and an invented one would return a record with holes\nin it that still reads like a verified answer. Media stripping is subtractive,\nso it cannot lose a field nobody knew about.\n\n**The surprise worth stating plainly: on four of those five tools, compact and\nfull are byte-identical today.** `resy_get_profile` is the ONE response in this\nwhole server that carries a media URL — `profile_image_url` off `/2/user` — so\nit is the one place compact removes anything at all. The other four already\nhand back records this server assembled field by field, with no picture in\nthem. The parameter is on them so that a field arriving later with an avatar\ninside it is stripped by default rather than after somebody notices.\n\n`profile_image_url` is named in the drop list rather than left to the built-in\nrules, and that is what makes its removal deterministic. The key pattern\nanchors its noun at the START of a key (it knows `profile_pic`, not\n`profile_image_url`), which leaves only the value rule — and that fires just\nwhen a URL path ends in an image extension, which Resy's avatar pipeline need\nnot do.\n\n`view: \"full\"` returns the record untouched. There is **no `raw` rung**: `full`\nalready IS the un-stripped response, so a third value could only alias it.\n\nThe other ten tools take no `view`:\n\n- **`resy_find_slots`, `resy_get_venue` and `resy_list_reservations`** build\n  their answers field by field (`formatSlot`, `formatVenue`,\n  `formatReservation`). No upstream payload survives into the response, and no\n  media URL with it — there is nothing for the rung to remove.\n- **`resy_book`, `resy_cancel`, `resy_add_favorite`, `resy_remove_favorite`,\n  `resy_add_notify`, `resy_remove_notify`** are writes. A write's response is a\n  receipt — a `resy_token`, a confirmation, a status — with nothing to strip and\n  everything to keep.\n- **`resy_healthcheck`** answers reachability and auth.\n\n## Workflows\n\n**Book a specific restaurant at a specific time:**\n```\nresy_search_venues(query: \"carbone\", date: \"2026-05-01\", party_size: 2)\n  → find venue_id\nresy_book(venue_id, date: \"2026-05-01\", party_size: 2, desired_time: \"19:00\")\n  → preview: time, slot_type, terms_token, fees, payment card; show it to the user\n\n  client WITHOUT prompts (claude.ai, Claude Desktop), or any client when the\n  server sets MCP_CONFIRM_ELICITATION=off: that preview is\n  `confirmation-required` and carries a confirmToken. Once the user approves in chat:\nresy_book(venue_id, date: \"2026-05-01\", party_size: 2,\n          desired_time: \"<preview's time>\", confirmToken: \"<token>\")\n\n  client WITH prompts (Claude Code), unless MCP_CONFIRM_ELICITATION=off: name the\n  slot and the user is prompted:\nresy_book(venue_id, date: \"2026-05-01\", party_size: 2, desired_time: \"<preview's time>\",\n          slot_type: \"<preview's slot_type>\", terms_token: \"<preview's terms_token>\")\n```\n\n**See what's available tonight near me:**\n```\nresy_search_venues(date: \"2026-04-20\", party_size: 2, lat: 37.7749, lng: -122.4194)\n  → returns venues with baked-in slot availability\n```\n\n**Cancel a reservation:**\n```\nresy_list_reservations() → find resy_token for the one to cancel\nresy_cancel(resy_token)\n  → a confirmation prompt (unless MCP_CONFIRM_ELICITATION=off), or a preview plus\n    confirmToken to pass back once the user approves\n```\n\n**Stalking a hard-to-get table:**\n```\nresy_search_venues(query: \"4 charles prime rib\", ...) → venue_id\nresy_add_notify(venue_id, date: \"2026-05-31\", party_size: 2, time_start: \"19:00\", time_end: \"21:00\")\n# Resy emails you when a slot opens\n```\n\n## Notes\n\n- Slot `config_token`s expire within minutes of being fetched. `resy_book` re-fetches fresh slots internally — don't try to thread a stale token from `resy_find_slots` into a book call manually.\n- `resy_book` requires a payment method on file at resy.com/account. If none exists it throws a clear error.\n- Default geo is NYC (40.7128, -73.9876). Pass `lat`/`lng` for other cities.\n- Favorites and Priority Notify endpoint paths are reverse-engineered. If a call fails with 404, run `npm run smoke` locally against your credentials and adjust the path.\n- `RESY_API_KEY` env var overrides the baked-in public web-app key if Resy ever rotates it.\n\nFile v1.3.3:_meta.json\n\n{\n  \"ownerId\": \"kn700jq4sjtf2anb0rk3ft4p7n856872\",\n  \"slug\": \"resy\",\n  \"version\": \"1.3.3\",\n  \"publishedAt\": 1791588428436\n}\n\nFile v1.3.3:skill-card.md\n\n## Description:\n\nHelps users search Resy restaurants, manage reservations and favorites, and subscribe to Priority Notify through a configured MCP server.\n\nThis skill is ready for commercial/non-commercial use.\n\n## Publisher:\n\n[chrischall](https://clawhub.ai/user/chrischall)\n\n### License/Terms of Use:\n\nMIT-0\n\n## Use Case:\n\nResy users can find tables, book or cancel reservations, manage favorite restaurants, and request availability notifications through an agent with the Resy MCP server installed.\n\n### Deployment Geography for Use:\n\nGlobal\n\n## Known Risks and Mitigations:\n\nRisk: The MCP server receives Resy account credentials and can act on the user's account.\n\nMitigation: Install deliberately, keep credential files local, access-restricted, and out of source control.\n\nRisk: Booking or cancellation may change real reservations, use a saved payment card, or incur cancellation fees.\n\nMitigation: Review the restaurant, time, payment card, and cancellation terms in each preview before approving the action.\n\n## Reference(s):\n\n- [ClawHub resy release](https://clawhub.ai/chrischall/skills/resy)\n- [resy-mcp npm package (linked in skill documentation)](https://www.npmjs.com/package/resy-mcp)\n\n## Skill Output:\n\n**Output Type(s):** [Text, Guidance, Configuration instructions]\n\n**Output Format:** [Natural-language responses with reservation details, confirmation previews, and setup examples]\n\n**Output Parameters:** [1D]\n\n**Other Properties Related to Output:** [Booking and cancellation actions require review of a preview before confirmation.]\n\n## Skill Version(s):\n\n1.3.3 (source: server release metadata)\n\n## Ethical Considerations:\n\nUsers should evaluate whether this skill is appropriate for their environment, review any generated or modified files before relying on them, and apply their organization's safety, security, and compliance requirements before deployment.\n\nArchive v1.3.2: 3 files, 5666 bytes\n\nFiles: skill-card.md (1822b), SKILL.md (10198b), _meta.json (123b)\n\nFile v1.3.2:SKILL.md\n\n---\nname: resy\ndescription: Manage Resy restaurant reservations via MCP — search venues, book tables, list and cancel reservations, manage favorites, and subscribe to Priority Notify. Triggers on phrases like \"book a table at\", \"find me a reservation\", \"what reservations do I have\", \"cancel my Resy\", \"add to my Resy hit list\", or any request involving restaurant reservations on Resy. Requires resy-mcp installed and the resy server registered (see Setup below).\n---\n\n# resy-mcp\n\nMCP server for Resy — natural-language restaurant reservation management. Uses Resy's private web-app API with email + password auth.\n\n- **npm:** [npmjs.com/package/resy-mcp](https://www.npmjs.com/package/resy-mcp)\n- **Source:** [github.com/chrischall/resy-mcp](https://github.com/chrischall/resy-mcp)\n\n> ⚠️ Resy does not publish an official API. This server uses the same private endpoints the Resy web app calls, with the public web-app `api_key` and user-level auth via email + password. Use at your own discretion.\n\n## Setup\n\n### Option A — npx (recommended)\n\nAdd to `.mcp.json` in your project or `~/.claude/mcp.json`:\n\n```json\n{\n  \"mcpServers\": {\n    \"resy\": {\n      \"command\": \"npx\",\n      \"args\": [\"-y\", \"resy-mcp\"],\n      \"env\": {\n        \"RESY_EMAIL\": \"you@example.com\",\n        \"RESY_PASSWORD\": \"yourpassword\"\n      }\n    }\n  }\n}\n```\n\n### Option B — from source\n\n```bash\ngit clone https://github.com/chrischall/resy-mcp\ncd resy-mcp\nnpm install && npm run build\n```\n\nThen add to `.mcp.json`:\n\n```json\n{\n  \"mcpServers\": {\n    \"resy\": {\n      \"command\": \"node\",\n      \"args\": [\"/path/to/resy-mcp/dist/bundle.js\"],\n      \"env\": {\n        \"RESY_EMAIL\": \"you@example.com\",\n        \"RESY_PASSWORD\": \"yourpassword\"\n      }\n    }\n  }\n}\n```\n\nOr place `.env` in the project directory with `RESY_EMAIL=` and `RESY_PASSWORD=`.\n\n## Authentication\n\n- `RESY_EMAIL` + `RESY_PASSWORD` are required. The client logs in lazily on first request via `POST /3/auth/password`, caches the returned token for the process lifetime, and re-logs automatically on 401 / 419 / auth-like 500 responses.\n- `RESY_API_KEY` is optional. If unset, the client uses the public web-app key baked into resy.com's JS bundle. Override only if Resy rotates it.\n\n## Tools\n\n### User\n| Tool | Description |\n|------|-------------|\n| `resy_get_profile(view?)` | Current user profile — name, email, phone, booking count, member-since. Payment method IDs are stripped. |\n| `resy_list_payment_methods(view?)` | List saved payment methods (`id`, `brand`, `last_four`, `exp_month`, `exp_year`, `is_default`). The `id` feeds `resy_book`'s `payment_method_id`. |\n\n### Venues\n| Tool | Description |\n|------|-------------|\n| `resy_search_venues(date, party_size, query?, lat?, lng?, limit?, radius_meters?, view?)` | Search venues with availability for a date + party size. Defaults to NYC geo. |\n| `resy_find_slots(venue_id, date, party_size, lat?, lng?)` | List bookable slots at a venue — each includes a short-lived `config_token`. |\n| `resy_get_venue(venue_id)` | Full venue details. |\n\n### Reservations\n| Tool | Description |\n|------|-------------|\n| `resy_book(venue_id, date, party_size, desired_time?, slot_type?, terms_token?, allow_closest_time?, lat?, lng?, payment_method_id?, allow_duplicate?, confirmToken?)` | Composite: find fresh slot → details → book. It books ONLY the exact previewed slot. `desired_time` is \"HH:MM\" (24h); an unavailable time returns the available times unless `allow_closest_time: true` previews the nearest. `slot_type` picks a seating (Dining Room / Bar / Patio) when several share a time. On a client without prompts, the preview comes back as `confirmation-required` with a `confirmToken` bound to that slot's time, seating type and terms; after the user approves, repeat the call with the preview's time as `desired_time` and the `confirmToken` (see `MCP_CONFIRM_MODE`). On a client with prompts, call again with `desired_time` + `slot_type` + `terms_token` (a fingerprint of the seating type and cancellation/payment terms) from the preview and the user is prompted. If the slot, its type or its terms changed, nothing is booked and a fresh preview is returned. The booking refuses if you already hold a reservation at that venue that date (e.g. an earlier timed-out call that went through) unless `allow_duplicate: true`. Uses default payment method unless `payment_method_id` is supplied. |\n| `resy_list_reservations(scope?)` | List reservations. `scope`: `upcoming` (default), `past`, or `all`. Each result includes the `resy_token` needed for cancellation. |\n| `resy_cancel(resy_token, confirmToken?)` | Cancel by `resy_token` (`rr://…`). Asks the user to confirm first (venue, date, time, party size, any fee): a prompt where the client supports one, otherwise a preview plus `confirmToken` that a repeat call passes back. Inspects the response body to set `cancelled: true/false` honestly. |\n\n### Favorites\n| Tool | Description |\n|------|-------------|\n| `resy_list_favorites(view?)` | List favorited venues (\"hit list\"). |\n| `resy_add_favorite(venue_id)` | Add a venue to favorites. |\n| `resy_remove_favorite(venue_id)` | Remove from favorites. |\n\n### Priority Notify\n| Tool | Description |\n|------|-------------|\n| `resy_list_notify(view?)` | List Priority Notify subscriptions. |\n| `resy_add_notify(venue_id, date, party_size, time_start?, time_end?)` | Subscribe to notifications when slots open. `time_start` / `time_end` are HH:MM (24h); default window 18:00–21:00. |\n| `resy_remove_notify(notify_id)` | Cancel a Priority Notify subscription. |\n\n## Response shape (`view`)\n\nFive read tools take `view: \"compact\" | \"full\"` — `resy_get_profile`,\n`resy_list_payment_methods`, `resy_list_favorites`, `resy_list_notify` and\n`resy_search_venues` — and **`compact` is the default**. The slim rung arrives\nwithout being asked for, because an efficiency a caller has to know about and\nrequest is one that usually is not requested.\n\n**Compact strips image and avatar URLs here, and nothing else.** There is no\nfield projection: this server holds no captured fixture or documented field\nlist for Resy's payloads, and an invented one would return a record with holes\nin it that still reads like a verified answer. Media stripping is subtractive,\nso it cannot lose a field nobody knew about.\n\n**The surprise worth stating plainly: on four of those five tools, compact and\nfull are byte-identical today.** `resy_get_profile` is the ONE response in this\nwhole server that carries a media URL — `profile_image_url` off `/2/user` — so\nit is the one place compact removes anything at all. The other four already\nhand back records this server assembled field by field, with no picture in\nthem. The parameter is on them so that a field arriving later with an avatar\ninside it is stripped by default rather than after somebody notices.\n\n`profile_image_url` is named in the drop list rather than left to the built-in\nrules, and that is what makes its removal deterministic. The key pattern\nanchors its noun at the START of a key (it knows `profile_pic`, not\n`profile_image_url`), which leaves only the value rule — and that fires just\nwhen a URL path ends in an image extension, which Resy's avatar pipeline need\nnot do.\n\n`view: \"full\"` returns the record untouched. There is **no `raw` rung**: `full`\nalready IS the un-stripped response, so a third value could only alias it.\n\nThe other ten tools take no `view`:\n\n- **`resy_find_slots`, `resy_get_venue` and `resy_list_reservations`** build\n  their answers field by field (`formatSlot`, `formatVenue`,\n  `formatReservation`). No upstream payload survives into the response, and no\n  media URL with it — there is nothing for the rung to remove.\n- **`resy_book`, `resy_cancel`, `resy_add_favorite`, `resy_remove_favorite`,\n  `resy_add_notify`, `resy_remove_notify`** are writes. A write's response is a\n  receipt — a `resy_token`, a confirmation, a status — with nothing to strip and\n  everything to keep.\n- **`resy_healthcheck`** answers reachability and auth.\n\n## Workflows\n\n**Book a specific restaurant at a specific time:**\n```\nresy_search_venues(query: \"carbone\", date: \"2026-05-01\", party_size: 2)\n  → find venue_id\nresy_book(venue_id, date: \"2026-05-01\", party_size: 2, desired_time: \"19:00\")\n  → preview: time, slot_type, terms_token, fees, payment card; show it to the user\n\n  client WITHOUT prompts (claude.ai, Claude Desktop): that preview is\n  `confirmation-required` and carries a confirmToken. Once the user approves in chat:\nresy_book(venue_id, date: \"2026-05-01\", party_size: 2,\n          desired_time: \"<preview's time>\", confirmToken: \"<token>\")\n\n  client WITH prompts (Claude Code): name the slot and the user is prompted:\nresy_book(venue_id, date: \"2026-05-01\", party_size: 2, desired_time: \"<preview's time>\",\n          slot_type: \"<preview's slot_type>\", terms_token: \"<preview's terms_token>\")\n```\n\n**See what's available tonight near me:**\n```\nresy_search_venues(date: \"2026-04-20\", party_size: 2, lat: 37.7749, lng: -122.4194)\n  → returns venues with baked-in slot availability\n```\n\n**Cancel a reservation:**\n```\nresy_list_reservations() → find resy_token for the one to cancel\nresy_cancel(resy_token)\n  → a confirmation prompt, or a preview plus confirmToken to pass back once the user approves\n```\n\n**Stalking a hard-to-get table:**\n```\nresy_search_venues(query: \"4 charles prime rib\", ...) → venue_id\nresy_add_notify(venue_id, date: \"2026-05-31\", party_size: 2, time_start: \"19:00\", time_end: \"21:00\")\n# Resy emails you when a slot opens\n```\n\n## Notes\n\n- Slot `config_token`s expire within minutes of being fetched. `resy_book` re-fetches fresh slots internally — don't try to thread a stale token from `resy_find_slots` into a book call manually.\n- `resy_book` requires a payment method on file at resy.com/account. If none exists it throws a clear error.\n- Default geo is NYC (40.7128, -73.9876). Pass `lat`/`lng` for other cities.\n- Favorites and Priority Notify endpoint paths are reverse-engineered. If a call fails with 404, run `npm run smoke` locally against your credentials and adjust the path.\n- `RESY_API_KEY` env var overrides the baked-in public web-app key if Resy ever rotates it.\n\nFile v1.3.2:_meta.json\n\n{\n  \"ownerId\": \"kn700jq4sjtf2anb0rk3ft4p7n856872\",\n  \"slug\": \"resy\",\n  \"version\": \"1.3.2\",\n  \"publishedAt\": 1791380577999\n}\n\nFile v1.3.2:skill-card.md\n\n## Description:\n\nHelps users search Resy restaurants and manage reservations, favorites, and Priority Notify subscriptions through an MCP server.\n\nThis skill is ready for commercial/non-commercial use.\n\n## Publisher:\n\n[chrischall](https://clawhub.ai/user/chrischall)\n\n### License/Terms of Use:\n\nMIT-0\n\n## Use Case:\n\nPeople using an agent to find restaurant availability, book or cancel Resy reservations, and manage favorites and availability notifications.\n\n### Deployment Geography for Use:\n\nGlobal\n\n## Known Risks and Mitigations:\n\nRisk: An unofficial MCP server receives the user's Resy email and password.\n\nMitigation: Use only if comfortable granting this access; keep credentials outside version-controlled files and restrict file permissions.\n\nRisk: The server can book or cancel reservations and change favorites and notifications.\n\nMitigation: Review the venue, time, seating, fees, and cancellation terms in each booking or cancellation preview before confirming.\n\n## Reference(s):\n\n- [Resy skill listing](https://clawhub.ai/chrischall/skills/resy)\n- [resy-mcp package](https://www.npmjs.com/package/resy-mcp)\n\n## Skill Output:\n\n**Output Type(s):** [Text, Markdown, Configuration instructions]\n\n**Output Format:** [Conversational text with reservation details, confirmation previews, and setup guidance]\n\n**Output Parameters:** [1D]\n\n**Other Properties Related to Output:** [Bookings and cancellations should be confirmed against the displayed details before proceeding.]\n\n## Skill Version(s):\n\n1.3.2 (source: server-resolved release metadata)\n\n## Ethical Considerations:\n\nUsers should evaluate whether this skill is appropriate for their environment, review any generated or modified files before relying on them, and apply their organization's safety, security, and compliance requirements before deployment.\n\nArchive v1.3.1: 3 files, 5618 bytes\n\nFiles: skill-card.md (1677b), SKILL.md (10198b), _meta.json (123b)\n\nFile v1.3.1:SKILL.md\n\n---\nname: resy\ndescription: Manage Resy restaurant reservations via MCP — search venues, book tables, list and cancel reservations, manage favorites, and subscribe to Priority Notify. Triggers on phrases like \"book a table at\", \"find me a reservation\", \"what reservations do I have\", \"cancel my Resy\", \"add to my Resy hit list\", or any request involving restaurant reservations on Resy. Requires resy-mcp installed and the resy server registered (see Setup below).\n---\n\n# resy-mcp\n\nMCP server for Resy — natural-language restaurant reservation management. Uses Resy's private web-app API with email + password auth.\n\n- **npm:** [npmjs.com/package/resy-mcp](https://www.npmjs.com/package/resy-mcp)\n- **Source:** [github.com/chrischall/resy-mcp](https://github.com/chrischall/resy-mcp)\n\n> ⚠️ Resy does not publish an official API. This server uses the same private endpoints the Resy web app calls, with the public web-app `api_key` and user-level auth via email + password. Use at your own discretion.\n\n## Setup\n\n### Option A — npx (recommended)\n\nAdd to `.mcp.json` in your project or `~/.claude/mcp.json`:\n\n```json\n{\n  \"mcpServers\": {\n    \"resy\": {\n      \"command\": \"npx\",\n      \"args\": [\"-y\", \"resy-mcp\"],\n      \"env\": {\n        \"RESY_EMAIL\": \"you@example.com\",\n        \"RESY_PASSWORD\": \"yourpassword\"\n      }\n    }\n  }\n}\n```\n\n### Option B — from source\n\n```bash\ngit clone https://github.com/chrischall/resy-mcp\ncd resy-mcp\nnpm install && npm run build\n```\n\nThen add to `.mcp.json`:\n\n```json\n{\n  \"mcpServers\": {\n    \"resy\": {\n      \"command\": \"node\",\n      \"args\": [\"/path/to/resy-mcp/dist/bundle.js\"],\n      \"env\": {\n        \"RESY_EMAIL\": \"you@example.com\",\n        \"RESY_PASSWORD\": \"yourpassword\"\n      }\n    }\n  }\n}\n```\n\nOr place `.env` in the project directory with `RESY_EMAIL=` and `RESY_PASSWORD=`.\n\n## Authentication\n\n- `RESY_EMAIL` + `RESY_PASSWORD` are required. The client logs in lazily on first request via `POST /3/auth/password`, caches the returned token for the process lifetime, and re-logs automatically on 401 / 419 / auth-like 500 responses.\n- `RESY_API_KEY` is optional. If unset, the client uses the public web-app key baked into resy.com's JS bundle. Override only if Resy rotates it.\n\n## Tools\n\n### User\n| Tool | Description |\n|------|-------------|\n| `resy_get_profile(view?)` | Current user profile — name, email, phone, booking count, member-since. Payment method IDs are stripped. |\n| `resy_list_payment_methods(view?)` | List saved payment methods (`id`, `brand`, `last_four`, `exp_month`, `exp_year`, `is_default`). The `id` feeds `resy_book`'s `payment_method_id`. |\n\n### Venues\n| Tool | Description |\n|------|-------------|\n| `resy_search_venues(date, party_size, query?, lat?, lng?, limit?, radius_meters?, view?)` | Search venues with availability for a date + party size. Defaults to NYC geo. |\n| `resy_find_slots(venue_id, date, party_size, lat?, lng?)` | List bookable slots at a venue — each includes a short-lived `config_token`. |\n| `resy_get_venue(venue_id)` | Full venue details. |\n\n### Reservations\n| Tool | Description |\n|------|-------------|\n| `resy_book(venue_id, date, party_size, desired_time?, slot_type?, terms_token?, allow_closest_time?, lat?, lng?, payment_method_id?, allow_duplicate?, confirmToken?)` | Composite: find fresh slot → details → book. It books ONLY the exact previewed slot. `desired_time` is \"HH:MM\" (24h); an unavailable time returns the available times unless `allow_closest_time: true` previews the nearest. `slot_type` picks a seating (Dining Room / Bar / Patio) when several share a time. On a client without prompts, the preview comes back as `confirmation-required` with a `confirmToken` bound to that slot's time, seating type and terms; after the user approves, repeat the call with the preview's time as `desired_time` and the `confirmToken` (see `MCP_CONFIRM_MODE`). On a client with prompts, call again with `desired_time` + `slot_type` + `terms_token` (a fingerprint of the seating type and cancellation/payment terms) from the preview and the user is prompted. If the slot, its type or its terms changed, nothing is booked and a fresh preview is returned. The booking refuses if you already hold a reservation at that venue that date (e.g. an earlier timed-out call that went through) unless `allow_duplicate: true`. Uses default payment method unless `payment_method_id` is supplied. |\n| `resy_list_reservations(scope?)` | List reservations. `scope`: `upcoming` (default), `past`, or `all`. Each result includes the `resy_token` needed for cancellation. |\n| `resy_cancel(resy_token, confirmToken?)` | Cancel by `resy_token` (`rr://…`). Asks the user to confirm first (venue, date, time, party size, any fee): a prompt where the client supports one, otherwise a preview plus `confirmToken` that a repeat call passes back. Inspects the response body to set `cancelled: true/false` honestly. |\n\n### Favorites\n| Tool | Description |\n|------|-------------|\n| `resy_list_favorites(view?)` | List favorited venues (\"hit list\"). |\n| `resy_add_favorite(venue_id)` | Add a venue to favorites. |\n| `resy_remove_favorite(venue_id)` | Remove from favorites. |\n\n### Priority Notify\n| Tool | Description |\n|------|-------------|\n| `resy_list_notify(view?)` | List Priority Notify subscriptions. |\n| `resy_add_notify(venue_id, date, party_size, time_start?, time_end?)` | Subscribe to notifications when slots open. `time_start` / `time_end` are HH:MM (24h); default window 18:00–21:00. |\n| `resy_remove_notify(notify_id)` | Cancel a Priority Notify subscription. |\n\n## Response shape (`view`)\n\nFive read tools take `view: \"compact\" | \"full\"` — `resy_get_profile`,\n`resy_list_payment_methods`, `resy_list_favorites`, `resy_list_notify` and\n`resy_search_venues` — and **`compact` is the default**. The slim rung arrives\nwithout being asked for, because an efficiency a caller has to know about and\nrequest is one that usually is not requested.\n\n**Compact strips image and avatar URLs here, and nothing else.** There is no\nfield projection: this server holds no captured fixture or documented field\nlist for Resy's payloads, and an invented one would return a record with holes\nin it that still reads like a verified answer. Media stripping is subtractive,\nso it cannot lose a field nobody knew about.\n\n**The surprise worth stating plainly: on four of those five tools, compact and\nfull are byte-identical today.** `resy_get_profile` is the ONE response in this\nwhole server that carries a media URL — `profile_image_url` off `/2/user` — so\nit is the one place compact removes anything at all. The other four already\nhand back records this server assembled field by field, with no picture in\nthem. The parameter is on them so that a field arriving later with an avatar\ninside it is stripped by default rather than after somebody notices.\n\n`profile_image_url` is named in the drop list rather than left to the built-in\nrules, and that is what makes its removal deterministic. The key pattern\nanchors its noun at the START of a key (it knows `profile_pic`, not\n`profile_image_url`), which leaves only the value rule — and that fires just\nwhen a URL path ends in an image extension, which Resy's avatar pipeline need\nnot do.\n\n`view: \"full\"` returns the record untouched. There is **no `raw` rung**: `full`\nalready IS the un-stripped response, so a third value could only alias it.\n\nThe other ten tools take no `view`:\n\n- **`resy_find_slots`, `resy_get_venue` and `resy_list_reservations`** build\n  their answers field by field (`formatSlot`, `formatVenue`,\n  `formatReservation`). No upstream payload survives into the response, and no\n  media URL with it — there is nothing for the rung to remove.\n- **`resy_book`, `resy_cancel`, `resy_add_favorite`, `resy_remove_favorite`,\n  `resy_add_notify`, `resy_remove_notify`** are writes. A write's response is a\n  receipt — a `resy_token`, a confirmation, a status — with nothing to strip and\n  everything to keep.\n- **`resy_healthcheck`** answers reachability and auth.\n\n## Workflows\n\n**Book a specific restaurant at a specific time:**\n```\nresy_search_venues(query: \"carbone\", date: \"2026-05-01\", party_size: 2)\n  → find venue_id\nresy_book(venue_id, date: \"2026-05-01\", party_size: 2, desired_time: \"19:00\")\n  → preview: time, slot_type, terms_token, fees, payment card; show it to the user\n\n  client WITHOUT prompts (claude.ai, Claude Desktop): that preview is\n  `confirmation-required` and carries a confirmToken. Once the user approves in chat:\nresy_book(venue_id, date: \"2026-05-01\", party_size: 2,\n          desired_time: \"<preview's time>\", confirmToken: \"<token>\")\n\n  client WITH prompts (Claude Code): name the slot and the user is prompted:\nresy_book(venue_id, date: \"2026-05-01\", party_size: 2, desired_time: \"<preview's time>\",\n          slot_type: \"<preview's slot_type>\", terms_token: \"<preview's terms_token>\")\n```\n\n**See what's available tonight near me:**\n```\nresy_search_venues(date: \"2026-04-20\", party_size: 2, lat: 37.7749, lng: -122.4194)\n  → returns venues with baked-in slot availability\n```\n\n**Cancel a reservation:**\n```\nresy_list_reservations() → find resy_token for the one to cancel\nresy_cancel(resy_token)\n  → a confirmation prompt, or a preview plus confirmToken to pass back once the user approves\n```\n\n**Stalking a hard-to-get table:**\n```\nresy_search_venues(query: \"4 charles prime rib\", ...) → venue_id\nresy_add_notify(venue_id, date: \"2026-05-31\", party_size: 2, time_start: \"19:00\", time_end: \"21:00\")\n# Resy emails you when a slot opens\n```\n\n## Notes\n\n- Slot `config_token`s expire within minutes of being fetched. `resy_book` re-fetches fresh slots internally — don't try to thread a stale token from `resy_find_slots` into a book call manually.\n- `resy_book` requires a payment method on file at resy.com/account. If none exists it throws a clear error.\n- Default geo is NYC (40.7128, -73.9876). Pass `lat`/`lng` for other cities.\n- Favorites and Priority Notify endpoint paths are reverse-engineered. If a call fails with 404, run `npm run smoke` locally against your credentials and adjust the path.\n- `RESY_API_KEY` env var overrides the baked-in public web-app key if Resy ever rotates it.\n\nFile v1.3.1:_meta.json\n\n{\n  \"ownerId\": \"kn700jq4sjtf2anb0rk3ft4p7n856872\",\n  \"slug\": \"resy\",\n  \"version\": \"1.3.1\",\n  \"publishedAt\": 1791168752596\n}\n\nFile v1.3.1:skill-card.md\n\n## Description:\n\nHelps agents search Resy restaurants and availability, manage reservations and favorites, and subscribe to Priority Notify through an MCP server.\n\nThis skill is ready for commercial/non-commercial use.\n\n## Publisher:\n\n[chrischall](https://clawhub.ai/user/chrischall)\n\n### License/Terms of Use:\n\nMIT-0\n\n## Use Case:\n\nResy users can ask an agent to find restaurant availability, book or cancel tables, manage favorites, and set Priority Notify alerts.\n\n### Deployment Geography for Use:\n\nGlobal\n\n## Known Risks and Mitigations:\n\nRisk: The MCP server accesses the user's Resy account using email and password through an unofficial private API.\n\nMitigation: Install only if comfortable with that access; keep the MCP configuration and credentials private.\n\nRisk: Booking or cancelling a reservation can affect plans or incur fees.\n\nMitigation: Review the venue, time, seating and any fees in the preview before confirming.\n\n## Reference(s):\n\n- [Resy skill on ClawHub](https://clawhub.ai/chrischall/skills/resy)\n- [resy-mcp npm package](https://www.npmjs.com/package/resy-mcp)\n\n## Skill Output:\n\n**Output Type(s):** [Text, Guidance]\n\n**Output Format:** [Plain text and structured reservation details]\n\n**Output Parameters:** [1D]\n\n**Other Properties Related to Output:** [Booking and cancellation are previewed for user confirmation.]\n\n## Skill Version(s):\n\n1.3.1 (source: server-resolved release)\n\n## Ethical Considerations:\n\nUsers should evaluate whether this skill is appropriate for their environment, review any generated or modified files before relying on them, and apply their organization's safety, security, and compliance requirements before deployment.\n\nArchive v1.3.0: 3 files, 5696 bytes\n\nFiles: skill-card.md (1908b), SKILL.md (10198b), _meta.json (123b)\n\nFile v1.3.0:SKILL.md\n\n---\nname: resy\ndescription: Manage Resy restaurant reservations via MCP — search venues, book tables, list and cancel reservations, manage favorites, and subscribe to Priority Notify. Triggers on phrases like \"book a table at\", \"find me a reservation\", \"what reservations do I have\", \"cancel my Resy\", \"add to my Resy hit list\", or any request involving restaurant reservations on Resy. Requires resy-mcp installed and the resy server registered (see Setup below).\n---\n\n# resy-mcp\n\nMCP server for Resy — natural-language restaurant reservation management. Uses Resy's private web-app API with email + password auth.\n\n- **npm:** [npmjs.com/package/resy-mcp](https://www.npmjs.com/package/resy-mcp)\n- **Source:** [github.com/chrischall/resy-mcp](https://github.com/chrischall/resy-mcp)\n\n> ⚠️ Resy does not publish an official API. This server uses the same private endpoints the Resy web app calls, with the public web-app `api_key` and user-level auth via email + password. Use at your own discretion.\n\n## Setup\n\n### Option A — npx (recommended)\n\nAdd to `.mcp.json` in your project or `~/.claude/mcp.json`:\n\n```json\n{\n  \"mcpServers\": {\n    \"resy\": {\n      \"command\": \"npx\",\n      \"args\": [\"-y\", \"resy-mcp\"],\n      \"env\": {\n        \"RESY_EMAIL\": \"you@example.com\",\n        \"RESY_PASSWORD\": \"yourpassword\"\n      }\n    }\n  }\n}\n```\n\n### Option B — from source\n\n```bash\ngit clone https://github.com/chrischall/resy-mcp\ncd resy-mcp\nnpm install && npm run build\n```\n\nThen add to `.mcp.json`:\n\n```json\n{\n  \"mcpServers\": {\n    \"resy\": {\n      \"command\": \"node\",\n      \"args\": [\"/path/to/resy-mcp/dist/bundle.js\"],\n      \"env\": {\n        \"RESY_EMAIL\": \"you@example.com\",\n        \"RESY_PASSWORD\": \"yourpassword\"\n      }\n    }\n  }\n}\n```\n\nOr place `.env` in the project directory with `RESY_EMAIL=` and `RESY_PASSWORD=`.\n\n## Authentication\n\n- `RESY_EMAIL` + `RESY_PASSWORD` are required. The client logs in lazily on first request via `POST /3/auth/password`, caches the returned token for the process lifetime, and re-logs automatically on 401 / 419 / auth-like 500 responses.\n- `RESY_API_KEY` is optional. If unset, the client uses the public web-app key baked into resy.com's JS bundle. Override only if Resy rotates it.\n\n## Tools\n\n### User\n| Tool | Description |\n|------|-------------|\n| `resy_get_profile(view?)` | Current user profile — name, email, phone, booking count, member-since. Payment method IDs are stripped. |\n| `resy_list_payment_methods(view?)` | List saved payment methods (`id`, `brand`, `last_four`, `exp_month`, `exp_year`, `is_default`). The `id` feeds `resy_book`'s `payment_method_id`. |\n\n### Venues\n| Tool | Description |\n|------|-------------|\n| `resy_search_venues(date, party_size, query?, lat?, lng?, limit?, radius_meters?, view?)` | Search venues with availability for a date + party size. Defaults to NYC geo. |\n| `resy_find_slots(venue_id, date, party_size, lat?, lng?)` | List bookable slots at a venue — each includes a short-lived `config_token`. |\n| `resy_get_venue(venue_id)` | Full venue details. |\n\n### Reservations\n| Tool | Description |\n|------|-------------|\n| `resy_book(venue_id, date, party_size, desired_time?, slot_type?, terms_token?, allow_closest_time?, lat?, lng?, payment_method_id?, allow_duplicate?, confirmToken?)` | Composite: find fresh slot → details → book. It books ONLY the exact previewed slot. `desired_time` is \"HH:MM\" (24h); an unavailable time returns the available times unless `allow_closest_time: true` previews the nearest. `slot_type` picks a seating (Dining Room / Bar / Patio) when several share a time. On a client without prompts, the preview comes back as `confirmation-required` with a `confirmToken` bound to that slot's time, seating type and terms; after the user approves, repeat the call with the preview's time as `desired_time` and the `confirmToken` (see `MCP_CONFIRM_MODE`). On a client with prompts, call again with `desired_time` + `slot_type` + `terms_token` (a fingerprint of the seating type and cancellation/payment terms) from the preview and the user is prompted. If the slot, its type or its terms changed, nothing is booked and a fresh preview is returned. The booking refuses if you already hold a reservation at that venue that date (e.g. an earlier timed-out call that went through) unless `allow_duplicate: true`. Uses default payment method unless `payment_method_id` is supplied. |\n| `resy_list_reservations(scope?)` | List reservations. `scope`: `upcoming` (default), `past`, or `all`. Each result includes the `resy_token` needed for cancellation. |\n| `resy_cancel(resy_token, confirmToken?)` | Cancel by `resy_token` (`rr://…`). Asks the user to confirm first (venue, date, time, party size, any fee): a prompt where the client supports one, otherwise a preview plus `confirmToken` that a repeat call passes back. Inspects the response body to set `cancelled: true/false` honestly. |\n\n### Favorites\n| Tool | Description |\n|------|-------------|\n| `resy_list_favorites(view?)` | List favorited venues (\"hit list\"). |\n| `resy_add_favorite(venue_id)` | Add a venue to favorites. |\n| `resy_remove_favorite(venue_id)` | Remove from favorites. |\n\n### Priority Notify\n| Tool | Description |\n|------|-------------|\n| `resy_list_notify(view?)` | List Priority Notify subscriptions. |\n| `resy_add_notify(venue_id, date, party_size, time_start?, time_end?)` | Subscribe to notifications when slots open. `time_start` / `time_end` are HH:MM (24h); default window 18:00–21:00. |\n| `resy_remove_notify(notify_id)` | Cancel a Priority Notify subscription. |\n\n## Response shape (`view`)\n\nFive read tools take `view: \"compact\" | \"full\"` — `resy_get_profile`,\n`resy_list_payment_methods`, `resy_list_favorites`, `resy_list_notify` and\n`resy_search_venues` — and **`compact` is the default**. The slim rung arrives\nwithout being asked for, because an efficiency a caller has to know about and\nrequest is one that usually is not requested.\n\n**Compact strips image and avatar URLs here, and nothing else.** There is no\nfield projection: this server holds no captured fixture or documented field\nlist for Resy's payloads, and an invented one would return a record with holes\nin it that still reads like a verified answer. Media stripping is subtractive,\nso it cannot lose a field nobody knew about.\n\n**The surprise worth stating plainly: on four of those five tools, compact and\nfull are byte-identical today.** `resy_get_profile` is the ONE response in this\nwhole server that carries a media URL — `profile_image_url` off `/2/user` — so\nit is the one place compact removes anything at all. The other four already\nhand back records this server assembled field by field, with no picture in\nthem. The parameter is on them so that a field arriving later with an avatar\ninside it is stripped by default rather than after somebody notices.\n\n`profile_image_url` is named in the drop list rather than left to the built-in\nrules, and that is what makes its removal deterministic. The key pattern\nanchors its noun at the START of a key (it knows `profile_pic`, not\n`profile_image_url`), which leaves only the value rule — and that fires just\nwhen a URL path ends in an image extension, which Resy's avatar pipeline need\nnot do.\n\n`view: \"full\"` returns the record untouched. There is **no `raw` rung**: `full`\nalready IS the un-stripped response, so a third value could only alias it.\n\nThe other ten tools take no `view`:\n\n- **`resy_find_slots`, `resy_get_venue` and `resy_list_reservations`** build\n  their answers field by field (`formatSlot`, `formatVenue`,\n  `formatReservation`). No upstream payload survives into the response, and no\n  media URL with it — there is nothing for the rung to remove.\n- **`resy_book`, `resy_cancel`, `resy_add_favorite`, `resy_remove_favorite`,\n  `resy_add_notify`, `resy_remove_notify`** are writes. A write's response is a\n  receipt — a `resy_token`, a confirmation, a status — with nothing to strip and\n  everything to keep.\n- **`resy_healthcheck`** answers reachability and auth.\n\n## Workflows\n\n**Book a specific restaurant at a specific time:**\n```\nresy_search_venues(query: \"carbone\", date: \"2026-05-01\", party_size: 2)\n  → find venue_id\nresy_book(venue_id, date: \"2026-05-01\", party_size: 2, desired_time: \"19:00\")\n  → preview: time, slot_type, terms_token, fees, payment card; show it to the user\n\n  client WITHOUT prompts (claude.ai, Claude Desktop): that preview is\n  `confirmation-required` and carries a confirmToken. Once the user approves in chat:\nresy_book(venue_id, date: \"2026-05-01\", party_size: 2,\n          desired_time: \"<preview's time>\", confirmToken: \"<token>\")\n\n  client WITH prompts (Claude Code): name the slot and the user is prompted:\nresy_book(venue_id, date: \"2026-05-01\", party_size: 2, desired_time: \"<preview's time>\",\n          slot_type: \"<preview's slot_type>\", terms_token: \"<preview's terms_token>\")\n```\n\n**See what's available tonight near me:**\n```\nresy_search_venues(date: \"2026-04-20\", party_size: 2, lat: 37.7749, lng: -122.4194)\n  → returns venues with baked-in slot availability\n```\n\n**Cancel a reservation:**\n```\nresy_list_reservations() → find resy_token for the one to cancel\nresy_cancel(resy_token)\n  → a confirmation prompt, or a preview plus confirmToken to pass back once the user approves\n```\n\n**Stalking a hard-to-get table:**\n```\nresy_search_venues(query: \"4 charles prime rib\", ...) → venue_id\nresy_add_notify(venue_id, date: \"2026-05-31\", party_size: 2, time_start: \"19:00\", time_end: \"21:00\")\n# Resy emails you when a slot opens\n```\n\n## Notes\n\n- Slot `config_token`s expire within minutes of being fetched. `resy_book` re-fetches fresh slots internally — don't try to thread a stale token from `resy_find_slots` into a book call manually.\n- `resy_book` requires a payment method on file at resy.com/account. If none exists it throws a clear error.\n- Default geo is NYC (40.7128, -73.9876). Pass `lat`/`lng` for other cities.\n- Favorites and Priority Notify endpoint paths are reverse-engineered. If a call fails with 404, run `npm run smoke` locally against your credentials and adjust the path.\n- `RESY_API_KEY` env var overrides the baked-in public web-app key if Resy ever rotates it.\n\nFile v1.3.0:_meta.json\n\n{\n  \"ownerId\": \"kn700jq4sjtf2anb0rk3ft4p7n856872\",\n  \"slug\": \"resy\",\n  \"version\": \"1.3.0\",\n  \"publishedAt\": 1790991958758\n}\n\nFile v1.3.0:skill-card.md\n\n## Description:\n\nHelps users find restaurants, book and cancel Resy reservations, manage favorites, and subscribe to availability notifications.\n\nThis skill is ready for commercial/non-commercial use.\n\n## Publisher:\n\n[chrischall](https://clawhub.ai/user/chrischall)\n\n### License/Terms of Use:\n\nMIT-0\n\n## Use Case:\n\nResy users can search restaurant availability, review and confirm bookings or cancellations, and manage favorite venues and availability alerts through an assistant.\n\n### Deployment Geography for Use:\n\nGlobal\n\n## Known Risks and Mitigations:\n\nRisk: Resy account credentials stored in assistant configuration could be exposed.\n\nMitigation: Use user-local configuration and keep files containing the Resy password out of version control and shared folders.\n\nRisk: Booking or cancellation could commit to an unintended slot or fee.\n\nMitigation: Review the venue, time, seating, terms, and any fees in the preview before confirming.\n\nRisk: Resy's unofficial private API may change or stop working.\n\nMitigation: Check availability and transaction results before relying on them; reassess the integration if Resy changes its web app.\n\n## Reference(s):\n\n- [Resy skill listing](https://clawhub.ai/chrischall/skills/resy)\n- [resy-mcp package](https://www.npmjs.com/package/resy-mcp)\n\n## Skill Output:\n\n**Output Type(s):** [Text, Guidance]\n\n**Output Format:** [Markdown with restaurant availability, reservation details, and confirmation previews]\n\n**Output Parameters:** [1D]\n\n**Other Properties Related to Output:** [Booking and cancellation require user confirmation.]\n\n## Skill Version(s):\n\n1.3.0 (source: ClawHub release metadata)\n\n## Ethical Considerations:\n\nUsers should evaluate whether this skill is appropriate for their environment, review any generated or modified files before relying on them, and apply their organization's safety, security, and compliance requirements before deployment.\n\nArchive v1.2.2: 3 files, 5513 bytes\n\nFiles: skill-card.md (1692b), SKILL.md (9950b), _meta.json (123b)\n\nFile v1.2.2:SKILL.md\n\n---\nname: resy\ndescription: Manage Resy restaurant reservations via MCP — search venues, book tables, list and cancel reservations, manage favorites, and subscribe to Priority Notify. Triggers on phrases like \"book a table at\", \"find me a reservation\", \"what reservations do I have\", \"cancel my Resy\", \"add to my Resy hit list\", or any request involving restaurant reservations on Resy. Requires resy-mcp installed and the resy server registered (see Setup below).\n---\n\n# resy-mcp\n\nMCP server for Resy — natural-language restaurant reservation management. Uses Resy's private web-app API with email + password auth.\n\n- **npm:** [npmjs.com/package/resy-mcp](https://www.npmjs.com/package/resy-mcp)\n- **Source:** [github.com/chrischall/resy-mcp](https://github.com/chrischall/resy-mcp)\n\n> ⚠️ Resy does not publish an official API. This server uses the same private endpoints the Resy web app calls, with the public web-app `api_key` and user-level auth via email + password. Use at your own discretion.\n\n## Setup\n\n### Option A — npx (recommended)\n\nAdd to `.mcp.json` in your project or `~/.claude/mcp.json`:\n\n```json\n{\n  \"mcpServers\": {\n    \"resy\": {\n      \"command\": \"npx\",\n      \"args\": [\"-y\", \"resy-mcp\"],\n      \"env\": {\n        \"RESY_EMAIL\": \"you@example.com\",\n        \"RESY_PASSWORD\": \"yourpassword\"\n      }\n    }\n  }\n}\n```\n\n### Option B — from source\n\n```bash\ngit clone https://github.com/chrischall/resy-mcp\ncd resy-mcp\nnpm install && npm run build\n```\n\nThen add to `.mcp.json`:\n\n```json\n{\n  \"mcpServers\": {\n    \"resy\": {\n      \"command\": \"node\",\n      \"args\": [\"/path/to/resy-mcp/dist/bundle.js\"],\n      \"env\": {\n        \"RESY_EMAIL\": \"you@example.com\",\n        \"RESY_PASSWORD\": \"yourpassword\"\n      }\n    }\n  }\n}\n```\n\nOr place `.env` in the project directory with `RESY_EMAIL=` and `RESY_PASSWORD=`.\n\n## Authentication\n\n- `RESY_EMAIL` + `RESY_PASSWORD` are required. The client logs in lazily on first request via `POST /3/auth/password`, caches the returned token for the process lifetime, and re-logs automatically on 401 / 419 / auth-like 500 responses.\n- `RESY_API_KEY` is optional. If unset, the client uses the public web-app key baked into resy.com's JS bundle. Override only if Resy rotates it.\n\n## Tools\n\n### User\n| Tool | Description |\n|------|-------------|\n| `resy_get_profile(view?)` | Current user profile — name, email, phone, booking count, member-since. Payment method IDs are stripped. |\n| `resy_list_payment_methods(view?)` | List saved payment methods (`id`, `brand`, `last_four`, `exp_month`, `exp_year`, `is_default`). The `id` feeds `resy_book`'s `payment_method_id`. |\n\n### Venues\n| Tool | Description |\n|------|-------------|\n| `resy_search_venues(date, party_size, query?, lat?, lng?, limit?, radius_meters?, view?)` | Search venues with availability for a date + party size. Defaults to NYC geo. |\n| `resy_find_slots(venue_id, date, party_size, lat?, lng?)` | List bookable slots at a venue — each includes a short-lived `config_token`. |\n| `resy_get_venue(venue_id)` | Full venue details. |\n\n### Reservations\n| Tool | Description |\n|------|-------------|\n| `resy_book(venue_id, date, party_size, desired_time?, slot_type?, terms_token?, allow_closest_time?, lat?, lng?, payment_method_id?, allow_duplicate?, confirmToken?)` | Composite: find fresh slot → details → book. It books ONLY the exact previewed slot: without `desired_time` + `slot_type` + `terms_token` (a fingerprint of the seating type and cancellation/payment terms) it only returns a preview. `desired_time` is \"HH:MM\" (24h); an unavailable time returns the available times unless `allow_closest_time: true` previews the nearest. `slot_type` picks a seating (Dining Room / Bar / Patio) when several share a time. Once all three name the previewed slot, the booking asks the user to confirm first: a confirmation prompt where the client supports one; otherwise that call returns the preview plus a `confirmToken`, and only a repeat call with that token books (see `MCP_CONFIRM_MODE`). If the slot, its type or its terms changed, nothing is booked and a fresh preview is returned. The booking refuses if you already hold a reservation at that venue that date (e.g. an earlier timed-out call that went through) unless `allow_duplicate: true`. Uses default payment method unless `payment_method_id` is supplied. |\n| `resy_list_reservations(scope?)` | List reservations. `scope`: `upcoming` (default), `past`, or `all`. Each result includes the `resy_token` needed for cancellation. |\n| `resy_cancel(resy_token, confirmToken?)` | Cancel by `resy_token` (`rr://…`). Asks the user to confirm first (venue, date, time, party size, any fee): a prompt where the client supports one, otherwise a preview plus `confirmToken` that a repeat call passes back. Inspects the response body to set `cancelled: true/false` honestly. |\n\n### Favorites\n| Tool | Description |\n|------|-------------|\n| `resy_list_favorites(view?)` | List favorited venues (\"hit list\"). |\n| `resy_add_favorite(venue_id)` | Add a venue to favorites. |\n| `resy_remove_favorite(venue_id)` | Remove from favorites. |\n\n### Priority Notify\n| Tool | Description |\n|------|-------------|\n| `resy_list_notify(view?)` | List Priority Notify subscriptions. |\n| `resy_add_notify(venue_id, date, party_size, time_start?, time_end?)` | Subscribe to notifications when slots open. `time_start` / `time_end` are HH:MM (24h); default window 18:00–21:00. |\n| `resy_remove_notify(notify_id)` | Cancel a Priority Notify subscription. |\n\n## Response shape (`view`)\n\nFive read tools take `view: \"compact\" | \"full\"` — `resy_get_profile`,\n`resy_list_payment_methods`, `resy_list_favorites`, `resy_list_notify` and\n`resy_search_venues` — and **`compact` is the default**. The slim rung arrives\nwithout being asked for, because an efficiency a caller has to know about and\nrequest is one that usually is not requested.\n\n**Compact strips image and avatar URLs here, and nothing else.** There is no\nfield projection: this server holds no captured fixture or documented field\nlist for Resy's payloads, and an invented one would return a record with holes\nin it that still reads like a verified answer. Media stripping is subtractive,\nso it cannot lose a field nobody knew about.\n\n**The surprise worth stating plainly: on four of those five tools, compact and\nfull are byte-identical today.** `resy_get_profile` is the ONE response in this\nwhole server that carries a media URL — `profile_image_url` off `/2/user` — so\nit is the one place compact removes anything at all. The other four already\nhand back records this server assembled field by field, with no picture in\nthem. The parameter is on them so that a field arriving later with an avatar\ninside it is stripped by default rather than after somebody notices.\n\n`profile_image_url` is named in the drop list rather than left to the built-in\nrules, and that is what makes its removal deterministic. The key pattern\nanchors its noun at the START of a key (it knows `profile_pic`, not\n`profile_image_url`), which leaves only the value rule — and that fires just\nwhen a URL path ends in an image extension, which Resy's avatar pipeline need\nnot do.\n\n`view: \"full\"` returns the record untouched. There is **no `raw` rung**: `full`\nalready IS the un-stripped response, so a third value could only alias it.\n\nThe other ten tools take no `view`:\n\n- **`resy_find_slots`, `resy_get_venue` and `resy_list_reservations`** build\n  their answers field by field (`formatSlot`, `formatVenue`,\n  `formatReservation`). No upstream payload survives into the response, and no\n  media URL with it — there is nothing for the rung to remove.\n- **`resy_book`, `resy_cancel`, `resy_add_favorite`, `resy_remove_favorite`,\n  `resy_add_notify`, `resy_remove_notify`** are writes. A write's response is a\n  receipt — a `resy_token`, a confirmation, a status — with nothing to strip and\n  everything to keep.\n- **`resy_healthcheck`** answers reachability and auth.\n\n## Workflows\n\n**Book a specific restaurant at a specific time:**\n```\nresy_search_venues(query: \"carbone\", date: \"2026-05-01\", party_size: 2)\n  → find venue_id\nresy_book(venue_id, date: \"2026-05-01\", party_size: 2, desired_time: \"19:00\")\n  → preview: time, slot_type, terms_token, fees, payment card; show it to the user\nresy_book(venue_id, date: \"2026-05-01\", party_size: 2, desired_time: \"19:00\",\n          slot_type: \"<preview's slot_type>\", terms_token: \"<preview's terms_token>\")\n  → a confirmation prompt; or, on a client without prompts, the preview plus a confirmToken:\n    show it to the user and, once they approve in chat, repeat the call with confirmToken\n```\n\n**See what's available tonight near me:**\n```\nresy_search_venues(date: \"2026-04-20\", party_size: 2, lat: 37.7749, lng: -122.4194)\n  → returns venues with baked-in slot availability\n```\n\n**Cancel a reservation:**\n```\nresy_list_reservations() → find resy_token for the one to cancel\nresy_cancel(resy_token)\n  → a confirmation prompt, or a preview plus confirmToken to pass back once the user approves\n```\n\n**Stalking a hard-to-get table:**\n```\nresy_search_venues(query: \"4 charles prime rib\", ...) → venue_id\nresy_add_notify(venue_id, date: \"2026-05-31\", party_size: 2, time_start: \"19:00\", time_end: \"21:00\")\n# Resy emails you when a slot opens\n```\n\n## Notes\n\n- Slot `config_token`s expire within minutes of being fetched. `resy_book` re-fetches fresh slots internally — don't try to thread a stale token from `resy_find_slots` into a book call manually.\n- `resy_book` requires a payment method on file at resy.com/account. If none exists it throws a clear error.\n- Default geo is NYC (40.7128, -73.9876). Pass `lat`/`lng` for other cities.\n- Favorites and Priority Notify endpoint paths are reverse-engineered. If a call fails with 404, run `npm run smoke` locally against your credentials and adjust the path.\n- `RESY_API_KEY` env var overrides the baked-in public web-app key if Resy ever rotates it.\n\nFile v1.2.2:_meta.json\n\n{\n  \"ownerId\": \"kn700jq4sjtf2anb0rk3ft4p7n856872\",\n  \"slug\": \"resy\",\n  \"version\": \"1.2.2\",\n  \"publishedAt\": 1790604022350\n}\n\nFile v1.2.2:skill-card.md\n\n## Description:\n\nHelps users search Resy restaurants, manage reservations and favorites, and subscribe to Priority Notify through a connected Resy account.\n\nThis skill is ready for commercial/non-commercial use.\n\n## Publisher:\n\n[chrischall](https://clawhub.ai/user/chrischall)\n\n### License/Terms of Use:\n\nMIT-0\n\n## Use Case:\n\nResy account holders use this skill to find available tables, book or cancel reservations, manage favorites, and receive availability notifications.\n\n### Deployment Geography for Use:\n\nGlobal\n\n## Known Risks and Mitigations:\n\nRisk: The connected server needs a Resy email and password to access the account.\n\nMitigation: Use project-local configuration or protected secrets, and redact credentials when troubleshooting.\n\nRisk: Booking or cancellation can change reservations and may incur payment terms or fees.\n\nMitigation: Review the exact reservation, cancellation terms, and any fees before confirming each action.\n\n## Reference(s):\n\n- [resy-mcp package](https://www.npmjs.com/package/resy-mcp)\n- [resy-mcp repository](https://github.com/chrischall/resy-mcp)\n\n## Skill Output:\n\n**Output Type(s):** [Text, Guidance]\n\n**Output Format:** [Natural-language responses with reservation details and confirmations]\n\n**Output Parameters:** [1D]\n\n**Other Properties Related to Output:** [Booking and cancellation require user confirmation.]\n\n## Skill Version(s):\n\n1.2.2 (source: ClawHub release evidence)\n\n## Ethical Considerations:\n\nUsers should evaluate whether this skill is appropriate for their environment, review any generated or modified files before relying on them, and apply their organization's safety, security, and compliance requirements before deployment.\n\nArchive v1.2.1: 3 files, 5552 bytes\n\nFiles: skill-card.md (1746b), SKILL.md (9950b), _meta.json (123b)\n\nFile v1.2.1:SKILL.md\n\n---\nname: resy\ndescription: Manage Resy restaurant reservations via MCP — search venues, book tables, list and cancel reservations, manage favorites, and subscribe to Priority Notify. Triggers on phrases like \"book a table at\", \"find me a reservation\", \"what reservations do I have\", \"cancel my Resy\", \"add to my Resy hit list\", or any request involving restaurant reservations on Resy. Requires resy-mcp installed and the resy server registered (see Setup below).\n---\n\n# resy-mcp\n\nMCP server for Resy — natural-language restaurant reservation management. Uses Resy's private web-app API with email + password auth.\n\n- **npm:** [npmjs.com/package/resy-mcp](https://www.npmjs.com/package/resy-mcp)\n- **Source:** [github.com/chrischall/resy-mcp](https://github.com/chrischall/resy-mcp)\n\n> ⚠️ Resy does not publish an official API. This server uses the same private endpoints the Resy web app calls, with the public web-app `api_key` and user-level auth via email + password. Use at your own discretion.\n\n## Setup\n\n### Option A — npx (recommended)\n\nAdd to `.mcp.json` in your project or `~/.claude/mcp.json`:\n\n```json\n{\n  \"mcpServers\": {\n    \"resy\": {\n      \"command\": \"npx\",\n      \"args\": [\"-y\", \"resy-mcp\"],\n      \"env\": {\n        \"RESY_EMAIL\": \"you@example.com\",\n        \"RESY_PASSWORD\": \"yourpassword\"\n      }\n    }\n  }\n}\n```\n\n### Option B — from source\n\n```bash\ngit clone https://github.com/chrischall/resy-mcp\ncd resy-mcp\nnpm install && npm run build\n```\n\nThen add to `.mcp.json`:\n\n```json\n{\n  \"mcpServers\": {\n    \"resy\": {\n      \"command\": \"node\",\n      \"args\": [\"/path/to/resy-mcp/dist/bundle.js\"],\n      \"env\": {\n        \"RESY_EMAIL\": \"you@example.com\",\n        \"RESY_PASSWORD\": \"yourpassword\"\n      }\n    }\n  }\n}\n```\n\nOr place `.env` in the project directory with `RESY_EMAIL=` and `RESY_PASSWORD=`.\n\n## Authentication\n\n- `RESY_EMAIL` + `RESY_PASSWORD` are required. The client logs in lazily on first request via `POST /3/auth/password`, caches the returned token for the process lifetime, and re-logs automatically on 401 / 419 / auth-like 500 responses.\n- `RESY_API_KEY` is optional. If unset, the client uses the public web-app key baked into resy.com's JS bundle. Override only if Resy rotates it.\n\n## Tools\n\n### User\n| Tool | Description |\n|------|-------------|\n| `resy_get_profile(view?)` | Current user profile — name, email, phone, booking count, member-since. Payment method IDs are stripped. |\n| `resy_list_payment_methods(view?)` | List saved payment methods (`id`, `brand`, `last_four`, `exp_month`, `exp_year`, `is_default`). The `id` feeds `resy_book`'s `payment_method_id`. |\n\n### Venues\n| Tool | Description |\n|------|-------------|\n| `resy_search_venues(date, party_size, query?, lat?, lng?, limit?, radius_meters?, view?)` | Search venues with availability for a date + party size. Defaults to NYC geo. |\n| `resy_find_slots(venue_id, date, party_size, lat?, lng?)` | List bookable slots at a venue — each includes a short-lived `config_token`. |\n| `resy_get_venue(venue_id)` | Full venue details. |\n\n### Reservations\n| Tool | Description |\n|------|-------------|\n| `resy_book(venue_id, date, party_size, desired_time?, slot_type?, terms_token?, allow_closest_time?, lat?, lng?, payment_method_id?, allow_duplicate?, confirmToken?)` | Composite: find fresh slot → details → book. It books ONLY the exact previewed slot: without `desired_time` + `slot_type` + `terms_token` (a fingerprint of the seating type and cancellation/payment terms) it only returns a preview. `desired_time` is \"HH:MM\" (24h); an unavailable time returns the available times unless `allow_closest_time: true` previews the nearest. `slot_type` picks a seating (Dining Room / Bar / Patio) when several share a time. Once all three name the previewed slot, the booking asks the user to confirm first: a confirmation prompt where the client supports one; otherwise that call returns the preview plus a `confirmToken`, and only a repeat call with that token books (see `MCP_CONFIRM_MODE`). If the slot, its type or its terms changed, nothing is booked and a fresh preview is returned. The booking refuses if you already hold a reservation at that venue that date (e.g. an earlier timed-out call that went through) unless `allow_duplicate: true`. Uses default payment method unless `payment_method_id` is supplied. |\n| `resy_list_reservations(scope?)` | List reservations. `scope`: `upcoming` (default), `past`, or `all`. Each result includes the `resy_token` needed for cancellation. |\n| `resy_cancel(resy_token, confirmToken?)` | Cancel by `resy_token` (`rr://…`). Asks the user to confirm first (venue, date, time, party size, any fee): a prompt where the client supports one, otherwise a preview plus `confirmToken` that a repeat call passes back. Inspects the response body to set `cancelled: true/false` honestly. |\n\n### Favorites\n| Tool | Description |\n|------|-------------|\n| `resy_list_favorites(view?)` | List favorited venues (\"hit list\"). |\n| `resy_add_favorite(venue_id)` | Add a venue to favorites. |\n| `resy_remove_favorite(venue_id)` | Remove from favorites. |\n\n### Priority Notify\n| Tool | Description |\n|------|-------------|\n| `resy_list_notify(view?)` | List Priority Notify subscriptions. |\n| `resy_add_notify(venue_id, date, party_size, time_start?, time_end?)` | Subscribe to notifications when slots open. `time_start` / `time_end` are HH:MM (24h); default window 18:00–21:00. |\n| `resy_remove_notify(notify_id)` | Cancel a Priority Notify subscription. |\n\n## Response shape (`view`)\n\nFive read tools take `view: \"compact\" | \"full\"` — `resy_get_profile`,\n`resy_list_payment_methods`, `resy_list_favorites`, `resy_list_notify` and\n`resy_search_venues` — and **`compact` is the default**. The slim rung arrives\nwithout being asked for, because an efficiency a caller has to know about and\nrequest is one that usually is not requested.\n\n**Compact strips image and avatar URLs here, and nothing else.** There is no\nfield projection: this server holds no captured fixture or documented field\nlist for Resy's payloads, and an invented one would return a record with holes\nin it that still reads like a verified answer. Media stripping is subtractive,\nso it cannot lose a field nobody knew about.\n\n**The surprise worth stating plainly: on four of those five tools, compact and\nfull are byte-identical today.** `resy_get_profile` is the ONE response in this\nwhole server that carries a media URL — `profile_image_url` off `/2/user` — so\nit is the one place compact removes anything at all. The other four already\nhand back records this server assembled field by field, with no picture in\nthem. The parameter is on them so that a field arriving later with an avatar\ninside it is stripped by default rather than after somebody notices.\n\n`profile_image_url` is named in the drop list rather than left to the built-in\nrules, and that is what makes its removal deterministic. The key pattern\nanchors its noun at the START of a key (it knows `profile_pic`, not\n`profile_image_url`), which leaves only the value rule — and that fires just\nwhen a URL path ends in an image extension, which Resy's avatar pipeline need\nnot do.\n\n`view: \"full\"` returns the record untouched. There is **no `raw` rung**: `full`\nalready IS the un-stripped response, so a third value could only alias it.\n\nThe other ten tools take no `view`:\n\n- **`resy_find_slots`, `resy_get_venue` and `resy_list_reservations`** build\n  their answers field by field (`formatSlot`, `formatVenue`,\n  `formatReservation`). No upstream payload survives into the response, and no\n  media URL with it — there is nothing for the rung to remove.\n- **`resy_book`, `resy_cancel`, `resy_add_favorite`, `resy_remove_favorite`,\n  `resy_add_notify`, `resy_remove_notify`** are writes. A write's response is a\n  receipt — a `resy_token`, a confirmation, a status — with nothing to strip and\n  everything to keep.\n- **`resy_healthcheck`** answers reachability and auth.\n\n## Workflows\n\n**Book a specific restaurant at a specific time:**\n```\nresy_search_venues(query: \"carbone\", date: \"2026-05-01\", party_size: 2)\n  → find venue_id\nresy_book(venue_id, date: \"2026-05-01\", party_size: 2, desired_time: \"19:00\")\n  → preview: time, slot_type, terms_token, fees, payment card; show it to the user\nresy_book(venue_id, date: \"2026-05-01\", party_size: 2, desired_time: \"19:00\",\n          slot_type: \"<preview's slot_type>\", terms_token: \"<preview's terms_token>\")\n  → a confirmation prompt; or, on a client without prompts, the preview plus a confirmToken:\n    show it to the user and, once they approve in chat, repeat the call with confirmToken\n```\n\n**See what's available tonight near me:**\n```\nresy_search_venues(date: \"2026-04-20\", party_size: 2, lat: 37.7749, lng: -122.4194)\n  → returns venues with baked-in slot availability\n```\n\n**Cancel a reservation:**\n```\nresy_list_reservations() → find resy_token for the one to cancel\nresy_cancel(resy_token)\n  → a confirmation prompt, or a preview plus confirmToken to pass back once the user approves\n```\n\n**Stalking a hard-to-get table:**\n```\nresy_search_venues(query: \"4 charles prime rib\", ...) → venue_id\nresy_add_notify(venue_id, date: \"2026-05-31\", party_size: 2, time_start: \"19:00\", time_end: \"21:00\")\n# Resy emails you when a slot opens\n```\n\n## Notes\n\n- Slot `config_token`s expire within minutes of being fetched. `resy_book` re-fetches fresh slots internally — don't try to thread a stale token from `resy_find_slots` into a book call manually.\n- `resy_book` requires a payment method on file at resy.com/account. If none exists it throws a clear error.\n- Default geo is NYC (40.7128, -73.9876). Pass `lat`/`lng` for other cities.\n- Favorites and Priority Notify endpoint paths are reverse-engineered. If a call fails with 404, run `npm run smoke` locally against your credentials and adjust the path.\n- `RESY_API_KEY` env var overrides the baked-in public web-app key if Resy ever rotates it.\n\nFile v1.2.1:_meta.json\n\n{\n  \"ownerId\": \"kn700jq4sjtf2anb0rk3ft4p7n856872\",\n  \"slug\": \"resy\",\n  \"version\": \"1.2.1\",\n  \"publishedAt\": 1790352214351\n}\n\nFile v1.2.1:skill-card.md\n\n## Description:\n\nHelps users search Resy restaurants, book or cancel reservations, manage favorites, and subscribe to availability notifications.\n\nThis skill is ready for commercial/non-commercial use.\n\n## Publisher:\n\n[chrischall](https://clawhub.ai/user/chrischall)\n\n### License/Terms of Use:\n\nMIT-0\n\n## Use Case:\n\nPeople using Resy can find available tables, book and cancel reservations, manage their favorites, and receive alerts when a table opens.\n\n### Deployment Geography for Use:\n\nGlobal\n\n## Known Risks and Mitigations:\n\nRisk: The connector requires live Resy account credentials.\n\nMitigation: Keep RESY_EMAIL and RESY_PASSWORD in private, uncommitted configuration with restricted access.\n\nRisk: Booking or cancellation can change a live reservation and may incur fees.\n\nMitigation: Review the reservation details and any fees before confirming the action.\n\n## Reference(s):\n\n- [Resy skill on ClawHub](https://clawhub.ai/chrischall/skills/resy)\n- [resy-mcp npm package](https://www.npmjs.com/package/resy-mcp)\n- [resy-mcp project repository (linked by skill)](https://github.com/chrischall/resy-mcp)\n\n## Skill Output:\n\n**Output Type(s):** [Text, Guidance, Configuration instructions]\n\n**Output Format:** [Natural-language responses with reservation details and setup examples]\n\n**Output Parameters:** [1D]\n\n**Other Properties Related to Output:** [Booking and cancellation actions require confirmation.]\n\n## Skill Version(s):\n\n1.2.1 (source: ClawHub release metadata)\n\n## Ethical Considerations:\n\nUsers should evaluate whether this skill is appropriate for their environment, review any generated or modified files before relying on them, and apply their organization's safety, security, and compliance requirements before deployment.\n\nArchive v1.2.0: 3 files, 5787 bytes\n\nFiles: skill-card.md (2301b), SKILL.md (9950b), _meta.json (123b)\n\nFile v1.2.0:SKILL.md\n\n---\nname: resy\ndescription: Manage Resy restaurant reservations via MCP — search venues, book tables, list and cancel reservations, manage favorites, and subscribe to Priority Notify. Triggers on phrases like \"book a table at\", \"find me a reservation\", \"what reservations do I have\", \"cancel my Resy\", \"add to my Resy hit list\", or any request involving restaurant reservations on Resy. Requires resy-mcp installed and the resy server registered (see Setup below).\n---\n\n# resy-mcp\n\nMCP server for Resy — natural-language restaurant reservation management. Uses Resy's private web-app API with email + password auth.\n\n- **npm:** [npmjs.com/package/resy-mcp](https://www.npmjs.com/package/resy-mcp)\n- **Source:** [github.com/chrischall/resy-mcp](https://github.com/chrischall/resy-mcp)\n\n> ⚠️ Resy does not publish an official API. This server uses the same private endpoints the Resy web app calls, with the public web-app `api_key` and user-level auth via email + password. Use at your own discretion.\n\n## Setup\n\n### Option A — npx (recommended)\n\nAdd to `.mcp.json` in your project or `~/.claude/mcp.json`:\n\n```json\n{\n  \"mcpServers\": {\n    \"resy\": {\n      \"command\": \"npx\",\n      \"args\": [\"-y\", \"resy-mcp\"],\n      \"env\": {\n        \"RESY_EMAIL\": \"you@example.com\",\n        \"RESY_PASSWORD\": \"yourpassword\"\n      }\n    }\n  }\n}\n```\n\n### Option B — from source\n\n```bash\ngit clone https://github.com/chrischall/resy-mcp\ncd resy-mcp\nnpm install && npm run build\n```\n\nThen add to `.mcp.json`:\n\n```json\n{\n  \"mcpServers\": {\n    \"resy\": {\n      \"command\": \"node\",\n      \"args\": [\"/path/to/resy-mcp/dist/bundle.js\"],\n      \"env\": {\n        \"RESY_EMAIL\": \"you@example.com\",\n        \"RESY_PASSWORD\": \"yourpassword\"\n      }\n    }\n  }\n}\n```\n\nOr place `.env` in the project directory with `RESY_EMAIL=` and `RESY_PASSWORD=`.\n\n## Authentication\n\n- `RESY_EMAIL` + `RESY_PASSWORD` are required. The client logs in lazily on first request via `POST /3/auth/password`, caches the returned token for the process lifetime, and re-logs automatically on 401 / 419 / auth-like 500 responses.\n- `RESY_API_KEY` is optional. If unset, the client uses the public web-app key baked into resy.com's JS bundle. Override only if Resy rotates it.\n\n## Tools\n\n### User\n| Tool | Description |\n|------|-------------|\n| `resy_get_profile(view?)` | Current user profile — name, email, phone, booking count, member-since. Payment method IDs are stripped. |\n| `resy_list_payment_methods(view?)` | List saved payment methods (`id`, `brand`, `last_four`, `exp_month`, `exp_year`, `is_default`). The `id` feeds `resy_book`'s `payment_method_id`. |\n\n### Venues\n| Tool | Description |\n|------|-------------|\n| `resy_search_venues(date, party_size, query?, lat?, lng?, limit?, radius_meters?, view?)` | Search venues with availability for a date + party size. Defaults to NYC geo. |\n| `resy_find_slots(venue_id, date, party_size, lat?, lng?)` | List bookable slots at a venue — each includes a short-lived `config_token`. |\n| `resy_get_venue(venue_id)` | Full venue details. |\n\n### Reservations\n| Tool | Description |\n|------|-------------|\n| `resy_book(venue_id, date, party_size, desired_time?, slot_type?, terms_token?, allow_closest_time?, lat?, lng?, payment_method_id?, allow_duplicate?, confirmToken?)` | Composite: find fresh slot → details → book. It books ONLY the exact previewed slot: without `desired_time` + `slot_type` + `terms_token` (a fingerprint of the seating type and cancellation/payment terms) it only returns a preview. `desired_time` is \"HH:MM\" (24h); an unavailable time returns the available times unless `allow_closest_time: true` previews the nearest. `slot_type` picks a seating (Dining Room / Bar / Patio) when several share a time. Once all three name the previewed slot, the booking asks the user to confirm first: a confirmation prompt where the client supports one; otherwise that call returns the preview plus a `confirmToken`, and only a repeat call with that token books (see `MCP_CONFIRM_MODE`). If the slot, its type or its terms changed, nothing is booked and a fresh preview is returned. The booking refuses if you already hold a reservation at that venue that date (e.g. an earlier timed-out call that went through) unless `allow_duplicate: true`. Uses default payment method unless `payment_method_id` is supplied. |\n| `resy_list_reservations(scope?)` | List reservations. `scope`: `upcoming` (default), `past`, or `all`. Each result includes the `resy_token` needed for cancellation. |\n| `resy_cancel(resy_token, confirmToken?)` | Cancel by `resy_token` (`rr://…`). Asks the user to confirm first (venue, date, time, party size, any fee): a prompt where the client supports one, otherwise a preview plus `confirmToken` that a repeat call passes back. Inspects the response body to set `cancelled: true/false` honestly. |\n\n### Favorites\n| Tool | Description |\n|------|-------------|\n| `resy_list_favorites(view?)` | List favorited venues (\"hit list\"). |\n| `resy_add_favorite(venue_id)` | Add a venue to favorites. |\n| `resy_remove_favorite(venue_id)` | Remove from favorites. |\n\n### Priority Notify\n| Tool | Description |\n|------|-------------|\n| `resy_list_notify(view?)` | List Priority Notify subscriptions. |\n| `resy_add_notify(venue_id, date, party_size, time_start?, time_end?)` | Subscribe to notifications when slots open. `time_start` / `time_end` are HH:MM (24h); default window 18:00–21:00. |\n| `resy_remove_notify(notify_id)` | Cancel a Priority Notify subscription. |\n\n## Response shape (`view`)\n\nFive read tools take `view: \"compact\" | \"full\"` — `resy_get_profile`,\n`resy_list_payment_methods`, `resy_list_favorites`, `resy_list_notify` and\n`resy_search_venues` — and **`compact` is the default**. The slim rung arrives\nwithout being asked for, because an efficiency a caller has to know about and\nrequest is one that usually is not requested.\n\n**Compact strips image and avatar URLs here, and nothing else.** There is no\nfield projection: this server holds no captured fixture or documented field\nlist for Resy's payloads, and an invented one would return a record with holes\nin it that still reads like a verified answer. Media stripping is subtractive,\nso it cannot lose a field nobody knew about.\n\n**The surprise worth stating plainly: on four of those five tools, compact and\nfull are byte-identical today.** `resy_get_profile` is the ONE response in this\nwhole server that carries a media URL — `profile_image_url` off `/2/user` — so\nit is the one place compact removes anything at all. The other four already\nhand back records this server assembled field by field, with no picture in\nthem. The parameter is on them so that a field arriving later with an avatar\ninside it is stripped by default rather than after somebody notices.\n\n`profile_image_url` is named in the drop list rather than left to the built-in\nrules, and that is what makes its removal deterministic. The key pattern\nanchors its noun at the START of a key (it knows `profile_pic`, not\n`profile_image_url`), which leaves only the value rule — and that fires just\nwhen a URL path ends in an image extension, which Resy's avatar pipeline need\nnot do.\n\n`view: \"full\"` returns the record untouched. There is **no `raw` rung**: `full`\nalready IS the un-stripped response, so a third value could only alias it.\n\nThe other ten tools take no `view`:\n\n- **`resy_find_slots`, `resy_get_venue` and `resy_list_reservations`** build\n  their answers field by field (`formatSlot`, `formatVenue`,\n  `formatReservation`). No upstream payload survives into the response, and no\n  media URL with it — there is nothing for the rung to remove.\n- **`resy_book`, `resy_cancel`, `resy_add_favorite`, `resy_remove_favorite`,\n  `resy_add_notify`, `resy_remove_notify`** are writes. A write's response is a\n  receipt — a `resy_token`, a confirmation, a status — with nothing to strip and\n  everything to keep.\n- **`resy_healthcheck`** answers reachability and auth.\n\n## Workflows\n\n**Book a specific restaurant at a specific time:**\n```\nresy_search_venues(query: \"carbone\", date: \"2026-05-01\", party_size: 2)\n  → find venue_id\nresy_book(venue_id, date: \"2026-05-01\", party_size: 2, desired_time: \"19:00\")\n  → preview: time, slot_type, terms_token, fees, payment card; show it to the user\nresy_book(venue_id, date: \"2026-05-01\", party_size: 2, desired_time: \"19:00\",\n          slot_type: \"<preview's slot_type>\", terms_token: \"<preview's terms_token>\")\n  → a confirmation prompt; or, on a client without prompts, the preview plus a confirmToken:\n    show it to the user and, once they approve in chat, repeat the call with confirmToken\n```\n\n**See what's available tonight near me:**\n```\nresy_search_venues(date: \"2026-04-20\", party_size: 2, lat: 37.7749, lng: -122.4194)\n  → returns venues with baked-in slot availability\n```\n\n**Cancel a reservation:**\n```\nresy_list_reservations() → find resy_token for the one to cancel\nresy_cancel(resy_token)\n  → a confirmation prompt, or a preview plus confirmToken to pass back once the user approves\n```\n\n**Stalking a hard-to-get table:**\n```\nresy_search_venues(query: \"4 charles prime rib\", ...) → venue_id\nresy_add_notify(venue_id, date: \"2026-05-31\", party_size: 2, time_start: \"19:00\", time_end: \"21:00\")\n# Resy emails you when a slot opens\n```\n\n## Notes\n\n- Slot `config_token`s expire within minutes of being fetched. `resy_book` re-fetches fresh slots internally — don't try to thread a stale token from `resy_find_slots` into a book call manually.\n- `resy_book` requires a payment method on file at resy.com/account. If none exists it throws a clear error.\n- Default geo is NYC (40.7128, -73.9876). Pass `lat`/`lng` for other cities.\n- Favorites and Priority Notify endpoint paths are reverse-engineered. If a call fails with 404, run `npm run smoke` locally against your credentials and adjust the path.\n- `RESY_API_KEY` env var overrides the baked-in public web-app key if Resy ever rotates it.\n\nFile v1.2.0:_meta.json\n\n{\n  \"ownerId\": \"kn700jq4sjtf2anb0rk3ft4p7n856872\",\n  \"slug\": \"resy\",\n  \"version\": \"1.2.0\",\n  \"publishedAt\": 1790262755764\n}\n\nFile v1.2.0:skill-card.md\n\n## Description:\n\nManage Resy restaurant reservations through an MCP server, including venue search, booking, cancellation, favorites, and Priority Notify subscriptions.\n\nThis skill is ready for commercial/non-commercial use.\n\n## Publisher:\n\n[chrischall](https://clawhub.ai/user/chrischall)\n\n### License/Terms of Use:\n\nMIT-0\n\n## Use Case:\n\nExternal users and developers use this skill to connect an agent to Resy reservation workflows such as searching availability, booking tables, cancelling reservations, managing favorites, and subscribing to Priority Notify. It is intended for users who have a Resy account and are comfortable configuring account credentials for the MCP server.\n\n### Deployment Geography for Use:\n\nGlobal\n\n## Known Risks and Mitigations:\n\nRisk: The MCP server requires access to a user's Resy account credentials.\n\nMitigation: Use local secret storage where possible and keep RESY_EMAIL and RESY_PASSWORD out of source control and shared configuration files.\n\nRisk: Booking or cancellation tools can change a user's real restaurant reservations.\n\nMitigation: Review venue, date, time, party size, fees, and cancellation details before confirming an action or supplying a confirmToken.\n\nRisk: The integration depends on private Resy web-app behavior rather than an official public API.\n\nMitigation: Use the skill only if you accept that endpoint behavior may change and validate important reservation actions in Resy when needed.\n\n## Reference(s):\n\n- [ClawHub skill page](https://clawhub.ai/chrischall/skills/resy)\n- [resy-mcp npm package](https://www.npmjs.com/package/resy-mcp)\n\n## Skill Output:\n\n**Output Type(s):** [Text, Shell commands, Configuration, Guidance]\n\n**Output Format:** [Markdown with JSON configuration examples, shell commands, and MCP tool result text]\n\n**Output Parameters:** [1D]\n\n**Other Properties Related to Output:** [Booking and cancellation actions require explicit user confirmation or a confirmToken before completion.]\n\n## Skill Version(s):\n\n1.2.0 (source: server release metadata)\n\n## Ethical Considerations:\n\nUsers should evaluate whether this skill is appropriate for their environment, review any generated or modified files before relying on them, and apply their organization's safety, security, and compliance requirements before deployment.\n\nArchive v1.1.3: 3 files, 5367 bytes\n\nFiles: skill-card.md (1914b), SKILL.md (9275b), _meta.json (123b)\n\nFile v1.1.3:SKILL.md\n\n---\nname: resy\ndescription: Manage Resy restaurant reservations via MCP — search venues, book tables, list and cancel reservations, manage favorites, and subscribe to Priority Notify. Triggers on phrases like \"book a table at\", \"find me a reservation\", \"what reservations do I have\", \"cancel my Resy\", \"add to my Resy hit list\", or any request involving restaurant reservations on Resy. Requires resy-mcp installed and the resy server registered (see Setup below).\n---\n\n# resy-mcp\n\nMCP server for Resy — natural-language restaurant reservation management. Uses Resy's private web-app API with email + password auth.\n\n- **npm:** [npmjs.com/package/resy-mcp](https://www.npmjs.com/package/resy-mcp)\n- **Source:** [github.com/chrischall/resy-mcp](https://github.com/chrischall/resy-mcp)\n\n> ⚠️ Resy does not publish an official API. This server uses the same private endpoints the Resy web app calls, with the public web-app `api_key` and user-level auth via email + password. Use at your own discretion.\n\n## Setup\n\n### Option A — npx (recommended)\n\nAdd to `.mcp.json` in your project or `~/.claude/mcp.json`:\n\n```json\n{\n  \"mcpServers\": {\n    \"resy\": {\n      \"command\": \"npx\",\n      \"args\": [\"-y\", \"resy-mcp\"],\n      \"env\": {\n        \"RESY_EMAIL\": \"you@example.com\",\n        \"RESY_PASSWORD\": \"yourpassword\"\n      }\n    }\n  }\n}\n```\n\n### Option B — from source\n\n```bash\ngit clone https://github.com/chrischall/resy-mcp\ncd resy-mcp\nnpm install && npm run build\n```\n\nThen add to `.mcp.json`:\n\n```json\n{\n  \"mcpServers\": {\n    \"resy\": {\n      \"command\": \"node\",\n      \"args\": [\"/path/to/resy-mcp/dist/bundle.js\"],\n      \"env\": {\n        \"RESY_EMAIL\": \"you@example.com\",\n        \"RESY_PASSWORD\": \"yourpassword\"\n      }\n    }\n  }\n}\n```\n\nOr place `.env` in the project directory with `RESY_EMAIL=` and `RESY_PASSWORD=`.\n\n## Authentication\n\n- `RESY_EMAIL` + `RESY_PASSWORD` are required. The client logs in lazily on first request via `POST /3/auth/password`, caches the returned token for the process lifetime, and re-logs automatically on 401 / 419 / auth-like 500 responses.\n- `RESY_API_KEY` is optional. If unset, the client uses the public web-app key baked into resy.com's JS bundle. Override only if Resy rotates it.\n\n## Tools\n\n### User\n| Tool | Description |\n|------|-------------|\n| `resy_get_profile(view?)` | Current user profile — name, email, phone, booking count, member-since. Payment method IDs are stripped. |\n| `resy_list_payment_methods(view?)` | List saved payment methods (`id`, `brand`, `last_four`, `exp_month`, `exp_year`, `is_default`). The `id` feeds `resy_book`'s `payment_method_id`. |\n\n### Venues\n| Tool | Description |\n|------|-------------|\n| `resy_search_venues(date, party_size, query?, lat?, lng?, limit?, radius_meters?, view?)` | Search venues with availability for a date + party size. Defaults to NYC geo. |\n| `resy_find_slots(venue_id, date, party_size, lat?, lng?)` | List bookable slots at a venue — each includes a short-lived `config_token`. |\n| `resy_get_venue(venue_id)` | Full venue details. |\n\n### Reservations\n| Tool | Description |\n|------|-------------|\n| `resy_book(venue_id, date, party_size, desired_time?, slot_type?, terms_token?, allow_closest_time?, lat?, lng?, payment_method_id?, allow_duplicate?, confirm?)` | Composite: find fresh slot → details → book. Without `confirm: true` it only previews. `desired_time` is \"HH:MM\" (24h); an unavailable time returns the available times unless `allow_closest_time: true` previews the nearest. `slot_type` picks a seating (Dining Room / Bar / Patio) when several share a time. `confirm: true` books ONLY the exact previewed slot — pass the preview's `time` as `desired_time`, plus its `slot_type` and `terms_token` (a fingerprint of the seating type and cancellation/payment terms) — so the slot booked is always the one approved; without all three it only returns a fresh preview. A confirm refuses if you already hold a reservation at that venue that date (e.g. an earlier timed-out call that went through) unless `allow_duplicate: true`. Uses default payment method unless `payment_method_id` is supplied. |\n| `resy_list_reservations(scope?)` | List reservations. `scope`: `upcoming` (default), `past`, or `all`. Each result includes the `resy_token` needed for cancellation. |\n| `resy_cancel(resy_token)` | Cancel by `resy_token` (`rr://…`). Inspects the response body to set `cancelled: true/false` honestly. |\n\n### Favorites\n| Tool | Description |\n|------|-------------|\n| `resy_list_favorites(view?)` | List favorited venues (\"hit list\"). |\n| `resy_add_favorite(venue_id)` | Add a venue to favorites. |\n| `resy_remove_favorite(venue_id)` | Remove from favorites. |\n\n### Priority Notify\n| Tool | Description |\n|------|-------------|\n| `resy_list_notify(view?)` | List Priority Notify subscriptions. |\n| `resy_add_notify(venue_id, date, party_size, time_start?, time_end?)` | Subscribe to notifications when slots open. `time_start` / `time_end` are HH:MM (24h); default window 18:00–21:00. |\n| `resy_remove_notify(notify_id)` | Cancel a Priority Notify subscription. |\n\n## Response shape (`view`)\n\nFive read tools take `view: \"compact\" | \"full\"` — `resy_get_profile`,\n`resy_list_payment_methods`, `resy_list_favorites`, `resy_list_notify` and\n`resy_search_venues` — and **`compact` is the default**. The slim rung arrives\nwithout being asked for, because an efficiency a caller has to know about and\nrequest is one that usually is not requested.\n\n**Compact strips image and avatar URLs here, and nothing else.** There is no\nfield projection: this server holds no captured fixture or documented field\nlist for Resy's payloads, and an invented one would return a record with holes\nin it that still reads like a verified answer. Media stripping is subtractive,\nso it cannot lose a field nobody knew about.\n\n**The surprise worth stating plainly: on four of those five tools, compact and\nfull are byte-identical today.** `resy_get_profile` is the ONE response in this\nwhole server that carries a media URL — `profile_image_url` off `/2/user` — so\nit is the one place compact removes anything at all. The other four already\nhand back records this server assembled field by field, with no picture in\nthem. The parameter is on them so that a field arriving later with an avatar\ninside it is stripped by default rather than after somebody notices.\n\n`profile_image_url` is named in the drop list rather than left to the built-in\nrules, and that is what makes its removal deterministic. The key pattern\nanchors its noun at the START of a key (it knows `profile_pic`, not\n`profile_image_url`), which leaves only the value rule — and that fires just\nwhen a URL path ends in an image extension, which Resy's avatar pipeline need\nnot do.\n\n`view: \"full\"` returns the record untouched. There is **no `raw` rung**: `full`\nalready IS the un-stripped response, so a third value could only alias it.\n\nThe other ten tools take no `view`:\n\n- **`resy_find_slots`, `resy_get_venue` and `resy_list_reservations`** build\n  their answers field by field (`formatSlot`, `formatVenue`,\n  `formatReservation`). No upstream payload survives into the response, and no\n  media URL with it — there is nothing for the rung to remove.\n- **`resy_book`, `resy_cancel`, `resy_add_favorite`, `resy_remove_favorite`,\n  `resy_add_notify`, `resy_remove_notify`** are writes. A write's response is a\n  receipt — a `resy_token`, a confirmation, a status — with nothing to strip and\n  everything to keep.\n- **`resy_healthcheck`** answers reachability and auth.\n\n## Workflows\n\n**Book a specific restaurant at a specific time:**\n```\nresy_search_venues(query: \"carbone\", date: \"2026-05-01\", party_size: 2)\n  → find venue_id\nresy_book(venue_id, date: \"2026-05-01\", party_size: 2, desired_time: \"19:00\")\n  → preview: time, slot_type, terms_token, fees, payment card; show it to the user\nresy_book(venue_id, date: \"2026-05-01\", party_size: 2, desired_time: \"19:00\",\n          slot_type: \"<preview's slot_type>\", terms_token: \"<preview's terms_token>\", confirm: true)\n```\n\n**See what's available tonight near me:**\n```\nresy_search_venues(date: \"2026-04-20\", party_size: 2, lat: 37.7749, lng: -122.4194)\n  → returns venues with baked-in slot availability\n```\n\n**Cancel a reservation:**\n```\nresy_list_reservations() → find resy_token for the one to cancel\nresy_cancel(resy_token)\n```\n\n**Stalking a hard-to-get table:**\n```\nresy_search_venues(query: \"4 charles prime rib\", ...) → venue_id\nresy_add_notify(venue_id, date: \"2026-05-31\", party_size: 2, time_start: \"19:00\", time_end: \"21:00\")\n# Resy emails you when a slot opens\n```\n\n## Notes\n\n- Slot `config_token`s expire within minutes of being fetched. `resy_book` re-fetches fresh slots internally — don't try to thread a stale token from `resy_find_slots` into a book call manually.\n- `resy_book` requires a payment method on file at resy.com/account. If none exists it throws a clear error.\n- Default geo is NYC (40.7128, -73.9876). Pass `lat`/`lng` for other cities.\n- Favorites and Priority Notify endpoint paths are reverse-engineered. If a call fails with 404, run `npm run smoke` locally against your credentials and adjust the path.\n- `RESY_API_KEY` env var overrides the baked-in public web-app key if Resy ever rotates it.\n\nFile v1.1.3:_meta.json\n\n{\n  \"ownerId\": \"kn700jq4sjtf2anb0rk3ft4p7n856872\",\n  \"slug\": \"resy\",\n  \"version\": \"1.1.3\",\n  \"publishedAt\": 1790199757946\n}\n\nFile v1.1.3:skill-card.md\n\n## Description:\n\nManage Resy restaurant reservations via MCP by searching venues, booking tables, listing and canceling reservations, managing favorites, and subscribing to Priority Notify.\n\nThis skill is ready for commercial/non-commercial use.\n\n## Publisher:\n\n[chrischall](https://clawhub.ai/user/chrischall)\n\n### License/Terms of Use:\n\nMIT-0\n\n## Use Case:\n\nExternal users and developers use this skill to connect an agent to a Resy MCP server for restaurant availability search, reservation booking, reservation management, favorites, and Priority Notify subscriptions.\n\n### Deployment Geography for Use:\n\nGlobal\n\n## Known Risks and Mitigations:\n\nRisk: The skill can use Resy account credentials to book or cancel real reservations.\n\nMitigation: Install only if the user is comfortable giving the MCP server their Resy email and password and allowing it to act on their account.\n\nRisk: Cancellation may remove a reservation or trigger cancellation fees.\n\nMitigation: Require the agent to show the exact reservation and obtain clear confirmation before using cancellation.\n\n## Reference(s):\n\n- [ClawHub skill page](https://clawhub.ai/chrischall/skills/resy)\n- [resy-mcp npm package](https://www.npmjs.com/package/resy-mcp)\n\n## Skill Output:\n\n**Output Type(s):** [text, markdown, shell commands, configuration, guidance]\n\n**Output Format:** [Markdown with inline JSON and shell command examples]\n\n**Output Parameters:** [1D]\n\n**Other Properties Related to Output:** [Requires Resy account credentials and MCP server registration; write actions can book or cancel real reservations.]\n\n## Skill Version(s):\n\n1.1.3 (source: server release evidence)\n\n## Ethical Considerations:\n\nUsers should evaluate whether this skill is appropriate for their environment, review any generated or modified files before relying on them, and apply their organization's safety, security, and compliance requirements before deployment.\n\nArchive v1.1.2: 3 files, 5189 bytes\n\nFiles: skill-card.md (2428b), SKILL.md (8276b), _meta.json (123b)\n\nFile v1.1.2:SKILL.md\n\n---\nname: resy\ndescription: Manage Resy restaurant reservations via MCP — search venues, book tables, list and cancel reservations, manage favorites, and subscribe to Priority Notify. Triggers on phrases like \"book a table at\", \"find me a reservation\", \"what reservations do I have\", \"cancel my Resy\", \"add to my Resy hit list\", or any request involving restaurant reservations on Resy. Requires resy-mcp installed and the resy server registered (see Setup below).\n---\n\n# resy-mcp\n\nMCP server for Resy — natural-language restaurant reservation management. Uses Resy's private web-app API with email + password auth.\n\n- **npm:** [npmjs.com/package/resy-mcp](https://www.npmjs.com/package/resy-mcp)\n- **Source:** [github.com/chrischall/resy-mcp](https://github.com/chrischall/resy-mcp)\n\n> ⚠️ Resy does not publish an official API. This server uses the same private endpoints the Resy web app calls, with the public web-app `api_key` and user-level auth via email + password. Use at your own discretion.\n\n## Setup\n\n### Option A — npx (recommended)\n\nAdd to `.mcp.json` in your project or `~/.claude/mcp.json`:\n\n```json\n{\n  \"mcpServers\": {\n    \"resy\": {\n      \"command\": \"npx\",\n      \"args\": [\"-y\", \"resy-mcp\"],\n      \"env\": {\n        \"RESY_EMAIL\": \"you@example.com\",\n        \"RESY_PASSWORD\": \"yourpassword\"\n      }\n    }\n  }\n}\n```\n\n### Option B — from source\n\n```bash\ngit clone https://github.com/chrischall/resy-mcp\ncd resy-mcp\nnpm install && npm run build\n```\n\nThen add to `.mcp.json`:\n\n```json\n{\n  \"mcpServers\": {\n    \"resy\": {\n      \"command\": \"node\",\n      \"args\": [\"/path/to/resy-mcp/dist/bundle.js\"],\n      \"env\": {\n        \"RESY_EMAIL\": \"you@example.com\",\n        \"RESY_PASSWORD\": \"yourpassword\"\n      }\n    }\n  }\n}\n```\n\nOr place `.env` in the project directory with `RESY_EMAIL=` and `RESY_PASSWORD=`.\n\n## Authentication\n\n- `RESY_EMAIL` + `RESY_PASSWORD` are required. The client logs in lazily on first request via `POST /3/auth/password`, caches the returned token for the process lifetime, and re-logs automatically on 401 / 419 / auth-like 500 responses.\n- `RESY_API_KEY` is optional. If unset, the client uses the public web-app key baked into resy.com's JS bundle. Override only if Resy rotates it.\n\n## Tools\n\n### User\n| Tool | Description |\n|------|-------------|\n| `resy_get_profile(view?)` | Current user profile — name, email, phone, booking count, member-since. Payment method IDs are stripped. |\n| `resy_list_payment_methods(view?)` | List saved payment methods (`id`, `brand`, `last_four`, `exp_month`, `exp_year`, `is_default`). The `id` feeds `resy_book`'s `payment_method_id`. |\n\n### Venues\n| Tool | Description |\n|------|-------------|\n| `resy_search_venues(date, party_size, query?, lat?, lng?, limit?, radius_meters?, view?)` | Search venues with availability for a date + party size. Defaults to NYC geo. |\n| `resy_find_slots(venue_id, date, party_size, lat?, lng?)` | List bookable slots at a venue — each includes a short-lived `config_token`. |\n| `resy_get_venue(venue_id)` | Full venue details. |\n\n### Reservations\n| Tool | Description |\n|------|-------------|\n| `resy_book(venue_id, date, party_size, desired_time?, lat?, lng?, payment_method_id?)` | Composite: find fresh slot → details → book. `desired_time` is \"HH:MM\" (24h); closest match wins if no exact slot. Uses default payment method unless `payment_method_id` is supplied. |\n| `resy_list_reservations(scope?)` | List reservations. `scope`: `upcoming` (default), `past`, or `all`. Each result includes the `resy_token` needed for cancellation. |\n| `resy_cancel(resy_token)` | Cancel by `resy_token` (`rr://…`). Inspects the response body to set `cancelled: true/false` honestly. |\n\n### Favorites\n| Tool | Description |\n|------|-------------|\n| `resy_list_favorites(view?)` | List favorited venues (\"hit list\"). |\n| `resy_add_favorite(venue_id)` | Add a venue to favorites. |\n| `resy_remove_favorite(venue_id)` | Remove from favorites. |\n\n### Priority Notify\n| Tool | Description |\n|------|-------------|\n| `resy_list_notify(view?)` | List Priority Notify subscriptions. |\n| `resy_add_notify(venue_id, date, party_size, time_start?, time_end?)` | Subscribe to notifications when slots open. `time_start` / `time_end` are HH:MM (24h); default window 18:00–21:00. |\n| `resy_remove_notify(notify_id)` | Cancel a Priority Notify subscription. |\n\n## Response shape (`view`)\n\nFive read tools take `view: \"compact\" | \"full\"` — `resy_get_profile`,\n`resy_list_payment_methods`, `resy_list_favorites`, `resy_list_notify` and\n`resy_search_venues` — and **`compact` is the default**. The slim rung arrives\nwithout being asked for, because an efficiency a caller has to know about and\nrequest is one that usually is not requested.\n\n**Compact strips image and avatar URLs here, and nothing else.** There is no\nfield projection: this server holds no captured fixture or documented field\nlist for Resy's payloads, and an invented one would return a record with holes\nin it that still reads like a verified answer. Media stripping is subtractive,\nso it cannot lose a field nobody knew about.\n\n**The surprise worth stating plainly: on four of those five tools, compact and\nfull are byte-identical today.** `resy_get_profile` is the ONE response in this\nwhole server that carries a media URL — `profile_image_url` off `/2/user` — so\nit is the one place compact removes anything at all. The other four already\nhand back records this server assembled field by field, with no picture in\nthem. The parameter is on them so that a field arriving later with an avatar\ninside it is stripped by default rather than after somebody notices.\n\n`profile_image_url` is named in the drop list rather than left to the built-in\nrules, and that is what makes its removal deterministic. The key pattern\nanchors its noun at the START of a key (it knows `profile_pic`, not\n`profile_image_url`), which leaves only the value rule — and that fires just\nwhen a URL path ends in an image extension, which Resy's avatar pipeline need\nnot do.\n\n`view: \"full\"` returns the record untouched. There is **no `raw` rung**: `full`\nalready IS the un-stripped response, so a third value could only alias it.\n\nThe other ten tools take no `view`:\n\n- **`resy_find_slots`, `resy_get_venue` and `resy_list_reservations`** build\n  their answers field by field (`formatSlot`, `formatVenue`,\n  `formatReservation`). No upstream payload survives into the response, and no\n  media URL with it — there is nothing for the rung to remove.\n- **`resy_book`, `resy_cancel`, `resy_add_favorite`, `resy_remove_favorite`,\n  `resy_add_notify`, `resy_remove_notify`** are writes. A write's response is a\n  receipt — a `resy_token`, a confirmation, a status — with nothing to strip and\n  everything to keep.\n- **`resy_healthcheck`** answers reachability and auth.\n\n## Workflows\n\n**Book a specific restaurant at a specific time:**\n```\nresy_search_venues(query: \"carbone\", date: \"2026-05-01\", party_size: 2)\n  → find venue_id\nresy_book(venue_id, date: \"2026-05-01\", party_size: 2, desired_time: \"19:00\")\n```\n\n**See what's available tonight near me:**\n```\nresy_search_venues(date: \"2026-04-20\", party_size: 2, lat: 37.7749, lng: -122.4194)\n  → returns venues with baked-in slot availability\n```\n\n**Cancel a reservation:**\n```\nresy_list_reservations() → find resy_token for the one to cancel\nresy_cancel(resy_token)\n```\n\n**Stalking a hard-to-get table:**\n```\nresy_search_venues(query: \"4 charles prime rib\", ...) → venue_id\nresy_add_notify(venue_id, date: \"2026-05-31\", party_size: 2, time_start: \"19:00\", time_end: \"21:00\")\n# Resy emails you when a slot opens\n```\n\n## Notes\n\n- Slot `config_token`s expire within minutes of being fetched. `resy_book` re-fetches fresh slots internally — don't try to thread a stale token from `resy_find_slots` into a book call manually.\n- `resy_book` requires a payment method on file at resy.com/account. If none exists it throws a clear error.\n- Default geo is NYC (40.7128, -73.9876). Pass `lat`/`lng` for other cities.\n- Favorites and Priority Notify endpoint paths are reverse-engineered. If a call fails with 404, run `npm run smoke` locally against your credentials and adjust the path.\n- `RESY_API_KEY` env var overrides the baked-in public web-app key if Resy ever rotates it.\n\nFile v1.1.2:_meta.json\n\n{\n  \"ownerId\": \"kn700jq4sjtf2anb0rk3ft4p7n856872\",\n  \"slug\": \"resy\",\n  \"version\": \"1.1.2\",\n  \"publishedAt\": 1790178222056\n}\n\nFile v1.1.2:skill-card.md\n\n## Description:\n\nManage Resy restaurant reservations via MCP, including venue search, booking, reservation review and cancellation, favorites, and Priority Notify subscriptions.\n\nThis skill is ready for commercial/non-commercial use.\n\n## Publisher:\n\n[chrischall](https://clawhub.ai/user/chrischall)\n\n### License/Terms of Use:\n\nMIT-0\n\n## Use Case:\n\nExternal users and developers use this skill to connect an agent to resy-mcp for finding, booking, and managing Resy restaurant reservations.\n\n### Deployment Geography for Use:\n\nGlobal\n\n## Known Risks and Mitigations:\n\nRisk: The skill can make real Resy account changes, including bookings, cancellations, favorites changes, and Priority Notify changes.\n\nMitigation: Use only with an agent or runtime that asks for explicit confirmation before bookings, cancellations, favorites changes, or notify changes.\n\nRisk: The skill requires a Resy email and password in MCP configuration.\n\nMitigation: Configure credentials only in a trusted local or managed runtime and avoid exposing MCP configuration, environment variables, or logs.\n\nRisk: Booking can use a saved payment method from the user's Resy account.\n\nMitigation: Require explicit user approval for any booking action and verify venue, date, time, party size, and payment method before execution.\n\nRisk: The underlying server uses Resy's private web-app API, which may change or fail without notice.\n\nMitigation: Review compatibility before use and treat failed or ambiguous API responses as requiring human review.\n\n## Reference(s):\n\n- [ClawHub skill page](https://clawhub.ai/chrischall/skills/resy)\n- [resy-mcp npm package](https://www.npmjs.com/package/resy-mcp)\n- [resy-mcp project repository](https://github.com/chrischall/resy-mcp)\n\n## Skill Output:\n\n**Output Type(s):** [text, markdown, shell commands, configuration, guidance]\n\n**Output Format:** [Markdown guidance with JSON configuration snippets and shell commands]\n\n**Output Parameters:** [1D]\n\n**Other Properties Related to Output:** [Guidance can lead an agent to call Resy MCP tools that read account data or change reservations.]\n\n## Skill Version(s):\n\n1.1.2 (source: server release evidence)\n\n## Ethical Considerations:\n\nUsers should evaluate whether this skill is appropriate for their environment, review any generated or modified files before relying on them, and apply their organization's safety, security, and compliance requirements before deployment.\n\nArchive v1.1.1: 3 files, 5165 bytes\n\nFiles: skill-card.md (2392b), SKILL.md (8276b), _meta.json (123b)\n\nFile v1.1.1:SKILL.md\n\n---\nname: resy\ndescription: Manage Resy restaurant reservations via MCP — search venues, book tables, list and cancel reservations, manage favorites, and subscribe to Priority Notify. Triggers on phrases like \"book a table at\", \"find me a reservation\", \"what reservations do I have\", \"cancel my Resy\", \"add to my Resy hit list\", or any request involving restaurant reservations on Resy. Requires resy-mcp installed and the resy server registered (see Setup below).\n---\n\n# resy-mcp\n\nMCP server for Resy — natural-language restaurant reservation management. Uses Resy's private web-app API with email + password auth.\n\n- **npm:** [npmjs.com/package/resy-mcp](https://www.npmjs.com/package/resy-mcp)\n- **Source:** [github.com/chrischall/resy-mcp](https://github.com/chrischall/resy-mcp)\n\n> ⚠️ Resy does not publish an official API. This server uses the same private endpoints the Resy web app calls, with the public web-app `api_key` and user-level auth via email + password. Use at your own discretion.\n\n## Setup\n\n### Option A — npx (recommended)\n\nAdd to `.mcp.json` in your project or `~/.claude/mcp.json`:\n\n```json\n{\n  \"mcpServers\": {\n    \"resy\": {\n      \"command\": \"npx\",\n      \"args\": [\"-y\", \"resy-mcp\"],\n      \"env\": {\n        \"RESY_EMAIL\": \"you@example.com\",\n        \"RESY_PASSWORD\": \"yourpassword\"\n      }\n    }\n  }\n}\n```\n\n### Option B — from source\n\n```bash\ngit clone https://github.com/chrischall/resy-mcp\ncd resy-mcp\nnpm install && npm run build\n```\n\nThen add to `.mcp.json`:\n\n```json\n{\n  \"mcpServers\": {\n    \"resy\": {\n      \"command\": \"node\",\n      \"args\": [\"/path/to/resy-mcp/dist/bundle.js\"],\n      \"env\": {\n        \"RESY_EMAIL\": \"you@example.com\",\n        \"RESY_PASSWORD\": \"yourpassword\"\n      }\n    }\n  }\n}\n```\n\nOr place `.env` in the project directory with `RESY_EMAIL=` and `RESY_PASSWORD=`.\n\n## Authentication\n\n- `RESY_EMAIL` + `RESY_PASSWORD` are required. The client logs in lazily on first request via `POST /3/auth/password`, caches the returned token for the process lifetime, and re-logs automatically on 401 / 419 / auth-like 500 responses.\n- `RESY_API_KEY` is optional. If unset, the client uses the public web-app key baked into resy.com's JS bundle. Override only if Resy rotates it.\n\n## Tools\n\n### User\n| Tool | Description |\n|------|-------------|\n| `resy_get_profile(view?)` | Current user profile — name, email, phone, booking count, member-since. Payment method IDs are stripped. |\n| `resy_list_payment_methods(view?)` | List saved payment methods (`id`, `brand`, `last_four`, `exp_month`, `exp_year`, `is_default`). The `id` feeds `resy_book`'s `payment_method_id`. |\n\n### Venues\n| Tool | Description |\n|------|-------------|\n| `resy_search_venues(date, party_size, query?, lat?, lng?, limit?, radius_meters?, view?)` | Search venues with availability for a date + party size. Defaults to NYC geo. |\n| `resy_find_slots(venue_id, date, party_size, lat?, lng?)` | List bookable slots at a venue — each includes a short-lived `config_token`. |\n| `resy_get_venue(venue_id)` | Full venue details. |\n\n### Reservations\n| Tool | Description |\n|------|-------------|\n| `resy_book(venue_id, date, party_size, desired_time?, lat?, lng?, payment_method_id?)` | Composite: find fresh slot → details → book. `desired_time` is \"HH:MM\" (24h); closest match wins if no exact slot. Uses default payment method unless `payment_method_id` is supplied. |\n| `resy_list_reservations(scope?)` | List reservations. `scope`: `upcoming` (default), `past`, or `all`. Each result includes the `resy_token` needed for cancellation. |\n| `resy_cancel(resy_token)` | Cancel by `resy_token` (`rr://…`). Inspects the response body to set `cancelled: true/false` honestly. |\n\n### Favorites\n| Tool | Description |\n|------|-------------|\n| `resy_list_favorites(view?)` | List favorited venues (\"hit list\"). |\n| `resy_add_favorite(venue_id)` | Add a venue to favorites. |\n| `resy_remove_favorite(venue_id)` | Remove from favorites. |\n\n### Priority Notify\n| Tool | Description |\n|------|-------------|\n| `resy_list_notify(view?)` | List Priority Notify subscriptions. |\n| `resy_add_notify(venue_id, date, party_size, time_start?, time_end?)` | Subscribe to notifications when slots open. `time_start` / `time_end` are HH:MM (24h); default window 18:00–21:00. |\n| `resy_remove_notify(notify_id)` | Cancel a Priority Notify subscription. |\n\n## Response shape (`view`)\n\nFive read tools take `view: \"compact\" | \"full\"` — `resy_get_profile`,\n`resy_list_payment_methods`, `resy_list_favorites`, `resy_list_notify` and\n`resy_search_venues` — and **`compact` is the default**. The slim rung arrives\nwithout being asked for, because an efficiency a caller has to know about and\nrequest is one that usually is not requested.\n\n**Compact strips image and avatar URLs here, and nothing else.** There is no\nfield projection: this server holds no captured fixture or documented field\nlist for Resy's payloads, and an invented one would return a record with holes\nin it that still reads like a verified answer. Media stripping is subtractive,\nso it cannot lose a field nobody knew about.\n\n**The surprise worth stating plainly: on four of those five tools, compact and\nfull are byte-identical today.** `resy_get_profile` is the ONE response in this\nwhole server that carries a media URL — `profile_image_url` off `/2/user` — so\nit is the one place compact removes anything at all. The other four already\nhand back records this server assembled field by field, with no picture in\nthem. The parameter is on them so that a field arriving later with an avatar\ninside it is stripped by default rather than after somebody notices.\n\n`profile_image_url` is named in the drop list rather than left to the built-in\nrules, and that is what makes its removal deterministic. The key pattern\nanchors its noun at the START of a key (it knows `profile_pic`, not\n`profile_image_url`), which leaves only the value rule — and that fires just\nwhen a URL path ends in an image extension, which Resy's avatar pipeline need\nnot do.\n\n`view: \"full\"` returns the record untouched. There is **no `raw` rung**: `full`\nalready IS the un-stripped response, so a third value could only alias it.\n\nThe other ten tools take no `view`:\n\n- **`resy_find_slots`, `resy_get_venue` and `resy_list_reservations`** build\n  their answers field by field (`formatSlot`, `formatVenue`,\n  `formatReservation`). No upstream payload survives into the response, and no\n  media URL with it — there is nothing for the rung to remove.\n- **`resy_book`, `resy_cancel`, `resy_add_favorite`, `resy_remove_favorite`,\n  `resy_add_notify`, `resy_remove_notify`** are writes. A write's response is a\n  receipt — a `resy_token`, a confirmation, a status — with nothing to strip and\n  everything to keep.\n- **`resy_healthcheck`** answers reachability and auth.\n\n## Workflows\n\n**Book a specific restaurant at a specific time:**\n```\nresy_search_venues(query: \"carbone\", date: \"2026-05-01\", party_size: 2)\n  → find venue_id\nresy_book(venue_id, date: \"2026-05-01\", party_size: 2, desired_time: \"19:00\")\n```\n\n**See what's available tonight near me:**\n```\nresy_search_venues(date: \"2026-04-20\", party_size: 2, lat: 37.7749, lng: -122.4194)\n  → returns venues with baked-in slot availability\n```\n\n**Cancel a reservation:**\n```\nresy_list_reservations() → find resy_token for the one to cancel\nresy_cancel(resy_token)\n```\n\n**Stalking a hard-to-get table:**\n```\nresy_search_venues(query: \"4 charles prime rib\", ...) → venue_id\nresy_add_notify(venue_id, date: \"2026-05-31\", party_size: 2, time_start: \"19:00\", time_end: \"21:00\")\n# Resy emails you when a slot opens\n```\n\n## Notes\n\n- Slot `config_token`s expire within minutes of being fetched. `resy_book` re-fetches fresh slots internally — don't try to thread a stale token from `resy_find_slots` into a book call manually.\n- `resy_book` requires a payment method on file at resy.com/account. If none exists it throws a clear error.\n- Default geo is NYC (40.7128, -73.9876). Pass `lat`/`lng` for other cities.\n- Favorites and Priority Notify endpoint paths are reverse-engineered. If a call fails with 404, run `npm run smoke` locally against your credentials and adjust the path.\n- `RESY_API_KEY` env var overrides the baked-in public web-app key if Resy ever rotates it.\n\nFile v1.1.1:_meta.json\n\n{\n  \"ownerId\": \"kn700jq4sjtf2anb0rk3ft4p7n856872\",\n  \"slug\": \"resy\",\n  \"version\": \"1.1.1\",\n  \"publishedAt\": 1789964051176\n}\n\nFile v1.1.1:skill-card.md\n\n## Description:\n\nManage Resy restaurant reservations via MCP by searching venues, booking tables, listing and canceling reservations, managing favorites, and subscribing to Priority Notify.\n\nThis skill is ready for commercial/non-commercial use.\n\n## Publisher:\n\n[chrischall](https://clawhub.ai/user/chrischall)\n\n### License/Terms of Use:\n\nMIT-0\n\n## Use Case:\n\nExternal users and agents use this skill to operate a Resy MCP server for restaurant discovery, reservation booking, cancellation, favorites, saved payment-method lookup, and Priority Notify management.\n\n### Deployment Geography for Use:\n\nGlobal\n\n## Known Risks and Mitigations:\n\nRisk: The skill uses Resy account credentials for an MCP server.\n\nMitigation: Install only when comfortable storing Resy credentials for agent access, and scope credentials to the intended user account.\n\nRisk: The skill can book or cancel reservations and modify favorites or Priority Notify subscriptions.\n\nMitigation: Before any booking, cancellation, favorite removal, or notify removal, require the agent to show the venue, date, time, party size, and reservation or notify identifier, then wait for explicit confirmation.\n\nRisk: The skill depends on Resy's private web-app endpoints, which may change without notice.\n\nMitigation: Treat failed or unexpected responses as requiring user review before retrying account-changing actions.\n\n## Reference(s):\n\n- [ClawHub skill page](https://clawhub.ai/chrischall/skills/resy)\n- [resy-mcp npm package](https://www.npmjs.com/package/resy-mcp)\n- [resy-mcp source repository](https://github.com/chrischall/resy-mcp)\n- [Publisher profile](https://clawhub.ai/user/chrischall)\n\n## Skill Output:\n\n**Output Type(s):** [text, markdown, shell commands, configuration, guidance]\n\n**Output Format:** [Markdown guidance with JSON configuration examples, shell commands, and MCP tool names]\n\n**Output Parameters:** [1D]\n\n**Other Properties Related to Output:** [May trigger MCP API calls that read account data or perform reservation, cancellation, favorite, and Priority Notify actions.]\n\n## Skill Version(s):\n\n1.1.1 (source: server release evidence)\n\n## Ethical Considerations:\n\nUsers should evaluate whether this skill is appropriate for their environment, review any generated or modified files before relying on them, and apply their organization's safety, security, and compliance requirements before deployment.","readmeExcerpt":"Skill: resy Owner: chrischall Summary: Manage Resy restaurant reservations via MCP — search venues, book tables, list and cancel reservations, manage favorites, and subscribe to Priority Notify. Triggers on phrases like \"book a table at\", \"find me a reservation\", \"what reservations do I have\", \"cancel my Resy\", \"add to my Resy hit list\", or any request involving restaurant reservations on Resy. Requires resy-mcp inst","codeSnippets":[],"executableExamples":[{"language":"json","snippet":"{\n  \"mcpServers\": {\n    \"resy\": {\n      \"command\": \"npx\",\n      \"args\": [\"-y\", \"resy-mcp\"],\n      \"env\": {\n        \"RESY_EMAIL\": \"you@example.com\",\n        \"RESY_PASSWORD\": \"yourpassword\"\n      }\n    }\n  }\n}"},{"language":"bash","snippet":"git clone https://github.com/chrischall/resy-mcp\ncd resy-mcp\nnpm install && npm run build"},{"language":"json","snippet":"{\n  \"mcpServers\": {\n    \"resy\": {\n      \"command\": \"node\",\n      \"args\": [\"/path/to/resy-mcp/dist/bundle.js\"],\n      \"env\": {\n        \"RESY_EMAIL\": \"you@example.com\",\n        \"RESY_PASSWORD\": \"yourpassword\"\n      }\n    }\n  }\n}"},{"language":"text","snippet":"resy_search_venues(query: \"carbone\", date: \"2026-05-01\", party_size: 2)\n  → find venue_id\nresy_book(venue_id, date: \"2026-05-01\", party_size: 2, desired_time: \"19:00\")\n  → preview: time, slot_type, terms_token, fees, payment card; show it to the user\n\n  client WITHOUT prompts (claude.ai, Claude Desktop), or any client when the\n  server sets MCP_CONFIRM_ELICITATION=off: that preview is\n  `confirmation-required` and carries a confirmToken. Once the user approves in chat:\nresy_book(venue_id, date: \"2026-05-01\", party_size: 2,\n          desired_time: \"<preview's time>\", confirmToken: \"<token>\")\n\n  client WITH prompts (Claude Code), unless MCP_CONFIRM_ELICITATION=off: name the\n  slot and the user is prompted:\nresy_book(venue_id, date: \"2026-05-01\", party_size: 2, desired_time: \"<preview's time>\",\n          slot_type: \"<preview's slot_type>\", terms_token: \"<preview's terms_token>\")"},{"language":"text","snippet":"resy_search_venues(date: \"2026-04-20\", party_size: 2, lat: 37.7749, lng: -122.4194)\n  → returns venues with baked-in slot availability"},{"language":"text","snippet":"resy_list_reservations() → find resy_token for the one to cancel\nresy_cancel(resy_token)\n  → a confirmation prompt (unless MCP_CONFIRM_ELICITATION=off), or a preview plus\n    confirmToken to pass back once the user approves"}],"parameters":null,"dependencies":[],"permissions":[],"extractedFiles":[{"path":"SKILL.md","content":"---\nname: resy\ndescription: Manage Resy restaurant reservations via MCP — search venues, book tables, list and cancel reservations, manage favorites, and subscribe to Priority Notify. Triggers on phrases like \"book a table at\", \"find me a reservation\", \"what reservations do I have\", \"cancel my Resy\", \"add to my Resy hit list\", or any request involving restaurant reservations on Resy. Requires resy-mcp installed and the resy server registered (see Setup below).\n---\n\n# resy-mcp\n\nMCP server for Resy — natural-language restaurant reservation management. Uses Resy's private web-app API with email + password auth.\n\n- **npm:** [npmjs.com/package/resy-mcp](https://www.npmjs.com/package/resy-mcp)\n- **Source:** [github.com/chrischall/resy-mcp](https://github.com/chrischall/resy-mcp)\n\n> ⚠️ Resy does not publish an official API. This server uses the same private endpoints the Resy web app calls, with the public web-app `api_key` and user-level auth via email + password. Use at your own discretion.\n\n## Setup\n\n### Option A — npx (recommended)\n\nAdd to `.mcp.json` in your project or `~/.claude/mcp.json`:\n\n```json\n{\n  \"mcpServers\": {\n    \"resy\": {\n      \"command\": \"npx\",\n      \"args\": [\"-y\", \"resy-mcp\"],\n      \"env\": {\n        \"RESY_EMAIL\": \"you@example.com\",\n        \"RESY_PASSWORD\": \"yourpassword\"\n      }\n    }\n  }\n}\n```\n\n### Option B — from source\n\n```bash\ngit clone https://github.com/chrischall/resy-mcp\ncd resy-mcp\nnpm install && npm run build\n```\n\nThen add to `.mcp.json`:\n\n```json\n{\n  \"mcpServers\": {\n    \"resy\": {\n      \"command\": \"node\",\n      \"args\": [\"/path/to/resy-mcp/dist/bundle.js\"],\n      \"env\": {\n        \"RESY_EMAIL\": \"you@example.com\",\n        \"RESY_PASSWORD\": \"yourpassword\"\n      }\n    }\n  }\n}\n```\n\nOr place `.env` in the project directory with `RESY_EMAIL=` and `RESY_PASSWORD=`.\n\n## Authentication\n\n- `RESY_EMAIL` + `RESY_PASSWORD` are required. The client logs in lazily on first request via `POST /3/auth/password`, caches the returned token for the process lifetime, and re-logs automatically on 401 / 419 / auth-like 500 responses.\n- `RESY_API_KEY` is optional. If unset, the client uses the public web-app key baked into resy.com's JS bundle. Override only if Resy rotates it.\n\n## Tools\n\n### User\n| Tool | Description |\n|------|-------------|\n| `resy_get_profile(view?)` | Current user profile — name, email, phone, booking count, member-since. Payment method IDs are stripped. |\n| `resy_list_payment_methods(view?)` | List saved payment methods (`id`, `brand`, `last_four`, `exp_month`, `exp_year`, `is_default`). The `id` feeds `resy_book`'s `payment_method_id`. |\n\n### Venues\n| Tool | Description |\n|------|-------------|\n| `resy_search_venues(date, party_size, query?, lat?, lng?, limit?, radius_meters?, view?)` | Search venues with availability for a date + party size. Defaults to NYC geo. |\n| `resy_find_slots(venue_id, date, party_size, lat?, lng?)` | List bookable slots at a venue — each includes a short-lived `config_token`. |\n| `resy_get_venue(venue_id)"},{"path":"_meta.json","content":"{\n  \"ownerId\": \"kn700jq4sjtf2anb0rk3ft4p7n856872\",\n  \"slug\": \"resy\",\n  \"version\": \"1.3.3\",\n  \"publishedAt\": 1791588428436\n}"},{"path":"skill-card.md","content":"## Description:\n\nHelps users search Resy restaurants, manage reservations and favorites, and subscribe to Priority Notify through a configured MCP server.\n\nThis skill is ready for commercial/non-commercial use.\n\n## Publisher:\n\n[chrischall](https://clawhub.ai/user/chrischall)\n\n### License/Terms of Use:\n\nMIT-0\n\n## Use Case:\n\nResy users can find tables, book or cancel reservations, manage favorite restaurants, and request availability notifications through an agent with the Resy MCP server installed.\n\n### Deployment Geography for Use:\n\nGlobal\n\n## Known Risks and Mitigations:\n\nRisk: The MCP server receives Resy account credentials and can act on the user's account.\n\nMitigation: Install deliberately, keep credential files local, access-restricted, and out of source control.\n\nRisk: Booking or cancellation may change real reservations, use a saved payment card, or incur cancellation fees.\n\nMitigation: Review the restaurant, time, payment card, and cancellation terms in each preview before approving the action.\n\n## Reference(s):\n\n- [ClawHub resy release](https://clawhub.ai/chrischall/skills/resy)\n- [resy-mcp npm package (linked in skill documentation)](https://www.npmjs.com/package/resy-mcp)\n\n## Skill Output:\n\n**Output Type(s):** [Text, Guidance, Configuration instructions]\n\n**Output Format:** [Natural-language responses with reservation details, confirmation previews, and setup examples]\n\n**Output Parameters:** [1D]\n\n**Other Properties Related to Output:** [Booking and cancellation actions require review of a preview before confirmation.]\n\n## Skill Version(s):\n\n1.3.3 (source: server release metadata)\n\n## Ethical Considerations:\n\nUsers should evaluate whether this skill is appropriate for their environment, review any generated or modified files before relying on them, and apply their organization's safety, security, and compliance requirements before deployment."}],"languages":[],"docsSourceLabel":"CLAWHUB","editorialOverview":null,"editorialQuality":{"score":100,"threshold":65,"status":"thin","wordCount":1304,"uniquenessScore":44,"reasons":["uniqueness-below-45"]}},"media":{"evidence":{"source":"no-media","verified":false,"confidence":"low","updatedAt":"2026-10-10T14:42:53.521Z","emptyReason":"No screenshots, media assets, or demo links are available."},"primaryImageUrl":null,"mediaAssetCount":0,"assets":[],"demoUrl":null},"ownerResources":{"evidence":{"source":"unclaimed","verified":false,"confidence":"low","updatedAt":"2026-10-10T14:42:53.521Z","emptyReason":"This page has not been claimed by the agent owner."},"hasCustomPage":false,"customPageUpdatedAt":null,"customLinks":[],"structuredLinks":{"docsUrl":null,"demoUrl":null,"supportUrl":null,"pricingUrl":null,"statusUrl":null},"customPage":null},"relatedAgents":{"evidence":{"source":"protocol-neighbors","verified":false,"confidence":"medium","updatedAt":"2026-10-10T17:35:16.841Z","emptyReason":null},"items":[{"id":"8ebccd8e-3863-4187-8355-c3f14e1f9edf","entityType":"agent","canonicalPath":"/agent/iofficeai-aionui","slug":"iofficeai-aionui","name":"AionUi","description":"Free, local, open-source 24/7 Cowork app and OpenClaw for Gemini CLI, Claude Code, Codex, OpenCode, Qwen Code, Goose CLI, Auggie, and more | 🌟 Star if you like it!","url":"https://github.com/iOfficeAI/AionUi","homepage":"https://www.aionui.com","source":"GITHUB_REPOS","protocols":["MCP","OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-10-09T19:11:12.944Z","createdAt":"2026-02-25T03:38:16.584Z","downloads":null},{"id":"b917f68a-ebff-438e-84f8-3f4b2494c0bc","entityType":"agent","canonicalPath":"/agent/activepieces-activepieces","slug":"activepieces-activepieces","name":"activepieces","description":"AI Agents & MCPs & AI Workflow Automation • (~400 MCP servers for AI agents) • AI Automation / AI Agent with MCPs • AI Workflows & AI Agents • MCPs for AI Agents","url":"https://github.com/activepieces/activepieces","homepage":"https://www.activepieces.com","source":"GITHUB_REPOS","protocols":["OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-04-15T02:22:12.426Z","createdAt":"2026-02-25T03:38:12.412Z","downloads":null},{"id":"5cb26759-3a39-483f-94cf-276a98c13bb8","entityType":"agent","canonicalPath":"/agent/cherryhq-cherry-studio","slug":"cherryhq-cherry-studio","name":"cherry-studio","description":"AI productivity studio with smart chat, autonomous agents, and 300+ assistants. Unified access to frontier LLMs","url":"https://github.com/CherryHQ/cherry-studio","homepage":"https://cherry-ai.com","source":"GITHUB_REPOS","protocols":["MCP","OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-04-11T14:38:40.986Z","createdAt":"2026-02-25T03:38:19.379Z","downloads":null},{"id":"6f6582d0-5d76-4f0f-b81d-86520247950b","entityType":"agent","canonicalPath":"/agent/copilotkit-copilotkit","slug":"copilotkit-copilotkit","name":"CopilotKit","description":"The Frontend for Agents & Generative UI. React + Angular","url":"https://github.com/CopilotKit/CopilotKit","homepage":"https://docs.copilotkit.ai","source":"GITHUB_REPOS","protocols":["OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-03-25T09:50:57.846Z","createdAt":"2026-02-25T03:39:14.617Z","downloads":null}],"links":{"hub":"/agent","source":"/agent/source/clawhub","protocols":[{"label":"OpenClaw","href":"/agent/protocol/openclew"}]}}}