BoxTier Basketball Receipt について
RankBallは、ReactとViteで作られた、友人同士のバスケットボール試合を登録するアプリです。両チームの承認後に結果とティアを記録でき、localStorageのデモモードとSupabaseによる永続保存に対応します。
主な機能
- 01バスケットボール試合の登録
- 02両チーム承認後の結果記録
- 03戦績とティアの管理
- 04localStorageデモモード
- 05Supabaseによる任意の永続保存
活用シーン
- 01友人同士の試合の運営
- 02双方が承認した試合結果の保存
- 03環境設定なしでのローカルデモ実行
設定
リモートサーバーはインストール不要です。クライアントを選んで設定をコピーするか、ワンクリックで導入できます。
https://boxtier.kr/mcpclaude mcp add --transport http boyakh-jpg-boxtier https://boxtier.kr/mcp{"mcpServers":{"boyakh-jpg-boxtier":{"type":"http","url":"https://boxtier.kr/mcp"}}}Cursor で開く{"servers":{"boyakh-jpg-boxtier":{"type":"http","url":"https://boxtier.kr/mcp"}}}VS Code で開く{"mcpServers":{"boyakh-jpg-boxtier":{"type":"http","url":"https://boxtier.kr/mcp"}}}{"mcpServers":{"boyakh-jpg-boxtier":{"serverUrl":"https://boxtier.kr/mcp"}}}コマンドはターミナルで実行し、JSON は各クライアントの MCP 設定に貼り付けて再起動します。認可が必要なサーバーは初回接続時にログインを求めます。
ツール
5| パラメーター | 型 | 必須 | 説明 |
|---|---|---|---|
| query | string | はい | ユーザーがバスケットボールのマッチングルームを検索する際の検索語と、地域・日付・形式の条件。 |
詳細
RankBall
友人同士のバスケットボールの試合を今日の試合として登録し、試合後に両チームの承認を得て、戦績とティアを記録する React + Vite の MVP です。
実行
npm install
npm run dev
.env がなくても localStorage のデモモードで実行できます。
Supabase
Vite でも Vercel/Next スタイルの NEXT_PUBLIC_* 環境変数を読み取るように設定しています。
NEXT_PUBLIC_SUPABASE_URL=...
NEXT_PUBLIC_SUPABASE_PUBLISHABLE_KEY=...
Supabase の永続化には、supabase/migrations を順番に適用します。Supabase 環境の設定後にリモート読み込みに失敗した場合、localStorage のデモ状態にはフォールバックせず、リモートの shell/error 状態を維持します。
Supabase CLI migration
Production DB の migration は、可能な限り Supabase CLI で適用します。
supabase --version
$env:SUPABASE_ACCESS_TOKEN="..."
$env:SUPABASE_DB_PASSWORD="..."
supabase link --project-ref olzxextphxpniwiiwwda --password $env:SUPABASE_DB_PASSWORD
supabase db push --linked --dry-run
supabase db push --linked
DATABASE_URL があれば、link なしでも適用できます。
supabase db push --db-url "$env:DATABASE_URL" --dry-run
supabase db push --db-url "$env:DATABASE_URL"
Production への適用後、schema health を確認します。
Invoke-RestMethod -Method Post -Uri "https://boxtier.kr/api/system/schema-health" -Headers @{ Authorization = "Bearer $env:CRON_SECRET" }
デプロイ前の検証は、1 つのコマンドで実行します。
npm run verify:release -- --confirm-production=olzxextphxpniwiiwwda
verify:release は production build の後、リモート Supabase/Auth に基づくバックエンド全体のシミュレーションと schema health を実行します。production ref と完全に一致する --confirm-production=<project-ref> CLI flag がない場合、API/Auth の呼び出し前に中断します。SUPABASE_SERVICE_ROLE_KEY、テスト用 Auth 環境変数、CRON_SECRET が必要です。終了コードが 0 以外の場合はデプロイしません。
シミュレーションは実行前に、環境、直接の Supabase project ref、リモート API host/ref を stderr に表示します。プロセスあたりのフロー全体の繰り返し上限は 1 回で、自動再試行はクリーンアップに失敗した場合に最大 1 回です。別プロセスを再実行する外部 runner も、呼び出し回数を 1 回に制限する必要があります。--safety-check-only はターゲットガードのみを検証し、DB/API は呼び出しません。
テスト専用の Supabase では、test URL、publishable key、service-role key をまとめて設定します。リモートの test API を使用する場合は、実際のデプロイ対象と同じ ref を --remote-project-ref=<test-ref> で追加します。直接の ref とリモート ref が異なる場合、実行しません。
リモート DB では、supabase db reset --linked、DROP TABLE、TRUNCATE、大量の DELETE を使用しないでください。
環境変数
| 名前 | 場所 | 用途 |
|---|---|---|
VITE_SUPABASE_URL / NEXT_PUBLIC_SUPABASE_URL | ブラウザー/サーバー | Supabase project URL |
VITE_SUPABASE_PUBLISHABLE_KEY / NEXT_PUBLIC_SUPABASE_PUBLISHABLE_KEY / VITE_SUPABASE_ANON_KEY | ブラウザー | Supabase anon/publishable key |
SUPABASE_SERVICE_ROLE_KEY | サーバー/スクリプト専用 | server action、seed、シミュレーション |
VITE_ENABLE_SERVER_ACTIONS | ブラウザー | server action の有効化 |
VITE_DEMO_LOGIN | ブラウザー | localhost のテストログイン UI を許可 |
RANKBALL_SEED_REAL_TEST_AUTH / RANKBALL_SEED_AUTH_ONLY | スクリプト | テストアカウントを Supabase Auth user として作成し、既存の profile に紐付け |
RANKBALL_TEST_PASSWORD / VITE_TEST_AUTH_PASSWORD | スクリプト/ブラウザー | テストアカウントの password Auth 用パスワード |
RANKBALL_TEST_AUTH_EMAIL_DOMAIN / VITE_TEST_AUTH_EMAIL_DOMAIN | スクリプト/ブラウザー | テストアカウントの email domain。デフォルト値は rankball.test |
VITE_ASSET_BASE_URL / VITE_PUBLIC_ASSET_BASE_URL | ブラウザー | リモート asset base URL |
VITE_NAVER_MAP_CLIENT_ID / VITE_NAVER_MAP_NCP_KEY_ID | ブラウザー/サーバーのフォールバック | Naver map/geocode client id |
NAVER_MAP_CLIENT_SECRET / NAVER_MAP_NCP_KEY / NAVER_MAP_NCP_CLIENT_SECRET | サーバー専用 | Naver geocode のフォールバック用 secret |
DISCORD_CLIENT_ID / DISCORD_CLIENT_SECRET / DISCORD_REDIRECT_URI | サーバー専用 | Discord OAuth |
DISCORD_BOT_TOKEN / DISCORD_GUILD_ID / DISCORD_GUILD_IDS | サーバー専用 | Discord DM worker |
DISCORD_PUBLIC_KEY | サーバー専用 | Discord interaction の署名検証 |
DISCORD_CHAT_BRIDGE_SECRET / DISCORD_CHAT_BRIDGE_URL | bridge worker | Discord の部屋チャットを Web API に転送 |
DISCORD_CHAT_BRIDGE_REQUEST_TIMEOUT_MS / DISCORD_CHAT_BRIDGE_MAX_DELIVERY_ATTEMPTS | bridge worker | 転送のタイムアウトと再試行回数。デフォルトは 10000、4 |
CRON_SECRET | サーバー/スクリプト専用 | worker、メンテナンス、schema-health |
SUPABASE_ACCESS_TOKEN | CLI 専用 | Supabase Management API 認証 |
SUPABASE_DB_PASSWORD | CLI 専用 | supabase link、supabase db push --linked 用のリモート DB パスワード |
SUPABASE_PROJECT_ID | CLI/CI 専用 | Supabase project ref。現在の production ref:olzxextphxpniwiiwwda |
DATABASE_URL | CLI/サーバー専用 | supabase db push --db-url または Postgres への直接接続 |
RANKBALL_SIM_BASE_URL / RANKBALL_SIM_SECRET / RANKBALL_SIM_TIMEOUT_MS / RANKBALL_SIM_CLEANUP_TIMEOUT_MS | スクリプト | バックエンドシミュレーション |
RANKBALL_SIM_REMOTE_PROJECT_REF | スクリプト | リモート test API が使用する Supabase project ref。--remote-project-ref が優先されます |
RANKBALL_SIM_REPEAT / RANKBALL_SIM_MAX_RETRIES | スクリプト | フロー全体の繰り返し上限 1、クリーンアップの再試行上限 1 |
Discord 방 채팅 bridge
상시 실행 환경에서 아래 명령을 실행합니다. Gateway worker는 heartbeat ACK 누락 시 재연결하고, 가능한 세션은 resume하며, 웹 API의 timeout·429·5xx를 제한 횟수만큼 재시도합니다.
npm run discord:room-chat-bridge
운영에서는 DISCORD_CHAT_BRIDGE_SECRET을 별도로 설정합니다. CRON_SECRET fallback은 기존 배포 호환용입니다.
Vercel
Framework preset은 Vite, build command는 npm run build, output directory는 dist입니다.
コメント
AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。