OpenAI Codex で Shager を使う:config.toml、bearer_token_env_var、下書きを下書きのままにするツール許可リスト

Codex CLI に Shager のリモート MCP サーバーを設定し、キーを環境変数から読み、ツールを絞って最初の下書きを作ります。

OpenAI の Codex CLI に Shager をつなぐには、~/.codex/config.toml に [mcp_servers.shager] テーブルを追加し、url = "https://app.shager.ai/api/mcp" と bearer_token_env_var = "SHAGER_API_KEY" を書きます。あとは shgr_live_ で始まるキーをその変数に export するだけです。Codex は streamable HTTP にネイティブ対応し、キーを Bearer トークンとして送るので、ブリッジもローカルプロセスも要りません。codex mcp add shager --url ... --bearer-token-env-var SHAGER_API_KEY で1行で済ませることもできます。

このガイドの残りは、後悔しない設定の仕方についてです。キーをファイルに書かないこと、Codex が呼び出せる Shager のツールを絞ること、そして配線が正しいことを確かめる最初のタスクを選ぶことです。

Codex はリモート MCP サーバーに何をサポートしていますか?

OpenAI の Codex MCP ドキュメントには、url で設定する streamable HTTP サーバーと、ヘッダーで認証する3つの方法が載っています。設定リファレンスでの定義は次のとおりです。

キー 役割
bearer_token_env_var 値を Bearer トークンとして送信する環境変数の名前
http_headers 毎回のリクエストに含める固定のヘッダー
env_http_headers 値を環境変数から読み込むヘッダー

Shager が期待するのは Authorization: Bearer shgr_live_... で、これはまさに bearer_token_env_var が生成する形です。使うべきはこのオプションです。

Codex の config.toml:shager という名前の MCP サーバーと、その URL、キーを保持する環境変数。
キーはファイルには書かず、環境変数に保持します。

方法A:config.toml を編集する

~/.codex/config.toml を開き、次を追加します。

[mcp_servers.shager]
url = "https://app.shager.ai/api/mcp"
bearer_token_env_var = "SHAGER_API_KEY"

キーは TOML ではなく、シェルのプロファイルに置きます。

export SHAGER_API_KEY="shgr_live_your_key_here"

設定ファイルに入っているのは変数の名前で、キーそのものではない点に注目してください。つまり、このスニペットは気兼ねなくコミットしたり共有したりでき、チームメンバーは各自のキーを用意するだけです。一人ひとりに別のキーを持たせておくと、あとで効いてきます。https://app.shager.ai/dashboard/agents にある Shager の監査ログは、すべての呼び出しを、それを行ったキーとともに記録するからです。

方法B:codex mcp add

CLI を使えば、同じテーブルを自動で書いてくれます。Codex のソースでは、codex mcp add に streamable HTTP サーバー用の --url と、それを前提とする --bearer-token-env-var フラグが定義されています(GitHub の mcp_cmd.rs)。

codex mcp add shager \
  --url https://app.shager.ai/api/mcp \
  --bearer-token-env-var SHAGER_API_KEY

インストールしているバージョンで挙動が違う場合は、codex mcp add --help の内容が正です。

結果を確認します。

codex mcp list

Codex の TUI 内では、/mcp で有効なサーバーとそのツールを確認できます。

代わりに http_headers を使うべきですか?

使えますが、おすすめしません。http_headers = { "Authorization" = "Bearer shgr_live_..." } でも動きますが、有効な認証情報がプレーンテキストのファイルに入り、そのファイルは dotfiles のリポジトリにコピーされがちです。Bearer トークン以外のヘッダーが必要な場合は、env_http_headers でヘッダー名を環境変数名に対応付けます。

[mcp_servers.shager]
url = "https://app.shager.ai/api/mcp"
env_http_headers = { "Authorization" = "SHAGER_AUTH_HEADER" }

この書き方では、変数にスキームを含めた値全体を入れる必要があります。export SHAGER_AUTH_HEADER="Bearer shgr_live_..." です。Shager の場合は、bearer_token_env_var のほうが簡単で、やっていることは同じです。

図:AIエージェント(Claude、Codex、Cursor)が MCP サーバーまたは REST API で Shager に接続し、Shager が Facebook、Instagram、YouTube、X、LinkedIn、TikTok に配信します。
接続、チェック、時間差の配信、クリック計測は Shager が担当します。Facebook、Instagram は Meta の承認待ちです。承認されるまでは、テストアカウントのみ接続できます。 TikTok では、アプリの承認が下りるまで、投稿は非公開(「自分のみ」)で投稿されます。

Codex が Shager でできることを制限するには?

多くのセットアップガイドが飛ばしてしまうのがここです。Codex では、enabled_tools(許可リスト)と disabled_tools(その後に適用される拒否リスト)でサーバーのツールを絞り込めます。どちらも設定リファレンスに載っています。これを Shager のキーのスコープと組み合わせれば、どちらも安全側に倒れる2層の守りになります。

