loading…
Search for a command to run...
loading…
MCP server for Tokyo nightlife event discovery, venue search, performer info, AI recommendations, and VIP table booking.
MCP server for Tokyo nightlife event discovery, venue search, performer info, AI recommendations, and VIP table booking.
MCP server for nightlife event discovery backed by Supabase.
Production endpoint: https://api.nightlife.dev/mcp
claude_desktop_config.json):{
"mcpServers": {
"nightlife": {
"url": "https://api.nightlife.dev/mcp",
"headers": {
"x-api-key": "YOUR_API_KEY"
}
}
}
}
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)/healthcp .env.example .env
npm install
Set 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.
-- copy file contents from:
-- supabase/migrations/20260219094000_mcp_api_keys.sql
.env:MCP_HTTP_REQUIRE_API_KEY=true
MCP_HTTP_USE_DB_KEYS=true
MCP_HTTP_ALLOW_ENV_KEY_FALLBACK=true
npm run key:create -- --name claude-desktop --tier starter --daily-quota 1000 --minute-quota 60
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:
-- copy file contents from:
-- supabase/migrations/20260226_concierge_unmet_requests.sql
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:
-- copy file contents from:
-- supabase/migrations/20260227143000_vip_phase1_requests_and_queue.sql
-- supabase/migrations/20260228124500_add_vip_booking_enabled_to_venues.sql
-- and if already deployed before 2026-02-28:
-- supabase/migrations/20260228111000_vip_outward_language_defaults.sql
-- supabase/migrations/20260301010000_vip_table_availability_chart.sql
-- supabase/migrations/20260301114000_vip_table_chart_storage_bucket.sql
-- supabase/migrations/20260303093000_vip_dashboard_admin_edits.sql
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):
npm run dev
Streamable HTTP:
npm run dev:http
For production build:
npm run build
npm start
For HTTP in production:
npm run start:http
Authenticated production smoke check:
NLT_API_KEY=... npm run smoke:prod:auth
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:
MCP_ENABLE_RECOMMENDATIONS=true npm run dev:http
# open http://127.0.0.1:3000/debug/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_ERRORДобавь это в claude_desktop_config.json и перезапусти Claude Desktop.
{
"mcpServers": {
"alcylu-nightlife-mcp": {
"command": "npx",
"args": []
}
}
}