MCP

Run it from your agent.

Connect any MCP client — Claude Desktop, Claude Code, or your own agent — with the endpoint below and your API key. Same org-scoped data, same bearer key, no separate integration.

Connect

{
  "mcpServers": {
    "curatedlove": {
      "url": "https://mcp.curatedlove.party",
      "headers": { "Authorization": "Bearer cl_live_your_key" }
    }
  }
}

Tools

  • compose_eventDraft a dinner (title, description, menu theme, suggested price, FAQs) from a one-sentence prompt. Requires the AI plan. Returns a draft to review — it does not create anything.
  • list_eventsList the organization's events, newest first. Optional status filter and pagination.
  • list_projectsList the organization's projects (folders that group events), each with its event count.
  • create_projectCreate a project (a folder for one dinner or undertaking) to file events into. Returns the new project.
  • note_feature_requestFile a capability the host asked for that the product doesn't have yet — one plain sentence describing the missing capability (never guest details). Use ONLY after telling the host it isn't available.
  • assign_event_to_projectFile an event into a project by ids, or unfile it by omitting projectId. Both must belong to the organization.
  • get_eventFetch one of the organization's events by id.
  • create_eventCreate a DRAFT event. Fields: title, date (wall-clock 'YYYY-MM-DDTHH:mm'), capacity, priceCents, plus optional description, menuTheme, venueName, venueAddress, depositCents, durationMin, tags, faqs. Publish separately with publish_event.
  • update_eventUpdate fields of a draft/published event by id. Cannot change status — use publish_event.
  • publish_eventPublish a draft event so guests can book it. Only draft events can be published.
  • cancel_eventCancel one of the organization's events by id. Irreversible — requires confirmation. Every confirmed booking is AUTOMATICALLY refunded in full (Stripe) and each guest is emailed a cancellation notice; the result note reports exactly how many were refunded/notified and whether any need manual attention.
  • list_event_bookingsList the bookings (guests, seats, status) for one of the organization's events.
  • get_kitchen_sheetThe pre-service kitchen sheet for one of the organization's events: every CONFIRMED guest with their dietary notes, notes-first. Call this when the host asks for a prep sheet, allergy list, dietary rundown, or what the kitchen needs to know before a dinner. Renders as a printable card.
  • generate_recipesWrite the prep recipes for a saved dinner: for EVERY course on its menu, the ingredient list with real quantities scaled to the event's covers, plus a concise cooking method. Requires the event to have a course list (compose_event drafts one). Regenerating replaces the previous recipes. The groceries tools automatically source from these exact ingredients afterwards.
  • get_recipesThe stored prep recipes for a dinner (per course: scaled ingredients + method). Renders as a drill-down card.
  • distribute_eventDistribute a PUBLISHED dinner to the org's connected channels — creates the event on Eventbrite (tickets + publish) and returns the live listing URL. Requires the Eventbrite connection (Settings > Connections). Outward-facing and irreversible on our side - requires confirmation.
  • create_menuCreate a named menu (e.g. "Dinner", "Wine list", "Winter tasting") — each menu gets its own public link and QR code. Use when the host wants a new menu or to organize dishes into menus.
  • add_menu_itemAdd one dish to the host's own menu (no Square needed): name, an appetizing one-line description, priceCents, category (e.g. Starters/Mains/Dessert), and optionally menuId to file it into a named menu (list menus via list_menu_items context or create_menu's result).
  • list_venuesThe host's saved venues plus the partner-venue directory (curated spaces any host can book). Call when the host asks where they could host, wants to reuse a venue, or is picking a location — then set the chosen venue on the event via update_event's venueName/venueAddress.
  • save_venueSave a venue to the host's address book so future dinners pick it in one tap: name + address required (city, capacity, notes, https url optional). Use when the host mentions a space they use or want to remember.
  • suggest_seasonal_ideasGround a menu/planning question in what's actually true right now: the current season and its peak produce for the host's city, the local weather forecast, and the host's OWN demand history (how full past dinners get, which night fills best, recent booking momentum). Call this when the host asks what to cook next, when to host, what's in season, or for market/seasonal/trend ideas. Returns the facts (never invents numbers) — use them to propose concrete dinner ideas in your reply.
  • get_reviewsThe org's guest reviews (rating + words, newest first) with the overall average — social proof and improvement signal. Renders as a table card.
  • get_intake_linkIris's job: mint the client-facing dietary intake link for a contact (creates the contact when given a new email + name). The client fills allergies, diet, dislikes, and notes themselves; the link expires in 14 days. Give the host the URL to send.
  • get_dietary_profileIris's job: a client's structured dietary profile (allergies, diet, dislikes, notes) by email — or a clear 'none on file yet', in which case offer to send them an intake link.
  • generate_press_kitEcho's job: create or update the host/chef's shareable press kit (a media page + downloadable PDF for journalists, agencies, and bookers). Pass a one-sentence `prompt` about the chef and it drafts a polished tagline + bio; or pass explicit fields (tagline, bio, yearsExperience, specialties, accolades, quote, contactEmail). Returns the public link. Never invents awards or numbers.
  • get_press_kitEcho's job: the host's current press kit — its shareable link, whether it's published, and the live stats it will show.
  • generate_event_imageEcho's job: generate an evocative AI hero photograph for one of the organization's events, so its booking page feels like the evening. Uses the event's own menu/theme. Pass the event id.
  • set_brandEcho's job: set the organization's brand accent color (hex like #2f6f4e), applied across every public page — booking pages, QR menu, press kit. Reject anything that isn't a real hex.
  • draft_review_replyEcho's job: draft the venue's public reply to a customer review the host pastes in (any platform, any language). Grounded in the venue's voice notes; guardrailed (never admits liability, never promises compensation, never argues). A DRAFT — the host copies it to Google/Yelp themselves.
  • create_invoiceRemy's job: invoice a client — a Stripe payment link is created and emailed to them. Fields: email (required), amountCents (required, $1–$50k), description (what it's for, required), optional name and dueDays (default 7). The app asks the host to confirm before anything is sent.
  • list_invoicesRemy's job: the org's invoices — open first (with payment links and due dates), then settled.
  • void_invoiceRemy's job: void an OPEN invoice by id (paid invoices can't be voided). The app asks the host to confirm first.
  • remember_preferenceRemy's memory: save a SHORT standing preference the host states ('always price around $85', 'no Mondays', 'vegetarian option at every dinner'). It's honored in every future conversation. One concise note per call.
  • list_preferencesRemy's memory: the host's standing preferences (with ids, for forgetting one).
  • forget_preferenceRemy's memory: remove one standing preference by its id (from list_preferences).
  • get_agendaThe host's operational digest: dinners in the next 7 days with confirmed-seat fill, anything happening TODAY, and how many drafts await publishing. Call this for 'what needs me today', 'what's this week look like', or any morning check-in. Deterministic — no generation cost.
  • create_bookingBook seats at one of the organization's events. Free events confirm instantly and email the guest; paid events return a Stripe checkout URL for the guest to pay. Fields: eventId, name, email, seats, optional notes.
  • assign_seatingIvy's job: generate a seating plan for one of the organization's events (eventId). A DETERMINISTIC solver (no AI) assigns confirmed parties to the host's tables — keeping parties together, honoring keep-apart pairs and capacity, and clustering guests with shared dietary needs. Persists the plan and honors any tables the host pinned. Add tables in the dashboard first. Requires the Pro or Studio plan.
  • list_guestsThe organization's guest book — everyone who has booked, with dietary notes. Stays private to the org.
  • add_contactIris's job: add someone to the organization's contacts. Fields: name, email (both required), plus optional phone, notes, and tags. If that email is already saved, updates the existing contact instead of duplicating it.
  • list_contactsIris's job: list the organization's contacts (name, email, tags), most-recently-updated first. Optional pagination.
  • get_orgFetch the organization's public profile (name, city, website, socials).
  • update_orgUpdate the organization's public profile: name, city, website, instagram. Only these fields — never id/org/slug.
  • get_plan_summaryThe organization's plan, what it unlocks, and this month's usage against the AI/knowledge-base quotas. No guest data.
  • get_calendar_feed_linkThe organization's private live calendar-subscription links (webcal/https, for Google/Apple Calendar) and the public demo-booking URL. The feed link is the host's own — never share it publicly.
  • list_linksList the organization's short links (code, target, click count).
  • create_linkCreate a short link to one of the organization's events (eventId) or an external https URL (url), with an optional label. Returns the link with its short code.
  • get_link_qrRender a scannable QR code (SVG) for one of the organization's own short links, by its code.
  • get_link_analyticsClick count for one of the organization's own short links, by its code.
  • draft_social_postDraft an AI social caption for one of the organization's OWN published events (by eventId), with ready-to-share links for X, Facebook, WhatsApp, and LinkedIn. Public marketing copy only — never guest names, emails, or booking data. Requires the Studio plan (socialDrafts) and counts against the monthly AI quota.
  • get_statsRevenue and totals for the organization over a period — money made (revenueCents), plus bookings, guests, and events counts. period is one of: this_month, last_month, all_time (default this_month).
  • analyzeAnalyze the host's OWN data and return a chart: dietary needs across guests, repeat guests, most frequent guests, how events are filling, revenue over time, booking status, how far ahead guests book, or dish popularity (top-selling dishes by units, from Square orders — needs Square connected). NOTE: no-show rate needs a data-model addition and is not available yet.
  • suggest_groceriesBasil's job: turn a menu into a shopping list. Suggest ingredients and quantities from one of the organization's events (eventId, scaled to confirmed seats), free-form menu text (menuText), or an explicit list of ingredient names (items — preferred: derive the REAL ingredients from the menu and pass them in English so catalogue matching works). A preview only — it never touches the cart. Reports anything not in the catalogue as `unavailable` so you can tell the host plainly what to source elsewhere.
  • view_cartBasil's job: show the organization's current grocery cart and running total.
  • add_to_cartBasil's job: add a catalogue product to the organization's grocery cart (or set its quantity if it's already there). product must be a known catalogue id or name; qty is the quantity.
  • add_menu_to_cartBasil's job: add every available grocery for a menu straight to the cart in one go — from one of the organization's events (eventId, scaled to confirmed seats), free-form menu text (menuText), or an explicit list of items. Reports anything not in your catalogue yet so you know what to source elsewhere.
  • remove_from_cartBasil's job: remove a product from the organization's grocery cart.
  • update_cart_itemBasil's job: change the quantity of a product already in the organization's grocery cart.
  • list_connectionsList the organization's third-party connections (provider, status, label) — Instagram, calendar, POS, grocery.
  • connect_connectionConnect a third-party provider for the organization by its id (e.g. 'instagram'). Handle-mode providers need a label (the account handle); providers not yet available return a decline, not an error.
  • disconnect_connectionDisconnect a third-party provider for the organization by its id. The org can always reconnect later — requires confirmation.
  • list_knowledgeList the organization's knowledge-base files (name, status, size) — never their extracted contents. Gated on the Concierge plan.
  • add_reference_linkRemy's job: read a public web link the host shares (their own site, a competitor, an inspiration reference) and save its content to the knowledge base so the whole team can ground suggestions in it. Extracts readable context only — never reproduces the site.
  • add_knowledgeRemember a short text note in the organization's knowledge base — give it a title and the text to save (e.g. a policy or FAQ dictated in conversation). Stored as a plain-text file. Binary uploads (PDF/image) stay in the dashboard.
  • delete_knowledgeDelete one of the organization's knowledge-base files by id. Irreversible — requires confirmation.
  • list_menu_itemsSage's job: the organization's cached Square menu (name, price, category, image) — the last-synced catalogue, no live Square call. Call sync_catalog first if the host wants the freshest data.
  • sync_catalogSage's job: pull the organization's live Square catalogue and refresh the cached menu (list_menu_items). A safe, rate-limited refresh — not destructive, no confirmation needed.

Example call

A tools/call request and its response — listing published events:

// request
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "list_events",
    "arguments": { "status": "published", "limit": 10 }
  }
}

// response
{
  "jsonrpc": "2.0",
  "id": 1,
  "result": {
    "content": [{ "type": "text", "text": "[ ... events ... ]" }]
  }
}