👾

サンドボックスCodexCLIにsupabaseMCP 導入で苦戦した原因

に公開

以下は、今回の一連のトラブルシュートを踏まえてまとめた実運用レポートです。環境固有の要因→失敗要因→成功の決め手→再発防止の指針→CodexCLIの作法→他MCPへの展開、の順で整理しました。

  1. 現在の環境“独特”の問題点(WSL + Codex の合わせ技)

WSL2 + Codex サンドボックス

Codex はデフォルトで外部コマンドをサンドボックス内で走らせます。書込み先(~/.mcpt など)やネットワークの扱いが通常 Linux と異なり、外部CLIに頼るフローは詰まりやすい。

/mcp はCodex のTUI内部コマンド。Bash に打つと失敗します(/mcp: No such file など)。

WSL Interop / 既定ブラウザ

wslview が使えないと OAuth 認可URLを開けません。今回、Interop 有効化と BROWSER=wslview で解決。

PATH・権限・ディレクトリ

~/go/bin の mcp CLI、npx/pnpm dlx の毎回ダウンロード、~/.mcpt への書込み不可など、外部CLI系の摩擦が大きい。

TOML 記述の落とし穴

args = ["-lc", "<長いコマンド>"] を複数行や末尾 \ で書くと TOML パースエラー(missing comma between array elements)。

  1. supabaseMCP 導入に長期で苦戦した“本質的”原因

経路の混同(HTTP+OAuth vs STDIO)

「リモートMCP(URL+OAuth)」と「ローカルMCP(STDIO)」の2経路が同時に存在。さらに Codex が思考過程で外部CLI(mcp/npx)へフォールバックしやすく、OAuth が一度も発火しない状態が続いた。

外部CLIフォールバックの連鎖

mcp alias・mcp tools・npx @supabase/mcp-server-supabase に落ちるたび、

ネットワーク制約で初期化タイムアウト

~/.mcpt permission denied

execute_sql: not found(シェルコマンド扱い)

npm EACCES / semver “Invalid Version”
が発生し、再試行のたびに別の壁へ誘導された。

環境変数の受け渡しミス

.env に PAT はあるのに、Codex → MCPサーバ起動時に SUPABASE_ACCESS_TOKEN が注入されない(親環境が空だと env = { ... } が空注入)→ Unauthorized 連発。

TOML 設定と操作の勘所

/mcp call … を Bash 側で実行したり、TOML の args を複数行にして構文エラー。

  1. 今回「成功した」理由・気付き(決定打)

STDIO 方式に一本化し、外部CLIの不確実さ(npx/pnpm)を排除

@supabase/mcp-server-supabase を グローバルに固定インストール → 絶対パス起動に変更。

同一コマンドとして認識されるため、承認は初回のみで済む。

.env を MCP サーバ起動“直前”に確実ロード

Codex 設定を command = "bash" + args = ["-lc", "set -a; . .env; exec mcp-server-supabase ..."] に変更。

親環境が空でも サーバープロセスには必ずPATが入る → Unauthorized 解消。

ランチャー(codex-supabase)で起動を標準化

毎回 .env の export を忘れない・プロファイルや sandbox を間違えない・PATH の差異で迷わない。

/mcp は TUI内のみという作法の徹底

Bashに /mcp を打たない。自然言語でツール実行を指示する、が最も安定。

  1. 成功のために行った“工夫”一覧(そのまま運用Tips)

固定インストール + 絶対パス

npm i -g @supabase/mcp-server-supabase@0.5.6
command -v mcp-server-supabase # → 絶対パスを config に記入

Codex 設定(抜粋:TOMLは1行で書く)

sandbox_mode = "workspace-write"
approval_policy = "untrusted"
[sandbox_workspace_write]
network_access = true

[mcp_servers.supabase]
command = "bash"
args = ["-lc", "set -a; [ -f $HOME/projects/_xxx/.env ] && . $HOME/projects/_xxx/.env; set +a; exec /home/fire/.npm-global/bin/mcp-server-supabase --read-only --project-ref=_xxx"]
startup_timeout_sec = 300
tool_timeout_sec = 90

ランチャーで .env 自動ロード

~/bin/codex-supabase

