nightlife-mcp
Supabaseをバックエンドとしたナイトライフイベント検索用MCPサーバー。
クイックスタート
本番環境エンドポイント: https://api.nightlife.dev/mcp
nightlife.dev で無料のAPIキーを取得します。
Claude Desktopの設定 (
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 を参照してください。
Related MCP server: Eventfinda MCP
実装済み機能 (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キーミドルウェアを備えたストリーミング可能な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認証では、Supabaseの永続的なAPIキーとクォータ追跡を使用できます。
Supabase SQLエディタでSQLマイグレーションを実行します:
-- copy file contents from:
-- supabase/migrations/20260219094000_mcp_api_keys.sql.envでDB認証フラグが有効になっていることを確認します:
MCP_HTTP_REQUIRE_API_KEY=true
MCP_HTTP_USE_DB_KEYS=true
MCP_HTTP_ALLOW_ENV_KEY_FALLBACK=trueAPIキーレコードを作成します:
npm run key:create -- --name claude-desktop --tier starter --daily-quota 1000 --minute-quota 60これにより、生の api_key が一度だけ表示されます。安全に保存し、MCP HTTP呼び出しで使用してください。
DB RPCが利用できない場合、MCP_HTTP_ALLOW_ENV_KEY_FALLBACK=true の場合にのみ MCP_HTTP_API_KEYS へのフォールバックが機能します。
コンシェルジュ未対応リクエストのバックログ
パブリックコンシェルジュフローは、サポートされていないユーザーの意図をSupabaseに記録できます。
マイグレーションを実行:
-- copy file contents from:
-- supabase/migrations/20260226_concierge_unmet_requests.sqlその後、利用可能なナイトライフデータから適切な回答が得られない場合に、MCPツール log_unmet_request を呼び出します。
VIP予約フェーズ1
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を添付)
予約可能な会場を最初に発見するには、以下を使用します:
vip_booking_supported_only=trueを指定したsearch_venuesまたは
get_venue_infoでvip_booking_supportedを確認
内部の会場予約担当者は、DB関数を介してキュータスクを要求します:
public.claim_next_vip_agent_task(p_agent_id text)
VIP Opsダッシュボード
内部ダッシュボードルート:
GET /ops/loginPOST /ops/loginPOST /ops/logoutGET /ops/vip-dashboard
内部管理APIルート (Cookieセッション保護):
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 <key>x-api-key: <key>
DBバックエンド認証がアクティブな場合、HTTPレスポンスにはキーのティア/ソースおよびレート制限ヘッダーが含まれます:
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内のJSONテキストペイロードとして返されます: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
貢献とCI
ワークフローとルールについては CONTRIBUTING.md を参照してください。AIエージェントは AGENTS.md を読み取ります。CLAUDE.md がアーキテクチャの信頼できる情報源です。
Maintenance
Latest Blog Posts
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/alcylu/nightlife-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server
