codex-in-claude
codex-in-claude is a deprecated FastMCP plugin that lets Claude Code call OpenAI Codex for second opinions, git-diff reviews, and delegated coding tasks — read-only by default, with worktree-isolated edits returned as unapplied diffs.
Consult (paid, read-only):
codex_consult/codex_consult_asyncask Codex a question or repo-grounded query; returns summary, findings, next steps, assumptions.Review (paid, read-only):
codex_review_changes/codex_review_changes_asyncreviewworking_tree,branch, orcommitchanges and return structured findings withverdict,confidence, andcoverage(disclosing omitted/truncated/redacted files).Delegate (paid, propose tier):
codex_delegate/codex_delegate_asyncimplement a task in a throwawayworkspace-writegit worktree and return a reviewablediffthat is never auto-applied.Free previews:
codex_dry_runandcodex_delegate_dry_runshow scope, diff size, redactions, prompt bytes, and worktree baseline before spending.Free readiness/discovery:
codex_status(CLI found, version, auth, rate-limit windows),codex_capabilities(tool inventory + fingerprint),codex_models(advisory model slugs and reasoning efforts).Session transfer (free):
codex_transferconverts a Claude Code transcript into a resumable Codex thread and returns acodex resume <thread_id>command.Background-job lifecycle (free):
codex_job_status,codex_job_result,codex_job_consume_result,codex_job_cancel,codex_job_list— disk-backed, survive restarts, poll withpoll_after_ms.Safety posture: consult/review are strictly read-only; delegate's writes are confined to a temp worktree (plus OS temp roots); secret redaction is best-effort on gathered diffs and returned text; no
--dangerously-bypass-*flags are ever passed.Slash-command wrappers:
/codex:status,/codex:consult,/codex:review,/codex:delegate,/codex:delegate-async,/codex:dry-run,/codex:transfer.
Enables Claude Code to call OpenAI Codex for independent second opinions, structured code review, and delegated coding tasks in a safe, isolated environment.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@codex-in-claudereview my git changes"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
codex-in-claude
Call OpenAI Codex from Claude Code — an independent second opinion, structured code
review, and delegated coding tasks (cross-model review) — through a FastMCP plugin that drives
the codex CLI safely.
Deprecated. codex-in-claude is superseded by amicus,
which calls Codex and other backends (Kimi, Claude Code) through one MCP server.
0.24.0 is the final release. The repository is archived after it ships: installed versions
keep running, but get no fixes or releases. New users should install amicus. Each tool's
deprecation marker (in its _meta and its codex_capabilities entry) names its amicus successor,
except codex_transfer, which has none.
Contents: Why · Quick start · Example · Requirements · Tools · Skills · Result envelopes · Safety · Configuration · Troubleshooting · Local development
Why
A second model is a cheap, high-value check. codex-in-claude lets a Claude Code session hand
Codex a question, a diff to review, or a task to implement — and get back a structured,
safe-by-default result you stay in control of.
Tier | Codex sandbox | Where edits go | Use for |
|
| nothing — text/findings only | questions, second opinions |
|
| nothing — structured findings | reviewing your git changes |
|
| worktree diff → returns a reviewable diff, never auto-applied | delegating a coding task |
An opt-in apply tier for live-tree edits was planned but never shipped, and no tool exposes it.
Related MCP server: claude-code-codex-agents
Quick start
First, in a terminal, make sure the codex CLI is installed and log in (a no-op if you already are):
codex loginThen, inside a Claude Code session, add the marketplace and install the plugin:
/plugin marketplace add briandconnelly/codex-in-claude
/plugin install codex-in-claudeThen run /codex:status in Claude Code. It is free (no model call) and checks that the codex
CLI is found, authenticated, and within the tested compatibility range.
For a first useful run:
/codex:consult is this approach sound?for a read-only second opinion./codex:reviewto review your current git changes./codex:delegate add focused tests for this behaviorto get a proposed diff in an isolated worktree.
The MCP server is launched on demand via uvx from a pinned PyPI release, so updates are deliberate.
Example
Review your uncommitted changes from a Claude Code session:
/codex:review
Codex inspects the diff read-only and returns a structured result envelope (abridged):
{
"ok": true,
"tool": "codex_review_changes",
"verdict": "concerns",
"confidence": "high",
"review_status": "completed",
"coverage": { "status": "complete", "untracked_files_detected": 0, "untracked_files_omitted": 0, "omission_reasons": [], "redaction": null },
"summary": "The retry path is correct, but the backoff delay leaks between calls and the new branch has no test coverage.",
"findings": [
{
"severity": "high",
"title": "Backoff delay is never reset after a success",
"file": "src/app/retry.py",
"line": 42,
"evidence": "self._delay keeps its last value once a call succeeds",
"risk": "A later transient failure starts from an inflated delay, adding latency.",
"recommendation": "Reset self._delay to the base delay in the success branch."
}
],
"next_steps": ["Add a regression test asserting the delay resets after a success"],
"meta": { "scope": "working_tree", "sandbox": "read-only", "elapsed_ms": 8137 }
}verdict is one of pass / concerns / fail / unknown; confidence is low / medium /
high; every finding carries a severity (critical … nit) plus evidence, risk, and
recommendation. verdict is the safe overall conclusion: review_status tells you whether the
model actually ran (a tree with nothing reviewable returns not_run/unknown, never a false
pass), and coverage discloses anything the model was not shown — omitted untracked files
(governed by the untracked policy), a truncated diff, or a redacted file — downgrading a pass
over partial coverage to unknown. The envelope above is abridged — meta (always present, with cwd, tier,
sandbox, isolation, and timing), request_id, raw_response, and other fields are trimmed for
brevity; see docs/REFERENCE.md for the complete shape.
Requirements
macOS or Linux (POSIX). Windows is not supported natively — the async-job safety layer (file locks, process groups, signal-driven cancellation) is POSIX-only. Run it under WSL2 on Windows. See
COMPATIBILITY.mdfor the platform contract.The
codexCLI onPATH, authenticated (codex login— ChatGPT or API key). Tested againstcodex-cli 0.152; the supported range lives incli_contract.py,/codex:statusreports whether your version is in range, andCOMPATIBILITY.mdexplains the policy.uvonPATH(Claude Code launches the MCP server withuvx).Python 3.11+ available to
uvx.git(for review and delegate).
Tools
Active (call the model and may spend tokens):
codex_consult(question, …)— read-only second opinion / answer.codex_review_changes(scope, base, commit, paths, …)— reviewworking_tree/branch/commit; returns structured findings.Both consult and review (sync and
_async) also takedeveloper_instructions— optional caller stance/focus text placed in Codex's developer turn behind this server's always-leading framing (max 4096 bytes; stripped, blank = omitted; refused pre-spend if it carries the server's framing markers). It grants no tools and Codex is instructed — not compelled — to keep verdicts its own; compliance with the rest of the text is best-effort for the same reason, and may be silent, someta's fingerprint attests the request the server accepted and staged, not what the model did with it. The text rides the codex command line and the background-job record on disk, so never put secrets in it, and resultmetareports only its{sha256, bytes}. Deliberately not oncodex_delegate: delegate edits files, so a caller stance there would widen what an untrusted workspace can steer. Full contract: thecodex://paramsresource.codex_delegate(task, …)— implement a task in an isolated worktree; returns a reviewablediffthat is not applied.codex_consult_async(question, …),codex_review_changes_async(scope, base, commit, paths, …),codex_delegate_async(task, …)— detached variants of the three active tools, taking the same arguments as their synchronous forms: each returns ajob_idimmediately. Starting a job commits to spend (it runs to completion or its deadline); poll withcodex_job_status/codex_job_result.
Free (local only):
codex_status— readiness, version, auth, resolved defaults, and arate_limitblock (remaining Codex quota for the shorter/rolling and longer windows, read live from the Codex app-server with no model spend;statusisavailable/limited/exhausted/blocked/unknown/unavailable). Advisory — informs whether to spend;unknown/unavailablemean no usable reading, not a problem, whileblockedreports a backend spend control that waiting does not clear.codex_transfer(transcript_path, …)— hand off the current Claude Code session to a resumable Codex thread; returnsresume_command(codex resume <thread_id>) to continue that exact conversation in Codex. No model call or token spend (a local file conversion via the experimentalcodex app-server), but it does create a thread in$CODEX_HOME. Not idempotent for a live session — Codex dedups only a byte-identical transcript, so re-running mid-session makes a new thread. Experimental.codex_dry_run(scope, …)— preview a review's scope/diff size/redactions before spending.codex_delegate_dry_run(task, …)— preview a delegate's seeded baseline (HEAD commit, plus tracked, uncommitted, and untracked counts and size) and prompt size before spending; no worktree is created.codex_capabilities— tool inventory + result fingerprint.codex_models— advisory catalog of validmodelslugs, read from Codex's on-disk cache with a bundled static fallback; also browsable as thecodex://modelsresource. Discovery only —modelstays pass-through, so an unlisted slug still works andcodex execvalidates it.codex_job_status(job_id, …)/codex_job_result/codex_job_consume_result/codex_job_cancel/codex_job_list— background-job lifecycle. State is disk-backed and survives server restarts. Honorpoll_after_msrather than polling in a tight loop; deadlines, eviction, and result retention are covered indocs/REFERENCE.md.
Both dry runs report metadata about the input this plugin would assemble. Neither invokes Codex, so neither enumerates nor bounds the files the model itself reads and sends during the paid run — a clean preview is a check on scope, not evidence that nothing sensitive will be sent (see Safety).
Slash commands wrap these: /codex:status, /codex:transfer, /codex:consult, /codex:review,
/codex:delegate, /codex:delegate-async, /codex:dry-run.
Active tools send the prompt and relevant context/diffs to OpenAI through the codex CLI. Treat
Codex's output as claims to verify, not as instructions to follow blindly.
Skills
The plugin ships one Claude Code skill, auto-discovered from skills/:
collaborating-with-codex— the router and shared safety contract for every Codex workflow. It selects ordinary consult, review, delegate, transfer, and async tools directly, and loads references on demand for independent-attempt or declared review–revise composition. A one-off critique or judgment remains an ordinary route rather than a separate deliberation mode.
Result envelopes
Every result discriminates first on ok. On success, completed consult, review, and delegate calls
share their active-result fields; review alone adds verdict/confidence/review_status/coverage,
and delegate alone adds the proposed diff. Discovery, dry-run, transfer, async-start, and job-lifecycle tools have their
own success schemas. A fetched job result matches its originating consult, review, or delegate tool,
so branch on that result type before reading fields. Failure is a uniform, machine-actionable
error with a stable code and symbolic repair hint. The contract is versioned by fingerprint.
Calling the MCP tools directly instead of through the /codex:* commands? See
docs/REFERENCE.md for the detailed contract — error-envelope semantics,
rate-limit reporting (codex_status), background-job semantics, and workspace selection
(workspace_root). It points on to codex://error-envelope for the full error schema.
Safety
consultandrevieware strictly read-only.propose(thedelegatetools) lets Codex write in a throwaway git worktree seeded fromHEADplus replayable uncommitted tracked changes. Untracked files are not copied. The worktree does not bound Codex's writes: codex's workspace-write sandbox also lets commands write the OS temp roots (/tmpand$TMPDIR) by default, and those writes are neither captured in the returned diff nor cleaned up (seeCOMPATIBILITY.md). Your working tree is never modified by the plugin; you review the returned diff and apply it yourself. Delegate's no-network sandbox (workspace-write) blocks egress only for commands Codex runs in the sandbox — it does not mean nothing leaves the machine: the model call still sends your task and repo context to OpenAI.Do not target a workspace containing secrets you cannot disclose. Supplied prompts and context (
question,task,extra_context, and similar author input) are sent raw. During every active call — including consult — Codex may read files outside the resolved workspace, up to everything the OS user running codex can read, and send them to OpenAI: the sandbox bounds writes, not reads, so no choice of workspace is a read boundary, and a prompt-injected repository can direct those reads anywhere that user can reach. Codex also pulls in context implicitly:AGENTS.mdis auto-loaded from the resolved workspace and — inside a repository — from every ancestor directory up to the repository root, so narrowing the workspace to a subdirectory does not exclude the repo-root file; plus a user-global$CODEX_HOME/AGENTS.override.md, else$CODEX_HOME/AGENTS.md, which loads on every call from any workspace. Skills under.agents/skills/— plus your user-global Codex skills under$CODEX_HOME/skills/(default~/.codex/skills/) — are auto-discovered by name and description, and a skill the model then selects has its body read in as well. Either way the content can be sent to OpenAI even if your prompt never mentions it (for delegate, the versions seeded into the throwaway worktree apply there; the user-global skills are reachable regardless of workspace, since they are discovered from outside it). The plugin's isolation flags do not suppress any of this — including--ignore-user-config, which drops$CODEX_HOME/config.tomlbut not$CODEX_HOME/skills/. Details, the verifying probe, and the remaining unverified edge cases are inCOMPATIBILITY.md.Redaction is output/diff defense-in-depth, not input protection and not a guarantee. It protects gathered diffs and returned free text (
summary,findings,raw_response.text): secret-looking file hunks are dropped, and inline matches are replaced with[redacted: secret value]— no affirmative sign the match stopped short, which is not the same as proof it's complete — or[redacted: possibly partial secret value]when it finds one: a trailing character the matched text's own alphabet could not have produced (the value may continue past the marker), or a leading character that could continue the same token (the match may have started mid-token). Neither marker is a guarantee either way: a free-form secret can contain almost any character, and flagging every unusual neighbor as suspect would fire on nearly every redaction and stop meaning anything.Control characters are deleted from the same returned free text, before redaction runs — an escape sequence in an envelope can corrupt or spoof how it renders, and one wedged into a secret would defeat the redactor.
raw_response.textand machine fields (a reviewverdict, a finding'sfile, an argument name) are deliberately left alone; seedocs/REFERENCE.md.The plugin never passes Codex's
--dangerously-bypass-*flags.Found a vulnerability? Report it privately — see
SECURITY.md.
Configuration (env, CODEX_IN_CLAUDE_*)
Var | Default | Meaning |
| unset | Codex model override |
| unset | Codex reasoning-effort override, sent as a |
| 300 | per-call timeout (clamped 10–600) |
|
|
|
| unset | extra global |
| 200000 | byte cap on author input: gathered diffs are truncated to it, author text above it is rejected with |
| 200000 | cap on the inline diff a delegate run returns; larger diffs are truncated with |
| 10485760 | byte cap for captured stdout (head+tail window; run not killed); stderr is bounded to a separate ~1 MiB reserve |
| 60 | git command timeout |
|
| disk-backed background-job records |
| 86400 | seconds a finished job record is kept (min 60) |
| 1800 | background-job wall-clock cap (clamped 60–7200) |
| 50 | retained jobs per workspace (clamped 1–1000); a soft cap — only terminal records are evicted, so a busy workspace can hold more |
| built-in tested set | comma-separated |
|
| server diagnostic log level ( |
| unset | also mirror diagnostic logs to this file path |
| unset | set to |
| unset | explicit override for which |
Two further variables, CODEX_IN_CLAUDE_TIER_DEFAULT and CODEX_IN_CLAUDE_SANDBOX_DEFAULT, were
added for that unshipped apply tier. They only change the defaults codex_status reports — every
shipped tool pins its own tier and sandbox and ignores them.
Troubleshooting
Run /codex:status first — it's free (no model call) and diagnoses most setup problems.
Symptom | Cause | Fix |
| CLI not installed or not on | |
Not authenticated | No Codex login |
|
Unsupported-version warning | Your | Update |
| Server fell back to its own launch directory | Run from the target repo, or pass |
| The temp worktree is seeded from | Make at least one commit first |
| Account hit a usage/rate limit | Back off for |
| The stdio MCP server is down | Reconnect with the |
A stdio MCP server can't be transparently auto-restarted (the client owns the pipe and the
initialize handshake), so recovery is a manual reconnect. On a fatal crash the server writes a
breadcrumb to stderr (server name, version, reason, and a /mcp reconnect hint) before exiting,
and logs clean disconnects (EOF / broken pipe / SIGINT / SIGTERM) as shutdown rather than crashes
— so the server logs tell you whether it died or was stopped.
If the MCP server is down, you can fall back to the codex CLI directly for a read-only consult or
review (prompt on stdin; set WORKSPACE to the directory Codex should work in — note it
selects where Codex works, not what it can read, so approve the exposure of anything the OS
user can reach, not just that tree):
WORKSPACE=/absolute/approved/path codex exec --sandbox read-only --ephemeral \
--ignore-user-config --ignore-rules --disable remote_plugin --disable sleep_tool \
--cd "$WORKSPACE" --skip-git-repo-check -Keep every flag — together they apply the plugin's guarantee-bearing flags at its strictest config
isolation, plus --disable sleep_tool, which is spend hygiene rather than a guarantee (it removes
Codex's native sleep tool — see COMPATIBILITY.md → "Sleep tool" — and here no server deadline
would cut a sleep short) — but this still bypasses the plugin's diff gathering, secret redaction, input-byte
bounding, and structured envelope, so sanitize input yourself and prefer restoring the server. See
the collaborating-with-codex skill for the full fallback guidance.
Local development
uv sync
uv run pytest # unit tests (95% coverage floor)
uv run pytest -m integration --no-cov # live tests; needs codex installed + logged in
uv run codex-in-claude-mcp # run the MCP server over stdioThe full pre-PR gate — lint, format, types, tests — is defined once in
AGENTS.md → Tooling.
To test the plugin from a local checkout, point .mcp.json at
uv run --project /path/to/codex-in-claude codex-in-claude-mcp instead of the version-pinned
uvx --from codex-in-claude==<version> invocation it ships with.
See CONTRIBUTING.md for branch, commit, and PR conventions.
Related projects
claude-in-codex— the mirror image: lets Codex call Claude Code.Inspired by
openai/codex-plugin-cc, rebuilt aroundcodex execfor robustness: every paid call goes through it, and onlycodex_transfertouches the experimental app-server protocol.
License
MIT
Available Tools
17 toolscodex_capabilitiesList server capabilities (free)ARead-only
Deprecated: use amicus_capabilities. List this server's tools, tiers, and the result fingerprint. Free — no model call. Clients can cache by the fingerprint.
detail="summary" (default) returns each tool's name, cost, stability, error_codes,
and deprecation marker — the facts tools/list does not already carry — plus
async_lifecycle, but only for the *_async tools. detail="full" adds
use_when/returns/required_params/key_optional_params, restating what you already hold.
detail="contracts" omits tool_details.
Pass include_schemas to also embed the full 'error-envelope', 'result-meta', 'capabilities-result', and/or 'status-result' schema, and/or the 'parameter-contracts' document (a contract doc, not a JSON Schema) — a tool-reachable fallback to the codex:// resources for resource-blind clients. It works in any detail mode.
| Name | Required | Description | Default |
|---|---|---|---|
| detail | No | What to return: 'summary' (default) returns each tool's name, cost, stability, error_codes, and deprecation marker; the *_async tools also get async_lifecycle. 'full' adds use_when, returns, and the parameter lists (which tools/list already carries). 'contracts' drops tool_details: fetch a schema, or recheck fingerprint, without re-paying for the inventory. | summary |
| include_schemas | No | Opt-in tool-reachable fallback for resource-blind clients: also embed the full 'error-envelope', 'result-meta', 'capabilities-result', and/or 'status-result' schema, and/or the 'parameter-contracts' document (a contract doc, not a JSON Schema, sourced from the codex://params resource body), in the response — the default payload omits them and points at the codex:// resources instead. |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover readOnlyHint and openWorldHint, so the description's added value is the cost and caching profile: 'Free — no model call' and 'Clients can cache by the fingerprint,' plus the deprecation status. These are behavioral facts annotations cannot express. It stops short of explaining what the fingerprint is or how staleness is handled, keeping it below 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The deprecation notice is front-loaded, and each subsequent sentence maps to a distinct concern (cost/caching, detail modes, include_schemas). It is dense with backticked tokens but has little waste; the include_schemas sentence is the longest and slightly overloaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, return values need no prose, and the description still covers deprecation, cost, caching, all three detail modes, and the schema-embedding escape hatch. The only soft spot is the unexplained term 'tiers' and the fingerprint's semantics, which an agent may want when reasoning about cache validity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3, but the description adds genuine meaning: it explains that 'contracts' omits tool_details specifically so a caller can recheck a fingerprint without re-paying for the inventory, and frames include_schemas as a fallback for resource-blind clients. That rationale goes beyond the schema's field-level text.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: 'List this server's tools, tiers, and the result fingerprint,' which is concrete and distinct from the job/job-status siblings. It does not explicitly contrast with codex_status or codex_models, but the deprecation pointer to amicus_capabilities gives the agent a routing decision it can act on.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It names the replacement tool and the condition that selects it ('Deprecated: use amicus_capabilities'), which is the strongest form of when-not-to-use guidance. It also gives per-mode guidance, including the notable caveat that detail="full" mostly restates what the caller already holds from tools/list, so the agent can pick the cheapest sufficient mode.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
codex_consultConsult Codex (paid)A
Deprecated: use amicus_consult. Ask Codex (a different model) for a read-only second opinion or answer.
PAID — this spends Codex quota on every new call; there is no dry-run preview for a consult, so run codex_status (free) first to confirm the CLI is installed and authenticated.
Runs codex exec in a read-only sandbox — Codex never edits files. A STATIC
review, not a verify mode: the read-only sandbox blocks the writes a
test/build/lint run needs, so Codex can't run your checks to confirm its claims —
treat findings as unvalidated claims you verify yourself. Pass workspace_root
(absolute) for a repo-grounded question; omit it for pure Q&A. Returns a result
envelope.
Data egress: this sends your question, extra_context, and
developer_instructions to OpenAI via the
codex CLI. Codex always runs with a resolved working directory (workspace_root,
your MCP roots, or the server's cwd as a fallback) — that selects where it works,
not what it can read.
Codex can read files outside the workspace — up to everything the OS user running it can
read — and send them to OpenAI. The sandbox bounds writes, not reads, so no choice of
workspace is a read boundary. Codex auto-loads the resolved workspace's AGENTS.md and, in a
repository, ancestor AGENTS.md files through its root, plus a user-global
$CODEX_HOME/AGENTS.override.md, else $CODEX_HOME/AGENTS.md; it discovers skills in the
workspace's
.agents/skills/ and user-global $CODEX_HOME/skills/ (default ~/.codex/skills/),
reachable from outside the workspace. The plugin's
isolation flags don't suppress any of it. A skill's name and description arrive up
front; selecting one makes the model read its body, which can reach OpenAI even if
your inputs never mention it. Your inputs are sent raw — secret
redaction is best-effort and does not cover them (it covers gathered diffs and
Codex's returned output, not what you type or what Codex reads from files).
Progress & recovery: blocks up to the resolved deadline (timeout_seconds, clamped
10-600s; when omitted, the server-configured value, built-in default 300s). If that deadline
expires the run is terminated and its partial output is not recoverable or resumable, so for a
high-reasoning_effort or broad repo-grounded consult that may exceed it, prefer
codex_consult_async (a background job, built-in default 1800s deadline; poll
codex_job_status). Coarse notifications/progress streams while it blocks when your client
requests it; some MCP clients background a long call before the deadline, so
timeout_seconds bounds the run, not necessarily the inline wait — either way the detached run
(meta.job_id) is recoverable via codex_job_list→codex_job_status→codex_job_result.
| Name | Required | Description | Default |
|---|---|---|---|
| model | No | Override the Codex model slug for this call; defaults to the server/Codex default when unset. Control characters are rejected, not stripped. | |
| detail | No | Response verbosity: 'summary' (default) omits the raw model text; 'full' includes it. | summary |
| question | Yes | The question or prompt to send Codex (a different model) for a read-only answer. Must be non-blank: empty or whitespace-only is rejected before any model call. | |
| isolation | No | Codex config isolation: 'inherit' | 'ignore-config' | 'ignore-rules'. Defaults to the server's configured value (built-in 'inherit'; `codex_status` reports the resolved one). | |
| extra_context | No | Optional author intent/background context, added as clearly-labeled UNTRUSTED prompt data. Redaction does NOT cover it — no live secrets. Full caveats and bounds: codex://params. | |
| workspace_root | No | Absolute path to the target repo root — pass it (or an MCP root) to target the intended repo; otherwise the call falls back to the server's own cwd and sets meta.workspace_warning. On an active call it selects where Codex works, not what it can read — it is not a read boundary. | |
| idempotency_key | No | Optional dedup key scoped to THIS tool + workspace. Same key + same args replays the prior result with no new spend; different args are refused (idempotency_conflict). Sync and _async are separate tools and never share a key. Omit for none; retention is bounded. Lifecycle: codex://params. | |
| timeout_seconds | No | Per-call wall-clock timeout in seconds, clamped to 10..600 (out-of-range values are coerced, not rejected). Defaults to the server's configured timeout. | |
| reasoning_effort | No | Override the Codex reasoning effort for this call (a model_reasoning_effort override); omit or pass null for the server default (CODEX_IN_CLAUDE_REASONING_EFFORT) or Codex's own resolution. An open, per-model string the backend validates at run time — commonly minimal|low|medium|high|xhigh; codex_models lists each model's advertised set (advisory). Rejection and bounds detail: codex://params. | |
| developer_instructions | No | Optional caller stance/focus text for Codex's developer turn, placed BEHIND this server's always-leading framing; omit for no developer override. UNTRUSTED — never build it from workspace content; grants no tools; Codex is instructed, not compelled — verdicts stay its own, and compliance with the rest is best-effort and may be silent. Rides the codex command line and the background-job record on disk — never put secrets here; meta reports only {sha256, bytes}. Stripped; blank = omitted; max 4096 bytes. Full contract: codex://params. |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes far beyond the annotations: discloses data egress to OpenAI, that the sandbox bounds writes not reads, AGENTS.md/skills auto-loading reachable from outside the workspace, redaction gaps for raw inputs, deadline/termination semantics, and recovery via meta.job_id. This is unusually thorough behavioral context for a network-spending tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the deprecation notice and the PAID warning before details, and uses clear labeled paragraphs (Data egress, Progress & recovery). It is long, but the density is justified by safety-critical egress and recovery information rather than repetition; a little could still be trimmed.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, return values need no explanation; the description still notes 'Returns a result envelope.' Combined with egress, timeout, progress, and recovery coverage, an agent has everything needed to invoke it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents each parameter and baseline would be 3. The description adds usage-level meaning beyond the schema: when to pass workspace_root (and that it is not a read boundary), that timeout_seconds is clamped 10-600, and the async preference for high-effort calls.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource — 'Ask Codex (a different model) for a read-only second opinion or answer' — and immediately routes deprecated callers to amicus_consult. It also distinguishes itself from codex_consult_async and codex_review_changes by naming the static-review vs verify-mode distinction.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly says to run codex_status (free) first, when to pass workspace_root ('repo-grounded question') vs omit it ('pure Q&A'), and when to prefer codex_consult_async (high reasoning_effort or broad consults exceeding the deadline). When-to-use, prerequisites, and alternatives are all present.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
codex_consult_asyncConsult Codex in background (paid)A
Deprecated: use amicus_consult_async. Ask Codex for a read-only second opinion in the background; get a job_id
back immediately instead of blocking.
PAID — this spends Codex quota on every new call; there is no dry-run preview for a consult, so run codex_status (free) first to confirm the CLI is installed and authenticated.
Same read-only behavior as codex_consult (Codex never edits files), but detached —
prefer it for a high-reasoning_effort or broad repo-grounded consult that can exceed the
synchronous deadline (built-in default 300s), since a sync run whose deadline expires loses
its partial work; this job's own deadline is separately configured (built-in default 1800s).
Starting a job commits to spend (it runs to completion or its wall-clock deadline even if
you never poll). Poll codex_job_status; read/consume the consult envelope with
codex_job_result/codex_job_consume_result; stop with codex_job_cancel.
Data egress: same as codex_consult — sends your question, extra_context, and
developer_instructions
(raw, unredacted) to OpenAI via the codex CLI. Its resolved working directory
(workspace_root, your MCP roots, or the server cwd) selects where Codex works, not
what it can read.
Codex can read files outside the workspace — up to everything the OS user running it can
read — and send them to OpenAI. The sandbox bounds writes, not reads, so no choice of
workspace is a read boundary.
Codex auto-loads the resolved workspace's AGENTS.md and, in a repository, ancestor
AGENTS.md files through its root, plus a user-global $CODEX_HOME/AGENTS.override.md,
else $CODEX_HOME/AGENTS.md; it discovers skills in the workspace's .agents/skills/ and
user-global
$CODEX_HOME/skills/ (default ~/.codex/skills/), reachable from outside the workspace. A
skill's name and
description arrive up front; selecting one makes the model read its body, which can
reach OpenAI even if your inputs never mention it.
| Name | Required | Description | Default |
|---|---|---|---|
| model | No | Override the Codex model slug for this call; defaults to the server/Codex default when unset. Control characters are rejected, not stripped. | |
| question | Yes | The question or prompt to send Codex (a different model) for a read-only answer. Must be non-blank: empty or whitespace-only is rejected before any model call. | |
| isolation | No | Codex config isolation: 'inherit' | 'ignore-config' | 'ignore-rules'. Defaults to the server's configured value (built-in 'inherit'; `codex_status` reports the resolved one). | |
| extra_context | No | Optional author intent/background context, added as clearly-labeled UNTRUSTED prompt data. Redaction does NOT cover it — no live secrets. Full caveats and bounds: codex://params. | |
| workspace_root | No | Absolute path to the target repo root — pass it (or an MCP root) to target the intended repo; otherwise the call falls back to the server's own cwd and sets meta.workspace_warning. On an active call it selects where Codex works, not what it can read — it is not a read boundary. | |
| idempotency_key | No | Optional dedup key scoped to THIS tool + workspace. Same key + same args replays the prior result with no new spend; different args are refused (idempotency_conflict). Sync and _async are separate tools and never share a key. Omit for none; retention is bounded. Lifecycle: codex://params. | |
| reasoning_effort | No | Override the Codex reasoning effort for this call (a model_reasoning_effort override); omit or pass null for the server default (CODEX_IN_CLAUDE_REASONING_EFFORT) or Codex's own resolution. An open, per-model string the backend validates at run time — commonly minimal|low|medium|high|xhigh; codex_models lists each model's advertised set (advisory). Rejection and bounds detail: codex://params. | |
| developer_instructions | No | Optional caller stance/focus text for Codex's developer turn, placed BEHIND this server's always-leading framing; omit for no developer override. UNTRUSTED — never build it from workspace content; grants no tools; Codex is instructed, not compelled — verdicts stay its own, and compliance with the rest is best-effort and may be silent. Rides the codex command line and the background-job record on disk — never put secrets here; meta reports only {sha256, bytes}. Stripped; blank = omitted; max 4096 bytes. Full contract: codex://params. |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Far beyond the annotations: it discloses that every call spends paid quota with no dry-run, that starting a job commits to spend (runs to completion or wall-clock deadline even if never polled), full data-egress details (question/extra_context/developer_instructions sent raw and unredacted to OpenAI), and that the sandbox bounds writes but not reads, plus AGENTS.md/skills auto-loading. This is unusually rich operational disclosure.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
It is long (multiple dense paragraphs), but the critical facts are front-loaded — deprecation, purpose, and the PAID warning come first, with caveats layered afterward. Some material (developer_instructions contract, idempotency lifecycle) overlaps the schema, but the length is largely justified by the tool's egress and spend risk profile.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given an output schema exists (so return values needn't be explained) and annotations cover the safety profile, the description still supplies everything an agent needs: cost model, egress boundaries, polling lifecycle, deadline behavior, and the sibling tools to call next. It is complete for a paid, background, data-egress-bearing tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds genuine meaning: it explains that workspace_root selects where Codex works rather than what it can read, and it details the egress implications of question, extra_context, and developer_instructions. It complements rather than repeats the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The opening states a specific verb and resource — 'Ask Codex for a read-only second opinion in the background; get a job_id back immediately instead of blocking' — and immediately marks itself deprecated in favor of amicus_consult_async. It cleanly distinguishes itself from the synchronous sibling codex_consult. An agent can tell exactly what it does without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit when-to-use and when-not guidance: run codex_status (free) first, prefer this over sync for high-reasoning_effort or broad repo-grounded consults that can exceed the 300s sync deadline (sync loses partial work; this job's default is 1800s). It also names the full lifecycle of companion tools (codex_job_status/result/consume_result/cancel) and the deprecation alternative. Nothing is left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
codex_delegateDelegate a coding task (paid)ADestructive
Deprecated: use amicus_delegate. Delegate a coding task to Codex (a different model) in an isolated git worktree, and get back a reviewable diff that is NOT applied to your tree.
PAID — this spends Codex quota on every new call; use codex_delegate_dry_run or codex_status (both free) first if you only need to check scope or readiness.
Codex edits files with workspace-write in a throwaway worktree seeded from
your current tracked state. The returned diff is Codex's changes;
review it, then apply it yourself if you want it. Requires a git repo with at
least one commit. Pass workspace_root (absolute).
NO NETWORK: workspace-write blocks network egress for commands Codex RUNS in the
sandbox, so the task must be self-contained — it cannot git push/fetch, gh
anything, curl, publish, or install dependencies (those fail inside the sandbox
with a DNS/host-resolution error). Ask only for local code changes; do any network
step yourself afterward. This does NOT mean nothing leaves the machine: the Codex
model call still sends your task to OpenAI. The worktree does not bound Codex's
writes: codex's workspace-write sandbox also lets commands write the OS temp roots
(/tmp and $TMPDIR) by default. Temp-root writes are neither captured in the
returned diff nor cleaned up.
Codex can read files outside the workspace — up to everything the OS user running it can
read — and send them to OpenAI. The sandbox bounds writes, not reads, so no choice of
workspace is a read boundary. Codex auto-loads the resolved workspace's AGENTS.md
and, in a repository, ancestor AGENTS.md files through its root, plus a user-global
$CODEX_HOME/AGENTS.override.md, else $CODEX_HOME/AGENTS.md; it discovers skills in the
workspace's
.agents/skills/ and user-global $CODEX_HOME/skills/ (default ~/.codex/skills/),
reachable from outside the workspace. The plugin's isolation flags don't suppress any of it.
For delegate,
that workspace is the worktree; scrubbing it doesn't exclude $CODEX_HOME/skills/.
A skill's name and description arrive up front; selecting one makes the model read
its body, which can reach OpenAI even if your inputs never mention it.
Your task is sent raw — secret redaction is best-effort and does not cover it or
files Codex reads itself.
Progress & recovery: blocks up to the resolved deadline (timeout_seconds, clamped
10-600s; when omitted, the server-configured value, built-in default 300s). If that deadline
expires the run is terminated and its partial output is not recoverable or resumable, so for a
substantial or multi-file task that may exceed it, prefer codex_delegate_async (a background
job, built-in default 1800s deadline; poll codex_job_status). Coarse notifications/progress
streams while it blocks when your client requests it; some MCP clients background a long call
before the deadline, so timeout_seconds bounds the run, not necessarily the inline wait —
either way the detached run (meta.job_id) is recoverable via
codex_job_list→codex_job_status→codex_job_result.
| Name | Required | Description | Default |
|---|---|---|---|
| task | Yes | The coding task for Codex to implement inside a throwaway git worktree; the resulting diff is returned for review, not applied to your tree. Must be non-blank: empty or whitespace-only is rejected before any model call. | |
| model | No | Override the Codex model slug for this call; defaults to the server/Codex default when unset. Control characters are rejected, not stripped. | |
| detail | No | Response verbosity: 'summary' (default) omits the raw model text; 'full' includes it. | summary |
| isolation | No | Codex config isolation: 'inherit' | 'ignore-config' | 'ignore-rules'. Defaults to the server's configured value (built-in 'inherit'; `codex_status` reports the resolved one). | |
| workspace_root | No | Absolute path to the target repo root — pass it (or an MCP root) to target the intended repo; otherwise the call falls back to the server's own cwd and sets meta.workspace_warning. On an active call it selects where Codex works, not what it can read — it is not a read boundary. | |
| idempotency_key | No | Optional dedup key scoped to THIS tool + workspace. Same key + same args replays the prior result with no new spend; different args are refused (idempotency_conflict). Sync and _async are separate tools and never share a key. Omit for none; retention is bounded. Lifecycle: codex://params. | |
| timeout_seconds | No | Per-call wall-clock timeout in seconds, clamped to 10..600 (out-of-range values are coerced, not rejected). Defaults to the server's configured timeout. | |
| reasoning_effort | No | Override the Codex reasoning effort for this call (a model_reasoning_effort override); omit or pass null for the server default (CODEX_IN_CLAUDE_REASONING_EFFORT) or Codex's own resolution. An open, per-model string the backend validates at run time — commonly minimal|low|medium|high|xhigh; codex_models lists each model's advertised set (advisory). Rejection and bounds detail: codex://params. |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only give destructive/openWorld/readOnly/idempotent hints; the description goes far beyond them, disclosing that the diff is not applied, that Codex runs workspace-write in a throwaway worktree, that network egress is blocked inside the sandbox, that reads are unbounded (not a read boundary), that /tmp and $TMPDIR writes escape the diff and are not cleaned up, that AGENTS.md/skills auto-load from outside the workspace, that task text goes to OpenAI unredacted, and the blocking/timeout/recovery semantics. This is unusually rich behavioral disclosure and consistent with the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loading is excellent — deprecation, successor, and the paid warning come first — but the body is a dense wall of safety caveats with overlapping points (isolation vs. reads repeated across several sentences, temp-root and AGENTS.md/skills detail). Much of this is safety-critical and earns its place, yet the paragraph is longer than it needs to be to convey the same constraints.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For an 8-parameter, destructive, open-world tool with an output schema, the description covers everything an agent needs: cost, non-applied output, sandbox read/write boundaries, network limits, timeout and async recovery paths, and idempotency semantics. Nothing material about calling it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds real meaning beyond the schema: workspace_root 'selects where Codex works, not what it can read — it is not a read boundary', timeout_seconds bounds the run but not necessarily the inline wait, and it flags the free alternatives for scope checks. Parameters like model, detail, isolation, and reasoning_effort are largely left to the schema, so it stops short of a 5.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource (delegate a coding task to Codex) and the key output contract ('reviewable diff that is NOT applied to your tree'), plus a deprecation pointer to amicus_delegate. It explicitly distinguishes itself from codex_delegate_dry_run, codex_status, and codex_delegate_async, so an agent can route correctly without reading any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit when/when-not: 'use codex_delegate_dry_run or codex_status (both free) first if you only need to check scope or readiness', and 'for a substantial or multi-file task that may exceed it, prefer codex_delegate_async'. It also names the no-network constraint that invalidates whole classes of task, which is exactly the kind of routing guidance an agent needs.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
codex_delegate_asyncDelegate in background (paid)ADestructive
Deprecated: use amicus_delegate_async. Delegate a coding task to Codex in the background and get a job_id back
immediately (does not block on the run).
PAID — this spends Codex quota on every new call; use codex_delegate_dry_run or codex_status (both free) first if you only need to check scope or readiness.
Same propose-tier behavior as codex_delegate — Codex works in a throwaway git
worktree and the result carries a reviewable diff that is NOT applied — but
detached; prefer it for a substantial or multi-file implementation task that can exceed the
synchronous deadline (built-in default 300s), since a sync run whose deadline expires loses
its partial work (this job's own deadline is separately configured, built-in default 1800s).
Starting a job commits to spend (it runs to completion or its wall-clock deadline even if
you never poll). Poll codex_job_status; read/consume with
codex_job_result/codex_job_consume_result; stop with codex_job_cancel. Requires a git
repo with at least one commit; pass workspace_root (absolute).
NO NETWORK: like codex_delegate, this runs under workspace-write, which blocks
network egress for commands Codex RUNS in the sandbox — the task must be
self-contained (no push/fetch/gh/curl/publish/dependency install; those fail with
a DNS/host-resolution error in the sandbox). This does NOT mean nothing leaves the
machine: the Codex model call still sends your task (raw) to OpenAI. The worktree
does not bound Codex's writes: codex's workspace-write sandbox also lets commands
write the OS temp roots (/tmp and $TMPDIR) by default. Temp-root writes are neither
captured in the returned diff nor cleaned up.
Codex can read files outside the workspace — up to everything the OS user running it can
read — and send them to OpenAI. The sandbox bounds writes, not reads, so no choice of
workspace is a read boundary. Codex auto-loads the resolved
workspace's AGENTS.md and, in a repository, ancestor AGENTS.md files through its root,
plus a user-global $CODEX_HOME/AGENTS.override.md, else $CODEX_HOME/AGENTS.md; it
discovers skills in
the workspace's .agents/skills/ and user-global $CODEX_HOME/skills/ (default
~/.codex/skills/), reachable from outside the workspace. For delegate, that workspace is
the worktree; scrubbing it
doesn't exclude $CODEX_HOME/skills/. A skill's name and description arrive up
front; selecting one makes the model read its body, which can reach OpenAI even if
your inputs never mention it. Secret redaction is best-effort and
does not cover your task or files Codex reads itself.
| Name | Required | Description | Default |
|---|---|---|---|
| task | Yes | The coding task for Codex to implement inside a throwaway git worktree; the resulting diff is returned for review, not applied to your tree. Must be non-blank: empty or whitespace-only is rejected before any model call. | |
| model | No | Override the Codex model slug for this call; defaults to the server/Codex default when unset. Control characters are rejected, not stripped. | |
| isolation | No | Codex config isolation: 'inherit' | 'ignore-config' | 'ignore-rules'. Defaults to the server's configured value (built-in 'inherit'; `codex_status` reports the resolved one). | |
| workspace_root | No | Absolute path to the target repo root — pass it (or an MCP root) to target the intended repo; otherwise the call falls back to the server's own cwd and sets meta.workspace_warning. On an active call it selects where Codex works, not what it can read — it is not a read boundary. | |
| idempotency_key | No | Optional dedup key scoped to THIS tool + workspace. Same key + same args replays the prior result with no new spend; different args are refused (idempotency_conflict). Sync and _async are separate tools and never share a key. Omit for none; retention is bounded. Lifecycle: codex://params. | |
| reasoning_effort | No | Override the Codex reasoning effort for this call (a model_reasoning_effort override); omit or pass null for the server default (CODEX_IN_CLAUDE_REASONING_EFFORT) or Codex's own resolution. An open, per-model string the backend validates at run time — commonly minimal|low|medium|high|xhigh; codex_models lists each model's advertised set (advisory). Rejection and bounds detail: codex://params. |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes far beyond annotations (destructive/openWorld/not-idempotent): discloses paid quota spend per call, no network egress in sandbox but the task still goes to OpenAI, temp-root writes neither captured nor cleaned, reads not bounded by the workspace, AGENTS.md/skills auto-loading, and best-effort secret redaction. The idempotency_key replay behavior does not contradict idempotentHint=false, which correctly describes the default no-key path.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with deprecation and purpose, but the body is very long and the security/no-network paragraph is dense and somewhat repetitive ('like codex_delegate'), with several sentences that could be tightened without losing signal.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values needn't be explained, and the description covers the full job lifecycle (start, poll, read, cancel), the spend commitment, and sandbox/read boundaries. Nothing an agent needs to invoke it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds cross-cutting meaning: workspace_root must be absolute and is not a read boundary, and the propose-tier/worktree semantics of the task. It reinforces rather than repeats the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('Delegate a coding task to Codex in the background'), the return value ('get a job_id back immediately'), and the non-blocking trait, which cleanly distinguishes it from the sibling codex_delegate (sync). It also flags deprecation up front.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit routing: use codex_delegate_dry_run or codex_status (both free) first if only checking scope; prefer this over sync for substantial/multi-file tasks exceeding the 300s sync deadline; poll with codex_job_status, read with codex_job_result/consume, stop with codex_job_cancel. When-to-use and alternatives are both named.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
codex_delegate_dry_runPreview a delegate (free)ARead-only
Deprecated: use amicus_delegate_dry_run. Preview what a codex_delegate/codex_delegate_async call would do — the
baseline it seeds from (HEAD commit, tracked file count/size, uncommitted and
untracked counts), the prompt size that would be sent, and the resolved
workspace/isolation. Free — no model call, no spend, no worktree created.
Use it before delegating to confirm scope and repo before committing to cost,
exactly as codex_dry_run previews codex_review_changes. Mirrors the real
delegate's zero-spend validation (workspace, isolation, task size, git repo), so
a failure here is a failure the paid call would also hit. The returned
tier/sandbox describe the previewed propose run, not this read-only preview;
the result echoes the effective model/reasoning_effort overrides the paid
call would send (unvalidated). deadline_advisory is non-null when size or
reasoning effort risks the synchronous deadline and names codex_delegate_async
verbatim — the async counterpart of the previewed call, not of this dry-run tool.
A hint, not a refusal.
A dry run reports metadata about the input this plugin would assemble; it does not invoke Codex, and it neither enumerates nor bounds the files the model itself reads and sends during the paid call. Codex can read files outside the workspace — up to everything the OS user running it can read — and send them to OpenAI. The sandbox bounds writes, not reads, so no choice of workspace is a read boundary.
| Name | Required | Description | Default |
|---|---|---|---|
| task | Yes | The coding task you want Codex to implement via a real codex_delegate call; this dry run only previews the seeded baseline and prompt size — it does NOT call Codex or return a diff. Must be non-blank: empty or whitespace-only is rejected here too, not previewed. | |
| model | No | The Codex model slug the previewed paid call would use; defaults to the server default (CODEX_IN_CLAUDE_MODEL) when unset, so the preview mirrors the paid call's resolution. This dry run does not call Codex or validate the model. | |
| isolation | No | Codex config isolation: 'inherit' | 'ignore-config' | 'ignore-rules'. Defaults to the server's configured value (built-in 'inherit'; `codex_status` reports the resolved one). | |
| workspace_root | No | Absolute path to the target repo root — pass it (or an MCP root) to target the intended repo; otherwise the call falls back to the server's own cwd and sets meta.workspace_warning. On an active call it selects where Codex works, not what it can read — it is not a read boundary. | |
| reasoning_effort | No | The reasoning effort the previewed paid call would send (as a `model_reasoning_effort` config override); defaults to the server default (CODEX_IN_CLAUDE_REASONING_EFFORT) when unset, so the preview mirrors the paid call's resolution. This dry run does not call Codex or validate the value beyond the paid params' shape bounds (no control or surrogate characters, ≤128 chars). |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=false, and the description adds substantial context beyond them: zero model call/spend/worktree, that a failure here mirrors a paid failure, the deadline_advisory semantics, and the critical caveat that the sandbox bounds writes not reads so no workspace is a read boundary. The only deduction is that the read-boundary warning is repeated rather than further elaborated.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the deprecation and purpose, which is good, but it is dense and repeats the 'not a read boundary' point in both the body and the workspace_root schema description. Several clauses restate what the annotations and schema already convey.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only preview tool with an output schema, the description covers what is previewed, what is not validated, what the result echoes, and the safety boundary of the underlying paid call. Nothing an agent needs to invoke it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds semantics beyond the schema: that model/reasoning_effort are echoed from the paid call's resolution and are unvalidated, that task non-blankness is enforced here too, and that workspace_root selects where Codex works but is not a read boundary.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: preview what a codex_delegate/codex_delegate_async call would do, enumerating what it reports (baseline, prompt size, resolved workspace/isolation). It explicitly distinguishes itself from codex_delegate, codex_delegate_async, and codex_dry_run, and flags its own deprecation in favor of amicus_delegate_dry_run.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit when-to-use ('Use it before delegating to confirm scope and repo before committing to cost') and names the analogous sibling pattern (codex_dry_run previews codex_review_changes). It also routes to the async counterpart via deadline_advisory and to the replacement tool via the deprecation notice.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
codex_dry_runPreview a review (free)ARead-only
Deprecated: use amicus_review_changes_dry_run. Preview what a codex_review_changes call would send — scope, diff size,
redactions, truncation. Free — no model call, no spend. Use it before a
review to inspect the scope and the reported redactions; redaction is
best-effort, so treat the preview as a check on scope, not as confirmation
that no secret remains. Pass the same extra_context and untracked policy
you would give the review so the preview matches it. would_call_model reports
whether the paid call would actually run the model (False on an empty diff, where
prompt_bytes is 0), and coverage discloses omitted untracked files just as the
review would. The result echoes the effective model/reasoning_effort overrides
the paid call would send (unvalidated). deadline_advisory is non-null when size
or effort risks the synchronous deadline (null whenever would_call_model is
False) and names codex_review_changes_async verbatim — the async counterpart of
the previewed call, not of this dry-run tool. A hint, not a refusal.
A dry run reports metadata about the input this plugin would assemble; it does not invoke Codex, and it neither enumerates nor bounds the files the model itself reads and sends during the paid call. Codex can read files outside the workspace — up to everything the OS user running it can read — and send them to OpenAI. The sandbox bounds writes, not reads, so no choice of workspace is a read boundary.
| Name | Required | Description | Default |
|---|---|---|---|
| base | No | Base git ref for scope='branch'; the review covers base...HEAD. Control characters are rejected, not stripped. | |
| model | No | The Codex model slug the previewed paid call would use; defaults to the server default (CODEX_IN_CLAUDE_MODEL) when unset, so the preview mirrors the paid call's resolution. This dry run does not call Codex or validate the model. | |
| paths | No | Repo-relative paths to narrow the review ('/' separators, no '..'); omit to review all changes in scope. | |
| scope | No | Which changes to review: 'working_tree' (tracked changes vs HEAD; untracked files follow the `untracked` policy, off by default), 'branch' (needs base), or 'commit' (needs commit). | working_tree |
| commit | No | Commit SHA or ref to review for scope='commit'. Control characters are rejected, not stripped. | |
| isolation | No | Codex config isolation: 'inherit' | 'ignore-config' | 'ignore-rules'. Defaults to the server's configured value (built-in 'inherit'; `codex_status` reports the resolved one). | |
| untracked | No | How working_tree scope treats untracked files: 'explicit_only' (default) includes only those named in `paths`; 'include' reviews all non-ignored untracked files (SENDS their contents to OpenAI — opt-in egress); 'exclude' includes none. Omitted ones are disclosed in `coverage`. Inert for branch/commit scopes. | explicit_only |
| extra_context | No | Optional author intent/background context, added as clearly-labeled UNTRUSTED prompt data. Redaction does NOT cover it — no live secrets. Full caveats and bounds: codex://params. | |
| workspace_root | No | Absolute path to the target repo root — pass it (or an MCP root) to target the intended repo; otherwise the call falls back to the server's own cwd and sets meta.workspace_warning. On an active call it selects where Codex works, not what it can read — it is not a read boundary. | |
| reasoning_effort | No | The reasoning effort the previewed paid call would send (as a `model_reasoning_effort` config override); defaults to the server default (CODEX_IN_CLAUDE_REASONING_EFFORT) when unset, so the preview mirrors the paid call's resolution. This dry run does not call Codex or validate the value beyond the paid params' shape bounds (no control or surrogate characters, ≤128 chars). |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations (`readOnlyHint=true`, `openWorldHint=false`) are consistent and the description goes well beyond them: it explains `would_call_model` semantics (False on empty diff, `prompt_bytes` 0), `coverage` disclosure of omitted untracked files, `deadline_advisory` naming the async counterpart, unvalidated model/effort echoes, and best-effort redaction. It also discloses a non-obvious security boundary — the sandbox bounds writes, not reads — which annotations cannot convey.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with deprecation and purpose, then caveats and return-field semantics; nearly every sentence carries distinct information. It is nonetheless long (three paragraphs) with mild redundancy ('Free — no model call, no spend'), so not a perfect 5.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With 10 parameters, an output schema, and annotations all present, the description fills the remaining gaps an agent needs: the free/no-model guarantee, preview-vs-paid fidelity requirements, interpretation of `would_call_model`/`coverage`/`deadline_advisory`, and the read-boundary caveat.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema carries the per-parameter burden and baseline is 3. The description still adds cross-parameter meaning the schema does not: mirroring `extra_context` and `untracked` between dry run and paid call, and what the returned `model`/`reasoning_effort` echoes represent.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and object — 'Preview what a `codex_review_changes` call would send — scope, diff size, redactions, truncation' — and immediately signals deprecation in favor of `amicus_review_changes_dry_run`. An agent can distinguish it from the paid `codex_review_changes` and its async counterpart without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit when-to-use ('Use it before a review to inspect the scope and the reported redactions'), an explicit when-*not* caveat ('treat the preview as a check on scope, not as confirmation that no secret remains'), and a routing hint to the async sibling. It also tells the caller to mirror `extra_context`/`untracked` so the preview matches the paid call.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
codex_job_cancelCancel a job (free)AIdempotent
Deprecated: use amicus_job_cancel. Cancel a running background Codex job.
Asks the worker to shut down gracefully so it tears down its throwaway worktree,
then force-kills it if it overstays, and marks the job cancelled (cancelled jobs
cannot be resumed). If the worktree could not be removed, cleanup_warnings
names the leftover path. Already-terminal jobs are returned unchanged, so cancel
is idempotent — a retry after a lost response is safe. Free — no model call.
| Name | Required | Description | Default |
|---|---|---|---|
| job_id | Yes | The job_id from an *_async call or a sync call's meta.job_id; recover lost ids with codex_job_list. Control characters are rejected, not stripped. | |
| workspace_root | No | Absolute path to the target repo root — pass it (or an MCP root) to target the intended repo; otherwise the call falls back to the server's own cwd and sets meta.workspace_warning. On an active call it selects where Codex works, not what it can read — it is not a read boundary. |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the annotations: describes graceful shutdown then force-kill, that cancelled jobs cannot be resumed, that already-terminal jobs are returned unchanged, and that cleanup_warnings surfaces leftover worktree paths. None of that is derivable from idempotentHint/destructiveHint alone.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the deprecation notice, then the behavioral detail in a tight paragraph; every sentence carries information. Slightly long, but nothing reads as filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists and the description still names the one noteworthy return artifact (cleanup_warnings). Mutation semantics, idempotency, and lifecycle effects are all covered, so an agent has everything needed to call this correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already fully documents job_id and workspace_root, including fallback behavior and control-character rejection. The description adds no parameter-level detail, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('Cancel a running background Codex job') and immediately flags deprecation in favor of amicus_job_cancel, which is the most decision-relevant fact for an agent. An agent can distinguish it from sibling status/result/list tools without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly routes to the replacement (amicus_job_cancel) and states the retry-safety condition ('a retry after a lost response is safe'), which is real usage guidance. It does not, however, say when cancelling is appropriate vs. letting a job run or how it relates to codex_job_status/job_result beyond idempotency.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
codex_job_consume_resultFetch and delete job result (free)A
Deprecated: use amicus_job_consume_result. Fetch a finished background Codex job's result and delete the stored record.
Same envelope as codex_job_result (matching the job's kind — branch on tool),
then removes completed job state — but only once the stored result has been read
intact and validated (a success or the job's own error envelope): a stored result
this release cannot read (job_result_incompatible or a corruption internal_error)
is NOT deleted, so it stays inspectable via codex_job_result. Deletion precedes
the response, so a response lost in transit does not restore the record; a failed
removal retains the record until its TTL (codex_job_status still shows it). Use
only when you no longer need to poll or re-read the job. Non-done jobs are not
deleted. Free — no model call.
detail works as in codex_job_result (#56).
| Name | Required | Description | Default |
|---|---|---|---|
| detail | No | Response verbosity: 'summary' (default) omits the raw model text; 'full' includes it. | summary |
| job_id | Yes | The job_id from an *_async call or a sync call's meta.job_id; recover lost ids with codex_job_list. Control characters are rejected, not stripped. | |
| workspace_root | No | Absolute path to the target repo root — pass it (or an MCP root) to target the intended repo; otherwise the call falls back to the server's own cwd and sets meta.workspace_warning. On an active call it selects where Codex works, not what it can read — it is not a read boundary. |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | true = success result, false = error result |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations only carry readOnlyHint=false, idempotentHint=false, destructiveHint=false and openWorldHint=false; the description goes far beyond them, disclosing that deletion is conditional on the result being read intact, that incompatible/corrupt results are NOT deleted and stay inspectable, that deletion precedes the response (so a lost response does not restore the record), and that a failed removal retains the record until TTL. This is exactly the extra behavioral context an agent needs before calling a consuming tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the deprecation notice and the core verb, then the deletion guardrails. It is longer than average, but nearly every clause carries a distinct failure mode (incompatible result, lost response, TTL retention), so the length is mostly earned rather than padding.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, return shape needn't be explained, and the description covers everything else an agent needs: deprecation routing, deletion timing, error/corruption handling, TTL behavior, and the free/no-model-call cost. Nothing material is left unspecified.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3. The description only adds a cross-reference for one parameter ('`detail` works as in codex_job_result (#56)'), which is a mild convenience rather than new semantics beyond the schema's own enum documentation.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a precise compound action ('Fetch a finished background Codex job's result and delete the stored record') and immediately names its deprecation replacement (amicus_job_consume_result). It also implicitly distinguishes itself from the non-destructive sibling codex_job_result, which it explicitly says retains the record. An agent can pick the right tool without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit when-to-use rule ('Use only when you no longer need to poll or re-read the job') and a when-not rule ('Non-done jobs are not deleted'), plus named alternatives for the cases it excludes (codex_job_result for re-reading, codex_job_status for tracking, codex_job_list for lost ids). Nothing is left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
codex_job_listList background jobs (free)ARead-only
Deprecated: use amicus_job_list. List the background jobs known for this workspace, newest first.
Free — no model call. Use to recover job_ids lost across context compaction or
interruption. Returns each job's id, kind, status, start time, result_available,
result_ok (a done job's outcome — true/false/null; see codex_job_status), and expiry,
so a stored failure is triageable without fetching each result.
Returns every retained job by default; pass limit (1-1000) or status to narrow. They
narrow independently — omitting limit returns every job matching status, not every
job. Only an explicit limit truncates: when more jobs match, the response sets
truncated: true with a truncation_hint — the extra rows are dropped, not paged, so
omit limit to get them all rather than looking for a cursor.
Read a job's result promptly — a finished record can silently drop off. This list is
not permanent storage: terminal records expire after the TTL (default 24h), and a
per-workspace soft cap (default 50, clamped 1-1000) evicts the oldest terminal records
as new jobs start, so a finished job can disappear even before its expires_at.
Running jobs are never evicted, so a busy workspace can hold more than the cap — and
more than limit's 1000 ceiling.
Includes sync-originated records (any sync consult/review/delegate call); the cap/TTL
eviction covers both.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum jobs to return, newest first (1-1000). Omit (or pass null) to return every retained job that matches — the default; it caps nothing, and does not override `status`. Only an explicit limit truncates: then the response sets truncated=true and the extra rows are dropped. | |
| status | No | Return only jobs in this lifecycle state ('running', 'done', 'failed', 'cancelled', 'timeout'); omit for all states. | |
| workspace_root | No | Absolute path to the target repo root — pass it (or an MCP root) to target the intended repo; otherwise the call falls back to the server's own cwd and sets meta.workspace_warning. On an active call it selects where Codex works, not what it can read — it is not a read boundary. |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Far beyond the annotations: discloses that it is free (no model call), TTL expiry (24h default), a per-workspace soft cap (50 default, 1-1000 clamp) that evicts oldest terminal records, that running jobs are never evicted, that results are not paged but dropped, and that sync-originated records are included. This is exactly the behavioral context annotations cannot carry.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with deprecation and purpose, which is good, but the body is long and partly redundant with the schema (truncation/no-cursor advice, limit interaction repeated). Dense and informative but not tight.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, yet the description still supplies the edge cases an agent needs (eviction, TTL, truncation without paging, sync records). Nothing material is missing for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3. The description restates the limit/status independence and truncation behavior, but that same nuance is already spelled out in the schema's limit description, so it adds little beyond structured data.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('List the background jobs known for this workspace, newest first') and immediately flags deprecation with the replacement tool (amicus_job_list). An agent can distinguish it from codex_job_status/codex_job_result without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit use case ('recover job_ids lost across context compaction or interruption'), names the replacement tool, and cross-references codex_job_status for outcome interpretation. When and why are both present.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
codex_job_resultFetch job result (free)ARead-only
Deprecated: use amicus_job_result. Fetch a finished background Codex job's result WITHOUT deleting the record.
Works for any async job or sync consult/review/delegate (whose meta.job_id names
its record) — codex_delegate_async (a diff), codex_consult_async (a consult
answer), or codex_review_changes_async (a review with verdict). Use when
codex_job_status reports result_available=true; the envelope matches the job's
kind, so branch on tool. meta.job_id is set. A still-running/cancelled/timed-
out/failed job returns an error envelope — as does a done job whose stored result
this release cannot read (job_result_incompatible). To fetch and delete, use
codex_job_consume_result. Free — no model call.
detail="summary" (default) omits the raw model text; pass detail="full" for
the complete raw output and metadata (#56).
| Name | Required | Description | Default |
|---|---|---|---|
| detail | No | Response verbosity: 'summary' (default) omits the raw model text; 'full' includes it. | summary |
| job_id | Yes | The job_id from an *_async call or a sync call's meta.job_id; recover lost ids with codex_job_list. Control characters are rejected, not stripped. | |
| workspace_root | No | Absolute path to the target repo root — pass it (or an MCP root) to target the intended repo; otherwise the call falls back to the server's own cwd and sets meta.workspace_warning. On an active call it selects where Codex works, not what it can read — it is not a read boundary. |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | true = success result, false = error result |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true/openWorldHint=false, but the description goes well beyond them: it flags deprecation, states the tool is free with no model call, lists the failure modes (running/cancelled/timed-out/failed and job_result_incompatible), and notes meta.job_id is set. This is rich behavioral context that annotations alone could not convey.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The deprecation warning and core purpose are front-loaded, and every paragraph carries information. It is a touch dense with parentheticals and job-kind asides, but no sentence is wasted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists so return values needn't be detailed, yet the description still explains the envelope shape and error cases. Combined with the routing guidance and deprecation note, an agent has everything needed to call this correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents job_id, detail, and workspace_root. The description adds only marginal value ('detail="full"' yields the complete raw output and metadata), which maps to a param the schema already explains. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource (fetch a finished background Codex job's result) and immediately distinguishes itself with the 'WITHOUT deleting the record' scope, which separates it from codex_job_consume_result. The opening deprecation notice and named successor add further routing clarity.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly names the condition for use ('when codex_job_status reports result_available=true') and the alternative for the fetch-and-delete case ('use codex_job_consume_result'). It also enumerates which job kinds are eligible (async delegate/consult/review) and what tool states return errors.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
codex_job_statusCheck job status (free)ARead-only
Deprecated: use amicus_job_status. Check a background job's lifecycle state without fetching the full result.
Use after any *_async call (codex_delegate_async, codex_consult_async,
codex_review_changes_async) or any sync consult/review/delegate (whose meta.job_id
names its record). Returns status, elapsed time, expiry, and result_available; when
it is true, call codex_job_result. result_ok reports a done job's producer-declared
outcome — true (success), false (a stored error envelope), or null (running, no stored
envelope, an unclassifiable payload, or a record finalized before this field) — so you
can spot a stored FAILURE without fetching it. It does not guarantee the payload is
still fetchable; a cross-release record may report an outcome yet fail codex_job_result
with job_result_incompatible. Free — no model call.
Honor poll_after_ms between polls — for a running job it GROWS with elapsed
runtime (bounded), so following it backs you off instead of tight-looping (a
delegate often runs ~20s). expires_at is null while running and is set once the
job finishes; results are then retained ttl_seconds past that completion.
| Name | Required | Description | Default |
|---|---|---|---|
| job_id | Yes | The job_id from an *_async call or a sync call's meta.job_id; recover lost ids with codex_job_list. Control characters are rejected, not stripped. | |
| workspace_root | No | Absolute path to the target repo root — pass it (or an MCP root) to target the intended repo; otherwise the call falls back to the server's own cwd and sets meta.workspace_warning. On an active call it selects where Codex works, not what it can read — it is not a read boundary. |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond readOnlyHint/openWorldHint: explains result_ok tri-state semantics (true/false/null), the cross-release incompatibility failure mode (job_result_incompatible), the free/no-model-call cost, poll_after_ms backoff behavior, and the expiry/ttl_seconds retention rule. This is exactly the behavioral context annotations can't carry.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the deprecation and the core purpose, but the middle is dense with parentheticals and em-dashes. It's information-rich but reads as a wall, and the deprecation notice competes with the actual usage guidance for the opening position.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Despite an output schema existing, the description correctly focuses on call semantics an agent needs: when to poll, how to back off, what result_ok means, and what happens after expiry. Nothing an agent needs to invoke it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3. The description adds real value on workspace_root ('selects where Codex works, not what it can read'), which is a subtle semantic the schema alone also states but the description reinforces in context, and it explains job_id provenance via the async/sync flows.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: check a background job's lifecycle state without fetching the full result. Distinguishes itself from codex_job_result, codex_job_cancel, and codex_job_list, though the deprecated first sentence ('use amicus_job_status') undermines the otherwise clear current purpose.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly says when to use it ('after any *_async call or sync consult/review/delegate') and names the follow-up condition ('when result_available is true, call codex_job_result'). Also discloses the deprecation and the replacement tool, which is a rare and useful routing cue.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
codex_modelsList Codex models (free)ARead-only
Deprecated: use amicus_models. List Codex model slugs you can pass as model, with each model's advertised
reasoning-effort set for reasoning_effort. Free — no model call.
Advisory discovery only: read from Codex's on-disk cache when present, else a
bundled fallback (source says which; the fallback carries no effort data).
codex exec validates the real slug and the backend validates the real effort, so
an unlisted value may still work and a listed one may be unavailable to your
account. Same payload as the codex://models resource. Not fingerprint-stable — do
not cache it by the capabilities fingerprint.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the readOnlyHint/openWorldHint annotations: discloses the cache-vs-bundled-fallback source, that the fallback lacks effort data, that validation happens in `codex exec`/backend, that listed values may be unavailable, and that it is not fingerprint-stable and should not be cached. This is exactly the extra behavioral context annotations cannot carry.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the deprecation and core purpose, then layers caveats efficiently. It is dense rather than bloated, though the caveat block is long enough to keep it just under maximum.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists so return values need not be explained, yet the description still clarifies the `source` field and the fallback's limitations. For a zero-param discovery tool, an agent has everything needed to call and interpret it.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Zero parameters means the baseline is 4. The description nonetheless adds meaning by explaining that the returned slugs feed the `model` parameter and the effort sets feed `reasoning_effort`, which is useful consumer-facing context.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('List Codex model slugs') and immediately scopes what the values are for ('pass as `model`', 'reasoning_effort'). The deprecation notice and pointer to amicus_models cleanly separate it from siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly names the replacement (amicus_models) and frames the tool as 'advisory discovery only' with no model call. It does not spell out a when-not-to-use condition beyond the deprecation, so it stops short of the top score.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
codex_review_changesReview git changes (paid)A
Deprecated: use amicus_review_changes. Ask Codex (a different model) to review your git changes for an independent second opinion.
PAID — this spends Codex quota on every new call; use codex_dry_run or codex_status (both free) first if you only need to check scope or readiness.
scope: working_tree (tracked changes vs HEAD — untracked files follow the
untracked policy and are NOT reviewed by default), branch (needs base, reviews
base...HEAD), or commit (needs a commit SHA). The diff is gathered, secret-
redacted, and bounded by this server; Codex reviews it read-only and returns
structured findings. Pass workspace_root (absolute) for the right repo. Optional
extra_context (author intent, bounded like the diff) cuts false positives.
The result's top-level review_status and coverage disclose whether the model
actually ran and what it was shown: a pass over partial coverage is surfaced as
unknown, and a tree with nothing reviewable returns not_run, never a pass.
STATIC review, not a verify mode: the read-only sandbox blocks the writes a test/build/lint run needs, so Codex can't run the project's checks to confirm its findings — treat them as unvalidated claims you verify yourself before acting.
Data egress: this sends the gathered diff to OpenAI via the codex CLI. The diff is
secret-redacted (best-effort), but your extra_context and
developer_instructions are sent raw (unredacted).
Codex can read files outside the workspace — up to everything the OS user running it can
read — and send them to OpenAI. The sandbox bounds writes, not reads, so no choice of
workspace is a read boundary. Codex auto-loads the resolved workspace's
AGENTS.md and, in a repository, ancestor AGENTS.md files through its root, plus a
user-global $CODEX_HOME/AGENTS.override.md, else $CODEX_HOME/AGENTS.md; it discovers
skills in the
workspace's .agents/skills/ and user-global $CODEX_HOME/skills/ (default
~/.codex/skills/), reachable from outside the workspace. The plugin's isolation flags
don't suppress any of it.
A skill's name and description arrive up front; selecting one makes the model read
its body, which can reach OpenAI even if your inputs never mention it.
Redaction is not a guarantee. Do not rely on it to protect live credentials; keep
them out of the reviewed tree and your supplied inputs, or do not request a review
of that tree.
Progress & recovery: blocks up to the resolved deadline (timeout_seconds, clamped
10-600s; when omitted, the server-configured value, built-in default 300s). If that deadline
expires the run is terminated and its partial output is not recoverable or resumable, so for a
multi-file or whole-branch review that may exceed it, prefer codex_review_changes_async (a
background job, built-in default 1800s deadline; poll codex_job_status). Coarse
notifications/progress streams while it blocks when your client requests it; some MCP
clients background a long call before the deadline, so timeout_seconds bounds the run, not
necessarily the inline wait — either way the detached run (meta.job_id) is recoverable via
codex_job_list→codex_job_status→codex_job_result.
| Name | Required | Description | Default |
|---|---|---|---|
| base | No | Base git ref for scope='branch'; the review covers base...HEAD. Control characters are rejected, not stripped. | |
| model | No | Override the Codex model slug for this call; defaults to the server/Codex default when unset. Control characters are rejected, not stripped. | |
| paths | No | Repo-relative paths to narrow the review ('/' separators, no '..'); omit to review all changes in scope. | |
| scope | No | Which changes to review: 'working_tree' (tracked changes vs HEAD; untracked files follow the `untracked` policy, off by default), 'branch' (needs base), or 'commit' (needs commit). | working_tree |
| commit | No | Commit SHA or ref to review for scope='commit'. Control characters are rejected, not stripped. | |
| detail | No | Response verbosity: 'summary' (default) omits the raw model text; 'full' includes it. | summary |
| isolation | No | Codex config isolation: 'inherit' | 'ignore-config' | 'ignore-rules'. Defaults to the server's configured value (built-in 'inherit'; `codex_status` reports the resolved one). | |
| untracked | No | How working_tree scope treats untracked files: 'explicit_only' (default) includes only those named in `paths`; 'include' reviews all non-ignored untracked files (SENDS their contents to OpenAI — opt-in egress); 'exclude' includes none. Omitted ones are disclosed in `coverage`. Inert for branch/commit scopes. | explicit_only |
| extra_context | No | Optional author intent/background context, added as clearly-labeled UNTRUSTED prompt data. Redaction does NOT cover it — no live secrets. Full caveats and bounds: codex://params. | |
| workspace_root | No | Absolute path to the target repo root — pass it (or an MCP root) to target the intended repo; otherwise the call falls back to the server's own cwd and sets meta.workspace_warning. On an active call it selects where Codex works, not what it can read — it is not a read boundary. | |
| idempotency_key | No | Optional dedup key scoped to THIS tool + workspace. Same key + same args replays the prior result with no new spend; different args are refused (idempotency_conflict). Sync and _async are separate tools and never share a key. Omit for none; retention is bounded. Lifecycle: codex://params. | |
| timeout_seconds | No | Per-call wall-clock timeout in seconds, clamped to 10..600 (out-of-range values are coerced, not rejected). Defaults to the server's configured timeout. | |
| reasoning_effort | No | Override the Codex reasoning effort for this call (a model_reasoning_effort override); omit or pass null for the server default (CODEX_IN_CLAUDE_REASONING_EFFORT) or Codex's own resolution. An open, per-model string the backend validates at run time — commonly minimal|low|medium|high|xhigh; codex_models lists each model's advertised set (advisory). Rejection and bounds detail: codex://params. | |
| developer_instructions | No | Optional caller stance/focus text for Codex's developer turn, placed BEHIND this server's always-leading framing; omit for no developer override. UNTRUSTED — never build it from workspace content; grants no tools; Codex is instructed, not compelled — verdicts stay its own, and compliance with the rest is best-effort and may be silent. Rides the codex command line and the background-job record on disk — never put secrets here; meta reports only {sha256, bytes}. Stripped; blank = omitted; max 4096 bytes. Full contract: codex://params. |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes far beyond the annotations: documents per-call Codex quota spend, data egress to OpenAI, best-effort secret redaction (with extra_context/developer_instructions sent raw), that the sandbox bounds writes not reads, auto-loaded AGENTS.md/skills, static-not-verify limitations, and non-recoverable partial output on timeout. This is unusually rich behavioral disclosure consistent with readOnlyHint=false (spends quota, writes a job record).
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the two highest-stakes facts (deprecation, paid) and organizes the rest under labeled sections (scope, Data egress, Progress & recovery), so it is navigable despite its length. It is verbose and offloads some detail to codex://params, but nearly every sentence carries decision-relevant information for a 14-param, high-cost tool.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given a complex, optionally-paid, egress-heavy tool with 14 params and an output schema, the description covers cost, egress, redaction limits, isolation, timeouts/recovery, and even the review_status/coverage semantics. Nothing an agent needs to call it safely and correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds cross-parameter semantics the schema states only per-property: scope=working_tree/branch/commit with their base/commit dependencies, the untracked policy applying only to working_tree, and workspace_root as not a read boundary. It meaningfully ties parameters together.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('review your git changes') and the distinctive mechanism ('Ask Codex, a different model, for an independent second opinion'). It also names the deprecation replacement (amicus_review_changes) and differentiates from codex_dry_run/codex_status, so the agent can place it precisely among siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit when-to-use and when-not-to-use guidance: deprecated in favor of amicus_review_changes, precede with the free codex_dry_run/codex_status if only checking scope or readiness, and prefer codex_review_changes_async for long multi-file/branch reviews. Alternatives and selection conditions are spelled out.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
codex_review_changes_asyncReview git changes in background (paid)A
Deprecated: use amicus_review_changes_async. Review your git changes in the background; get a job_id back immediately.
PAID — this spends Codex quota on every new call; use codex_dry_run or codex_status (both free) first if you only need to check scope or readiness.
Same read-only behavior as codex_review_changes (the diff is gathered, secret-
redacted, and bounded, then reviewed read-only), but detached — prefer it for a multi-file
or whole-branch review that can exceed the synchronous deadline (built-in default 300s),
since a sync run whose deadline expires loses its partial work; this job's own deadline is
separately configured (built-in default 1800s). The diff is gathered inside the job, so a bad
base/commit comes back as the same structured error with zero spend (a bad
scope is rejected by MCP input validation before the job starts). Starting a job commits to
spend. Poll codex_job_status; read/consume the review envelope with
codex_job_result/codex_job_consume_result; stop with codex_job_cancel. Pass
workspace_root (absolute).
Data egress: same as codex_review_changes — sends the secret-redacted diff plus
your raw (unredacted) extra_context and developer_instructions to OpenAI via
the codex CLI.
Codex can read files outside the workspace — up to everything the OS user running it can
read — and send them to OpenAI. The sandbox bounds writes, not reads, so no choice of
workspace is a read boundary. Codex auto-loads the resolved workspace's AGENTS.md and, in a
repository, ancestor AGENTS.md files through its root, plus a user-global
$CODEX_HOME/AGENTS.override.md, else $CODEX_HOME/AGENTS.md; it discovers skills in the
workspace's
.agents/skills/ and user-global $CODEX_HOME/skills/ (default ~/.codex/skills/),
reachable from outside the workspace. A skill's name
and description arrive up front; selecting one makes the model read its body, which
can reach OpenAI even if your inputs never mention it. Redaction is best-effort, not
a guarantee.
| Name | Required | Description | Default |
|---|---|---|---|
| base | No | Base git ref for scope='branch'; the review covers base...HEAD. Control characters are rejected, not stripped. | |
| model | No | Override the Codex model slug for this call; defaults to the server/Codex default when unset. Control characters are rejected, not stripped. | |
| paths | No | Repo-relative paths to narrow the review ('/' separators, no '..'); omit to review all changes in scope. | |
| scope | No | Which changes to review: 'working_tree' (tracked changes vs HEAD; untracked files follow the `untracked` policy, off by default), 'branch' (needs base), or 'commit' (needs commit). | working_tree |
| commit | No | Commit SHA or ref to review for scope='commit'. Control characters are rejected, not stripped. | |
| isolation | No | Codex config isolation: 'inherit' | 'ignore-config' | 'ignore-rules'. Defaults to the server's configured value (built-in 'inherit'; `codex_status` reports the resolved one). | |
| untracked | No | How working_tree scope treats untracked files: 'explicit_only' (default) includes only those named in `paths`; 'include' reviews all non-ignored untracked files (SENDS their contents to OpenAI — opt-in egress); 'exclude' includes none. Omitted ones are disclosed in `coverage`. Inert for branch/commit scopes. | explicit_only |
| extra_context | No | Optional author intent/background context, added as clearly-labeled UNTRUSTED prompt data. Redaction does NOT cover it — no live secrets. Full caveats and bounds: codex://params. | |
| workspace_root | No | Absolute path to the target repo root — pass it (or an MCP root) to target the intended repo; otherwise the call falls back to the server's own cwd and sets meta.workspace_warning. On an active call it selects where Codex works, not what it can read — it is not a read boundary. | |
| idempotency_key | No | Optional dedup key scoped to THIS tool + workspace. Same key + same args replays the prior result with no new spend; different args are refused (idempotency_conflict). Sync and _async are separate tools and never share a key. Omit for none; retention is bounded. Lifecycle: codex://params. | |
| reasoning_effort | No | Override the Codex reasoning effort for this call (a model_reasoning_effort override); omit or pass null for the server default (CODEX_IN_CLAUDE_REASONING_EFFORT) or Codex's own resolution. An open, per-model string the backend validates at run time — commonly minimal|low|medium|high|xhigh; codex_models lists each model's advertised set (advisory). Rejection and bounds detail: codex://params. | |
| developer_instructions | No | Optional caller stance/focus text for Codex's developer turn, placed BEHIND this server's always-leading framing; omit for no developer override. UNTRUSTED — never build it from workspace content; grants no tools; Codex is instructed, not compelled — verdicts stay its own, and compliance with the rest is best-effort and may be silent. Rides the codex command line and the background-job record on disk — never put secrets here; meta reports only {sha256, bytes}. Stripped; blank = omitted; max 4096 bytes. Full contract: codex://params. |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the annotations (readOnlyHint=false, openWorldHint=true): discloses per-call quota spend, the 300s sync vs 1800s async deadline defaults, zero-spend failure for bad base/commit vs MCP-validation rejection for bad scope, data egress to OpenAI including unredacted extra_context/developer_instructions, best-effort (not guaranteed) redaction, and that the sandbox bounds writes but not reads. This is exactly the kind of non-obvious operational context annotations cannot carry.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the two highest-stakes facts (deprecation, paid spend) before any mechanics, and every paragraph is substantive. However it is very long and dense, with repeated deferrals to codex://params and an extended AGENTS.md/skills passage that could be tightened without losing actionable content.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 12-parameter, job-creating, egress-bearing tool with an output schema present, the description covers what it needs to: spend, deadlines, the job lifecycle (poll codex_job_status, read via codex_job_result/consume_result, stop via codex_job_cancel), and the deprecation path. Return values are correctly left to the output schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds cross-parameter behavior the schema does not: 'Pass `workspace_root` (absolute)', that a bad base/commit yields zero spend, that a bad scope is caught by input validation, and the untracked-files egress caveat. It stops short of explaining every parameter (e.g. model, reasoning_effort resolution) since those defer to codex://params.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('Review your git changes in the background') and a concrete return artifact ('get a `job_id` back immediately'), and explicitly positions itself against siblings: deprecated in favor of amicus_review_changes_async, contrasted with codex_review_changes (sync) and codex_dry_run/codex_status. An agent can route correctly without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit when-to-use ('prefer it for a multi-file or whole-branch review that can exceed the synchronous deadline'), when-not ('use codex_dry_run or codex_status ... if you only need to check scope or readiness'), and names the sync alternative whose partial work is lost on deadline expiry. Includes the prerequisite that starting a job commits to spend.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
codex_statusCheck Codex readiness (free)ARead-only
Deprecated: use amicus_backends. Check that the codex CLI is installed, authenticated, and a supported
version, and report the resolved defaults. Free — no model call. Run it before
your first paid call in a session to confirm setup, and again whenever a run
fails with a setup error.
Also reports a rate_limit block — how much of the Codex quota windows remains,
fetched LIVE from codex app-server (a read-only call with no model spend). primary
is the shorter/rolling window, secondary the longer one; the account reports only the
windows that currently bind it, so either may be null. Use it to decide whether to spend:
available is deliberately conservative (only when every reported window is healthy);
when limited/exhausted, prefer to defer non-urgent Codex calls (urgent ones may still
proceed); unknown means the live read couldn't complete just now (retry) or only a stale
cache was available; unavailable means this codex/account exposes no quota data — none
of these means anything is wrong.
blocked is different: the backend reports a SPEND control (spend_control_reached: true),
so paid calls will fail and waiting for a quota reset will NOT clear it — don't defer, and
surface it to the user. spend_control_reached is null when this codex/backend didn't report
that state (then available covers the quota windows only, and note says so).
is_stale/as_of show freshness; home_unverified flags a snapshot from a different
CODEX_HOME.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Discloses a lot beyond the readOnlyHint annotation: free/no model call, a live read against codex app-server, the semantics of available/limited/exhausted/unknown/unavailable, the crucial distinction that blocked reflects a spend control that a quota reset will NOT clear, and is_stale/as_of/home_unverified freshness flags. This is the behavioral depth an agent needs to avoid mis-reading status.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The deprecation and routing come first, which is good front-loading, but the body is dense and leans heavily on backticked output keys rather than prose. It is information-rich but verges on over-long for a status tool, and readability suffers slightly.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Although an output schema exists, the description supplies the interpretive layer the schema cannot: what each state means and what the agent should do about it. Nothing an agent needs to act on a status result is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Zero parameters, so there is nothing to document (baseline 4). The description correctly focuses entirely on output semantics, which is the right allocation of space.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Clearly states it checks whether the codex CLI is installed, authenticated, at a supported version, and reports resolved defaults. Deprecation note explicitly redirects to amicus_backends, but does not distinguish it from codex_capabilities, which could plausibly overlap.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit when-to-use: before the first paid call in a session and whenever a run fails with a setup error. It further routes interpretation of the rate_limit block into concrete actions (defer vs. proceed vs. surface to user), which is unusually actionable guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
codex_transferTransfer session to Codex (free)A
Deprecated: amicus has no equivalent. Hand off the current Claude Code session to a resumable Codex thread.
Imports a Claude session transcript (.jsonl) into a persistent Codex thread via
codex app-server and returns resume_command (codex resume <thread_id>) to
continue that exact conversation in Codex (TUI or App). Free — no model call and no
token spend; it is a local file conversion, typically seconds. It does create a
thread in $CODEX_HOME (so it is not read-only) but never edits your working tree.
Pass transcript_path: the current session's transcript is the newest *.jsonl under
~/.claude/projects//. If that is ambiguous — for example, more than one recent
transcript could be the current session — ask the user which one to transfer. Transferring
a still-live session creates a NEW thread each call — Codex dedups only a byte-identical
transcript — so this is not idempotent for an active session.
Identifiers the app-server reports (the imported thread id and $CODEX_HOME) are validated:
a drifted, oversized, or malformed value fails as cli_contract_changed rather than
producing a corrupt resume_command or importing into the wrong home. resume_command is
POSIX shell syntax.
codex_status (free) can confirm Codex is installed and authenticated beforehand.
| Name | Required | Description | Default |
|---|---|---|---|
| workspace_root | No | Absolute path to the target repo root — pass it (or an MCP root) to target the intended repo; otherwise the call falls back to the server's own cwd and sets meta.workspace_warning. On an active call it selects where Codex works, not what it can read — it is not a read boundary. | |
| transcript_path | Yes | Absolute path to the Claude Code session transcript (.jsonl) to hand off to Codex. Must be an existing, non-empty .jsonl file under ~/.claude/projects. Find the current session's transcript as the newest *.jsonl under ~/.claude/projects/<cwd-slug>/. If that is ambiguous — for example, more than one recent transcript could be the current session — ask the user which one to transfer. |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only flag non-read-only/non-idempotent; the description adds substantial context beyond them: thread creation in $CODEX_HOME, that the working tree is never edited, that dedup requires byte-identical transcripts, the seconds-scale local conversion, and the cli_contract_changed validation failure mode. This is exactly the extra behavioral disclosure the annotations cannot carry.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the deprecation notice and the core action, and nearly every sentence carries distinct information (cost, side effects, failure mode). It is somewhat long and repeats transcript-location guidance already present in the schema, which keeps it from a 5.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, yet the description still explains the key return artifact (resume_command in POSIX syntax) and the failure semantics. For a tool with prereqs, side effects, and ambiguity handling, the coverage is thorough and leaves no critical gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3, but the description adds a concrete heuristic for locating the transcript (newest *.jsonl under ~/.claude/projects/<cwd-slug>/) and the ambiguity resolution policy. It also clarifies workspace_root's scope (selects where Codex works, not a read boundary), though much of this is duplicated from the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('imports a Claude session transcript into a persistent Codex thread') and immediately flags deprecation status. It is clearly distinguishable from siblings like codex_delegate or codex_consult, which run model calls rather than perform a local file conversion.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly says when to use it (hand off current session, free, no token spend), names a pre-flight alternative (codex_status to confirm install/auth), and gives a decision rule for ambiguity ('ask the user which one to transfer'). The not-idempotent warning for live sessions tells the agent when repeated calls are inappropriate.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
1 tool update
v0.24.0- Changed
codex_capabilities1 field changed- changed
Input schema / properties / detail / descriptionPrevious value: -"What to return: 'summary' (default) returns each tool's name, cost, stability, and error_codes; the *_async tools also get async_lifecycle. 'full' adds use_when, returns, and the parameter lists (which tools/list already carries). 'contracts' drops tool_details: fetch a schema, or recheck fingerprint, without re-paying for the inventory."New value: +"What to return: 'summary' (default) returns each tool's name, cost, stability, error_codes, and deprecation marker; the *_async tools also get async_lifecycle. 'full' adds use_when, returns, and the parameter lists (which tools/list already carries). 'contracts' drops tool_details: fetch a schema, or recheck fingerprint, without re-paying for the inventory."
5 tool updates
v0.22.0- Changed
codex_capabilities1 field changed- changed
Output schema / anyOfPrevious value: -[ - { - "additionalProperties": false, - "properties": { - "active_tools": { - "items": { - "type": "string" - }, - "type": "array" - }, - "annotations_reading": { - "type": "string" - }, - "deprecation_policy": { - "type": "string" - }, - "error_envelope_resource": { - "type": "string" - }, - "fingerprint": { - "type": "string" - }, - "fingerprint_covers": { - "description": "A contract-semantic change in any listed category changes the fingerprint; nothing outside them does. Release identity is excluded: serverInfo.version, version, server_version change every release WITHOUT moving the fingerprint.", - "items": { - "type": "string" - }, - "type": "array" - }, - "free_tools": { - "items": { - "type": "string" - }, - "type": "array" - }, - "name": { - "type": "string" - }, - "negative_scope": { - "items": { - "type": "string" - }, - "type": "array" - }, - "ok": { - "const": true, - "type": "boolean" - }, - "prerequisites": { - "items": { - "type": "string" - }, - "type": "array" - }, - "protocol_revision": { - "type": "string" - }, - "resource_error_carrier": { - "type": "string" - }, - "result_meta_resource": { - "type": "string" - }, - "sandboxes": { - "items": { - "type": "string" - }, - "type": "array" - }, - "schemas": { - "anyOf": [ - { - "additionalProperties": true, - "type": "object" - }, - { - "type": "null" - } - ] - }, - "scope": { - "items": { - "type": "string" - }, - "type": "array" - }, - "server_version": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - "stability": { - "type": "string" - }, - "tiers": { - "items": { - "type": "string" - }, - "type": "array" - }, - "tool_details": { - "description": "Per-tool capability records; full schema at resource codex://capabilities-result", - "type": "array" - }, - "tool_error_carrier": { - "type": "string" - }, - "transport": { - "type": "string" - }, - "version": { - "type": "string" - } - }, - "required": [ - "name", - "version", - "transport", - "stability", - "active_tools", - "free_tools", - "tiers", - "sandboxes", - "scope", - "negative_scope", - "prerequisites", - "deprecation_policy" - ], - "type": "object" - }, - { - "properties": { - "error": { - "description": "Populated error envelope; full schema at resource codex://error-envelope", - "type": "object" - }, - "meta": { - "type": "object" - }, - "ok": { - "const": false - } - }, - "required": [ - "ok", - "error", - "meta" - ], - "type": "object" - } -]New value: +[ + { + "additionalProperties": false, + "properties": { + "active_tools": { + "items": { + "type": "string" + }, + "type": "array" + }, + "annotations_reading": { + "type": "string" + }, + "deprecation_policy": { + "type": "string" + }, + "error_envelope_resource": { + "type": "string" + }, + "fingerprint": { + "type": "string" + }, + "fingerprint_covers": { + "description": "A contract-semantic change in any listed category changes the fingerprint; nothing outside them does. Release identity is excluded: serverInfo.version, version, server_version change every release WITHOUT moving the fingerprint (incl. its server/discover _meta carrier).", + "items": { + "type": "string" + }, + "type": "array" + }, + "free_tools": { + "items": { + "type": "string" + }, + "type": "array" + }, + "name": { + "type": "string" + }, + "negative_scope": { + "items": { + "type": "string" + }, + "type": "array" + }, + "ok": { + "const": true, + "type": "boolean" + }, + "prerequisites": { + "items": { + "type": "string" + }, + "type": "array" + }, + "protocol_revision": { + "type": "string" + }, + "resource_error_carrier": { + "type": "string" + }, + "result_meta_resource": { + "type": "string" + }, + "sandboxes": { + "items": { + "type": "string" + }, + "type": "array" + }, + "schemas": { + "anyOf": [ + { + "additionalProperties": true, + "type": "object" + }, + { + "type": "null" + } + ] + }, + "scope": { + "items": { + "type": "string" + }, + "type": "array" + }, + "server_version": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "stability": { + "type": "string" + }, + "tiers": { + "items": { + "type": "string" + }, + "type": "array" + }, + "tool_details": { + "description": "Per-tool capability records; full schema at resource codex://capabilities-result", + "type": "array" + }, + "tool_error_carrier": { + "type": "string" + }, + "transport": { + "type": "string" + }, + "version": { + "type": "string" + } + }, + "required": [ + "name", + "version", + "transport", + "stability", + "active_tools", + "free_tools", + "tiers", + "sandboxes", + "scope", + "negative_scope", + "prerequisites", + "deprecation_policy" + ], + "type": "object" + }, + { + "properties": { + "error": { + "description": "Populated error envelope; full schema at resource codex://error-envelope", + "type": "object" + }, + "meta": { + "type": "object" + }, + "ok": { + "const": false + } + }, + "required": [ + "ok", + "error", + "meta" + ], + "type": "object" + } +]
- Changed
codex_consult1 field changed- added
Input schema / properties / developer_instructionsAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Optional caller stance/focus text for Codex's developer turn, placed BEHIND this server's always-leading framing; omit for no developer override. UNTRUSTED — never build it from workspace content; grants no tools; Codex is instructed, not compelled — verdicts stay its own, and compliance with the rest is best-effort and may be silent. Rides the codex command line and the background-job record on disk — never put secrets here; meta reports only {sha256, bytes}. Stripped; blank = omitted; max 4096 bytes. Full contract: codex://params." +}
- Changed
codex_consult_async1 field changed- added
Input schema / properties / developer_instructionsAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Optional caller stance/focus text for Codex's developer turn, placed BEHIND this server's always-leading framing; omit for no developer override. UNTRUSTED — never build it from workspace content; grants no tools; Codex is instructed, not compelled — verdicts stay its own, and compliance with the rest is best-effort and may be silent. Rides the codex command line and the background-job record on disk — never put secrets here; meta reports only {sha256, bytes}. Stripped; blank = omitted; max 4096 bytes. Full contract: codex://params." +}
- Changed
codex_review_changes1 field changed- added
Input schema / properties / developer_instructionsAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Optional caller stance/focus text for Codex's developer turn, placed BEHIND this server's always-leading framing; omit for no developer override. UNTRUSTED — never build it from workspace content; grants no tools; Codex is instructed, not compelled — verdicts stay its own, and compliance with the rest is best-effort and may be silent. Rides the codex command line and the background-job record on disk — never put secrets here; meta reports only {sha256, bytes}. Stripped; blank = omitted; max 4096 bytes. Full contract: codex://params." +}
- Changed
codex_review_changes_async1 field changed- added
Input schema / properties / developer_instructionsAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Optional caller stance/focus text for Codex's developer turn, placed BEHIND this server's always-leading framing; omit for no developer override. UNTRUSTED — never build it from workspace content; grants no tools; Codex is instructed, not compelled — verdicts stay its own, and compliance with the rest is best-effort and may be silent. Rides the codex command line and the background-job record on disk — never put secrets here; meta reports only {sha256, bytes}. Stripped; blank = omitted; max 4096 bytes. Full contract: codex://params." +}
15 tool updates
v0.19.0- Changed
codex_consult3 fields changed- changed
Input schema / properties / model / anyOfPrevious value: -[ - { - "type": "string" - }, - { - "type": "null" - } -]New value: +[ + { + "pattern": "^[^\\x00-\\x1F\\x7F-\\x9F]*$", + "type": "string" + }, + { + "type": "null" + } +] - changed
Input schema / properties / model / descriptionPrevious value: -"Override the Codex model slug for this call; defaults to the server/Codex default when unset."New value: +"Override the Codex model slug for this call; defaults to the server/Codex default when unset. Control characters are rejected, not stripped." - changed
Input schema / properties / workspace_root / descriptionPrevious value: -"Absolute path to the target repo root — pass it (or an MCP root) to target the intended repo; otherwise the call falls back to the server's own cwd and sets meta.workspace_warning."New value: +"Absolute path to the target repo root — pass it (or an MCP root) to target the intended repo; otherwise the call falls back to the server's own cwd and sets meta.workspace_warning. On an active call it selects where Codex works, not what it can read — it is not a read boundary."
- Changed
codex_consult_async3 fields changed- changed
Input schema / properties / model / anyOfPrevious value: -[ - { - "type": "string" - }, - { - "type": "null" - } -]New value: +[ + { + "pattern": "^[^\\x00-\\x1F\\x7F-\\x9F]*$", + "type": "string" + }, + { + "type": "null" + } +] - changed
Input schema / properties / model / descriptionPrevious value: -"Override the Codex model slug for this call; defaults to the server/Codex default when unset."New value: +"Override the Codex model slug for this call; defaults to the server/Codex default when unset. Control characters are rejected, not stripped." - changed
Input schema / properties / workspace_root / descriptionPrevious value: -"Absolute path to the target repo root — pass it (or an MCP root) to target the intended repo; otherwise the call falls back to the server's own cwd and sets meta.workspace_warning."New value: +"Absolute path to the target repo root — pass it (or an MCP root) to target the intended repo; otherwise the call falls back to the server's own cwd and sets meta.workspace_warning. On an active call it selects where Codex works, not what it can read — it is not a read boundary."
- Changed
codex_delegate3 fields changed- changed
Input schema / properties / model / anyOfPrevious value: -[ - { - "type": "string" - }, - { - "type": "null" - } -]New value: +[ + { + "pattern": "^[^\\x00-\\x1F\\x7F-\\x9F]*$", + "type": "string" + }, + { + "type": "null" + } +] - changed
Input schema / properties / model / descriptionPrevious value: -"Override the Codex model slug for this call; defaults to the server/Codex default when unset."New value: +"Override the Codex model slug for this call; defaults to the server/Codex default when unset. Control characters are rejected, not stripped." - changed
Input schema / properties / workspace_root / descriptionPrevious value: -"Absolute path to the target repo root — pass it (or an MCP root) to target the intended repo; otherwise the call falls back to the server's own cwd and sets meta.workspace_warning."New value: +"Absolute path to the target repo root — pass it (or an MCP root) to target the intended repo; otherwise the call falls back to the server's own cwd and sets meta.workspace_warning. On an active call it selects where Codex works, not what it can read — it is not a read boundary."
- Changed
codex_delegate_async3 fields changed- changed
Input schema / properties / model / anyOfPrevious value: -[ - { - "type": "string" - }, - { - "type": "null" - } -]New value: +[ + { + "pattern": "^[^\\x00-\\x1F\\x7F-\\x9F]*$", + "type": "string" + }, + { + "type": "null" + } +] - changed
Input schema / properties / model / descriptionPrevious value: -"Override the Codex model slug for this call; defaults to the server/Codex default when unset."New value: +"Override the Codex model slug for this call; defaults to the server/Codex default when unset. Control characters are rejected, not stripped." - changed
Input schema / properties / workspace_root / descriptionPrevious value: -"Absolute path to the target repo root — pass it (or an MCP root) to target the intended repo; otherwise the call falls back to the server's own cwd and sets meta.workspace_warning."New value: +"Absolute path to the target repo root — pass it (or an MCP root) to target the intended repo; otherwise the call falls back to the server's own cwd and sets meta.workspace_warning. On an active call it selects where Codex works, not what it can read — it is not a read boundary."
- Changed
codex_delegate_dry_run2 fields changed- changed
Input schema / properties / model / anyOfPrevious value: -[ - { - "type": "string" - }, - { - "type": "null" - } -]New value: +[ + { + "pattern": "^[^\\x00-\\x1F\\x7F-\\x9F]*$", + "type": "string" + }, + { + "type": "null" + } +] - changed
Input schema / properties / workspace_root / descriptionPrevious value: -"Absolute path to the target repo root — pass it (or an MCP root) to target the intended repo; otherwise the call falls back to the server's own cwd and sets meta.workspace_warning."New value: +"Absolute path to the target repo root — pass it (or an MCP root) to target the intended repo; otherwise the call falls back to the server's own cwd and sets meta.workspace_warning. On an active call it selects where Codex works, not what it can read — it is not a read boundary."
- Changed
codex_dry_run6 fields changed- changed
Input schema / properties / base / anyOfPrevious value: -[ - { - "type": "string" - }, - { - "type": "null" - } -]New value: +[ + { + "pattern": "^[^\\x00-\\x1F\\x7F-\\x9F]*$", + "type": "string" + }, + { + "type": "null" + } +] - changed
Input schema / properties / base / descriptionPrevious value: -"Base git ref for scope='branch'; the review covers base...HEAD."New value: +"Base git ref for scope='branch'; the review covers base...HEAD. Control characters are rejected, not stripped." - changed
Input schema / properties / commit / anyOfPrevious value: -[ - { - "type": "string" - }, - { - "type": "null" - } -]New value: +[ + { + "pattern": "^[^\\x00-\\x1F\\x7F-\\x9F]*$", + "type": "string" + }, + { + "type": "null" + } +] - changed
Input schema / properties / commit / descriptionPrevious value: -"Commit SHA or ref to review for scope='commit'."New value: +"Commit SHA or ref to review for scope='commit'. Control characters are rejected, not stripped." - changed
Input schema / properties / model / anyOfPrevious value: -[ - { - "type": "string" - }, - { - "type": "null" - } -]New value: +[ + { + "pattern": "^[^\\x00-\\x1F\\x7F-\\x9F]*$", + "type": "string" + }, + { + "type": "null" + } +] - changed
Input schema / properties / workspace_root / descriptionPrevious value: -"Absolute path to the target repo root — pass it (or an MCP root) to target the intended repo; otherwise the call falls back to the server's own cwd and sets meta.workspace_warning."New value: +"Absolute path to the target repo root — pass it (or an MCP root) to target the intended repo; otherwise the call falls back to the server's own cwd and sets meta.workspace_warning. On an active call it selects where Codex works, not what it can read — it is not a read boundary."
- Changed
codex_job_cancel3 fields changed- changed
Input schema / properties / job_id / descriptionPrevious value: -"The job_id from an *_async call or a sync call's meta.job_id; recover lost ids with codex_job_list."New value: +"The job_id from an *_async call or a sync call's meta.job_id; recover lost ids with codex_job_list. Control characters are rejected, not stripped." - added
Input schema / properties / job_id / patternAdded value: +"^[^\\x00-\\x1F\\x7F-\\x9F]*$" - changed
Input schema / properties / workspace_root / descriptionPrevious value: -"Absolute path to the target repo root — pass it (or an MCP root) to target the intended repo; otherwise the call falls back to the server's own cwd and sets meta.workspace_warning."New value: +"Absolute path to the target repo root — pass it (or an MCP root) to target the intended repo; otherwise the call falls back to the server's own cwd and sets meta.workspace_warning. On an active call it selects where Codex works, not what it can read — it is not a read boundary."
- Changed
codex_job_consume_result3 fields changed- changed
Input schema / properties / job_id / descriptionPrevious value: -"The job_id from an *_async call or a sync call's meta.job_id; recover lost ids with codex_job_list."New value: +"The job_id from an *_async call or a sync call's meta.job_id; recover lost ids with codex_job_list. Control characters are rejected, not stripped." - added
Input schema / properties / job_id / patternAdded value: +"^[^\\x00-\\x1F\\x7F-\\x9F]*$" - changed
Input schema / properties / workspace_root / descriptionPrevious value: -"Absolute path to the target repo root — pass it (or an MCP root) to target the intended repo; otherwise the call falls back to the server's own cwd and sets meta.workspace_warning."New value: +"Absolute path to the target repo root — pass it (or an MCP root) to target the intended repo; otherwise the call falls back to the server's own cwd and sets meta.workspace_warning. On an active call it selects where Codex works, not what it can read — it is not a read boundary."
- Changed
codex_job_list1 field changed- changed
Input schema / properties / workspace_root / descriptionPrevious value: -"Absolute path to the target repo root — pass it (or an MCP root) to target the intended repo; otherwise the call falls back to the server's own cwd and sets meta.workspace_warning."New value: +"Absolute path to the target repo root — pass it (or an MCP root) to target the intended repo; otherwise the call falls back to the server's own cwd and sets meta.workspace_warning. On an active call it selects where Codex works, not what it can read — it is not a read boundary."
- Changed
codex_job_result3 fields changed- changed
Input schema / properties / job_id / descriptionPrevious value: -"The job_id from an *_async call or a sync call's meta.job_id; recover lost ids with codex_job_list."New value: +"The job_id from an *_async call or a sync call's meta.job_id; recover lost ids with codex_job_list. Control characters are rejected, not stripped." - added
Input schema / properties / job_id / patternAdded value: +"^[^\\x00-\\x1F\\x7F-\\x9F]*$" - changed
Input schema / properties / workspace_root / descriptionPrevious value: -"Absolute path to the target repo root — pass it (or an MCP root) to target the intended repo; otherwise the call falls back to the server's own cwd and sets meta.workspace_warning."New value: +"Absolute path to the target repo root — pass it (or an MCP root) to target the intended repo; otherwise the call falls back to the server's own cwd and sets meta.workspace_warning. On an active call it selects where Codex works, not what it can read — it is not a read boundary."
- Changed
codex_job_status3 fields changed- changed
Input schema / properties / job_id / descriptionPrevious value: -"The job_id from an *_async call or a sync call's meta.job_id; recover lost ids with codex_job_list."New value: +"The job_id from an *_async call or a sync call's meta.job_id; recover lost ids with codex_job_list. Control characters are rejected, not stripped." - added
Input schema / properties / job_id / patternAdded value: +"^[^\\x00-\\x1F\\x7F-\\x9F]*$" - changed
Input schema / properties / workspace_root / descriptionPrevious value: -"Absolute path to the target repo root — pass it (or an MCP root) to target the intended repo; otherwise the call falls back to the server's own cwd and sets meta.workspace_warning."New value: +"Absolute path to the target repo root — pass it (or an MCP root) to target the intended repo; otherwise the call falls back to the server's own cwd and sets meta.workspace_warning. On an active call it selects where Codex works, not what it can read — it is not a read boundary."
- Changed
codex_review_changes7 fields changed- changed
Input schema / properties / base / anyOfPrevious value: -[ - { - "type": "string" - }, - { - "type": "null" - } -]New value: +[ + { + "pattern": "^[^\\x00-\\x1F\\x7F-\\x9F]*$", + "type": "string" + }, + { + "type": "null" + } +] - changed
Input schema / properties / base / descriptionPrevious value: -"Base git ref for scope='branch'; the review covers base...HEAD."New value: +"Base git ref for scope='branch'; the review covers base...HEAD. Control characters are rejected, not stripped." - changed
Input schema / properties / commit / anyOfPrevious value: -[ - { - "type": "string" - }, - { - "type": "null" - } -]New value: +[ + { + "pattern": "^[^\\x00-\\x1F\\x7F-\\x9F]*$", + "type": "string" + }, + { + "type": "null" + } +] - changed
Input schema / properties / commit / descriptionPrevious value: -"Commit SHA or ref to review for scope='commit'."New value: +"Commit SHA or ref to review for scope='commit'. Control characters are rejected, not stripped." - changed
Input schema / properties / model / anyOfPrevious value: -[ - { - "type": "string" - }, - { - "type": "null" - } -]New value: +[ + { + "pattern": "^[^\\x00-\\x1F\\x7F-\\x9F]*$", + "type": "string" + }, + { + "type": "null" + } +] - changed
Input schema / properties / model / descriptionPrevious value: -"Override the Codex model slug for this call; defaults to the server/Codex default when unset."New value: +"Override the Codex model slug for this call; defaults to the server/Codex default when unset. Control characters are rejected, not stripped." - changed
Input schema / properties / workspace_root / descriptionPrevious value: -"Absolute path to the target repo root — pass it (or an MCP root) to target the intended repo; otherwise the call falls back to the server's own cwd and sets meta.workspace_warning."New value: +"Absolute path to the target repo root — pass it (or an MCP root) to target the intended repo; otherwise the call falls back to the server's own cwd and sets meta.workspace_warning. On an active call it selects where Codex works, not what it can read — it is not a read boundary."
- Changed
codex_review_changes_async7 fields changed- changed
Input schema / properties / base / anyOfPrevious value: -[ - { - "type": "string" - }, - { - "type": "null" - } -]New value: +[ + { + "pattern": "^[^\\x00-\\x1F\\x7F-\\x9F]*$", + "type": "string" + }, + { + "type": "null" + } +] - changed
Input schema / properties / base / descriptionPrevious value: -"Base git ref for scope='branch'; the review covers base...HEAD."New value: +"Base git ref for scope='branch'; the review covers base...HEAD. Control characters are rejected, not stripped." - changed
Input schema / properties / commit / anyOfPrevious value: -[ - { - "type": "string" - }, - { - "type": "null" - } -]New value: +[ + { + "pattern": "^[^\\x00-\\x1F\\x7F-\\x9F]*$", + "type": "string" + }, + { + "type": "null" + } +] - changed
Input schema / properties / commit / descriptionPrevious value: -"Commit SHA or ref to review for scope='commit'."New value: +"Commit SHA or ref to review for scope='commit'. Control characters are rejected, not stripped." - changed
Input schema / properties / model / anyOfPrevious value: -[ - { - "type": "string" - }, - { - "type": "null" - } -]New value: +[ + { + "pattern": "^[^\\x00-\\x1F\\x7F-\\x9F]*$", + "type": "string" + }, + { + "type": "null" + } +] - changed
Input schema / properties / model / descriptionPrevious value: -"Override the Codex model slug for this call; defaults to the server/Codex default when unset."New value: +"Override the Codex model slug for this call; defaults to the server/Codex default when unset. Control characters are rejected, not stripped." - changed
Input schema / properties / workspace_root / descriptionPrevious value: -"Absolute path to the target repo root — pass it (or an MCP root) to target the intended repo; otherwise the call falls back to the server's own cwd and sets meta.workspace_warning."New value: +"Absolute path to the target repo root — pass it (or an MCP root) to target the intended repo; otherwise the call falls back to the server's own cwd and sets meta.workspace_warning. On an active call it selects where Codex works, not what it can read — it is not a read boundary."
- Changed
codex_status1 field changed- changed
Output schema / anyOfPrevious value: -[ - { - "additionalProperties": false, - "properties": { - "auth_detail": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - "caveat": { - "type": "string" - }, - "codex_authenticated": { - "anyOf": [ - { - "type": "boolean" - }, - { - "type": "null" - } - ] - }, - "codex_found": { - "type": "boolean" - }, - "codex_version": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - "extra_args_configured": { - "type": "boolean" - }, - "extra_args_count": { - "type": "integer" - }, - "extra_args_valid": { - "type": "boolean" - }, - "fingerprint": { - "type": "string" - }, - "flags_warning": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - "ok": { - "const": true, - "type": "boolean" - }, - "rate_limit": { - "description": "Codex rate-limit snapshot; full schema at resource codex://status-result", - "type": "object" - }, - "raw_defaults": { - "description": "Raw configured defaults; full schema at resource codex://status-result", - "type": "object" - }, - "readiness_detail": { - "type": "string" - }, - "ready": { - "type": "boolean" - }, - "resolved_defaults": { - "description": "Resolved effective defaults; full schema at resource codex://status-result", - "type": "object" - }, - "server_version": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - "version_supported": { - "anyOf": [ - { - "type": "boolean" - }, - { - "type": "null" - } - ] - }, - "version_warning": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - } - }, - "required": [ - "codex_found", - "readiness_detail", - "raw_defaults", - "resolved_defaults", - "caveat" - ], - "type": "object" - }, - { - "properties": { - "error": { - "description": "Populated error envelope; full schema at resource codex://error-envelope", - "type": "object" - }, - "meta": { - "type": "object" - }, - "ok": { - "const": false - } - }, - "required": [ - "ok", - "error", - "meta" - ], - "type": "object" - } -]New value: +[ + { + "additionalProperties": false, + "properties": { + "auth_detail": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "caveat": { + "type": "string" + }, + "codex_authenticated": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "null" + } + ] + }, + "codex_found": { + "type": "boolean" + }, + "codex_version": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "description": "Display copy of `codex --version`: control characters removed, secret-looking values redacted, clipped to 200 characters with a trailing advisory `…[truncated]`; null if codex did not run or nothing printable remained. Do not parse it — `version_supported` is the verdict, and it is parsed from the raw output, which can differ from this." + }, + "extra_args_configured": { + "type": "boolean" + }, + "extra_args_count": { + "type": "integer" + }, + "extra_args_valid": { + "type": "boolean" + }, + "fingerprint": { + "type": "string" + }, + "flags_warning": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "ok": { + "const": true, + "type": "boolean" + }, + "rate_limit": { + "description": "Codex rate-limit snapshot; full schema at resource codex://status-result", + "type": "object" + }, + "raw_defaults": { + "description": "Raw configured defaults; full schema at resource codex://status-result", + "type": "object" + }, + "readiness_detail": { + "type": "string" + }, + "ready": { + "type": "boolean" + }, + "resolved_defaults": { + "description": "Resolved effective defaults; full schema at resource codex://status-result", + "type": "object" + }, + "server_version": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "version_supported": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "null" + } + ] + }, + "version_warning": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + } + }, + "required": [ + "codex_found", + "readiness_detail", + "raw_defaults", + "resolved_defaults", + "caveat" + ], + "type": "object" + }, + { + "properties": { + "error": { + "description": "Populated error envelope; full schema at resource codex://error-envelope", + "type": "object" + }, + "meta": { + "type": "object" + }, + "ok": { + "const": false + } + }, + "required": [ + "ok", + "error", + "meta" + ], + "type": "object" + } +]
- Changed
codex_transfer2 fields changed- added
Input schema / properties / transcript_path / patternAdded value: +"^[^\\x00-\\x1F\\x7F-\\x9F]*$" - changed
Input schema / properties / workspace_root / descriptionPrevious value: -"Absolute path to the target repo root — pass it (or an MCP root) to target the intended repo; otherwise the call falls back to the server's own cwd and sets meta.workspace_warning."New value: +"Absolute path to the target repo root — pass it (or an MCP root) to target the intended repo; otherwise the call falls back to the server's own cwd and sets meta.workspace_warning. On an active call it selects where Codex works, not what it can read — it is not a read boundary."
15 tool updates
v0.17.0- Changed
codex_capabilities4 fields changed- added
Input schema / properties / detailAdded value: +{ + "default": "summary", + "description": "What to return: 'summary' (default) returns each tool's name, cost, stability, and error_codes; the *_async tools also get async_lifecycle. 'full' adds use_when, returns, and the parameter lists (which tools/list already carries). 'contracts' drops tool_details: fetch a schema, or recheck fingerprint, without re-paying for the inventory.", + "enum": [ + "summary", + "full", + "contracts" + ], + "type": "string" +} - changed
Input schema / properties / include_schemas / anyOfPrevious value: -[ - { - "items": { - "enum": [ - "error-envelope", - "result-meta", - "capabilities-result", - "status-result" - ], - "type": "string" - }, - "type": "array" - }, - { - "type": "null" - } -]New value: +[ + { + "items": { + "enum": [ + "error-envelope", + "result-meta", + "capabilities-result", + "status-result", + "parameter-contracts" + ], + "type": "string" + }, + "type": "array" + }, + { + "type": "null" + } +] - changed
Input schema / properties / include_schemas / descriptionPrevious value: -"Opt-in tool-reachable fallback for resource-blind clients: also embed the full 'error-envelope', 'result-meta', 'capabilities-result', and/or 'status-result' schema in the response (the default payload omits them and points at the codex:// resources instead)."New value: +"Opt-in tool-reachable fallback for resource-blind clients: also embed the full 'error-envelope', 'result-meta', 'capabilities-result', and/or 'status-result' schema, and/or the 'parameter-contracts' document (a contract doc, not a JSON Schema, sourced from the codex://params resource body), in the response — the default payload omits them and points at the codex:// resources instead." - changed
Output schema / anyOfPrevious value: -[ - { - "additionalProperties": false, - "properties": { - "active_tools": { - "items": { - "type": "string" - }, - "type": "array" - }, - "deprecation_policy": { - "type": "string" - }, - "error_envelope_resource": { - "type": "string" - }, - "fingerprint": { - "type": "string" - }, - "fingerprint_covers": { - "items": { - "type": "string" - }, - "type": "array" - }, - "free_tools": { - "items": { - "type": "string" - }, - "type": "array" - }, - "name": { - "type": "string" - }, - "negative_scope": { - "items": { - "type": "string" - }, - "type": "array" - }, - "ok": { - "const": true, - "type": "boolean" - }, - "prerequisites": { - "items": { - "type": "string" - }, - "type": "array" - }, - "resource_error_carrier": { - "type": "string" - }, - "result_meta_resource": { - "type": "string" - }, - "sandboxes": { - "items": { - "type": "string" - }, - "type": "array" - }, - "schemas": { - "anyOf": [ - { - "additionalProperties": true, - "type": "object" - }, - { - "type": "null" - } - ] - }, - "scope": { - "items": { - "type": "string" - }, - "type": "array" - }, - "server_version": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - "stability": { - "type": "string" - }, - "tiers": { - "items": { - "type": "string" - }, - "type": "array" - }, - "tool_details": { - "description": "Per-tool capability records; full schema at resource codex://capabilities-result", - "type": "array" - }, - "tool_error_carrier": { - "type": "string" - }, - "transport": { - "type": "string" - }, - "version": { - "type": "string" - } - }, - "required": [ - "name", - "version", - "transport", - "stability", - "active_tools", - "free_tools", - "tiers", - "sandboxes", - "scope", - "negative_scope", - "prerequisites", - "deprecation_policy" - ], - "type": "object" - }, - { - "properties": { - "error": { - "description": "Populated error envelope; full schema at resource codex://error-envelope", - "type": "object" - }, - "meta": { - "type": "object" - }, - "ok": { - "const": false - } - }, - "required": [ - "ok", - "error", - "meta" - ], - "type": "object" - } -]New value: +[ + { + "additionalProperties": false, + "properties": { + "active_tools": { + "items": { + "type": "string" + }, + "type": "array" + }, + "annotations_reading": { + "type": "string" + }, + "deprecation_policy": { + "type": "string" + }, + "error_envelope_resource": { + "type": "string" + }, + "fingerprint": { + "type": "string" + }, + "fingerprint_covers": { + "description": "A contract-semantic change in any listed category changes the fingerprint; nothing outside them does. Release identity is excluded: serverInfo.version, version, server_version change every release WITHOUT moving the fingerprint.", + "items": { + "type": "string" + }, + "type": "array" + }, + "free_tools": { + "items": { + "type": "string" + }, + "type": "array" + }, + "name": { + "type": "string" + }, + "negative_scope": { + "items": { + "type": "string" + }, + "type": "array" + }, + "ok": { + "const": true, + "type": "boolean" + }, + "prerequisites": { + "items": { + "type": "string" + }, + "type": "array" + }, + "protocol_revision": { + "type": "string" + }, + "resource_error_carrier": { + "type": "string" + }, + "result_meta_resource": { + "type": "string" + }, + "sandboxes": { + "items": { + "type": "string" + }, + "type": "array" + }, + "schemas": { + "anyOf": [ + { + "additionalProperties": true, + "type": "object" + }, + { + "type": "null" + } + ] + }, + "scope": { + "items": { + "type": "string" + }, + "type": "array" + }, + "server_version": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "stability": { + "type": "string" + }, + "tiers": { + "items": { + "type": "string" + }, + "type": "array" + }, + "tool_details": { + "description": "Per-tool capability records; full schema at resource codex://capabilities-result", + "type": "array" + }, + "tool_error_carrier": { + "type": "string" + }, + "transport": { + "type": "string" + }, + "version": { + "type": "string" + } + }, + "required": [ + "name", + "version", + "transport", + "stability", + "active_tools", + "free_tools", + "tiers", + "sandboxes", + "scope", + "negative_scope", + "prerequisites", + "deprecation_policy" + ], + "type": "object" + }, + { + "properties": { + "error": { + "description": "Populated error envelope; full schema at resource codex://error-envelope", + "type": "object" + }, + "meta": { + "type": "object" + }, + "ok": { + "const": false + } + }, + "required": [ + "ok", + "error", + "meta" + ], + "type": "object" + } +]
- Changed
codex_consult6 fields changed- changed
Input schema / properties / extra_context / descriptionPrevious value: -"Optional author intent / background context, added to the prompt as clearly-labeled UNTRUSTED data. Codex is instructed to treat embedded directives as data, not commands — best-effort prompt-injection mitigation, not a guarantee. Don't include live secrets: Codex can read files it's pointed at, and redaction does not cover this field."New value: +"Optional author intent/background context, added as clearly-labeled UNTRUSTED prompt data. Redaction does NOT cover it — no live secrets. Full caveats and bounds: codex://params." - changed
Input schema / properties / idempotency_key / descriptionPrevious value: -"Optional client-supplied dedup key, scoped to THIS concrete tool on the same workspace. Reusing it on the same tool with the same arguments replays the existing run instead of starting — and paying for — a duplicate Codex call (a sync call reattaches to the in-flight run and returns its result; an _async call returns the same job_id). The sync and _async variants are DIFFERENT tools and never share a key's run. Reuse with different arguments — including a different timeout_seconds — is refused (idempotency_conflict); a key whose prior result was already consumed/evicted is idempotency_result_unavailable; a still-publishing reservation is idempotency_in_progress (retry). Omit it for the prior no-dedup behavior. A completed result stays replayable while its job record lives (its TTL), subject to consumption or count-eviction; the fail-closed conflict/in-progress window can last longer — up to the job's max runtime + termination grace + TTL. meta.idempotency_replayed=true marks a replayed (unpaid) response."New value: +"Optional dedup key scoped to THIS tool + workspace. Same key + same args replays the prior result with no new spend; different args are refused (idempotency_conflict). Sync and _async are separate tools and never share a key. Omit for none; retention is bounded. Lifecycle: codex://params." - changed
Input schema / properties / isolation / descriptionPrevious value: -"Codex config isolation: 'inherit', 'ignore-config', or 'ignore-rules'. Defaults to the server's configured isolation (built-in default 'inherit'; `codex_status` reports the resolved value)."New value: +"Codex config isolation: 'inherit' | 'ignore-config' | 'ignore-rules'. Defaults to the server's configured value (built-in 'inherit'; `codex_status` reports the resolved one)." - changed
Input schema / properties / question / descriptionPrevious value: -"The question or prompt to send Codex (a different model) for a read-only answer."New value: +"The question or prompt to send Codex (a different model) for a read-only answer. Must be non-blank: empty or whitespace-only is rejected before any model call." - changed
Input schema / properties / reasoning_effort / descriptionPrevious value: -"Override the Codex reasoning effort for this call (sent as a `model_reasoning_effort` config override); omit (or pass null) for the server default (CODEX_IN_CLAUDE_REASONING_EFFORT) or Codex's own resolution. An open per-model string the Codex backend validates at run time — commonly minimal|low|medium|high|xhigh; codex_models lists each model's advertised set (advisory). A backend-rejected value fails as invalid_reasoning_effort; an explicit empty string is sent as-is (and rejected by the backend), never treated as unset. Control characters, surrogates, and values over 128 chars are rejected as invalid_arguments."New value: +"Override the Codex reasoning effort for this call (a model_reasoning_effort override); omit or pass null for the server default (CODEX_IN_CLAUDE_REASONING_EFFORT) or Codex's own resolution. An open, per-model string the backend validates at run time — commonly minimal|low|medium|high|xhigh; codex_models lists each model's advertised set (advisory). Rejection and bounds detail: codex://params." - changed
Input schema / properties / workspace_root / descriptionPrevious value: -"Absolute path to the target repository root. Pass it (or rely on an MCP root) so the call targets the intended repo; otherwise it falls back to the server's own cwd and meta.workspace_warning is set."New value: +"Absolute path to the target repo root — pass it (or an MCP root) to target the intended repo; otherwise the call falls back to the server's own cwd and sets meta.workspace_warning."
- Changed
codex_consult_async7 fields changed- changed
Input schema / properties / extra_context / descriptionPrevious value: -"Optional author intent / background context, added to the prompt as clearly-labeled UNTRUSTED data. Codex is instructed to treat embedded directives as data, not commands — best-effort prompt-injection mitigation, not a guarantee. Don't include live secrets: Codex can read files it's pointed at, and redaction does not cover this field."New value: +"Optional author intent/background context, added as clearly-labeled UNTRUSTED prompt data. Redaction does NOT cover it — no live secrets. Full caveats and bounds: codex://params." - changed
Input schema / properties / idempotency_key / descriptionPrevious value: -"Optional client-supplied dedup key, scoped to THIS concrete tool on the same workspace. Reusing it on the same tool with the same arguments replays the existing run instead of starting — and paying for — a duplicate Codex call (a sync call reattaches to the in-flight run and returns its result; an _async call returns the same job_id). The sync and _async variants are DIFFERENT tools and never share a key's run. Reuse with different arguments — including a different timeout_seconds — is refused (idempotency_conflict); a key whose prior result was already consumed/evicted is idempotency_result_unavailable; a still-publishing reservation is idempotency_in_progress (retry). Omit it for the prior no-dedup behavior. A completed result stays replayable while its job record lives (its TTL), subject to consumption or count-eviction; the fail-closed conflict/in-progress window can last longer — up to the job's max runtime + termination grace + TTL. meta.idempotency_replayed=true marks a replayed (unpaid) response."New value: +"Optional dedup key scoped to THIS tool + workspace. Same key + same args replays the prior result with no new spend; different args are refused (idempotency_conflict). Sync and _async are separate tools and never share a key. Omit for none; retention is bounded. Lifecycle: codex://params." - changed
Input schema / properties / isolation / descriptionPrevious value: -"Codex config isolation: 'inherit', 'ignore-config', or 'ignore-rules'. Defaults to the server's configured isolation (built-in default 'inherit'; `codex_status` reports the resolved value)."New value: +"Codex config isolation: 'inherit' | 'ignore-config' | 'ignore-rules'. Defaults to the server's configured value (built-in 'inherit'; `codex_status` reports the resolved one)." - changed
Input schema / properties / question / descriptionPrevious value: -"The question or prompt to send Codex (a different model) for a read-only answer."New value: +"The question or prompt to send Codex (a different model) for a read-only answer. Must be non-blank: empty or whitespace-only is rejected before any model call." - changed
Input schema / properties / reasoning_effort / descriptionPrevious value: -"Override the Codex reasoning effort for this call (sent as a `model_reasoning_effort` config override); omit (or pass null) for the server default (CODEX_IN_CLAUDE_REASONING_EFFORT) or Codex's own resolution. An open per-model string the Codex backend validates at run time — commonly minimal|low|medium|high|xhigh; codex_models lists each model's advertised set (advisory). A backend-rejected value fails as invalid_reasoning_effort; an explicit empty string is sent as-is (and rejected by the backend), never treated as unset. Control characters, surrogates, and values over 128 chars are rejected as invalid_arguments."New value: +"Override the Codex reasoning effort for this call (a model_reasoning_effort override); omit or pass null for the server default (CODEX_IN_CLAUDE_REASONING_EFFORT) or Codex's own resolution. An open, per-model string the backend validates at run time — commonly minimal|low|medium|high|xhigh; codex_models lists each model's advertised set (advisory). Rejection and bounds detail: codex://params." - changed
Input schema / properties / workspace_root / descriptionPrevious value: -"Absolute path to the target repository root. Pass it (or rely on an MCP root) so the call targets the intended repo; otherwise it falls back to the server's own cwd and meta.workspace_warning is set."New value: +"Absolute path to the target repo root — pass it (or an MCP root) to target the intended repo; otherwise the call falls back to the server's own cwd and sets meta.workspace_warning." - changed
Output schema / anyOfPrevious value: -[ - { - "additionalProperties": false, - "properties": { - "deadline_seconds": { - "type": "integer" - }, - "expires_at": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - "fingerprint": { - "type": "string" - }, - "job_id": { - "type": "string" - }, - "kind": { - "type": "string" - }, - "meta": { - "description": "Result metadata (cwd, tier, sandbox, model, timeout, usage, rate_limit, and more); full schema at resource codex://result-meta", - "type": "object" - }, - "ok": { - "const": true, - "type": "boolean" - }, - "poll_after_ms": { - "type": "integer" - }, - "server_version": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - "started_at": { - "type": "string" - }, - "status": { - "enum": [ - "running", - "done", - "failed", - "cancelled", - "timeout" - ], - "type": "string" - }, - "ttl_seconds": { - "type": "integer" - } - }, - "required": [ - "job_id", - "kind", - "started_at", - "deadline_seconds", - "ttl_seconds", - "meta" - ], - "type": "object" - }, - { - "properties": { - "error": { - "description": "Populated error envelope; full schema at resource codex://error-envelope", - "type": "object" - }, - "meta": { - "type": "object" - }, - "ok": { - "const": false - } - }, - "required": [ - "ok", - "error", - "meta" - ], - "type": "object" - } -]New value: +[ + { + "additionalProperties": false, + "properties": { + "deadline_seconds": { + "type": "integer" + }, + "expires_at": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "fingerprint": { + "type": "string" + }, + "follow_up": { + "additionalProperties": false, + "properties": { + "alternative": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "arguments": { + "anyOf": [ + { + "additionalProperties": true, + "type": "object" + }, + { + "type": "null" + } + ] + }, + "next_step": { + "enum": [ + "retry_after_delay", + "correct_arguments", + "use_allowed_value", + "reduce_input", + "use_workspace_in_roots", + "poll_job_status", + "list_jobs", + "list_resources", + "start_new_job", + "authenticate", + "install_codex", + "install_git", + "init_git_repo", + "update_plugin", + "correct_config", + "inspect_and_retry", + "retry_then_report", + "use_new_idempotency_key" + ], + "type": "string" + }, + "tool": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + } + }, + "required": [ + "next_step" + ], + "type": "object" + }, + "job_id": { + "type": "string" + }, + "kind": { + "type": "string" + }, + "meta": { + "description": "Result metadata (cwd, tier, sandbox, model, timeout, usage, rate_limit, and more); full schema at resource codex://result-meta", + "type": "object" + }, + "ok": { + "const": true, + "type": "boolean" + }, + "poll_after_ms": { + "type": "integer" + }, + "server_version": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "started_at": { + "type": "string" + }, + "status": { + "enum": [ + "running", + "done", + "failed", + "cancelled", + "timeout" + ], + "type": "string" + }, + "ttl_seconds": { + "type": "integer" + } + }, + "required": [ + "job_id", + "kind", + "started_at", + "deadline_seconds", + "ttl_seconds", + "meta", + "follow_up" + ], + "type": "object" + }, + { + "properties": { + "error": { + "description": "Populated error envelope; full schema at resource codex://error-envelope", + "type": "object" + }, + "meta": { + "type": "object" + }, + "ok": { + "const": false + } + }, + "required": [ + "ok", + "error", + "meta" + ], + "type": "object" + } +]
- Changed
codex_delegate5 fields changed- changed
Input schema / properties / idempotency_key / descriptionPrevious value: -"Optional client-supplied dedup key, scoped to THIS concrete tool on the same workspace. Reusing it on the same tool with the same arguments replays the existing run instead of starting — and paying for — a duplicate Codex call (a sync call reattaches to the in-flight run and returns its result; an _async call returns the same job_id). The sync and _async variants are DIFFERENT tools and never share a key's run. Reuse with different arguments — including a different timeout_seconds — is refused (idempotency_conflict); a key whose prior result was already consumed/evicted is idempotency_result_unavailable; a still-publishing reservation is idempotency_in_progress (retry). Omit it for the prior no-dedup behavior. A completed result stays replayable while its job record lives (its TTL), subject to consumption or count-eviction; the fail-closed conflict/in-progress window can last longer — up to the job's max runtime + termination grace + TTL. meta.idempotency_replayed=true marks a replayed (unpaid) response."New value: +"Optional dedup key scoped to THIS tool + workspace. Same key + same args replays the prior result with no new spend; different args are refused (idempotency_conflict). Sync and _async are separate tools and never share a key. Omit for none; retention is bounded. Lifecycle: codex://params." - changed
Input schema / properties / isolation / descriptionPrevious value: -"Codex config isolation: 'inherit', 'ignore-config', or 'ignore-rules'. Defaults to the server's configured isolation (built-in default 'inherit'; `codex_status` reports the resolved value)."New value: +"Codex config isolation: 'inherit' | 'ignore-config' | 'ignore-rules'. Defaults to the server's configured value (built-in 'inherit'; `codex_status` reports the resolved one)." - changed
Input schema / properties / reasoning_effort / descriptionPrevious value: -"Override the Codex reasoning effort for this call (sent as a `model_reasoning_effort` config override); omit (or pass null) for the server default (CODEX_IN_CLAUDE_REASONING_EFFORT) or Codex's own resolution. An open per-model string the Codex backend validates at run time — commonly minimal|low|medium|high|xhigh; codex_models lists each model's advertised set (advisory). A backend-rejected value fails as invalid_reasoning_effort; an explicit empty string is sent as-is (and rejected by the backend), never treated as unset. Control characters, surrogates, and values over 128 chars are rejected as invalid_arguments."New value: +"Override the Codex reasoning effort for this call (a model_reasoning_effort override); omit or pass null for the server default (CODEX_IN_CLAUDE_REASONING_EFFORT) or Codex's own resolution. An open, per-model string the backend validates at run time — commonly minimal|low|medium|high|xhigh; codex_models lists each model's advertised set (advisory). Rejection and bounds detail: codex://params." - changed
Input schema / properties / task / descriptionPrevious value: -"The coding task for Codex to implement inside a throwaway git worktree; the resulting diff is returned for review, not applied to your tree."New value: +"The coding task for Codex to implement inside a throwaway git worktree; the resulting diff is returned for review, not applied to your tree. Must be non-blank: empty or whitespace-only is rejected before any model call." - changed
Input schema / properties / workspace_root / descriptionPrevious value: -"Absolute path to the target repository root. Pass it (or rely on an MCP root) so the call targets the intended repo; otherwise it falls back to the server's own cwd and meta.workspace_warning is set."New value: +"Absolute path to the target repo root — pass it (or an MCP root) to target the intended repo; otherwise the call falls back to the server's own cwd and sets meta.workspace_warning."
- Changed
codex_delegate_async6 fields changed- changed
Input schema / properties / idempotency_key / descriptionPrevious value: -"Optional client-supplied dedup key, scoped to THIS concrete tool on the same workspace. Reusing it on the same tool with the same arguments replays the existing run instead of starting — and paying for — a duplicate Codex call (a sync call reattaches to the in-flight run and returns its result; an _async call returns the same job_id). The sync and _async variants are DIFFERENT tools and never share a key's run. Reuse with different arguments — including a different timeout_seconds — is refused (idempotency_conflict); a key whose prior result was already consumed/evicted is idempotency_result_unavailable; a still-publishing reservation is idempotency_in_progress (retry). Omit it for the prior no-dedup behavior. A completed result stays replayable while its job record lives (its TTL), subject to consumption or count-eviction; the fail-closed conflict/in-progress window can last longer — up to the job's max runtime + termination grace + TTL. meta.idempotency_replayed=true marks a replayed (unpaid) response."New value: +"Optional dedup key scoped to THIS tool + workspace. Same key + same args replays the prior result with no new spend; different args are refused (idempotency_conflict). Sync and _async are separate tools and never share a key. Omit for none; retention is bounded. Lifecycle: codex://params." - changed
Input schema / properties / isolation / descriptionPrevious value: -"Codex config isolation: 'inherit', 'ignore-config', or 'ignore-rules'. Defaults to the server's configured isolation (built-in default 'inherit'; `codex_status` reports the resolved value)."New value: +"Codex config isolation: 'inherit' | 'ignore-config' | 'ignore-rules'. Defaults to the server's configured value (built-in 'inherit'; `codex_status` reports the resolved one)." - changed
Input schema / properties / reasoning_effort / descriptionPrevious value: -"Override the Codex reasoning effort for this call (sent as a `model_reasoning_effort` config override); omit (or pass null) for the server default (CODEX_IN_CLAUDE_REASONING_EFFORT) or Codex's own resolution. An open per-model string the Codex backend validates at run time — commonly minimal|low|medium|high|xhigh; codex_models lists each model's advertised set (advisory). A backend-rejected value fails as invalid_reasoning_effort; an explicit empty string is sent as-is (and rejected by the backend), never treated as unset. Control characters, surrogates, and values over 128 chars are rejected as invalid_arguments."New value: +"Override the Codex reasoning effort for this call (a model_reasoning_effort override); omit or pass null for the server default (CODEX_IN_CLAUDE_REASONING_EFFORT) or Codex's own resolution. An open, per-model string the backend validates at run time — commonly minimal|low|medium|high|xhigh; codex_models lists each model's advertised set (advisory). Rejection and bounds detail: codex://params." - changed
Input schema / properties / task / descriptionPrevious value: -"The coding task for Codex to implement inside a throwaway git worktree; the resulting diff is returned for review, not applied to your tree."New value: +"The coding task for Codex to implement inside a throwaway git worktree; the resulting diff is returned for review, not applied to your tree. Must be non-blank: empty or whitespace-only is rejected before any model call." - changed
Input schema / properties / workspace_root / descriptionPrevious value: -"Absolute path to the target repository root. Pass it (or rely on an MCP root) so the call targets the intended repo; otherwise it falls back to the server's own cwd and meta.workspace_warning is set."New value: +"Absolute path to the target repo root — pass it (or an MCP root) to target the intended repo; otherwise the call falls back to the server's own cwd and sets meta.workspace_warning." - changed
Output schema / anyOfPrevious value: -[ - { - "additionalProperties": false, - "properties": { - "deadline_seconds": { - "type": "integer" - }, - "expires_at": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - "fingerprint": { - "type": "string" - }, - "job_id": { - "type": "string" - }, - "kind": { - "type": "string" - }, - "meta": { - "description": "Result metadata (cwd, tier, sandbox, model, timeout, usage, rate_limit, and more); full schema at resource codex://result-meta", - "type": "object" - }, - "ok": { - "const": true, - "type": "boolean" - }, - "poll_after_ms": { - "type": "integer" - }, - "server_version": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - "started_at": { - "type": "string" - }, - "status": { - "enum": [ - "running", - "done", - "failed", - "cancelled", - "timeout" - ], - "type": "string" - }, - "ttl_seconds": { - "type": "integer" - } - }, - "required": [ - "job_id", - "kind", - "started_at", - "deadline_seconds", - "ttl_seconds", - "meta" - ], - "type": "object" - }, - { - "properties": { - "error": { - "description": "Populated error envelope; full schema at resource codex://error-envelope", - "type": "object" - }, - "meta": { - "type": "object" - }, - "ok": { - "const": false - } - }, - "required": [ - "ok", - "error", - "meta" - ], - "type": "object" - } -]New value: +[ + { + "additionalProperties": false, + "properties": { + "deadline_seconds": { + "type": "integer" + }, + "expires_at": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "fingerprint": { + "type": "string" + }, + "follow_up": { + "additionalProperties": false, + "properties": { + "alternative": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "arguments": { + "anyOf": [ + { + "additionalProperties": true, + "type": "object" + }, + { + "type": "null" + } + ] + }, + "next_step": { + "enum": [ + "retry_after_delay", + "correct_arguments", + "use_allowed_value", + "reduce_input", + "use_workspace_in_roots", + "poll_job_status", + "list_jobs", + "list_resources", + "start_new_job", + "authenticate", + "install_codex", + "install_git", + "init_git_repo", + "update_plugin", + "correct_config", + "inspect_and_retry", + "retry_then_report", + "use_new_idempotency_key" + ], + "type": "string" + }, + "tool": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + } + }, + "required": [ + "next_step" + ], + "type": "object" + }, + "job_id": { + "type": "string" + }, + "kind": { + "type": "string" + }, + "meta": { + "description": "Result metadata (cwd, tier, sandbox, model, timeout, usage, rate_limit, and more); full schema at resource codex://result-meta", + "type": "object" + }, + "ok": { + "const": true, + "type": "boolean" + }, + "poll_after_ms": { + "type": "integer" + }, + "server_version": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "started_at": { + "type": "string" + }, + "status": { + "enum": [ + "running", + "done", + "failed", + "cancelled", + "timeout" + ], + "type": "string" + }, + "ttl_seconds": { + "type": "integer" + } + }, + "required": [ + "job_id", + "kind", + "started_at", + "deadline_seconds", + "ttl_seconds", + "meta", + "follow_up" + ], + "type": "object" + }, + { + "properties": { + "error": { + "description": "Populated error envelope; full schema at resource codex://error-envelope", + "type": "object" + }, + "meta": { + "type": "object" + }, + "ok": { + "const": false + } + }, + "required": [ + "ok", + "error", + "meta" + ], + "type": "object" + } +]
- Changed
codex_delegate_dry_run4 fields changed- changed
Input schema / properties / isolation / descriptionPrevious value: -"Codex config isolation: 'inherit', 'ignore-config', or 'ignore-rules'. Defaults to the server's configured isolation (built-in default 'inherit'; `codex_status` reports the resolved value)."New value: +"Codex config isolation: 'inherit' | 'ignore-config' | 'ignore-rules'. Defaults to the server's configured value (built-in 'inherit'; `codex_status` reports the resolved one)." - changed
Input schema / properties / task / descriptionPrevious value: -"The coding task you want Codex to implement via a real codex_delegate call; this dry run only previews the seeded baseline and prompt size — it does NOT call Codex or return a diff."New value: +"The coding task you want Codex to implement via a real codex_delegate call; this dry run only previews the seeded baseline and prompt size — it does NOT call Codex or return a diff. Must be non-blank: empty or whitespace-only is rejected here too, not previewed." - changed
Input schema / properties / workspace_root / descriptionPrevious value: -"Absolute path to the target repository root. Pass it (or rely on an MCP root) so the call targets the intended repo; otherwise it falls back to the server's own cwd and meta.workspace_warning is set."New value: +"Absolute path to the target repo root — pass it (or an MCP root) to target the intended repo; otherwise the call falls back to the server's own cwd and sets meta.workspace_warning." - changed
Output schema / anyOfPrevious value: -[ - { - "additionalProperties": false, - "properties": { - "cwd": { - "type": "string" - }, - "fingerprint": { - "type": "string" - }, - "isolation": { - "enum": [ - "inherit", - "ignore-config", - "ignore-rules" - ], - "type": "string" - }, - "max_input_bytes": { - "type": "integer" - }, - "model": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "description": "Model override the previewed paid call would send (per-call param or server default); null = Codex would resolve it itself. Unvalidated by the preview." - }, - "ok": { - "const": true, - "type": "boolean" - }, - "prompt_bytes": { - "type": "integer" - }, - "reasoning_effort": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "description": "Reasoning-effort override the previewed paid call would send (per-call param or server default); null = Codex would resolve it itself. Unvalidated by the preview." - }, - "sandbox": { - "enum": [ - "read-only", - "workspace-write", - "danger-full-access" - ], - "type": "string" - }, - "server_version": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - "tier": { - "enum": [ - "consult", - "propose", - "apply" - ], - "type": "string" - }, - "tool": { - "const": "codex_delegate_dry_run", - "type": "string" - }, - "workspace_source": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - "workspace_warning": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - "worktree_plan": { - "additionalProperties": false, - "properties": { - "head_commit": { - "type": "string" - }, - "head_subject": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - "note": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - "tracked_bytes": { - "type": "integer" - }, - "tracked_files": { - "type": "integer" - }, - "uncommitted_tracked_files": { - "type": "integer" - }, - "untracked_files": { - "type": "integer" - } - }, - "required": [ - "head_commit", - "tracked_files", - "tracked_bytes", - "uncommitted_tracked_files", - "untracked_files" - ], - "type": "object" - } - }, - "required": [ - "cwd", - "isolation", - "prompt_bytes", - "max_input_bytes", - "worktree_plan" - ], - "type": "object" - }, - { - "properties": { - "error": { - "description": "Populated error envelope; full schema at resource codex://error-envelope", - "type": "object" - }, - "meta": { - "type": "object" - }, - "ok": { - "const": false - } - }, - "required": [ - "ok", - "error", - "meta" - ], - "type": "object" - } -]New value: +[ + { + "additionalProperties": false, + "properties": { + "cwd": { + "type": "string" + }, + "deadline_advisory": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "description": "Non-null when the previewed call would actually run the model AND its prompt size or reasoning effort risks the synchronous deadline; null otherwise (including whenever it would not call the model at all). Names the previewed PAID tool's own `_async` counterpart verbatim (e.g. codex_review_changes_async for a codex_dry_run preview) — never this dry-run tool's own name, which has no `_async` variant. A hint, not a refusal. codex_consult has no dry-run preview; prefer codex_consult_async for a high-effort or broad repo-grounded consult." + }, + "fingerprint": { + "type": "string" + }, + "isolation": { + "enum": [ + "inherit", + "ignore-config", + "ignore-rules" + ], + "type": "string" + }, + "max_input_bytes": { + "type": "integer" + }, + "model": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "description": "Model override the previewed paid call would send (per-call param or server default); null = Codex would resolve it itself. Unvalidated by the preview." + }, + "ok": { + "const": true, + "type": "boolean" + }, + "prompt_bytes": { + "type": "integer" + }, + "reasoning_effort": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "description": "Reasoning-effort override the previewed paid call would send (per-call param or server default); null = Codex would resolve it itself. Unvalidated by the preview." + }, + "roots_source": { + "anyOf": [ + { + "enum": [ + "client", + "not_negotiated", + "probe_failed" + ], + "type": "string" + }, + { + "type": "null" + } + ] + }, + "sandbox": { + "enum": [ + "read-only", + "workspace-write", + "danger-full-access" + ], + "type": "string" + }, + "server_version": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "tier": { + "enum": [ + "consult", + "propose", + "apply" + ], + "type": "string" + }, + "tool": { + "const": "codex_delegate_dry_run", + "type": "string" + }, + "workspace_source": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "workspace_warning": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "worktree_plan": { + "additionalProperties": false, + "properties": { + "head_commit": { + "type": "string" + }, + "head_subject": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "note": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "tracked_bytes": { + "type": "integer" + }, + "tracked_files": { + "type": "integer" + }, + "uncommitted_tracked_files": { + "type": "integer" + }, + "untracked_files": { + "type": "integer" + } + }, + "required": [ + "head_commit", + "tracked_files", + "tracked_bytes", + "uncommitted_tracked_files", + "untracked_files" + ], + "type": "object" + } + }, + "required": [ + "cwd", + "isolation", + "prompt_bytes", + "max_input_bytes", + "worktree_plan" + ], + "type": "object" + }, + { + "properties": { + "error": { + "description": "Populated error envelope; full schema at resource codex://error-envelope", + "type": "object" + }, + "meta": { + "type": "object" + }, + "ok": { + "const": false + } + }, + "required": [ + "ok", + "error", + "meta" + ], + "type": "object" + } +]
- Changed
codex_dry_run4 fields changed- changed
Input schema / properties / extra_context / descriptionPrevious value: -"Optional author intent / background context, added to the prompt as clearly-labeled UNTRUSTED data. Codex is instructed to treat embedded directives as data, not commands — best-effort prompt-injection mitigation, not a guarantee. Don't include live secrets: Codex can read files it's pointed at, and redaction does not cover this field."New value: +"Optional author intent/background context, added as clearly-labeled UNTRUSTED prompt data. Redaction does NOT cover it — no live secrets. Full caveats and bounds: codex://params." - changed
Input schema / properties / isolation / descriptionPrevious value: -"Codex config isolation: 'inherit', 'ignore-config', or 'ignore-rules'. Defaults to the server's configured isolation (built-in default 'inherit'; `codex_status` reports the resolved value)."New value: +"Codex config isolation: 'inherit' | 'ignore-config' | 'ignore-rules'. Defaults to the server's configured value (built-in 'inherit'; `codex_status` reports the resolved one)." - changed
Input schema / properties / workspace_root / descriptionPrevious value: -"Absolute path to the target repository root. Pass it (or rely on an MCP root) so the call targets the intended repo; otherwise it falls back to the server's own cwd and meta.workspace_warning is set."New value: +"Absolute path to the target repo root — pass it (or an MCP root) to target the intended repo; otherwise the call falls back to the server's own cwd and sets meta.workspace_warning." - changed
Output schema / anyOfPrevious value: -[ - { - "additionalProperties": false, - "properties": { - "base": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - "commit": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - "context_summary": { - "anyOf": [ - { - "additionalProperties": false, - "properties": { - "files_changed": { - "type": "integer" - }, - "lines_added": { - "type": "integer" - }, - "lines_removed": { - "type": "integer" - } - }, - "type": "object" - }, - { - "type": "null" - } - ] - }, - "coverage": { - "additionalProperties": false, - "properties": { - "omission_reasons": { - "items": { - "enum": [ - "untracked_omitted", - "truncated", - "redacted" - ], - "type": "string" - }, - "type": "array" - }, - "status": { - "enum": [ - "complete", - "partial" - ], - "type": "string" - }, - "untracked_files_detected": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ] - }, - "untracked_files_included": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ] - }, - "untracked_files_omitted": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ] - } - }, - "required": [ - "status" - ], - "type": "object" - }, - "cwd": { - "type": "string" - }, - "fingerprint": { - "type": "string" - }, - "isolation": { - "enum": [ - "inherit", - "ignore-config", - "ignore-rules" - ], - "type": "string" - }, - "max_input_bytes": { - "type": "integer" - }, - "model": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "description": "Model override the previewed paid call would send (per-call param or server default); null = Codex would resolve it itself. Unvalidated by the preview." - }, - "ok": { - "const": true, - "type": "boolean" - }, - "paths": { - "items": { - "type": "string" - }, - "type": "array" - }, - "prompt_bytes": { - "type": "integer" - }, - "reasoning_effort": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "description": "Reasoning-effort override the previewed paid call would send (per-call param or server default); null = Codex would resolve it itself. Unvalidated by the preview." - }, - "redacted_paths": { - "items": { - "type": "string" - }, - "type": "array" - }, - "redacted_paths_count": { - "type": "integer" - }, - "sandbox": { - "enum": [ - "read-only", - "workspace-write", - "danger-full-access" - ], - "type": "string" - }, - "scope": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - "security_warnings": { - "items": { - "type": "string" - }, - "type": "array" - }, - "server_version": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - "tier": { - "enum": [ - "consult", - "propose", - "apply" - ], - "type": "string" - }, - "tool": { - "const": "codex_dry_run", - "type": "string" - }, - "truncated": { - "type": "boolean" - }, - "truncation_hint": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - "workspace_source": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - "workspace_warning": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - "would_call_model": { - "type": "boolean" - } - }, - "required": [ - "cwd", - "tier", - "sandbox", - "isolation", - "would_call_model", - "prompt_bytes", - "coverage", - "max_input_bytes" - ], - "type": "object" - }, - { - "properties": { - "error": { - "description": "Populated error envelope; full schema at resource codex://error-envelope", - "type": "object" - }, - "meta": { - "type": "object" - }, - "ok": { - "const": false - } - }, - "required": [ - "ok", - "error", - "meta" - ], - "type": "object" - } -]New value: +[ + { + "additionalProperties": false, + "properties": { + "base": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "commit": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "context_summary": { + "anyOf": [ + { + "additionalProperties": false, + "properties": { + "files_changed": { + "type": "integer" + }, + "lines_added": { + "type": "integer" + }, + "lines_removed": { + "type": "integer" + } + }, + "type": "object" + }, + { + "type": "null" + } + ] + }, + "coverage": { + "additionalProperties": false, + "properties": { + "omission_reasons": { + "items": { + "enum": [ + "untracked_omitted", + "tree_changed_during_gather", + "truncated", + "redacted" + ], + "type": "string" + }, + "type": "array" + }, + "redaction": { + "anyOf": [ + { + "additionalProperties": false, + "properties": { + "inline_masks": { + "minimum": 0, + "type": "integer" + }, + "masked_paths": { + "items": { + "type": "string" + }, + "type": "array" + }, + "withheld_paths": { + "items": { + "type": "string" + }, + "type": "array" + } + }, + "type": "object" + }, + { + "type": "null" + } + ] + }, + "status": { + "enum": [ + "complete", + "partial" + ], + "type": "string" + }, + "untracked_files_detected": { + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ] + }, + "untracked_files_included": { + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ] + }, + "untracked_files_omitted": { + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ] + } + }, + "required": [ + "status" + ], + "type": "object" + }, + "cwd": { + "type": "string" + }, + "deadline_advisory": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "description": "Non-null when the previewed call would actually run the model AND its prompt size or reasoning effort risks the synchronous deadline; null otherwise (including whenever it would not call the model at all). Names the previewed PAID tool's own `_async` counterpart verbatim (e.g. codex_review_changes_async for a codex_dry_run preview) — never this dry-run tool's own name, which has no `_async` variant. A hint, not a refusal. codex_consult has no dry-run preview; prefer codex_consult_async for a high-effort or broad repo-grounded consult." + }, + "fingerprint": { + "type": "string" + }, + "isolation": { + "enum": [ + "inherit", + "ignore-config", + "ignore-rules" + ], + "type": "string" + }, + "max_input_bytes": { + "type": "integer" + }, + "model": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "description": "Model override the previewed paid call would send (per-call param or server default); null = Codex would resolve it itself. Unvalidated by the preview." + }, + "ok": { + "const": true, + "type": "boolean" + }, + "paths": { + "items": { + "type": "string" + }, + "type": "array" + }, + "prompt_bytes": { + "type": "integer" + }, + "reasoning_effort": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "description": "Reasoning-effort override the previewed paid call would send (per-call param or server default); null = Codex would resolve it itself. Unvalidated by the preview." + }, + "redacted_paths": { + "items": { + "type": "string" + }, + "type": "array" + }, + "redacted_paths_count": { + "type": "integer" + }, + "roots_source": { + "anyOf": [ + { + "enum": [ + "client", + "not_negotiated", + "probe_failed" + ], + "type": "string" + }, + { + "type": "null" + } + ] + }, + "sandbox": { + "enum": [ + "read-only", + "workspace-write", + "danger-full-access" + ], + "type": "string" + }, + "scope": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "security_warnings": { + "items": { + "type": "string" + }, + "type": "array" + }, + "server_version": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "tier": { + "enum": [ + "consult", + "propose", + "apply" + ], + "type": "string" + }, + "tool": { + "const": "codex_dry_run", + "type": "string" + }, + "truncated": { + "type": "boolean" + }, + "truncation_hint": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "workspace_source": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "workspace_warning": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "would_call_model": { + "type": "boolean" + } + }, + "required": [ + "cwd", + "tier", + "sandbox", + "isolation", + "would_call_model", + "prompt_bytes", + "coverage", + "max_input_bytes" + ], + "type": "object" + }, + { + "properties": { + "error": { + "description": "Populated error envelope; full schema at resource codex://error-envelope", + "type": "object" + }, + "meta": { + "type": "object" + }, + "ok": { + "const": false + } + }, + "required": [ + "ok", + "error", + "meta" + ], + "type": "object" + } +]
- Changed
codex_job_cancel2 fields changed- changed
Input schema / properties / workspace_root / descriptionPrevious value: -"Absolute path to the target repository root. Pass it (or rely on an MCP root) so the call targets the intended repo; otherwise it falls back to the server's own cwd and meta.workspace_warning is set."New value: +"Absolute path to the target repo root — pass it (or an MCP root) to target the intended repo; otherwise the call falls back to the server's own cwd and sets meta.workspace_warning." - changed
Output schema / anyOfPrevious value: -[ - { - "additionalProperties": false, - "properties": { - "cleanup_warnings": { - "items": { - "type": "string" - }, - "type": "array" - }, - "deadline_seconds": { - "type": "integer" - }, - "detail": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - "elapsed_ms": { - "type": "integer" - }, - "event_age_ms": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ] - }, - "events_seen": { - "type": "integer" - }, - "expires_at": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - "fingerprint": { - "type": "string" - }, - "job_id": { - "type": "string" - }, - "kind": { - "type": "string" - }, - "last_event_at": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - "ok": { - "const": true, - "type": "boolean" - }, - "poll_after_ms": { - "type": "integer" - }, - "result_available": { - "type": "boolean" - }, - "server_version": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - "started_at": { - "type": "string" - }, - "status": { - "enum": [ - "running", - "done", - "failed", - "cancelled", - "timeout" - ], - "type": "string" - }, - "ttl_seconds": { - "type": "integer" - }, - "workspace": { - "additionalProperties": false, - "properties": { - "cwd": { - "type": "string" - }, - "workspace_source": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - "workspace_warning": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - } - }, - "required": [ - "cwd" - ], - "type": "object" - } - }, - "required": [ - "job_id", - "kind", - "status", - "started_at", - "elapsed_ms", - "deadline_seconds", - "ttl_seconds", - "workspace" - ], - "type": "object" - }, - { - "properties": { - "error": { - "description": "Populated error envelope; full schema at resource codex://error-envelope", - "type": "object" - }, - "meta": { - "type": "object" - }, - "ok": { - "const": false - } - }, - "required": [ - "ok", - "error", - "meta" - ], - "type": "object" - } -]New value: +[ + { + "additionalProperties": false, + "properties": { + "cleanup_warnings": { + "items": { + "type": "string" + }, + "type": "array" + }, + "deadline_seconds": { + "type": "integer" + }, + "detail": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "elapsed_ms": { + "type": "integer" + }, + "event_age_ms": { + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ] + }, + "events_seen": { + "type": "integer" + }, + "expires_at": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "fingerprint": { + "type": "string" + }, + "job_id": { + "type": "string" + }, + "kind": { + "type": "string" + }, + "last_event_at": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "ok": { + "const": true, + "type": "boolean" + }, + "poll_after_ms": { + "type": "integer" + }, + "result_available": { + "type": "boolean" + }, + "result_ok": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "null" + } + ] + }, + "server_version": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "started_at": { + "type": "string" + }, + "status": { + "enum": [ + "running", + "done", + "failed", + "cancelled", + "timeout" + ], + "type": "string" + }, + "ttl_seconds": { + "type": "integer" + }, + "workspace": { + "additionalProperties": false, + "properties": { + "cwd": { + "type": "string" + }, + "workspace_source": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "workspace_warning": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + } + }, + "required": [ + "cwd" + ], + "type": "object" + } + }, + "required": [ + "job_id", + "kind", + "status", + "started_at", + "elapsed_ms", + "deadline_seconds", + "ttl_seconds", + "result_ok", + "workspace" + ], + "type": "object" + }, + { + "properties": { + "error": { + "description": "Populated error envelope; full schema at resource codex://error-envelope", + "type": "object" + }, + "meta": { + "type": "object" + }, + "ok": { + "const": false + } + }, + "required": [ + "ok", + "error", + "meta" + ], + "type": "object" + } +]
- Changed
codex_job_consume_result1 field changed- changed
Input schema / properties / workspace_root / descriptionPrevious value: -"Absolute path to the target repository root. Pass it (or rely on an MCP root) so the call targets the intended repo; otherwise it falls back to the server's own cwd and meta.workspace_warning is set."New value: +"Absolute path to the target repo root — pass it (or an MCP root) to target the intended repo; otherwise the call falls back to the server's own cwd and sets meta.workspace_warning."
- Changed
codex_job_list4 fields changed- added
Input schema / properties / limitAdded value: +{ + "anyOf": [ + { + "maximum": 1000, + "minimum": 1, + "type": "integer" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Maximum jobs to return, newest first (1-1000). Omit (or pass null) to return every retained job that matches — the default; it caps nothing, and does not override `status`. Only an explicit limit truncates: then the response sets truncated=true and the extra rows are dropped." +} - added
Input schema / properties / statusAdded value: +{ + "anyOf": [ + { + "enum": [ + "running", + "done", + "failed", + "cancelled", + "timeout" + ], + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Return only jobs in this lifecycle state ('running', 'done', 'failed', 'cancelled', 'timeout'); omit for all states." +} - changed
Input schema / properties / workspace_root / descriptionPrevious value: -"Absolute path to the target repository root. Pass it (or rely on an MCP root) so the call targets the intended repo; otherwise it falls back to the server's own cwd and meta.workspace_warning is set."New value: +"Absolute path to the target repo root — pass it (or an MCP root) to target the intended repo; otherwise the call falls back to the server's own cwd and sets meta.workspace_warning." - changed
Output schema / anyOfPrevious value: -[ - { - "additionalProperties": false, - "properties": { - "fingerprint": { - "type": "string" - }, - "jobs": { - "items": { - "additionalProperties": false, - "properties": { - "elapsed_ms": { - "type": "integer" - }, - "expires_at": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - "job_id": { - "type": "string" - }, - "kind": { - "type": "string" - }, - "result_available": { - "type": "boolean" - }, - "started_at": { - "type": "string" - }, - "status": { - "enum": [ - "running", - "done", - "failed", - "cancelled", - "timeout" - ], - "type": "string" - } - }, - "required": [ - "job_id", - "kind", - "status", - "started_at", - "elapsed_ms" - ], - "type": "object" - }, - "type": "array" - }, - "ok": { - "const": true, - "type": "boolean" - }, - "server_version": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - "workspace": { - "additionalProperties": false, - "properties": { - "cwd": { - "type": "string" - }, - "workspace_source": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - "workspace_warning": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - } - }, - "required": [ - "cwd" - ], - "type": "object" - } - }, - "required": [ - "workspace" - ], - "type": "object" - }, - { - "properties": { - "error": { - "description": "Populated error envelope; full schema at resource codex://error-envelope", - "type": "object" - }, - "meta": { - "type": "object" - }, - "ok": { - "const": false - } - }, - "required": [ - "ok", - "error", - "meta" - ], - "type": "object" - } -]New value: +[ + { + "additionalProperties": false, + "properties": { + "fingerprint": { + "type": "string" + }, + "jobs": { + "items": { + "additionalProperties": false, + "properties": { + "elapsed_ms": { + "type": "integer" + }, + "expires_at": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "job_id": { + "type": "string" + }, + "kind": { + "type": "string" + }, + "result_available": { + "type": "boolean" + }, + "result_ok": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "null" + } + ] + }, + "started_at": { + "type": "string" + }, + "status": { + "enum": [ + "running", + "done", + "failed", + "cancelled", + "timeout" + ], + "type": "string" + } + }, + "required": [ + "job_id", + "kind", + "status", + "started_at", + "elapsed_ms", + "result_ok" + ], + "type": "object" + }, + "type": "array" + }, + "ok": { + "const": true, + "type": "boolean" + }, + "server_version": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "truncated": { + "type": "boolean" + }, + "truncation_hint": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "workspace": { + "additionalProperties": false, + "properties": { + "cwd": { + "type": "string" + }, + "workspace_source": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "workspace_warning": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + } + }, + "required": [ + "cwd" + ], + "type": "object" + } + }, + "required": [ + "workspace" + ], + "type": "object" + }, + { + "properties": { + "error": { + "description": "Populated error envelope; full schema at resource codex://error-envelope", + "type": "object" + }, + "meta": { + "type": "object" + }, + "ok": { + "const": false + } + }, + "required": [ + "ok", + "error", + "meta" + ], + "type": "object" + } +]
- Changed
codex_job_result1 field changed- changed
Input schema / properties / workspace_root / descriptionPrevious value: -"Absolute path to the target repository root. Pass it (or rely on an MCP root) so the call targets the intended repo; otherwise it falls back to the server's own cwd and meta.workspace_warning is set."New value: +"Absolute path to the target repo root — pass it (or an MCP root) to target the intended repo; otherwise the call falls back to the server's own cwd and sets meta.workspace_warning."
- Changed
codex_job_status2 fields changed- changed
Input schema / properties / workspace_root / descriptionPrevious value: -"Absolute path to the target repository root. Pass it (or rely on an MCP root) so the call targets the intended repo; otherwise it falls back to the server's own cwd and meta.workspace_warning is set."New value: +"Absolute path to the target repo root — pass it (or an MCP root) to target the intended repo; otherwise the call falls back to the server's own cwd and sets meta.workspace_warning." - changed
Output schema / anyOfPrevious value: -[ - { - "additionalProperties": false, - "properties": { - "cleanup_warnings": { - "items": { - "type": "string" - }, - "type": "array" - }, - "deadline_seconds": { - "type": "integer" - }, - "detail": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - "elapsed_ms": { - "type": "integer" - }, - "event_age_ms": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ] - }, - "events_seen": { - "type": "integer" - }, - "expires_at": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - "fingerprint": { - "type": "string" - }, - "job_id": { - "type": "string" - }, - "kind": { - "type": "string" - }, - "last_event_at": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - "ok": { - "const": true, - "type": "boolean" - }, - "poll_after_ms": { - "type": "integer" - }, - "result_available": { - "type": "boolean" - }, - "server_version": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - "started_at": { - "type": "string" - }, - "status": { - "enum": [ - "running", - "done", - "failed", - "cancelled", - "timeout" - ], - "type": "string" - }, - "ttl_seconds": { - "type": "integer" - }, - "workspace": { - "additionalProperties": false, - "properties": { - "cwd": { - "type": "string" - }, - "workspace_source": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - "workspace_warning": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - } - }, - "required": [ - "cwd" - ], - "type": "object" - } - }, - "required": [ - "job_id", - "kind", - "status", - "started_at", - "elapsed_ms", - "deadline_seconds", - "ttl_seconds", - "workspace" - ], - "type": "object" - }, - { - "properties": { - "error": { - "description": "Populated error envelope; full schema at resource codex://error-envelope", - "type": "object" - }, - "meta": { - "type": "object" - }, - "ok": { - "const": false - } - }, - "required": [ - "ok", - "error", - "meta" - ], - "type": "object" - } -]New value: +[ + { + "additionalProperties": false, + "properties": { + "cleanup_warnings": { + "items": { + "type": "string" + }, + "type": "array" + }, + "deadline_seconds": { + "type": "integer" + }, + "detail": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "elapsed_ms": { + "type": "integer" + }, + "event_age_ms": { + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ] + }, + "events_seen": { + "type": "integer" + }, + "expires_at": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "fingerprint": { + "type": "string" + }, + "job_id": { + "type": "string" + }, + "kind": { + "type": "string" + }, + "last_event_at": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "ok": { + "const": true, + "type": "boolean" + }, + "poll_after_ms": { + "type": "integer" + }, + "result_available": { + "type": "boolean" + }, + "result_ok": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "null" + } + ] + }, + "server_version": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "started_at": { + "type": "string" + }, + "status": { + "enum": [ + "running", + "done", + "failed", + "cancelled", + "timeout" + ], + "type": "string" + }, + "ttl_seconds": { + "type": "integer" + }, + "workspace": { + "additionalProperties": false, + "properties": { + "cwd": { + "type": "string" + }, + "workspace_source": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "workspace_warning": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + } + }, + "required": [ + "cwd" + ], + "type": "object" + } + }, + "required": [ + "job_id", + "kind", + "status", + "started_at", + "elapsed_ms", + "deadline_seconds", + "ttl_seconds", + "result_ok", + "workspace" + ], + "type": "object" + }, + { + "properties": { + "error": { + "description": "Populated error envelope; full schema at resource codex://error-envelope", + "type": "object" + }, + "meta": { + "type": "object" + }, + "ok": { + "const": false + } + }, + "required": [ + "ok", + "error", + "meta" + ], + "type": "object" + } +]
- Changed
codex_review_changes6 fields changed- changed
Input schema / properties / extra_context / descriptionPrevious value: -"Optional author intent / background context, added to the prompt as clearly-labeled UNTRUSTED data. Codex is instructed to treat embedded directives as data, not commands — best-effort prompt-injection mitigation, not a guarantee. Don't include live secrets: Codex can read files it's pointed at, and redaction does not cover this field."New value: +"Optional author intent/background context, added as clearly-labeled UNTRUSTED prompt data. Redaction does NOT cover it — no live secrets. Full caveats and bounds: codex://params." - changed
Input schema / properties / idempotency_key / descriptionPrevious value: -"Optional client-supplied dedup key, scoped to THIS concrete tool on the same workspace. Reusing it on the same tool with the same arguments replays the existing run instead of starting — and paying for — a duplicate Codex call (a sync call reattaches to the in-flight run and returns its result; an _async call returns the same job_id). The sync and _async variants are DIFFERENT tools and never share a key's run. Reuse with different arguments — including a different timeout_seconds — is refused (idempotency_conflict); a key whose prior result was already consumed/evicted is idempotency_result_unavailable; a still-publishing reservation is idempotency_in_progress (retry). Omit it for the prior no-dedup behavior. A completed result stays replayable while its job record lives (its TTL), subject to consumption or count-eviction; the fail-closed conflict/in-progress window can last longer — up to the job's max runtime + termination grace + TTL. meta.idempotency_replayed=true marks a replayed (unpaid) response."New value: +"Optional dedup key scoped to THIS tool + workspace. Same key + same args replays the prior result with no new spend; different args are refused (idempotency_conflict). Sync and _async are separate tools and never share a key. Omit for none; retention is bounded. Lifecycle: codex://params." - changed
Input schema / properties / isolation / descriptionPrevious value: -"Codex config isolation: 'inherit', 'ignore-config', or 'ignore-rules'. Defaults to the server's configured isolation (built-in default 'inherit'; `codex_status` reports the resolved value)."New value: +"Codex config isolation: 'inherit' | 'ignore-config' | 'ignore-rules'. Defaults to the server's configured value (built-in 'inherit'; `codex_status` reports the resolved one)." - changed
Input schema / properties / reasoning_effort / descriptionPrevious value: -"Override the Codex reasoning effort for this call (sent as a `model_reasoning_effort` config override); omit (or pass null) for the server default (CODEX_IN_CLAUDE_REASONING_EFFORT) or Codex's own resolution. An open per-model string the Codex backend validates at run time — commonly minimal|low|medium|high|xhigh; codex_models lists each model's advertised set (advisory). A backend-rejected value fails as invalid_reasoning_effort; an explicit empty string is sent as-is (and rejected by the backend), never treated as unset. Control characters, surrogates, and values over 128 chars are rejected as invalid_arguments."New value: +"Override the Codex reasoning effort for this call (a model_reasoning_effort override); omit or pass null for the server default (CODEX_IN_CLAUDE_REASONING_EFFORT) or Codex's own resolution. An open, per-model string the backend validates at run time — commonly minimal|low|medium|high|xhigh; codex_models lists each model's advertised set (advisory). Rejection and bounds detail: codex://params." - changed
Input schema / properties / workspace_root / descriptionPrevious value: -"Absolute path to the target repository root. Pass it (or rely on an MCP root) so the call targets the intended repo; otherwise it falls back to the server's own cwd and meta.workspace_warning is set."New value: +"Absolute path to the target repo root — pass it (or an MCP root) to target the intended repo; otherwise the call falls back to the server's own cwd and sets meta.workspace_warning." - changed
Output schema / anyOfPrevious value: -[ - { - "additionalProperties": false, - "properties": { - "assumptions": { - "items": { - "type": "string" - }, - "type": "array" - }, - "confidence": { - "enum": [ - "low", - "medium", - "high" - ], - "type": "string" - }, - "coverage": { - "additionalProperties": false, - "properties": { - "omission_reasons": { - "items": { - "enum": [ - "untracked_omitted", - "truncated", - "redacted" - ], - "type": "string" - }, - "type": "array" - }, - "status": { - "enum": [ - "complete", - "partial" - ], - "type": "string" - }, - "untracked_files_detected": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ] - }, - "untracked_files_included": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ] - }, - "untracked_files_omitted": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ] - } - }, - "required": [ - "status" - ], - "type": "object" - }, - "findings": { - "items": { - "additionalProperties": false, - "properties": { - "evidence": { - "type": "string" - }, - "file": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - "line": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ] - }, - "line_end": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ] - }, - "recommendation": { - "type": "string" - }, - "risk": { - "type": "string" - }, - "severity": { - "enum": [ - "critical", - "high", - "medium", - "low", - "nit" - ], - "type": "string" - }, - "title": { - "type": "string" - } - }, - "required": [ - "severity", - "title", - "evidence", - "risk", - "recommendation" - ], - "type": "object" - }, - "type": "array" - }, - "meta": { - "description": "Result metadata (cwd, tier, sandbox, model, timeout, usage, rate_limit, and more); full schema at resource codex://result-meta", - "type": "object" - }, - "next_steps": { - "items": { - "type": "string" - }, - "type": "array" - }, - "ok": { - "const": true, - "type": "boolean" - }, - "questions": { - "items": { - "type": "string" - }, - "type": "array" - }, - "raw_response": { - "additionalProperties": false, - "properties": { - "model": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - "session_id": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - "text": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - } - }, - "type": "object" - }, - "review_status": { - "enum": [ - "completed", - "not_run" - ], - "type": "string" - }, - "summary": { - "type": "string" - }, - "tool": { - "const": "codex_review_changes", - "type": "string" - }, - "verdict": { - "enum": [ - "pass", - "concerns", - "fail", - "unknown" - ], - "type": "string" - } - }, - "required": [ - "summary", - "meta", - "review_status", - "coverage" - ], - "type": "object" - }, - { - "properties": { - "error": { - "description": "Populated error envelope; full schema at resource codex://error-envelope", - "type": "object" - }, - "meta": { - "type": "object" - }, - "ok": { - "const": false - } - }, - "required": [ - "ok", - "error", - "meta" - ], - "type": "object" - } -]New value: +[ + { + "additionalProperties": false, + "properties": { + "assumptions": { + "items": { + "type": "string" + }, + "type": "array" + }, + "confidence": { + "enum": [ + "low", + "medium", + "high" + ], + "type": "string" + }, + "coverage": { + "additionalProperties": false, + "properties": { + "omission_reasons": { + "items": { + "enum": [ + "untracked_omitted", + "tree_changed_during_gather", + "truncated", + "redacted" + ], + "type": "string" + }, + "type": "array" + }, + "redaction": { + "anyOf": [ + { + "additionalProperties": false, + "properties": { + "inline_masks": { + "minimum": 0, + "type": "integer" + }, + "masked_paths": { + "items": { + "type": "string" + }, + "type": "array" + }, + "withheld_paths": { + "items": { + "type": "string" + }, + "type": "array" + } + }, + "type": "object" + }, + { + "type": "null" + } + ] + }, + "status": { + "enum": [ + "complete", + "partial" + ], + "type": "string" + }, + "untracked_files_detected": { + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ] + }, + "untracked_files_included": { + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ] + }, + "untracked_files_omitted": { + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ] + } + }, + "required": [ + "status" + ], + "type": "object" + }, + "findings": { + "items": { + "additionalProperties": false, + "properties": { + "evidence": { + "type": "string" + }, + "file": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "line": { + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ] + }, + "line_end": { + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ] + }, + "recommendation": { + "type": "string" + }, + "risk": { + "type": "string" + }, + "severity": { + "enum": [ + "critical", + "high", + "medium", + "low", + "nit" + ], + "type": "string" + }, + "title": { + "type": "string" + } + }, + "required": [ + "severity", + "title", + "evidence", + "risk", + "recommendation" + ], + "type": "object" + }, + "type": "array" + }, + "meta": { + "description": "Result metadata (cwd, tier, sandbox, model, timeout, usage, rate_limit, and more); full schema at resource codex://result-meta", + "type": "object" + }, + "next_steps": { + "items": { + "type": "string" + }, + "type": "array" + }, + "ok": { + "const": true, + "type": "boolean" + }, + "questions": { + "items": { + "type": "string" + }, + "type": "array" + }, + "raw_response": { + "additionalProperties": false, + "properties": { + "model": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "session_id": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "text": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + } + }, + "type": "object" + }, + "review_status": { + "enum": [ + "completed", + "not_run" + ], + "type": "string" + }, + "summary": { + "type": "string" + }, + "tool": { + "const": "codex_review_changes", + "type": "string" + }, + "verdict": { + "enum": [ + "pass", + "concerns", + "fail", + "unknown" + ], + "type": "string" + } + }, + "required": [ + "summary", + "meta", + "review_status", + "coverage" + ], + "type": "object" + }, + { + "properties": { + "error": { + "description": "Populated error envelope; full schema at resource codex://error-envelope", + "type": "object" + }, + "meta": { + "type": "object" + }, + "ok": { + "const": false + } + }, + "required": [ + "ok", + "error", + "meta" + ], + "type": "object" + } +]
- Changed
codex_review_changes_async6 fields changed- changed
Input schema / properties / extra_context / descriptionPrevious value: -"Optional author intent / background context, added to the prompt as clearly-labeled UNTRUSTED data. Codex is instructed to treat embedded directives as data, not commands — best-effort prompt-injection mitigation, not a guarantee. Don't include live secrets: Codex can read files it's pointed at, and redaction does not cover this field."New value: +"Optional author intent/background context, added as clearly-labeled UNTRUSTED prompt data. Redaction does NOT cover it — no live secrets. Full caveats and bounds: codex://params." - changed
Input schema / properties / idempotency_key / descriptionPrevious value: -"Optional client-supplied dedup key, scoped to THIS concrete tool on the same workspace. Reusing it on the same tool with the same arguments replays the existing run instead of starting — and paying for — a duplicate Codex call (a sync call reattaches to the in-flight run and returns its result; an _async call returns the same job_id). The sync and _async variants are DIFFERENT tools and never share a key's run. Reuse with different arguments — including a different timeout_seconds — is refused (idempotency_conflict); a key whose prior result was already consumed/evicted is idempotency_result_unavailable; a still-publishing reservation is idempotency_in_progress (retry). Omit it for the prior no-dedup behavior. A completed result stays replayable while its job record lives (its TTL), subject to consumption or count-eviction; the fail-closed conflict/in-progress window can last longer — up to the job's max runtime + termination grace + TTL. meta.idempotency_replayed=true marks a replayed (unpaid) response."New value: +"Optional dedup key scoped to THIS tool + workspace. Same key + same args replays the prior result with no new spend; different args are refused (idempotency_conflict). Sync and _async are separate tools and never share a key. Omit for none; retention is bounded. Lifecycle: codex://params." - changed
Input schema / properties / isolation / descriptionPrevious value: -"Codex config isolation: 'inherit', 'ignore-config', or 'ignore-rules'. Defaults to the server's configured isolation (built-in default 'inherit'; `codex_status` reports the resolved value)."New value: +"Codex config isolation: 'inherit' | 'ignore-config' | 'ignore-rules'. Defaults to the server's configured value (built-in 'inherit'; `codex_status` reports the resolved one)." - changed
Input schema / properties / reasoning_effort / descriptionPrevious value: -"Override the Codex reasoning effort for this call (sent as a `model_reasoning_effort` config override); omit (or pass null) for the server default (CODEX_IN_CLAUDE_REASONING_EFFORT) or Codex's own resolution. An open per-model string the Codex backend validates at run time — commonly minimal|low|medium|high|xhigh; codex_models lists each model's advertised set (advisory). A backend-rejected value fails as invalid_reasoning_effort; an explicit empty string is sent as-is (and rejected by the backend), never treated as unset. Control characters, surrogates, and values over 128 chars are rejected as invalid_arguments."New value: +"Override the Codex reasoning effort for this call (a model_reasoning_effort override); omit or pass null for the server default (CODEX_IN_CLAUDE_REASONING_EFFORT) or Codex's own resolution. An open, per-model string the backend validates at run time — commonly minimal|low|medium|high|xhigh; codex_models lists each model's advertised set (advisory). Rejection and bounds detail: codex://params." - changed
Input schema / properties / workspace_root / descriptionPrevious value: -"Absolute path to the target repository root. Pass it (or rely on an MCP root) so the call targets the intended repo; otherwise it falls back to the server's own cwd and meta.workspace_warning is set."New value: +"Absolute path to the target repo root — pass it (or an MCP root) to target the intended repo; otherwise the call falls back to the server's own cwd and sets meta.workspace_warning." - changed
Output schema / anyOfPrevious value: -[ - { - "additionalProperties": false, - "properties": { - "deadline_seconds": { - "type": "integer" - }, - "expires_at": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - "fingerprint": { - "type": "string" - }, - "job_id": { - "type": "string" - }, - "kind": { - "type": "string" - }, - "meta": { - "description": "Result metadata (cwd, tier, sandbox, model, timeout, usage, rate_limit, and more); full schema at resource codex://result-meta", - "type": "object" - }, - "ok": { - "const": true, - "type": "boolean" - }, - "poll_after_ms": { - "type": "integer" - }, - "server_version": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - "started_at": { - "type": "string" - }, - "status": { - "enum": [ - "running", - "done", - "failed", - "cancelled", - "timeout" - ], - "type": "string" - }, - "ttl_seconds": { - "type": "integer" - } - }, - "required": [ - "job_id", - "kind", - "started_at", - "deadline_seconds", - "ttl_seconds", - "meta" - ], - "type": "object" - }, - { - "properties": { - "error": { - "description": "Populated error envelope; full schema at resource codex://error-envelope", - "type": "object" - }, - "meta": { - "type": "object" - }, - "ok": { - "const": false - } - }, - "required": [ - "ok", - "error", - "meta" - ], - "type": "object" - } -]New value: +[ + { + "additionalProperties": false, + "properties": { + "deadline_seconds": { + "type": "integer" + }, + "expires_at": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "fingerprint": { + "type": "string" + }, + "follow_up": { + "additionalProperties": false, + "properties": { + "alternative": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "arguments": { + "anyOf": [ + { + "additionalProperties": true, + "type": "object" + }, + { + "type": "null" + } + ] + }, + "next_step": { + "enum": [ + "retry_after_delay", + "correct_arguments", + "use_allowed_value", + "reduce_input", + "use_workspace_in_roots", + "poll_job_status", + "list_jobs", + "list_resources", + "start_new_job", + "authenticate", + "install_codex", + "install_git", + "init_git_repo", + "update_plugin", + "correct_config", + "inspect_and_retry", + "retry_then_report", + "use_new_idempotency_key" + ], + "type": "string" + }, + "tool": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + } + }, + "required": [ + "next_step" + ], + "type": "object" + }, + "job_id": { + "type": "string" + }, + "kind": { + "type": "string" + }, + "meta": { + "description": "Result metadata (cwd, tier, sandbox, model, timeout, usage, rate_limit, and more); full schema at resource codex://result-meta", + "type": "object" + }, + "ok": { + "const": true, + "type": "boolean" + }, + "poll_after_ms": { + "type": "integer" + }, + "server_version": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "started_at": { + "type": "string" + }, + "status": { + "enum": [ + "running", + "done", + "failed", + "cancelled", + "timeout" + ], + "type": "string" + }, + "ttl_seconds": { + "type": "integer" + } + }, + "required": [ + "job_id", + "kind", + "started_at", + "deadline_seconds", + "ttl_seconds", + "meta", + "follow_up" + ], + "type": "object" + }, + { + "properties": { + "error": { + "description": "Populated error envelope; full schema at resource codex://error-envelope", + "type": "object" + }, + "meta": { + "type": "object" + }, + "ok": { + "const": false + } + }, + "required": [ + "ok", + "error", + "meta" + ], + "type": "object" + } +]
- Changed
codex_transfer1 field changed- changed
Input schema / properties / workspace_root / descriptionPrevious value: -"Absolute path to the target repository root. Pass it (or rely on an MCP root) so the call targets the intended repo; otherwise it falls back to the server's own cwd and meta.workspace_warning is set."New value: +"Absolute path to the target repo root — pass it (or an MCP root) to target the intended repo; otherwise the call falls back to the server's own cwd and sets meta.workspace_warning."
9 tool updates
v0.13.0- Changed
codex_consult1 field changed- added
Input schema / properties / reasoning_effortAdded value: +{ + "anyOf": [ + { + "maxLength": 128, + "pattern": "^[^\\x00-\\x1F\\x7F-\\x9F]*$", + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Override the Codex reasoning effort for this call (sent as a `model_reasoning_effort` config override); omit (or pass null) for the server default (CODEX_IN_CLAUDE_REASONING_EFFORT) or Codex's own resolution. An open per-model string the Codex backend validates at run time — commonly minimal|low|medium|high|xhigh; codex_models lists each model's advertised set (advisory). A backend-rejected value fails as invalid_reasoning_effort; an explicit empty string is sent as-is (and rejected by the backend), never treated as unset. Control characters, surrogates, and values over 128 chars are rejected as invalid_arguments." +}
- Changed
codex_consult_async1 field changed- added
Input schema / properties / reasoning_effortAdded value: +{ + "anyOf": [ + { + "maxLength": 128, + "pattern": "^[^\\x00-\\x1F\\x7F-\\x9F]*$", + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Override the Codex reasoning effort for this call (sent as a `model_reasoning_effort` config override); omit (or pass null) for the server default (CODEX_IN_CLAUDE_REASONING_EFFORT) or Codex's own resolution. An open per-model string the Codex backend validates at run time — commonly minimal|low|medium|high|xhigh; codex_models lists each model's advertised set (advisory). A backend-rejected value fails as invalid_reasoning_effort; an explicit empty string is sent as-is (and rejected by the backend), never treated as unset. Control characters, surrogates, and values over 128 chars are rejected as invalid_arguments." +}
- Changed
codex_delegate1 field changed- added
Input schema / properties / reasoning_effortAdded value: +{ + "anyOf": [ + { + "maxLength": 128, + "pattern": "^[^\\x00-\\x1F\\x7F-\\x9F]*$", + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Override the Codex reasoning effort for this call (sent as a `model_reasoning_effort` config override); omit (or pass null) for the server default (CODEX_IN_CLAUDE_REASONING_EFFORT) or Codex's own resolution. An open per-model string the Codex backend validates at run time — commonly minimal|low|medium|high|xhigh; codex_models lists each model's advertised set (advisory). A backend-rejected value fails as invalid_reasoning_effort; an explicit empty string is sent as-is (and rejected by the backend), never treated as unset. Control characters, surrogates, and values over 128 chars are rejected as invalid_arguments." +}
- Changed
codex_delegate_async1 field changed- added
Input schema / properties / reasoning_effortAdded value: +{ + "anyOf": [ + { + "maxLength": 128, + "pattern": "^[^\\x00-\\x1F\\x7F-\\x9F]*$", + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Override the Codex reasoning effort for this call (sent as a `model_reasoning_effort` config override); omit (or pass null) for the server default (CODEX_IN_CLAUDE_REASONING_EFFORT) or Codex's own resolution. An open per-model string the Codex backend validates at run time — commonly minimal|low|medium|high|xhigh; codex_models lists each model's advertised set (advisory). A backend-rejected value fails as invalid_reasoning_effort; an explicit empty string is sent as-is (and rejected by the backend), never treated as unset. Control characters, surrogates, and values over 128 chars are rejected as invalid_arguments." +}
- Changed
codex_delegate_dry_run3 fields changed- changed
Input schema / properties / model / descriptionPrevious value: -"The Codex model slug the real codex_delegate call would use; this dry run does not call Codex or validate the model."New value: +"The Codex model slug the previewed paid call would use; defaults to the server default (CODEX_IN_CLAUDE_MODEL) when unset, so the preview mirrors the paid call's resolution. This dry run does not call Codex or validate the model." - added
Input schema / properties / reasoning_effortAdded value: +{ + "anyOf": [ + { + "maxLength": 128, + "pattern": "^[^\\x00-\\x1F\\x7F-\\x9F]*$", + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "The reasoning effort the previewed paid call would send (as a `model_reasoning_effort` config override); defaults to the server default (CODEX_IN_CLAUDE_REASONING_EFFORT) when unset, so the preview mirrors the paid call's resolution. This dry run does not call Codex or validate the value beyond the paid params' shape bounds (no control or surrogate characters, ≤128 chars)." +} - changed
Output schema / anyOfPrevious value: -[ - { - "additionalProperties": false, - "properties": { - "cwd": { - "type": "string" - }, - "fingerprint": { - "type": "string" - }, - "isolation": { - "enum": [ - "inherit", - "ignore-config", - "ignore-rules" - ], - "type": "string" - }, - "max_input_bytes": { - "type": "integer" - }, - "ok": { - "const": true, - "type": "boolean" - }, - "prompt_bytes": { - "type": "integer" - }, - "sandbox": { - "enum": [ - "read-only", - "workspace-write", - "danger-full-access" - ], - "type": "string" - }, - "server_version": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - "tier": { - "enum": [ - "consult", - "propose", - "apply" - ], - "type": "string" - }, - "tool": { - "const": "codex_delegate_dry_run", - "type": "string" - }, - "workspace_source": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - "workspace_warning": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - "worktree_plan": { - "additionalProperties": false, - "properties": { - "head_commit": { - "type": "string" - }, - "head_subject": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - "note": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - "tracked_bytes": { - "type": "integer" - }, - "tracked_files": { - "type": "integer" - }, - "uncommitted_tracked_files": { - "type": "integer" - }, - "untracked_files": { - "type": "integer" - } - }, - "required": [ - "head_commit", - "tracked_files", - "tracked_bytes", - "uncommitted_tracked_files", - "untracked_files" - ], - "type": "object" - } - }, - "required": [ - "cwd", - "isolation", - "prompt_bytes", - "max_input_bytes", - "worktree_plan" - ], - "type": "object" - }, - { - "properties": { - "error": { - "description": "Populated error envelope; full schema at resource codex://error-envelope", - "type": "object" - }, - "meta": { - "type": "object" - }, - "ok": { - "const": false - } - }, - "required": [ - "ok", - "error", - "meta" - ], - "type": "object" - } -]New value: +[ + { + "additionalProperties": false, + "properties": { + "cwd": { + "type": "string" + }, + "fingerprint": { + "type": "string" + }, + "isolation": { + "enum": [ + "inherit", + "ignore-config", + "ignore-rules" + ], + "type": "string" + }, + "max_input_bytes": { + "type": "integer" + }, + "model": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "description": "Model override the previewed paid call would send (per-call param or server default); null = Codex would resolve it itself. Unvalidated by the preview." + }, + "ok": { + "const": true, + "type": "boolean" + }, + "prompt_bytes": { + "type": "integer" + }, + "reasoning_effort": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "description": "Reasoning-effort override the previewed paid call would send (per-call param or server default); null = Codex would resolve it itself. Unvalidated by the preview." + }, + "sandbox": { + "enum": [ + "read-only", + "workspace-write", + "danger-full-access" + ], + "type": "string" + }, + "server_version": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "tier": { + "enum": [ + "consult", + "propose", + "apply" + ], + "type": "string" + }, + "tool": { + "const": "codex_delegate_dry_run", + "type": "string" + }, + "workspace_source": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "workspace_warning": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "worktree_plan": { + "additionalProperties": false, + "properties": { + "head_commit": { + "type": "string" + }, + "head_subject": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "note": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "tracked_bytes": { + "type": "integer" + }, + "tracked_files": { + "type": "integer" + }, + "uncommitted_tracked_files": { + "type": "integer" + }, + "untracked_files": { + "type": "integer" + } + }, + "required": [ + "head_commit", + "tracked_files", + "tracked_bytes", + "uncommitted_tracked_files", + "untracked_files" + ], + "type": "object" + } + }, + "required": [ + "cwd", + "isolation", + "prompt_bytes", + "max_input_bytes", + "worktree_plan" + ], + "type": "object" + }, + { + "properties": { + "error": { + "description": "Populated error envelope; full schema at resource codex://error-envelope", + "type": "object" + }, + "meta": { + "type": "object" + }, + "ok": { + "const": false + } + }, + "required": [ + "ok", + "error", + "meta" + ], + "type": "object" + } +]
- Changed
codex_dry_run5 fields changed- added
Input schema / properties / modelAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "The Codex model slug the previewed paid call would use; defaults to the server default (CODEX_IN_CLAUDE_MODEL) when unset, so the preview mirrors the paid call's resolution. This dry run does not call Codex or validate the model." +} - added
Input schema / properties / reasoning_effortAdded value: +{ + "anyOf": [ + { + "maxLength": 128, + "pattern": "^[^\\x00-\\x1F\\x7F-\\x9F]*$", + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "The reasoning effort the previewed paid call would send (as a `model_reasoning_effort` config override); defaults to the server default (CODEX_IN_CLAUDE_REASONING_EFFORT) when unset, so the preview mirrors the paid call's resolution. This dry run does not call Codex or validate the value beyond the paid params' shape bounds (no control or surrogate characters, ≤128 chars)." +} - changed
Input schema / properties / scope / descriptionPrevious value: -"Which changes to review: 'working_tree' (uncommitted vs HEAD), 'branch' (needs base), or 'commit' (needs commit)."New value: +"Which changes to review: 'working_tree' (tracked changes vs HEAD; untracked files follow the `untracked` policy, off by default), 'branch' (needs base), or 'commit' (needs commit)." - added
Input schema / properties / untrackedAdded value: +{ + "default": "explicit_only", + "description": "How working_tree scope treats untracked files: 'explicit_only' (default) includes only those named in `paths`; 'include' reviews all non-ignored untracked files (SENDS their contents to OpenAI — opt-in egress); 'exclude' includes none. Omitted ones are disclosed in `coverage`. Inert for branch/commit scopes.", + "enum": [ + "explicit_only", + "include", + "exclude" + ], + "type": "string" +} - changed
Output schema / anyOfPrevious value: -[ - { - "additionalProperties": false, - "properties": { - "base": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - "commit": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - "context_summary": { - "anyOf": [ - { - "additionalProperties": false, - "properties": { - "files_changed": { - "type": "integer" - }, - "lines_added": { - "type": "integer" - }, - "lines_removed": { - "type": "integer" - } - }, - "type": "object" - }, - { - "type": "null" - } - ] - }, - "cwd": { - "type": "string" - }, - "fingerprint": { - "type": "string" - }, - "isolation": { - "enum": [ - "inherit", - "ignore-config", - "ignore-rules" - ], - "type": "string" - }, - "max_input_bytes": { - "type": "integer" - }, - "ok": { - "const": true, - "type": "boolean" - }, - "paths": { - "items": { - "type": "string" - }, - "type": "array" - }, - "prompt_bytes": { - "type": "integer" - }, - "redacted_paths": { - "items": { - "type": "string" - }, - "type": "array" - }, - "redacted_paths_count": { - "type": "integer" - }, - "sandbox": { - "enum": [ - "read-only", - "workspace-write", - "danger-full-access" - ], - "type": "string" - }, - "scope": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - "security_warnings": { - "items": { - "type": "string" - }, - "type": "array" - }, - "server_version": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - "tier": { - "enum": [ - "consult", - "propose", - "apply" - ], - "type": "string" - }, - "tool": { - "const": "codex_dry_run", - "type": "string" - }, - "truncated": { - "type": "boolean" - }, - "truncation_hint": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - "workspace_source": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - "workspace_warning": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - } - }, - "required": [ - "cwd", - "tier", - "sandbox", - "isolation", - "prompt_bytes", - "max_input_bytes" - ], - "type": "object" - }, - { - "properties": { - "error": { - "description": "Populated error envelope; full schema at resource codex://error-envelope", - "type": "object" - }, - "meta": { - "type": "object" - }, - "ok": { - "const": false - } - }, - "required": [ - "ok", - "error", - "meta" - ], - "type": "object" - } -]New value: +[ + { + "additionalProperties": false, + "properties": { + "base": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "commit": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "context_summary": { + "anyOf": [ + { + "additionalProperties": false, + "properties": { + "files_changed": { + "type": "integer" + }, + "lines_added": { + "type": "integer" + }, + "lines_removed": { + "type": "integer" + } + }, + "type": "object" + }, + { + "type": "null" + } + ] + }, + "coverage": { + "additionalProperties": false, + "properties": { + "omission_reasons": { + "items": { + "enum": [ + "untracked_omitted", + "truncated", + "redacted" + ], + "type": "string" + }, + "type": "array" + }, + "status": { + "enum": [ + "complete", + "partial" + ], + "type": "string" + }, + "untracked_files_detected": { + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ] + }, + "untracked_files_included": { + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ] + }, + "untracked_files_omitted": { + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ] + } + }, + "required": [ + "status" + ], + "type": "object" + }, + "cwd": { + "type": "string" + }, + "fingerprint": { + "type": "string" + }, + "isolation": { + "enum": [ + "inherit", + "ignore-config", + "ignore-rules" + ], + "type": "string" + }, + "max_input_bytes": { + "type": "integer" + }, + "model": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "description": "Model override the previewed paid call would send (per-call param or server default); null = Codex would resolve it itself. Unvalidated by the preview." + }, + "ok": { + "const": true, + "type": "boolean" + }, + "paths": { + "items": { + "type": "string" + }, + "type": "array" + }, + "prompt_bytes": { + "type": "integer" + }, + "reasoning_effort": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "description": "Reasoning-effort override the previewed paid call would send (per-call param or server default); null = Codex would resolve it itself. Unvalidated by the preview." + }, + "redacted_paths": { + "items": { + "type": "string" + }, + "type": "array" + }, + "redacted_paths_count": { + "type": "integer" + }, + "sandbox": { + "enum": [ + "read-only", + "workspace-write", + "danger-full-access" + ], + "type": "string" + }, + "scope": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "security_warnings": { + "items": { + "type": "string" + }, + "type": "array" + }, + "server_version": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "tier": { + "enum": [ + "consult", + "propose", + "apply" + ], + "type": "string" + }, + "tool": { + "const": "codex_dry_run", + "type": "string" + }, + "truncated": { + "type": "boolean" + }, + "truncation_hint": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "workspace_source": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "workspace_warning": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "would_call_model": { + "type": "boolean" + } + }, + "required": [ + "cwd", + "tier", + "sandbox", + "isolation", + "would_call_model", + "prompt_bytes", + "coverage", + "max_input_bytes" + ], + "type": "object" + }, + { + "properties": { + "error": { + "description": "Populated error envelope; full schema at resource codex://error-envelope", + "type": "object" + }, + "meta": { + "type": "object" + }, + "ok": { + "const": false + } + }, + "required": [ + "ok", + "error", + "meta" + ], + "type": "object" + } +]
- Changed
codex_models1 field changed- changed
Output schema / anyOfPrevious value: -[ - { - "additionalProperties": false, - "properties": { - "advisory": { - "type": "string" - }, - "cache_client_version": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - "fetched_at": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - "fingerprint": { - "type": "string" - }, - "models": { - "items": { - "additionalProperties": false, - "properties": { - "display_name": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - "slug": { - "type": "string" - } - }, - "required": [ - "slug" - ], - "type": "object" - }, - "type": "array" - }, - "ok": { - "const": true, - "type": "boolean" - }, - "server_version": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - "source": { - "enum": [ - "cache", - "static", - "none" - ], - "type": "string" - }, - "unavailable_reason": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - } - }, - "required": [ - "source", - "advisory" - ], - "type": "object" - }, - { - "properties": { - "error": { - "description": "Populated error envelope; full schema at resource codex://error-envelope", - "type": "object" - }, - "meta": { - "type": "object" - }, - "ok": { - "const": false - } - }, - "required": [ - "ok", - "error", - "meta" - ], - "type": "object" - } -]New value: +[ + { + "additionalProperties": false, + "properties": { + "advisory": { + "type": "string" + }, + "cache_client_version": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "fetched_at": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "fingerprint": { + "type": "string" + }, + "models": { + "items": { + "additionalProperties": false, + "properties": { + "default_reasoning_effort": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "description": "This model's default reasoning effort as advertised by Codex's on-disk cache; advisory only. null = the cache advertised nothing usable (the static fallback never carries effort data)." + }, + "display_name": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "slug": { + "type": "string" + }, + "supported_reasoning_efforts": { + "anyOf": [ + { + "items": { + "type": "string" + }, + "type": "array" + }, + { + "type": "null" + } + ], + "description": "Effort tokens this model advertises in Codex's on-disk cache; advisory only — the backend's accepted set varies by account and an unlisted effort may still work. null = the cache advertised nothing usable; [] = an explicitly empty advertised set." + } + }, + "required": [ + "slug" + ], + "type": "object" + }, + "type": "array" + }, + "ok": { + "const": true, + "type": "boolean" + }, + "server_version": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "source": { + "enum": [ + "cache", + "static", + "none" + ], + "type": "string" + }, + "unavailable_reason": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + } + }, + "required": [ + "source", + "advisory" + ], + "type": "object" + }, + { + "properties": { + "error": { + "description": "Populated error envelope; full schema at resource codex://error-envelope", + "type": "object" + }, + "meta": { + "type": "object" + }, + "ok": { + "const": false + } + }, + "required": [ + "ok", + "error", + "meta" + ], + "type": "object" + } +]
- Changed
codex_review_changes4 fields changed- added
Input schema / properties / reasoning_effortAdded value: +{ + "anyOf": [ + { + "maxLength": 128, + "pattern": "^[^\\x00-\\x1F\\x7F-\\x9F]*$", + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Override the Codex reasoning effort for this call (sent as a `model_reasoning_effort` config override); omit (or pass null) for the server default (CODEX_IN_CLAUDE_REASONING_EFFORT) or Codex's own resolution. An open per-model string the Codex backend validates at run time — commonly minimal|low|medium|high|xhigh; codex_models lists each model's advertised set (advisory). A backend-rejected value fails as invalid_reasoning_effort; an explicit empty string is sent as-is (and rejected by the backend), never treated as unset. Control characters, surrogates, and values over 128 chars are rejected as invalid_arguments." +} - changed
Input schema / properties / scope / descriptionPrevious value: -"Which changes to review: 'working_tree' (uncommitted vs HEAD), 'branch' (needs base), or 'commit' (needs commit)."New value: +"Which changes to review: 'working_tree' (tracked changes vs HEAD; untracked files follow the `untracked` policy, off by default), 'branch' (needs base), or 'commit' (needs commit)." - added
Input schema / properties / untrackedAdded value: +{ + "default": "explicit_only", + "description": "How working_tree scope treats untracked files: 'explicit_only' (default) includes only those named in `paths`; 'include' reviews all non-ignored untracked files (SENDS their contents to OpenAI — opt-in egress); 'exclude' includes none. Omitted ones are disclosed in `coverage`. Inert for branch/commit scopes.", + "enum": [ + "explicit_only", + "include", + "exclude" + ], + "type": "string" +} - changed
Output schema / anyOfPrevious value: -[ - { - "additionalProperties": false, - "properties": { - "assumptions": { - "items": { - "type": "string" - }, - "type": "array" - }, - "confidence": { - "enum": [ - "low", - "medium", - "high" - ], - "type": "string" - }, - "findings": { - "items": { - "additionalProperties": false, - "properties": { - "evidence": { - "type": "string" - }, - "file": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - "line": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ] - }, - "line_end": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ] - }, - "recommendation": { - "type": "string" - }, - "risk": { - "type": "string" - }, - "severity": { - "enum": [ - "critical", - "high", - "medium", - "low", - "nit" - ], - "type": "string" - }, - "title": { - "type": "string" - } - }, - "required": [ - "severity", - "title", - "evidence", - "risk", - "recommendation" - ], - "type": "object" - }, - "type": "array" - }, - "meta": { - "description": "Result metadata (cwd, tier, sandbox, model, timeout, usage, rate_limit, and more); full schema at resource codex://result-meta", - "type": "object" - }, - "next_steps": { - "items": { - "type": "string" - }, - "type": "array" - }, - "ok": { - "const": true, - "type": "boolean" - }, - "questions": { - "items": { - "type": "string" - }, - "type": "array" - }, - "raw_response": { - "additionalProperties": false, - "properties": { - "model": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - "session_id": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - "text": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - } - }, - "type": "object" - }, - "summary": { - "type": "string" - }, - "tool": { - "const": "codex_review_changes", - "type": "string" - }, - "verdict": { - "enum": [ - "pass", - "concerns", - "fail", - "unknown" - ], - "type": "string" - } - }, - "required": [ - "summary", - "meta" - ], - "type": "object" - }, - { - "properties": { - "error": { - "description": "Populated error envelope; full schema at resource codex://error-envelope", - "type": "object" - }, - "meta": { - "type": "object" - }, - "ok": { - "const": false - } - }, - "required": [ - "ok", - "error", - "meta" - ], - "type": "object" - } -]New value: +[ + { + "additionalProperties": false, + "properties": { + "assumptions": { + "items": { + "type": "string" + }, + "type": "array" + }, + "confidence": { + "enum": [ + "low", + "medium", + "high" + ], + "type": "string" + }, + "coverage": { + "additionalProperties": false, + "properties": { + "omission_reasons": { + "items": { + "enum": [ + "untracked_omitted", + "truncated", + "redacted" + ], + "type": "string" + }, + "type": "array" + }, + "status": { + "enum": [ + "complete", + "partial" + ], + "type": "string" + }, + "untracked_files_detected": { + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ] + }, + "untracked_files_included": { + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ] + }, + "untracked_files_omitted": { + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ] + } + }, + "required": [ + "status" + ], + "type": "object" + }, + "findings": { + "items": { + "additionalProperties": false, + "properties": { + "evidence": { + "type": "string" + }, + "file": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "line": { + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ] + }, + "line_end": { + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ] + }, + "recommendation": { + "type": "string" + }, + "risk": { + "type": "string" + }, + "severity": { + "enum": [ + "critical", + "high", + "medium", + "low", + "nit" + ], + "type": "string" + }, + "title": { + "type": "string" + } + }, + "required": [ + "severity", + "title", + "evidence", + "risk", + "recommendation" + ], + "type": "object" + }, + "type": "array" + }, + "meta": { + "description": "Result metadata (cwd, tier, sandbox, model, timeout, usage, rate_limit, and more); full schema at resource codex://result-meta", + "type": "object" + }, + "next_steps": { + "items": { + "type": "string" + }, + "type": "array" + }, + "ok": { + "const": true, + "type": "boolean" + }, + "questions": { + "items": { + "type": "string" + }, + "type": "array" + }, + "raw_response": { + "additionalProperties": false, + "properties": { + "model": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "session_id": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "text": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + } + }, + "type": "object" + }, + "review_status": { + "enum": [ + "completed", + "not_run" + ], + "type": "string" + }, + "summary": { + "type": "string" + }, + "tool": { + "const": "codex_review_changes", + "type": "string" + }, + "verdict": { + "enum": [ + "pass", + "concerns", + "fail", + "unknown" + ], + "type": "string" + } + }, + "required": [ + "summary", + "meta", + "review_status", + "coverage" + ], + "type": "object" + }, + { + "properties": { + "error": { + "description": "Populated error envelope; full schema at resource codex://error-envelope", + "type": "object" + }, + "meta": { + "type": "object" + }, + "ok": { + "const": false + } + }, + "required": [ + "ok", + "error", + "meta" + ], + "type": "object" + } +]
- Changed
codex_review_changes_async3 fields changed- added
Input schema / properties / reasoning_effortAdded value: +{ + "anyOf": [ + { + "maxLength": 128, + "pattern": "^[^\\x00-\\x1F\\x7F-\\x9F]*$", + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Override the Codex reasoning effort for this call (sent as a `model_reasoning_effort` config override); omit (or pass null) for the server default (CODEX_IN_CLAUDE_REASONING_EFFORT) or Codex's own resolution. An open per-model string the Codex backend validates at run time — commonly minimal|low|medium|high|xhigh; codex_models lists each model's advertised set (advisory). A backend-rejected value fails as invalid_reasoning_effort; an explicit empty string is sent as-is (and rejected by the backend), never treated as unset. Control characters, surrogates, and values over 128 chars are rejected as invalid_arguments." +} - changed
Input schema / properties / scope / descriptionPrevious value: -"Which changes to review: 'working_tree' (uncommitted vs HEAD), 'branch' (needs base), or 'commit' (needs commit)."New value: +"Which changes to review: 'working_tree' (tracked changes vs HEAD; untracked files follow the `untracked` policy, off by default), 'branch' (needs base), or 'commit' (needs commit)." - added
Input schema / properties / untrackedAdded value: +{ + "default": "explicit_only", + "description": "How working_tree scope treats untracked files: 'explicit_only' (default) includes only those named in `paths`; 'include' reviews all non-ignored untracked files (SENDS their contents to OpenAI — opt-in egress); 'exclude' includes none. Omitted ones are disclosed in `coverage`. Inert for branch/commit scopes.", + "enum": [ + "explicit_only", + "include", + "exclude" + ], + "type": "string" +}
12 tool updates
v0.11.0- Changed
codex_capabilities1 field changed- changed
Output schema / anyOfPrevious value: -[ - { - "additionalProperties": false, - "properties": { - "active_tools": { - "items": { - "type": "string" - }, - "type": "array" - }, - "deprecation_policy": { - "type": "string" - }, - "error_envelope_resource": { - "type": "string" - }, - "fingerprint": { - "type": "string" - }, - "fingerprint_covers": { - "items": { - "type": "string" - }, - "type": "array" - }, - "free_tools": { - "items": { - "type": "string" - }, - "type": "array" - }, - "name": { - "type": "string" - }, - "negative_scope": { - "items": { - "type": "string" - }, - "type": "array" - }, - "ok": { - "const": true, - "type": "boolean" - }, - "prerequisites": { - "items": { - "type": "string" - }, - "type": "array" - }, - "resource_error_carrier": { - "type": "string" - }, - "result_meta_resource": { - "type": "string" - }, - "sandboxes": { - "items": { - "type": "string" - }, - "type": "array" - }, - "schemas": { - "anyOf": [ - { - "additionalProperties": true, - "type": "object" - }, - { - "type": "null" - } - ] - }, - "scope": { - "items": { - "type": "string" - }, - "type": "array" - }, - "stability": { - "type": "string" - }, - "tiers": { - "items": { - "type": "string" - }, - "type": "array" - }, - "tool_details": { - "description": "Per-tool capability records; full schema at resource codex://capabilities-result", - "type": "array" - }, - "tool_error_carrier": { - "type": "string" - }, - "transport": { - "type": "string" - }, - "version": { - "type": "string" - } - }, - "required": [ - "name", - "version", - "transport", - "stability", - "active_tools", - "free_tools", - "tiers", - "sandboxes", - "scope", - "negative_scope", - "prerequisites", - "deprecation_policy" - ], - "type": "object" - }, - { - "properties": { - "error": { - "description": "Populated error envelope; full schema at resource codex://error-envelope", - "type": "object" - }, - "meta": { - "type": "object" - }, - "ok": { - "const": false - } - }, - "required": [ - "ok", - "error", - "meta" - ], - "type": "object" - } -]New value: +[ + { + "additionalProperties": false, + "properties": { + "active_tools": { + "items": { + "type": "string" + }, + "type": "array" + }, + "deprecation_policy": { + "type": "string" + }, + "error_envelope_resource": { + "type": "string" + }, + "fingerprint": { + "type": "string" + }, + "fingerprint_covers": { + "items": { + "type": "string" + }, + "type": "array" + }, + "free_tools": { + "items": { + "type": "string" + }, + "type": "array" + }, + "name": { + "type": "string" + }, + "negative_scope": { + "items": { + "type": "string" + }, + "type": "array" + }, + "ok": { + "const": true, + "type": "boolean" + }, + "prerequisites": { + "items": { + "type": "string" + }, + "type": "array" + }, + "resource_error_carrier": { + "type": "string" + }, + "result_meta_resource": { + "type": "string" + }, + "sandboxes": { + "items": { + "type": "string" + }, + "type": "array" + }, + "schemas": { + "anyOf": [ + { + "additionalProperties": true, + "type": "object" + }, + { + "type": "null" + } + ] + }, + "scope": { + "items": { + "type": "string" + }, + "type": "array" + }, + "server_version": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "stability": { + "type": "string" + }, + "tiers": { + "items": { + "type": "string" + }, + "type": "array" + }, + "tool_details": { + "description": "Per-tool capability records; full schema at resource codex://capabilities-result", + "type": "array" + }, + "tool_error_carrier": { + "type": "string" + }, + "transport": { + "type": "string" + }, + "version": { + "type": "string" + } + }, + "required": [ + "name", + "version", + "transport", + "stability", + "active_tools", + "free_tools", + "tiers", + "sandboxes", + "scope", + "negative_scope", + "prerequisites", + "deprecation_policy" + ], + "type": "object" + }, + { + "properties": { + "error": { + "description": "Populated error envelope; full schema at resource codex://error-envelope", + "type": "object" + }, + "meta": { + "type": "object" + }, + "ok": { + "const": false + } + }, + "required": [ + "ok", + "error", + "meta" + ], + "type": "object" + } +]
- Changed
codex_consult_async1 field changed- changed
Output schema / anyOfPrevious value: -[ - { - "additionalProperties": false, - "properties": { - "deadline_seconds": { - "type": "integer" - }, - "expires_at": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - "fingerprint": { - "type": "string" - }, - "job_id": { - "type": "string" - }, - "kind": { - "type": "string" - }, - "meta": { - "description": "Result metadata (cwd, tier, sandbox, model, timeout, usage, rate_limit, and more); full schema at resource codex://result-meta", - "type": "object" - }, - "ok": { - "const": true, - "type": "boolean" - }, - "poll_after_ms": { - "type": "integer" - }, - "started_at": { - "type": "string" - }, - "status": { - "enum": [ - "running", - "done", - "failed", - "cancelled", - "timeout" - ], - "type": "string" - }, - "ttl_seconds": { - "type": "integer" - } - }, - "required": [ - "job_id", - "kind", - "started_at", - "deadline_seconds", - "ttl_seconds", - "meta" - ], - "type": "object" - }, - { - "properties": { - "error": { - "description": "Populated error envelope; full schema at resource codex://error-envelope", - "type": "object" - }, - "meta": { - "type": "object" - }, - "ok": { - "const": false - } - }, - "required": [ - "ok", - "error", - "meta" - ], - "type": "object" - } -]New value: +[ + { + "additionalProperties": false, + "properties": { + "deadline_seconds": { + "type": "integer" + }, + "expires_at": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "fingerprint": { + "type": "string" + }, + "job_id": { + "type": "string" + }, + "kind": { + "type": "string" + }, + "meta": { + "description": "Result metadata (cwd, tier, sandbox, model, timeout, usage, rate_limit, and more); full schema at resource codex://result-meta", + "type": "object" + }, + "ok": { + "const": true, + "type": "boolean" + }, + "poll_after_ms": { + "type": "integer" + }, + "server_version": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "started_at": { + "type": "string" + }, + "status": { + "enum": [ + "running", + "done", + "failed", + "cancelled", + "timeout" + ], + "type": "string" + }, + "ttl_seconds": { + "type": "integer" + } + }, + "required": [ + "job_id", + "kind", + "started_at", + "deadline_seconds", + "ttl_seconds", + "meta" + ], + "type": "object" + }, + { + "properties": { + "error": { + "description": "Populated error envelope; full schema at resource codex://error-envelope", + "type": "object" + }, + "meta": { + "type": "object" + }, + "ok": { + "const": false + } + }, + "required": [ + "ok", + "error", + "meta" + ], + "type": "object" + } +]
- Changed
codex_delegate_async1 field changed- changed
Output schema / anyOfPrevious value: -[ - { - "additionalProperties": false, - "properties": { - "deadline_seconds": { - "type": "integer" - }, - "expires_at": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - "fingerprint": { - "type": "string" - }, - "job_id": { - "type": "string" - }, - "kind": { - "type": "string" - }, - "meta": { - "description": "Result metadata (cwd, tier, sandbox, model, timeout, usage, rate_limit, and more); full schema at resource codex://result-meta", - "type": "object" - }, - "ok": { - "const": true, - "type": "boolean" - }, - "poll_after_ms": { - "type": "integer" - }, - "started_at": { - "type": "string" - }, - "status": { - "enum": [ - "running", - "done", - "failed", - "cancelled", - "timeout" - ], - "type": "string" - }, - "ttl_seconds": { - "type": "integer" - } - }, - "required": [ - "job_id", - "kind", - "started_at", - "deadline_seconds", - "ttl_seconds", - "meta" - ], - "type": "object" - }, - { - "properties": { - "error": { - "description": "Populated error envelope; full schema at resource codex://error-envelope", - "type": "object" - }, - "meta": { - "type": "object" - }, - "ok": { - "const": false - } - }, - "required": [ - "ok", - "error", - "meta" - ], - "type": "object" - } -]New value: +[ + { + "additionalProperties": false, + "properties": { + "deadline_seconds": { + "type": "integer" + }, + "expires_at": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "fingerprint": { + "type": "string" + }, + "job_id": { + "type": "string" + }, + "kind": { + "type": "string" + }, + "meta": { + "description": "Result metadata (cwd, tier, sandbox, model, timeout, usage, rate_limit, and more); full schema at resource codex://result-meta", + "type": "object" + }, + "ok": { + "const": true, + "type": "boolean" + }, + "poll_after_ms": { + "type": "integer" + }, + "server_version": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "started_at": { + "type": "string" + }, + "status": { + "enum": [ + "running", + "done", + "failed", + "cancelled", + "timeout" + ], + "type": "string" + }, + "ttl_seconds": { + "type": "integer" + } + }, + "required": [ + "job_id", + "kind", + "started_at", + "deadline_seconds", + "ttl_seconds", + "meta" + ], + "type": "object" + }, + { + "properties": { + "error": { + "description": "Populated error envelope; full schema at resource codex://error-envelope", + "type": "object" + }, + "meta": { + "type": "object" + }, + "ok": { + "const": false + } + }, + "required": [ + "ok", + "error", + "meta" + ], + "type": "object" + } +]
- Changed
codex_delegate_dry_run1 field changed- changed
Output schema / anyOfPrevious value: -[ - { - "additionalProperties": false, - "properties": { - "cwd": { - "type": "string" - }, - "fingerprint": { - "type": "string" - }, - "isolation": { - "enum": [ - "inherit", - "ignore-config", - "ignore-rules" - ], - "type": "string" - }, - "max_input_bytes": { - "type": "integer" - }, - "ok": { - "const": true, - "type": "boolean" - }, - "prompt_bytes": { - "type": "integer" - }, - "sandbox": { - "enum": [ - "read-only", - "workspace-write", - "danger-full-access" - ], - "type": "string" - }, - "tier": { - "enum": [ - "consult", - "propose", - "apply" - ], - "type": "string" - }, - "tool": { - "const": "codex_delegate_dry_run", - "type": "string" - }, - "workspace_source": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - "workspace_warning": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - "worktree_plan": { - "additionalProperties": false, - "properties": { - "head_commit": { - "type": "string" - }, - "head_subject": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - "note": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - "tracked_bytes": { - "type": "integer" - }, - "tracked_files": { - "type": "integer" - }, - "uncommitted_tracked_files": { - "type": "integer" - }, - "untracked_files": { - "type": "integer" - } - }, - "required": [ - "head_commit", - "tracked_files", - "tracked_bytes", - "uncommitted_tracked_files", - "untracked_files" - ], - "type": "object" - } - }, - "required": [ - "cwd", - "isolation", - "prompt_bytes", - "max_input_bytes", - "worktree_plan" - ], - "type": "object" - }, - { - "properties": { - "error": { - "description": "Populated error envelope; full schema at resource codex://error-envelope", - "type": "object" - }, - "meta": { - "type": "object" - }, - "ok": { - "const": false - } - }, - "required": [ - "ok", - "error", - "meta" - ], - "type": "object" - } -]New value: +[ + { + "additionalProperties": false, + "properties": { + "cwd": { + "type": "string" + }, + "fingerprint": { + "type": "string" + }, + "isolation": { + "enum": [ + "inherit", + "ignore-config", + "ignore-rules" + ], + "type": "string" + }, + "max_input_bytes": { + "type": "integer" + }, + "ok": { + "const": true, + "type": "boolean" + }, + "prompt_bytes": { + "type": "integer" + }, + "sandbox": { + "enum": [ + "read-only", + "workspace-write", + "danger-full-access" + ], + "type": "string" + }, + "server_version": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "tier": { + "enum": [ + "consult", + "propose", + "apply" + ], + "type": "string" + }, + "tool": { + "const": "codex_delegate_dry_run", + "type": "string" + }, + "workspace_source": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "workspace_warning": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "worktree_plan": { + "additionalProperties": false, + "properties": { + "head_commit": { + "type": "string" + }, + "head_subject": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "note": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "tracked_bytes": { + "type": "integer" + }, + "tracked_files": { + "type": "integer" + }, + "uncommitted_tracked_files": { + "type": "integer" + }, + "untracked_files": { + "type": "integer" + } + }, + "required": [ + "head_commit", + "tracked_files", + "tracked_bytes", + "uncommitted_tracked_files", + "untracked_files" + ], + "type": "object" + } + }, + "required": [ + "cwd", + "isolation", + "prompt_bytes", + "max_input_bytes", + "worktree_plan" + ], + "type": "object" + }, + { + "properties": { + "error": { + "description": "Populated error envelope; full schema at resource codex://error-envelope", + "type": "object" + }, + "meta": { + "type": "object" + }, + "ok": { + "const": false + } + }, + "required": [ + "ok", + "error", + "meta" + ], + "type": "object" + } +]
- Changed
codex_dry_run1 field changed- changed
Output schema / anyOfPrevious value: -[ - { - "additionalProperties": false, - "properties": { - "base": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - "commit": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - "context_summary": { - "anyOf": [ - { - "additionalProperties": false, - "properties": { - "files_changed": { - "type": "integer" - }, - "lines_added": { - "type": "integer" - }, - "lines_removed": { - "type": "integer" - } - }, - "type": "object" - }, - { - "type": "null" - } - ] - }, - "cwd": { - "type": "string" - }, - "fingerprint": { - "type": "string" - }, - "isolation": { - "enum": [ - "inherit", - "ignore-config", - "ignore-rules" - ], - "type": "string" - }, - "max_input_bytes": { - "type": "integer" - }, - "ok": { - "const": true, - "type": "boolean" - }, - "paths": { - "items": { - "type": "string" - }, - "type": "array" - }, - "prompt_bytes": { - "type": "integer" - }, - "redacted_paths": { - "items": { - "type": "string" - }, - "type": "array" - }, - "redacted_paths_count": { - "type": "integer" - }, - "sandbox": { - "enum": [ - "read-only", - "workspace-write", - "danger-full-access" - ], - "type": "string" - }, - "scope": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - "security_warnings": { - "items": { - "type": "string" - }, - "type": "array" - }, - "tier": { - "enum": [ - "consult", - "propose", - "apply" - ], - "type": "string" - }, - "tool": { - "const": "codex_dry_run", - "type": "string" - }, - "truncated": { - "type": "boolean" - }, - "truncation_hint": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - "workspace_source": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - "workspace_warning": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - } - }, - "required": [ - "cwd", - "tier", - "sandbox", - "isolation", - "prompt_bytes", - "max_input_bytes" - ], - "type": "object" - }, - { - "properties": { - "error": { - "description": "Populated error envelope; full schema at resource codex://error-envelope", - "type": "object" - }, - "meta": { - "type": "object" - }, - "ok": { - "const": false - } - }, - "required": [ - "ok", - "error", - "meta" - ], - "type": "object" - } -]New value: +[ + { + "additionalProperties": false, + "properties": { + "base": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "commit": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "context_summary": { + "anyOf": [ + { + "additionalProperties": false, + "properties": { + "files_changed": { + "type": "integer" + }, + "lines_added": { + "type": "integer" + }, + "lines_removed": { + "type": "integer" + } + }, + "type": "object" + }, + { + "type": "null" + } + ] + }, + "cwd": { + "type": "string" + }, + "fingerprint": { + "type": "string" + }, + "isolation": { + "enum": [ + "inherit", + "ignore-config", + "ignore-rules" + ], + "type": "string" + }, + "max_input_bytes": { + "type": "integer" + }, + "ok": { + "const": true, + "type": "boolean" + }, + "paths": { + "items": { + "type": "string" + }, + "type": "array" + }, + "prompt_bytes": { + "type": "integer" + }, + "redacted_paths": { + "items": { + "type": "string" + }, + "type": "array" + }, + "redacted_paths_count": { + "type": "integer" + }, + "sandbox": { + "enum": [ + "read-only", + "workspace-write", + "danger-full-access" + ], + "type": "string" + }, + "scope": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "security_warnings": { + "items": { + "type": "string" + }, + "type": "array" + }, + "server_version": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "tier": { + "enum": [ + "consult", + "propose", + "apply" + ], + "type": "string" + }, + "tool": { + "const": "codex_dry_run", + "type": "string" + }, + "truncated": { + "type": "boolean" + }, + "truncation_hint": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "workspace_source": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "workspace_warning": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + } + }, + "required": [ + "cwd", + "tier", + "sandbox", + "isolation", + "prompt_bytes", + "max_input_bytes" + ], + "type": "object" + }, + { + "properties": { + "error": { + "description": "Populated error envelope; full schema at resource codex://error-envelope", + "type": "object" + }, + "meta": { + "type": "object" + }, + "ok": { + "const": false + } + }, + "required": [ + "ok", + "error", + "meta" + ], + "type": "object" + } +]
- Changed
codex_job_cancel1 field changed- changed
Output schema / anyOfPrevious value: -[ - { - "additionalProperties": false, - "properties": { - "cleanup_warnings": { - "items": { - "type": "string" - }, - "type": "array" - }, - "deadline_seconds": { - "type": "integer" - }, - "detail": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - "elapsed_ms": { - "type": "integer" - }, - "event_age_ms": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ] - }, - "events_seen": { - "type": "integer" - }, - "expires_at": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - "fingerprint": { - "type": "string" - }, - "job_id": { - "type": "string" - }, - "kind": { - "type": "string" - }, - "last_event_at": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - "ok": { - "const": true, - "type": "boolean" - }, - "poll_after_ms": { - "type": "integer" - }, - "result_available": { - "type": "boolean" - }, - "started_at": { - "type": "string" - }, - "status": { - "enum": [ - "running", - "done", - "failed", - "cancelled", - "timeout" - ], - "type": "string" - }, - "ttl_seconds": { - "type": "integer" - }, - "workspace": { - "additionalProperties": false, - "properties": { - "cwd": { - "type": "string" - }, - "workspace_source": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - "workspace_warning": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - } - }, - "required": [ - "cwd" - ], - "type": "object" - } - }, - "required": [ - "job_id", - "kind", - "status", - "started_at", - "elapsed_ms", - "deadline_seconds", - "ttl_seconds", - "workspace" - ], - "type": "object" - }, - { - "properties": { - "error": { - "description": "Populated error envelope; full schema at resource codex://error-envelope", - "type": "object" - }, - "meta": { - "type": "object" - }, - "ok": { - "const": false - } - }, - "required": [ - "ok", - "error", - "meta" - ], - "type": "object" - } -]New value: +[ + { + "additionalProperties": false, + "properties": { + "cleanup_warnings": { + "items": { + "type": "string" + }, + "type": "array" + }, + "deadline_seconds": { + "type": "integer" + }, + "detail": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "elapsed_ms": { + "type": "integer" + }, + "event_age_ms": { + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ] + }, + "events_seen": { + "type": "integer" + }, + "expires_at": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "fingerprint": { + "type": "string" + }, + "job_id": { + "type": "string" + }, + "kind": { + "type": "string" + }, + "last_event_at": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "ok": { + "const": true, + "type": "boolean" + }, + "poll_after_ms": { + "type": "integer" + }, + "result_available": { + "type": "boolean" + }, + "server_version": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "started_at": { + "type": "string" + }, + "status": { + "enum": [ + "running", + "done", + "failed", + "cancelled", + "timeout" + ], + "type": "string" + }, + "ttl_seconds": { + "type": "integer" + }, + "workspace": { + "additionalProperties": false, + "properties": { + "cwd": { + "type": "string" + }, + "workspace_source": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "workspace_warning": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + } + }, + "required": [ + "cwd" + ], + "type": "object" + } + }, + "required": [ + "job_id", + "kind", + "status", + "started_at", + "elapsed_ms", + "deadline_seconds", + "ttl_seconds", + "workspace" + ], + "type": "object" + }, + { + "properties": { + "error": { + "description": "Populated error envelope; full schema at resource codex://error-envelope", + "type": "object" + }, + "meta": { + "type": "object" + }, + "ok": { + "const": false + } + }, + "required": [ + "ok", + "error", + "meta" + ], + "type": "object" + } +]
- Changed
codex_job_list1 field changed- changed
Output schema / anyOfPrevious value: -[ - { - "additionalProperties": false, - "properties": { - "fingerprint": { - "type": "string" - }, - "jobs": { - "items": { - "additionalProperties": false, - "properties": { - "elapsed_ms": { - "type": "integer" - }, - "expires_at": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - "job_id": { - "type": "string" - }, - "kind": { - "type": "string" - }, - "result_available": { - "type": "boolean" - }, - "started_at": { - "type": "string" - }, - "status": { - "enum": [ - "running", - "done", - "failed", - "cancelled", - "timeout" - ], - "type": "string" - } - }, - "required": [ - "job_id", - "kind", - "status", - "started_at", - "elapsed_ms" - ], - "type": "object" - }, - "type": "array" - }, - "ok": { - "const": true, - "type": "boolean" - }, - "workspace": { - "additionalProperties": false, - "properties": { - "cwd": { - "type": "string" - }, - "workspace_source": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - "workspace_warning": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - } - }, - "required": [ - "cwd" - ], - "type": "object" - } - }, - "required": [ - "workspace" - ], - "type": "object" - }, - { - "properties": { - "error": { - "description": "Populated error envelope; full schema at resource codex://error-envelope", - "type": "object" - }, - "meta": { - "type": "object" - }, - "ok": { - "const": false - } - }, - "required": [ - "ok", - "error", - "meta" - ], - "type": "object" - } -]New value: +[ + { + "additionalProperties": false, + "properties": { + "fingerprint": { + "type": "string" + }, + "jobs": { + "items": { + "additionalProperties": false, + "properties": { + "elapsed_ms": { + "type": "integer" + }, + "expires_at": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "job_id": { + "type": "string" + }, + "kind": { + "type": "string" + }, + "result_available": { + "type": "boolean" + }, + "started_at": { + "type": "string" + }, + "status": { + "enum": [ + "running", + "done", + "failed", + "cancelled", + "timeout" + ], + "type": "string" + } + }, + "required": [ + "job_id", + "kind", + "status", + "started_at", + "elapsed_ms" + ], + "type": "object" + }, + "type": "array" + }, + "ok": { + "const": true, + "type": "boolean" + }, + "server_version": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "workspace": { + "additionalProperties": false, + "properties": { + "cwd": { + "type": "string" + }, + "workspace_source": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "workspace_warning": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + } + }, + "required": [ + "cwd" + ], + "type": "object" + } + }, + "required": [ + "workspace" + ], + "type": "object" + }, + { + "properties": { + "error": { + "description": "Populated error envelope; full schema at resource codex://error-envelope", + "type": "object" + }, + "meta": { + "type": "object" + }, + "ok": { + "const": false + } + }, + "required": [ + "ok", + "error", + "meta" + ], + "type": "object" + } +]
- Changed
codex_job_status1 field changed- changed
Output schema / anyOfPrevious value: -[ - { - "additionalProperties": false, - "properties": { - "cleanup_warnings": { - "items": { - "type": "string" - }, - "type": "array" - }, - "deadline_seconds": { - "type": "integer" - }, - "detail": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - "elapsed_ms": { - "type": "integer" - }, - "event_age_ms": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ] - }, - "events_seen": { - "type": "integer" - }, - "expires_at": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - "fingerprint": { - "type": "string" - }, - "job_id": { - "type": "string" - }, - "kind": { - "type": "string" - }, - "last_event_at": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - "ok": { - "const": true, - "type": "boolean" - }, - "poll_after_ms": { - "type": "integer" - }, - "result_available": { - "type": "boolean" - }, - "started_at": { - "type": "string" - }, - "status": { - "enum": [ - "running", - "done", - "failed", - "cancelled", - "timeout" - ], - "type": "string" - }, - "ttl_seconds": { - "type": "integer" - }, - "workspace": { - "additionalProperties": false, - "properties": { - "cwd": { - "type": "string" - }, - "workspace_source": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - "workspace_warning": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - } - }, - "required": [ - "cwd" - ], - "type": "object" - } - }, - "required": [ - "job_id", - "kind", - "status", - "started_at", - "elapsed_ms", - "deadline_seconds", - "ttl_seconds", - "workspace" - ], - "type": "object" - }, - { - "properties": { - "error": { - "description": "Populated error envelope; full schema at resource codex://error-envelope", - "type": "object" - }, - "meta": { - "type": "object" - }, - "ok": { - "const": false - } - }, - "required": [ - "ok", - "error", - "meta" - ], - "type": "object" - } -]New value: +[ + { + "additionalProperties": false, + "properties": { + "cleanup_warnings": { + "items": { + "type": "string" + }, + "type": "array" + }, + "deadline_seconds": { + "type": "integer" + }, + "detail": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "elapsed_ms": { + "type": "integer" + }, + "event_age_ms": { + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ] + }, + "events_seen": { + "type": "integer" + }, + "expires_at": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "fingerprint": { + "type": "string" + }, + "job_id": { + "type": "string" + }, + "kind": { + "type": "string" + }, + "last_event_at": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "ok": { + "const": true, + "type": "boolean" + }, + "poll_after_ms": { + "type": "integer" + }, + "result_available": { + "type": "boolean" + }, + "server_version": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "started_at": { + "type": "string" + }, + "status": { + "enum": [ + "running", + "done", + "failed", + "cancelled", + "timeout" + ], + "type": "string" + }, + "ttl_seconds": { + "type": "integer" + }, + "workspace": { + "additionalProperties": false, + "properties": { + "cwd": { + "type": "string" + }, + "workspace_source": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "workspace_warning": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + } + }, + "required": [ + "cwd" + ], + "type": "object" + } + }, + "required": [ + "job_id", + "kind", + "status", + "started_at", + "elapsed_ms", + "deadline_seconds", + "ttl_seconds", + "workspace" + ], + "type": "object" + }, + { + "properties": { + "error": { + "description": "Populated error envelope; full schema at resource codex://error-envelope", + "type": "object" + }, + "meta": { + "type": "object" + }, + "ok": { + "const": false + } + }, + "required": [ + "ok", + "error", + "meta" + ], + "type": "object" + } +]
- Changed
codex_models1 field changed- changed
Output schema / anyOfPrevious value: -[ - { - "additionalProperties": false, - "properties": { - "advisory": { - "type": "string" - }, - "cache_client_version": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - "fetched_at": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - "fingerprint": { - "type": "string" - }, - "models": { - "items": { - "additionalProperties": false, - "properties": { - "display_name": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - "slug": { - "type": "string" - } - }, - "required": [ - "slug" - ], - "type": "object" - }, - "type": "array" - }, - "ok": { - "const": true, - "type": "boolean" - }, - "source": { - "enum": [ - "cache", - "static", - "none" - ], - "type": "string" - }, - "unavailable_reason": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - } - }, - "required": [ - "source", - "advisory" - ], - "type": "object" - }, - { - "properties": { - "error": { - "description": "Populated error envelope; full schema at resource codex://error-envelope", - "type": "object" - }, - "meta": { - "type": "object" - }, - "ok": { - "const": false - } - }, - "required": [ - "ok", - "error", - "meta" - ], - "type": "object" - } -]New value: +[ + { + "additionalProperties": false, + "properties": { + "advisory": { + "type": "string" + }, + "cache_client_version": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "fetched_at": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "fingerprint": { + "type": "string" + }, + "models": { + "items": { + "additionalProperties": false, + "properties": { + "display_name": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "slug": { + "type": "string" + } + }, + "required": [ + "slug" + ], + "type": "object" + }, + "type": "array" + }, + "ok": { + "const": true, + "type": "boolean" + }, + "server_version": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "source": { + "enum": [ + "cache", + "static", + "none" + ], + "type": "string" + }, + "unavailable_reason": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + } + }, + "required": [ + "source", + "advisory" + ], + "type": "object" + }, + { + "properties": { + "error": { + "description": "Populated error envelope; full schema at resource codex://error-envelope", + "type": "object" + }, + "meta": { + "type": "object" + }, + "ok": { + "const": false + } + }, + "required": [ + "ok", + "error", + "meta" + ], + "type": "object" + } +]
- Changed
codex_review_changes_async1 field changed- changed
Output schema / anyOfPrevious value: -[ - { - "additionalProperties": false, - "properties": { - "deadline_seconds": { - "type": "integer" - }, - "expires_at": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - "fingerprint": { - "type": "string" - }, - "job_id": { - "type": "string" - }, - "kind": { - "type": "string" - }, - "meta": { - "description": "Result metadata (cwd, tier, sandbox, model, timeout, usage, rate_limit, and more); full schema at resource codex://result-meta", - "type": "object" - }, - "ok": { - "const": true, - "type": "boolean" - }, - "poll_after_ms": { - "type": "integer" - }, - "started_at": { - "type": "string" - }, - "status": { - "enum": [ - "running", - "done", - "failed", - "cancelled", - "timeout" - ], - "type": "string" - }, - "ttl_seconds": { - "type": "integer" - } - }, - "required": [ - "job_id", - "kind", - "started_at", - "deadline_seconds", - "ttl_seconds", - "meta" - ], - "type": "object" - }, - { - "properties": { - "error": { - "description": "Populated error envelope; full schema at resource codex://error-envelope", - "type": "object" - }, - "meta": { - "type": "object" - }, - "ok": { - "const": false - } - }, - "required": [ - "ok", - "error", - "meta" - ], - "type": "object" - } -]New value: +[ + { + "additionalProperties": false, + "properties": { + "deadline_seconds": { + "type": "integer" + }, + "expires_at": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "fingerprint": { + "type": "string" + }, + "job_id": { + "type": "string" + }, + "kind": { + "type": "string" + }, + "meta": { + "description": "Result metadata (cwd, tier, sandbox, model, timeout, usage, rate_limit, and more); full schema at resource codex://result-meta", + "type": "object" + }, + "ok": { + "const": true, + "type": "boolean" + }, + "poll_after_ms": { + "type": "integer" + }, + "server_version": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "started_at": { + "type": "string" + }, + "status": { + "enum": [ + "running", + "done", + "failed", + "cancelled", + "timeout" + ], + "type": "string" + }, + "ttl_seconds": { + "type": "integer" + } + }, + "required": [ + "job_id", + "kind", + "started_at", + "deadline_seconds", + "ttl_seconds", + "meta" + ], + "type": "object" + }, + { + "properties": { + "error": { + "description": "Populated error envelope; full schema at resource codex://error-envelope", + "type": "object" + }, + "meta": { + "type": "object" + }, + "ok": { + "const": false + } + }, + "required": [ + "ok", + "error", + "meta" + ], + "type": "object" + } +]
- Changed
codex_status1 field changed- changed
Output schema / anyOfPrevious value: -[ - { - "additionalProperties": false, - "properties": { - "auth_detail": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - "caveat": { - "type": "string" - }, - "codex_authenticated": { - "anyOf": [ - { - "type": "boolean" - }, - { - "type": "null" - } - ] - }, - "codex_found": { - "type": "boolean" - }, - "codex_version": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - "extra_args_configured": { - "type": "boolean" - }, - "extra_args_count": { - "type": "integer" - }, - "extra_args_valid": { - "type": "boolean" - }, - "fingerprint": { - "type": "string" - }, - "flags_warning": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - "ok": { - "const": true, - "type": "boolean" - }, - "rate_limit": { - "description": "Codex rate-limit snapshot; full schema at resource codex://status-result", - "type": "object" - }, - "raw_defaults": { - "description": "Raw configured defaults; full schema at resource codex://status-result", - "type": "object" - }, - "readiness_detail": { - "type": "string" - }, - "ready": { - "type": "boolean" - }, - "resolved_defaults": { - "description": "Resolved effective defaults; full schema at resource codex://status-result", - "type": "object" - }, - "version_supported": { - "anyOf": [ - { - "type": "boolean" - }, - { - "type": "null" - } - ] - }, - "version_warning": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - } - }, - "required": [ - "codex_found", - "readiness_detail", - "raw_defaults", - "resolved_defaults", - "caveat" - ], - "type": "object" - }, - { - "properties": { - "error": { - "description": "Populated error envelope; full schema at resource codex://error-envelope", - "type": "object" - }, - "meta": { - "type": "object" - }, - "ok": { - "const": false - } - }, - "required": [ - "ok", - "error", - "meta" - ], - "type": "object" - } -]New value: +[ + { + "additionalProperties": false, + "properties": { + "auth_detail": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "caveat": { + "type": "string" + }, + "codex_authenticated": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "null" + } + ] + }, + "codex_found": { + "type": "boolean" + }, + "codex_version": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "extra_args_configured": { + "type": "boolean" + }, + "extra_args_count": { + "type": "integer" + }, + "extra_args_valid": { + "type": "boolean" + }, + "fingerprint": { + "type": "string" + }, + "flags_warning": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "ok": { + "const": true, + "type": "boolean" + }, + "rate_limit": { + "description": "Codex rate-limit snapshot; full schema at resource codex://status-result", + "type": "object" + }, + "raw_defaults": { + "description": "Raw configured defaults; full schema at resource codex://status-result", + "type": "object" + }, + "readiness_detail": { + "type": "string" + }, + "ready": { + "type": "boolean" + }, + "resolved_defaults": { + "description": "Resolved effective defaults; full schema at resource codex://status-result", + "type": "object" + }, + "server_version": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "version_supported": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "null" + } + ] + }, + "version_warning": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + } + }, + "required": [ + "codex_found", + "readiness_detail", + "raw_defaults", + "resolved_defaults", + "caveat" + ], + "type": "object" + }, + { + "properties": { + "error": { + "description": "Populated error envelope; full schema at resource codex://error-envelope", + "type": "object" + }, + "meta": { + "type": "object" + }, + "ok": { + "const": false + } + }, + "required": [ + "ok", + "error", + "meta" + ], + "type": "object" + } +]
- Changed
codex_transfer1 field changed- changed
Output schema / anyOfPrevious value: -[ - { - "additionalProperties": false, - "properties": { - "fingerprint": { - "type": "string" - }, - "meta": { - "additionalProperties": false, - "properties": { - "codex_home": { - "type": "string" - }, - "elapsed_ms": { - "type": "integer" - }, - "import_id": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - "request_id": { - "type": "string" - }, - "thread_id_source": { - "enum": [ - "import_notification", - "ledger" - ], - "type": "string" - } - }, - "required": [ - "codex_home", - "thread_id_source", - "elapsed_ms" - ], - "type": "object" - }, - "ok": { - "const": true, - "type": "boolean" - }, - "resume_command": { - "type": "string" - }, - "source_path": { - "type": "string" - }, - "thread_id": { - "type": "string" - }, - "tool": { - "const": "codex_transfer", - "type": "string" - } - }, - "required": [ - "thread_id", - "resume_command", - "source_path", - "meta" - ], - "type": "object" - }, - { - "properties": { - "error": { - "description": "Populated error envelope; full schema at resource codex://error-envelope", - "type": "object" - }, - "meta": { - "type": "object" - }, - "ok": { - "const": false - } - }, - "required": [ - "ok", - "error", - "meta" - ], - "type": "object" - } -]New value: +[ + { + "additionalProperties": false, + "properties": { + "fingerprint": { + "type": "string" + }, + "meta": { + "additionalProperties": false, + "properties": { + "codex_home": { + "type": "string" + }, + "elapsed_ms": { + "type": "integer" + }, + "import_id": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "request_id": { + "type": "string" + }, + "thread_id_source": { + "enum": [ + "import_notification", + "ledger" + ], + "type": "string" + } + }, + "required": [ + "codex_home", + "thread_id_source", + "elapsed_ms" + ], + "type": "object" + }, + "ok": { + "const": true, + "type": "boolean" + }, + "resume_command": { + "type": "string" + }, + "server_version": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "source_path": { + "type": "string" + }, + "thread_id": { + "type": "string" + }, + "tool": { + "const": "codex_transfer", + "type": "string" + } + }, + "required": [ + "thread_id", + "resume_command", + "source_path", + "meta" + ], + "type": "object" + }, + { + "properties": { + "error": { + "description": "Populated error envelope; full schema at resource codex://error-envelope", + "type": "object" + }, + "meta": { + "type": "object" + }, + "ok": { + "const": false + } + }, + "required": [ + "ok", + "error", + "meta" + ], + "type": "object" + } +]
3 tool updates
v0.9.0- Changed
codex_capabilities3 fields changed- changed
Input schema / properties / include_schemas / anyOfPrevious value: -[ - { - "items": { - "enum": [ - "error-envelope", - "result-meta" - ], - "type": "string" - }, - "type": "array" - }, - { - "type": "null" - } -]New value: +[ + { + "items": { + "enum": [ + "error-envelope", + "result-meta", + "capabilities-result", + "status-result" + ], + "type": "string" + }, + "type": "array" + }, + { + "type": "null" + } +] - changed
Input schema / properties / include_schemas / descriptionPrevious value: -"Opt-in tool-reachable fallback for resource-blind clients: also embed the full 'error-envelope' and/or 'result-meta' schema in the response (the default payload omits them and points at the codex:// resources instead)."New value: +"Opt-in tool-reachable fallback for resource-blind clients: also embed the full 'error-envelope', 'result-meta', 'capabilities-result', and/or 'status-result' schema in the response (the default payload omits them and points at the codex:// resources instead)." - changed
Output schema / anyOfPrevious value: -[ - { - "additionalProperties": false, - "properties": { - "active_tools": { - "items": { - "type": "string" - }, - "type": "array" - }, - "deprecation_policy": { - "type": "string" - }, - "error_envelope_resource": { - "type": "string" - }, - "fingerprint": { - "type": "string" - }, - "fingerprint_covers": { - "items": { - "type": "string" - }, - "type": "array" - }, - "free_tools": { - "items": { - "type": "string" - }, - "type": "array" - }, - "name": { - "type": "string" - }, - "negative_scope": { - "items": { - "type": "string" - }, - "type": "array" - }, - "ok": { - "const": true, - "type": "boolean" - }, - "prerequisites": { - "items": { - "type": "string" - }, - "type": "array" - }, - "resource_error_carrier": { - "type": "string" - }, - "result_meta_resource": { - "type": "string" - }, - "sandboxes": { - "items": { - "type": "string" - }, - "type": "array" - }, - "schemas": { - "anyOf": [ - { - "additionalProperties": true, - "type": "object" - }, - { - "type": "null" - } - ] - }, - "scope": { - "items": { - "type": "string" - }, - "type": "array" - }, - "stability": { - "type": "string" - }, - "tiers": { - "items": { - "type": "string" - }, - "type": "array" - }, - "tool_details": { - "items": { - "additionalProperties": false, - "properties": { - "async_lifecycle": { - "anyOf": [ - { - "additionalProperties": false, - "properties": { - "activity_support": { - "const": "codex_events", - "type": "string" - }, - "cancel_tool": { - "type": "string" - }, - "consume_tool": { - "type": "string" - }, - "event_age_field": { - "type": "string" - }, - "event_count_field": { - "type": "string" - }, - "last_event_field": { - "type": "string" - }, - "lifecycle": { - "const": "codex_job_*", - "type": "string" - }, - "list_tool": { - "type": "string" - }, - "native_task_support": { - "const": false, - "type": "boolean" - }, - "poll_after_field": { - "type": "string" - }, - "poll_tool": { - "type": "string" - }, - "progress_support": { - "const": "none", - "type": "string" - }, - "result_ready_field": { - "type": "string" - }, - "result_tool": { - "type": "string" - }, - "status_field": { - "type": "string" - } - }, - "required": [ - "poll_tool", - "result_tool", - "consume_tool", - "cancel_tool", - "list_tool", - "status_field", - "result_ready_field", - "poll_after_field", - "event_count_field", - "last_event_field", - "event_age_field" - ], - "type": "object" - }, - { - "type": "null" - } - ] - }, - "cost": { - "enum": [ - "free", - "active" - ], - "type": "string" - }, - "error_codes": { - "items": { - "enum": [ - "codex_not_found", - "codex_auth_required", - "unexpanded_env_placeholder", - "unsupported_tier", - "unsupported_sandbox", - "unsupported_isolation", - "unsupported_detail", - "invalid_scope", - "invalid_base", - "invalid_commit", - "invalid_paths", - "invalid_arguments", - "invalid_workspace_root", - "workspace_outside_roots", - "input_too_large", - "not_a_git_repo", - "git_unavailable", - "worktree_error", - "context_too_large", - "resource_not_found", - "timeout", - "nonzero_exit", - "invalid_json", - "schema_violation", - "internal_error", - "cli_contract_changed", - "codex_rate_limited", - "job_not_found", - "job_running", - "job_cancelled", - "job_timeout", - "job_failed", - "idempotency_conflict", - "idempotency_result_unavailable", - "idempotency_in_progress" - ], - "type": "string" - }, - "type": "array" - }, - "key_optional_params": { - "items": { - "type": "string" - }, - "type": "array" - }, - "name": { - "type": "string" - }, - "required_params": { - "items": { - "type": "string" - }, - "type": "array" - }, - "returns": { - "type": "string" - }, - "stability": { - "anyOf": [ - { - "enum": [ - "stable", - "preview", - "experimental" - ], - "type": "string" - }, - { - "type": "null" - } - ] - }, - "use_when": { - "type": "string" - } - }, - "required": [ - "name", - "cost", - "use_when", - "returns" - ], - "type": "object" - }, - "type": "array" - }, - "tool_error_carrier": { - "type": "string" - }, - "transport": { - "type": "string" - }, - "version": { - "type": "string" - } - }, - "required": [ - "name", - "version", - "transport", - "stability", - "active_tools", - "free_tools", - "tiers", - "sandboxes", - "scope", - "negative_scope", - "prerequisites", - "deprecation_policy" - ], - "type": "object" - }, - { - "properties": { - "error": { - "description": "Populated error envelope; full schema at resource codex://error-envelope", - "type": "object" - }, - "meta": { - "type": "object" - }, - "ok": { - "const": false - } - }, - "required": [ - "ok", - "error", - "meta" - ], - "type": "object" - } -]New value: +[ + { + "additionalProperties": false, + "properties": { + "active_tools": { + "items": { + "type": "string" + }, + "type": "array" + }, + "deprecation_policy": { + "type": "string" + }, + "error_envelope_resource": { + "type": "string" + }, + "fingerprint": { + "type": "string" + }, + "fingerprint_covers": { + "items": { + "type": "string" + }, + "type": "array" + }, + "free_tools": { + "items": { + "type": "string" + }, + "type": "array" + }, + "name": { + "type": "string" + }, + "negative_scope": { + "items": { + "type": "string" + }, + "type": "array" + }, + "ok": { + "const": true, + "type": "boolean" + }, + "prerequisites": { + "items": { + "type": "string" + }, + "type": "array" + }, + "resource_error_carrier": { + "type": "string" + }, + "result_meta_resource": { + "type": "string" + }, + "sandboxes": { + "items": { + "type": "string" + }, + "type": "array" + }, + "schemas": { + "anyOf": [ + { + "additionalProperties": true, + "type": "object" + }, + { + "type": "null" + } + ] + }, + "scope": { + "items": { + "type": "string" + }, + "type": "array" + }, + "stability": { + "type": "string" + }, + "tiers": { + "items": { + "type": "string" + }, + "type": "array" + }, + "tool_details": { + "description": "Per-tool capability records; full schema at resource codex://capabilities-result", + "type": "array" + }, + "tool_error_carrier": { + "type": "string" + }, + "transport": { + "type": "string" + }, + "version": { + "type": "string" + } + }, + "required": [ + "name", + "version", + "transport", + "stability", + "active_tools", + "free_tools", + "tiers", + "sandboxes", + "scope", + "negative_scope", + "prerequisites", + "deprecation_policy" + ], + "type": "object" + }, + { + "properties": { + "error": { + "description": "Populated error envelope; full schema at resource codex://error-envelope", + "type": "object" + }, + "meta": { + "type": "object" + }, + "ok": { + "const": false + } + }, + "required": [ + "ok", + "error", + "meta" + ], + "type": "object" + } +]
- Changed
codex_status1 field changed- changed
Output schema / anyOfPrevious value: -[ - { - "additionalProperties": false, - "properties": { - "auth_detail": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - "caveat": { - "type": "string" - }, - "codex_authenticated": { - "anyOf": [ - { - "type": "boolean" - }, - { - "type": "null" - } - ] - }, - "codex_found": { - "type": "boolean" - }, - "codex_version": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - "fingerprint": { - "type": "string" - }, - "flags_warning": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - "ok": { - "const": true, - "type": "boolean" - }, - "rate_limit": { - "additionalProperties": false, - "properties": { - "age_seconds": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ] - }, - "as_of": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - "home_unverified": { - "type": "boolean" - }, - "is_stale": { - "type": "boolean" - }, - "limiting_window": { - "anyOf": [ - { - "enum": [ - "primary", - "secondary" - ], - "type": "string" - }, - { - "type": "null" - } - ] - }, - "note": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - "plan_type": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - "primary": { - "anyOf": [ - { - "additionalProperties": false, - "properties": { - "remaining_percent": { - "anyOf": [ - { - "type": "number" - }, - { - "type": "null" - } - ] - }, - "reset_passed": { - "type": "boolean" - }, - "resets_at": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - "seconds_until_reset": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ] - }, - "used_percent": { - "anyOf": [ - { - "type": "number" - }, - { - "type": "null" - } - ] - }, - "window_minutes": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ] - } - }, - "type": "object" - }, - { - "type": "null" - } - ] - }, - "secondary": { - "anyOf": [ - { - "additionalProperties": false, - "properties": { - "remaining_percent": { - "anyOf": [ - { - "type": "number" - }, - { - "type": "null" - } - ] - }, - "reset_passed": { - "type": "boolean" - }, - "resets_at": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - "seconds_until_reset": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ] - }, - "used_percent": { - "anyOf": [ - { - "type": "number" - }, - { - "type": "null" - } - ] - }, - "window_minutes": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ] - } - }, - "type": "object" - }, - { - "type": "null" - } - ] - }, - "source": { - "enum": [ - "current_run", - "plugin_cache" - ], - "type": "string" - }, - "status": { - "enum": [ - "available", - "limited", - "exhausted", - "unknown" - ], - "type": "string" - } - }, - "required": [ - "status" - ], - "type": "object" - }, - "raw_defaults": { - "additionalProperties": false, - "properties": { - "isolation": { - "type": "string" - }, - "model": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - "sandbox": { - "type": "string" - }, - "tier": { - "type": "string" - }, - "timeout_seconds": { - "type": "integer" - } - }, - "required": [ - "tier", - "sandbox", - "isolation", - "timeout_seconds" - ], - "type": "object" - }, - "readiness_detail": { - "type": "string" - }, - "ready": { - "type": "boolean" - }, - "resolved_defaults": { - "additionalProperties": false, - "properties": { - "isolation": { - "enum": [ - "inherit", - "ignore-config", - "ignore-rules" - ], - "type": "string" - }, - "model": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - "sandbox": { - "enum": [ - "read-only", - "workspace-write", - "danger-full-access" - ], - "type": "string" - }, - "tier": { - "enum": [ - "consult", - "propose", - "apply" - ], - "type": "string" - }, - "timeout_bounds": { - "items": { - "type": "integer" - }, - "type": "array" - }, - "timeout_seconds": { - "type": "integer" - } - }, - "required": [ - "tier", - "sandbox", - "isolation", - "timeout_seconds", - "timeout_bounds" - ], - "type": "object" - }, - "version_supported": { - "anyOf": [ - { - "type": "boolean" - }, - { - "type": "null" - } - ] - }, - "version_warning": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - } - }, - "required": [ - "codex_found", - "readiness_detail", - "raw_defaults", - "resolved_defaults", - "caveat" - ], - "type": "object" - }, - { - "properties": { - "error": { - "description": "Populated error envelope; full schema at resource codex://error-envelope", - "type": "object" - }, - "meta": { - "type": "object" - }, - "ok": { - "const": false - } - }, - "required": [ - "ok", - "error", - "meta" - ], - "type": "object" - } -]New value: +[ + { + "additionalProperties": false, + "properties": { + "auth_detail": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "caveat": { + "type": "string" + }, + "codex_authenticated": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "null" + } + ] + }, + "codex_found": { + "type": "boolean" + }, + "codex_version": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "extra_args_configured": { + "type": "boolean" + }, + "extra_args_count": { + "type": "integer" + }, + "extra_args_valid": { + "type": "boolean" + }, + "fingerprint": { + "type": "string" + }, + "flags_warning": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "ok": { + "const": true, + "type": "boolean" + }, + "rate_limit": { + "description": "Codex rate-limit snapshot; full schema at resource codex://status-result", + "type": "object" + }, + "raw_defaults": { + "description": "Raw configured defaults; full schema at resource codex://status-result", + "type": "object" + }, + "readiness_detail": { + "type": "string" + }, + "ready": { + "type": "boolean" + }, + "resolved_defaults": { + "description": "Resolved effective defaults; full schema at resource codex://status-result", + "type": "object" + }, + "version_supported": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "null" + } + ] + }, + "version_warning": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + } + }, + "required": [ + "codex_found", + "readiness_detail", + "raw_defaults", + "resolved_defaults", + "caveat" + ], + "type": "object" + }, + { + "properties": { + "error": { + "description": "Populated error envelope; full schema at resource codex://error-envelope", + "type": "object" + }, + "meta": { + "type": "object" + }, + "ok": { + "const": false + } + }, + "required": [ + "ok", + "error", + "meta" + ], + "type": "object" + } +]
- Added
codex_transfer
16 tool updates
v0.8.0- Changed
codex_capabilities3 fields changed- added
Input schema / properties / include_schemasAdded value: +{ + "anyOf": [ + { + "items": { + "enum": [ + "error-envelope", + "result-meta" + ], + "type": "string" + }, + "type": "array" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Opt-in tool-reachable fallback for resource-blind clients: also embed the full 'error-envelope' and/or 'result-meta' schema in the response (the default payload omits them and points at the codex:// resources instead)." +} - added
Output schema / $schemaAdded value: +"https://json-schema.org/draft/2020-12/schema" - changed
Output schema / anyOfPrevious value: -[ - { - "additionalProperties": false, - "properties": { - "active_tools": { - "items": { - "type": "string" - }, - "type": "array" - }, - "deprecation_policy": { - "type": "string" - }, - "error_envelope_resource": { - "type": "string" - }, - "fingerprint": { - "type": "string" - }, - "free_tools": { - "items": { - "type": "string" - }, - "type": "array" - }, - "name": { - "type": "string" - }, - "negative_scope": { - "items": { - "type": "string" - }, - "type": "array" - }, - "ok": { - "const": true, - "type": "boolean" - }, - "prerequisites": { - "items": { - "type": "string" - }, - "type": "array" - }, - "sandboxes": { - "items": { - "type": "string" - }, - "type": "array" - }, - "scope": { - "items": { - "type": "string" - }, - "type": "array" - }, - "stability": { - "type": "string" - }, - "tiers": { - "items": { - "type": "string" - }, - "type": "array" - }, - "tool_details": { - "items": { - "additionalProperties": false, - "properties": { - "async_lifecycle": { - "anyOf": [ - { - "additionalProperties": false, - "properties": { - "activity_support": { - "const": "codex_events", - "type": "string" - }, - "cancel_tool": { - "type": "string" - }, - "consume_tool": { - "type": "string" - }, - "event_age_field": { - "type": "string" - }, - "event_count_field": { - "type": "string" - }, - "last_event_field": { - "type": "string" - }, - "lifecycle": { - "const": "codex_job_*", - "type": "string" - }, - "list_tool": { - "type": "string" - }, - "native_task_support": { - "const": false, - "type": "boolean" - }, - "poll_after_field": { - "type": "string" - }, - "poll_tool": { - "type": "string" - }, - "progress_support": { - "const": "none", - "type": "string" - }, - "result_ready_field": { - "type": "string" - }, - "result_tool": { - "type": "string" - }, - "status_field": { - "type": "string" - } - }, - "required": [ - "poll_tool", - "result_tool", - "consume_tool", - "cancel_tool", - "list_tool", - "status_field", - "result_ready_field", - "poll_after_field", - "event_count_field", - "last_event_field", - "event_age_field" - ], - "type": "object" - }, - { - "type": "null" - } - ] - }, - "cost": { - "enum": [ - "free", - "active" - ], - "type": "string" - }, - "error_codes": { - "items": { - "enum": [ - "codex_not_found", - "codex_auth_required", - "unexpanded_env_placeholder", - "unsupported_tier", - "unsupported_sandbox", - "unsupported_isolation", - "unsupported_detail", - "invalid_scope", - "invalid_base", - "invalid_commit", - "invalid_paths", - "invalid_arguments", - "invalid_workspace_root", - "workspace_outside_roots", - "input_too_large", - "not_a_git_repo", - "git_unavailable", - "worktree_error", - "context_too_large", - "timeout", - "nonzero_exit", - "invalid_json", - "schema_violation", - "internal_error", - "cli_contract_changed", - "codex_rate_limited", - "job_not_found", - "job_running", - "job_cancelled", - "job_timeout", - "job_failed" - ], - "type": "string" - }, - "type": "array" - }, - "key_optional_params": { - "items": { - "type": "string" - }, - "type": "array" - }, - "name": { - "type": "string" - }, - "required_params": { - "items": { - "type": "string" - }, - "type": "array" - }, - "returns": { - "type": "string" - }, - "stability": { - "anyOf": [ - { - "enum": [ - "stable", - "preview", - "experimental" - ], - "type": "string" - }, - { - "type": "null" - } - ] - }, - "use_when": { - "type": "string" - } - }, - "required": [ - "name", - "cost", - "use_when", - "returns" - ], - "type": "object" - }, - "type": "array" - }, - "transport": { - "type": "string" - }, - "version": { - "type": "string" - } - }, - "required": [ - "name", - "version", - "transport", - "stability", - "active_tools", - "free_tools", - "tiers", - "sandboxes", - "scope", - "negative_scope", - "prerequisites", - "deprecation_policy" - ], - "type": "object" - }, - { - "properties": { - "error": { - "description": "Populated error envelope; full schema at resource codex://error-envelope", - "type": "object" - }, - "meta": { - "type": "object" - }, - "ok": { - "const": false - } - }, - "required": [ - "ok", - "error", - "meta" - ], - "type": "object" - } -]New value: +[ + { + "additionalProperties": false, + "properties": { + "active_tools": { + "items": { + "type": "string" + }, + "type": "array" + }, + "deprecation_policy": { + "type": "string" + }, + "error_envelope_resource": { + "type": "string" + }, + "fingerprint": { + "type": "string" + }, + "fingerprint_covers": { + "items": { + "type": "string" + }, + "type": "array" + }, + "free_tools": { + "items": { + "type": "string" + }, + "type": "array" + }, + "name": { + "type": "string" + }, + "negative_scope": { + "items": { + "type": "string" + }, + "type": "array" + }, + "ok": { + "const": true, + "type": "boolean" + }, + "prerequisites": { + "items": { + "type": "string" + }, + "type": "array" + }, + "resource_error_carrier": { + "type": "string" + }, + "result_meta_resource": { + "type": "string" + }, + "sandboxes": { + "items": { + "type": "string" + }, + "type": "array" + }, + "schemas": { + "anyOf": [ + { + "additionalProperties": true, + "type": "object" + }, + { + "type": "null" + } + ] + }, + "scope": { + "items": { + "type": "string" + }, + "type": "array" + }, + "stability": { + "type": "string" + }, + "tiers": { + "items": { + "type": "string" + }, + "type": "array" + }, + "tool_details": { + "items": { + "additionalProperties": false, + "properties": { + "async_lifecycle": { + "anyOf": [ + { + "additionalProperties": false, + "properties": { + "activity_support": { + "const": "codex_events", + "type": "string" + }, + "cancel_tool": { + "type": "string" + }, + "consume_tool": { + "type": "string" + }, + "event_age_field": { + "type": "string" + }, + "event_count_field": { + "type": "string" + }, + "last_event_field": { + "type": "string" + }, + "lifecycle": { + "const": "codex_job_*", + "type": "string" + }, + "list_tool": { + "type": "string" + }, + "native_task_support": { + "const": false, + "type": "boolean" + }, + "poll_after_field": { + "type": "string" + }, + "poll_tool": { + "type": "string" + }, + "progress_support": { + "const": "none", + "type": "string" + }, + "result_ready_field": { + "type": "string" + }, + "result_tool": { + "type": "string" + }, + "status_field": { + "type": "string" + } + }, + "required": [ + "poll_tool", + "result_tool", + "consume_tool", + "cancel_tool", + "list_tool", + "status_field", + "result_ready_field", + "poll_after_field", + "event_count_field", + "last_event_field", + "event_age_field" + ], + "type": "object" + }, + { + "type": "null" + } + ] + }, + "cost": { + "enum": [ + "free", + "active" + ], + "type": "string" + }, + "error_codes": { + "items": { + "enum": [ + "codex_not_found", + "codex_auth_required", + "unexpanded_env_placeholder", + "unsupported_tier", + "unsupported_sandbox", + "unsupported_isolation", + "unsupported_detail", + "invalid_scope", + "invalid_base", + "invalid_commit", + "invalid_paths", + "invalid_arguments", + "invalid_workspace_root", + "workspace_outside_roots", + "input_too_large", + "not_a_git_repo", + "git_unavailable", + "worktree_error", + "context_too_large", + "resource_not_found", + "timeout", + "nonzero_exit", + "invalid_json", + "schema_violation", + "internal_error", + "cli_contract_changed", + "codex_rate_limited", + "job_not_found", + "job_running", + "job_cancelled", + "job_timeout", + "job_failed", + "idempotency_conflict", + "idempotency_result_unavailable", + "idempotency_in_progress" + ], + "type": "string" + }, + "type": "array" + }, + "key_optional_params": { + "items": { + "type": "string" + }, + "type": "array" + }, + "name": { + "type": "string" + }, + "required_params": { + "items": { + "type": "string" + }, + "type": "array" + }, + "returns": { + "type": "string" + }, + "stability": { + "anyOf": [ + { + "enum": [ + "stable", + "preview", + "experimental" + ], + "type": "string" + }, + { + "type": "null" + } + ] + }, + "use_when": { + "type": "string" + } + }, + "required": [ + "name", + "cost", + "use_when", + "returns" + ], + "type": "object" + }, + "type": "array" + }, + "tool_error_carrier": { + "type": "string" + }, + "transport": { + "type": "string" + }, + "version": { + "type": "string" + } + }, + "required": [ + "name", + "version", + "transport", + "stability", + "active_tools", + "free_tools", + "tiers", + "sandboxes", + "scope", + "negative_scope", + "prerequisites", + "deprecation_policy" + ], + "type": "object" + }, + { + "properties": { + "error": { + "description": "Populated error envelope; full schema at resource codex://error-envelope", + "type": "object" + }, + "meta": { + "type": "object" + }, + "ok": { + "const": false + } + }, + "required": [ + "ok", + "error", + "meta" + ], + "type": "object" + } +]
- Changed
codex_consult4 fields changed- added
Input schema / properties / idempotency_keyAdded value: +{ + "anyOf": [ + { + "maxLength": 200, + "minLength": 1, + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Optional client-supplied dedup key, scoped to THIS concrete tool on the same workspace. Reusing it on the same tool with the same arguments replays the existing run instead of starting — and paying for — a duplicate Codex call (a sync call reattaches to the in-flight run and returns its result; an _async call returns the same job_id). The sync and _async variants are DIFFERENT tools and never share a key's run. Reuse with different arguments — including a different timeout_seconds — is refused (idempotency_conflict); a key whose prior result was already consumed/evicted is idempotency_result_unavailable; a still-publishing reservation is idempotency_in_progress (retry). Omit it for the prior no-dedup behavior. A completed result stays replayable while its job record lives (its TTL), subject to consumption or count-eviction; the fail-closed conflict/in-progress window can last longer — up to the job's max runtime + termination grace + TTL. meta.idempotency_replayed=true marks a replayed (unpaid) response." +} - changed
Input schema / properties / isolation / descriptionPrevious value: -"Codex config isolation: 'inherit' (default), 'ignore-config', or 'ignore-rules'."New value: +"Codex config isolation: 'inherit', 'ignore-config', or 'ignore-rules'. Defaults to the server's configured isolation (built-in default 'inherit'; `codex_status` reports the resolved value)." - added
Output schema / $schemaAdded value: +"https://json-schema.org/draft/2020-12/schema" - changed
Output schema / anyOfPrevious value: -[ - { - "additionalProperties": false, - "properties": { - "assumptions": { - "items": { - "type": "string" - }, - "type": "array" - }, - "findings": { - "items": { - "additionalProperties": false, - "properties": { - "evidence": { - "type": "string" - }, - "file": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - "line": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ] - }, - "line_end": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ] - }, - "recommendation": { - "type": "string" - }, - "risk": { - "type": "string" - }, - "severity": { - "enum": [ - "critical", - "high", - "medium", - "low", - "nit" - ], - "type": "string" - }, - "title": { - "type": "string" - } - }, - "required": [ - "severity", - "title", - "evidence", - "risk", - "recommendation" - ], - "type": "object" - }, - "type": "array" - }, - "meta": { - "additionalProperties": false, - "properties": { - "base": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - "command_exit_code": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ] - }, - "commit": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - "compat_warnings": { - "items": { - "type": "string" - }, - "type": "array" - }, - "context_summary": { - "anyOf": [ - { - "additionalProperties": false, - "properties": { - "files_changed": { - "type": "integer" - }, - "lines_added": { - "type": "integer" - }, - "lines_removed": { - "type": "integer" - } - }, - "type": "object" - }, - { - "type": "null" - } - ] - }, - "cwd": { - "type": "string" - }, - "elapsed_ms": { - "type": "integer" - }, - "fingerprint": { - "type": "string" - }, - "isolation": { - "enum": [ - "inherit", - "ignore-config", - "ignore-rules" - ], - "type": "string" - }, - "job_id": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - "model": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - "paths": { - "anyOf": [ - { - "items": { - "type": "string" - }, - "type": "array" - }, - { - "type": "null" - } - ] - }, - "rate_limit": { - "anyOf": [ - { - "additionalProperties": false, - "properties": { - "age_seconds": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ] - }, - "as_of": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - "home_unverified": { - "type": "boolean" - }, - "is_stale": { - "type": "boolean" - }, - "limiting_window": { - "anyOf": [ - { - "enum": [ - "primary", - "secondary" - ], - "type": "string" - }, - { - "type": "null" - } - ] - }, - "note": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - "plan_type": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - "primary": { - "anyOf": [ - { - "additionalProperties": false, - "properties": { - "remaining_percent": { - "anyOf": [ - { - "type": "number" - }, - { - "type": "null" - } - ] - }, - "reset_passed": { - "type": "boolean" - }, - "resets_at": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ] - }, - "seconds_until_reset": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ] - }, - "used_percent": { - "anyOf": [ - { - "type": "number" - }, - { - "type": "null" - } - ] - }, - "window_minutes": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ] - } - }, - "type": "object" - }, - { - "type": "null" - } - ] - }, - "secondary": { - "anyOf": [ - { - "additionalProperties": false, - "properties": { - "remaining_percent": { - "anyOf": [ - { - "type": "number" - }, - { - "type": "null" - } - ] - }, - "reset_passed": { - "type": "boolean" - }, - "resets_at": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ] - }, - "seconds_until_reset": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ] - }, - "used_percent": { - "anyOf": [ - { - "type": "number" - }, - { - "type": "null" - } - ] - }, - "window_minutes": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ] - } - }, - "type": "object" - }, - { - "type": "null" - } - ] - }, - "source": { - "enum": [ - "current_run", - "plugin_cache" - ], - "type": "string" - }, - "status": { - "enum": [ - "available", - "limited", - "exhausted", - "unknown" - ], - "type": "string" - } - }, - "required": [ - "status" - ], - "type": "object" - }, - { - "type": "null" - } - ] - }, - "redacted_paths": { - "items": { - "type": "string" - }, - "type": "array" - }, - "request_id": { - "type": "string" - }, - "sandbox": { - "enum": [ - "read-only", - "workspace-write", - "danger-full-access" - ], - "type": "string" - }, - "scope": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - "security_warnings": { - "items": { - "type": "string" - }, - "type": "array" - }, - "session_id": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - "tier": { - "enum": [ - "consult", - "propose", - "apply" - ], - "type": "string" - }, - "timeout_seconds": { - "type": "integer" - }, - "truncated": { - "type": "boolean" - }, - "truncation_hint": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - "usage": { - "anyOf": [ - { - "additionalProperties": false, - "properties": { - "cached_input_tokens": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ] - }, - "input_tokens": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ] - }, - "output_tokens": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ] - }, - "total_tokens": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ] - } - }, - "type": "object" - }, - { - "type": "null" - } - ] - }, - "workspace_source": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - "workspace_warning": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - } - }, - "required": [ - "cwd", - "tier", - "sandbox", - "isolation", - "timeout_seconds", - "elapsed_ms" - ], - "type": "object" - }, - "next_steps": { - "items": { - "type": "string" - }, - "type": "array" - }, - "ok": { - "const": true, - "type": "boolean" - }, - "questions": { - "items": { - "type": "string" - }, - "type": "array" - }, - "raw_response": { - "additionalProperties": false, - "properties": { - "model": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - "session_id": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - "text": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - } - }, - "type": "object" - }, - "summary": { - "type": "string" - }, - "tool": { - "const": "codex_consult", - "type": "string" - } - }, - "required": [ - "summary", - "meta" - ], - "type": "object" - }, - { - "properties": { - "error": { - "description": "Populated error envelope; full schema at resource codex://error-envelope", - "type": "object" - }, - "meta": { - "type": "object" - }, - "ok": { - "const": false - } - }, - "required": [ - "ok", - "error", - "meta" - ], - "type": "object" - } -]New value: +[ + { + "additionalProperties": false, + "properties": { + "assumptions": { + "items": { + "type": "string" + }, + "type": "array" + }, + "findings": { + "items": { + "additionalProperties": false, + "properties": { + "evidence": { + "type": "string" + }, + "file": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "line": { + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ] + }, + "line_end": { + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ] + }, + "recommendation": { + "type": "string" + }, + "risk": { + "type": "string" + }, + "severity": { + "enum": [ + "critical", + "high", + "medium", + "low", + "nit" + ], + "type": "string" + }, + "title": { + "type": "string" + } + }, + "required": [ + "severity", + "title", + "evidence", + "risk", + "recommendation" + ], + "type": "object" + }, + "type": "array" + }, + "meta": { + "description": "Result metadata (cwd, tier, sandbox, model, timeout, usage, rate_limit, and more); full schema at resource codex://result-meta", + "type": "object" + }, + "next_steps": { + "items": { + "type": "string" + }, + "type": "array" + }, + "ok": { + "const": true, + "type": "boolean" + }, + "questions": { + "items": { + "type": "string" + }, + "type": "array" + }, + "raw_response": { + "additionalProperties": false, + "properties": { + "model": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "session_id": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "text": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + } + }, + "type": "object" + }, + "summary": { + "type": "string" + }, + "tool": { + "const": "codex_consult", + "type": "string" + } + }, + "required": [ + "summary", + "meta" + ], + "type": "object" + }, + { + "properties": { + "error": { + "description": "Populated error envelope; full schema at resource codex://error-envelope", + "type": "object" + }, + "meta": { + "type": "object" + }, + "ok": { + "const": false + } + }, + "required": [ + "ok", + "error", + "meta" + ], + "type": "object" + } +]
- Changed
codex_consult_async4 fields changed- added
Input schema / properties / idempotency_keyAdded value: +{ + "anyOf": [ + { + "maxLength": 200, + "minLength": 1, + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Optional client-supplied dedup key, scoped to THIS concrete tool on the same workspace. Reusing it on the same tool with the same arguments replays the existing run instead of starting — and paying for — a duplicate Codex call (a sync call reattaches to the in-flight run and returns its result; an _async call returns the same job_id). The sync and _async variants are DIFFERENT tools and never share a key's run. Reuse with different arguments — including a different timeout_seconds — is refused (idempotency_conflict); a key whose prior result was already consumed/evicted is idempotency_result_unavailable; a still-publishing reservation is idempotency_in_progress (retry). Omit it for the prior no-dedup behavior. A completed result stays replayable while its job record lives (its TTL), subject to consumption or count-eviction; the fail-closed conflict/in-progress window can last longer — up to the job's max runtime + termination grace + TTL. meta.idempotency_replayed=true marks a replayed (unpaid) response." +} - changed
Input schema / properties / isolation / descriptionPrevious value: -"Codex config isolation: 'inherit' (default), 'ignore-config', or 'ignore-rules'."New value: +"Codex config isolation: 'inherit', 'ignore-config', or 'ignore-rules'. Defaults to the server's configured isolation (built-in default 'inherit'; `codex_status` reports the resolved value)." - added
Output schema / $schemaAdded value: +"https://json-schema.org/draft/2020-12/schema" - changed
Output schema / anyOfPrevious value: -[ - { - "additionalProperties": false, - "properties": { - "deadline_seconds": { - "type": "integer" - }, - "expires_at": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - "fingerprint": { - "type": "string" - }, - "job_id": { - "type": "string" - }, - "kind": { - "type": "string" - }, - "meta": { - "additionalProperties": false, - "properties": { - "base": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - "command_exit_code": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ] - }, - "commit": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - "compat_warnings": { - "items": { - "type": "string" - }, - "type": "array" - }, - "context_summary": { - "anyOf": [ - { - "additionalProperties": false, - "properties": { - "files_changed": { - "type": "integer" - }, - "lines_added": { - "type": "integer" - }, - "lines_removed": { - "type": "integer" - } - }, - "type": "object" - }, - { - "type": "null" - } - ] - }, - "cwd": { - "type": "string" - }, - "elapsed_ms": { - "type": "integer" - }, - "fingerprint": { - "type": "string" - }, - "isolation": { - "enum": [ - "inherit", - "ignore-config", - "ignore-rules" - ], - "type": "string" - }, - "job_id": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - "model": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - "paths": { - "anyOf": [ - { - "items": { - "type": "string" - }, - "type": "array" - }, - { - "type": "null" - } - ] - }, - "rate_limit": { - "anyOf": [ - { - "additionalProperties": false, - "properties": { - "age_seconds": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ] - }, - "as_of": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - "home_unverified": { - "type": "boolean" - }, - "is_stale": { - "type": "boolean" - }, - "limiting_window": { - "anyOf": [ - { - "enum": [ - "primary", - "secondary" - ], - "type": "string" - }, - { - "type": "null" - } - ] - }, - "note": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - "plan_type": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - "primary": { - "anyOf": [ - { - "additionalProperties": false, - "properties": { - "remaining_percent": { - "anyOf": [ - { - "type": "number" - }, - { - "type": "null" - } - ] - }, - "reset_passed": { - "type": "boolean" - }, - "resets_at": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ] - }, - "seconds_until_reset": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ] - }, - "used_percent": { - "anyOf": [ - { - "type": "number" - }, - { - "type": "null" - } - ] - }, - "window_minutes": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ] - } - }, - "type": "object" - }, - { - "type": "null" - } - ] - }, - "secondary": { - "anyOf": [ - { - "additionalProperties": false, - "properties": { - "remaining_percent": { - "anyOf": [ - { - "type": "number" - }, - { - "type": "null" - } - ] - }, - "reset_passed": { - "type": "boolean" - }, - "resets_at": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ] - }, - "seconds_until_reset": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ] - }, - "used_percent": { - "anyOf": [ - { - "type": "number" - }, - { - "type": "null" - } - ] - }, - "window_minutes": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ] - } - }, - "type": "object" - }, - { - "type": "null" - } - ] - }, - "source": { - "enum": [ - "current_run", - "plugin_cache" - ], - "type": "string" - }, - "status": { - "enum": [ - "available", - "limited", - "exhausted", - "unknown" - ], - "type": "string" - } - }, - "required": [ - "status" - ], - "type": "object" - }, - { - "type": "null" - } - ] - }, - "redacted_paths": { - "items": { - "type": "string" - }, - "type": "array" - }, - "request_id": { - "type": "string" - }, - "sandbox": { - "enum": [ - "read-only", - "workspace-write", - "danger-full-access" - ], - "type": "string" - }, - "scope": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - "security_warnings": { - "items": { - "type": "string" - }, - "type": "array" - }, - "session_id": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - "tier": { - "enum": [ - "consult", - "propose", - "apply" - ], - "type": "string" - }, - "timeout_seconds": { - "type": "integer" - }, - "truncated": { - "type": "boolean" - }, - "truncation_hint": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - "usage": { - "anyOf": [ - { - "additionalProperties": false, - "properties": { - "cached_input_tokens": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ] - }, - "input_tokens": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ] - }, - "output_tokens": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ] - }, - "total_tokens": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ] - } - }, - "type": "object" - }, - { - "type": "null" - } - ] - }, - "workspace_source": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - "workspace_warning": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - } - }, - "required": [ - "cwd", - "tier", - "sandbox", - "isolation", - "timeout_seconds", - "elapsed_ms" - ], - "type": "object" - }, - "ok": { - "const": true, - "type": "boolean" - }, - "poll_after_ms": { - "type": "integer" - }, - "started_at": { - "type": "string" - }, - "status": { - "enum": [ - "running", - "done", - "failed", - "cancelled", - "timeout" - ], - "type": "string" - }, - "ttl_seconds": { - "type": "integer" - } - }, - "required": [ - "job_id", - "kind", - "started_at", - "deadline_seconds", - "ttl_seconds", - "meta" - ], - "type": "object" - }, - { - "properties": { - "error": { - "description": "Populated error envelope; full schema at resource codex://error-envelope", - "type": "object" - }, - "meta": { - "type": "object" - }, - "ok": { - "const": false - } - }, - "required": [ - "ok", - "error", - "meta" - ], - "type": "object" - } -]New value: +[ + { + "additionalProperties": false, + "properties": { + "deadline_seconds": { + "type": "integer" + }, + "expires_at": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "fingerprint": { + "type": "string" + }, + "job_id": { + "type": "string" + }, + "kind": { + "type": "string" + }, + "meta": { + "description": "Result metadata (cwd, tier, sandbox, model, timeout, usage, rate_limit, and more); full schema at resource codex://result-meta", + "type": "object" + }, + "ok": { + "const": true, + "type": "boolean" + }, + "poll_after_ms": { + "type": "integer" + }, + "started_at": { + "type": "string" + }, + "status": { + "enum": [ + "running", + "done", + "failed", + "cancelled", + "timeout" + ], + "type": "string" + }, + "ttl_seconds": { + "type": "integer" + } + }, + "required": [ + "job_id", + "kind", + "started_at", + "deadline_seconds", + "ttl_seconds", + "meta" + ], + "type": "object" + }, + { + "properties": { + "error": { + "description": "Populated error envelope; full schema at resource codex://error-envelope", + "type": "object" + }, + "meta": { + "type": "object" + }, + "ok": { + "const": false + } + }, + "required": [ + "ok", + "error", + "meta" + ], + "type": "object" + } +]
- Changed
codex_delegate4 fields changed- added
Input schema / properties / idempotency_keyAdded value: +{ + "anyOf": [ + { + "maxLength": 200, + "minLength": 1, + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Optional client-supplied dedup key, scoped to THIS concrete tool on the same workspace. Reusing it on the same tool with the same arguments replays the existing run instead of starting — and paying for — a duplicate Codex call (a sync call reattaches to the in-flight run and returns its result; an _async call returns the same job_id). The sync and _async variants are DIFFERENT tools and never share a key's run. Reuse with different arguments — including a different timeout_seconds — is refused (idempotency_conflict); a key whose prior result was already consumed/evicted is idempotency_result_unavailable; a still-publishing reservation is idempotency_in_progress (retry). Omit it for the prior no-dedup behavior. A completed result stays replayable while its job record lives (its TTL), subject to consumption or count-eviction; the fail-closed conflict/in-progress window can last longer — up to the job's max runtime + termination grace + TTL. meta.idempotency_replayed=true marks a replayed (unpaid) response." +} - changed
Input schema / properties / isolation / descriptionPrevious value: -"Codex config isolation: 'inherit' (default), 'ignore-config', or 'ignore-rules'."New value: +"Codex config isolation: 'inherit', 'ignore-config', or 'ignore-rules'. Defaults to the server's configured isolation (built-in default 'inherit'; `codex_status` reports the resolved value)." - added
Output schema / $schemaAdded value: +"https://json-schema.org/draft/2020-12/schema" - changed
Output schema / anyOfPrevious value: -[ - { - "additionalProperties": false, - "properties": { - "assumptions": { - "items": { - "type": "string" - }, - "type": "array" - }, - "diff": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - "findings": { - "items": { - "additionalProperties": false, - "properties": { - "evidence": { - "type": "string" - }, - "file": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - "line": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ] - }, - "line_end": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ] - }, - "recommendation": { - "type": "string" - }, - "risk": { - "type": "string" - }, - "severity": { - "enum": [ - "critical", - "high", - "medium", - "low", - "nit" - ], - "type": "string" - }, - "title": { - "type": "string" - } - }, - "required": [ - "severity", - "title", - "evidence", - "risk", - "recommendation" - ], - "type": "object" - }, - "type": "array" - }, - "meta": { - "additionalProperties": false, - "properties": { - "base": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - "command_exit_code": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ] - }, - "commit": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - "compat_warnings": { - "items": { - "type": "string" - }, - "type": "array" - }, - "context_summary": { - "anyOf": [ - { - "additionalProperties": false, - "properties": { - "files_changed": { - "type": "integer" - }, - "lines_added": { - "type": "integer" - }, - "lines_removed": { - "type": "integer" - } - }, - "type": "object" - }, - { - "type": "null" - } - ] - }, - "cwd": { - "type": "string" - }, - "elapsed_ms": { - "type": "integer" - }, - "fingerprint": { - "type": "string" - }, - "isolation": { - "enum": [ - "inherit", - "ignore-config", - "ignore-rules" - ], - "type": "string" - }, - "job_id": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - "model": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - "paths": { - "anyOf": [ - { - "items": { - "type": "string" - }, - "type": "array" - }, - { - "type": "null" - } - ] - }, - "rate_limit": { - "anyOf": [ - { - "additionalProperties": false, - "properties": { - "age_seconds": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ] - }, - "as_of": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - "home_unverified": { - "type": "boolean" - }, - "is_stale": { - "type": "boolean" - }, - "limiting_window": { - "anyOf": [ - { - "enum": [ - "primary", - "secondary" - ], - "type": "string" - }, - { - "type": "null" - } - ] - }, - "note": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - "plan_type": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - "primary": { - "anyOf": [ - { - "additionalProperties": false, - "properties": { - "remaining_percent": { - "anyOf": [ - { - "type": "number" - }, - { - "type": "null" - } - ] - }, - "reset_passed": { - "type": "boolean" - }, - "resets_at": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ] - }, - "seconds_until_reset": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ] - }, - "used_percent": { - "anyOf": [ - { - "type": "number" - }, - { - "type": "null" - } - ] - }, - "window_minutes": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ] - } - }, - "type": "object" - }, - { - "type": "null" - } - ] - }, - "secondary": { - "anyOf": [ - { - "additionalProperties": false, - "properties": { - "remaining_percent": { - "anyOf": [ - { - "type": "number" - }, - { - "type": "null" - } - ] - }, - "reset_passed": { - "type": "boolean" - }, - "resets_at": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ] - }, - "seconds_until_reset": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ] - }, - "used_percent": { - "anyOf": [ - { - "type": "number" - }, - { - "type": "null" - } - ] - }, - "window_minutes": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ] - } - }, - "type": "object" - }, - { - "type": "null" - } - ] - }, - "source": { - "enum": [ - "current_run", - "plugin_cache" - ], - "type": "string" - }, - "status": { - "enum": [ - "available", - "limited", - "exhausted", - "unknown" - ], - "type": "string" - } - }, - "required": [ - "status" - ], - "type": "object" - }, - { - "type": "null" - } - ] - }, - "redacted_paths": { - "items": { - "type": "string" - }, - "type": "array" - }, - "request_id": { - "type": "string" - }, - "sandbox": { - "enum": [ - "read-only", - "workspace-write", - "danger-full-access" - ], - "type": "string" - }, - "scope": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - "security_warnings": { - "items": { - "type": "string" - }, - "type": "array" - }, - "session_id": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - "tier": { - "enum": [ - "consult", - "propose", - "apply" - ], - "type": "string" - }, - "timeout_seconds": { - "type": "integer" - }, - "truncated": { - "type": "boolean" - }, - "truncation_hint": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - "usage": { - "anyOf": [ - { - "additionalProperties": false, - "properties": { - "cached_input_tokens": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ] - }, - "input_tokens": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ] - }, - "output_tokens": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ] - }, - "total_tokens": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ] - } - }, - "type": "object" - }, - { - "type": "null" - } - ] - }, - "workspace_source": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - "workspace_warning": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - } - }, - "required": [ - "cwd", - "tier", - "sandbox", - "isolation", - "timeout_seconds", - "elapsed_ms" - ], - "type": "object" - }, - "next_steps": { - "items": { - "type": "string" - }, - "type": "array" - }, - "ok": { - "const": true, - "type": "boolean" - }, - "questions": { - "items": { - "type": "string" - }, - "type": "array" - }, - "raw_response": { - "additionalProperties": false, - "properties": { - "model": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - "session_id": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - "text": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - } - }, - "type": "object" - }, - "summary": { - "type": "string" - }, - "tool": { - "const": "codex_delegate", - "type": "string" - } - }, - "required": [ - "summary", - "meta" - ], - "type": "object" - }, - { - "properties": { - "error": { - "description": "Populated error envelope; full schema at resource codex://error-envelope", - "type": "object" - }, - "meta": { - "type": "object" - }, - "ok": { - "const": false - } - }, - "required": [ - "ok", - "error", - "meta" - ], - "type": "object" - } -]New value: +[ + { + "additionalProperties": false, + "properties": { + "assumptions": { + "items": { + "type": "string" + }, + "type": "array" + }, + "diff": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "findings": { + "items": { + "additionalProperties": false, + "properties": { + "evidence": { + "type": "string" + }, + "file": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "line": { + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ] + }, + "line_end": { + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ] + }, + "recommendation": { + "type": "string" + }, + "risk": { + "type": "string" + }, + "severity": { + "enum": [ + "critical", + "high", + "medium", + "low", + "nit" + ], + "type": "string" + }, + "title": { + "type": "string" + } + }, + "required": [ + "severity", + "title", + "evidence", + "risk", + "recommendation" + ], + "type": "object" + }, + "type": "array" + }, + "meta": { + "description": "Result metadata (cwd, tier, sandbox, model, timeout, usage, rate_limit, and more); full schema at resource codex://result-meta", + "type": "object" + }, + "next_steps": { + "items": { + "type": "string" + }, + "type": "array" + }, + "ok": { + "const": true, + "type": "boolean" + }, + "questions": { + "items": { + "type": "string" + }, + "type": "array" + }, + "raw_response": { + "additionalProperties": false, + "properties": { + "model": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "session_id": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "text": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + } + }, + "type": "object" + }, + "summary": { + "type": "string" + }, + "tool": { + "const": "codex_delegate", + "type": "string" + } + }, + "required": [ + "summary", + "meta" + ], + "type": "object" + }, + { + "properties": { + "error": { + "description": "Populated error envelope; full schema at resource codex://error-envelope", + "type": "object" + }, + "meta": { + "type": "object" + }, + "ok": { + "const": false + } + }, + "required": [ + "ok", + "error", + "meta" + ], + "type": "object" + } +]
- Changed
codex_delegate_async4 fields changed- added
Input schema / properties / idempotency_keyAdded value: +{ + "anyOf": [ + { + "maxLength": 200, + "minLength": 1, + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Optional client-supplied dedup key, scoped to THIS concrete tool on the same workspace. Reusing it on the same tool with the same arguments replays the existing run instead of starting — and paying for — a duplicate Codex call (a sync call reattaches to the in-flight run and returns its result; an _async call returns the same job_id). The sync and _async variants are DIFFERENT tools and never share a key's run. Reuse with different arguments — including a different timeout_seconds — is refused (idempotency_conflict); a key whose prior result was already consumed/evicted is idempotency_result_unavailable; a still-publishing reservation is idempotency_in_progress (retry). Omit it for the prior no-dedup behavior. A completed result stays replayable while its job record lives (its TTL), subject to consumption or count-eviction; the fail-closed conflict/in-progress window can last longer — up to the job's max runtime + termination grace + TTL. meta.idempotency_replayed=true marks a replayed (unpaid) response." +} - changed
Input schema / properties / isolation / descriptionPrevious value: -"Codex config isolation: 'inherit' (default), 'ignore-config', or 'ignore-rules'."New value: +"Codex config isolation: 'inherit', 'ignore-config', or 'ignore-rules'. Defaults to the server's configured isolation (built-in default 'inherit'; `codex_status` reports the resolved value)." - added
Output schema / $schemaAdded value: +"https://json-schema.org/draft/2020-12/schema" - changed
Output schema / anyOfPrevious value: -[ - { - "additionalProperties": false, - "properties": { - "deadline_seconds": { - "type": "integer" - }, - "expires_at": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - "fingerprint": { - "type": "string" - }, - "job_id": { - "type": "string" - }, - "kind": { - "type": "string" - }, - "meta": { - "additionalProperties": false, - "properties": { - "base": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - "command_exit_code": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ] - }, - "commit": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - "compat_warnings": { - "items": { - "type": "string" - }, - "type": "array" - }, - "context_summary": { - "anyOf": [ - { - "additionalProperties": false, - "properties": { - "files_changed": { - "type": "integer" - }, - "lines_added": { - "type": "integer" - }, - "lines_removed": { - "type": "integer" - } - }, - "type": "object" - }, - { - "type": "null" - } - ] - }, - "cwd": { - "type": "string" - }, - "elapsed_ms": { - "type": "integer" - }, - "fingerprint": { - "type": "string" - }, - "isolation": { - "enum": [ - "inherit", - "ignore-config", - "ignore-rules" - ], - "type": "string" - }, - "job_id": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - "model": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - "paths": { - "anyOf": [ - { - "items": { - "type": "string" - }, - "type": "array" - }, - { - "type": "null" - } - ] - }, - "rate_limit": { - "anyOf": [ - { - "additionalProperties": false, - "properties": { - "age_seconds": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ] - }, - "as_of": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - "home_unverified": { - "type": "boolean" - }, - "is_stale": { - "type": "boolean" - }, - "limiting_window": { - "anyOf": [ - { - "enum": [ - "primary", - "secondary" - ], - "type": "string" - }, - { - "type": "null" - } - ] - }, - "note": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - "plan_type": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - "primary": { - "anyOf": [ - { - "additionalProperties": false, - "properties": { - "remaining_percent": { - "anyOf": [ - { - "type": "number" - }, - { - "type": "null" - } - ] - }, - "reset_passed": { - "type": "boolean" - }, - "resets_at": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ] - }, - "seconds_until_reset": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ] - }, - "used_percent": { - "anyOf": [ - { - "type": "number" - }, - { - "type": "null" - } - ] - }, - "window_minutes": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ] - } - }, - "type": "object" - }, - { - "type": "null" - } - ] - }, - "secondary": { - "anyOf": [ - { - "additionalProperties": false, - "properties": { - "remaining_percent": { - "anyOf": [ - { - "type": "number" - }, - { - "type": "null" - } - ] - }, - "reset_passed": { - "type": "boolean" - }, - "resets_at": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ] - }, - "seconds_until_reset": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ] - }, - "used_percent": { - "anyOf": [ - { - "type": "number" - }, - { - "type": "null" - } - ] - }, - "window_minutes": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ] - } - }, - "type": "object" - }, - { - "type": "null" - } - ] - }, - "source": { - "enum": [ - "current_run", - "plugin_cache" - ], - "type": "string" - }, - "status": { - "enum": [ - "available", - "limited", - "exhausted", - "unknown" - ], - "type": "string" - } - }, - "required": [ - "status" - ], - "type": "object" - }, - { - "type": "null" - } - ] - }, - "redacted_paths": { - "items": { - "type": "string" - }, - "type": "array" - }, - "request_id": { - "type": "string" - }, - "sandbox": { - "enum": [ - "read-only", - "workspace-write", - "danger-full-access" - ], - "type": "string" - }, - "scope": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - "security_warnings": { - "items": { - "type": "string" - }, - "type": "array" - }, - "session_id": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - "tier": { - "enum": [ - "consult", - "propose", - "apply" - ], - "type": "string" - }, - "timeout_seconds": { - "type": "integer" - }, - "truncated": { - "type": "boolean" - }, - "truncation_hint": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - "usage": { - "anyOf": [ - { - "additionalProperties": false, - "properties": { - "cached_input_tokens": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ] - }, - "input_tokens": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ] - }, - "output_tokens": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ] - }, - "total_tokens": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ] - } - }, - "type": "object" - }, - { - "type": "null" - } - ] - }, - "workspace_source": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - "workspace_warning": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - } - }, - "required": [ - "cwd", - "tier", - "sandbox", - "isolation", - "timeout_seconds", - "elapsed_ms" - ], - "type": "object" - }, - "ok": { - "const": true, - "type": "boolean" - }, - "poll_after_ms": { - "type": "integer" - }, - "started_at": { - "type": "string" - }, - "status": { - "enum": [ - "running", - "done", - "failed", - "cancelled", - "timeout" - ], - "type": "string" - }, - "ttl_seconds": { - "type": "integer" - } - }, - "required": [ - "job_id", - "kind", - "started_at", - "deadline_seconds", - "ttl_seconds", - "meta" - ], - "type": "object" - }, - { - "properties": { - "error": { - "description": "Populated error envelope; full schema at resource codex://error-envelope", - "type": "object" - }, - "meta": { - "type": "object" - }, - "ok": { - "const": false - } - }, - "required": [ - "ok", - "error", - "meta" - ], - "type": "object" - } -]New value: +[ + { + "additionalProperties": false, + "properties": { + "deadline_seconds": { + "type": "integer" + }, + "expires_at": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "fingerprint": { + "type": "string" + }, + "job_id": { + "type": "string" + }, + "kind": { + "type": "string" + }, + "meta": { + "description": "Result metadata (cwd, tier, sandbox, model, timeout, usage, rate_limit, and more); full schema at resource codex://result-meta", + "type": "object" + }, + "ok": { + "const": true, + "type": "boolean" + }, + "poll_after_ms": { + "type": "integer" + }, + "started_at": { + "type": "string" + }, + "status": { + "enum": [ + "running", + "done", + "failed", + "cancelled", + "timeout" + ], + "type": "string" + }, + "ttl_seconds": { + "type": "integer" + } + }, + "required": [ + "job_id", + "kind", + "started_at", + "deadline_seconds", + "ttl_seconds", + "meta" + ], + "type": "object" + }, + { + "properties": { + "error": { + "description": "Populated error envelope; full schema at resource codex://error-envelope", + "type": "object" + }, + "meta": { + "type": "object" + }, + "ok": { + "const": false + } + }, + "required": [ + "ok", + "error", + "meta" + ], + "type": "object" + } +]
- Changed
codex_delegate_dry_run2 fields changed- changed
Input schema / properties / isolation / descriptionPrevious value: -"Codex config isolation: 'inherit' (default), 'ignore-config', or 'ignore-rules'."New value: +"Codex config isolation: 'inherit', 'ignore-config', or 'ignore-rules'. Defaults to the server's configured isolation (built-in default 'inherit'; `codex_status` reports the resolved value)." - added
Output schema / $schemaAdded value: +"https://json-schema.org/draft/2020-12/schema"
- Changed
codex_dry_run2 fields changed- changed
Input schema / properties / isolation / descriptionPrevious value: -"Codex config isolation: 'inherit' (default), 'ignore-config', or 'ignore-rules'."New value: +"Codex config isolation: 'inherit', 'ignore-config', or 'ignore-rules'. Defaults to the server's configured isolation (built-in default 'inherit'; `codex_status` reports the resolved value)." - added
Output schema / $schemaAdded value: +"https://json-schema.org/draft/2020-12/schema"
- Changed
codex_job_cancel2 fields changed- changed
Input schema / properties / job_id / descriptionPrevious value: -"The job_id returned by an *_async call (codex_*_async); recover lost ids with codex_job_list."New value: +"The job_id from an *_async call or a sync call's meta.job_id; recover lost ids with codex_job_list." - added
Output schema / $schemaAdded value: +"https://json-schema.org/draft/2020-12/schema"
- Changed
codex_job_consume_result4 fields changed- changed
Input schema / properties / job_id / descriptionPrevious value: -"The job_id returned by an *_async call (codex_*_async); recover lost ids with codex_job_list."New value: +"The job_id from an *_async call or a sync call's meta.job_id; recover lost ids with codex_job_list." - added
Output schema / $schemaAdded value: +"https://json-schema.org/draft/2020-12/schema" - changed
Output schema / anyOfPrevious value: -[ - { - "additionalProperties": false, - "properties": { - "assumptions": { - "items": { - "type": "string" - }, - "type": "array" - }, - "diff": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - "findings": { - "items": { - "additionalProperties": false, - "properties": { - "evidence": { - "type": "string" - }, - "file": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - "line": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ] - }, - "line_end": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ] - }, - "recommendation": { - "type": "string" - }, - "risk": { - "type": "string" - }, - "severity": { - "enum": [ - "critical", - "high", - "medium", - "low", - "nit" - ], - "type": "string" - }, - "title": { - "type": "string" - } - }, - "required": [ - "severity", - "title", - "evidence", - "risk", - "recommendation" - ], - "type": "object" - }, - "type": "array" - }, - "meta": { - "additionalProperties": false, - "properties": { - "base": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - "command_exit_code": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ] - }, - "commit": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - "compat_warnings": { - "items": { - "type": "string" - }, - "type": "array" - }, - "context_summary": { - "anyOf": [ - { - "additionalProperties": false, - "properties": { - "files_changed": { - "type": "integer" - }, - "lines_added": { - "type": "integer" - }, - "lines_removed": { - "type": "integer" - } - }, - "type": "object" - }, - { - "type": "null" - } - ] - }, - "cwd": { - "type": "string" - }, - "elapsed_ms": { - "type": "integer" - }, - "fingerprint": { - "type": "string" - }, - "isolation": { - "enum": [ - "inherit", - "ignore-config", - "ignore-rules" - ], - "type": "string" - }, - "job_id": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - "model": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - "paths": { - "anyOf": [ - { - "items": { - "type": "string" - }, - "type": "array" - }, - { - "type": "null" - } - ] - }, - "rate_limit": { - "anyOf": [ - { - "additionalProperties": false, - "properties": { - "age_seconds": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ] - }, - "as_of": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - "home_unverified": { - "type": "boolean" - }, - "is_stale": { - "type": "boolean" - }, - "limiting_window": { - "anyOf": [ - { - "enum": [ - "primary", - "secondary" - ], - "type": "string" - }, - { - "type": "null" - } - ] - }, - "note": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - "plan_type": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - "primary": { - "anyOf": [ - { - "additionalProperties": false, - "properties": { - "remaining_percent": { - "anyOf": [ - { - "type": "number" - }, - { - "type": "null" - } - ] - }, - "reset_passed": { - "type": "boolean" - }, - "resets_at": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ] - }, - "seconds_until_reset": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ] - }, - "used_percent": { - "anyOf": [ - { - "type": "number" - }, - { - "type": "null" - } - ] - }, - "window_minutes": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ] - } - }, - "type": "object" - }, - { - "type": "null" - } - ] - }, - "secondary": { - "anyOf": [ - { - "additionalProperties": false, - "properties": { - "remaining_percent": { - "anyOf": [ - { - "type": "number" - }, - { - "type": "null" - } - ] - }, - "reset_passed": { - "type": "boolean" - }, - "resets_at": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ] - }, - "seconds_until_reset": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ] - }, - "used_percent": { - "anyOf": [ - { - "type": "number" - }, - { - "type": "null" - } - ] - }, - "window_minutes": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ] - } - }, - "type": "object" - }, - { - "type": "null" - } - ] - }, - "source": { - "enum": [ - "current_run", - "plugin_cache" - ], - "type": "string" - }, - "status": { - "enum": [ - "available", - "limited", - "exhausted", - "unknown" - ], - "type": "string" - } - }, - "required": [ - "status" - ], - "type": "object" - }, - { - "type": "null" - } - ] - }, - "redacted_paths": { - "items": { - "type": "string" - }, - "type": "array" - }, - "request_id": { - "type": "string" - }, - "sandbox": { - "enum": [ - "read-only", - "workspace-write", - "danger-full-access" - ], - "type": "string" - }, - "scope": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - "security_warnings": { - "items": { - "type": "string" - }, - "type": "array" - }, - "session_id": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - "tier": { - "enum": [ - "consult", - "propose", - "apply" - ], - "type": "string" - }, - "timeout_seconds": { - "type": "integer" - }, - "truncated": { - "type": "boolean" - }, - "truncation_hint": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - "usage": { - "anyOf": [ - { - "additionalProperties": false, - "properties": { - "cached_input_tokens": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ] - }, - "input_tokens": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ] - }, - "output_tokens": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ] - }, - "total_tokens": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ] - } - }, - "type": "object" - }, - { - "type": "null" - } - ] - }, - "workspace_source": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - "workspace_warning": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - } - }, - "required": [ - "cwd", - "tier", - "sandbox", - "isolation", - "timeout_seconds", - "elapsed_ms" - ], - "type": "object" - }, - "next_steps": { - "items": { - "type": "string" - }, - "type": "array" - }, - "ok": { - "const": true, - "type": "boolean" - }, - "questions": { - "items": { - "type": "string" - }, - "type": "array" - }, - "raw_response": { - "additionalProperties": false, - "properties": { - "model": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - "session_id": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - "text": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - } - }, - "type": "object" - }, - "summary": { - "type": "string" - }, - "tool": { - "const": "codex_delegate", - "type": "string" - } - }, - "required": [ - "summary", - "meta" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "assumptions": { - "items": { - "type": "string" - }, - "type": "array" - }, - "findings": { - "items": { - "additionalProperties": false, - "properties": { - "evidence": { - "type": "string" - }, - "file": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - "line": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ] - }, - "line_end": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ] - }, - "recommendation": { - "type": "string" - }, - "risk": { - "type": "string" - }, - "severity": { - "enum": [ - "critical", - "high", - "medium", - "low", - "nit" - ], - "type": "string" - }, - "title": { - "type": "string" - } - }, - "required": [ - "severity", - "title", - "evidence", - "risk", - "recommendation" - ], - "type": "object" - }, - "type": "array" - }, - "meta": { - "additionalProperties": false, - "properties": { - "base": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - "command_exit_code": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ] - }, - "commit": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - "compat_warnings": { - "items": { - "type": "string" - }, - "type": "array" - }, - "context_summary": { - "anyOf": [ - { - "additionalProperties": false, - "properties": { - "files_changed": { - "type": "integer" - }, - "lines_added": { - "type": "integer" - }, - "lines_removed": { - "type": "integer" - } - }, - "type": "object" - }, - { - "type": "null" - } - ] - }, - "cwd": { - "type": "string" - }, - "elapsed_ms": { - "type": "integer" - }, - "fingerprint": { - "type": "string" - }, - "isolation": { - "enum": [ - "inherit", - "ignore-config", - "ignore-rules" - ], - "type": "string" - }, - "job_id": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - "model": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - "paths": { - "anyOf": [ - { - "items": { - "type": "string" - }, - "type": "array" - }, - { - "type": "null" - } - ] - }, - "rate_limit": { - "anyOf": [ - { - "additionalProperties": false, - "properties": { - "age_seconds": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ] - }, - "as_of": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - "home_unverified": { - "type": "boolean" - }, - "is_stale": { - "type": "boolean" - }, - "limiting_window": { - "anyOf": [ - { - "enum": [ - "primary", - "secondary" - ], - "type": "string" - }, - { - "type": "null" - } - ] - }, - "note": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - "plan_type": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - "primary": { - "anyOf": [ - { - "additionalProperties": false, - "properties": { - "remaining_percent": { - "anyOf": [ - { - "type": "number" - }, - { - "type": "null" - } - ] - }, - "reset_passed": { - "type": "boolean" - }, - "resets_at": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ] - }, - "seconds_until_reset": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ] - }, - "used_percent": { - "anyOf": [ - { - "type": "number" - }, - { - "type": "null" - } - ] - }, - "window_minutes": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ] - } - }, - "type": "object" - }, - { - "type": "null" - } - ] - }, - "secondary": { - "anyOf": [ - { - "additionalProperties": false, - "properties": { - "remaining_percent": { - "anyOf": [ - { - "type": "number" - }, - { - "type": "null" - } - ] - }, - "reset_passed": { - "type": "boolean" - }, - "resets_at": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ] - }, - "seconds_until_reset": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ] - }, - "used_percent": { - "anyOf": [ - { - "type": "number" - }, - { - "type": "null" - } - ] - }, - "window_minutes": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ] - } - }, - "type": "object" - }, - { - "type": "null" - } - ] - }, - "source": { - "enum": [ - "current_run", - "plugin_cache" - ], - "type": "string" - }, - "status": { - "enum": [ - "available", - "limited", - "exhausted", - "unknown" - ], - "type": "string" - } - }, - "required": [ - "status" - ], - "type": "object" - }, - { - "type": "null" - } - ] - }, - "redacted_paths": { - "items": { - "type": "string" - }, - "type": "array" - }, - "request_id": { - "type": "string" - }, - "sandbox": { - "enum": [ - "read-only", - "workspace-write", - "danger-full-access" - ], - "type": "string" - }, - "scope": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - "security_warnings": { - "items": { - "type": "string" - }, - "type": "array" - }, - "session_id": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - "tier": { - "enum": [ - "consult", - "propose", - "apply" - ], - "type": "string" - }, - "timeout_seconds": { - "type": "integer" - }, - "truncated": { - "type": "boolean" - }, - "truncation_hint": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - "usage": { - "anyOf": [ - { - "additionalProperties": false, - "properties": { - "cached_input_tokens": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ] - }, - "input_tokens": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ] - }, - "output_tokens": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ] - }, - "total_tokens": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ] - } - }, - "type": "object" - }, - { - "type": "null" - } - ] - }, - "workspace_source": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - "workspace_warning": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - } - }, - "required": [ - "cwd", - "tier", - "sandbox", - "isolation", - "timeout_seconds", - "elapsed_ms" - ], - "type": "object" - }, - "next_steps": { - "items": { - "type": "string" - }, - "type": "array" - }, - "ok": { - "const": true, - "type": "boolean" - }, - "questions": { - "items": { - "type": "string" - }, - "type": "array" - }, - "raw_response": { - "additionalProperties": false, - "properties": { - "model": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - "session_id": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - "text": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - } - }, - "type": "object" - }, - "summary": { - "type": "string" - }, - "tool": { - "const": "codex_consult", - "type": "string" - } - }, - "required": [ - "summary", - "meta" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "assumptions": { - "items": { - "type": "string" - }, - "type": "array" - }, - "confidence": { - "enum": [ - "low", - "medium", - "high" - ], - "type": "string" - }, - "findings": { - "items": { - "additionalProperties": false, - "properties": { - "evidence": { - "type": "string" - }, - "file": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - "line": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ] - }, - "line_end": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ] - }, - "recommendation": { - "type": "string" - }, - "risk": { - "type": "string" - }, - "severity": { - "enum": [ - "critical", - "high", - "medium", - "low", - "nit" - ], - "type": "string" - }, - "title": { - "type": "string" - } - }, - "required": [ - "severity", - "title", - "evidence", - "risk", - "recommendation" - ], - "type": "object" - }, - "type": "array" - }, - "meta": { - "additionalProperties": false, - "properties": { - "base": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - "command_exit_code": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ] - }, - "commit": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - "compat_warnings": { - "items": { - "type": "string" - }, - "type": "array" - }, - "context_summary": { - "anyOf": [ - { - "additionalProperties": false, - "properties": { - "files_changed": { - "type": "integer" - }, - "lines_added": { - "type": "integer" - }, - "lines_removed": { - "type": "integer" - } - }, - "type": "object" - }, - { - "type": "null" - } - ] - }, - "cwd": { - "type": "string" - }, - "elapsed_ms": { - "type": "integer" - }, - "fingerprint": { - "type": "string" - }, - "isolation": { - "enum": [ - "inherit", - "ignore-config", - "ignore-rules" - ], - "type": "string" - }, - "job_id": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - "model": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - "paths": { - "anyOf": [ - { - "items": { - "type": "string" - }, - "type": "array" - }, - { - "type": "null" - } - ] - }, - "rate_limit": { - "anyOf": [ - { - "additionalProperties": false, - "properties": { - "age_seconds": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ] - }, - "as_of": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - "home_unverified": { - "type": "boolean" - }, - "is_stale": { - "type": "boolean" - }, - "limiting_window": { - "anyOf": [ - { - "enum": [ - "primary", - "secondary" - ], - "type": "string" - }, - { - "type": "null" - } - ] - }, - "note": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - "plan_type": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - "primary": { - "anyOf": [ - { - "additionalProperties": false, - "properties": { - "remaining_percent": { - "anyOf": [ - { - "type": "number" - }, - { - "type": "null" - } - ] - }, - "reset_passed": { - "type": "boolean" - }, - "resets_at": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ] - }, - "seconds_until_reset": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ] - }, - "used_percent": { - "anyOf": [ - { - "type": "number" - }, - { - "type": "null" - } - ] - }, - "window_minutes": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ] - } - }, - "type": "object" - }, - { - "type": "null" - } - ] - }, - "secondary": { - "anyOf": [ - { - "additionalProperties": false, - "properties": { - "remaining_percent": { - "anyOf": [ - { - "type": "number" - }, - { - "type": "null" - } - ] - }, - "reset_passed": { - "type": "boolean" - }, - "resets_at": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ] - }, - "seconds_until_reset": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ] - }, - "used_percent": { - "anyOf": [ - { - "type": "number" - }, - { - "type": "null" - } - ] - }, - "window_minutes": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ] - } - }, - "type": "object" - }, - { - "type": "null" - } - ] - }, - "source": { - "enum": [ - "current_run", - "plugin_cache" - ], - "type": "string" - }, - "status": { - "enum": [ - "available", - "limited", - "exhausted", - "unknown" - ], - "type": "string" - } - }, - "required": [ - "status" - ], - "type": "object" - }, - { - "type": "null" - } - ] - }, - "redacted_paths": { - "items": { - "type": "string" - }, - "type": "array" - }, - "request_id": { - "type": "string" - }, - "sandbox": { - "enum": [ - "read-only", - "workspace-write", - "danger-full-access" - ], - "type": "string" - }, - "scope": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - "security_warnings": { - "items": { - "type": "string" - }, - "type": "array" - }, - "session_id": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - "tier": { - "enum": [ - "consult", - "propose", - "apply" - ], - "type": "string" - }, - "timeout_seconds": { - "type": "integer" - }, - "truncated": { - "type": "boolean" - }, - "truncation_hint": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - "usage": { - "anyOf": [ - { - "additionalProperties": false, - "properties": { - "cached_input_tokens": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ] - }, - "input_tokens": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ] - }, - "output_tokens": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ] - }, - "total_tokens": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ] - } - }, - "type": "object" - }, - { - "type": "null" - } - ] - }, - "workspace_source": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - "workspace_warning": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - } - }, - "required": [ - "cwd", - "tier", - "sandbox", - "isolation", - "timeout_seconds", - "elapsed_ms" - ], - "type": "object" - }, - "next_steps": { - "items": { - "type": "string" - }, - "type": "array" - }, - "ok": { - "const": true, - "type": "boolean" - }, - "questions": { - "items": { - "type": "string" - }, - "type": "array" - }, - "raw_response": { - "additionalProperties": false, - "properties": { - "model": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - "session_id": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - "text": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - } - }, - "type": "object" - }, - "summary": { - "type": "string" - }, - "tool": { - "const": "codex_review_changes", - "type": "string" - }, - "verdict": { - "enum": [ - "pass", - "concerns", - "fail", - "unknown" - ], - "type": "string" - } - }, - "required": [ - "summary", - "meta" - ], - "type": "object" - }, - { - "properties": { - "error": { - "description": "Populated error envelope; full schema at resource codex://error-envelope", - "type": "object" - }, - "meta": { - "type": "object" - }, - "ok": { - "const": false - } - }, - "required": [ - "ok", - "error", - "meta" - ], - "type": "object" - } -]New value: +[ + { + "properties": { + "ok": { + "const": true + }, + "tool": { + "description": "Originating tool; the payload matches that tool's advertised outputSchema success branch — branch on this field.", + "enum": [ + "codex_consult", + "codex_review_changes", + "codex_delegate" + ] + } + }, + "required": [ + "ok", + "tool" + ], + "type": "object" + }, + { + "properties": { + "error": { + "description": "Populated error envelope; full schema at resource codex://error-envelope", + "type": "object" + }, + "meta": { + "type": "object" + }, + "ok": { + "const": false + } + }, + "required": [ + "ok", + "error", + "meta" + ], + "type": "object" + } +] - added
Output schema / properties / ok / descriptionAdded value: +"true = success result, false = error result"
- Changed
codex_job_list1 field changed- added
Output schema / $schemaAdded value: +"https://json-schema.org/draft/2020-12/schema"
- Changed
codex_job_result4 fields changed- changed
Input schema / properties / job_id / descriptionPrevious value: -"The job_id returned by an *_async call (codex_*_async); recover lost ids with codex_job_list."New value: +"The job_id from an *_async call or a sync call's meta.job_id; recover lost ids with codex_job_list." - added
Output schema / $schemaAdded value: +"https://json-schema.org/draft/2020-12/schema" - changed
Output schema / anyOfPrevious value: -[ - { - "additionalProperties": false, - "properties": { - "assumptions": { - "items": { - "type": "string" - }, - "type": "array" - }, - "diff": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - "findings": { - "items": { - "additionalProperties": false, - "properties": { - "evidence": { - "type": "string" - }, - "file": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - "line": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ] - }, - "line_end": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ] - }, - "recommendation": { - "type": "string" - }, - "risk": { - "type": "string" - }, - "severity": { - "enum": [ - "critical", - "high", - "medium", - "low", - "nit" - ], - "type": "string" - }, - "title": { - "type": "string" - } - }, - "required": [ - "severity", - "title", - "evidence", - "risk", - "recommendation" - ], - "type": "object" - }, - "type": "array" - }, - "meta": { - "additionalProperties": false, - "properties": { - "base": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - "command_exit_code": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ] - }, - "commit": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - "compat_warnings": { - "items": { - "type": "string" - }, - "type": "array" - }, - "context_summary": { - "anyOf": [ - { - "additionalProperties": false, - "properties": { - "files_changed": { - "type": "integer" - }, - "lines_added": { - "type": "integer" - }, - "lines_removed": { - "type": "integer" - } - }, - "type": "object" - }, - { - "type": "null" - } - ] - }, - "cwd": { - "type": "string" - }, - "elapsed_ms": { - "type": "integer" - }, - "fingerprint": { - "type": "string" - }, - "isolation": { - "enum": [ - "inherit", - "ignore-config", - "ignore-rules" - ], - "type": "string" - }, - "job_id": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - "model": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - "paths": { - "anyOf": [ - { - "items": { - "type": "string" - }, - "type": "array" - }, - { - "type": "null" - } - ] - }, - "rate_limit": { - "anyOf": [ - { - "additionalProperties": false, - "properties": { - "age_seconds": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ] - }, - "as_of": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - "home_unverified": { - "type": "boolean" - }, - "is_stale": { - "type": "boolean" - }, - "limiting_window": { - "anyOf": [ - { - "enum": [ - "primary", - "secondary" - ], - "type": "string" - }, - { - "type": "null" - } - ] - }, - "note": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - "plan_type": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - "primary": { - "anyOf": [ - { - "additionalProperties": false, - "properties": { - "remaining_percent": { - "anyOf": [ - { - "type": "number" - }, - { - "type": "null" - } - ] - }, - "reset_passed": { - "type": "boolean" - }, - "resets_at": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ] - }, - "seconds_until_reset": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ] - }, - "used_percent": { - "anyOf": [ - { - "type": "number" - }, - { - "type": "null" - } - ] - }, - "window_minutes": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ] - } - }, - "type": "object" - }, - { - "type": "null" - } - ] - }, - "secondary": { - "anyOf": [ - { - "additionalProperties": false, - "properties": { - "remaining_percent": { - "anyOf": [ - { - "type": "number" - }, - { - "type": "null" - } - ] - }, - "reset_passed": { - "type": "boolean" - }, - "resets_at": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ] - }, - "seconds_until_reset": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ] - }, - "used_percent": { - "anyOf": [ - { - "type": "number" - }, - { - "type": "null" - } - ] - }, - "window_minutes": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ] - } - }, - "type": "object" - }, - { - "type": "null" - } - ] - }, - "source": { - "enum": [ - "current_run", - "plugin_cache" - ], - "type": "string" - }, - "status": { - "enum": [ - "available", - "limited", - "exhausted", - "unknown" - ], - "type": "string" - } - }, - "required": [ - "status" - ], - "type": "object" - }, - { - "type": "null" - } - ] - }, - "redacted_paths": { - "items": { - "type": "string" - }, - "type": "array" - }, - "request_id": { - "type": "string" - }, - "sandbox": { - "enum": [ - "read-only", - "workspace-write", - "danger-full-access" - ], - "type": "string" - }, - "scope": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - "security_warnings": { - "items": { - "type": "string" - }, - "type": "array" - }, - "session_id": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - "tier": { - "enum": [ - "consult", - "propose", - "apply" - ], - "type": "string" - }, - "timeout_seconds": { - "type": "integer" - }, - "truncated": { - "type": "boolean" - }, - "truncation_hint": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - "usage": { - "anyOf": [ - { - "additionalProperties": false, - "properties": { - "cached_input_tokens": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ] - }, - "input_tokens": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ] - }, - "output_tokens": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ] - }, - "total_tokens": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ] - } - }, - "type": "object" - }, - { - "type": "null" - } - ] - }, - "workspace_source": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - "workspace_warning": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - } - }, - "required": [ - "cwd", - "tier", - "sandbox", - "isolation", - "timeout_seconds", - "elapsed_ms" - ], - "type": "object" - }, - "next_steps": { - "items": { - "type": "string" - }, - "type": "array" - }, - "ok": { - "const": true, - "type": "boolean" - }, - "questions": { - "items": { - "type": "string" - }, - "type": "array" - }, - "raw_response": { - "additionalProperties": false, - "properties": { - "model": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - "session_id": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - "text": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - } - }, - "type": "object" - }, - "summary": { - "type": "string" - }, - "tool": { - "const": "codex_delegate", - "type": "string" - } - }, - "required": [ - "summary", - "meta" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "assumptions": { - "items": { - "type": "string" - }, - "type": "array" - }, - "findings": { - "items": { - "additionalProperties": false, - "properties": { - "evidence": { - "type": "string" - }, - "file": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - "line": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ] - }, - "line_end": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ] - }, - "recommendation": { - "type": "string" - }, - "risk": { - "type": "string" - }, - "severity": { - "enum": [ - "critical", - "high", - "medium", - "low", - "nit" - ], - "type": "string" - }, - "title": { - "type": "string" - } - }, - "required": [ - "severity", - "title", - "evidence", - "risk", - "recommendation" - ], - "type": "object" - }, - "type": "array" - }, - "meta": { - "additionalProperties": false, - "properties": { - "base": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - "command_exit_code": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ] - }, - "commit": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - "compat_warnings": { - "items": { - "type": "string" - }, - "type": "array" - }, - "context_summary": { - "anyOf": [ - { - "additionalProperties": false, - "properties": { - "files_changed": { - "type": "integer" - }, - "lines_added": { - "type": "integer" - }, - "lines_removed": { - "type": "integer" - } - }, - "type": "object" - }, - { - "type": "null" - } - ] - }, - "cwd": { - "type": "string" - }, - "elapsed_ms": { - "type": "integer" - }, - "fingerprint": { - "type": "string" - }, - "isolation": { - "enum": [ - "inherit", - "ignore-config", - "ignore-rules" - ], - "type": "string" - }, - "job_id": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - "model": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - "paths": { - "anyOf": [ - { - "items": { - "type": "string" - }, - "type": "array" - }, - { - "type": "null" - } - ] - }, - "rate_limit": { - "anyOf": [ - { - "additionalProperties": false, - "properties": { - "age_seconds": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ] - }, - "as_of": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - "home_unverified": { - "type": "boolean" - }, - "is_stale": { - "type": "boolean" - }, - "limiting_window": { - "anyOf": [ - { - "enum": [ - "primary", - "secondary" - ], - "type": "string" - }, - { - "type": "null" - } - ] - }, - "note": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - "plan_type": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - "primary": { - "anyOf": [ - { - "additionalProperties": false, - "properties": { - "remaining_percent": { - "anyOf": [ - { - "type": "number" - }, - { - "type": "null" - } - ] - }, - "reset_passed": { - "type": "boolean" - }, - "resets_at": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ] - }, - "seconds_until_reset": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ] - }, - "used_percent": { - "anyOf": [ - { - "type": "number" - }, - { - "type": "null" - } - ] - }, - "window_minutes": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ] - } - }, - "type": "object" - }, - { - "type": "null" - } - ] - }, - "secondary": { - "anyOf": [ - { - "additionalProperties": false, - "properties": { - "remaining_percent": { - "anyOf": [ - { - "type": "number" - }, - { - "type": "null" - } - ] - }, - "reset_passed": { - "type": "boolean" - }, - "resets_at": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ] - }, - "seconds_until_reset": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ] - }, - "used_percent": { - "anyOf": [ - { - "type": "number" - }, - { - "type": "null" - } - ] - }, - "window_minutes": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ] - } - }, - "type": "object" - }, - { - "type": "null" - } - ] - }, - "source": { - "enum": [ - "current_run", - "plugin_cache" - ], - "type": "string" - }, - "status": { - "enum": [ - "available", - "limited", - "exhausted", - "unknown" - ], - "type": "string" - } - }, - "required": [ - "status" - ], - "type": "object" - }, - { - "type": "null" - } - ] - }, - "redacted_paths": { - "items": { - "type": "string" - }, - "type": "array" - }, - "request_id": { - "type": "string" - }, - "sandbox": { - "enum": [ - "read-only", - "workspace-write", - "danger-full-access" - ], - "type": "string" - }, - "scope": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - "security_warnings": { - "items": { - "type": "string" - }, - "type": "array" - }, - "session_id": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - "tier": { - "enum": [ - "consult", - "propose", - "apply" - ], - "type": "string" - }, - "timeout_seconds": { - "type": "integer" - }, - "truncated": { - "type": "boolean" - }, - "truncation_hint": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - "usage": { - "anyOf": [ - { - "additionalProperties": false, - "properties": { - "cached_input_tokens": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ] - }, - "input_tokens": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ] - }, - "output_tokens": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ] - }, - "total_tokens": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ] - } - }, - "type": "object" - }, - { - "type": "null" - } - ] - }, - "workspace_source": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - "workspace_warning": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - } - }, - "required": [ - "cwd", - "tier", - "sandbox", - "isolation", - "timeout_seconds", - "elapsed_ms" - ], - "type": "object" - }, - "next_steps": { - "items": { - "type": "string" - }, - "type": "array" - }, - "ok": { - "const": true, - "type": "boolean" - }, - "questions": { - "items": { - "type": "string" - }, - "type": "array" - }, - "raw_response": { - "additionalProperties": false, - "properties": { - "model": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - "session_id": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - "text": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - } - }, - "type": "object" - }, - "summary": { - "type": "string" - }, - "tool": { - "const": "codex_consult", - "type": "string" - } - }, - "required": [ - "summary", - "meta" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "assumptions": { - "items": { - "type": "string" - }, - "type": "array" - }, - "confidence": { - "enum": [ - "low", - "medium", - "high" - ], - "type": "string" - }, - "findings": { - "items": { - "additionalProperties": false, - "properties": { - "evidence": { - "type": "string" - }, - "file": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - "line": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ] - }, - "line_end": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ] - }, - "recommendation": { - "type": "string" - }, - "risk": { - "type": "string" - }, - "severity": { - "enum": [ - "critical", - "high", - "medium", - "low", - "nit" - ], - "type": "string" - }, - "title": { - "type": "string" - } - }, - "required": [ - "severity", - "title", - "evidence", - "risk", - "recommendation" - ], - "type": "object" - }, - "type": "array" - }, - "meta": { - "additionalProperties": false, - "properties": { - "base": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - "command_exit_code": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ] - }, - "commit": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - "compat_warnings": { - "items": { - "type": "string" - }, - "type": "array" - }, - "context_summary": { - "anyOf": [ - { - "additionalProperties": false, - "properties": { - "files_changed": { - "type": "integer" - }, - "lines_added": { - "type": "integer" - }, - "lines_removed": { - "type": "integer" - } - }, - "type": "object" - }, - { - "type": "null" - } - ] - }, - "cwd": { - "type": "string" - }, - "elapsed_ms": { - "type": "integer" - }, - "fingerprint": { - "type": "string" - }, - "isolation": { - "enum": [ - "inherit", - "ignore-config", - "ignore-rules" - ], - "type": "string" - }, - "job_id": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - "model": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - "paths": { - "anyOf": [ - { - "items": { - "type": "string" - }, - "type": "array" - }, - { - "type": "null" - } - ] - }, - "rate_limit": { - "anyOf": [ - { - "additionalProperties": false, - "properties": { - "age_seconds": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ] - }, - "as_of": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - "home_unverified": { - "type": "boolean" - }, - "is_stale": { - "type": "boolean" - }, - "limiting_window": { - "anyOf": [ - { - "enum": [ - "primary", - "secondary" - ], - "type": "string" - }, - { - "type": "null" - } - ] - }, - "note": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - "plan_type": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - "primary": { - "anyOf": [ - { - "additionalProperties": false, - "properties": { - "remaining_percent": { - "anyOf": [ - { - "type": "number" - }, - { - "type": "null" - } - ] - }, - "reset_passed": { - "type": "boolean" - }, - "resets_at": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ] - }, - "seconds_until_reset": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ] - }, - "used_percent": { - "anyOf": [ - { - "type": "number" - }, - { - "type": "null" - } - ] - }, - "window_minutes": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ] - } - }, - "type": "object" - }, - { - "type": "null" - } - ] - }, - "secondary": { - "anyOf": [ - { - "additionalProperties": false, - "properties": { - "remaining_percent": { - "anyOf": [ - { - "type": "number" - }, - { - "type": "null" - } - ] - }, - "reset_passed": { - "type": "boolean" - }, - "resets_at": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ] - }, - "seconds_until_reset": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ] - }, - "used_percent": { - "anyOf": [ - { - "type": "number" - }, - { - "type": "null" - } - ] - }, - "window_minutes": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ] - } - }, - "type": "object" - }, - { - "type": "null" - } - ] - }, - "source": { - "enum": [ - "current_run", - "plugin_cache" - ], - "type": "string" - }, - "status": { - "enum": [ - "available", - "limited", - "exhausted", - "unknown" - ], - "type": "string" - } - }, - "required": [ - "status" - ], - "type": "object" - }, - { - "type": "null" - } - ] - }, - "redacted_paths": { - "items": { - "type": "string" - }, - "type": "array" - }, - "request_id": { - "type": "string" - }, - "sandbox": { - "enum": [ - "read-only", - "workspace-write", - "danger-full-access" - ], - "type": "string" - }, - "scope": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - "security_warnings": { - "items": { - "type": "string" - }, - "type": "array" - }, - "session_id": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - "tier": { - "enum": [ - "consult", - "propose", - "apply" - ], - "type": "string" - }, - "timeout_seconds": { - "type": "integer" - }, - "truncated": { - "type": "boolean" - }, - "truncation_hint": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - "usage": { - "anyOf": [ - { - "additionalProperties": false, - "properties": { - "cached_input_tokens": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ] - }, - "input_tokens": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ] - }, - "output_tokens": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ] - }, - "total_tokens": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ] - } - }, - "type": "object" - }, - { - "type": "null" - } - ] - }, - "workspace_source": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - "workspace_warning": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - } - }, - "required": [ - "cwd", - "tier", - "sandbox", - "isolation", - "timeout_seconds", - "elapsed_ms" - ], - "type": "object" - }, - "next_steps": { - "items": { - "type": "string" - }, - "type": "array" - }, - "ok": { - "const": true, - "type": "boolean" - }, - "questions": { - "items": { - "type": "string" - }, - "type": "array" - }, - "raw_response": { - "additionalProperties": false, - "properties": { - "model": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - "session_id": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - "text": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - } - }, - "type": "object" - }, - "summary": { - "type": "string" - }, - "tool": { - "const": "codex_review_changes", - "type": "string" - }, - "verdict": { - "enum": [ - "pass", - "concerns", - "fail", - "unknown" - ], - "type": "string" - } - }, - "required": [ - "summary", - "meta" - ], - "type": "object" - }, - { - "properties": { - "error": { - "description": "Populated error envelope; full schema at resource codex://error-envelope", - "type": "object" - }, - "meta": { - "type": "object" - }, - "ok": { - "const": false - } - }, - "required": [ - "ok", - "error", - "meta" - ], - "type": "object" - } -]New value: +[ + { + "properties": { + "ok": { + "const": true + }, + "tool": { + "description": "Originating tool; the payload matches that tool's advertised outputSchema success branch — branch on this field.", + "enum": [ + "codex_consult", + "codex_review_changes", + "codex_delegate" + ] + } + }, + "required": [ + "ok", + "tool" + ], + "type": "object" + }, + { + "properties": { + "error": { + "description": "Populated error envelope; full schema at resource codex://error-envelope", + "type": "object" + }, + "meta": { + "type": "object" + }, + "ok": { + "const": false + } + }, + "required": [ + "ok", + "error", + "meta" + ], + "type": "object" + } +] - added
Output schema / properties / ok / descriptionAdded value: +"true = success result, false = error result"
- Changed
codex_job_status2 fields changed- changed
Input schema / properties / job_id / descriptionPrevious value: -"The job_id returned by an *_async call (codex_*_async); recover lost ids with codex_job_list."New value: +"The job_id from an *_async call or a sync call's meta.job_id; recover lost ids with codex_job_list." - added
Output schema / $schemaAdded value: +"https://json-schema.org/draft/2020-12/schema"
- Changed
codex_models1 field changed- added
Output schema / $schemaAdded value: +"https://json-schema.org/draft/2020-12/schema"
- Changed
codex_review_changes4 fields changed- added
Input schema / properties / idempotency_keyAdded value: +{ + "anyOf": [ + { + "maxLength": 200, + "minLength": 1, + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Optional client-supplied dedup key, scoped to THIS concrete tool on the same workspace. Reusing it on the same tool with the same arguments replays the existing run instead of starting — and paying for — a duplicate Codex call (a sync call reattaches to the in-flight run and returns its result; an _async call returns the same job_id). The sync and _async variants are DIFFERENT tools and never share a key's run. Reuse with different arguments — including a different timeout_seconds — is refused (idempotency_conflict); a key whose prior result was already consumed/evicted is idempotency_result_unavailable; a still-publishing reservation is idempotency_in_progress (retry). Omit it for the prior no-dedup behavior. A completed result stays replayable while its job record lives (its TTL), subject to consumption or count-eviction; the fail-closed conflict/in-progress window can last longer — up to the job's max runtime + termination grace + TTL. meta.idempotency_replayed=true marks a replayed (unpaid) response." +} - changed
Input schema / properties / isolation / descriptionPrevious value: -"Codex config isolation: 'inherit' (default), 'ignore-config', or 'ignore-rules'."New value: +"Codex config isolation: 'inherit', 'ignore-config', or 'ignore-rules'. Defaults to the server's configured isolation (built-in default 'inherit'; `codex_status` reports the resolved value)." - added
Output schema / $schemaAdded value: +"https://json-schema.org/draft/2020-12/schema" - changed
Output schema / anyOfPrevious value: -[ - { - "additionalProperties": false, - "properties": { - "assumptions": { - "items": { - "type": "string" - }, - "type": "array" - }, - "confidence": { - "enum": [ - "low", - "medium", - "high" - ], - "type": "string" - }, - "findings": { - "items": { - "additionalProperties": false, - "properties": { - "evidence": { - "type": "string" - }, - "file": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - "line": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ] - }, - "line_end": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ] - }, - "recommendation": { - "type": "string" - }, - "risk": { - "type": "string" - }, - "severity": { - "enum": [ - "critical", - "high", - "medium", - "low", - "nit" - ], - "type": "string" - }, - "title": { - "type": "string" - } - }, - "required": [ - "severity", - "title", - "evidence", - "risk", - "recommendation" - ], - "type": "object" - }, - "type": "array" - }, - "meta": { - "additionalProperties": false, - "properties": { - "base": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - "command_exit_code": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ] - }, - "commit": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - "compat_warnings": { - "items": { - "type": "string" - }, - "type": "array" - }, - "context_summary": { - "anyOf": [ - { - "additionalProperties": false, - "properties": { - "files_changed": { - "type": "integer" - }, - "lines_added": { - "type": "integer" - }, - "lines_removed": { - "type": "integer" - } - }, - "type": "object" - }, - { - "type": "null" - } - ] - }, - "cwd": { - "type": "string" - }, - "elapsed_ms": { - "type": "integer" - }, - "fingerprint": { - "type": "string" - }, - "isolation": { - "enum": [ - "inherit", - "ignore-config", - "ignore-rules" - ], - "type": "string" - }, - "job_id": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - "model": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - "paths": { - "anyOf": [ - { - "items": { - "type": "string" - }, - "type": "array" - }, - { - "type": "null" - } - ] - }, - "rate_limit": { - "anyOf": [ - { - "additionalProperties": false, - "properties": { - "age_seconds": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ] - }, - "as_of": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - "home_unverified": { - "type": "boolean" - }, - "is_stale": { - "type": "boolean" - }, - "limiting_window": { - "anyOf": [ - { - "enum": [ - "primary", - "secondary" - ], - "type": "string" - }, - { - "type": "null" - } - ] - }, - "note": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - "plan_type": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - "primary": { - "anyOf": [ - { - "additionalProperties": false, - "properties": { - "remaining_percent": { - "anyOf": [ - { - "type": "number" - }, - { - "type": "null" - } - ] - }, - "reset_passed": { - "type": "boolean" - }, - "resets_at": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ] - }, - "seconds_until_reset": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ] - }, - "used_percent": { - "anyOf": [ - { - "type": "number" - }, - { - "type": "null" - } - ] - }, - "window_minutes": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ] - } - }, - "type": "object" - }, - { - "type": "null" - } - ] - }, - "secondary": { - "anyOf": [ - { - "additionalProperties": false, - "properties": { - "remaining_percent": { - "anyOf": [ - { - "type": "number" - }, - { - "type": "null" - } - ] - }, - "reset_passed": { - "type": "boolean" - }, - "resets_at": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ] - }, - "seconds_until_reset": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ] - }, - "used_percent": { - "anyOf": [ - { - "type": "number" - }, - { - "type": "null" - } - ] - }, - "window_minutes": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ] - } - }, - "type": "object" - }, - { - "type": "null" - } - ] - }, - "source": { - "enum": [ - "current_run", - "plugin_cache" - ], - "type": "string" - }, - "status": { - "enum": [ - "available", - "limited", - "exhausted", - "unknown" - ], - "type": "string" - } - }, - "required": [ - "status" - ], - "type": "object" - }, - { - "type": "null" - } - ] - }, - "redacted_paths": { - "items": { - "type": "string" - }, - "type": "array" - }, - "request_id": { - "type": "string" - }, - "sandbox": { - "enum": [ - "read-only", - "workspace-write", - "danger-full-access" - ], - "type": "string" - }, - "scope": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - "security_warnings": { - "items": { - "type": "string" - }, - "type": "array" - }, - "session_id": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - "tier": { - "enum": [ - "consult", - "propose", - "apply" - ], - "type": "string" - }, - "timeout_seconds": { - "type": "integer" - }, - "truncated": { - "type": "boolean" - }, - "truncation_hint": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - "usage": { - "anyOf": [ - { - "additionalProperties": false, - "properties": { - "cached_input_tokens": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ] - }, - "input_tokens": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ] - }, - "output_tokens": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ] - }, - "total_tokens": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ] - } - }, - "type": "object" - }, - { - "type": "null" - } - ] - }, - "workspace_source": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - "workspace_warning": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - } - }, - "required": [ - "cwd", - "tier", - "sandbox", - "isolation", - "timeout_seconds", - "elapsed_ms" - ], - "type": "object" - }, - "next_steps": { - "items": { - "type": "string" - }, - "type": "array" - }, - "ok": { - "const": true, - "type": "boolean" - }, - "questions": { - "items": { - "type": "string" - }, - "type": "array" - }, - "raw_response": { - "additionalProperties": false, - "properties": { - "model": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - "session_id": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - "text": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - } - }, - "type": "object" - }, - "summary": { - "type": "string" - }, - "tool": { - "const": "codex_review_changes", - "type": "string" - }, - "verdict": { - "enum": [ - "pass", - "concerns", - "fail", - "unknown" - ], - "type": "string" - } - }, - "required": [ - "summary", - "meta" - ], - "type": "object" - }, - { - "properties": { - "error": { - "description": "Populated error envelope; full schema at resource codex://error-envelope", - "type": "object" - }, - "meta": { - "type": "object" - }, - "ok": { - "const": false - } - }, - "required": [ - "ok", - "error", - "meta" - ], - "type": "object" - } -]New value: +[ + { + "additionalProperties": false, + "properties": { + "assumptions": { + "items": { + "type": "string" + }, + "type": "array" + }, + "confidence": { + "enum": [ + "low", + "medium", + "high" + ], + "type": "string" + }, + "findings": { + "items": { + "additionalProperties": false, + "properties": { + "evidence": { + "type": "string" + }, + "file": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "line": { + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ] + }, + "line_end": { + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ] + }, + "recommendation": { + "type": "string" + }, + "risk": { + "type": "string" + }, + "severity": { + "enum": [ + "critical", + "high", + "medium", + "low", + "nit" + ], + "type": "string" + }, + "title": { + "type": "string" + } + }, + "required": [ + "severity", + "title", + "evidence", + "risk", + "recommendation" + ], + "type": "object" + }, + "type": "array" + }, + "meta": { + "description": "Result metadata (cwd, tier, sandbox, model, timeout, usage, rate_limit, and more); full schema at resource codex://result-meta", + "type": "object" + }, + "next_steps": { + "items": { + "type": "string" + }, + "type": "array" + }, + "ok": { + "const": true, + "type": "boolean" + }, + "questions": { + "items": { + "type": "string" + }, + "type": "array" + }, + "raw_response": { + "additionalProperties": false, + "properties": { + "model": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "session_id": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "text": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + } + }, + "type": "object" + }, + "summary": { + "type": "string" + }, + "tool": { + "const": "codex_review_changes", + "type": "string" + }, + "verdict": { + "enum": [ + "pass", + "concerns", + "fail", + "unknown" + ], + "type": "string" + } + }, + "required": [ + "summary", + "meta" + ], + "type": "object" + }, + { + "properties": { + "error": { + "description": "Populated error envelope; full schema at resource codex://error-envelope", + "type": "object" + }, + "meta": { + "type": "object" + }, + "ok": { + "const": false + } + }, + "required": [ + "ok", + "error", + "meta" + ], + "type": "object" + } +]
- Changed
codex_review_changes_async4 fields changed- added
Input schema / properties / idempotency_keyAdded value: +{ + "anyOf": [ + { + "maxLength": 200, + "minLength": 1, + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Optional client-supplied dedup key, scoped to THIS concrete tool on the same workspace. Reusing it on the same tool with the same arguments replays the existing run instead of starting — and paying for — a duplicate Codex call (a sync call reattaches to the in-flight run and returns its result; an _async call returns the same job_id). The sync and _async variants are DIFFERENT tools and never share a key's run. Reuse with different arguments — including a different timeout_seconds — is refused (idempotency_conflict); a key whose prior result was already consumed/evicted is idempotency_result_unavailable; a still-publishing reservation is idempotency_in_progress (retry). Omit it for the prior no-dedup behavior. A completed result stays replayable while its job record lives (its TTL), subject to consumption or count-eviction; the fail-closed conflict/in-progress window can last longer — up to the job's max runtime + termination grace + TTL. meta.idempotency_replayed=true marks a replayed (unpaid) response." +} - changed
Input schema / properties / isolation / descriptionPrevious value: -"Codex config isolation: 'inherit' (default), 'ignore-config', or 'ignore-rules'."New value: +"Codex config isolation: 'inherit', 'ignore-config', or 'ignore-rules'. Defaults to the server's configured isolation (built-in default 'inherit'; `codex_status` reports the resolved value)." - added
Output schema / $schemaAdded value: +"https://json-schema.org/draft/2020-12/schema" - changed
Output schema / anyOfPrevious value: -[ - { - "additionalProperties": false, - "properties": { - "deadline_seconds": { - "type": "integer" - }, - "expires_at": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - "fingerprint": { - "type": "string" - }, - "job_id": { - "type": "string" - }, - "kind": { - "type": "string" - }, - "meta": { - "additionalProperties": false, - "properties": { - "base": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - "command_exit_code": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ] - }, - "commit": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - "compat_warnings": { - "items": { - "type": "string" - }, - "type": "array" - }, - "context_summary": { - "anyOf": [ - { - "additionalProperties": false, - "properties": { - "files_changed": { - "type": "integer" - }, - "lines_added": { - "type": "integer" - }, - "lines_removed": { - "type": "integer" - } - }, - "type": "object" - }, - { - "type": "null" - } - ] - }, - "cwd": { - "type": "string" - }, - "elapsed_ms": { - "type": "integer" - }, - "fingerprint": { - "type": "string" - }, - "isolation": { - "enum": [ - "inherit", - "ignore-config", - "ignore-rules" - ], - "type": "string" - }, - "job_id": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - "model": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - "paths": { - "anyOf": [ - { - "items": { - "type": "string" - }, - "type": "array" - }, - { - "type": "null" - } - ] - }, - "rate_limit": { - "anyOf": [ - { - "additionalProperties": false, - "properties": { - "age_seconds": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ] - }, - "as_of": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - "home_unverified": { - "type": "boolean" - }, - "is_stale": { - "type": "boolean" - }, - "limiting_window": { - "anyOf": [ - { - "enum": [ - "primary", - "secondary" - ], - "type": "string" - }, - { - "type": "null" - } - ] - }, - "note": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - "plan_type": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - "primary": { - "anyOf": [ - { - "additionalProperties": false, - "properties": { - "remaining_percent": { - "anyOf": [ - { - "type": "number" - }, - { - "type": "null" - } - ] - }, - "reset_passed": { - "type": "boolean" - }, - "resets_at": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ] - }, - "seconds_until_reset": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ] - }, - "used_percent": { - "anyOf": [ - { - "type": "number" - }, - { - "type": "null" - } - ] - }, - "window_minutes": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ] - } - }, - "type": "object" - }, - { - "type": "null" - } - ] - }, - "secondary": { - "anyOf": [ - { - "additionalProperties": false, - "properties": { - "remaining_percent": { - "anyOf": [ - { - "type": "number" - }, - { - "type": "null" - } - ] - }, - "reset_passed": { - "type": "boolean" - }, - "resets_at": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ] - }, - "seconds_until_reset": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ] - }, - "used_percent": { - "anyOf": [ - { - "type": "number" - }, - { - "type": "null" - } - ] - }, - "window_minutes": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ] - } - }, - "type": "object" - }, - { - "type": "null" - } - ] - }, - "source": { - "enum": [ - "current_run", - "plugin_cache" - ], - "type": "string" - }, - "status": { - "enum": [ - "available", - "limited", - "exhausted", - "unknown" - ], - "type": "string" - } - }, - "required": [ - "status" - ], - "type": "object" - }, - { - "type": "null" - } - ] - }, - "redacted_paths": { - "items": { - "type": "string" - }, - "type": "array" - }, - "request_id": { - "type": "string" - }, - "sandbox": { - "enum": [ - "read-only", - "workspace-write", - "danger-full-access" - ], - "type": "string" - }, - "scope": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - "security_warnings": { - "items": { - "type": "string" - }, - "type": "array" - }, - "session_id": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - "tier": { - "enum": [ - "consult", - "propose", - "apply" - ], - "type": "string" - }, - "timeout_seconds": { - "type": "integer" - }, - "truncated": { - "type": "boolean" - }, - "truncation_hint": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - "usage": { - "anyOf": [ - { - "additionalProperties": false, - "properties": { - "cached_input_tokens": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ] - }, - "input_tokens": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ] - }, - "output_tokens": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ] - }, - "total_tokens": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ] - } - }, - "type": "object" - }, - { - "type": "null" - } - ] - }, - "workspace_source": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - "workspace_warning": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - } - }, - "required": [ - "cwd", - "tier", - "sandbox", - "isolation", - "timeout_seconds", - "elapsed_ms" - ], - "type": "object" - }, - "ok": { - "const": true, - "type": "boolean" - }, - "poll_after_ms": { - "type": "integer" - }, - "started_at": { - "type": "string" - }, - "status": { - "enum": [ - "running", - "done", - "failed", - "cancelled", - "timeout" - ], - "type": "string" - }, - "ttl_seconds": { - "type": "integer" - } - }, - "required": [ - "job_id", - "kind", - "started_at", - "deadline_seconds", - "ttl_seconds", - "meta" - ], - "type": "object" - }, - { - "properties": { - "error": { - "description": "Populated error envelope; full schema at resource codex://error-envelope", - "type": "object" - }, - "meta": { - "type": "object" - }, - "ok": { - "const": false - } - }, - "required": [ - "ok", - "error", - "meta" - ], - "type": "object" - } -]New value: +[ + { + "additionalProperties": false, + "properties": { + "deadline_seconds": { + "type": "integer" + }, + "expires_at": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "fingerprint": { + "type": "string" + }, + "job_id": { + "type": "string" + }, + "kind": { + "type": "string" + }, + "meta": { + "description": "Result metadata (cwd, tier, sandbox, model, timeout, usage, rate_limit, and more); full schema at resource codex://result-meta", + "type": "object" + }, + "ok": { + "const": true, + "type": "boolean" + }, + "poll_after_ms": { + "type": "integer" + }, + "started_at": { + "type": "string" + }, + "status": { + "enum": [ + "running", + "done", + "failed", + "cancelled", + "timeout" + ], + "type": "string" + }, + "ttl_seconds": { + "type": "integer" + } + }, + "required": [ + "job_id", + "kind", + "started_at", + "deadline_seconds", + "ttl_seconds", + "meta" + ], + "type": "object" + }, + { + "properties": { + "error": { + "description": "Populated error envelope; full schema at resource codex://error-envelope", + "type": "object" + }, + "meta": { + "type": "object" + }, + "ok": { + "const": false + } + }, + "required": [ + "ok", + "error", + "meta" + ], + "type": "object" + } +]
- Changed
codex_status2 fields changed- added
Output schema / $schemaAdded value: +"https://json-schema.org/draft/2020-12/schema" - changed
Output schema / anyOfPrevious value: -[ - { - "additionalProperties": false, - "properties": { - "auth_detail": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - "caveat": { - "type": "string" - }, - "codex_authenticated": { - "anyOf": [ - { - "type": "boolean" - }, - { - "type": "null" - } - ] - }, - "codex_found": { - "type": "boolean" - }, - "codex_version": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - "fingerprint": { - "type": "string" - }, - "flags_warning": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - "ok": { - "const": true, - "type": "boolean" - }, - "rate_limit": { - "additionalProperties": false, - "properties": { - "age_seconds": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ] - }, - "as_of": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - "home_unverified": { - "type": "boolean" - }, - "is_stale": { - "type": "boolean" - }, - "limiting_window": { - "anyOf": [ - { - "enum": [ - "primary", - "secondary" - ], - "type": "string" - }, - { - "type": "null" - } - ] - }, - "note": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - "plan_type": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - "primary": { - "anyOf": [ - { - "additionalProperties": false, - "properties": { - "remaining_percent": { - "anyOf": [ - { - "type": "number" - }, - { - "type": "null" - } - ] - }, - "reset_passed": { - "type": "boolean" - }, - "resets_at": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ] - }, - "seconds_until_reset": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ] - }, - "used_percent": { - "anyOf": [ - { - "type": "number" - }, - { - "type": "null" - } - ] - }, - "window_minutes": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ] - } - }, - "type": "object" - }, - { - "type": "null" - } - ] - }, - "secondary": { - "anyOf": [ - { - "additionalProperties": false, - "properties": { - "remaining_percent": { - "anyOf": [ - { - "type": "number" - }, - { - "type": "null" - } - ] - }, - "reset_passed": { - "type": "boolean" - }, - "resets_at": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ] - }, - "seconds_until_reset": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ] - }, - "used_percent": { - "anyOf": [ - { - "type": "number" - }, - { - "type": "null" - } - ] - }, - "window_minutes": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ] - } - }, - "type": "object" - }, - { - "type": "null" - } - ] - }, - "source": { - "enum": [ - "current_run", - "plugin_cache" - ], - "type": "string" - }, - "status": { - "enum": [ - "available", - "limited", - "exhausted", - "unknown" - ], - "type": "string" - } - }, - "required": [ - "status" - ], - "type": "object" - }, - "raw_defaults": { - "additionalProperties": false, - "properties": { - "isolation": { - "type": "string" - }, - "model": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - "sandbox": { - "type": "string" - }, - "tier": { - "type": "string" - }, - "timeout_seconds": { - "type": "integer" - } - }, - "required": [ - "tier", - "sandbox", - "isolation", - "timeout_seconds" - ], - "type": "object" - }, - "readiness_detail": { - "type": "string" - }, - "ready": { - "type": "boolean" - }, - "resolved_defaults": { - "additionalProperties": false, - "properties": { - "isolation": { - "enum": [ - "inherit", - "ignore-config", - "ignore-rules" - ], - "type": "string" - }, - "model": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - "sandbox": { - "enum": [ - "read-only", - "workspace-write", - "danger-full-access" - ], - "type": "string" - }, - "tier": { - "enum": [ - "consult", - "propose", - "apply" - ], - "type": "string" - }, - "timeout_bounds": { - "items": { - "type": "integer" - }, - "type": "array" - }, - "timeout_seconds": { - "type": "integer" - } - }, - "required": [ - "tier", - "sandbox", - "isolation", - "timeout_seconds", - "timeout_bounds" - ], - "type": "object" - }, - "version_supported": { - "anyOf": [ - { - "type": "boolean" - }, - { - "type": "null" - } - ] - }, - "version_warning": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - } - }, - "required": [ - "codex_found", - "readiness_detail", - "raw_defaults", - "resolved_defaults", - "caveat" - ], - "type": "object" - }, - { - "properties": { - "error": { - "description": "Populated error envelope; full schema at resource codex://error-envelope", - "type": "object" - }, - "meta": { - "type": "object" - }, - "ok": { - "const": false - } - }, - "required": [ - "ok", - "error", - "meta" - ], - "type": "object" - } -]New value: +[ + { + "additionalProperties": false, + "properties": { + "auth_detail": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "caveat": { + "type": "string" + }, + "codex_authenticated": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "null" + } + ] + }, + "codex_found": { + "type": "boolean" + }, + "codex_version": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "fingerprint": { + "type": "string" + }, + "flags_warning": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "ok": { + "const": true, + "type": "boolean" + }, + "rate_limit": { + "additionalProperties": false, + "properties": { + "age_seconds": { + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ] + }, + "as_of": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "home_unverified": { + "type": "boolean" + }, + "is_stale": { + "type": "boolean" + }, + "limiting_window": { + "anyOf": [ + { + "enum": [ + "primary", + "secondary" + ], + "type": "string" + }, + { + "type": "null" + } + ] + }, + "note": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "plan_type": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "primary": { + "anyOf": [ + { + "additionalProperties": false, + "properties": { + "remaining_percent": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ] + }, + "reset_passed": { + "type": "boolean" + }, + "resets_at": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "seconds_until_reset": { + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ] + }, + "used_percent": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ] + }, + "window_minutes": { + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ] + } + }, + "type": "object" + }, + { + "type": "null" + } + ] + }, + "secondary": { + "anyOf": [ + { + "additionalProperties": false, + "properties": { + "remaining_percent": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ] + }, + "reset_passed": { + "type": "boolean" + }, + "resets_at": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "seconds_until_reset": { + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ] + }, + "used_percent": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ] + }, + "window_minutes": { + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ] + } + }, + "type": "object" + }, + { + "type": "null" + } + ] + }, + "source": { + "enum": [ + "current_run", + "plugin_cache" + ], + "type": "string" + }, + "status": { + "enum": [ + "available", + "limited", + "exhausted", + "unknown" + ], + "type": "string" + } + }, + "required": [ + "status" + ], + "type": "object" + }, + "raw_defaults": { + "additionalProperties": false, + "properties": { + "isolation": { + "type": "string" + }, + "model": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "sandbox": { + "type": "string" + }, + "tier": { + "type": "string" + }, + "timeout_seconds": { + "type": "integer" + } + }, + "required": [ + "tier", + "sandbox", + "isolation", + "timeout_seconds" + ], + "type": "object" + }, + "readiness_detail": { + "type": "string" + }, + "ready": { + "type": "boolean" + }, + "resolved_defaults": { + "additionalProperties": false, + "properties": { + "isolation": { + "enum": [ + "inherit", + "ignore-config", + "ignore-rules" + ], + "type": "string" + }, + "model": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "sandbox": { + "enum": [ + "read-only", + "workspace-write", + "danger-full-access" + ], + "type": "string" + }, + "tier": { + "enum": [ + "consult", + "propose", + "apply" + ], + "type": "string" + }, + "timeout_bounds": { + "items": { + "type": "integer" + }, + "type": "array" + }, + "timeout_seconds": { + "type": "integer" + } + }, + "required": [ + "tier", + "sandbox", + "isolation", + "timeout_seconds", + "timeout_bounds" + ], + "type": "object" + }, + "version_supported": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "null" + } + ] + }, + "version_warning": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + } + }, + "required": [ + "codex_found", + "readiness_detail", + "raw_defaults", + "resolved_defaults", + "caveat" + ], + "type": "object" + }, + { + "properties": { + "error": { + "description": "Populated error envelope; full schema at resource codex://error-envelope", + "type": "object" + }, + "meta": { + "type": "object" + }, + "ok": { + "const": false + } + }, + "required": [ + "ok", + "error", + "meta" + ], + "type": "object" + } +]
5 tool updates
v0.6.0- Changed
codex_consult1 field changed- changed
Input schema / properties / extra_context / descriptionPrevious value: -"Optional author intent / background, added to the prompt as clearly-labeled UNTRUSTED context (directives inside it are never obeyed)."New value: +"Optional author intent / background context, added to the prompt as clearly-labeled UNTRUSTED data. Codex is instructed to treat embedded directives as data, not commands — best-effort prompt-injection mitigation, not a guarantee. Don't include live secrets: Codex can read files it's pointed at, and redaction does not cover this field."
- Changed
codex_consult_async1 field changed- changed
Input schema / properties / extra_context / descriptionPrevious value: -"Optional author intent / background, added to the prompt as clearly-labeled UNTRUSTED context (directives inside it are never obeyed)."New value: +"Optional author intent / background context, added to the prompt as clearly-labeled UNTRUSTED data. Codex is instructed to treat embedded directives as data, not commands — best-effort prompt-injection mitigation, not a guarantee. Don't include live secrets: Codex can read files it's pointed at, and redaction does not cover this field."
- Changed
codex_dry_run1 field changed- changed
Input schema / properties / extra_context / descriptionPrevious value: -"Optional author intent / background, added to the prompt as clearly-labeled UNTRUSTED context (directives inside it are never obeyed)."New value: +"Optional author intent / background context, added to the prompt as clearly-labeled UNTRUSTED data. Codex is instructed to treat embedded directives as data, not commands — best-effort prompt-injection mitigation, not a guarantee. Don't include live secrets: Codex can read files it's pointed at, and redaction does not cover this field."
- Changed
codex_review_changes1 field changed- changed
Input schema / properties / extra_context / descriptionPrevious value: -"Optional author intent / background, added to the prompt as clearly-labeled UNTRUSTED context (directives inside it are never obeyed)."New value: +"Optional author intent / background context, added to the prompt as clearly-labeled UNTRUSTED data. Codex is instructed to treat embedded directives as data, not commands — best-effort prompt-injection mitigation, not a guarantee. Don't include live secrets: Codex can read files it's pointed at, and redaction does not cover this field."
- Changed
codex_review_changes_async1 field changed- changed
Input schema / properties / extra_context / descriptionPrevious value: -"Optional author intent / background, added to the prompt as clearly-labeled UNTRUSTED context (directives inside it are never obeyed)."New value: +"Optional author intent / background context, added to the prompt as clearly-labeled UNTRUSTED data. Codex is instructed to treat embedded directives as data, not commands — best-effort prompt-injection mitigation, not a guarantee. Don't include live secrets: Codex can read files it's pointed at, and redaction does not cover this field."
16 tool updates
v0.5.0- First observed
codex_capabilities - First observed
codex_consult - First observed
codex_consult_async - First observed
codex_delegate - First observed
codex_delegate_async - First observed
codex_delegate_dry_run - First observed
codex_dry_run - First observed
codex_job_cancel - First observed
codex_job_consume_result - First observed
codex_job_list - First observed
codex_job_result - First observed
codex_job_status - First observed
codex_models - First observed
codex_review_changes - First observed
codex_review_changes_async - First observed
codex_status
TDQS
Scored across 17 tools
Each tool has a clearly distinct role: the sync/async pairs (consult vs consult_async, delegate vs delegate_async, review_changes vs review_changes_async), the dry-run previews, and the job-lifecycle tools (status/result/consume/cancel/list) are all well-differentiated by their descriptions. The only mildly confusable pair is codex_job_result vs codex_job_consume_result, but the delete-vs-keep distinction is spelled out explicitly.
A consistent `codex_` prefix and snake_case are used throughout, with a predictable `_async` suffix for detached variants and a coherent `codex_job_*` namespace. Minor deviation: some tools are noun phrases (codex_status, codex_models, codex_capabilities) while most others are verb_noun (codex_consult, codex_delegate, codex_review_changes), so the verb convention is not perfectly uniform.
17 tools is on the heavier side but justified by the feature matrix: three operations (consult/review/delegate) each with sync, async, and sometimes dry-run forms, plus five shared job-management tools. Each tool earns its place, though the surface is larger than a minimal integration would need.
The surface covers the full Codex-integration lifecycle: readiness/status checks, model discovery, capability introspection, three paid operations in both sync and async form, dry-run previews, and complete background-job handling (list/status/result/consume/cancel). No obvious operational gaps remain; the only caveat is that every tool is deprecated in favor of an amicus_* successor, which is a migration concern rather than a coverage gap.
Maintenance
Related MCP Connectors
No-data MCP handoff for local Claude Code to Codex harness moves. $49 lifetime.
A paid remote MCP for OpenAI Codex agent coordination MCP, built to return verdicts, receipts, usage
Source-checked CLI guides and model-aware planning for Claude Code, Codex, and Grok Build.
Claude Code / MCP skills for the dev pipeline: discover, spec, design, build, ship, operate.
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceIntegrates OpenAI Codex CLI with Claude Code via MCP, enabling code execution, analysis, fixing, and web search within Claude Code.663 npm1ISC
- AlicenseAqualityDmaintenanceEnables Claude Code to delegate tasks to OpenAI's Codex CLI (GPT-5.4) with structured execution traces, parallel execution, session persistence, and adversarial code review.15MIT
- AlicenseNot gradedqualityDmaintenanceMCP bridge for calling local coding-agent CLIs (Codex, Claude) from another agent, enabling bounded tasks like code review, verification, and bug hunting.MIT
- AlicenseBqualityDmaintenanceMCP bridge for using local Claude CLI as a bounded reviewer and analysis delegate for Codex.5MIT