#!/usr/bin/env bash
cd "$HOME/projects/_xxx" || exit 1
set -a; [ -f ./.env ] && . ./.env; set +a
exec codex --sandbox workspace-write --ask-for-approval untrusted "$@"

承認は“この1本だけ二度と聞かない”

初回の「bash -lc ... mcp-server-supabase ... を実行しますか?」→ Don’t ask again。

WSL Interop の徹底確認(wslview / cmd.exe /c ver)

OAuth方式を使うときは必須(今回はSTDIOだが将来のため)。

  1. 改めて:CodexCLI の使い方(要点のみ)

/mcp は TUI内の“表示”コマンド

/mcp:MCP サーバ一覧表示。

/mcpに引数はない。実行は自然言語で「◯◯ MCP の △△ を実行して」と指示する。

実行の正攻法

「Supabase MCP の execute_sql で “…SQL…” を実行して」

外部CLI(mcp/npx/curl)を提案されたら拒否し、「shell ではなく設定済みの MCP で」と明言。

サンドボックスと承認

workspace-write + network_access=true(セッション単位)。

untrusted で都度確認→必要なものだけAllowlistへ。

環境変数の受け渡し

最小トラブルは bash -lc で .env を起動直前に source。

config.toml に秘密の“値”は直書きしない(どうしても検証で書いたら、直後にローテーション)。

  1. 他の MCP 導入にも効く“再現性の高いプラクティス”
    A. まずはSTDIO 方式で安定させる

固定インストール → 絶対パス → bash -lc で .env を確実注入
テンプレ(置換して使用):

[mcp_servers.<name>]
command = "bash"
args = ["-lc", "set -a; [ -f $HOME/<project>/.env ] && . $HOME/<project>/.env; set +a; exec </絶対パス/サーバ実行ファイル> <必要な引数>"]
startup_timeout_sec = 300
tool_timeout_sec = 90

Allowlist:サーバ起動だけ「今後聞かない」に。

B. その後、HTTP+OAuth 方式へ段階的に移行(必要な場合)

名前分離:<name>-remote にして衝突回避。

外部CLIのPATH退避(codex-safe ランチャ)でフォールバック遮断。

実ツール実行を1回 → 認証URLが出る → wslview で開く → /mcp に Tools が並ぶことを確認。

C. 失敗モード → 即手当の早見表
症状 代表ログ・現象 処置
OAuth が出ない Tools: (none) のまま / 外部CLI提案が出る 外部CLI拒否、名前分離(-remote)、codex-safe で PATH から mcp を外す
Unauthorized Please provide access token … bash -lc で .env を起動直前に source、PAT 直書きは避ける
execute_sql: not found exec: "execute_sql": not found 外部 mcp CLI に逸れている。**自然言語で“設定済みMCPで”**を明示
TOML エラー missing comma ... args の 2要素目は1行で書く。改行・\禁止
初期化 timeout npx/pnpm で時間切れ 固定インストール + 絶対パス、startup_timeout_sec を延長
7. 今回の“最終形”サマリ(保存版)

起動:codex-supabase(.env 自動ロード)

Config(要部):

[mcp_servers.supabase]
command = "bash"
args = ["-lc", "set -a; [ -f $HOME/projects/_xxx/.env ] && . $HOME/projects/_xxx/.env; set +a; exec /home/fire/.npm-global/bin/mcp-server-supabase --read-only --project-ref=_xxx"]
startup_timeout_sec = 300
tool_timeout_sec = 90

実行の仕方:TUIで

「Supabase MCP の execute_sql で “…SQL…” を実行して」

  1. 最後に(推奨アクション)

PAT のローテーション(ログに出たため)→ .env 更新。

Serena の安定化は、単体ウォームアップ + startup_timeout_sec 延長で対応。

運用テンプレ(スキーマ点検、サイズ上位、FK/RLS、インデックス診断、孤児行チェック等)をそのまま貼って使える形で整備。

これで **「なぜ苦戦したか/なぜ成功したか/今後どうすべきか」が一本の手順にまとまりました。
他の MCP を追加する際も、「STDIOで安定→必要ならHTTP+OAuthへ」**の手順で愚直に進めば、同種のハマりを避けられます。

Discussion