夜生活mcp
由Supabase支持的用于夜生活活动发现的MCP服务器。
快速开始
生产终点: https://api.nightlife.dev/mcp
- 在获取免费API密钥 夜生活.dev
- 添加到Claude桌面配置(
claude_desktop_config.json):
{
"mcpServers": {
"nightlife": {
"url": "https://api.nightlife.dev/mcp",
"headers": {
"x-api-key": "YOUR_API_KEY"
}
}
}
}有关curl、TypeScript SDK和其他客户端,请参阅 CLIENT_SETUP.md.
已实施(v0.3)
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,后面MCP_ENABLE_RECOMMENDATIONS=true)- 具有API-key中间件的可流式HTTP端点
- 结构化工具输出模式(
outputSchema) - 具有稳定错误代码的确定性工具错误有效载荷
- 运行时请求/工具指标在
/health
先决条件
- Node.js 18+
- Supabase项目URL+服务角色键
设置
cp .env.example .env
npm install在中设置环境变量 .env:
SUPABASE_URLSUPABASE_SERVICE_ROLE_KEY
可选:
DEFAULT_CITY(默认值:tokyo)MCP_TOP_LEVEL_CITIES(默认示例:tokyo,san-francisco;控制available_cities在不受支持的城市回复中)DEFAULT_COUNTRY_CODE(默认值:JP)NIGHTLIFE_BASE_URL(默认值:https://nightlifetokyo.com)MCP_HTTP_REQUIRE_API_KEY(默认值:true)MCP_HTTP_USE_DB_KEYS(默认值:true)MCP_HTTP_ALLOW_ENV_KEY_FALLBACK(默认值:true)MCP_HTTP_API_KEYS(逗号分隔的旧回退键)MCP_ENABLE_RECOMMENDATIONS(默认值:false;使get_recommendations)
DB API密钥模式(推荐)
HTTP身份验证可以使用Subabase的持久API密钥加上配额跟踪。
- 在Supabase SQL编辑器中运行SQL迁移:
-- copy file contents from:
-- supabase/migrations/20260219094000_mcp_api_keys.sql- 确保在中启用了DB身份验证标志
.env:
MCP_HTTP_REQUIRE_API_KEY=true
MCP_HTTP_USE_DB_KEYS=true
MCP_HTTP_ALLOW_ENV_KEY_FALLBACK=true- 创建API密钥记录:
npm run key:create -- --name claude-desktop --tier starter --daily-quota 1000 --minute-quota 60这将打印原始图像 api_key 一次。安全地保存它并在MCP HTTP调用中使用它。
如果DB RPC不可用,请回退到 MCP_HTTP_API_KEYS 仅在以下情况下有效 MCP_HTTP_ALLOW_ENV_KEY_FALLBACK=true.
礼宾部未满足请求积压
公共礼宾流程可以将不受支持的用户意图记录到Supabase。
运行迁移:
-- copy file contents from:
-- supabase/migrations/20260226_concierge_unmet_requests.sql然后调用MCP工具 log_unmet_request 当现有的夜生活数据中没有好的答案时。
VIP预订第一阶段
贵宾桌预订提交和状态跟踪由Supabase支持。
运行迁移:
-- 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然后调用MCP工具:
create_vip_booking_requestget_vip_booking_statusget_vip_table_availability(按地点/日期范围阅读每日表可用性)get_vip_table_chart(阅读结构化表格图表,可选按日期状态叠加和可选layout_image_url)
对话策略 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没有一天,问:
- Do you mean 2:00 AM after Thursday night (Friday morning), or after Friday night (Saturday morning)?
- 如果用户更改了日期,请在提交前重新生成确认。
Ops层会话还具有内部队列工具:
list_vip_reservations(所有未完成的预订;默认状态:submitted,in_review,confirmed)list_vip_requests_for_alerting(仅限到期警报)mark_vip_request_alert_sentclaim_vip_request_after_ackupdate_vip_booking_status(套confirmed/rejected/cancelled审计事件)upsert_vip_venue_tables(填写场地表定义+图表坐标+可选表注释+可选layout_image_url)upsert_vip_table_availability(按日期写入表格状态)upload_vip_table_chart_image(将图表图像上传到存储并附加layout_image_url到会场表元数据)
要先发现可预订的场地,请使用:
search_venues和vip_booking_supported_only=true- 或
get_venue_info并检查vip_booking_supported
对于内部场馆预订工作人员,通过DB功能申请队列任务:
public.claim_next_vip_agent_task(p_agent_id text)
VIP运营仪表板
内部仪表板路线:
GET /ops/loginPOST /ops/loginPOST /ops/logoutGET /ops/vip-dashboard
内部管理员API路由(cookie-session受保护):
GET /api/v1/admin/vip-bookingsGET /api/v1/admin/vip-bookings/:idPATCH /api/v1/admin/vip-bookings/:id
必需的环境变量:
VIP_DASHBOARD_ADMINS(逗号分隔username:password成对)
可选环境变量:
VIP_DASHBOARD_SESSION_TTL_MINUTES(默认值:720)VIP_DASHBOARD_SESSION_COOKIE_NAME(默认值:vip_dashboard_session)
跑
Stdio(本地桌面客户端):
npm run dev流式HTTP:
npm run dev:http对于生产构建:
npm run build
npm start对于生产环境中的HTTP:
npm run start:http经过认证的生产烟雾检查:
NLT_API_KEY=... npm run smoke:prod:auth可选的环境覆盖:
NLT_MCP_URL(默认值:https://api.nightlife.dev/mcp)NLT_REST_BASE_URL(默认值:https://api.nightlife.dev/api/v1)NLT_SMOKE_CITY(默认值:tokyo)
调试web UI以获取建议:
MCP_ENABLE_RECOMMENDATIONS=true npm run dev:http
# open http://127.0.0.1:3000/debug/recommendations备注
- 日期处理支持
tonight,this_weekend,YYYY-MM-DD,以及YYYY-MM-DD/YYYY-MM-DD. get_recommendations返回多达10个不同的模式插槽,具有动态城市感知回退功能。- 场地和表演者工具包括即将举行的活动快照。
log_unmet_request将未解决的用户请求写入public.concierge_unmet_requests.- VIP阶段1将预订提交写入
public.vip_booking_requests工作人员将任务排队到public.vip_agent_tasks. - VIP库存将表定义写入
public.vip_venue_tables以及日期特定状态public.vip_table_availability. search_venues和get_venue_info包含vip_booking_supported因此,客户可以准确地显示哪些场地接受VIP预订提交。vip_booking_supported来源于public.venues.vip_booking_enabled(与guest_list_enabled).create_vip_booking_request仅接受以下场所vip_booking_supported=true.- 城市管理由以下支持
public.cities(slug、时区和服务日截止)。 - 支持的顶级城市是环境可配置的(例如
tokyo和san-francisco)而东京可以继续违约。 - Stdio传输:无API密钥检查。
- HTTP传输(
/mcp):默认情况下需要API密钥(MCP_HTTP_REQUIRE_API_KEY=true). - API密钥头:
- Authorization: Bearer - x-api-key:
- 当DB支持的身份验证处于活动状态时,HTTP响应包括密钥层/源和速率限制标头:
- X-API-Key-Tier - X-API-Key-Source - X-RateLimit-Daily-Limit - X-RateLimit-Daily-Remaining - X-RateLimit-Minute-Limit - X-RateLimit-Minute-Remaining
- 健康终点:
/health. - 手动工具测试的调试页面:
/debug/recommendations. - 工具错误作为JSON文本有效载荷返回
result.content[0].text:
- INVALID_DATE_FILTER - INVALID_EVENT_ID - UNSUPPORTED_EVENT_ID - EVENT_NOT_FOUND - INVALID_VENUE_ID - VENUE_NOT_FOUND - INVALID_PERFORMER_ID - PERFORMER_NOT_FOUND - INVALID_BOOKING_REQUEST - BOOKING_REQUEST_NOT_FOUND - BOOKING_STATUS_UPDATE_FAILED - VIP_TASK_NOT_AVAILABLE - VIP_ALERT_UPDATE_FAILED - VIP_CLAIM_FAILED - INVALID_REQUEST - REQUEST_WRITE_FAILED - DB_QUERY_FAILED - INTERNAL_ERROR
贡献与CI
看 CONTRIBUTING.md 对于工作流程和规则。AI代理读取 AGENTS.md. CLAUDE.md 是建筑真理的源泉。
