この記事でやること
- Codex CLIからosFoundryのエージェント・チーム・ループのセッションに仕事を渡すとき、どの席とスコープを選べばいいかを整理します
- 引き継ぎの提案(
propose_session_handoff)とrunの依頼(request_session_run)の使い分けを、表で確認します - 呼び出しが通らないときに、どこを順に見ればいいかをまとめます
前提・環境
- Codex CLIからosFoundryのMCPサーバー(
https://api.osfoundry.io/api/v1/external-mcp)に接続済み。接続の作り方は省略します - 渡し先のセッションは、接続を追加したプロジェクトの中にある
- 記事中のセッション名、ID、文面は表示例です
- Codexのツール名は、MCPのツール名に
mcp__osfoundry__が付いた形で見えます
使うツールは7つ
| ツール | 何をするか | スコープ | 読み取り専用 |
|---|---|---|---|
propose_session_handoff |
オーナーに引き継ぎを提案する。承認されるまでrunは始まらない | osfoundry:write |
いいえ |
cancel_session_handoff |
自分が出した提案を、承認前に取り下げる | osfoundry:write |
いいえ |
request_session_run |
Runner席のセッションに、上限付きのゴールをキューに入れる | osfoundry:run |
いいえ |
read_session_state |
セッションの状態と直近のタスクを読む | osfoundry:read |
はい |
read_session_task_result |
この接続が始めたタスクの状態と結果を読む | osfoundry:read |
はい |
read_session_mail |
この接続宛てのノートと、自分が投稿したノートを読む | osfoundry:read |
はい |
post_session_note |
セッションに名前付きのノートを投稿する。runは起きない | osfoundry:write |
いいえ |
~/.codex/config.toml で default_tools_approval_mode = "writes" にしておくと、読み取り専用でない4つの前でだけCodexが確認を出します。
席とスコープの組み合わせ
席はConnectedタブの「Agent, Team, and Loop sessions」で、セッションごとに選びます。スコープはCodexの config.toml の scopes と、サインイン時の「Requested capabilities」で決まります。両方そろって初めて呼べます。
| やりたいこと | 席 | 必要なスコープ |
|---|---|---|
| 状態と結果を見るだけ | Viewer(Observer) | osfoundry:read |
| ノートを書く、引き継ぎを提案する | Contributor |
osfoundry:read, osfoundry:write
|
| 承認なしでrunを始める | Runner | 上記に加えて osfoundry:run
|
[mcp_servers.osfoundry]
url = "https://api.osfoundry.io/api/v1/external-mcp"
scopes = ["osfoundry:read", "osfoundry:write"]
default_tools_approval_mode = "writes"
上はContributor向けの例です。osfoundry:run を入れていないので、仮にRunner席を与えてもrunは始められません。提案だけさせたいときの安全側の設定です。
提案とrun、どちらを使うか
| 観点 | propose_session_handoff |
request_session_run |
|---|---|---|
| 誰が承認するか | オーナーがその都度「Accept and run」 | Runner席を与えた時点で承認済み |
| 必須項目 | goal, context_summary, requested_output など6つ | goal など4つ |
| goalの上限 | 5,000文字 | 10,000文字 |
| ほかの上限 | context_summary 5,000文字、requested_output 1,000文字 | なし |
| max_rounds | 1〜10(省略可) | 1〜10(省略可) |
| 取り消し | 承認前なら cancel_session_handoff
|
取り消すツールはない |
迷ったら提案にしておくのが無難です。オーナーは「Outside assistant requests」でゴールと要約を読んでから決められます。毎回同じ種類の仕事を頼むループなど、オーナーがもう中身を分かっている相手にだけRunnerを使う、という分け方がしっくりきます。
max_rounds の既定値はスキーマに書かれていません。回数を気にするなら明示して送ってください。オーナーには「Up to N rounds on your agent runtime」として表示されます。
提案を書くときのコツ
オーナーが読んで判断する文面なので、Codexへの指示文ではなく、人への依頼文として書かせます。
{
"session_type": "loop_session",
"session_id": "…",
"goal": "今週分のリリースノート下書きを作る",
"context_summary": "mainに入った変更は3件。PR #212 CSVエクスポートの1万行上限を撤廃、PR #215 請求書PDFのフォント修正、PR #218 ログ出力の整理(ユーザー影響なし)。",
"requested_output": "ユーザー向けの箇条書き3点以内。#218は載せない。",
"max_rounds": 3,
"idempotency_key": "codex-relnote-2026w45"
}
-
context_summaryには、セッション側が知らないことだけを書く。リポジトリの中身はセッションから見えません -
requested_outputは形と量を決めておく。返ってきたものをread_session_task_resultで読むとき、確認がしやすくなります -
idempotency_keyは「何を頼んだか」が分かる値にする。リトライしても同じ提案が二重にできません
渡したあとの確認
-
read_session_stateで、状態と直近のタスクを見る。osFoundry側の画面では、外部からの依頼のきっかけは「Requested by an outside assistant」と表示されます -
read_session_task_resultで、自分が始めたタスクの結果を読む。他の接続のタスクは読めません - 補足があれば
post_session_noteで返す。runは起きないので、追加作業が要るなら改めて提案します - 返事は
read_session_mailで読む。1回20件までで、古いものはbefore_idで辿ります。セッション内部のエージェントの分析は含まれません
呼び出しが通らないときに見るところ
上から順に確認すると早いです。
1. スキーマで弾かれていないか
サーバーは入力をスキーマで検証します。よくあるのは次の4つです。
- 引き継ぎの
goalが5,000文字を超えている。runなら通る長さでも、提案では長すぎます -
context_summaryかrequested_outputがない -
max_roundsが0か11以上 -
modelなど、スキーマにない欄を足している。additionalProperties: falseなので弾かれます。セッションのモデルは呼び出し側からは選べません
2. 席が足りているか
Connectedタブで、その接続の席を確認します。Viewerでは書き込み系は呼べません。runの依頼はRunnerだけです。
3. スコープが足りているか
config.toml の scopes を変えたら、codex mcp login osfoundry でサインインし直します。サインイン画面の「Requested capabilities」に「Run sessions where you grant a runner role」が出ていなければ、osfoundry:run は入っていません。
4. オーナーの判断待ちではないか
提案は、オーナーが押すまで pending のままです。オーナーには「Codex CLI requests a handoff」の通知が出ています。Declineされた提案は戻りません。必要なら文面を直して出し直します。
5. ローカルにしかないものを渡そうとしていないか
サーバーの initialize の返事は「Local-only data is unavailable to cloud clients.」です。デスクトップのローカルフォルダや未同期のアイテムは、セッション側からも見えない前提で文面を書きます。
まとめ
- 席(Viewer / Contributor / Runner)とスコープ(read / write / run)の両方がそろって、初めてツールが呼べる
- 人に判断してほしいなら
propose_session_handoff、事前に任されているならrequest_session_run - 提案は人が読む文面として書き、
context_summaryにはセッションが知らないことだけを入れる - 結果はこの接続が始めたタスクの分だけ返り、セッション内部の分析は返らない
セッションの中で何が見えるかはエージェントセッションのページ、引き継ぎの全体像はハンドオフのページにまとまっています。