The full upstream README, mirrored here for reference. Install config, tool schemas, adoption signals, and an original overview live on the Nightlife MCP listing page.
MCP server for nightlife event discovery backed by Supabase.
Production endpoint: https://api.nightlife.dev/mcp
claude_desktop_config.json):For curl, TypeScript SDK, and other clients, see CLIENT_SETUP.md.
search_eventsget_tonightget_event_detailssearch_venuesget_venue_infosearch_performersget_performer_infolog_unmet_requestcreate_vip_booking_requestget_vip_booking_statusget_vip_table_availabilityget_vip_table_chartget_recommendations (v0.2, behind MCP_ENABLE_RECOMMENDATIONS=true)outputSchema)/healthSet env vars in .env:
SUPABASE_URLSUPABASE_SERVICE_ROLE_KEYOptional:
DEFAULT_CITY (default: tokyo)MCP_TOP_LEVEL_CITIES (default example: tokyo,san-francisco; controls available_cities in unsupported-city responses)DEFAULT_COUNTRY_CODE (default: JP)NIGHTLIFE_BASE_URL (default: https://nightlifetokyo.com)MCP_HTTP_REQUIRE_API_KEY (default: true)MCP_HTTP_USE_DB_KEYS (default: true)MCP_HTTP_ALLOW_ENV_KEY_FALLBACK (default: true)MCP_HTTP_API_KEYS (comma-separated legacy fallback keys)MCP_ENABLE_RECOMMENDATIONS (default: false; enables get_recommendations)HTTP authentication can use persistent API keys from Supabase plus quota tracking.
.env:This prints the raw api_key once. Save it securely and use it in MCP HTTP calls.
If the DB RPC is unavailable, fallback to MCP_HTTP_API_KEYS works only when MCP_HTTP_ALLOW_ENV_KEY_FALLBACK=true.
Public concierge flows can log unsupported user intents to Supabase.
Run migration:
Then call MCP tool log_unmet_request when no good answer exists from available nightlife data.
VIP table booking submission and status tracking are backed by Supabase.
Run migration:
Then call MCP tools:
create_vip_booking_requestget_vip_booking_statusget_vip_table_availability (read per-day table availability by venue/date range)get_vip_table_chart (read structured table chart with optional per-date status overlay and optional layout_image_url)Conversation policy for create_vip_booking_request:
00:00-05:59).Just to confirm: you want a table for [Night Day] night ([Night Date]), arriving around [Time] on [Arrival Day], [Arrival Date] ([Timezone]). I'll submit that as [Night Day] night with [Time] arrival. Is that correct?2am without a day, ask:
Do you mean 2:00 AM after Thursday night (Friday morning), or after Friday night (Saturday morning)?Ops-tier sessions also have internal queue tools:
list_vip_reservations (all outstanding reservations; default statuses: submitted, in_review, confirmed)list_vip_requests_for_alerting (due alerts only)mark_vip_request_alert_sentclaim_vip_request_after_ackupdate_vip_booking_status (set confirmed/rejected/cancelled with audit event)upsert_vip_venue_tables (write venue table definitions + chart coordinates + optional table notes + optional layout_image_url)upsert_vip_table_availability (write per-date table statuses)upload_vip_table_chart_image (upload chart image to storage and attach layout_image_url to venue table metadata)To discover bookable venues first, use:
search_venues with vip_booking_supported_only=trueget_venue_info and check vip_booking_supportedFor internal venue-booking workers, claim queue tasks via DB function:
public.claim_next_vip_agent_task(p_agent_id text)Internal dashboard routes:
GET /ops/loginPOST /ops/loginPOST /ops/logoutGET /ops/vip-dashboardInternal admin API routes (cookie-session protected):
GET /api/v1/admin/vip-bookingsGET /api/v1/admin/vip-bookings/:idPATCH /api/v1/admin/vip-bookings/:idRequired env vars:
VIP_DASHBOARD_ADMINS (comma-separated username:password pairs)Optional env vars:
VIP_DASHBOARD_SESSION_TTL_MINUTES (default: 720)VIP_DASHBOARD_SESSION_COOKIE_NAME (default: vip_dashboard_session)Stdio (local desktop clients):
Streamable HTTP:
For production build:
For HTTP in production:
Authenticated production smoke check:
Optional env overrides:
NLT_MCP_URL (default: https://api.nightlife.dev/mcp)NLT_REST_BASE_URL (default: https://api.nightlife.dev/api/v1)NLT_SMOKE_CITY (default: tokyo)Debug web UI for recommendations:
tonight, this_weekend, YYYY-MM-DD, and YYYY-MM-DD/YYYY-MM-DD.get_recommendations returns up to 10 diverse modal slots with dynamic city-aware fallback.log_unmet_request writes unresolved user asks to public.concierge_unmet_requests.public.vip_booking_requests and worker queue tasks to public.vip_agent_tasks.public.vip_venue_tables and date-specific statuses to public.vip_table_availability.search_venues and get_venue_info include vip_booking_supported so clients can show exactly which venues accept VIP booking submissions.vip_booking_supported is sourced from public.venues.vip_booking_enabled (separate from guest_list_enabled).create_vip_booking_request only accepts venues where vip_booking_supported=true.public.cities (slug, timezone, and service-day cutoff).tokyo and san-francisco) while Tokyo can remain the default./mcp): API key required by default (MCP_HTTP_REQUIRE_API_KEY=true).Authorization: Bearer <key>x-api-key: <key>X-API-Key-TierX-API-Key-SourceX-RateLimit-Daily-LimitX-RateLimit-Daily-RemainingX-RateLimit-Minute-LimitX-RateLimit-Minute-Remaining/health./debug/recommendations.result.content[0].text:
INVALID_DATE_FILTERINVALID_EVENT_IDUNSUPPORTED_EVENT_IDEVENT_NOT_FOUNDINVALID_VENUE_IDVENUE_NOT_FOUNDINVALID_PERFORMER_IDPERFORMER_NOT_FOUNDINVALID_BOOKING_REQUESTBOOKING_REQUEST_NOT_FOUNDBOOKING_STATUS_UPDATE_FAILEDVIP_TASK_NOT_AVAILABLEVIP_ALERT_UPDATE_FAILEDVIP_CLAIM_FAILEDINVALID_REQUESTREQUEST_WRITE_FAILEDDB_QUERY_FAILEDINTERNAL_ERRORSee CONTRIBUTING.md for the workflow and rules. AI agents read AGENTS.md. CLAUDE.md is the architecture source of truth.