すべてを読み取って下書きは作れるが、予約、キャンセル、接続リンクの作成はできない、下書き用のプロファイルの例です。

[mcp_servers.shager]
url = "https://app.shager.ai/api/mcp"
bearer_token_env_var = "SHAGER_API_KEY"
enabled_tools = [
  "whoami",
  "list_workspaces",
  "list_channels",
  "list_groups",
  "upload_media_from_url",
  "create_post",
  "get_post",
  "list_posts",
  "get_analytics",
]
tool_timeout_sec = 120

create_post をリストに残しているのは、schedule_at がなければ下書きを保存するだけだからです。さらにキーに publish スコープがなければ、Shager は schedule_at を含む create_post を 403 で拒否します。どれほど機転の利くモデルでも、予約投稿をこっそり通すことはできません。

tool_timeout_sec を引き上げているのは、upload_media_from_url がサーバー側でファイルをダウンロードするためです。大きな縦型動画だと、リファレンスにあるデフォルトの 60 秒を超えることがあります。

最初に試す価値のあるタスク

複数のツールを使い、あとには下書きだけが残るプロンプトから始めましょう。

Use the shager MCP server.
1. whoami, then list_workspaces.
2. In workspace "Lakeside Realty", list_channels and list_groups.
3. upload_media_from_url https://example.com/media/open-house.jpg
4. create_post as a draft to group "All agents" with a different caption per
   channel (per_channel), mentioning each agent's neighborhood from the channel
   name. cta_url https://lakesiderealty.example/open-house, campaign
   "open-house-oct", first_comment "Details and RSVP: " followed by the link.
5. get_post and print a table of channel, network, format and state.

期待される結果は、DRAFT 状態の投稿が1件あり、アカウントごとに1つの投稿先があって、それぞれ SNS に合わせたフォーマットが決まっている状態です。Shager では、cta_url に対してアカウントごとに専用の短縮リンクと UTM タグが付き、utm_content にアカウント名が入ります。これが、あとでアカウント別の成果を計測する土台になります。詳しくはアカウント別のリード計測をご覧ください。

人がキーボードの前にいなくても、Codex で実行できますか?

Codex には、スクリプトや CI 向けの非対話モード codex exec があります。ただし、ヘッドレス実行時の MCP ツールの承認の扱いはリリースごとに変わってきたので、定期実行に組み込む前に、インストール済みのバージョンで試運転してください。毎週無人で確実に動かす必要がある処理なら、チャットの層を挟まず、短いスクリプトから Shager の REST API を呼ぶチームも多くあります。承認の確認で止まることがないからです。どちらを選ぶにしても、その処理専用のキーを用意し、ツールの許可リストは絞り込み、そのキーに publish を持たせるかどうかは意識して決めてください。こうした判断を前提に組んだ定型処理は、毎週の配信ルーティンで紹介しています。

トラブルシューティング

起きていること 原因 対処
401 unauthorized Codex を起動したシェルで変数が export されていない 同じターミナルで echo $SHAGER_API_KEY を確認し、Codex を再起動する
/mcp にツールが表示されない enabled_tools に名前がない、または disabled_tools に入っている /ja/agents のツール一覧と綴りを照合する
403 sandbox_unclaimed キーがエージェントの自己登録で作られ、まだ人が引き継いでいない claim_url を人に送る
予約で 403 forbidden キーに publish がない 下書き用のキーなら想定どおり
429 rate_limited 1つのキーで1分あたり 120 リクエストを超えた アカウントごとに呼ぶのではなく、グループと create_post 1回を使う

よくある質問

Codex が Shager と通信するのに OAuth は必要ですか?

いいえ。Codex は環境変数からの Bearer トークンに対応しており、Shager はその方法で API キーを受け付けます。Shager の MCP サーバーは OAuth によるログインにも対応していて、Codex も OAuth サーバーに対応しているので、キーを管理したくない場合はログインする方法も選べます。

Codex の IDE 拡張機能では、Shager の設定が違いますか?

OpenAI の MCP ドキュメントによれば、ChatGPT のデスクトップアプリ、Codex CLI、IDE 拡張機能はこの設定を共有するので、同じ ~/.codex/config.toml のテーブルがすべてで使われます。ただし、環境変数がエディタのプロセスから見えている必要があります。macOS では、ターミナルからエディタを起動しなければならない場合があります。

MCP ではなく REST API を Codex に使わせることはできますか?

はい。チャットではなくコードを書くのであれば可能です。OpenAPI ドキュメントには MCP ツールと同じ操作が、同じスコープと制限で記載されています。

次のステップ

Codex をつないだら、何かを自動化する前に、まず操作そのものに慣れておきましょう。REST API クイックスタートでは、ワークスペースの作成から計測付きの投稿までの一連の流れを curl と Python で順に紹介しています。Codex が MCP ツールを呼び出すとき何をしているのかを読み解く助けにもなります。

ご自身のアカウントでお試しください。

ローンチ期間中は無料、カード登録不要。接続して一度書くだけで、Shagerが公開して計測します。