Files
CL4R1T4S/OPENAI/Codex_Desktop/5.6-Sol_Tools.json
T
2026-07-14 12:13:11 -04:00

8094 lines
385 KiB
JSON
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
[
{
"name": "apply_patch",
"description": "Use the `apply_patch` tool to edit files. This is a FREEFORM tool, so do not wrap the patch in JSON.\n\nexec tool declaration:\n```ts\ndeclare const tools: { apply_patch(input: string): Promise<unknown>; };\n```"
},
{
"name": "codex_app__automation_update",
"description": "Tools provided by the Codex app.\n\nCreate, update, view, or delete recurring automations in the Codex app. Use this when the user asks for a scheduled task, automation, recurring run, repeated task, reminder, follow-up, monitor, or asks you to watch something, keep an eye on it, check back later, wake up later, notify them, or keep working later. New cron automations run as standalone local jobs against one project; use list_projects to find its project id. Heartbeat automations are proactive follow-ups attached to the current local thread. Prefer heartbeats for requests to continue this thread later, especially below one hour. Never write raw automation directives by hand, show raw RRULE strings to the user, or create a workaround cron automation for a thread heartbeat unless the user explicitly asks for that. For requests about existing automations, inspect $CODEX_HOME/automations/*/automation.toml to find matching automation ids by name or prompt. Prefer updating an existing automation over creating a duplicate. For updates, preserve existing fields unless the user asks to change them, and call automation_update with the resolved id and full updated fields.\n\nexec tool declaration:\n```ts\ndeclare const tools: { codex_app__automation_update(args: { id: unknown; mode: \"view\"; } | { destination?: \"local\"; executionEnvironment: \"local\"; kind: unknown; mode: unknown; model: unknown; name: unknown; projectId: unknown; prompt: unknown; reasoningEffort: unknown; rrule: unknown; status: unknown; } | { destination?: unknown; kind: unknown; mode: unknown; name: unknown; prompt: unknown; rrule: unknown; status: unknown; targetThreadId?: unknown; } | { destination?: \"local\" | \"worktree\"; executionEnvironment: \"worktree\" | \"local\"; id: unknown; kind: unknown; localEnvironmentConfigPath?: string | null; mode: unknown; model: unknown; name: unknown; projectId: unknown; prompt: unknown; reasoningEffort: unknown; rrule: unknown; status: unknown; } | { destination?: unknown; id: unknown; kind: unknown; mode: unknown; name: unknown; prompt: unknown; rrule: unknown; status: unknown; targetThreadId?: unknown; } | { id: unknown; mode: \"delete\"; }): Promise<unknown>; };\n```"
},
{
"name": "codex_app__fork_thread",
"description": "Tools provided by the Codex app.\n\nFork a Codex thread. Omit threadId to fork the calling thread, or pass a threadId to fork that specific thread. A same-directory fork returns a child threadId immediately; a worktree fork returns a clientThreadId while worktree setup creates the child. Forks contain completed history only: if the source thread is running, the active turn and unfinished response are not copied. Send a follow-up message to the child only if the task requires work to continue there.\n\nexec tool declaration:\n```ts\ndeclare const tools: { codex_app__fork_thread(args: {\n // Where the fork should run. Omit for a same-directory fork.\n environment?: { type: \"same-directory\"; } | { type: \"worktree\"; };\n // Optional source thread id to fork. Omit to fork the calling thread.\n threadId?: string;\n}): Promise<unknown>; };\n```"
},
{
"name": "codex_app__get_handoff_status",
"description": "Tools provided by the Codex app.\n\nRead status for a handoff_thread operation. The user-facing UI already updates in the original handoff item, so avoid frequent polling. Prefer afterRevision with a 30000-60000 waitMs so the call returns only when progress changes or the timeout expires. Poll once after dispatch, then wait longer/back off; do not repeatedly poll unchanged state or narrate unchanged polls.\n\nexec tool declaration:\n```ts\ndeclare const tools: { codex_app__get_handoff_status(args: {\n // Optional last revision already seen. When provided with waitMs, wait until the operation revision is greater than this value or the timeout expires.\n afterRevision?: number;\n // operationId returned by handoff_thread.\n operationId: string;\n // Optional maximum milliseconds to wait for a status change, from 0 to 60000.\n waitMs?: number;\n}): Promise<unknown>; };\n```"
},
{
"name": "codex_app__list_projects",
"description": "Tools provided by the Codex app.\n\nList local and remote projects available for background thread creation. Use a returned projectId with create_thread.\n\nexec tool declaration:\n```ts\ndeclare const tools: { codex_app__list_projects(args: {}): Promise<unknown>; };\n```"
},
{
"name": "codex_app__list_threads",
"description": "Tools provided by the Codex app.\n\nList recent Codex threads across the local host and connected remote hosts. Use an optional query to find a specific thread before reading or steering it.\n\nexec tool declaration:\n```ts\ndeclare const tools: { codex_app__list_threads(args: {\n // Maximum number of thread summaries to return.\n limit?: number;\n // Optional thread search query.\n query?: string;\n}): Promise<unknown>; };\n```"
},
{
"name": "codex_app__load_workspace_dependencies",
"description": "Tools provided by the Codex app.\n\nLocate the configured bundled workspace dependency runtime paths for this local desktop thread, including Node.js, Python, and useful libraries for working with spreadsheets, slide decks, Word documents, and PDFs. This is read-only and takes no arguments.\n\nexec tool declaration:\n```ts\ndeclare const tools: { codex_app__load_workspace_dependencies(args: {}): Promise<unknown>; };\n```"
},
{
"name": "codex_app__navigate_to_codex_page",
"description": "Tools provided by the Codex app.\n\nNavigate the most recently focused main Codex window to a thread. Use this when the user asks to open or show a Codex thread in the app.\n\nexec tool declaration:\n```ts\ndeclare const tools: { codex_app__navigate_to_codex_page(args: {\n // Thread id to show in Codex.\n threadId: string;\n}): Promise<unknown>; };\n```"
},
{
"name": "codex_app__read_thread",
"description": "Tools provided by the Codex app.\n\nRead recent status and turn summaries for one Codex thread without opening it. Use page cursors from earlier responses to read older turns.\n\nexec tool declaration:\n```ts\ndeclare const tools: { codex_app__read_thread(args: {\n // Optional cursor for older turns.\n cursor?: string;\n // Optional host id returned by list_threads.\n hostId?: string;\n // Whether to include truncated tool or command outputs.\n includeOutputs?: boolean;\n // Maximum output characters to keep for each included output item.\n maxOutputCharsPerItem?: number;\n // Thread id to inspect.\n threadId: string;\n // Maximum number of turns to return.\n turnLimit?: number;\n}): Promise<unknown>; };\n```"
},
{
"name": "codex_app__read_thread_terminal",
"description": "Tools provided by the Codex app.\n\nRead the current app terminal output for this desktop thread. Use it when you need shell output or the current prompt before deciding the next step. This tool takes no arguments.\n\nexec tool declaration:\n```ts\ndeclare const tools: { codex_app__read_thread_terminal(args: {}): Promise<unknown>; };\n```"
},
{
"name": "codex_app__set_thread_archived",
"description": "Tools provided by the Codex app.\n\nArchive or unarchive a Codex thread in the background.\n\nexec tool declaration:\n```ts\ndeclare const tools: { codex_app__set_thread_archived(args: {\n // Whether the thread should be archived.\n archived: boolean;\n // Thread id to archive or unarchive. Omit to target the calling thread.\n threadId?: string;\n}): Promise<unknown>; };\n```"
},
{
"name": "codex_app__set_thread_pinned",
"description": "Tools provided by the Codex app.\n\nPin or unpin a Codex thread in the background.\n\nexec tool declaration:\n```ts\ndeclare const tools: { codex_app__set_thread_pinned(args: {\n // Whether the thread should be pinned.\n pinned: boolean;\n // Thread id to pin or unpin.\n threadId: string;\n}): Promise<unknown>; };\n```"
},
{
"name": "codex_app__set_thread_title",
"description": "Tools provided by the Codex app.\n\nRename a Codex thread in the background.\n\nexec tool declaration:\n```ts\ndeclare const tools: { codex_app__set_thread_title(args: {\n // Thread id to rename. Omit to target the calling thread.\n threadId?: string;\n // New thread title.\n title: string;\n}): Promise<unknown>; };\n```"
},
{
"name": "create_goal",
"description": "Create a goal only when explicitly requested by the user or system/developer instructions; do not infer goals from ordinary tasks.\nSet token_budget only when an explicit token budget is requested. Fails if an unfinished goal exists; use update_goal only for status.\n\nexec tool declaration:\n```ts\ndeclare const tools: { create_goal(args: {\n // Required. The concrete objective to start pursuing. This starts a new active goal when no goal exists or replaces the current goal when it is complete.\n objective: string;\n // Positive token budget for the new goal. Omit unless explicitly requested.\n token_budget?: number;\n}): Promise<unknown>; };\n```"
},
{
"name": "exec_command",
"description": "Runs a command in a PTY, returning output or a session ID for ongoing interaction.\n\nexec tool declaration:\n```ts\ndeclare const tools: { exec_command(args: {\n // Shell command to execute.\n cmd: string;\n // User-facing approval question for `require_escalated`; omit otherwise.\n justification?: string;\n // True runs the shell with -l/-i semantics; false disables them. Defaults to true.\n login?: boolean;\n // Output token budget. Defaults to 10000 tokens; larger requests may be capped by policy.\n max_output_tokens?: number;\n // Reusable approval prefix for `cmd`, only with `sandbox_permissions: \"require_escalated\"`; for example [\"git\", \"pull\"].\n prefix_rule?: Array<string>;\n // Per-command sandbox override. Defaults to `use_default`; use `require_escalated` for unsandboxed execution.\n sandbox_permissions?: \"use_default\" | \"require_escalated\";\n // Shell binary to launch. Defaults to the user's default shell.\n shell?: string;\n // True allocates a PTY for the command; false or omitted uses plain pipes.\n tty?: boolean;\n // Working directory for the command. Defaults to the turn cwd.\n workdir?: string;\n // Wait before yielding output. Defaults to 10000 ms; effective range is 250-30000 ms.\n yield_time_ms?: number;\n}): Promise<{\n // Chunk identifier included when the response reports one.\n chunk_id?: string;\n // Process exit code when the command finished during this call.\n exit_code?: number;\n // Approximate token count before output truncation.\n original_token_count?: number;\n // Command output text, possibly truncated.\n output: string;\n // Session identifier to pass to write_stdin when the process is still running.\n session_id?: number;\n // Elapsed wall time spent waiting for output in seconds.\n wall_time_seconds: number;\n}>; };\n```"
},
{
"name": "get_goal",
"description": "Get the current goal for this thread, including status, budgets, token and elapsed-time usage, and remaining token budget.\n\nexec tool declaration:\n```ts\ndeclare const tools: { get_goal(args: {}): Promise<unknown>; };\n```"
},
{
"name": "image_gen__imagegen",
"description": "Tools in the image_gen namespace.\n\nThe `image_gen.imagegen` tool enables image generation from descriptions and editing of existing images based on specific instructions. Use it when:\n\n- The user requests an image based on a scene description, such as a diagram, portrait, comic, meme, or any other visual.\n- The user wants to modify an attached or previously generated image with specific changes, including adding or removing elements, altering colors, improving quality/resolution, or transforming the style (e.g., cartoon, oil painting).\n\nGuidelines:\n- In code mode, pass the result to `generatedImage(result)`.\n- Omit both `referenced_image_paths` and `num_last_images_to_include` when generating a brand new image.\n- For edits, use `referenced_image_paths` when every target image has a local file path.\n- If you have not seen a local image yet, use `view_image` to inspect it before editing.\n- Use `num_last_images_to_include` only when at least one target image has no local file path.\n- Set `num_last_images_to_include` to the smallest number of recent conversation images that includes every target image, up to 5.\n- Never provide both `referenced_image_paths` and `num_last_images_to_include`.\n- If neither mechanism can include every target image, ask the user to attach the missing images again.\n- Directly generate the image without reconfirmation or clarification unless required images must be attached again.\n- After each image generation, do not mention anything related to download. Do not summarize the image. Do not ask followup question. Do not say ANYTHING after you generate an image.\n- Always use this tool for image editing unless the user explicitly requests otherwise. Do not use the `python` tool for image editing unless specifically instructed.\n\n\nexec tool declaration:\n```ts\ndeclare const tools: { image_gen__imagegen(args: { num_last_images_to_include?: number | null; prompt: string; referenced_image_paths?: Array<string> | null; }): Promise<unknown>; };\n```"
},
{
"name": "list_mcp_resource_templates",
"description": "Lists resource templates provided by MCP servers. Parameterized resource templates allow servers to share data that takes parameters and provides context to language models, such as files, database schemas, or application-specific information. Prefer resource templates over web search when possible.\n\nexec tool declaration:\n```ts\ndeclare const tools: { list_mcp_resource_templates(args: {\n // Opaque cursor from a previous list_mcp_resource_templates call; omit for the first page.\n cursor?: string;\n // MCP server name. Omit to list resource templates from every configured server.\n server?: string;\n}): Promise<unknown>; };\n```"
},
{
"name": "list_mcp_resources",
"description": "Lists resources provided by MCP servers. Resources allow servers to share data that provides context to language models, such as files, database schemas, or application-specific information. Prefer resources over web search when possible.\n\nexec tool declaration:\n```ts\ndeclare const tools: { list_mcp_resources(args: {\n // Opaque cursor from a previous list_mcp_resources call; omit for the first page.\n cursor?: string;\n // MCP server name. Omit to list resources from every configured server.\n server?: string;\n}): Promise<unknown>; };\n```"
},
{
"name": "mcp__codex_apps__codex_document_control_execute_d_7437ad2e4ffa",
"description": "Use Codex Document Control to find connected document sessions, inspect the tools supported by a selected session, and execute one supported tool against that session. Call `list_document_sessions` first to choose the intended connected session, call `get_document_tool_schemas` before constructing tool arguments, then call `execute_document_command` with a caller-stable `idempotency_key`. Use this only for connected Codex document control; do not use it for general spreadsheet, presentation, or document tasks without a connected document session.\n\nExecute one supported surface-specific tool against a connected Codex document session. First call `list_document_sessions` to choose the intended `executor_session_id` and `supported_tools[].name`, then call `get_document_tool_schemas` for the selected `surface`, that `supported_tools[].name` as `tool_name`, and `version` before constructing `args`. `idempotency_key` must be a caller-stable key that you reuse verbatim only when retrying the same logical document-control command; use a new key for a different command. This tool is part of plugin `Spreadsheets`.\n\nexec tool declaration:\n```ts\ndeclare const tools: { mcp__codex_apps__codex_document_control_execute_d_7437ad2e4ffa(args: {\n // JSON object of arguments matching the selected tool's `input_schema` from `get_document_tool_schemas`.\n args: { [key: string]: unknown; };\n // Exact `executor_session_id` copied from the selected Codex document session returned by `list_document_sessions`.\n executor_session_id: string;\n // Caller-stable idempotency key for this logical document-control command. Reuse the exact same key only for retries of the same command.\n idempotency_key: string;\n // Exact selected session `supported_tools[].name` copied from `list_document_sessions`.\n tool_name: string;\n}): Promise<CallToolResult<{\n // The server's response to a tool call.\n result: { _meta?: { [key: string]: unknown; } | null; content: Array<{ _meta?: { [key: string]: unknown; } | null; annotations?: { audience?: Array<\"user\" | \"assistant\"> | null; priority?: number | null; } | null; text: string; type: \"text\"; } | { _meta?: { [key: string]: unknown; } | null; annotations?: { audience?: Array<\"user\" | \"assistant\"> | null; priority?: number | null; } | null; data: string; mimeType: string; type: \"image\"; } | { _meta?: { [key: string]: unknown; } | null; annotations?: { audience?: Array<\"user\" | \"assistant\"> | null; priority?: number | null; } | null; data: string; mimeType: string; type: \"audio\"; } | { _meta?: { [key: string]: unknown; } | null; annotations?: { audience?: Array<\"user\" | \"assistant\"> | null; priority?: number | null; } | null; description?: string | null; icons?: Array<{ mimeType?: string | null; sizes?: Array<string> | null; src: string; }> | null; mimeType?: string | null; name: string; size?: number | null; title?: string | null; type: \"resource_link\"; uri: string; } | { _meta?: { [key: string]: unknown; } | null; annotations?: { audience?: Array<\"user\" | \"assistant\"> | null; priority?: number | null; } | null; resource: { _meta?: { [key: string]: unknown; } | null; mimeType?: string | null; text: string; uri: string; } | { _meta?: { [key: string]: unknown; } | null; blob: string; mimeType?: string | null; uri: string; }; type: \"resource\"; }>; isError?: boolean; structuredContent?: { [key: string]: unknown; } | null; };\n}>>; };\n```"
},
{
"name": "mcp__codex_apps__codex_document_control_get_docum_83c7f0565c0f",
"description": "Use Codex Document Control to find connected document sessions, inspect the tools supported by a selected session, and execute one supported tool against that session. Call `list_document_sessions` first to choose the intended connected session, call `get_document_tool_schemas` before constructing tool arguments, then call `execute_document_command` with a caller-stable `idempotency_key`. Use this only for connected Codex document control; do not use it for general spreadsheet, presentation, or document tasks without a connected document session.\n\nFetch the concrete input schemas for tools supported by a selected Codex document session before constructing `execute_document_command.args`. First call `list_document_sessions`, then pass the exact `surface`, selected `supported_tools[].name` as `tool_name`, and `version` values from that session's `supported_tools` records. This tool is part of plugin `Spreadsheets`.\n\nexec tool declaration:\n```ts\ndeclare const tools: { mcp__codex_apps__codex_document_control_get_docum_83c7f0565c0f(args: {\n // Exact tool schema lookup keys from Codex document session discovery, keyed by `surface`, `supported_tools[].name` passed as `tool_name`, and `version`.\n items: Array<{\n // Document surface. Use `excel` for Excel workbooks, `powerpoint` for PowerPoint presentations, or `sheets` for Google Sheets spreadsheets.\n surface: \"excel\" | \"powerpoint\" | \"sheets\";\n // Exact `supported_tools[].name` copied from the selected session.\n tool_name: string;\n // Exact `supported_tools[].version` copied from the selected session.\n version: string;\n}>;\n}): Promise<CallToolResult<{\n // The server's response to a tool call.\n result: { _meta?: { [key: string]: unknown; } | null; content: Array<{ _meta?: { [key: string]: unknown; } | null; annotations?: { audience?: Array<\"user\" | \"assistant\"> | null; priority?: number | null; } | null; text: string; type: \"text\"; } | { _meta?: { [key: string]: unknown; } | null; annotations?: { audience?: Array<\"user\" | \"assistant\"> | null; priority?: number | null; } | null; data: string; mimeType: string; type: \"image\"; } | { _meta?: { [key: string]: unknown; } | null; annotations?: { audience?: Array<\"user\" | \"assistant\"> | null; priority?: number | null; } | null; data: string; mimeType: string; type: \"audio\"; } | { _meta?: { [key: string]: unknown; } | null; annotations?: { audience?: Array<\"user\" | \"assistant\"> | null; priority?: number | null; } | null; description?: string | null; icons?: Array<{ mimeType?: string | null; sizes?: Array<string> | null; src: string; }> | null; mimeType?: string | null; name: string; size?: number | null; title?: string | null; type: \"resource_link\"; uri: string; } | { _meta?: { [key: string]: unknown; } | null; annotations?: { audience?: Array<\"user\" | \"assistant\"> | null; priority?: number | null; } | null; resource: { _meta?: { [key: string]: unknown; } | null; mimeType?: string | null; text: string; uri: string; } | { _meta?: { [key: string]: unknown; } | null; blob: string; mimeType?: string | null; uri: string; }; type: \"resource\"; }>; isError?: boolean; structuredContent?: { [key: string]: unknown; } | null; };\n}>>; };\n```"
},
{
"name": "mcp__codex_apps__codex_document_control_list_document_sessions",
"description": "Use Codex Document Control to find connected document sessions, inspect the tools supported by a selected session, and execute one supported tool against that session. Call `list_document_sessions` first to choose the intended connected session, call `get_document_tool_schemas` before constructing tool arguments, then call `execute_document_command` with a caller-stable `idempotency_key`. Use this only for connected Codex document control; do not use it for general spreadsheet, presentation, or document tasks without a connected document session.\n\nList the user's currently connected Codex document sessions and the surface-specific tools each session supports. Call this before executing a document-control command so you can choose the intended `executor_session_id` and `supported_tools[].name`. This tool is part of plugin `Spreadsheets`.\n\nexec tool declaration:\n```ts\ndeclare const tools: { mcp__codex_apps__codex_document_control_list_document_sessions(args: {\n // Optional document surface filter. Use `excel` for Excel workbooks, `powerpoint` for PowerPoint presentations, or `sheets` for Google Sheets spreadsheets. Omit to list connected Codex document sessions across all supported surfaces.\n surface?: \"excel\" | \"powerpoint\" | \"sheets\" | null;\n}): Promise<CallToolResult<{\n // The server's response to a tool call.\n result: { _meta?: { [key: string]: unknown; } | null; content: Array<{ _meta?: { [key: string]: unknown; } | null; annotations?: { audience?: Array<\"user\" | \"assistant\"> | null; priority?: number | null; } | null; text: string; type: \"text\"; } | { _meta?: { [key: string]: unknown; } | null; annotations?: { audience?: Array<\"user\" | \"assistant\"> | null; priority?: number | null; } | null; data: string; mimeType: string; type: \"image\"; } | { _meta?: { [key: string]: unknown; } | null; annotations?: { audience?: Array<\"user\" | \"assistant\"> | null; priority?: number | null; } | null; data: string; mimeType: string; type: \"audio\"; } | { _meta?: { [key: string]: unknown; } | null; annotations?: { audience?: Array<\"user\" | \"assistant\"> | null; priority?: number | null; } | null; description?: string | null; icons?: Array<{ mimeType?: string | null; sizes?: Array<string> | null; src: string; }> | null; mimeType?: string | null; name: string; size?: number | null; title?: string | null; type: \"resource_link\"; uri: string; } | { _meta?: { [key: string]: unknown; } | null; annotations?: { audience?: Array<\"user\" | \"assistant\"> | null; priority?: number | null; } | null; resource: { _meta?: { [key: string]: unknown; } | null; mimeType?: string | null; text: string; uri: string; } | { _meta?: { [key: string]: unknown; } | null; blob: string; mimeType?: string | null; uri: string; }; type: \"resource\"; }>; isError?: boolean; structuredContent?: { [key: string]: unknown; } | null; };\n}>>; };\n```"
},
{
"name": "mcp__codex_apps__hotline_get_local_hotline",
"description": "Look up local hotline information for the user based on country inferred from the conversation. You must use this tool before providing helpline information; do not guess.\n\nLook up local hotline information for the user based on country inferred from the conversation. You must use this tool before providing helpline information; do not guess.\n\nexec tool declaration:\n```ts\ndeclare const tools: { mcp__codex_apps__hotline_get_local_hotline(args: {}): Promise<CallToolResult>; };\n```"
},
{
"name": "mcp__codex_apps__sites_add_custom_domain",
"description": "Use Sites to build, save, deploy, and inspect websites such as landing pages, portfolios, dashboards, portals, trackers, hubs, games, and internal tools. Always use Sites when .openai/hosting.json exists. Use Sites skills for local implementation, validation, source preparation, and artifact packaging. Use this connector for site creation, runtime environment variables, versions, production deployments, and access controls. Read .openai/hosting.json before creating a site and reuse its project_id when present. Treat Sites IDs and cursors as opaque: copy them exactly from .openai/hosting.json or Sites responses as applicable, and never invent, reformat, derive, or substitute them. Never call create_site more than once for the same local site. Push the exact source state before saving a version. commit_sha must identify that pushed state, and any archive must be built from it. Deploy only saved versions; every Sites deployment URL is production. Inspect deployment status when the initial result is non-terminal or the user asks for progress. Unless the user asks for local-only work or a saved version without deployment, finish deployable site work with a production deployment.\n\nAdd a custom domain to a published site. The response includes a CNAME target for subdomains, A record targets for zone apex domains, and all App Garden and Cloudflare validation records that must be set before the custom domain can route to the Site. This tool is part of plugin `Sites`.\n\nexec tool declaration:\n```ts\ndeclare const tools: { mcp__codex_apps__sites_add_custom_domain(args: {\n // Bare custom hostname, such as www.example.com\n hostname: string;\n // Exact opaque site project ID. Copy it verbatim from .openai/hosting.json's project_id or the id field returned by create_site, list_sites, or get_site. Never invent, modify, or substitute another identifier.\n project_id: string;\n}): Promise<CallToolResult<{ result: {\n // A record targets to use when the custom hostname is a zone apex.\n apex_proxy_ipv4_targets: Array<string>;\n // CNAME target to use for custom subdomains.\n cname_target: string | null;\n created_at: string;\n hostname: string;\n id: string;\n last_error: string | null;\n project_id: string;\n provider_status: string | null;\n ssl_status: string | null;\n status: \"pending\" | \"active\" | \"failed\";\n updated_at: string;\n validation_records: Array<{ name?: string | null; record_type?: string | null; value?: string | null; }>;\n worker_name: string;\n}; }>>; };\n```"
},
{
"name": "mcp__codex_apps__sites_create_site",
"description": "Use Sites to build, save, deploy, and inspect websites such as landing pages, portfolios, dashboards, portals, trackers, hubs, games, and internal tools. Always use Sites when .openai/hosting.json exists. Use Sites skills for local implementation, validation, source preparation, and artifact packaging. Use this connector for site creation, runtime environment variables, versions, production deployments, and access controls. Read .openai/hosting.json before creating a site and reuse its project_id when present. Treat Sites IDs and cursors as opaque: copy them exactly from .openai/hosting.json or Sites responses as applicable, and never invent, reformat, derive, or substitute them. Never call create_site more than once for the same local site. Push the exact source state before saving a version. commit_sha must identify that pushed state, and any archive must be built from it. Deploy only saved versions; every Sites deployment URL is production. Inspect deployment status when the initial result is non-terminal or the user asks for progress. Unless the user asks for local-only work or a saved version without deployment, finish deployable site work with a production deployment.\n\nCreate a site only when .openai/hosting.json has no project_id. If it has one, reuse that site. Never call this tool more than once for the same local site. This tool does not create local source. Immediately persist the response's id unchanged as project_id in .openai/hosting.json. The response includes a short-lived source repository credential that can be reused for pushes until it expires. Use per-command Git authentication; never expose or persist its token. This tool is part of plugin `Sites`.\n\nexec tool declaration:\n```ts\ndeclare const tools: { mcp__codex_apps__sites_create_site(args: {\n // Optional user-facing description of the site.\n description?: string | null;\n // Unique URL slug for the site. Use at least 5 characters, starting with a lowercase ASCII letter and containing only lowercase ASCII letters, digits, and single hyphens. Do not use leading, trailing, or consecutive hyphens, a reserved Sites slug, or a slug already used by another site.\n slug: string;\n // User-facing title for the site.\n title: string;\n}): Promise<CallToolResult<{ result: {\n auth_client_id: string | null;\n created_at: string;\n current_live_url: string | null;\n current_preview_url: string | null;\n description: string | null;\n disabled_by?: \"workspace_admin\" | \"openai\" | null;\n // Opaque site project ID. Pass this exact value as project_id.\n id: string;\n latest_version_number: number;\n screenshot_url: string | null;\n slug: string;\n // Short-lived source repository write credential when requested.\n source_repository_credential?: {\n // AppGen AppRepository id.\n app_repository_id: string;\n // Git authentication mode for the token.\n auth_mode: string;\n // Default branch the client should push.\n branch: string;\n // Source repository provider.\n provider: string;\n // Git remote URL without embedded credentials.\n remote_url: string;\n // Provider repository name bound to the AppGen project.\n repository: string;\n // Short-lived repo-scoped Git token.\n token: string;\n // Token expiration timestamp when provided.\n token_expires_at: string;\n} | null;\n status: \"active\" | \"archived\" | \"suspended\";\n title: string;\n updated_at: string;\n}; }>>; };\n```"
},
{
"name": "mcp__codex_apps__sites_create_source_repository_w_7e7b8ba6ef73",
"description": "Use Sites to build, save, deploy, and inspect websites such as landing pages, portfolios, dashboards, portals, trackers, hubs, games, and internal tools. Always use Sites when .openai/hosting.json exists. Use Sites skills for local implementation, validation, source preparation, and artifact packaging. Use this connector for site creation, runtime environment variables, versions, production deployments, and access controls. Read .openai/hosting.json before creating a site and reuse its project_id when present. Treat Sites IDs and cursors as opaque: copy them exactly from .openai/hosting.json or Sites responses as applicable, and never invent, reformat, derive, or substitute them. Never call create_site more than once for the same local site. Push the exact source state before saving a version. commit_sha must identify that pushed state, and any archive must be built from it. Deploy only saved versions; every Sites deployment URL is production. Inspect deployment status when the initial result is non-terminal or the user asks for progress. Unless the user asks for local-only work or a saved version without deployment, finish deployable site work with a production deployment.\n\nCreate a short-lived source repository write credential when the credential returned by create_site is no longer usable. Use it to push the source state later referenced by commit_sha. The credential can be reused until it expires; use per-command Git authentication. Never expose or persist its token. This tool is part of plugin `Sites`.\n\nexec tool declaration:\n```ts\ndeclare const tools: { mcp__codex_apps__sites_create_source_repository_w_7e7b8ba6ef73(args: {\n // Exact opaque site project ID. Copy it verbatim from .openai/hosting.json's project_id or the id field returned by create_site, list_sites, or get_site. Never invent, modify, or substitute another identifier.\n project_id: string;\n}): Promise<CallToolResult<{ result: {\n // AppGen AppRepository id.\n app_repository_id: string;\n // Git authentication mode for the token.\n auth_mode: string;\n // Default branch the client should push.\n branch: string;\n // Source repository provider.\n provider: string;\n // Git remote URL without embedded credentials.\n remote_url: string;\n // Provider repository name bound to the AppGen project.\n repository: string;\n // Short-lived repo-scoped Git token.\n token: string;\n // Token expiration timestamp when provided.\n token_expires_at: string;\n}; }>>; };\n```"
},
{
"name": "mcp__codex_apps__sites_deploy_private_site_version",
"description": "Use Sites to build, save, deploy, and inspect websites such as landing pages, portfolios, dashboards, portals, trackers, hubs, games, and internal tools. Always use Sites when .openai/hosting.json exists. Use Sites skills for local implementation, validation, source preparation, and artifact packaging. Use this connector for site creation, runtime environment variables, versions, production deployments, and access controls. Read .openai/hosting.json before creating a site and reuse its project_id when present. Treat Sites IDs and cursors as opaque: copy them exactly from .openai/hosting.json or Sites responses as applicable, and never invent, reformat, derive, or substitute them. Never call create_site more than once for the same local site. Push the exact source state before saving a version. commit_sha must identify that pushed state, and any archive must be built from it. Deploy only saved versions; every Sites deployment URL is production. Inspect deployment status when the initial result is non-terminal or the user asks for progress. Unless the user asks for local-only work or a saved version without deployment, finish deployable site work with a production deployment.\n\nDeploy a saved site version to production only when verified owner-only access makes the current caller the sole explicitly allowed viewer and allows no groups. This tool fails without starting a deployment when the site is shared, public, or cannot be verified as owner-only. In those cases, ask the user to approve deployment before using deploy_site_version. Every returned Sites deployment URL is a production URL. If the initial state is non-terminal or the user asks for progress, use get_deployment_status. This tool is part of plugin `Sites`.\n\nexec tool declaration:\n```ts\ndeclare const tools: { mcp__codex_apps__sites_deploy_private_site_version(args: {\n // Exact opaque site project ID. Copy it verbatim from .openai/hosting.json's project_id or the id field returned by create_site, list_sites, or get_site. Never invent, modify, or substitute another identifier.\n project_id: string;\n // Exact opaque saved version ID returned as id by save_site_version, list_site_versions, or get_site_version. Copy it verbatim as version_id; never substitute a project or deployment ID.\n version_id: string;\n}): Promise<CallToolResult<{ result: {\n env_set_revision: number;\n failure_message: string | null;\n // Opaque deployment ID. Pass this exact value as deployment_id.\n id: string;\n // Opaque site project ID. Pass this exact value as project_id.\n project_id: string;\n provider_deployment_id: string | null;\n screenshot_asset_pointer?: string | null;\n status: \"pending\" | \"building\" | \"publishing\" | \"succeeded\" | \"failed\";\n title: string;\n type: \"preview\" | \"publish\";\n updated_at: string;\n url: string | null;\n // Opaque saved version ID. Pass this exact value as version_id.\n version_id: string;\n}; }>>; };\n```"
},
{
"name": "mcp__codex_apps__sites_deploy_site_version",
"description": "Use Sites to build, save, deploy, and inspect websites such as landing pages, portfolios, dashboards, portals, trackers, hubs, games, and internal tools. Always use Sites when .openai/hosting.json exists. Use Sites skills for local implementation, validation, source preparation, and artifact packaging. Use this connector for site creation, runtime environment variables, versions, production deployments, and access controls. Read .openai/hosting.json before creating a site and reuse its project_id when present. Treat Sites IDs and cursors as opaque: copy them exactly from .openai/hosting.json or Sites responses as applicable, and never invent, reformat, derive, or substitute them. Never call create_site more than once for the same local site. Push the exact source state before saving a version. commit_sha must identify that pushed state, and any archive must be built from it. Deploy only saved versions; every Sites deployment URL is production. Inspect deployment status when the initial result is non-terminal or the user asks for progress. Unless the user asks for local-only work or a saved version without deployment, finish deployable site work with a production deployment.\n\nDeploy a saved site version to production when the site is shared with anyone besides the current caller, public, cannot be verified as owner-only, or when deploy_private_site_version is unavailable. This is an open-world deployment and requires explicit user approval. For a verified owner-only site, use deploy_private_site_version when available. An unsaved local build cannot be deployed directly. Every returned Sites deployment URL is a production URL. If the initial state is non-terminal or the user asks for progress, use get_deployment_status. This tool is part of plugin `Sites`.\n\nexec tool declaration:\n```ts\ndeclare const tools: { mcp__codex_apps__sites_deploy_site_version(args: {\n // Exact opaque site project ID. Copy it verbatim from .openai/hosting.json's project_id or the id field returned by create_site, list_sites, or get_site. Never invent, modify, or substitute another identifier.\n project_id: string;\n // Exact opaque saved version ID returned as id by save_site_version, list_site_versions, or get_site_version. Copy it verbatim as version_id; never substitute a project or deployment ID.\n version_id: string;\n}): Promise<CallToolResult<{ result: {\n env_set_revision: number;\n failure_message: string | null;\n // Opaque deployment ID. Pass this exact value as deployment_id.\n id: string;\n // Opaque site project ID. Pass this exact value as project_id.\n project_id: string;\n provider_deployment_id: string | null;\n screenshot_asset_pointer?: string | null;\n status: \"pending\" | \"building\" | \"publishing\" | \"succeeded\" | \"failed\";\n title: string;\n type: \"preview\" | \"publish\";\n updated_at: string;\n url: string | null;\n // Opaque saved version ID. Pass this exact value as version_id.\n version_id: string;\n}; }>>; };\n```"
},
{
"name": "mcp__codex_apps__sites_generate_siwc_bypass_token",
"description": "Use Sites to build, save, deploy, and inspect websites such as landing pages, portfolios, dashboards, portals, trackers, hubs, games, and internal tools. Always use Sites when .openai/hosting.json exists. Use Sites skills for local implementation, validation, source preparation, and artifact packaging. Use this connector for site creation, runtime environment variables, versions, production deployments, and access controls. Read .openai/hosting.json before creating a site and reuse its project_id when present. Treat Sites IDs and cursors as opaque: copy them exactly from .openai/hosting.json or Sites responses as applicable, and never invent, reformat, derive, or substitute them. Never call create_site more than once for the same local site. Push the exact source state before saving a version. commit_sha must identify that pushed state, and any archive must be built from it. Deploy only saved versions; every Sites deployment URL is production. Inspect deployment status when the initial result is non-terminal or the user asks for progress. Unless the user asks for local-only work or a saved version without deployment, finish deployable site work with a production deployment.\n\nGenerate a bearer token for identity-less API requests that bypasses a site's Sign in with ChatGPT gate. Use `get_site` to retrieve an existing token without rotating it. Calling this tool creates a token if none exists, or rotates and immediately invalidates the existing token. Pass the returned token as `OAI-Sites-Authorization: Bearer {siwc_bypass_bearer_token}`. This tool is part of plugin `Sites`.\n\nexec tool declaration:\n```ts\ndeclare const tools: { mcp__codex_apps__sites_generate_siwc_bypass_token(args: {\n // Exact opaque site project ID. Copy it verbatim from .openai/hosting.json's project_id or the id field returned by create_site, list_sites, or get_site. Never invent, modify, or substitute another identifier.\n project_id: string;\n}): Promise<CallToolResult<{ result: {\n project_id: string;\n // Bearer token accepted by Sites dispatch in the OAI-Sites-Authorization header.\n siwc_bypass_bearer_token: string;\n}; }>>; };\n```"
},
{
"name": "mcp__codex_apps__sites_get_deployment_status",
"description": "Use Sites to build, save, deploy, and inspect websites such as landing pages, portfolios, dashboards, portals, trackers, hubs, games, and internal tools. Always use Sites when .openai/hosting.json exists. Use Sites skills for local implementation, validation, source preparation, and artifact packaging. Use this connector for site creation, runtime environment variables, versions, production deployments, and access controls. Read .openai/hosting.json before creating a site and reuse its project_id when present. Treat Sites IDs and cursors as opaque: copy them exactly from .openai/hosting.json or Sites responses as applicable, and never invent, reformat, derive, or substitute them. Never call create_site more than once for the same local site. Push the exact source state before saving a version. commit_sha must identify that pushed state, and any archive must be built from it. Deploy only saved versions; every Sites deployment URL is production. Inspect deployment status when the initial result is non-terminal or the user asks for progress. Unless the user asks for local-only work or a saved version without deployment, finish deployable site work with a production deployment.\n\nGet the current status of a production deployment. Only poll when a deployment ID is available. Continue polling a non-terminal deployment when progress is requested, unless the user asks to stop. On success, report the production URL. On failure, report the failure message and the site, version, and deployment IDs. This tool is part of plugin `Sites`.\n\nexec tool declaration:\n```ts\ndeclare const tools: { mcp__codex_apps__sites_get_deployment_status(args: {\n // Deployment ID returned for the supplied project_id and version_id. Do not mix identifiers from different deployment flows.\n deployment_id: string;\n // ID of the site from the same deployment flow as version_id and deployment_id.\n project_id: string;\n // Saved version ID from the same deployment flow as project_id and deployment_id.\n version_id: string;\n}): Promise<CallToolResult<{ result: {\n env_set_revision: number;\n failure_message: string | null;\n // Opaque deployment ID. Pass this exact value as deployment_id.\n id: string;\n // Opaque site project ID. Pass this exact value as project_id.\n project_id: string;\n provider_deployment_id: string | null;\n screenshot_asset_pointer?: string | null;\n status: \"pending\" | \"building\" | \"publishing\" | \"succeeded\" | \"failed\";\n title: string;\n type: \"preview\" | \"publish\";\n updated_at: string;\n url: string | null;\n // Opaque saved version ID. Pass this exact value as version_id.\n version_id: string;\n}; }>>; };\n```"
},
{
"name": "mcp__codex_apps__sites_get_environment_variables",
"description": "Use Sites to build, save, deploy, and inspect websites such as landing pages, portfolios, dashboards, portals, trackers, hubs, games, and internal tools. Always use Sites when .openai/hosting.json exists. Use Sites skills for local implementation, validation, source preparation, and artifact packaging. Use this connector for site creation, runtime environment variables, versions, production deployments, and access controls. Read .openai/hosting.json before creating a site and reuse its project_id when present. Treat Sites IDs and cursors as opaque: copy them exactly from .openai/hosting.json or Sites responses as applicable, and never invent, reformat, derive, or substitute them. Never call create_site more than once for the same local site. Push the exact source state before saving a version. commit_sha must identify that pushed state, and any archive must be built from it. Deploy only saved versions; every Sites deployment URL is production. Inspect deployment status when the initial result is non-terminal or the user asks for progress. Unless the user asks for local-only work or a saved version without deployment, finish deployable site work with a production deployment.\n\nGet the production runtime environment variables for a site. These values are separate from local .env files and .openai/hosting.json. This tool is part of plugin `Sites`.\n\nexec tool declaration:\n```ts\ndeclare const tools: { mcp__codex_apps__sites_get_environment_variables(args: {\n // Exact opaque site project ID. Copy it verbatim from .openai/hosting.json's project_id or the id field returned by create_site, list_sites, or get_site. Never invent, modify, or substitute another identifier.\n project_id: string;\n}): Promise<CallToolResult<{ result: { entries: Array<{ is_secret?: boolean; key: string; type?: \"envvar\"; value: string | null; }>; project_id: string; revision: number; updated_at: string | null; }; }>>; };\n```"
},
{
"name": "mcp__codex_apps__sites_get_site",
"description": "Use Sites to build, save, deploy, and inspect websites such as landing pages, portfolios, dashboards, portals, trackers, hubs, games, and internal tools. Always use Sites when .openai/hosting.json exists. Use Sites skills for local implementation, validation, source preparation, and artifact packaging. Use this connector for site creation, runtime environment variables, versions, production deployments, and access controls. Read .openai/hosting.json before creating a site and reuse its project_id when present. Treat Sites IDs and cursors as opaque: copy them exactly from .openai/hosting.json or Sites responses as applicable, and never invent, reformat, derive, or substitute them. Never call create_site more than once for the same local site. Push the exact source state before saving a version. commit_sha must identify that pushed state, and any archive must be built from it. Deploy only saved versions; every Sites deployment URL is production. Inspect deployment status when the initial result is non-terminal or the user asks for progress. Unless the user asks for local-only work or a saved version without deployment, finish deployable site work with a production deployment.\n\nGet a site and its current access configuration. This tool is part of plugin `Sites`.\n\nexec tool declaration:\n```ts\ndeclare const tools: { mcp__codex_apps__sites_get_site(args: {\n // Exact opaque site project ID. Copy it verbatim from .openai/hosting.json's project_id or the id field returned by create_site, list_sites, or get_site. Never invent, modify, or substitute another identifier.\n project_id: string;\n}): Promise<CallToolResult<{ result: {\n // Workspace access mode for this Sites project, or null for non-workspace apps.\n access_mode?: \"public\" | \"admins_only\" | \"workspace_all\" | \"custom\" | null;\n // Workspace access policy for this Appgen project, or null for non-workspace apps.\n access_policy?: {\n // Access mode for the app.\n access_mode: \"public\" | \"admins_only\" | \"workspace_all\" | \"custom\";\n // Account user ID allowlist for the app.\n allowed_account_user_ids: Array<string>;\n // Group details resolved from allowed workspace and tenant group IDs.\n allowed_groups: Array<{\n // Group ID to use in an Appgen access policy.\n id: string;\n // Group display name.\n name: string;\n // Total number of members in the group.\n size: number;\n}>;\n // Tenant group ID allowlist for the app.\n allowed_tenant_group_ids: Array<string>;\n // User details resolved from allowed_account_user_ids.\n allowed_users: Array<{\n // Account user ID for the allowed user.\n account_user_id: string;\n // Email address for the allowed user, when available.\n email?: string | null;\n // Display name for the allowed user, when available.\n name?: string | null;\n}>;\n // Workspace group ID allowlist for the app.\n allowed_workspace_group_ids: Array<string>;\n // Appgen project ID\n project_id: string;\n // Monotonic access policy revision.\n revision: number;\n // Access policy update timestamp.\n updated_at: string;\n} | null;\n auth_client_id: string | null;\n // Access modes the current user may set. Omitted when the capability is unavailable.\n available_access_modes?: Array<\"public\" | \"workspace_all\" | \"custom\"> | null;\n created_at: string;\n current_live_url: string | null;\n current_preview_url: string | null;\n description: string | null;\n disabled_by?: \"workspace_admin\" | \"openai\" | null;\n // Opaque site project ID. Pass this exact value as project_id.\n id: string;\n latest_version_number: number;\n screenshot_url: string | null;\n // Bearer token accepted by Sites dispatch in the OAI-Sites-Authorization header.\n siwc_bypass_bearer_token?: string | null;\n slug: string;\n // Short-lived source repository write credential when requested.\n source_repository_credential?: {\n // AppGen AppRepository id.\n app_repository_id: string;\n // Git authentication mode for the token.\n auth_mode: string;\n // Default branch the client should push.\n branch: string;\n // Source repository provider.\n provider: string;\n // Git remote URL without embedded credentials.\n remote_url: string;\n // Provider repository name bound to the AppGen project.\n repository: string;\n // Short-lived repo-scoped Git token.\n token: string;\n // Token expiration timestamp when provided.\n token_expires_at: string;\n} | null;\n status: \"active\" | \"archived\" | \"suspended\";\n title: string;\n updated_at: string;\n}; }>>; };\n```"
},
{
"name": "mcp__codex_apps__sites_get_site_version",
"description": "Use Sites to build, save, deploy, and inspect websites such as landing pages, portfolios, dashboards, portals, trackers, hubs, games, and internal tools. Always use Sites when .openai/hosting.json exists. Use Sites skills for local implementation, validation, source preparation, and artifact packaging. Use this connector for site creation, runtime environment variables, versions, production deployments, and access controls. Read .openai/hosting.json before creating a site and reuse its project_id when present. Treat Sites IDs and cursors as opaque: copy them exactly from .openai/hosting.json or Sites responses as applicable, and never invent, reformat, derive, or substitute them. Never call create_site more than once for the same local site. Push the exact source state before saving a version. commit_sha must identify that pushed state, and any archive must be built from it. Deploy only saved versions; every Sites deployment URL is production. Inspect deployment status when the initial result is non-terminal or the user asks for progress. Unless the user asks for local-only work or a saved version without deployment, finish deployable site work with a production deployment.\n\nGet a saved site version and its source provenance. Retain version_id for follow-up calls, but report the user-facing version number when possible. This tool is part of plugin `Sites`.\n\nexec tool declaration:\n```ts\ndeclare const tools: { mcp__codex_apps__sites_get_site_version(args: {\n // Exact opaque site project ID. Copy it verbatim from .openai/hosting.json's project_id or the id field returned by create_site, list_sites, or get_site. Never invent, modify, or substitute another identifier.\n project_id: string;\n // Exact opaque saved version ID returned as id by save_site_version, list_site_versions, or get_site_version. Copy it verbatim as version_id; never substitute a project or deployment ID.\n version_id: string;\n}): Promise<CallToolResult<{ result: {\n archive_storage?: { archive_format: string; content_hash: string; file_count?: number | null; sediment_file_id: string; size_bytes?: number | null; } | null;\n // Opaque saved version ID. Pass this exact value as version_id.\n id: string;\n // Opaque site project ID. Pass this exact value as project_id.\n project_id: string;\n screenshot_url?: string | null;\n source: { commit_sha: string; };\n version_number: number;\n}; }>>; };\n```"
},
{
"name": "mcp__codex_apps__sites_list_custom_domains",
"description": "Use Sites to build, save, deploy, and inspect websites such as landing pages, portfolios, dashboards, portals, trackers, hubs, games, and internal tools. Always use Sites when .openai/hosting.json exists. Use Sites skills for local implementation, validation, source preparation, and artifact packaging. Use this connector for site creation, runtime environment variables, versions, production deployments, and access controls. Read .openai/hosting.json before creating a site and reuse its project_id when present. Treat Sites IDs and cursors as opaque: copy them exactly from .openai/hosting.json or Sites responses as applicable, and never invent, reformat, derive, or substitute them. Never call create_site more than once for the same local site. Push the exact source state before saving a version. commit_sha must identify that pushed state, and any archive must be built from it. Deploy only saved versions; every Sites deployment URL is production. Inspect deployment status when the initial result is non-terminal or the user asks for progress. Unless the user asks for local-only work or a saved version without deployment, finish deployable site work with a production deployment.\n\nList custom domains attached to a site. This tool is part of plugin `Sites`.\n\nexec tool declaration:\n```ts\ndeclare const tools: { mcp__codex_apps__sites_list_custom_domains(args: {\n // Exact opaque site project ID. Copy it verbatim from .openai/hosting.json's project_id or the id field returned by create_site, list_sites, or get_site. Never invent, modify, or substitute another identifier.\n project_id: string;\n}): Promise<CallToolResult<{ result: { items: Array<{\n // A record targets to use when the custom hostname is a zone apex.\n apex_proxy_ipv4_targets: Array<string>;\n // CNAME target to use for custom subdomains.\n cname_target: string | null;\n created_at: string;\n hostname: string;\n id: string;\n last_error: string | null;\n project_id: string;\n provider_status: string | null;\n ssl_status: string | null;\n status: \"pending\" | \"active\" | \"failed\";\n updated_at: string;\n validation_records: Array<{ name?: string | null; record_type?: string | null; value?: string | null; }>;\n worker_name: string;\n}>; }; }>>; };\n```"
},
{
"name": "mcp__codex_apps__sites_list_site_versions",
"description": "Use Sites to build, save, deploy, and inspect websites such as landing pages, portfolios, dashboards, portals, trackers, hubs, games, and internal tools. Always use Sites when .openai/hosting.json exists. Use Sites skills for local implementation, validation, source preparation, and artifact packaging. Use this connector for site creation, runtime environment variables, versions, production deployments, and access controls. Read .openai/hosting.json before creating a site and reuse its project_id when present. Treat Sites IDs and cursors as opaque: copy them exactly from .openai/hosting.json or Sites responses as applicable, and never invent, reformat, derive, or substitute them. Never call create_site more than once for the same local site. Push the exact source state before saving a version. commit_sha must identify that pushed state, and any archive must be built from it. Deploy only saved versions; every Sites deployment URL is production. Inspect deployment status when the initial result is non-terminal or the user asks for progress. Unless the user asks for local-only work or a saved version without deployment, finish deployable site work with a production deployment.\n\nList saved site versions in newest-first order for history, deployment, or rollback selection. A saved version is not necessarily deployed to production. This tool is part of plugin `Sites`.\n\nexec tool declaration:\n```ts\ndeclare const tools: { mcp__codex_apps__sites_list_site_versions(args: {\n // Cursor returned by a previous list_site_versions call.\n cursor?: string | null;\n // Maximum number of site versions to return.\n limit?: number;\n // Exact opaque site project ID. Copy it verbatim from .openai/hosting.json's project_id or the id field returned by create_site, list_sites, or get_site. Never invent, modify, or substitute another identifier.\n project_id: string;\n}): Promise<CallToolResult<{ result: {\n // Cursor for the next page, if any\n cursor?: string | null;\n // Appgen project versions in this page\n items: Array<{\n archive_storage?: { archive_format: string; content_hash: string; file_count?: number | null; sediment_file_id: string; size_bytes?: number | null; } | null;\n // Opaque saved version ID. Pass this exact value as version_id.\n id: string;\n // Opaque site project ID. Pass this exact value as project_id.\n project_id: string;\n screenshot_url?: string | null;\n source: { commit_sha: string; };\n version_number: number;\n}>;\n}; }>>; };\n```"
},
{
"name": "mcp__codex_apps__sites_list_sites",
"description": "Use Sites to build, save, deploy, and inspect websites such as landing pages, portfolios, dashboards, portals, trackers, hubs, games, and internal tools. Always use Sites when .openai/hosting.json exists. Use Sites skills for local implementation, validation, source preparation, and artifact packaging. Use this connector for site creation, runtime environment variables, versions, production deployments, and access controls. Read .openai/hosting.json before creating a site and reuse its project_id when present. Treat Sites IDs and cursors as opaque: copy them exactly from .openai/hosting.json or Sites responses as applicable, and never invent, reformat, derive, or substitute them. Never call create_site more than once for the same local site. Push the exact source state before saving a version. commit_sha must identify that pushed state, and any archive must be built from it. Deploy only saved versions; every Sites deployment URL is production. Inspect deployment status when the initial result is non-terminal or the user asks for progress. Unless the user asks for local-only work or a saved version without deployment, finish deployable site work with a production deployment.\n\nList sites owned by the current user. Use this only when .openai/hosting.json has no project_id. When selecting a listed site, use that item's id unchanged as project_id. Do not derive it from a title or slug, and do not replace a persisted project_id based on title or slug matching. This tool is part of plugin `Sites`.\n\nexec tool declaration:\n```ts\ndeclare const tools: { mcp__codex_apps__sites_list_sites(args: {\n // Cursor returned by a previous list_sites call.\n cursor?: string | null;\n // Maximum number of sites to return.\n limit: number;\n}): Promise<CallToolResult<{ result: {\n // Cursor for the next page, if any\n cursor?: string | null;\n // Appgen projects in page\n items: Array<{\n // Workspace access mode for this Sites project, or null for non-workspace apps.\n access_mode?: \"public\" | \"admins_only\" | \"workspace_all\" | \"custom\" | null;\n // Workspace access policy for this Appgen project, or null for non-workspace apps.\n access_policy?: {\n // Access mode for the app.\n access_mode: \"public\" | \"admins_only\" | \"workspace_all\" | \"custom\";\n // Account user ID allowlist for the app.\n allowed_account_user_ids: Array<string>;\n // Group details resolved from allowed workspace and tenant group IDs.\n allowed_groups: Array<{\n // Group ID to use in an Appgen access policy.\n id: string;\n // Group display name.\n name: string;\n // Total number of members in the group.\n size: number;\n}>;\n // Tenant group ID allowlist for the app.\n allowed_tenant_group_ids: Array<string>;\n // User details resolved from allowed_account_user_ids.\n allowed_users: Array<{\n // Account user ID for the allowed user.\n account_user_id: string;\n // Email address for the allowed user, when available.\n email?: string | null;\n // Display name for the allowed user, when available.\n name?: string | null;\n}>;\n // Workspace group ID allowlist for the app.\n allowed_workspace_group_ids: Array<string>;\n // Appgen project ID\n project_id: string;\n // Monotonic access policy revision.\n revision: number;\n // Access policy update timestamp.\n updated_at: string;\n} | null;\n auth_client_id: string | null;\n // Access modes the current user may set. Omitted when the capability is unavailable.\n available_access_modes?: Array<\"public\" | \"workspace_all\" | \"custom\"> | null;\n created_at: string;\n current_live_url: string | null;\n current_preview_url: string | null;\n description: string | null;\n disabled_by?: \"workspace_admin\" | \"openai\" | null;\n // Opaque site project ID. Pass this exact value as project_id.\n id: string;\n latest_version_number: number;\n screenshot_url: string | null;\n slug: string;\n // Short-lived source repository write credential when requested.\n source_repository_credential?: {\n // AppGen AppRepository id.\n app_repository_id: string;\n // Git authentication mode for the token.\n auth_mode: string;\n // Default branch the client should push.\n branch: string;\n // Source repository provider.\n provider: string;\n // Git remote URL without embedded credentials.\n remote_url: string;\n // Provider repository name bound to the AppGen project.\n repository: string;\n // Short-lived repo-scoped Git token.\n token: string;\n // Token expiration timestamp when provided.\n token_expires_at: string;\n} | null;\n status: \"active\" | \"archived\" | \"suspended\";\n title: string;\n updated_at: string;\n}>;\n}; }>>; };\n```"
},
{
"name": "mcp__codex_apps__sites_refresh_custom_domain_status",
"description": "Use Sites to build, save, deploy, and inspect websites such as landing pages, portfolios, dashboards, portals, trackers, hubs, games, and internal tools. Always use Sites when .openai/hosting.json exists. Use Sites skills for local implementation, validation, source preparation, and artifact packaging. Use this connector for site creation, runtime environment variables, versions, production deployments, and access controls. Read .openai/hosting.json before creating a site and reuse its project_id when present. Treat Sites IDs and cursors as opaque: copy them exactly from .openai/hosting.json or Sites responses as applicable, and never invent, reformat, derive, or substitute them. Never call create_site more than once for the same local site. Push the exact source state before saving a version. commit_sha must identify that pushed state, and any archive must be built from it. Deploy only saved versions; every Sites deployment URL is production. Inspect deployment status when the initial result is non-terminal or the user asks for progress. Unless the user asks for local-only work or a saved version without deployment, finish deployable site work with a production deployment.\n\nRefresh custom domain validation status for a site. This tool is part of plugin `Sites`.\n\nexec tool declaration:\n```ts\ndeclare const tools: { mcp__codex_apps__sites_refresh_custom_domain_status(args: {\n // Custom domain ID\n custom_domain_id: string;\n // Exact opaque site project ID. Copy it verbatim from .openai/hosting.json's project_id or the id field returned by create_site, list_sites, or get_site. Never invent, modify, or substitute another identifier.\n project_id: string;\n}): Promise<CallToolResult<{ result: {\n // A record targets to use when the custom hostname is a zone apex.\n apex_proxy_ipv4_targets: Array<string>;\n // CNAME target to use for custom subdomains.\n cname_target: string | null;\n created_at: string;\n hostname: string;\n id: string;\n last_error: string | null;\n project_id: string;\n provider_status: string | null;\n ssl_status: string | null;\n status: \"pending\" | \"active\" | \"failed\";\n updated_at: string;\n validation_records: Array<{ name?: string | null; record_type?: string | null; value?: string | null; }>;\n worker_name: string;\n}; }>>; };\n```"
},
{
"name": "mcp__codex_apps__sites_remove_custom_domain",
"description": "Use Sites to build, save, deploy, and inspect websites such as landing pages, portfolios, dashboards, portals, trackers, hubs, games, and internal tools. Always use Sites when .openai/hosting.json exists. Use Sites skills for local implementation, validation, source preparation, and artifact packaging. Use this connector for site creation, runtime environment variables, versions, production deployments, and access controls. Read .openai/hosting.json before creating a site and reuse its project_id when present. Treat Sites IDs and cursors as opaque: copy them exactly from .openai/hosting.json or Sites responses as applicable, and never invent, reformat, derive, or substitute them. Never call create_site more than once for the same local site. Push the exact source state before saving a version. commit_sha must identify that pushed state, and any archive must be built from it. Deploy only saved versions; every Sites deployment URL is production. Inspect deployment status when the initial result is non-terminal or the user asks for progress. Unless the user asks for local-only work or a saved version without deployment, finish deployable site work with a production deployment.\n\nRemove a custom domain from a site. This tool is part of plugin `Sites`.\n\nexec tool declaration:\n```ts\ndeclare const tools: { mcp__codex_apps__sites_remove_custom_domain(args: {\n // Custom domain ID\n custom_domain_id: string;\n // Exact opaque site project ID. Copy it verbatim from .openai/hosting.json's project_id or the id field returned by create_site, list_sites, or get_site. Never invent, modify, or substitute another identifier.\n project_id: string;\n}): Promise<CallToolResult<{ result: {\n // A record targets to use when the custom hostname is a zone apex.\n apex_proxy_ipv4_targets: Array<string>;\n // CNAME target to use for custom subdomains.\n cname_target: string | null;\n created_at: string;\n hostname: string;\n id: string;\n last_error: string | null;\n project_id: string;\n provider_status: string | null;\n ssl_status: string | null;\n status: \"pending\" | \"active\" | \"failed\";\n updated_at: string;\n validation_records: Array<{ name?: string | null; record_type?: string | null; value?: string | null; }>;\n worker_name: string;\n}; }>>; };\n```"
},
{
"name": "mcp__codex_apps__sites_save_site_version",
"description": "Use Sites to build, save, deploy, and inspect websites such as landing pages, portfolios, dashboards, portals, trackers, hubs, games, and internal tools. Always use Sites when .openai/hosting.json exists. Use Sites skills for local implementation, validation, source preparation, and artifact packaging. Use this connector for site creation, runtime environment variables, versions, production deployments, and access controls. Read .openai/hosting.json before creating a site and reuse its project_id when present. Treat Sites IDs and cursors as opaque: copy them exactly from .openai/hosting.json or Sites responses as applicable, and never invent, reformat, derive, or substitute them. Never call create_site more than once for the same local site. Push the exact source state before saving a version. commit_sha must identify that pushed state, and any archive must be built from it. Deploy only saved versions; every Sites deployment URL is production. Inspect deployment status when the initial result is non-terminal or the user asks for progress. Unless the user asks for local-only work or a saved version without deployment, finish deployable site work with a production deployment.\n\nSave a site version only after validating and pushing its source. commit_sha must be the current HEAD of the site's configured source branch. Any archive must come from that exact source state and contain a deployable Sites build. Saving does not deploy the version. Retain version_id for follow-up calls and report the user-facing version number. This tool is part of plugin `Sites`.\n\nexec tool declaration:\n```ts\ndeclare const tools: { mcp__codex_apps__sites_save_site_version(args: {\n // Optional site build tar archive from the source identified by commit_sha. It must contain a supported OpenNext or vinext entrypoint and a valid .openai/hosting.json. This parameter expects an absolute local file path. If you want to upload a file, provide the absolute path to that file here.\n archive?: string;\n // Git commit SHA for the current HEAD of the site's configured source branch. It must identify the source used to build the archive.\n commit_sha: string;\n // Exact opaque site project ID. Copy it verbatim from .openai/hosting.json's project_id or the id field returned by create_site, list_sites, or get_site. Never invent, modify, or substitute another identifier.\n project_id: string;\n}): Promise<CallToolResult<{ result: {\n archive_storage?: { archive_format: string; content_hash: string; file_count?: number | null; sediment_file_id: string; size_bytes?: number | null; } | null;\n // Opaque saved version ID. Pass this exact value as version_id.\n id: string;\n // Opaque site project ID. Pass this exact value as project_id.\n project_id: string;\n screenshot_url?: string | null;\n source: { commit_sha: string; };\n version_number: number;\n}; }>>; };\n```"
},
{
"name": "mcp__codex_apps__sites_update_environment_variables",
"description": "Use Sites to build, save, deploy, and inspect websites such as landing pages, portfolios, dashboards, portals, trackers, hubs, games, and internal tools. Always use Sites when .openai/hosting.json exists. Use Sites skills for local implementation, validation, source preparation, and artifact packaging. Use this connector for site creation, runtime environment variables, versions, production deployments, and access controls. Read .openai/hosting.json before creating a site and reuse its project_id when present. Treat Sites IDs and cursors as opaque: copy them exactly from .openai/hosting.json or Sites responses as applicable, and never invent, reformat, derive, or substitute them. Never call create_site more than once for the same local site. Push the exact source state before saving a version. commit_sha must identify that pushed state, and any archive must be built from it. Deploy only saved versions; every Sites deployment URL is production. Inspect deployment status when the initial result is non-terminal or the user asks for progress. Unless the user asks for local-only work or a saved version without deployment, finish deployable site work with a production deployment.\n\nUpdate production runtime environment variables for a site. Only listed keys change; all others remain unchanged. Store runtime values in Sites, not .openai/hosting.json. Deploy a saved version after any change to apply the new environment revision. This tool is part of plugin `Sites`.\n\nexec tool declaration:\n```ts\ndeclare const tools: { mcp__codex_apps__sites_update_environment_variables(args: {\n // Exact opaque site project ID. Copy it verbatim from .openai/hosting.json's project_id or the id field returned by create_site, list_sites, or get_site. Never invent, modify, or substitute another identifier.\n project_id: string;\n // Case-sensitive environment keys to remove. Do not repeat keys or include a key also present in set_values. Omit or pass an empty list to preserve other keys.\n remove?: Array<string> | null;\n // Environment entries to create or replace. Keys are case-sensitive and must match the application. Do not repeat keys or include a key also listed in remove. Mark sensitive values as secrets.\n set_values: Array<{\n // Set true for sensitive values so they are not returned in plaintext.\n is_secret?: boolean;\n // Required non-empty, case-sensitive environment variable name.\n key: string;\n type?: \"envvar\";\n value: string;\n}>;\n}): Promise<CallToolResult<{ result: { entries: Array<{ is_secret?: boolean; key: string; type?: \"envvar\"; value: string | null; }>; project_id: string; revision: number; updated_at: string | null; }; }>>; };\n```"
},
{
"name": "mcp__codex_apps__sites_update_site_access",
"description": "Use Sites to build, save, deploy, and inspect websites such as landing pages, portfolios, dashboards, portals, trackers, hubs, games, and internal tools. Always use Sites when .openai/hosting.json exists. Use Sites skills for local implementation, validation, source preparation, and artifact packaging. Use this connector for site creation, runtime environment variables, versions, production deployments, and access controls. Read .openai/hosting.json before creating a site and reuse its project_id when present. Treat Sites IDs and cursors as opaque: copy them exactly from .openai/hosting.json or Sites responses as applicable, and never invent, reformat, derive, or substitute them. Never call create_site more than once for the same local site. Push the exact source state before saving a version. commit_sha must identify that pushed state, and any archive must be built from it. Deploy only saved versions; every Sites deployment URL is production. Inspect deployment status when the initial result is non-terminal or the user asks for progress. Unless the user asks for local-only work or a saved version without deployment, finish deployable site work with a production deployment.\n\nUpdate who can visit a site only when the user asks to change access. The owner always remains allowed. For workspace sites, call list_available_access_groups before adding groups and use only the IDs the user selects. This tool is part of plugin `Sites`.\n\nexec tool declaration:\n```ts\ndeclare const tools: { mcp__codex_apps__sites_update_site_access(args: {\n // Required access mode for the site: public grants anyone with the URL; workspace_all grants all active workspace users; custom uses the supplied user and group allowlists.\n access_mode: \"public\" | \"workspace_all\" | \"custom\";\n // Tenant group ID allowlist. IDs must come from list_available_access_groups and belong to the tenant linked to the site workspace. Omit to preserve the existing allowlist; pass an empty list to clear it.\n allowed_tenant_group_ids?: Array<string> | null;\n // User email allowlist. Emails must belong to active users in the site workspace. Omit to preserve the existing allowlist; pass an empty list to clear non-owner users.\n allowed_user_emails?: Array<string> | null;\n // Workspace group ID allowlist. IDs must come from list_available_access_groups and belong to the site workspace. Omit to preserve the existing allowlist; pass an empty list to clear it.\n allowed_workspace_group_ids?: Array<string> | null;\n // Exact opaque site project ID. Copy it verbatim from .openai/hosting.json's project_id or the id field returned by create_site, list_sites, or get_site. Never invent, modify, or substitute another identifier.\n project_id: string;\n}): Promise<CallToolResult<{ result: {\n // Access mode for the app.\n access_mode: \"public\" | \"admins_only\" | \"workspace_all\" | \"custom\";\n // Account user ID allowlist for the app.\n allowed_account_user_ids: Array<string>;\n // Group details resolved from allowed workspace and tenant group IDs.\n allowed_groups: Array<{\n // Group ID to use in an Appgen access policy.\n id: string;\n // Group display name.\n name: string;\n // Total number of members in the group.\n size: number;\n}>;\n // Tenant group ID allowlist for the app.\n allowed_tenant_group_ids: Array<string>;\n // User details resolved from allowed_account_user_ids.\n allowed_users: Array<{\n // Account user ID for the allowed user.\n account_user_id: string;\n // Email address for the allowed user, when available.\n email?: string | null;\n // Display name for the allowed user, when available.\n name?: string | null;\n}>;\n // Workspace group ID allowlist for the app.\n allowed_workspace_group_ids: Array<string>;\n // Appgen project ID\n project_id: string;\n // Monotonic access policy revision.\n revision: number;\n // Access policy update timestamp.\n updated_at: string;\n}; }>>; };\n```"
},
{
"name": "mcp__codex_apps__sites_update_site_metadata",
"description": "Use Sites to build, save, deploy, and inspect websites such as landing pages, portfolios, dashboards, portals, trackers, hubs, games, and internal tools. Always use Sites when .openai/hosting.json exists. Use Sites skills for local implementation, validation, source preparation, and artifact packaging. Use this connector for site creation, runtime environment variables, versions, production deployments, and access controls. Read .openai/hosting.json before creating a site and reuse its project_id when present. Treat Sites IDs and cursors as opaque: copy them exactly from .openai/hosting.json or Sites responses as applicable, and never invent, reformat, derive, or substitute them. Never call create_site more than once for the same local site. Push the exact source state before saving a version. commit_sha must identify that pushed state, and any archive must be built from it. Deploy only saved versions; every Sites deployment URL is production. Inspect deployment status when the initial result is non-terminal or the user asks for progress. Unless the user asks for local-only work or a saved version without deployment, finish deployable site work with a production deployment.\n\nUpdate a site's metadata. Currently, this supports changing its display title; it does not change the site's URL or slug. This tool is part of plugin `Sites`.\n\nexec tool declaration:\n```ts\ndeclare const tools: { mcp__codex_apps__sites_update_site_metadata(args: {\n // Exact opaque site project ID. Copy it verbatim from .openai/hosting.json's project_id or the id field returned by create_site, list_sites, or get_site. Never invent, modify, or substitute another identifier.\n project_id: string;\n // New user-facing site title.\n title: string;\n}): Promise<CallToolResult<{ result: {\n auth_client_id: string | null;\n created_at: string;\n current_live_url: string | null;\n current_preview_url: string | null;\n description: string | null;\n disabled_by?: \"workspace_admin\" | \"openai\" | null;\n // Opaque site project ID. Pass this exact value as project_id.\n id: string;\n latest_version_number: number;\n screenshot_url: string | null;\n slug: string;\n status: \"active\" | \"archived\" | \"suspended\";\n title: string;\n updated_at: string;\n}; }>>; };\n```"
},
{
"name": "mcp__openaiDeveloperDocs__fetch_openai_doc",
"description": "Fetch the markdown for a specific doc page from `developers.openai.com`, `platform.openai.com`, or `learn.chatgpt.com` so you can quote or summarize exact, up-to-date guidance (schemas, examples, limits, and edge cases). Prefer to **`search_openai_docs` first** (or `list_openai_docs` if youre browsing) to find the best URL, then `fetch_openai_doc` to pull the exact text; you can pass `anchor` (for example, `#streaming`) to fetch just that section.\n\nexec tool declaration:\n```ts\ndeclare const tools: { mcp__openaiDeveloperDocs__fetch_openai_doc(args: { anchor?: string; url: string; }): Promise<CallToolResult>; };\n```"
},
{
"name": "mcp__openaiDeveloperDocs__get_openapi_spec",
"description": "Return the OpenAPI spec for a specific API endpoint URL. Optionally filter code samples by language, or return only code samples.\n\nexec tool declaration:\n```ts\ndeclare const tools: { mcp__openaiDeveloperDocs__get_openapi_spec(args: { codeExamplesOnly?: boolean; languages?: Array<string>; url: string; }): Promise<CallToolResult>; };\n```"
},
{
"name": "mcp__openaiDeveloperDocs__list_api_endpoints",
"description": "List all OpenAI API endpoint URLs available in the OpenAPI spec.\n\nexec tool declaration:\n```ts\ndeclare const tools: { mcp__openaiDeveloperDocs__list_api_endpoints(args: { [key: string]: unknown; }): Promise<CallToolResult>; };\n```"
},
{
"name": "mcp__openaiDeveloperDocs__list_openai_docs",
"description": "List or browse pages from `platform.openai.com`, `developers.openai.com`, and `learn.chatgpt.com` that this server crawls (useful when you dont know the right query yet or youre paging through results). Use this whenever you are working with the OpenAI API (including the Responses API), OpenAI API SDKs, ChatGPT Apps SDK, or Codex. Results include URLs—**after `list`, use `fetch_openai_doc`** on a result URL to get the full markdown.\n\nexec tool declaration:\n```ts\ndeclare const tools: { mcp__openaiDeveloperDocs__list_openai_docs(args: { cursor?: string; limit?: number; }): Promise<CallToolResult>; };\n```"
},
{
"name": "mcp__openaiDeveloperDocs__search_openai_docs",
"description": "Search across `platform.openai.com`, `developers.openai.com`, and `learn.chatgpt.com` docs. Use this whenever you are working with the OpenAI API (including the Responses API), OpenAI API SDKs, ChatGPT Apps SDK, or Codex. Results include URLs—**after `search`, use `fetch_openai_doc`** to read/quote the exact markdown.\n\nexec tool declaration:\n```ts\ndeclare const tools: { mcp__openaiDeveloperDocs__search_openai_docs(args: { cursor?: string; limit?: number; query: string; }): Promise<CallToolResult>; };\n```"
},
{
"name": "mcp__sites_design_picker__choose_site_design",
"description": "Use choose_site_design only after the Sites skill generates exactly three comparable one-shot design-option previews. It may be called sequentially for up to four distinct design decisions; wait for each selection before preparing the next picker.\n\nShow exactly three generated site-design options and ask the user a focused choice question. Options may be full-page concepts or HTML-rendered palettes, layouts, typography pairs, and other visual systems. Use only for the Sites one-shot fast path after the previews exist as local PNG, JPEG, or WebP files. The tool may be called sequentially for up to four distinct decisions; wait for each result before calling it again. This tool is part of plugin `Sites`.\n\nexec tool declaration:\n```ts\ndeclare const tools: { mcp__sites_design_picker__choose_site_design(args: {\n // Exactly three comparable generated site-design options.\n options: Array<{\n // Implementation-ready visual and interaction guidance for the generated preview.\n designBrief: string;\n // Stable unique id for the direction.\n id: string;\n // Absolute path to a generated PNG, JPEG, or WebP preview no larger than 8 MB.\n imagePath: string;\n // Short user-facing direction name.\n title: string;\n}>;\n // Focused user-facing question, such as \"Pick a color palette\" or \"Pick a typography pair\".\n question?: string;\n}): Promise<CallToolResult>; };\n```"
},
{
"name": "read_mcp_resource",
"description": "Read a specific resource from an MCP server given the server name and resource URI.\n\nexec tool declaration:\n```ts\ndeclare const tools: { read_mcp_resource(args: {\n // MCP server name exactly as configured. Must match the 'server' field returned by list_mcp_resources.\n server: string;\n // Resource URI to read. Must be one of the URIs returned by list_mcp_resources.\n uri: string;\n}): Promise<unknown>; };\n```"
},
{
"name": "request_plugin_install",
"description": "# Suggest a recommended plugin installation\n\nSuggest installing a plugin from the `<recommended_plugins>` list when it would help with the user's current request. Briefly explain why in `suggest_reason`.\n\nexec tool declaration:\n```ts\ndeclare const tools: { request_plugin_install(args: {\n // Plugin id from the `<recommended_plugins>` list.\n plugin_id: string;\n // Concise one-line user-facing reason why this plugin can help with the current request.\n suggest_reason: string;\n}): Promise<unknown>; };\n```"
},
{
"name": "update_goal",
"description": "Update the existing goal.\nUse this tool only to mark the goal achieved or genuinely blocked.\nSet status to `complete` only when the objective has actually been achieved and no required work remains.\nSet status to `blocked` only when the same blocking condition has repeated for at least three consecutive goal turns, counting the original/user-triggered turn and any automatic continuations, and the agent cannot make meaningful progress without user input or an external-state change.\nIf the user resumes a goal that was previously marked `blocked`, treat the resumed run as a fresh blocked audit. If the same blocking condition then repeats for at least three consecutive resumed goal turns, set status to `blocked` again.\nOnce the blocked threshold is satisfied, do not keep reporting that you are still blocked while leaving the goal active; set status to `blocked`.\nDo not use `blocked` merely because the work is hard, slow, uncertain, incomplete, or would benefit from clarification.\nDo not mark a goal complete merely because its budget is nearly exhausted or because you are stopping work.\nYou cannot use this tool to pause, resume, budget-limit, or usage-limit a goal; those status changes are controlled by the user or system.\nWhen marking a budgeted goal achieved with status `complete`, report the final token usage from the tool result to the user.\n\nexec tool declaration:\n```ts\ndeclare const tools: { update_goal(args: {\n // Required. Set to `complete` only when the objective is achieved and no required work remains. Set to `blocked` only after the same blocking condition has recurred for at least three consecutive goal turns and the agent is at an impasse. After a previously blocked goal is resumed, the resumed run starts a fresh blocked audit.\n status: \"complete\" | \"blocked\";\n}): Promise<unknown>; };\n```"
},
{
"name": "update_plan",
"description": "Updates the task plan.\nProvide an optional explanation and a list of plan items, each with a step and status.\nAt most one step can be in_progress at a time.\n\n\nexec tool declaration:\n```ts\ndeclare const tools: { update_plan(args: {\n // Optional explanation for this plan update.\n explanation?: string;\n // The list of steps\n plan: Array<{\n // Step status.\n status: \"pending\" | \"in_progress\" | \"completed\";\n // Task step text.\n step: string;\n}>;\n}): Promise<unknown>; };\n```"
},
{
"name": "view_image",
"description": "View a local image file from the filesystem when visual inspection is needed. Use this for images already available on disk.\n\nexec tool declaration:\n```ts\ndeclare const tools: { view_image(args: {\n // Image detail level. Defaults to `high`; use `original` to preserve exact resolution.\n detail?: \"high\" | \"original\";\n // Local filesystem path to an image file.\n path: string;\n}): Promise<{\n // Image detail hint returned by view_image. Returns `high` for default resized behavior or `original` when original resolution is preserved.\n detail: \"high\" | \"original\";\n // Data URL for the loaded image.\n image_url: string;\n}>; };\n```"
},
{
"name": "write_stdin",
"description": "Writes characters to an existing unified exec session and returns recent output.\n\nexec tool declaration:\n```ts\ndeclare const tools: { write_stdin(args: {\n // Bytes to write to stdin. Defaults to empty, which polls without writing.\n chars?: string;\n // Output token budget. Defaults to 10000 tokens; larger requests may be capped by policy.\n max_output_tokens?: number;\n // Identifier of the running unified exec session.\n session_id: number;\n // Wait before yielding output. Non-empty writes default to 250 ms and cap at 30000 ms; empty polls wait 5000-300000 ms by default.\n yield_time_ms?: number;\n}): Promise<{\n // Chunk identifier included when the response reports one.\n chunk_id?: string;\n // Process exit code when the command finished during this call.\n exit_code?: number;\n // Approximate token count before output truncation.\n original_token_count?: number;\n // Command output text, possibly truncated.\n output: string;\n // Session identifier to pass to write_stdin when the process is still running.\n session_id?: number;\n // Elapsed wall time spent waiting for output in seconds.\n wall_time_seconds: number;\n}>; };\n```"
},
{
"description": "Request user input for one to three short questions and wait for the response. Set autoResolutionMs, from 60000 to 240000 milliseconds, only when the question is useful but non-blocking and continuing with best judgment is acceptable if the user does not answer; omit it when explicit user input is required. This tool is only available in Plan mode.",
"name": "request_user_input",
"parameters": {
"additionalProperties": false,
"properties": {
"autoResolutionMs": {
"description": "Optional auto-resolution window in milliseconds, from 60000 to 240000. Include this only when the question is useful but non-blocking and continuing with best judgment is acceptable if the user does not answer; omit it when explicit user input is required before continuing. Use 60000 for lightly helpful context and up to 240000 when the answer would materially unblock better work.",
"type": "number"
},
"questions": {
"description": "Questions to show the user. Prefer 1 and do not exceed 3",
"items": {
"additionalProperties": false,
"properties": {
"header": {
"description": "Short header label shown in the UI (12 or fewer chars).",
"type": "string"
},
"id": {
"description": "Stable identifier for mapping answers (snake_case).",
"type": "string"
},
"options": {
"description": "Provide 2-3 mutually exclusive choices. Put the recommended option first and suffix its label with \"(Recommended)\". Do not include an \"Other\" option in this list; the client will add a free-form \"Other\" option automatically.",
"items": {
"additionalProperties": false,
"properties": {
"description": {
"description": "One short sentence explaining impact/tradeoff if selected.",
"type": "string"
},
"label": {
"description": "User-facing label (1-5 words).",
"type": "string"
}
},
"required": [
"label",
"description"
],
"type": "object"
},
"type": "array"
},
"question": {
"description": "Single-sentence prompt shown to the user.",
"type": "string"
}
},
"required": [
"id",
"header",
"question",
"options"
],
"type": "object"
},
"type": "array"
}
},
"required": [
"questions"
],
"type": "object"
},
"strict": false,
"type": "function"
},
{
"external_web_access": false,
"search_content_types": [
"text",
"image"
],
"type": "web_search"
},
{
"description": "Request additional filesystem or network permissions from the user and wait for the client to grant a subset of the requested permission profile. Use environment_id to target a specific attached environment; omit it to use the primary environment. Relative filesystem paths resolve against the selected environment cwd. Granted permissions apply automatically to later shell-like commands in the current turn, or for the rest of the session if the client approves them at session scope.",
"name": "request_permissions",
"parameters": {
"additionalProperties": false,
"properties": {
"environment_id": {
"description": "Environment id from <environment_context>. Omit to use the primary environment.",
"type": "string"
},
"permissions": {
"additionalProperties": false,
"description": "Filesystem or network access request.",
"properties": {
"file_system": {
"additionalProperties": false,
"description": "Filesystem access request.",
"properties": {
"read": {
"description": "Absolute paths to grant read access; omit when none are needed.",
"items": {
"type": "string"
},
"type": "array"
},
"write": {
"description": "Absolute paths to grant write access; omit when none are needed.",
"items": {
"type": "string"
},
"type": "array"
}
},
"type": "object"
},
"network": {
"additionalProperties": false,
"description": "Network access request.",
"properties": {
"enabled": {
"description": "True requests network access; false or omitted requests none.",
"type": "boolean"
}
},
"type": "object"
}
},
"type": "object"
},
"reason": {
"description": "Optional short explanation for why additional permissions are needed.",
"type": "string"
}
},
"required": [
"permissions"
],
"type": "object"
},
"strict": false,
"type": "function"
},
{
"description": "Tools for reading and waiting on time.",
"name": "clock",
"tools": [
{
"description": "Return the current time in UTC.",
"name": "curr_time",
"parameters": {
"additionalProperties": false,
"properties": {},
"type": "object"
},
"strict": false,
"type": "function"
},
{
"description": "Pause execution for a specified duration. The sleep ends early when new input arrives for the active turn. Returns the elapsed wall-clock time.",
"name": "sleep",
"parameters": {
"additionalProperties": false,
"properties": {
"duration_ms": {
"description": "How long to sleep in milliseconds. Must be between 1 and 43200000.",
"type": "number"
}
},
"required": [
"duration_ms"
],
"type": "object"
},
"strict": false,
"type": "function"
}
],
"type": "namespace"
},
{
"description": "Start a new context window. Does not clear, reset, or otherwise affect environment state.",
"name": "new_context",
"parameters": {
"additionalProperties": false,
"properties": {},
"type": "object"
},
"strict": false,
"type": "function"
},
{
"description": "Get the remaining tokens in the current context window.",
"name": "get_context_remaining",
"parameters": {
"additionalProperties": false,
"properties": {},
"type": "object"
},
"strict": false,
"type": "function"
},
{
"description": "Tools for spawning and managing sub-agents.",
"name": "collaboration",
"tools": [
{
"description": "Send a follow-up task to an existing non-root target agent and trigger a turn if it is idle. If the target is already running, deliver the task promptly at message boundaries while sampling, or after the pending tool call completes.",
"name": "followup_task",
"parameters": {
"additionalProperties": false,
"properties": {
"message": {
"description": "Message text to send to the target agent.",
"encrypted": true,
"type": "string"
},
"target": {
"description": "Agent id or canonical task name to send a follow-up task to (from spawn_agent).",
"type": "string"
}
},
"required": [
"target",
"message"
],
"type": "object"
},
"strict": false,
"type": "function"
},
{
"description": "Interrupt an agent's current turn, if any, and return its previous status. The agent remains available for messages and follow-up tasks.",
"name": "interrupt_agent",
"parameters": {
"additionalProperties": false,
"properties": {
"target": {
"description": "Agent id or canonical task name to interrupt (from spawn_agent).",
"type": "string"
}
},
"required": [
"target"
],
"type": "object"
},
"strict": false,
"type": "function"
},
{
"description": "List live agents in the current root thread tree. Optionally filter by task-path prefix.",
"name": "list_agents",
"parameters": {
"additionalProperties": false,
"properties": {
"path_prefix": {
"description": "Task-path prefix filter without a trailing slash. Omit to list all live agents.",
"type": "string"
}
},
"type": "object"
},
"strict": false,
"type": "function"
},
{
"description": "Send a message to an existing agent. The message will be delivered promptly. Does not trigger a new turn.",
"name": "send_message",
"parameters": {
"additionalProperties": false,
"properties": {
"message": {
"description": "Message text to queue on the target agent.",
"encrypted": true,
"type": "string"
},
"target": {
"description": "Relative or canonical task name to message (from spawn_agent).",
"type": "string"
}
},
"required": [
"target",
"message"
],
"type": "object"
},
"strict": false,
"type": "function"
},
{
"description": "\n \n Spawns an agent to work on the specified task. If your current task is `/root/task1` and you spawn_agent with task_name \"task_3\" the agent will have canonical task name `/root/task1/task_3`.\nYou are then able to refer to this agent as `task_3` or `/root/task1/task_3` interchangeably. However an agent `/root/task2/task_3` would only be able to communicate with this agent via its canonical name `/root/task1/task_3`.\nThe spawned agent will have the same tools as you and the ability to spawn its own subagents.\n\nOnly call this tool for a concrete, bounded subtask that can run independently alongside useful local work; otherwise continue locally.\nIt will be able to send you and other running agents messages, and its final answer will be provided to you when it finishes.\nThe new agent's canonical task name will be provided to it along with the message.\n\nNote that passing `fork_turns=\"none\"` will not pass any surrounding context to the spawned subagent, which may cause the agent to lack the context it needs to complete its task, whereas `fork_turns=\"all\"` will provide the subagent with all surrounding context.",
"name": "spawn_agent",
"parameters": {
"additionalProperties": false,
"properties": {
"fork_turns": {
"description": "Optional number of turns to fork. Defaults to `all`. Use `none`, `all`, or a positive integer string such as `3` to fork only the most recent turns.",
"type": "string"
},
"message": {
"description": "Initial plain-text task for the new agent.",
"encrypted": true,
"type": "string"
},
"task_name": {
"description": "Task name for the new agent. Use lowercase letters, digits, and underscores.",
"type": "string"
}
},
"required": [
"task_name",
"message"
],
"type": "object"
},
"strict": false,
"type": "function"
},
{
"description": "Wait for a mailbox update from any live agent, including queued messages and final-status notifications. The wait also ends early when new user input is steered into the active turn. Does not return the content; returns either a summary of which agents have updates (if any), an interruption summary for steered input, or a timeout summary if no activity arrives before the deadline.",
"name": "wait_agent",
"parameters": {
"additionalProperties": false,
"properties": {
"timeout_ms": {
"description": "Timeout in milliseconds. Defaults to 30000, min 10000, max 3600000.",
"type": "number"
}
},
"type": "object"
},
"strict": false,
"type": "function"
}
],
"type": "namespace"
},
{
"description": "Process a CSV by spawning one worker sub-agent per row. The instruction string is a template where `{column}` placeholders are replaced with row values. Each worker must call `report_agent_job_result` with a JSON object (matching `output_schema` when provided); missing reports are treated as failures. This call blocks until all rows finish and automatically exports results to `output_csv_path` (or a default path).",
"name": "spawn_agents_on_csv",
"parameters": {
"additionalProperties": false,
"properties": {
"csv_path": {
"description": "Path to the CSV file containing input rows.",
"type": "string"
},
"id_column": {
"description": "CSV column to use as stable item id. Omit to use row numbers.",
"type": "string"
},
"instruction": {
"description": "Instruction template to apply to each CSV row. Use {column_name} placeholders to inject values from the row.",
"type": "string"
},
"max_concurrency": {
"description": "Maximum concurrent workers for this job. Defaults to 16 and is capped by config.",
"type": "number"
},
"max_runtime_seconds": {
"description": "Maximum runtime per worker before failure. Defaults to 1800 seconds; config may set a different default.",
"type": "number"
},
"max_workers": {
"description": "Alias for max_concurrency. Defaults to 16 and is capped by config.",
"type": "number"
},
"output_csv_path": {
"description": "Output CSV path for exported results. Omit to create one next to the input CSV.",
"type": "string"
},
"output_schema": {
"description": "JSON Schema for each worker result. Omit to accept any result object.",
"properties": {},
"type": "object"
}
},
"required": [
"csv_path",
"instruction"
],
"type": "object"
},
"strict": false,
"type": "function"
},
{
"description": "Wait for a starting environment to become available before continuing.",
"name": "wait_for_environment",
"parameters": {
"additionalProperties": false,
"properties": {
"environment_id": {
"description": "The id of an environment currently marked as starting.",
"type": "string"
}
},
"required": [
"environment_id"
],
"type": "object"
},
"strict": false,
"type": "function"
},
{
"description": "# Tool discovery\n\nSearches over deferred tool metadata with BM25 and exposes matching tools for the next model call.\n\nYou have access to tools from the following sources:\n- Multi-agent tools: Spawn and manage sub-agents.\nSome of the tools may not have been provided to you upfront, and you should use this tool (`tool_search`) to search for the required tools. For MCP tool discovery, always use `tool_search` instead of `list_mcp_resources` or `list_mcp_resource_templates`.",
"execution": "client",
"parameters": {
"additionalProperties": false,
"properties": {
"limit": {
"description": "Maximum number of tools to return. Defaults to 8.",
"type": "number"
},
"query": {
"description": "Search query for deferred tools.",
"type": "string"
}
},
"required": [
"query"
],
"type": "object"
},
"type": "tool_search"
},
{
"description": "Runs a shell command and returns its output.\n- Always set the `workdir` param when using the shell_command function. Do not use `cd` unless absolutely necessary.",
"name": "shell_command",
"parameters": {
"additionalProperties": false,
"properties": {
"command": {
"description": "Shell script to run in the user's default shell.",
"type": "string"
},
"justification": {
"description": "User-facing approval question for `require_escalated`; omit otherwise.",
"type": "string"
},
"login": {
"description": "True runs with login shell semantics; false disables them. Defaults to true.",
"type": "boolean"
},
"prefix_rule": {
"description": "Reusable approval prefix for `cmd`, only with `sandbox_permissions: \"require_escalated\"`; for example [\"git\", \"pull\"].",
"items": {
"type": "string"
},
"type": "array"
},
"sandbox_permissions": {
"description": "Per-command sandbox override. Defaults to `use_default`; use `require_escalated` for unsandboxed execution.",
"enum": [
"use_default",
"require_escalated"
],
"type": "string"
},
"timeout_ms": {
"description": "Maximum command runtime. Defaults to 10000 ms.",
"type": "number"
},
"workdir": {
"description": "Working directory for the command. Defaults to the turn cwd.",
"type": "string"
}
},
"required": [
"command"
],
"type": "object"
},
"strict": false,
"type": "function"
},
{
"description": "Run JavaScript code to orchestrate/compose tool calls\n- Evaluates the provided JavaScript code in a fresh V8 isolate as an async module.\n- All nested tools are available on the global `tools` object, for example `await tools.exec_command(...)`. Tool names are exposed as normalized JavaScript identifiers, for example `await tools.mcp__ologs__get_profile(...)`.\n- Nested tool methods take either a string or an object as their input argument.\n- Nested tools return either an object or a string, based on the description.\n- Runs raw JavaScript -- no Node, no file system, no network access, no console.\n- Accepts raw JavaScript source text, not JSON, quoted strings, or markdown code fences.\n- You may optionally start the tool input with a first-line pragma like `// @exec: {\"yield_time_ms\": 10000, \"max_output_tokens\": 1000}`.\n- `yield_time_ms` asks `exec` to yield early if the script is still running. Defaults to 10000 ms.\n- `max_output_tokens` sets the token budget for direct `exec` results. Defaults to 10000 tokens.\n- When the JS code is fully evaluated, the isolate's lifetime ends and unawaited promises are silently discarded.\n\n- Global helpers:\n- `exit()`: Immediately ends the current script successfully (like an early return from the top level).\n- `text(value: string | number | boolean | undefined | null)`: Appends a text item. Non-string values are stringified with `JSON.stringify(...)` when possible.\n- `image(imageUrlOrItem: string | { image_url: string; detail?: \"auto\" | \"low\" | \"high\" | \"original\" | null } | ImageContent, detail?: \"auto\" | \"low\" | \"high\" | \"original\" | null)`: Appends an image item. `image_url` should be a base64-encoded `data:` URL. To forward an MCP tool image, pass an individual `ImageContent` block from `result.content`, for example `image(result.content[0])`. MCP image blocks may request detail with `_meta: { \"codex/imageDetail\": \"original\" }`. When provided, the second `detail` argument overrides any detail embedded in the first argument.\n- `generatedImage(result: { image_url: string; output_hint?: string })`: Appends an image-generation result and its optional output hint. HTTP(S) URLs are not supported.\n- `store(key: string, value: any)`: stores a serializable value under a string key for later `exec` calls in the same session.\n- `load(key: string)`: returns the stored value for a string key, or `undefined` if it is missing.\n- `notify(value: string | number | boolean | undefined | null)`: immediately injects an extra `custom_tool_call_output` for the current `exec` call. Values are stringified like `text(...)`.\n- `setTimeout(callback: () => void, delayMs?: number)`: schedules a callback to run later and returns a timeout id. Pending timeouts do not keep `exec` alive by themselves; await an explicit promise if you need to wait for one.\n- `clearTimeout(timeoutId?: number)`: cancels a timeout created by `setTimeout`.\n- `ALL_TOOLS`: metadata for the enabled nested tools as `{ name, description }` entries.\n- `yield_control()`: yields the accumulated output to the model immediately while the script keeps running.\n\nSome deferred nested tools may be omitted from this description. They are still available on the global `tools` object and listed in `ALL_TOOLS`.\nTo find one, filter `ALL_TOOLS` by `name` and `description`.",
"format": {
"definition": "\nstart: pragma_source | plain_source\npragma_source: PRAGMA_LINE NEWLINE SOURCE\nplain_source: SOURCE\n\nPRAGMA_LINE: /[ \\t]*\\/\\/ @exec:[^\\r\\n]*/\nNEWLINE: /\\r?\\n/\nSOURCE: /[\\s\\S]+/\n",
"syntax": "lark",
"type": "grammar"
},
"name": "exec",
"type": "custom"
},
{
"description": "Waits on a yielded `exec` cell and returns new output or completion.\n- Use `wait` only after `exec` returns `Script running with cell ID ...`.\n- `cell_id` identifies the running `exec` cell to resume.\n- `yield_time_ms` controls how long to wait for more output before yielding again. Defaults to 10000 ms.\n- `max_tokens` limits how much new output this wait call returns. Defaults to 10000 tokens.\n- `terminate: true` stops the running cell; false or omitted waits for output.\n- `wait` returns only the new output since the last yield, or the final completion or termination result for that cell.\n- If the cell is still running, `wait` may yield again with the same `cell_id`.\n- If the cell has already finished, `wait` returns the completed result and closes the cell.",
"name": "wait",
"parameters": {
"additionalProperties": false,
"properties": {
"cell_id": {
"description": "Identifier of the running exec cell.",
"type": "string"
},
"max_tokens": {
"description": "Output token budget for this wait call. Defaults to 10000 tokens.",
"type": "number"
},
"terminate": {
"description": "True stops the running exec cell; false or omitted waits for output.",
"type": "boolean"
},
"yield_time_ms": {
"description": "Wait before yielding more output. Defaults to 10000 ms.",
"type": "number"
}
},
"required": [
"cell_id"
],
"type": "object"
},
"strict": false,
"type": "function"
},
{
"type": "namespace",
"name": "mcp__computer_use",
"description": "Tools in the mcp__computer_use namespace.",
"tools": [
{
"type": "function",
"name": "click",
"description": "Click an element by index or pixel coordinates from screenshot",
"strict": false,
"parameters": {
"type": "object",
"properties": {
"app": {
"type": "string",
"description": "App name, full app path, or unambiguous bundle identifier"
},
"click_count": {
"type": "integer",
"description": "Number of clicks. Defaults to 1"
},
"element_index": {
"type": "string",
"description": "Element index to click"
},
"mouse_button": {
"type": "string",
"description": "Mouse button to click. Defaults to left.",
"enum": [
"left",
"right",
"middle"
]
},
"x": {
"type": "number",
"description": "X coordinate in screenshot pixel coordinates"
},
"y": {
"type": "number",
"description": "Y coordinate in screenshot pixel coordinates"
}
},
"required": [
"app"
],
"additionalProperties": false
}
},
{
"type": "function",
"name": "drag",
"description": "Drag from one point to another using pixel coordinates",
"strict": false,
"parameters": {
"type": "object",
"properties": {
"app": {
"type": "string",
"description": "App name, full app path, or unambiguous bundle identifier"
},
"from_x": {
"type": "number",
"description": "Start X coordinate"
},
"from_y": {
"type": "number",
"description": "Start Y coordinate"
},
"to_x": {
"type": "number",
"description": "End X coordinate"
},
"to_y": {
"type": "number",
"description": "End Y coordinate"
}
},
"required": [
"app",
"from_x",
"from_y",
"to_x",
"to_y"
],
"additionalProperties": false
}
},
{
"type": "function",
"name": "get_app_state",
"description": "Start an app use session if needed, then get the state of the app's key window and return a screenshot and accessibility tree. This must be called once per assistant turn before interacting with the app",
"strict": false,
"parameters": {
"type": "object",
"properties": {
"app": {
"type": "string",
"description": "App name, full app path, or unambiguous bundle identifier"
}
},
"required": [
"app"
],
"additionalProperties": false
}
},
{
"type": "function",
"name": "list_apps",
"description": "List the apps on this computer. Returns the set of apps that are currently running, as well as any that have been used in the last 14 days, including details on usage frequency",
"strict": false,
"parameters": {
"type": "object",
"properties": {},
"additionalProperties": false
}
},
{
"type": "function",
"name": "perform_secondary_action",
"description": "Invoke a secondary accessibility action exposed by an element",
"strict": false,
"parameters": {
"type": "object",
"properties": {
"action": {
"type": "string",
"description": "Secondary accessibility action name"
},
"app": {
"type": "string",
"description": "App name, full app path, or unambiguous bundle identifier"
},
"element_index": {
"type": "string",
"description": "Element identifier"
}
},
"required": [
"app",
"element_index",
"action"
],
"additionalProperties": false
}
},
{
"type": "function",
"name": "press_key",
"description": "Press a key or key-combination on the keyboard, including modifier and navigation keys.\n - This supports xdotool's `key` syntax.\n - Examples: \"a\", \"Return\", \"Tab\", \"super+c\", \"Up\", \"KP_0\" (for the numpad 0 key).",
"strict": false,
"parameters": {
"type": "object",
"properties": {
"app": {
"type": "string",
"description": "App name, full app path, or unambiguous bundle identifier"
},
"key": {
"type": "string",
"description": "Key or key combination to press"
}
},
"required": [
"app",
"key"
],
"additionalProperties": false
}
},
{
"type": "function",
"name": "scroll",
"description": "Scroll an element in a direction by a number of pages",
"strict": false,
"parameters": {
"type": "object",
"properties": {
"app": {
"type": "string",
"description": "App name, full app path, or unambiguous bundle identifier"
},
"direction": {
"type": "string",
"description": "Scroll direction: up, down, left, or right"
},
"element_index": {
"type": "string",
"description": "Element identifier"
},
"pages": {
"type": "number",
"description": "Number of pages to scroll. Fractional values are supported. Defaults to 1"
}
},
"required": [
"app",
"element_index",
"direction"
],
"additionalProperties": false
}
},
{
"type": "function",
"name": "select_text",
"description": "Select text inside a text element, or place the text cursor before or after it. Provide text exactly as it appears in the accessibility tree, including any Markdown formatting. If the text is not unique, provide surrounding prefix or suffix text to disambiguate it.",
"strict": false,
"parameters": {
"type": "object",
"properties": {
"app": {
"type": "string",
"description": "App name or bundle identifier"
},
"element_index": {
"type": "string",
"description": "Text element identifier"
},
"prefix": {
"type": "string",
"description": "Optional text immediately before the target, used to disambiguate repeated matches"
},
"selection": {
"type": "string",
"description": "Whether to select the text or place the cursor before or after it. Defaults to text.",
"enum": [
"text",
"cursor_before",
"cursor_after"
]
},
"suffix": {
"type": "string",
"description": "Optional text immediately after the target, used to disambiguate repeated matches"
},
"text": {
"type": "string",
"description": "Target text as shown in the accessibility tree"
}
},
"required": [
"app",
"element_index",
"text"
],
"additionalProperties": false
}
},
{
"type": "function",
"name": "set_value",
"description": "Set the value of a settable accessibility element",
"strict": false,
"parameters": {
"type": "object",
"properties": {
"app": {
"type": "string",
"description": "App name, full app path, or unambiguous bundle identifier"
},
"element_index": {
"type": "string",
"description": "Element identifier"
},
"value": {
"type": "string",
"description": "Value to assign"
}
},
"required": [
"app",
"element_index",
"value"
],
"additionalProperties": false
}
},
{
"type": "function",
"name": "type_text",
"description": "Type literal text using keyboard input",
"strict": false,
"parameters": {
"type": "object",
"properties": {
"app": {
"type": "string",
"description": "App name, full app path, or unambiguous bundle identifier"
},
"text": {
"type": "string",
"description": "Literal text to type"
}
},
"required": [
"app",
"text"
],
"additionalProperties": false
}
}
]
},
{
"type": "namespace",
"name": "mcp__event_stream",
"description": "Tools in the mcp__event_stream namespace.",
"tools": [
{
"type": "function",
"name": "event_stream_start",
"description": "Start recording the user's actions for up to 30 minutes. If a recording is already active, return that active session instead of starting another one.",
"strict": false,
"parameters": {
"type": "object",
"properties": {},
"additionalProperties": false
}
},
{
"type": "function",
"name": "event_stream_status",
"description": "Get the current or most recent Record & Replay recording status including paths to metadata and events during the recording.",
"strict": false,
"parameters": {
"type": "object",
"properties": {},
"additionalProperties": false
}
},
{
"type": "function",
"name": "event_stream_stop",
"description": "Stop the active event stream recording if one is running and return status including paths to metadata and events during the recording.",
"strict": false,
"parameters": {
"type": "object",
"properties": {},
"additionalProperties": false
}
}
]
},
{
"type": "namespace",
"name": "mcp__openai_api_key_local_confirmation",
"description": "Use confirm_openai_api_key_local_destination after the OpenAI Platform picker returns a key name and target ids. It asks the developer to confirm or edit the local env-file destination before a secret is created or written.",
"tools": [
{
"type": "function",
"name": "confirm_ope_8781ece2af3d",
"description": "Ask the developer to confirm or edit the local env-file destination for a new OpenAI API key. Call this after the Platform picker returns the confirmed key name and target ids, and proceed only when it returns approved.",
"strict": false,
"parameters": {
"type": "object",
"properties": {
"envName": {
"type": "string",
"description": "Environment variable name to create or update. Defaults to OPENAI_API_KEY."
},
"targetPath": {
"type": "string",
"description": "Recommended env-file path inside the workspace, such as .env.local."
},
"workspacePath": {
"type": "string",
"description": "Absolute workspace root used to confine the local env-file write."
}
},
"required": [
"workspacePath",
"targetPath"
]
}
}
]
},
{
"type": "namespace",
"name": "mcp__codex_security",
"description": "Tools in the mcp__codex_security namespace.",
"tools": [
{
"type": "function",
"name": "await_codex_security_scan_start",
"description": "Wait for the user to press Start scan in an open Codex Security workspace. Call this immediately after open_codex_security_workspace and keep the current turn active. The result supplies the durable scan ID and, when needed, a handoff claim token for get_codex_security_scan_context.",
"strict": false,
"parameters": {
"type": "object",
"properties": {
"sessionId": {
"type": "string"
}
},
"required": [
"sessionId"
]
}
},
{
"type": "function",
"name": "complete_codex_security_scan",
"description": "Validate and index finalized scan artifacts, then mark the Codex Security scan complete.",
"strict": false,
"parameters": {
"type": "object",
"properties": {
"scanId": {
"type": "string"
}
},
"required": [
"scanId"
]
}
},
{
"type": "function",
"name": "fail_codex_security_scan",
"description": "Permanently mark a launched Codex Security scan as failed after an unrecoverable blocker or explicit cancellation. This terminal action cannot be resumed; incomplete or otherwise resumable work must remain running.",
"strict": false,
"parameters": {
"type": "object",
"properties": {
"message": {
"type": "string"
},
"scanId": {
"type": "string"
}
},
"required": [
"message",
"scanId"
]
}
},
{
"type": "function",
"name": "get_codex_security_scan_context",
"description": "Load the authoritative target, mode, optional user context, artifact directory, live progress, and optional selected finding for a launched scan. Validated legacy finding details may be migrated.",
"strict": false,
"parameters": {
"type": "object",
"properties": {
"handoffClaimToken": {
"description": "Opaque delivery token returned by await_codex_security_scan_start or the explicit recovery action. Pass it once so Codex can acknowledge that this continuation received the scan.",
"anyOf": [
{
"type": "string"
},
{
"type": "string"
}
]
},
"occurrenceId": {
"type": "string",
"description": "Optional finding occurrence to include even when it is outside the bounded findings prefix."
},
"scanId": {
"type": "string"
}
},
"required": [
"scanId"
]
}
},
{
"type": "function",
"name": "open_codex_security_triage_results",
"description": "Render an existing triage-finding/v0 result in the Codex Security app as a dense table with one row per supplied finding. This does not create a scan, queue, or durable scanId.",
"strict": false,
"parameters": {
"type": "object",
"properties": {
"result": {
"type": "object",
"description": "A complete triage-finding/v0 JSON result to render as a dense findings table.",
"properties": {
"findings": {
"type": "array",
"items": {
"type": "object",
"properties": {
"affected_locations": {
"type": "array",
"items": {
"type": "object",
"properties": {
"detail": {
"type": "string"
},
"label": {
"type": "string"
},
"lines": {
"type": "string"
},
"path": {
"type": "string"
}
},
"required": [
"detail",
"label",
"lines",
"path"
],
"additionalProperties": false
}
},
"boundary_assessment": {
"type": "object",
"properties": {
"boundary_crossed": {
"anyOf": [
{
"type": "boolean"
},
{
"type": "null"
}
]
},
"policy_basis": {
"type": "string"
},
"product_surface": {
"type": "string"
},
"source_trust": {
"type": "string",
"enum": [
"untrusted",
"trusted_operator",
"trusted_developer_config",
"local_only",
"unknown"
]
}
},
"required": [
"boundary_crossed",
"policy_basis",
"product_surface",
"source_trust"
],
"additionalProperties": false
},
"confidence": {
"type": "string",
"enum": [
"high",
"medium",
"low"
]
},
"counterevidence": {
"type": "array",
"items": {
"type": "string"
}
},
"evidence": {
"type": "array",
"items": {
"type": "string"
}
},
"exploitability_stack_rank": {
"type": "object",
"properties": {
"drivers": {
"type": "array",
"items": {
"type": "string"
}
},
"rank": {
"anyOf": [
{
"type": "integer"
},
{
"type": "null"
}
]
},
"rank_queue": {
"anyOf": [
{
"type": "string",
"enum": [
"confirmed",
"needs_review"
]
},
{
"type": "null"
}
]
},
"rationale": {
"type": "string"
}
},
"required": [
"drivers",
"rank",
"rank_queue",
"rationale"
],
"additionalProperties": false
},
"fix_finding_handoff": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"input_id": {
"type": "string"
},
"normalized_input": {
"type": "object",
"properties": {
"affected_version_or_path": {
"type": "string"
},
"claimed_control": {
"type": "string"
},
"claimed_sink": {
"type": "string"
},
"claimed_source": {
"type": "string"
},
"impact": {
"type": "string"
},
"preconditions": {
"type": "array",
"items": {
"type": "string"
}
},
"references": {
"type": "array",
"items": {
"type": "string"
}
},
"vulnerable_component": {
"type": "string"
}
},
"required": [
"affected_version_or_path",
"claimed_control",
"claimed_sink",
"claimed_source",
"impact",
"preconditions",
"references",
"vulnerable_component"
],
"additionalProperties": false
},
"proof_gaps": {
"type": "array",
"items": {
"type": "string"
}
},
"reachable_path": {
"type": "array",
"items": {
"type": "string"
}
},
"recommended_next_step": {
"type": "string"
},
"source_type": {
"type": "string",
"enum": [
"sarif",
"cve",
"advisory",
"scanner_ticket",
"bug_bounty",
"codex_security_finding",
"freeform",
"unknown"
]
},
"title": {
"type": "string"
},
"triage_item_id": {
"type": "string"
},
"verdict": {
"type": "string",
"enum": [
"confirmed",
"not_actionable",
"needs_review"
]
}
},
"required": [
"affected_locations",
"boundary_assessment",
"confidence",
"counterevidence",
"evidence",
"exploitability_stack_rank",
"fix_finding_handoff",
"input_id",
"normalized_input",
"proof_gaps",
"reachable_path",
"recommended_next_step",
"source_type",
"title",
"triage_item_id",
"verdict"
],
"additionalProperties": false
}
},
"repository": {
"type": "object",
"properties": {
"path": {
"type": "string"
},
"revision": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
}
},
"required": [
"path"
],
"additionalProperties": false
},
"schema_version": {
"type": "string",
"enum": [
"triage-finding/v0"
]
}
},
"required": [
"findings",
"repository",
"schema_version"
],
"additionalProperties": false
}
},
"required": [
"result"
]
}
},
{
"type": "function",
"name": "open_codex_security_workspace",
"description": "Create a native Codex Security workspace with the target and requested standard, diff, or deep mode, or reopen one owned by this thread by passing only sessionId. Scope is inside targetPath; use '.' or omit scope for the whole target. The existing Codex Security skills remain authoritative for scan execution.",
"strict": false,
"parameters": {
"type": "object",
"properties": {
"capabilityPreflight": {
"type": "object",
"description": "Optional capability preflight retained only for non-app legacy callers. Do not include it when opening the setup workspace; the scan workflow performs its authoritative preflight after setup is submitted.",
"properties": {
"issues": {
"type": "array",
"items": {
"type": "object",
"properties": {
"capability": {
"type": "string"
},
"reason": {
"type": "string"
},
"severity": {
"type": "string",
"enum": [
"block",
"warn",
"suggest"
]
},
"status": {
"type": "string",
"enum": [
"fail",
"unknown"
]
}
},
"required": [
"capability",
"reason",
"severity",
"status"
],
"additionalProperties": false
}
},
"profile": {
"type": "string"
},
"remediation": {
"type": "object",
"properties": {
"note": {
"type": "string"
},
"patches": {
"type": "array",
"items": {
"type": "object",
"properties": {
"kind": {
"type": "string",
"enum": [
"config",
"host_setting"
]
},
"path": {
"type": "string"
},
"value": {
"anyOf": [
{
"type": "string"
},
{
"type": "number"
},
{
"type": "boolean"
}
]
}
},
"required": [
"path",
"value"
],
"additionalProperties": false
}
},
"summary": {
"type": "string"
}
},
"additionalProperties": false
},
"status": {
"type": "string",
"enum": [
"ready",
"blocked",
"incomplete"
]
}
},
"required": [
"issues",
"profile",
"status"
],
"additionalProperties": false
},
"diffTarget": {
"description": "Exact local Git revisions for Review changes mode.",
"oneOf": [
{
"type": "object",
"properties": {
"baseRevision": {
"type": "string"
},
"contentDigest": {
"type": "string"
},
"headRevision": {
"type": "string"
},
"kind": {
"type": "string",
"enum": [
"working_tree"
]
}
},
"required": [
"kind"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"baseRevision": {
"type": "string"
},
"headRevision": {
"type": "string"
},
"kind": {
"type": "string",
"enum": [
"commit"
]
}
},
"required": [
"kind",
"headRevision"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"baseRevision": {
"type": "string"
},
"headRevision": {
"type": "string"
},
"kind": {
"type": "string",
"enum": [
"range"
]
}
},
"required": [
"kind",
"baseRevision",
"headRevision"
],
"additionalProperties": false
}
]
},
"mode": {
"type": "string",
"description": "Initial scan mode inferred from the user's request.",
"enum": [
"diff",
"standard",
"deep"
]
},
"scope": {
"type": "string",
"description": "Optional directory inside targetPath. Use '.' or omit it for the whole target. Target-relative paths are preferred; absolute paths inside targetPath are normalized."
},
"sessionId": {
"type": "string",
"description": "Existing workspace ID to reopen without changing its setup. When provided, omit all other fields."
},
"targetPath": {
"type": "string",
"description": "Optional resolved local target path."
},
"targetSummary": {
"type": "string",
"description": "Optional bounded target/security context."
},
"targetTitle": {
"type": "string",
"description": "Optional human-readable target name."
},
"userContext": {
"type": "string",
"description": "Optional security focus supplied by the user."
}
}
}
},
{
"type": "function",
"name": "request_codex_security_user_input",
"description": "Fallback for interactive Codex Security workflows when the host-native request_user_input tool is unavailable. Presents one to three non-sensitive multiple-choice questions through standard MCP form elicitation and waits for the user's response. Never call this tool in headless, automation, or other non-interactive sessions.",
"strict": false,
"parameters": {
"type": "object",
"properties": {
"questions": {
"type": "array",
"description": "One to three non-sensitive multiple-choice questions for an interactive Codex Security workflow.",
"items": {
"type": "object",
"properties": {
"header": {
"type": "string"
},
"id": {
"type": "string"
},
"options": {
"type": "array",
"items": {
"type": "object",
"properties": {
"description": {
"type": "string"
},
"label": {
"type": "string"
}
},
"required": [
"description",
"label"
],
"additionalProperties": false
}
},
"question": {
"type": "string"
}
},
"required": [
"header",
"id",
"options",
"question"
],
"additionalProperties": false
}
}
},
"required": [
"questions"
]
}
},
{
"type": "function",
"name": "set_codex_security_capability_preflight",
"description": "Model-only legacy setup compatibility for non-app callers. Do not call this tool for a setup app workspace with setup.submitted=false; wait for the user to press Start scan and receive the app-generated scanId. Do not call this tool after an app-generated scanId either. Continue after a ready result. For a blocked or incomplete result, follow the documented remediation handling and wait for the user's answer when remediation is actionable. Do not fail automatically for declined or unavailable remediation, helper errors, or a non-ready rerun; preserve the running scan and retry or hand off while recovery may still be possible. Call fail_codex_security_scan only after documented recovery is exhausted and the blocker is confirmed unrecoverable, or when the user explicitly cancels.",
"strict": false,
"parameters": {
"type": "object",
"properties": {
"capabilityPreflight": {
"type": "object",
"description": "Fresh compact capability preflight for non-app legacy callers, including a ready result with an empty issues list after a clean check.",
"properties": {
"issues": {
"type": "array",
"items": {
"type": "object",
"properties": {
"capability": {
"type": "string"
},
"reason": {
"type": "string"
},
"severity": {
"type": "string",
"enum": [
"block",
"warn",
"suggest"
]
},
"status": {
"type": "string",
"enum": [
"fail",
"unknown"
]
}
},
"required": [
"capability",
"reason",
"severity",
"status"
],
"additionalProperties": false
}
},
"profile": {
"type": "string"
},
"remediation": {
"type": "object",
"properties": {
"note": {
"type": "string"
},
"patches": {
"type": "array",
"items": {
"type": "object",
"properties": {
"kind": {
"type": "string",
"enum": [
"config",
"host_setting"
]
},
"path": {
"type": "string"
},
"value": {
"anyOf": [
{
"type": "string"
},
{
"type": "number"
},
{
"type": "boolean"
}
]
}
},
"required": [
"path",
"value"
],
"additionalProperties": false
}
},
"summary": {
"type": "string"
}
},
"additionalProperties": false
},
"status": {
"type": "string",
"enum": [
"ready",
"blocked",
"incomplete"
]
}
},
"required": [
"issues",
"profile",
"status"
],
"additionalProperties": false
},
"mode": {
"type": "string",
"description": "Scan mode that was checked.",
"enum": [
"diff",
"standard",
"deep"
]
},
"sessionId": {
"type": "string"
},
"targetPath": {
"type": "string",
"description": "Absolute local target path that was checked."
}
},
"required": [
"capabilityPreflight",
"mode",
"sessionId",
"targetPath"
]
}
},
{
"type": "function",
"name": "set_codex_security_finding_remediation",
"description": "Persist the bounded local remediation workflow state for a completed finding. The UI may mark a request as queued; Codex records generated, applied, verifying, verified, or failed states after performing the corresponding work.",
"strict": false,
"parameters": {
"type": "object",
"properties": {
"actionToken": {
"type": "string"
},
"baseRevision": {
"type": "string"
},
"expectedVersion": {
"type": "integer"
},
"occurrenceId": {
"type": "string"
},
"patchDigest": {
"type": "string"
},
"patchPath": {
"type": "string"
},
"requestId": {
"type": "string"
},
"state": {
"type": "string",
"enum": [
"generated",
"applied",
"verifying",
"verified",
"failed"
]
},
"summary": {
"type": "string"
},
"verificationSummary": {
"type": "string"
}
},
"required": [
"actionToken",
"expectedVersion",
"occurrenceId",
"requestId",
"state"
]
}
},
{
"type": "function",
"name": "set_codex_security_resolved_diff",
"description": "Record exact local Git revisions after resolving a user's free-form change request. Do not change the selected checkout. Resolve refs to commits before calling this tool; use a concise human-readable target summary.",
"strict": false,
"parameters": {
"type": "object",
"properties": {
"diffTarget": {
"oneOf": [
{
"type": "object",
"properties": {
"baseRevision": {
"type": "string"
},
"contentDigest": {
"type": "string"
},
"headRevision": {
"type": "string"
},
"kind": {
"type": "string",
"enum": [
"working_tree"
]
}
},
"required": [
"kind"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"baseRevision": {
"type": "string"
},
"headRevision": {
"type": "string"
},
"kind": {
"type": "string",
"enum": [
"commit"
]
}
},
"required": [
"kind",
"headRevision"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"baseRevision": {
"type": "string"
},
"headRevision": {
"type": "string"
},
"kind": {
"type": "string",
"enum": [
"range"
]
}
},
"required": [
"kind",
"baseRevision",
"headRevision"
],
"additionalProperties": false
}
]
},
"requestId": {
"type": "string"
},
"sessionId": {
"type": "string"
},
"targetSummary": {
"type": "string"
}
},
"required": [
"diffTarget",
"requestId",
"sessionId",
"targetSummary"
]
}
},
{
"type": "function",
"name": "update_codex_security_scan_progress",
"description": "Record a meaningful live scan phase or coverage milestone in the Codex Security workbench.",
"strict": false,
"parameters": {
"type": "object",
"properties": {
"deepReviewPass": {
"type": "integer",
"description": "Current Deep Scan discovery pass. Send it when starting each pass together with that pass's total and zero completed items."
},
"phase": {
"type": "string",
"description": "Current workflow phase. Send it immediately when the scan enters a new phase so the live workspace advances.",
"enum": [
"preflight",
"threat_model",
"discovery",
"validation",
"attack_path",
"reporting"
]
},
"reportableFindingsCount": {
"type": "integer"
},
"reviewItemsCompleted": {
"type": "integer",
"description": "Cumulative completed review receipts in the current discovery pass. Increment only after a review and its coverage receipt are complete."
},
"reviewItemsTotal": {
"type": "integer",
"description": "Expected review receipts in the current discovery pass, fixed after the worklist and worker assignments are known."
},
"scanId": {
"type": "string"
}
},
"required": [
"scanId"
]
}
}
]
},
{
"type": "function",
"name": "automation_update",
"description": "Create, update, view, or delete recurring automations in the Codex app. Use this when the user asks for a scheduled task, automation, recurring run, repeated task, reminder, follow-up, monitor, or asks you to watch something, keep an eye on it, check back later, wake up later, notify them, or keep working later. New cron automations run as standalone local jobs against one project; use list_projects to find its project id. Heartbeat automations are proactive follow-ups attached to the current local thread. Prefer heartbeats for requests to continue this thread later, especially below one hour. Never write raw automation directives by hand, show raw RRULE strings to the user, or create a workaround cron automation for a thread heartbeat unless the user explicitly asks for that. For requests about existing automations, inspect $CODEX_HOME/automations/*/automation.toml to find matching automation ids by name or prompt. Prefer updating an existing automation over creating a duplicate. For updates, preserve existing fields unless the user asks to change them, and call automation_update with the resolved id and full updated fields.",
"inputSchema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"oneOf": [
{
"type": "object",
"properties": {
"mode": {
"type": "string",
"const": "view"
},
"id": {
"$ref": "#/$defs/__schema0"
}
},
"required": [
"mode",
"id"
],
"additionalProperties": false
},
{
"oneOf": [
{
"type": "object",
"properties": {
"name": {
"$ref": "#/$defs/__schema2"
},
"prompt": {
"$ref": "#/$defs/__schema3"
},
"rrule": {
"$ref": "#/$defs/__schema4"
},
"status": {
"$ref": "#/$defs/__schema5"
},
"kind": {
"$ref": "#/$defs/__schema6"
},
"projectId": {
"$ref": "#/$defs/__schema7"
},
"model": {
"$ref": "#/$defs/__schema8"
},
"reasoningEffort": {
"$ref": "#/$defs/__schema9"
},
"mode": {
"$ref": "#/$defs/__schema10"
},
"destination": {
"type": "string",
"const": "local"
},
"executionEnvironment": {
"type": "string",
"const": "local"
}
},
"required": [
"name",
"prompt",
"rrule",
"status",
"kind",
"projectId",
"model",
"reasoningEffort",
"mode",
"executionEnvironment"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"name": {
"$ref": "#/$defs/__schema2"
},
"prompt": {
"$ref": "#/$defs/__schema3"
},
"rrule": {
"$ref": "#/$defs/__schema4"
},
"status": {
"$ref": "#/$defs/__schema5"
},
"kind": {
"$ref": "#/$defs/__schema11"
},
"destination": {
"$ref": "#/$defs/__schema12"
},
"targetThreadId": {
"$ref": "#/$defs/__schema13"
},
"mode": {
"$ref": "#/$defs/__schema10"
}
},
"required": [
"name",
"prompt",
"rrule",
"status",
"kind",
"mode"
],
"additionalProperties": false
}
]
},
{
"oneOf": [
{
"type": "object",
"properties": {
"name": {
"$ref": "#/$defs/__schema2"
},
"prompt": {
"$ref": "#/$defs/__schema3"
},
"rrule": {
"$ref": "#/$defs/__schema14"
},
"status": {
"$ref": "#/$defs/__schema5"
},
"kind": {
"$ref": "#/$defs/__schema6"
},
"projectId": {
"$ref": "#/$defs/__schema7"
},
"model": {
"$ref": "#/$defs/__schema8"
},
"reasoningEffort": {
"$ref": "#/$defs/__schema9"
},
"mode": {
"$ref": "#/$defs/__schema15"
},
"id": {
"$ref": "#/$defs/__schema0"
},
"destination": {
"type": "string",
"enum": [
"local",
"worktree"
]
},
"executionEnvironment": {
"description": "Cron automation execution environment. New automations must use local; updates may preserve worktree for existing automations.",
"type": "string",
"enum": [
"worktree",
"local"
]
},
"localEnvironmentConfigPath": {
"anyOf": [
{
"type": "string",
"minLength": 1
},
{
"type": "null"
}
]
}
},
"required": [
"name",
"prompt",
"rrule",
"status",
"kind",
"projectId",
"model",
"reasoningEffort",
"mode",
"id",
"executionEnvironment"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"name": {
"$ref": "#/$defs/__schema2"
},
"prompt": {
"$ref": "#/$defs/__schema3"
},
"rrule": {
"$ref": "#/$defs/__schema14"
},
"status": {
"$ref": "#/$defs/__schema5"
},
"kind": {
"$ref": "#/$defs/__schema11"
},
"destination": {
"$ref": "#/$defs/__schema12"
},
"targetThreadId": {
"$ref": "#/$defs/__schema13"
},
"mode": {
"$ref": "#/$defs/__schema15"
},
"id": {
"$ref": "#/$defs/__schema0"
}
},
"required": [
"name",
"prompt",
"rrule",
"status",
"kind",
"mode",
"id"
],
"additionalProperties": false
}
]
},
{
"type": "object",
"properties": {
"mode": {
"type": "string",
"const": "delete"
},
"id": {
"$ref": "#/$defs/__schema0"
}
},
"required": [
"mode",
"id"
],
"additionalProperties": false
}
],
"$defs": {
"__schema0": {
"description": "Automation id. Required for mode=view, mode=update, mode=delete, and mode=suggested_update. Omit for mode=create and mode=suggested_create.",
"$ref": "#/$defs/__schema1"
},
"__schema1": {
"type": "string",
"minLength": 1
},
"__schema2": {
"description": "Short human-readable automation name. If the user does not provide one, choose a concise name.",
"$ref": "#/$defs/__schema1"
},
"__schema3": {
"description": "The automation prompt. Describe only the task itself; do not include schedule, workspace, or thread details because those are provided separately. Keep it self-sufficient, include output expectations when useful, and do not ask it to write a file or announce nothing to do unless the user explicitly asked for that.",
"$ref": "#/$defs/__schema1"
},
"__schema4": {
"description": "RRULE schedule string. Interpret requested times in the user's locale. For mode=create, do not include DTSTART or convert local wall-clock times to UTC; encode them directly with FREQ, BYDAY, BYHOUR, and BYMINUTE. When the user intentionally requests a DTSTART-anchored or timezone-specific schedule, use mode=suggested_create so they can review it before saving. Cron automations use hourly interval or weekly schedules. Heartbeat automations attached to a thread can use minute-based intervals such as FREQ=MINUTELY;INTERVAL=30 or daily/weekly wall-clock schedules.",
"$ref": "#/$defs/__schema1"
},
"__schema5": {
"description": "One of ACTIVE or PAUSED. Default to ACTIVE unless the user asks to start paused.",
"type": "string",
"enum": [
"ACTIVE",
"PAUSED"
]
},
"__schema6": {
"description": "Use cron for standalone recurring jobs against workspaces.",
"type": "string",
"const": "cron"
},
"__schema7": {
"description": "Cron automations only. The target project id, or null for Threads. Use list_projects to find project ids.",
"anyOf": [
{
"type": "string",
"minLength": 1
},
{
"type": "null"
}
]
},
"__schema8": {
"description": "Model to use for cron automations.",
"$ref": "#/$defs/__schema1"
},
"__schema9": {
"description": "Reasoning effort to use for cron automations. One of none, minimal, low, medium, high, xhigh, max, or ultra.",
"type": "string",
"enum": [
"none",
"minimal",
"low",
"medium",
"high",
"xhigh",
"max",
"ultra"
]
},
"__schema10": {
"type": "string",
"enum": [
"create",
"suggested_create"
]
},
"__schema11": {
"description": "Use heartbeat when the user wants this thread to wake up later and continue the conversation.",
"type": "string",
"const": "heartbeat"
},
"__schema12": {
"description": "Optional automation destination. Use thread for heartbeat automations attached to the current local thread.",
"type": "string",
"enum": [
"local",
"thread"
]
},
"__schema13": {
"description": "Target thread id for heartbeat automations. Prefer destination=thread for the current local thread instead of inventing or copying raw thread ids.",
"$ref": "#/$defs/__schema1"
},
"__schema14": {
"description": "RRULE schedule string. Preserve the existing value for unrelated updates. When changing the schedule, interpret requested times in the user's locale and do not include DTSTART or convert local wall-clock times to UTC; encode them directly with FREQ, BYDAY, BYHOUR, and BYMINUTE. Cron automations use hourly interval or weekly schedules. Heartbeat automations attached to a thread can use minute-based intervals such as FREQ=MINUTELY;INTERVAL=30 or daily/weekly wall-clock schedules.",
"$ref": "#/$defs/__schema1"
},
"__schema15": {
"type": "string",
"enum": [
"update",
"suggested_update"
]
}
}
},
"deferLoading": true
},
{
"type": "function",
"name": "navigate_to_codex_page",
"description": "Navigate the most recently focused main Codex window to a thread. Use this when the user asks to open or show a Codex thread in the app.",
"inputSchema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"threadId": {
"description": "Thread id to show in Codex.",
"type": "string",
"minLength": 1
}
},
"required": [
"threadId"
],
"additionalProperties": false
}
},
{
"type": "function",
"name": "read_thread_terminal",
"description": "Read the current app terminal output for this desktop thread. Use it when you need shell output or the current prompt before deciding the next step. This tool takes no arguments.",
"inputSchema": {
"type": "object",
"properties": {},
"additionalProperties": false
}
},
{
"type": "function",
"name": "load_workspace_dependencies",
"description": "Locate the configured bundled workspace dependency runtime paths for this local desktop thread, including Node.js, Python, and useful libraries for working with spreadsheets, slide decks, Word documents, and PDFs. This is read-only and takes no arguments.",
"inputSchema": {
"type": "object",
"properties": {},
"additionalProperties": false
}
},
{
"type": "function",
"name": "fork_thread",
"description": "Fork a Codex thread. Omit threadId to fork the calling thread, or pass a threadId to fork that specific thread. A same-directory fork returns a child threadId immediately; a worktree fork returns a clientThreadId while worktree setup creates the child. Forks contain completed history only: if the source thread is running, the active turn and unfinished response are not copied. Send a follow-up message to the child only if the task requires work to continue there.",
"inputSchema": {
"type": "object",
"additionalProperties": false,
"properties": {
"threadId": {
"type": "string",
"description": "Optional source thread id to fork. Omit to fork the calling thread."
},
"environment": {
"description": "Where the fork should run. Omit for a same-directory fork.",
"anyOf": [
{
"type": "object",
"additionalProperties": false,
"properties": {
"type": {
"type": "string",
"enum": [
"same-directory"
]
}
},
"required": [
"type"
]
},
{
"type": "object",
"additionalProperties": false,
"properties": {
"type": {
"type": "string",
"enum": [
"worktree"
]
}
},
"required": [
"type"
]
}
]
}
}
},
"deferLoading": true
},
{
"type": "function",
"name": "get_handoff_status",
"description": "Read status for a handoff_thread operation. The user-facing UI already updates in the original handoff item, so avoid frequent polling. Prefer afterRevision with a 30000-60000 waitMs so the call returns only when progress changes or the timeout expires. Poll once after dispatch, then wait longer/back off; do not repeatedly poll unchanged state or narrate unchanged polls.",
"inputSchema": {
"type": "object",
"additionalProperties": false,
"properties": {
"operationId": {
"type": "string",
"description": "operationId returned by handoff_thread."
},
"afterRevision": {
"type": "number",
"description": "Optional last revision already seen. When provided with waitMs, wait until the operation revision is greater than this value or the timeout expires."
},
"waitMs": {
"type": "number",
"description": "Optional maximum milliseconds to wait for a status change, from 0 to 60000."
}
},
"required": [
"operationId"
]
},
"deferLoading": true
},
{
"type": "function",
"name": "list_projects",
"description": "List local and remote projects available for background thread creation. Use a returned projectId with create_thread.",
"inputSchema": {
"type": "object",
"additionalProperties": false,
"properties": {}
},
"deferLoading": true
},
{
"type": "function",
"name": "list_threads",
"description": "List recent Codex threads across the local host and connected remote hosts. Use an optional query to find a specific thread before reading or steering it.",
"inputSchema": {
"type": "object",
"additionalProperties": false,
"properties": {
"query": {
"type": "string",
"description": "Optional thread search query."
},
"limit": {
"type": "number",
"description": "Maximum number of thread summaries to return."
}
}
},
"deferLoading": true
},
{
"type": "function",
"name": "read_thread",
"description": "Read recent status and turn summaries for one Codex thread without opening it. Use page cursors from earlier responses to read older turns.",
"inputSchema": {
"type": "object",
"additionalProperties": false,
"properties": {
"threadId": {
"type": "string",
"description": "Thread id to inspect."
},
"hostId": {
"type": "string",
"description": "Optional host id returned by list_threads."
},
"cursor": {
"type": "string",
"description": "Optional cursor for older turns."
},
"turnLimit": {
"type": "number",
"description": "Maximum number of turns to return."
},
"includeOutputs": {
"type": "boolean",
"description": "Whether to include truncated tool or command outputs."
},
"maxOutputCharsPerItem": {
"type": "number",
"description": "Maximum output characters to keep for each included output item."
}
},
"required": [
"threadId"
]
},
"deferLoading": true
},
{
"type": "function",
"name": "set_thread_pinned",
"description": "Pin or unpin a Codex thread in the background.",
"inputSchema": {
"type": "object",
"additionalProperties": false,
"properties": {
"threadId": {
"type": "string",
"description": "Thread id to pin or unpin."
},
"pinned": {
"type": "boolean",
"description": "Whether the thread should be pinned."
}
},
"required": [
"threadId",
"pinned"
]
},
"deferLoading": true
},
{
"type": "function",
"name": "set_thread_archived",
"description": "Archive or unarchive a Codex thread in the background.",
"inputSchema": {
"type": "object",
"additionalProperties": false,
"properties": {
"threadId": {
"type": "string",
"description": "Thread id to archive or unarchive. Omit to target the calling thread."
},
"archived": {
"type": "boolean",
"description": "Whether the thread should be archived."
}
},
"required": [
"archived"
]
},
"deferLoading": true
},
{
"type": "function",
"name": "set_thread_title",
"description": "Rename a Codex thread in the background.",
"inputSchema": {
"type": "object",
"additionalProperties": false,
"properties": {
"threadId": {
"type": "string",
"description": "Thread id to rename. Omit to target the calling thread."
},
"title": {
"type": "string",
"description": "New thread title."
}
},
"required": [
"title"
]
},
"deferLoading": true
},
{
"annotations": {
"destructiveHint": false,
"idempotentHint": true,
"openWorldHint": false,
"readOnlyHint": true
},
"description": "List the apps on this computer. Returns the set of apps that are currently running, as well as any that have been used in the last 14 days, including details on usage frequency",
"inputSchema": {
"additionalProperties": false,
"properties": {},
"type": "object"
},
"name": "list_apps"
},
{
"annotations": {
"destructiveHint": false,
"idempotentHint": true,
"openWorldHint": false,
"readOnlyHint": true
},
"description": "Start an app use session if needed, then get the state of the app's key window and return a screenshot and accessibility tree. This must be called once per assistant turn before interacting with the app",
"inputSchema": {
"additionalProperties": false,
"properties": {
"app": {
"description": "App name, full app path, or unambiguous bundle identifier",
"type": "string"
}
},
"required": [
"app"
],
"type": "object"
},
"name": "get_app_state"
},
{
"annotations": {
"destructiveHint": false,
"idempotentHint": false,
"openWorldHint": false,
"readOnlyHint": false
},
"description": "Click an element by index or pixel coordinates from screenshot",
"inputSchema": {
"additionalProperties": false,
"properties": {
"app": {
"description": "App name, full app path, or unambiguous bundle identifier",
"type": "string"
},
"click_count": {
"description": "Number of clicks. Defaults to 1",
"type": "integer"
},
"element_index": {
"description": "Element index to click",
"type": "string"
},
"mouse_button": {
"description": "Mouse button to click. Defaults to left.",
"enum": [
"left",
"right",
"middle"
],
"type": "string"
},
"x": {
"description": "X coordinate in screenshot pixel coordinates",
"type": "number"
},
"y": {
"description": "Y coordinate in screenshot pixel coordinates",
"type": "number"
}
},
"required": [
"app"
],
"type": "object"
},
"name": "click"
},
{
"annotations": {
"destructiveHint": false,
"idempotentHint": false,
"openWorldHint": false,
"readOnlyHint": false
},
"description": "Invoke a secondary accessibility action exposed by an element",
"inputSchema": {
"additionalProperties": false,
"properties": {
"action": {
"description": "Secondary accessibility action name",
"type": "string"
},
"app": {
"description": "App name, full app path, or unambiguous bundle identifier",
"type": "string"
},
"element_index": {
"description": "Element identifier",
"type": "string"
}
},
"required": [
"app",
"element_index",
"action"
],
"type": "object"
},
"name": "perform_secondary_action"
},
{
"annotations": {
"destructiveHint": false,
"idempotentHint": false,
"openWorldHint": false,
"readOnlyHint": false
},
"description": "Set the value of a settable accessibility element",
"inputSchema": {
"additionalProperties": false,
"properties": {
"app": {
"description": "App name, full app path, or unambiguous bundle identifier",
"type": "string"
},
"element_index": {
"description": "Element identifier",
"type": "string"
},
"value": {
"description": "Value to assign",
"type": "string"
}
},
"required": [
"app",
"element_index",
"value"
],
"type": "object"
},
"name": "set_value"
},
{
"annotations": {
"destructiveHint": false,
"idempotentHint": false,
"openWorldHint": false,
"readOnlyHint": false
},
"description": "Select text inside a text element, or place the text cursor before or after it. Provide text exactly as it appears in the accessibility tree, including any Markdown formatting. If the text is not unique, provide surrounding prefix or suffix text to disambiguate it.",
"inputSchema": {
"additionalProperties": false,
"properties": {
"app": {
"description": "App name or bundle identifier",
"type": "string"
},
"element_index": {
"description": "Text element identifier",
"type": "string"
},
"prefix": {
"description": "Optional text immediately before the target, used to disambiguate repeated matches",
"type": "string"
},
"selection": {
"description": "Whether to select the text or place the cursor before or after it. Defaults to text.",
"enum": [
"text",
"cursor_before",
"cursor_after"
],
"type": "string"
},
"suffix": {
"description": "Optional text immediately after the target, used to disambiguate repeated matches",
"type": "string"
},
"text": {
"description": "Target text as shown in the accessibility tree",
"type": "string"
}
},
"required": [
"app",
"element_index",
"text"
],
"type": "object"
},
"name": "select_text"
},
{
"annotations": {
"destructiveHint": false,
"idempotentHint": false,
"openWorldHint": false,
"readOnlyHint": false
},
"description": "Scroll an element in a direction by a number of pages",
"inputSchema": {
"additionalProperties": false,
"properties": {
"app": {
"description": "App name, full app path, or unambiguous bundle identifier",
"type": "string"
},
"direction": {
"description": "Scroll direction: up, down, left, or right",
"type": "string"
},
"element_index": {
"description": "Element identifier",
"type": "string"
},
"pages": {
"description": "Number of pages to scroll. Fractional values are supported. Defaults to 1",
"type": "number"
}
},
"required": [
"app",
"element_index",
"direction"
],
"type": "object"
},
"name": "scroll"
},
{
"annotations": {
"destructiveHint": false,
"idempotentHint": false,
"openWorldHint": false,
"readOnlyHint": false
},
"description": "Drag from one point to another using pixel coordinates",
"inputSchema": {
"additionalProperties": false,
"properties": {
"app": {
"description": "App name, full app path, or unambiguous bundle identifier",
"type": "string"
},
"from_x": {
"description": "Start X coordinate",
"type": "number"
},
"from_y": {
"description": "Start Y coordinate",
"type": "number"
},
"to_x": {
"description": "End X coordinate",
"type": "number"
},
"to_y": {
"description": "End Y coordinate",
"type": "number"
}
},
"required": [
"app",
"from_x",
"from_y",
"to_x",
"to_y"
],
"type": "object"
},
"name": "drag"
},
{
"annotations": {
"destructiveHint": false,
"idempotentHint": false,
"openWorldHint": false,
"readOnlyHint": false
},
"description": "Press a key or key-combination on the keyboard, including modifier and navigation keys.\n - This supports xdotool's `key` syntax.\n - Examples: \"a\", \"Return\", \"Tab\", \"super+c\", \"Up\", \"KP_0\" (for the numpad 0 key).",
"inputSchema": {
"additionalProperties": false,
"properties": {
"app": {
"description": "App name, full app path, or unambiguous bundle identifier",
"type": "string"
},
"key": {
"description": "Key or key combination to press",
"type": "string"
}
},
"required": [
"app",
"key"
],
"type": "object"
},
"name": "press_key"
},
{
"annotations": {
"destructiveHint": false,
"idempotentHint": false,
"openWorldHint": false,
"readOnlyHint": false
},
"description": "Type literal text using keyboard input",
"inputSchema": {
"additionalProperties": false,
"properties": {
"app": {
"description": "App name, full app path, or unambiguous bundle identifier",
"type": "string"
},
"text": {
"description": "Literal text to type",
"type": "string"
}
},
"required": [
"app",
"text"
],
"type": "object"
},
"name": "type_text"
},
{
"annotations": {
"destructiveHint": false,
"idempotentHint": false,
"openWorldHint": false,
"readOnlyHint": false
},
"description": "Start recording the user's actions for up to 30 minutes. If a recording is already active, return that active session instead of starting another one.",
"inputSchema": {
"additionalProperties": false,
"properties": {},
"type": "object"
},
"name": "event_stream_start"
},
{
"annotations": {
"destructiveHint": false,
"idempotentHint": true,
"openWorldHint": false,
"readOnlyHint": true
},
"description": "Get the current or most recent Record & Replay recording status including paths to metadata and events during the recording.",
"inputSchema": {
"additionalProperties": false,
"properties": {},
"type": "object"
},
"name": "event_stream_status"
},
{
"annotations": {
"destructiveHint": false,
"idempotentHint": true,
"openWorldHint": false,
"readOnlyHint": false
},
"description": "Stop the active event stream recording if one is running and return status including paths to metadata and events during the recording.",
"inputSchema": {
"additionalProperties": false,
"properties": {},
"type": "object"
},
"name": "event_stream_stop"
},
{
"name": "choose_site_design",
"title": "Choose a Sites Design Option",
"description": "Show exactly three generated site-design options and ask the user a focused choice question. Options may be full-page concepts or HTML-rendered palettes, layouts, typography pairs, and other visual systems. Use only for the Sites one-shot fast path after the previews exist as local PNG, JPEG, or WebP files. The tool may be called sequentially for up to four distinct decisions; wait for each result before calling it again.",
"inputSchema": {
"type": "object",
"properties": {
"question": {
"type": "string",
"minLength": 1,
"description": "Focused user-facing question, such as \"Pick a color palette\" or \"Pick a typography pair\"."
},
"options": {
"type": "array",
"description": "Exactly three comparable generated site-design options.",
"minItems": 3,
"maxItems": 3,
"items": {
"type": "object",
"properties": {
"id": {
"type": "string",
"minLength": 1,
"description": "Stable unique id for the direction."
},
"title": {
"type": "string",
"minLength": 1,
"description": "Short user-facing direction name."
},
"designBrief": {
"type": "string",
"minLength": 1,
"description": "Implementation-ready visual and interaction guidance for the generated preview."
},
"imagePath": {
"type": "string",
"minLength": 1,
"description": "Absolute path to a generated PNG, JPEG, or WebP preview no larger than 8 MB."
}
},
"required": [
"id",
"title",
"designBrief",
"imagePath"
],
"additionalProperties": false
}
}
},
"required": [
"options"
],
"additionalProperties": false
},
"annotations": {
"readOnlyHint": true,
"destructiveHint": false,
"idempotentHint": true,
"openWorldHint": false
}
},
{
"name": "confirm_openai_api_key_local_destination",
"title": "Confirm OpenAI API Key Local Destination",
"description": "Ask the developer to confirm or edit the local env-file destination for a new OpenAI API key. Call this after the Platform picker returns the confirmed key name and target ids, and proceed only when it returns approved.",
"inputSchema": {
"type": "object",
"properties": {
"workspacePath": {
"type": "string",
"description": "Absolute workspace root used to confine the local env-file write."
},
"targetPath": {
"type": "string",
"description": "Recommended env-file path inside the workspace, such as .env.local."
},
"envName": {
"type": "string",
"description": "Environment variable name to create or update. Defaults to OPENAI_API_KEY.",
"default": "OPENAI_API_KEY"
}
},
"required": [
"workspacePath",
"targetPath"
]
},
"annotations": {
"readOnlyHint": true,
"destructiveHint": false,
"idempotentHint": true,
"openWorldHint": false
}
},
{
"name": "codex_app__create_thread",
"description": "Tools provided by the Codex app.\n\nCreate a separate Codex thread only when the user explicitly asks for a new or background thread. Use list_projects first, then pass its projectId for repo-scoped work in any local or remote project. Use projectless targets for general tasks. Project targets must choose a local or worktree environment.\n\nexec tool declaration:\n```ts\ndeclare const tools: { codex_app__create_thread(args: {\n // Do not specify a model unless the user explicitly requests a specific model. Otherwise omit this field so the new thread uses the user's configured default model. Models and supported reasoning efforts on the calling host: gpt-5.6-sol (Latest frontier agentic coding model.; supported reasoning efforts: low, medium, high, xhigh, max, ultra), gpt-5.6-terra (Balanced agentic coding model for everyday work.; supported reasoning efforts: low, medium, high, xhigh, max, ultra), gpt-5.6-luna (Fast and affordable agentic coding model.; supported reasoning efforts: low, medium, high, xhigh, max), gpt-5.5 (Frontier model for complex coding, research, and real-world work.; supported reasoning efforts: low, medium, high, xhigh), gpt-5.4 (Strong model for everyday coding.; supported reasoning efforts: low, medium, high, xhigh), gpt-5.4-mini (Small, fast, and cost-efficient model for simpler coding tasks.; supported reasoning efforts: low, medium, high, xhigh), gpt-5.3-codex-spark (Ultra-fast coding model.; supported reasoning efforts: low, medium, high, xhigh). A different destination host's combinations are validated when the tool runs. You may supply a newer model id when explicitly requested, but omit thinking unless its supported reasoning efforts are listed here.\n model?: string;\n // Initial prompt for the new thread.\n prompt: string;\n // Where to create the thread.\n target: {\n // Where the project thread should run: directly in the saved project or in a new worktree.\n environment: { type: \"local\"; } | {\n // Only specify this when the user explicitly asks to start from a particular existing git state. Use working-tree to include the current checkout and uncommitted changes. Use branch only for a branch or ref that already exists. Otherwise omit this field so the worktree starts from the project's default branch. Do not use this to name a new branch.\n startingState?: { type: \"working-tree\"; } | { branchName: string; type: \"branch\"; };\n type: \"worktree\";\n};\n // Project id returned by list_projects.\n projectId: string;\n type: \"project\";\n} | {\n // Optional projectless output directory name.\n directoryName?: string;\n type: \"projectless\";\n};\n // Optional reasoning effort override. Must be supported by the selected model.\n thinking?: \"none\" | \"minimal\" | \"low\" | \"medium\" | \"high\" | \"xhigh\" | \"max\" | \"ultra\";\n}): Promise<unknown>; };\n```"
},
{
"name": "codex_app__handoff_thread",
"description": "Tools provided by the Codex app.\n\nMove another Codex thread and its associated git state between its checkout and Codex worktree on its current host. Running threads are interrupted before handoff. Omit destinationHostId for this current-host toggle. The calling thread cannot move itself, and cloud handoff is not supported. You can also choose another host to move the thread to a matching saved-project worktree. Returns quickly with an operationId and revision. The UI continues to show live progress in the original handoff item. For model-visible completion, call get_handoff_status with afterRevision and a 30000-60000 waitMs, then back off if the revision does not change.\n\nexec tool declaration:\n```ts\ndeclare const tools: { codex_app__handoff_thread(args: {\n // Optional host that should run the thread after handoff. Omit to move between the source thread's checkout and Codex worktree on its current host. Choose another host to move to a matching saved-project worktree. Available hosts: [AVAILABLE_HOSTS].\n destinationHostId?: \"local\";\n // Optional prompt to send to the destination thread after handoff succeeds.\n followUpPrompt?: string;\n // Other thread id to hand off.\n threadId: string;\n}): Promise<unknown>; };\n```"
},
{
"name": "codex_app__send_message_to_thread",
"description": "Tools provided by the Codex app.\n\nSend a follow-up prompt to an existing Codex thread in the background. Omit model and thinking to keep the thread's current settings.\n\nexec tool declaration:\n```ts\ndeclare const tools: { codex_app__send_message_to_thread(args: {\n // Optional host id returned by list_threads.\n hostId?: string;\n // Optional model override. Models and supported reasoning efforts on the calling host: gpt-5.6-sol (Latest frontier agentic coding model.; supported reasoning efforts: low, medium, high, xhigh, max, ultra), gpt-5.6-terra (Balanced agentic coding model for everyday work.; supported reasoning efforts: low, medium, high, xhigh, max, ultra), gpt-5.6-luna (Fast and affordable agentic coding model.; supported reasoning efforts: low, medium, high, xhigh, max), gpt-5.5 (Frontier model for complex coding, research, and real-world work.; supported reasoning efforts: low, medium, high, xhigh), gpt-5.4 (Strong model for everyday coding.; supported reasoning efforts: low, medium, high, xhigh), gpt-5.4-mini (Small, fast, and cost-efficient model for simpler coding tasks.; supported reasoning efforts: low, medium, high, xhigh), gpt-5.3-codex-spark (Ultra-fast coding model.; supported reasoning efforts: low, medium, high, xhigh). A different destination host's combinations are validated when the tool runs. You may supply a newer model id when explicitly requested, but omit thinking unless its supported reasoning efforts are listed here.\n model?: string;\n // Follow-up prompt to send.\n prompt: string;\n // Optional reasoning effort override. Must be supported by the selected model.\n thinking?: \"none\" | \"minimal\" | \"low\" | \"medium\" | \"high\" | \"xhigh\" | \"max\" | \"ultra\";\n // Thread id to continue.\n threadId: string;\n}): Promise<unknown>; };\n```"
},
{
"name": "mcp__node_repl__js",
"description": "Use `js` to run JavaScript in the persistent Node-backed kernel. When a skill or prompt says to use `node_repl`, call this server's `js` execution tool. Calls default to a 30000 ms (30 seconds) timeout when `timeout_ms` is omitted. The runtime exposes `nodeRepl.cwd`, `nodeRepl.homeDir`, `nodeRepl.tmpDir`, `nodeRepl.requestMeta`, `nodeRepl.setResponseMeta(...)`, and `await nodeRepl.emitImage(...)`. Top-level bindings persist across `js` calls until `js_reset`; do not redeclare existing `const` or `let` names. Reuse existing bindings, use top-level `var` for reusable state that may be assigned again, or choose a fresh descriptive name. Use `js_add_node_module_dir` before `js` when a skill provides an extra package directory, and use dynamic imports like `await import(\"playwright\")` rather than filesystem paths under `./node_modules`.\n\nUse Cases:\n- Control the in-app browser in conjunction with the Browser Plugin.\n- Control the Chrome browser in conjunction with the Chrome Plugin. Prefer this method of controlling Chrome over alternatives (such as Computer Use) unless the user explicitly mentions an alternative.\n- Control desktop apps on macOS through Computer Use.\n\nRun JavaScript in a persistent Node-backed kernel with top-level await. This is the JavaScript execution tool for the `node_repl` MCP server; use it whenever instructions say to use `node_repl`, the Node REPL MCP, or run Node REPL code. If `timeout_ms` is omitted, execution times out after 30000 ms (30 seconds); pass a larger `timeout_ms` for slow browser automation or other long-running operations. Use `nodeRepl.cwd`, `nodeRepl.homeDir`, and `nodeRepl.tmpDir` to inspect host paths. Use `nodeRepl.requestMeta` to inspect the current MCP request `_meta` object during a tool call. Use `nodeRepl.setResponseMeta(meta)` to attach top-level MCP result `_meta`; repeated calls shallow-merge object keys for the current tool call. Use `nodeRepl.write(value)` to add output without a newline. Strings are unchanged; other values use console-style formatting, including BigInt and circular objects. Prefer it over `console.log(...)` for final output; `console.log(...)` remains useful for debugging or multiple values. Use `await nodeRepl.emitImage(imageLike)` to return images; each call adds one image to the outer tool result, so call it multiple times to emit multiple images. Supported image inputs are a data URL, inferred PNG/JPEG/WebP bytes, or `{ bytes, mimeType }`. Saved references to `nodeRepl.write(...)` and `nodeRepl.emitImage(...)` stay reusable across calls, but async callbacks that fire after a call finishes still fail because no exec is active. Top-level bindings persist across calls until `js_reset`. If a call throws, prior bindings remain available and bindings that finished initializing before the throw often remain reusable. For reusable names that may be assigned again later, prefer top-level `var name = ...`; `var` can be redeclared across calls. If you hit `SyntaxError: Identifier 'x' has already been declared`, reuse the existing binding if possible, reassign it only if it was declared with `let` or `var`, or pick a new name instead of resetting immediately; a previous `const x` cannot be changed into `var x`. Use a short `{ ... }` block only for temporary scratch names, and do not wrap an entire call in block scope if you want those names reusable later. Use dynamic imports like `await import(\"playwright\")`, `await import(\"pkg\")`, or `await import(\"./file.js\")`; top-level static `import` is not supported. Import packages by package name after installing them into a directory added with `js_add_node_module_dir`, `NODE_REPL_NODE_MODULE_DIRS`, or the working directory. Do not import package entrypoints by filesystem path such as `./node_modules/playwright/index.mjs`. Imported local files must be ESM `.js` or `.mjs` files and run in the context chosen at their dynamic-import boundary, so they can also use `nodeRepl.*`, the captured `console`, and `import.meta` helpers. Bare package imports always resolve from the REPL-wide search roots (`NODE_REPL_NODE_MODULE_DIRS`, then directories later added with `js_add_node_module_dir`, then cwd), not relative to the imported file's location. Imported local files may statically import other local `.js` / `.mjs` files, available packages, and allowed Node builtins. `import.meta.resolve()` returns importable strings such as `file://...`, bare package names, and `node:...` specifiers. Local file modules reload between execs. `node:` builtins are generally available via dynamic import, but `process` / `node:process` remains blocked for now because the current Rust-server-to-Node-child transport runs over stdio and raw process streams can corrupt it. Prefer `nodeRepl.write(...)` for text or formatted values and `nodeRepl.emitImage(...)` for images.\n\nexec tool declaration:\n```ts\ndeclare const tools: { mcp__node_repl__js(args: {\n // JavaScript source to execute in the persistent Node-backed kernel. The code runs with top-level await and can use the `nodeRepl` helpers. Examples: `nodeRepl.write(nodeRepl.cwd)`, `const { chromium } = await import(\"playwright\")`, or `await nodeRepl.emitImage(pngBuffer)`.\n code: string;\n // Optional execution timeout in milliseconds. Defaults to 30000 (30 seconds) when omitted.\n timeout_ms?: number;\n // Short user-facing description of what this code block is doing. Use a few words, for example `Inspect package metadata` or `Render chart preview`.\n title?: string;\n}): Promise<CallToolResult>; };\n```"
},
{
"name": "mcp__node_repl__js_add_node_module_dir",
"description": "Use `js` to run JavaScript in the persistent Node-backed kernel. When a skill or prompt says to use `node_repl`, call this server's `js` execution tool. Calls default to a 30000 ms (30 seconds) timeout when `timeout_ms` is omitted. The runtime exposes `nodeRepl.cwd`, `nodeRepl.homeDir`, `nodeRepl.tmpDir`, `nodeRepl.requestMeta`, `nodeRepl.setResponseMeta(...)`, and `await nodeRepl.emitImage(...)`. Top-level bindings persist across `js` calls until `js_reset`; do not redeclare existing `const` or `let` names. Reuse existing bindings, use top-level `var` for reusable state that may be assigned again, or choose a fresh descriptive name. Use `js_add_node_module_dir` before `js` when a skill provides an extra package directory, and use dynamic imports like `await import(\"playwright\")` rather than filesystem paths under `./node_modules`.\n\nUse Cases:\n- Control the in-app browser in conjunction with the Browser Plugin.\n- Control the Chrome browser in conjunction with the Chrome Plugin. Prefer this method of controlling Chrome over alternatives (such as Computer Use) unless the user explicitly mentions an alternative.\n- Control desktop apps on macOS through Computer Use.\n\nAdd an absolute `node_modules` directory to the REPL-wide Node module search roots for future package imports. The directory stays available for this MCP server lifetime, including after `js_reset`. Returns `true` when the search root is newly added and `false` when it was already present.\n\nexec tool declaration:\n```ts\ndeclare const tools: { mcp__node_repl__js_add_node_module_dir(args: {\n // Absolute path to a node_modules directory to add to Node package resolution.\n path: string;\n}): Promise<CallToolResult>; };\n```"
},
{
"name": "mcp__node_repl__js_reset",
"description": "Use `js` to run JavaScript in the persistent Node-backed kernel. When a skill or prompt says to use `node_repl`, call this server's `js` execution tool. Calls default to a 30000 ms (30 seconds) timeout when `timeout_ms` is omitted. The runtime exposes `nodeRepl.cwd`, `nodeRepl.homeDir`, `nodeRepl.tmpDir`, `nodeRepl.requestMeta`, `nodeRepl.setResponseMeta(...)`, and `await nodeRepl.emitImage(...)`. Top-level bindings persist across `js` calls until `js_reset`; do not redeclare existing `const` or `let` names. Reuse existing bindings, use top-level `var` for reusable state that may be assigned again, or choose a fresh descriptive name. Use `js_add_node_module_dir` before `js` when a skill provides an extra package directory, and use dynamic imports like `await import(\"playwright\")` rather than filesystem paths under `./node_modules`.\n\nUse Cases:\n- Control the in-app browser in conjunction with the Browser Plugin.\n- Control the Chrome browser in conjunction with the Chrome Plugin. Prefer this method of controlling Chrome over alternatives (such as Computer Use) unless the user explicitly mentions an alternative.\n- Control desktop apps on macOS through Computer Use.\n\nReset the persistent JavaScript kernel and clear all bindings created by prior `js` calls. Use this when you need a clean state, or when reusing existing bindings, top-level `var` declarations, or fresh names cannot recover from conflicting declarations.\n\nexec tool declaration:\n```ts\ndeclare const tools: { mcp__node_repl__js_reset(args: {}): Promise<CallToolResult>; };\n```"
},
{
"name": "web__run",
"description": "Tools in the web namespace.\n\nTool for accessing the internet.\n\n\n---\n\n## Examples of different commands available in this tool\n\nExamples of different commands available in this tool:\n* `search_query`: {\"search_query\": [{\"q\": \"What is the capital of France?\"}, {\"q\": \"What is the capital of belgium?\"}]}. Searches the internet for a given query (and optionally with a domain or recency filter)\n* `image_query`: {\"image_query\":[{\"q\": \"waterfalls\"}]}.\n* `open`: {\"open\": [{\"ref_id\": \"turn0search0\"}, {\"ref_id\": \"https://www.openai.com\", \"lineno\": 120}]}\n* `click`: {\"click\": [{\"ref_id\": \"turn0fetch3\", \"id\": 17}]}\n* `find`: {\"find\": [{\"ref_id\": \"turn0fetch3\", \"pattern\": \"[EXAMPLE_PERSON]\"}]}\n* `screenshot`: {\"screenshot\": [{\"ref_id\": \"turn1view0\", \"pageno\": 0}, {\"ref_id\": \"turn1view0\", \"pageno\": 3}]}\n* `finance`: {\"finance\":[{\"ticker\":\"AMD\",\"type\":\"equity\",\"market\":\"USA\"}]}, {\"finance\":[{\"ticker\":\"BTC\",\"type\":\"crypto\",\"market\":\"\"}]}\n* `weather`: {\"weather\":[{\"location\":\"[CITY], [REGION]\"}]}\n* `sports`: {\"sports\":[{\"fn\":\"standings\",\"league\":\"nfl\"}, {\"fn\":\"schedule\",\"league\":\"nba\",\"team\":\"GSW\",\"date_from\":\"[DATE]\"}]}\n* `time`: {\"time\":[{\"utc_offset\":\"+03:00\"}]}\n\n---\n\n## Usage hints\nTo use this tool efficiently:\n* Use multiple commands and queries in one call to get more results faster; e.g. {\"search_query\": [{\"q\": \"bitcoin news\"}], \"finance\":[{\"ticker\":\"BTC\",\"type\":\"crypto\",\"market\":\"\"}], \"find\": [{\"ref_id\": \"turn0search0\", \"pattern\": \"[EXAMPLE_PERSON]\"}, {\"ref_id\": \"turn0search1\", \"pattern\": \"[EXAMPLE_PERSON]\"}]}\n* Use \"response_length\" to control the number of results returned by this tool, omit it if you intend to pass \"short\" in\n* Only write required parameters; do not write empty lists or nulls where they could be omitted.\n* `search_query` must have length at most 4 in each call. If it has length > 3, response_length must be medium or long\n* If you find yourself in a situation where you accidentally call the `web.run` tool, it's best just to send an empty query: {\"search_query\": [{\"q\": \"\"}]}.\n\n---\n\n## Decision boundary\n\nIf the user makes an explicit request to search the internet, find latest information, look up, etc (or to not do so), you must obey their request.\nWhen you make an assumption, always consider whether it is temporally stable; i.e. whether there's even a small (>10%) chance it has changed. If it is unstable, you must verify with browsing the internet for verification.\n\n<situations_where_you_must_browse_the_internet>\nBelow is a list of scenarios where browsing the internet MUST be used. PAY CLOSE ATTENTION: you MUST browse the internet in these cases. If you're unsure or on the fence, you MUST bias towards browsing the internet.\n- The information could have changed recently: for example news; prices; laws; schedules; product specs; sports scores; economic indicators; political/public/company figures (e.g. the question relates to 'the president of country A' or 'the CEO of company B', which might change over time); rules; regulations; standards; software libraries that could be updated; exchange rates; recommendations (i.e., recommendations about various topics or things might be informed by what currently exists / is popular / is safe / is unsafe / is in the zeitgeist / etc.); and many many many more categories -- again, if you're on the fence, you MUST browse the internet!\n - For news queries, prioritize more recent events, ensuring you compare publish dates and the date that the event happened.\n- The user is seeking recommendations that could lead them to spend substantial time or money -- researching products, restaurants, travel plans, etc.\n- The user wants (or would benefit from) direct quotes, links, or precise source attribution.\n- A specific page, paper, dataset, PDF, or site is referenced and you haven't been given its contents.\n- You're unsure about a fact, the topic is niche or emerging, or you suspect there's at least a 10% chance you will incorrectly recall it\n- High-stakes accuracy matters (medical, legal, financial guidance). For these you generally should search by default because this information is highly temporally unstable\n- The user explicitly says to search, browse, verify, or look it up.\n</situations_where_you_must_browse_the_internet>\n\n---\n\n## Citations\n\nResults from `web.run` include internal reference IDs such as `turn2search5`. Use\nthose reference IDs only in calls to `web.run`; do not expose them in the final\nresponse.\n\nCite sources in the final response using Markdown links:\n\n- Cite a single source as `[descriptive source title](https://example.com/page)`.\n- Cite multiple sources with separate Markdown links, for example\n `[first source](https://example.com/one), [second source](https://example.com/two)`.\n- Link directly to the page that supports the claim. Do not link to search result\n pages or use bare URLs.\n\nFormatting of citations:\n\n- Place each citation as near as possible to the claim it supports, normally at\n the end of the sentence or paragraph and after punctuation.\n- Do not place citations inside code fences.\n- Do not put citations on a line by themselves or collect all citations at the\n end of the response.\n\nIf you browse the internet, cite statements supported by web sources. Each cited\nsource must directly support the associated claim. Prefer primary and\nauthoritative sources, and use sources from different domains when the response\nbenefits from multiple perspectives.\n\n---\n\n## Special cases\nIf these conflict with any other instructions, these should take precedence.\n\n<special_cases>\n- When the user asks for information about how to use OpenAI products, (ChatGPT, the OpenAI API, etc.), you should check the code in local env and only browse as fallback, when you browse restrict your sources to official OpenAI websites using the domains filter, unless otherwise requested.\n- When using search to answer technical questions, you must only rely on primary sources (research papers, official documentation, etc.)\n- Clearly indicate when you are making an inference from sources.\n</special_cases>\n\n---\n\n## Word limits\nResponses may not excessively quote or draw on a specific source. There are several limits here:\n- **Limit on verbatim quotes:**\n - You may not quote more than 25 words verbatim from any single non-lyrical source, unless the source is reddit.\n - For song lyrics, verbatim quotes must be limited to at most 10 words.\n - Long quotes from reddit are allowed, as long as you indicate that those are direct quotes via a markdown blockquote starting with \">\", copy verbatim, and link the source.\n- **Word limits:**\n - Each webpage source in the sources has a word limit label formatted like \"[wordlim N]\", in which N is the maximum number of words in the whole response that are attributed to that source. If omitted, the word limit is 200 words.\n - Non-contiguous words derived from a given source must be counted to the word limit.\n - The summarization limit N is a maximum for each source.\n - When using multiple sources, their summarization limits add together. However, each article used must be relevant to the response.\n- **Copyright compliance:**\n - You must avoid providing full articles, long verbatim passages, or extensive direct quotes due to copyright concerns.\n - If the user asked for a verbatim quote, the response should provide a short compliant excerpt and then answer with paraphrases and summaries.\n - Again, this limit does not apply to reddit content, as long as it's appropriately indicated that those are direct quotes and you link to the source.\n\n\nexec tool declaration:\n```ts\ndeclare const tools: { web__run(args: {\n // Open links from previously opened pages.\n click?: Array<{\n // Numbered link id to open.\n id: number;\n // Reference id containing the numbered link.\n ref_id: string;\n}>;\n // Look up prices for the given stock symbols.\n finance?: Array<{\n // ISO 3166-1 alpha-3 country code, \"OTC\", or \"\" for cryptocurrency.\n market?: string;\n // Ticker symbol to look up.\n ticker: string;\n // Asset type to look up.\n type: \"equity\" | \"fund\" | \"crypto\" | \"index\";\n}>;\n // Find text patterns in pages.\n find?: Array<{\n // Text pattern to find.\n pattern: string;\n // Reference id or URL to search within.\n ref_id: string;\n}>;\n // Query the image search engine for a given list of queries.\n image_query?: Array<{\n // Whether to filter by a specific list of domains.\n domains?: Array<string>;\n // Search query.\n q: string;\n // Whether to filter by recency, as a number of recent days.\n recency?: number;\n}>;\n // Open pages by reference id or URL.\n open?: Array<{\n // Line number to position the page at.\n lineno?: number;\n // Reference id or URL to open.\n ref_id: string;\n}>;\n // Set the length of the response to be returned.\n response_length?: \"short\" | \"medium\" | \"long\";\n // Take screenshots of PDF pages.\n screenshot?: Array<{\n // Zero-indexed PDF page number.\n pageno: number;\n // Reference id or URL to screenshot.\n ref_id: string;\n}>;\n // Query the internet search engine for a given list of queries.\n search_query?: Array<{\n // Whether to filter by a specific list of domains.\n domains?: Array<string>;\n // Search query.\n q: string;\n // Whether to filter by recency, as a number of recent days.\n recency?: number;\n}>;\n // Look up sports schedules and standings.\n sports?: Array<{\n // Start date in YYYY-MM-DD format.\n date_from?: string;\n // End date in YYYY-MM-DD format.\n date_to?: string;\n // Sports function to call.\n fn: \"schedule\" | \"standings\";\n // League to look up.\n league: \"nba\" | \"wnba\" | \"nfl\" | \"nhl\" | \"mlb\" | \"epl\" | \"ncaamb\" | \"ncaawb\" | \"ipl\";\n // Locale for the lookup.\n locale?: string;\n // Number of games to return.\n num_games?: number;\n // Opponent to use with `team` when narrowing the lookup.\n opponent?: string;\n // Team to look up, using the common 3 or 4 letter alias used in broadcasts.\n team?: string;\n // Tool name for sports requests.\n tool?: \"sports\";\n}>;\n // Get time for the given UTC offsets.\n time?: Array<{\n // UTC offset formatted like \"+03:00\".\n utc_offset: string;\n}>;\n // Look up weather forecasts.\n weather?: Array<{\n // Number of days to return. Defaults to 7.\n duration?: number;\n // Location in \"Country, Area, City\" format.\n location: string;\n // Start date in YYYY-MM-DD format. Defaults to today.\n start?: string;\n}>;\n}): Promise<unknown>; };\n```"
},
{
"type": "function",
"name": "handoff_thread",
"description": "Move another Codex thread and its associated git state between its checkout and Codex worktree on its current host. Running threads are interrupted before handoff. Omit destinationHostId for this current-host toggle. The calling thread cannot move itself, and cloud handoff is not supported. You can also choose another host to move the thread to a matching saved-project worktree. Returns quickly with an operationId and revision. The UI continues to show live progress in the original handoff item. For model-visible completion, call get_handoff_status with afterRevision and a 30000-60000 waitMs, then back off if the revision does not change.",
"inputSchema": {
"type": "object",
"additionalProperties": false,
"properties": {
"threadId": {
"type": "string",
"description": "Other thread id to hand off."
},
"destinationHostId": {
"type": "string",
"description": "Optional host that should run the thread after handoff. Omit to move between the source thread's checkout and Codex worktree on its current host. Choose another host to move to a matching saved-project worktree. Available hosts: [AVAILABLE_HOSTS].",
"enum": [
"local"
]
},
"followUpPrompt": {
"type": "string",
"description": "Optional prompt to send to the destination thread after handoff succeeds."
}
},
"required": [
"threadId"
]
},
"deferLoading": true
},
{
"type": "function",
"name": "create_thread",
"description": "Create a separate Codex thread only when the user explicitly asks for a new or background thread. Use list_projects first, then pass its projectId for repo-scoped work in any local or remote project. Use projectless targets for general tasks. Project targets must choose a local or worktree environment.",
"inputSchema": {
"type": "object",
"additionalProperties": false,
"properties": {
"prompt": {
"type": "string",
"description": "Initial prompt for the new thread."
},
"target": {
"description": "Where to create the thread.",
"anyOf": [
{
"type": "object",
"additionalProperties": false,
"properties": {
"type": {
"type": "string",
"enum": [
"project"
]
},
"projectId": {
"type": "string",
"description": "Project id returned by list_projects."
},
"environment": {
"description": "Where the project thread should run: directly in the saved project or in a new worktree.",
"anyOf": [
{
"type": "object",
"additionalProperties": false,
"properties": {
"type": {
"type": "string",
"enum": [
"local"
]
}
},
"required": [
"type"
]
},
{
"type": "object",
"additionalProperties": false,
"properties": {
"type": {
"type": "string",
"enum": [
"worktree"
]
},
"startingState": {
"description": "Only specify this when the user explicitly asks to start from a particular existing git state. Use working-tree to include the current checkout and uncommitted changes. Use branch only for a branch or ref that already exists. Otherwise omit this field so the worktree starts from the project's default branch. Do not use this to name a new branch.",
"anyOf": [
{
"type": "object",
"additionalProperties": false,
"properties": {
"type": {
"type": "string",
"enum": [
"working-tree"
]
}
},
"required": [
"type"
]
},
{
"type": "object",
"additionalProperties": false,
"properties": {
"type": {
"type": "string",
"enum": [
"branch"
]
},
"branchName": {
"type": "string"
}
},
"required": [
"type",
"branchName"
]
}
]
}
},
"required": [
"type"
]
}
]
}
},
"required": [
"type",
"projectId",
"environment"
]
},
{
"type": "object",
"additionalProperties": false,
"properties": {
"type": {
"type": "string",
"enum": [
"projectless"
]
},
"directoryName": {
"type": "string",
"description": "Optional projectless output directory name."
}
},
"required": [
"type"
]
}
]
},
"model": {
"type": "string",
"description": "Do not specify a model unless the user explicitly requests a specific model. Otherwise omit this field so the new thread uses the user's configured default model. Models and supported reasoning efforts on the calling host: gpt-5.6-sol (Latest frontier agentic coding model.; supported reasoning efforts: low, medium, high, xhigh, max, ultra), gpt-5.6-terra (Balanced agentic coding model for everyday work.; supported reasoning efforts: low, medium, high, xhigh, max, ultra), gpt-5.6-luna (Fast and affordable agentic coding model.; supported reasoning efforts: low, medium, high, xhigh, max), gpt-5.5 (Frontier model for complex coding, research, and real-world work.; supported reasoning efforts: low, medium, high, xhigh), gpt-5.4 (Strong model for everyday coding.; supported reasoning efforts: low, medium, high, xhigh), gpt-5.4-mini (Small, fast, and cost-efficient model for simpler coding tasks.; supported reasoning efforts: low, medium, high, xhigh), gpt-5.3-codex-spark (Ultra-fast coding model.; supported reasoning efforts: low, medium, high, xhigh). A different destination host's combinations are validated when the tool runs. You may supply a newer model id when explicitly requested, but omit thinking unless its supported reasoning efforts are listed here."
},
"thinking": {
"type": "string",
"description": "Optional reasoning effort override. Must be supported by the selected model.",
"enum": [
"none",
"minimal",
"low",
"medium",
"high",
"xhigh",
"max",
"ultra"
]
}
},
"required": [
"prompt",
"target"
]
},
"deferLoading": true
},
{
"type": "function",
"name": "send_message_to_thread",
"description": "Send a follow-up prompt to an existing Codex thread in the background. Omit model and thinking to keep the thread's current settings.",
"inputSchema": {
"type": "object",
"additionalProperties": false,
"properties": {
"threadId": {
"type": "string",
"description": "Thread id to continue."
},
"hostId": {
"type": "string",
"description": "Optional host id returned by list_threads."
},
"prompt": {
"type": "string",
"description": "Follow-up prompt to send."
},
"model": {
"type": "string",
"description": "Optional model override. Models and supported reasoning efforts on the calling host: gpt-5.6-sol (Latest frontier agentic coding model.; supported reasoning efforts: low, medium, high, xhigh, max, ultra), gpt-5.6-terra (Balanced agentic coding model for everyday work.; supported reasoning efforts: low, medium, high, xhigh, max, ultra), gpt-5.6-luna (Fast and affordable agentic coding model.; supported reasoning efforts: low, medium, high, xhigh, max), gpt-5.5 (Frontier model for complex coding, research, and real-world work.; supported reasoning efforts: low, medium, high, xhigh), gpt-5.4 (Strong model for everyday coding.; supported reasoning efforts: low, medium, high, xhigh), gpt-5.4-mini (Small, fast, and cost-efficient model for simpler coding tasks.; supported reasoning efforts: low, medium, high, xhigh), gpt-5.3-codex-spark (Ultra-fast coding model.; supported reasoning efforts: low, medium, high, xhigh). A different destination host's combinations are validated when the tool runs. You may supply a newer model id when explicitly requested, but omit thinking unless its supported reasoning efforts are listed here."
},
"thinking": {
"type": "string",
"description": "Optional reasoning effort override. Must be supported by the selected model.",
"enum": [
"none",
"minimal",
"low",
"medium",
"high",
"xhigh",
"max",
"ultra"
]
}
},
"required": [
"threadId",
"prompt"
]
},
"deferLoading": true
},
{
"name": "request_codex_security_user_input",
"title": "Request Codex Security User Input",
"description": "Fallback for interactive Codex Security workflows when the host-native request_user_input tool is unavailable. Presents one to three non-sensitive multiple-choice questions through standard MCP form elicitation and waits for the user's response. Never call this tool in headless, automation, or other non-interactive sessions.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"type": "object",
"properties": {
"questions": {
"minItems": 1,
"maxItems": 3,
"type": "array",
"items": {
"type": "object",
"properties": {
"header": {
"type": "string",
"minLength": 1,
"maxLength": 64
},
"id": {
"type": "string",
"pattern": "^[a-z][a-z0-9_]{0,63}$"
},
"options": {
"minItems": 2,
"maxItems": 3,
"type": "array",
"items": {
"type": "object",
"properties": {
"description": {
"type": "string",
"minLength": 1,
"maxLength": 1200
},
"label": {
"type": "string",
"minLength": 1,
"maxLength": 200
}
},
"required": [
"description",
"label"
],
"additionalProperties": false
}
},
"question": {
"type": "string",
"minLength": 1,
"maxLength": 1200
}
},
"required": [
"header",
"id",
"options",
"question"
],
"additionalProperties": false
},
"description": "One to three non-sensitive multiple-choice questions for an interactive Codex Security workflow."
}
},
"required": [
"questions"
]
},
"annotations": {
"readOnlyHint": true,
"destructiveHint": false,
"idempotentHint": false,
"openWorldHint": false
},
"execution": {
"taskSupport": "forbidden"
},
"_meta": {
"ui": {
"visibility": [
"model"
]
}
}
},
{
"name": "open_codex_security_workspace",
"title": "Open Codex Security",
"description": "Create a native Codex Security workspace with the target and requested standard, diff, or deep mode, or reopen one owned by this thread by passing only sessionId. Scope is inside targetPath; use '.' or omit scope for the whole target. The existing Codex Security skills remain authoritative for scan execution.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"type": "object",
"properties": {
"capabilityPreflight": {
"description": "Optional capability preflight retained only for non-app legacy callers. Do not include it when opening the setup workspace; the scan workflow performs its authoritative preflight after setup is submitted.",
"type": "object",
"properties": {
"issues": {
"maxItems": 32,
"type": "array",
"items": {
"type": "object",
"properties": {
"capability": {
"type": "string",
"minLength": 1,
"maxLength": 128
},
"reason": {
"type": "string",
"minLength": 1,
"maxLength": 1200
},
"severity": {
"type": "string",
"enum": [
"block",
"warn",
"suggest"
]
},
"status": {
"type": "string",
"enum": [
"fail",
"unknown"
]
}
},
"required": [
"capability",
"reason",
"severity",
"status"
],
"additionalProperties": false
}
},
"profile": {
"type": "string",
"minLength": 1,
"maxLength": 128
},
"remediation": {
"type": "object",
"properties": {
"note": {
"type": "string",
"minLength": 1,
"maxLength": 2400
},
"patches": {
"maxItems": 32,
"type": "array",
"items": {
"type": "object",
"properties": {
"kind": {
"type": "string",
"enum": [
"config",
"host_setting"
]
},
"path": {
"type": "string",
"minLength": 1,
"maxLength": 256
},
"value": {
"anyOf": [
{
"type": "string",
"maxLength": 2048
},
{
"type": "number"
},
{
"type": "boolean"
}
]
}
},
"required": [
"path",
"value"
],
"additionalProperties": false
}
},
"summary": {
"type": "string",
"minLength": 1,
"maxLength": 1200
}
},
"additionalProperties": false
},
"status": {
"type": "string",
"enum": [
"ready",
"blocked",
"incomplete"
]
}
},
"required": [
"issues",
"profile",
"status"
],
"additionalProperties": false
},
"diffTarget": {
"description": "Exact local Git revisions for Review changes mode.",
"oneOf": [
{
"type": "object",
"properties": {
"kind": {
"type": "string",
"const": "working_tree"
},
"baseRevision": {
"type": "string",
"minLength": 1,
"maxLength": 512
},
"contentDigest": {
"type": "string",
"minLength": 1,
"maxLength": 128
},
"headRevision": {
"type": "string",
"minLength": 1,
"maxLength": 512
}
},
"required": [
"kind"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"kind": {
"type": "string",
"const": "commit"
},
"baseRevision": {
"type": "string",
"minLength": 1,
"maxLength": 512
},
"headRevision": {
"type": "string",
"minLength": 1,
"maxLength": 512
}
},
"required": [
"kind",
"headRevision"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"kind": {
"type": "string",
"const": "range"
},
"baseRevision": {
"type": "string",
"minLength": 1,
"maxLength": 512
},
"headRevision": {
"type": "string",
"minLength": 1,
"maxLength": 512
}
},
"required": [
"kind",
"baseRevision",
"headRevision"
],
"additionalProperties": false
}
]
},
"mode": {
"description": "Initial scan mode inferred from the user's request.",
"type": "string",
"enum": [
"diff",
"standard",
"deep"
]
},
"scope": {
"description": "Optional directory inside targetPath. Use '.' or omit it for the whole target. Target-relative paths are preferred; absolute paths inside targetPath are normalized.",
"type": "string",
"minLength": 1,
"maxLength": 4096
},
"sessionId": {
"description": "Existing workspace ID to reopen without changing its setup. When provided, omit all other fields.",
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
},
"targetPath": {
"description": "Optional resolved local target path.",
"type": "string",
"minLength": 1,
"maxLength": 4096
},
"targetSummary": {
"description": "Optional bounded target/security context.",
"type": "string",
"minLength": 1,
"maxLength": 2400
},
"targetTitle": {
"description": "Optional human-readable target name.",
"type": "string",
"minLength": 1,
"maxLength": 200
},
"userContext": {
"description": "Optional security focus supplied by the user.",
"type": "string",
"minLength": 1,
"maxLength": 2400
}
}
},
"annotations": {
"readOnlyHint": false,
"destructiveHint": false,
"idempotentHint": false,
"openWorldHint": false
},
"execution": {
"taskSupport": "forbidden"
},
"_meta": {
"ui": {
"resourceUri": "ui://codex-security/[PLUGIN_VERSION]/workspace.html",
"visibility": [
"model"
]
},
"ui/resourceUri": "ui://codex-security/[PLUGIN_VERSION]/workspace.html",
"openai/outputTemplate": "ui://codex-security/[PLUGIN_VERSION]/workspace.html",
"openai/widgetAccessible": true
}
},
{
"name": "await_codex_security_scan_start",
"title": "Wait for Codex Security Scan Start",
"description": "Wait for the user to press Start scan in an open Codex Security workspace. Call this immediately after open_codex_security_workspace and keep the current turn active. The result supplies the durable scan ID and, when needed, a handoff claim token for get_codex_security_scan_context.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"type": "object",
"properties": {
"sessionId": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
}
},
"required": [
"sessionId"
]
},
"annotations": {
"readOnlyHint": false,
"destructiveHint": false,
"idempotentHint": false,
"openWorldHint": false
},
"execution": {
"taskSupport": "forbidden"
},
"_meta": {
"ui": {
"visibility": [
"model"
]
}
}
},
{
"name": "open_codex_security_triage_results",
"title": "Open Codex Security Triage Results",
"description": "Render an existing triage-finding/v0 result in the Codex Security app as a dense table with one row per supplied finding. This does not create a scan, queue, or durable scanId.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"type": "object",
"properties": {
"result": {
"type": "object",
"properties": {
"findings": {
"maxItems": 250,
"type": "array",
"items": {
"type": "object",
"properties": {
"affected_locations": {
"maxItems": 100,
"type": "array",
"items": {
"type": "object",
"properties": {
"detail": {
"type": "string",
"minLength": 1,
"maxLength": 2400
},
"label": {
"type": "string",
"minLength": 1,
"maxLength": 200
},
"lines": {
"type": "string",
"minLength": 1,
"maxLength": 100
},
"path": {
"type": "string",
"minLength": 1,
"maxLength": 4096
}
},
"required": [
"detail",
"label",
"lines",
"path"
],
"additionalProperties": false
}
},
"boundary_assessment": {
"type": "object",
"properties": {
"boundary_crossed": {
"anyOf": [
{
"type": "boolean"
},
{
"type": "null"
}
]
},
"policy_basis": {
"type": "string",
"minLength": 1,
"maxLength": 2400
},
"product_surface": {
"type": "string",
"minLength": 1,
"maxLength": 200
},
"source_trust": {
"type": "string",
"enum": [
"untrusted",
"trusted_operator",
"trusted_developer_config",
"local_only",
"unknown"
]
}
},
"required": [
"boundary_crossed",
"policy_basis",
"product_surface",
"source_trust"
],
"additionalProperties": false
},
"confidence": {
"type": "string",
"enum": [
"high",
"medium",
"low"
]
},
"counterevidence": {
"maxItems": 100,
"type": "array",
"items": {
"type": "string",
"maxLength": 2400
}
},
"evidence": {
"maxItems": 100,
"type": "array",
"items": {
"type": "string",
"maxLength": 2400
}
},
"exploitability_stack_rank": {
"type": "object",
"properties": {
"drivers": {
"maxItems": 100,
"type": "array",
"items": {
"type": "string",
"maxLength": 2400
}
},
"rank": {
"anyOf": [
{
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"rank_queue": {
"anyOf": [
{
"type": "string",
"enum": [
"confirmed",
"needs_review"
]
},
{
"type": "null"
}
]
},
"rationale": {
"type": "string",
"minLength": 1,
"maxLength": 2400
}
},
"required": [
"drivers",
"rank",
"rank_queue",
"rationale"
],
"additionalProperties": false
},
"fix_finding_handoff": {
"anyOf": [
{
"type": "string",
"minLength": 1,
"maxLength": 12000
},
{
"type": "null"
}
]
},
"input_id": {
"type": "string",
"minLength": 1,
"maxLength": 256
},
"normalized_input": {
"type": "object",
"properties": {
"affected_version_or_path": {
"type": "string",
"minLength": 1,
"maxLength": 4096
},
"claimed_control": {
"type": "string",
"minLength": 1,
"maxLength": 1200
},
"claimed_sink": {
"type": "string",
"minLength": 1,
"maxLength": 1200
},
"claimed_source": {
"type": "string",
"minLength": 1,
"maxLength": 1200
},
"impact": {
"type": "string",
"minLength": 1,
"maxLength": 2400
},
"preconditions": {
"maxItems": 100,
"type": "array",
"items": {
"type": "string",
"maxLength": 2400
}
},
"references": {
"maxItems": 100,
"type": "array",
"items": {
"type": "string",
"maxLength": 2400
}
},
"vulnerable_component": {
"type": "string",
"minLength": 1,
"maxLength": 1200
}
},
"required": [
"affected_version_or_path",
"claimed_control",
"claimed_sink",
"claimed_source",
"impact",
"preconditions",
"references",
"vulnerable_component"
],
"additionalProperties": false
},
"proof_gaps": {
"maxItems": 100,
"type": "array",
"items": {
"type": "string",
"maxLength": 2400
}
},
"reachable_path": {
"maxItems": 100,
"type": "array",
"items": {
"type": "string",
"maxLength": 2400
}
},
"recommended_next_step": {
"type": "string",
"minLength": 1,
"maxLength": 1200
},
"source_type": {
"type": "string",
"enum": [
"sarif",
"cve",
"advisory",
"scanner_ticket",
"bug_bounty",
"codex_security_finding",
"freeform",
"unknown"
]
},
"title": {
"type": "string",
"minLength": 1,
"maxLength": 1200
},
"triage_item_id": {
"type": "string",
"minLength": 1,
"maxLength": 256
},
"verdict": {
"type": "string",
"enum": [
"confirmed",
"not_actionable",
"needs_review"
]
}
},
"required": [
"affected_locations",
"boundary_assessment",
"confidence",
"counterevidence",
"evidence",
"exploitability_stack_rank",
"fix_finding_handoff",
"input_id",
"normalized_input",
"proof_gaps",
"reachable_path",
"recommended_next_step",
"source_type",
"title",
"triage_item_id",
"verdict"
],
"additionalProperties": false
}
},
"repository": {
"type": "object",
"properties": {
"path": {
"type": "string",
"minLength": 1,
"maxLength": 4096
},
"revision": {
"anyOf": [
{
"type": "string",
"minLength": 1,
"maxLength": 512
},
{
"type": "null"
}
]
}
},
"required": [
"path"
],
"additionalProperties": false
},
"schema_version": {
"type": "string",
"const": "triage-finding/v0"
}
},
"required": [
"findings",
"repository",
"schema_version"
],
"additionalProperties": false,
"description": "A complete triage-finding/v0 JSON result to render as a dense findings table."
}
},
"required": [
"result"
]
},
"annotations": {
"readOnlyHint": true,
"destructiveHint": false,
"idempotentHint": true,
"openWorldHint": false
},
"execution": {
"taskSupport": "forbidden"
},
"_meta": {
"ui": {
"resourceUri": "ui://codex-security/[PLUGIN_VERSION]/workspace.html",
"visibility": [
"model"
]
},
"ui/resourceUri": "ui://codex-security/[PLUGIN_VERSION]/workspace.html",
"openai/outputTemplate": "ui://codex-security/[PLUGIN_VERSION]/workspace.html",
"openai/widgetAccessible": true
}
},
{
"name": "open_codex_security_progress",
"title": "Open Codex Security Progress",
"description": "App-only. Reopen the most recently active Codex Security workspace, migrating validated legacy finding details when needed.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"type": "object",
"properties": {}
},
"annotations": {
"readOnlyHint": false,
"destructiveHint": false,
"idempotentHint": true,
"openWorldHint": false
},
"execution": {
"taskSupport": "forbidden"
},
"_meta": {
"ui": {
"resourceUri": "ui://codex-security/[PLUGIN_VERSION]/workspace.html",
"visibility": [
"app"
]
},
"ui/resourceUri": "ui://codex-security/[PLUGIN_VERSION]/workspace.html"
}
},
{
"name": "set_codex_security_capability_preflight",
"title": "Update Codex Security capability preflight",
"description": "Model-only legacy setup compatibility for non-app callers. Do not call this tool for a setup app workspace with setup.submitted=false; wait for the user to press Start scan and receive the app-generated scanId. Do not call this tool after an app-generated scanId either. Continue after a ready result. For a blocked or incomplete result, follow the documented remediation handling and wait for the user's answer when remediation is actionable. Do not fail automatically for declined or unavailable remediation, helper errors, or a non-ready rerun; preserve the running scan and retry or hand off while recovery may still be possible. Call fail_codex_security_scan only after documented recovery is exhausted and the blocker is confirmed unrecoverable, or when the user explicitly cancels.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"type": "object",
"properties": {
"capabilityPreflight": {
"type": "object",
"properties": {
"issues": {
"maxItems": 32,
"type": "array",
"items": {
"type": "object",
"properties": {
"capability": {
"type": "string",
"minLength": 1,
"maxLength": 128
},
"reason": {
"type": "string",
"minLength": 1,
"maxLength": 1200
},
"severity": {
"type": "string",
"enum": [
"block",
"warn",
"suggest"
]
},
"status": {
"type": "string",
"enum": [
"fail",
"unknown"
]
}
},
"required": [
"capability",
"reason",
"severity",
"status"
],
"additionalProperties": false
}
},
"profile": {
"type": "string",
"minLength": 1,
"maxLength": 128
},
"remediation": {
"type": "object",
"properties": {
"note": {
"type": "string",
"minLength": 1,
"maxLength": 2400
},
"patches": {
"maxItems": 32,
"type": "array",
"items": {
"type": "object",
"properties": {
"kind": {
"type": "string",
"enum": [
"config",
"host_setting"
]
},
"path": {
"type": "string",
"minLength": 1,
"maxLength": 256
},
"value": {
"anyOf": [
{
"type": "string",
"maxLength": 2048
},
{
"type": "number"
},
{
"type": "boolean"
}
]
}
},
"required": [
"path",
"value"
],
"additionalProperties": false
}
},
"summary": {
"type": "string",
"minLength": 1,
"maxLength": 1200
}
},
"additionalProperties": false
},
"status": {
"type": "string",
"enum": [
"ready",
"blocked",
"incomplete"
]
}
},
"required": [
"issues",
"profile",
"status"
],
"additionalProperties": false,
"description": "Fresh compact capability preflight for non-app legacy callers, including a ready result with an empty issues list after a clean check."
},
"mode": {
"type": "string",
"enum": [
"diff",
"standard",
"deep"
],
"description": "Scan mode that was checked."
},
"sessionId": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
},
"targetPath": {
"type": "string",
"minLength": 1,
"maxLength": 4096,
"description": "Absolute local target path that was checked."
}
},
"required": [
"capabilityPreflight",
"mode",
"sessionId",
"targetPath"
]
},
"annotations": {
"readOnlyHint": false,
"destructiveHint": false,
"idempotentHint": true,
"openWorldHint": false
},
"execution": {
"taskSupport": "forbidden"
},
"_meta": {
"ui": {
"visibility": [
"model"
]
},
"openai/widgetAccessible": false
}
},
{
"name": "begin_codex_security_diff_resolution",
"title": "Begin Codex Security Change Resolution",
"description": "App-only. Record the active free-form change request before Codex resolves it to exact local Git revisions.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"type": "object",
"properties": {
"requestId": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
},
"sessionId": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
},
"targetPath": {
"type": "string",
"minLength": 1,
"maxLength": 4096
},
"userContext": {
"type": "string",
"minLength": 1,
"maxLength": 2400
}
},
"required": [
"requestId",
"sessionId",
"targetPath",
"userContext"
]
},
"annotations": {
"readOnlyHint": false,
"destructiveHint": false,
"idempotentHint": false,
"openWorldHint": false
},
"execution": {
"taskSupport": "forbidden"
},
"_meta": {
"ui": {
"resourceUri": "ui://codex-security/[PLUGIN_VERSION]/workspace.html",
"visibility": [
"app"
]
},
"ui/resourceUri": "ui://codex-security/[PLUGIN_VERSION]/workspace.html"
}
},
{
"name": "cancel_codex_security_diff_resolution",
"title": "Cancel Codex Security Change Resolution",
"description": "App-only. Stop accepting a pending free-form change-resolution result.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"type": "object",
"properties": {
"requestId": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
},
"sessionId": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
}
},
"required": [
"requestId",
"sessionId"
]
},
"annotations": {
"readOnlyHint": false,
"destructiveHint": false,
"idempotentHint": true,
"openWorldHint": false
},
"execution": {
"taskSupport": "forbidden"
},
"_meta": {
"ui": {
"resourceUri": "ui://codex-security/[PLUGIN_VERSION]/workspace.html",
"visibility": [
"app"
]
},
"ui/resourceUri": "ui://codex-security/[PLUGIN_VERSION]/workspace.html"
}
},
{
"name": "set_codex_security_resolved_diff",
"title": "Set Resolved Codex Security Changes",
"description": "Record exact local Git revisions after resolving a user's free-form change request. Do not change the selected checkout. Resolve refs to commits before calling this tool; use a concise human-readable target summary.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"type": "object",
"properties": {
"diffTarget": {
"oneOf": [
{
"type": "object",
"properties": {
"kind": {
"type": "string",
"const": "working_tree"
},
"baseRevision": {
"type": "string",
"minLength": 1,
"maxLength": 512
},
"contentDigest": {
"type": "string",
"minLength": 1,
"maxLength": 128
},
"headRevision": {
"type": "string",
"minLength": 1,
"maxLength": 512
}
},
"required": [
"kind"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"kind": {
"type": "string",
"const": "commit"
},
"baseRevision": {
"type": "string",
"minLength": 1,
"maxLength": 512
},
"headRevision": {
"type": "string",
"minLength": 1,
"maxLength": 512
}
},
"required": [
"kind",
"headRevision"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"kind": {
"type": "string",
"const": "range"
},
"baseRevision": {
"type": "string",
"minLength": 1,
"maxLength": 512
},
"headRevision": {
"type": "string",
"minLength": 1,
"maxLength": 512
}
},
"required": [
"kind",
"baseRevision",
"headRevision"
],
"additionalProperties": false
}
]
},
"requestId": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
},
"sessionId": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
},
"targetSummary": {
"type": "string",
"minLength": 1,
"maxLength": 2400
}
},
"required": [
"diffTarget",
"requestId",
"sessionId",
"targetSummary"
]
},
"annotations": {
"readOnlyHint": false,
"destructiveHint": false,
"idempotentHint": false,
"openWorldHint": false
},
"execution": {
"taskSupport": "forbidden"
},
"_meta": {
"ui": {
"visibility": [
"model"
]
}
}
},
{
"name": "get_codex_security_workspace_state",
"title": "Refresh Codex Security Workspace",
"description": "App-only. Refresh saved scan state and indexed findings, migrating validated legacy finding details when needed.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"type": "object",
"properties": {
"sessionId": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
}
},
"required": [
"sessionId"
]
},
"annotations": {
"readOnlyHint": false,
"destructiveHint": false,
"idempotentHint": true,
"openWorldHint": false
},
"execution": {
"taskSupport": "forbidden"
},
"_meta": {
"ui": {
"resourceUri": "ui://codex-security/[PLUGIN_VERSION]/workspace.html",
"visibility": [
"app"
]
},
"ui/resourceUri": "ui://codex-security/[PLUGIN_VERSION]/workspace.html"
}
},
{
"name": "inspect_codex_security_target",
"title": "Inspect Codex Security Target",
"description": "App-only. Validate a local target directory and derive its display and Git metadata without saving setup.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"type": "object",
"properties": {
"targetPath": {
"type": "string",
"minLength": 1,
"maxLength": 4096
}
},
"required": [
"targetPath"
]
},
"annotations": {
"readOnlyHint": true,
"destructiveHint": false,
"idempotentHint": true,
"openWorldHint": false
},
"execution": {
"taskSupport": "forbidden"
},
"_meta": {
"ui": {
"resourceUri": "ui://codex-security/[PLUGIN_VERSION]/workspace.html",
"visibility": [
"app"
]
},
"ui/resourceUri": "ui://codex-security/[PLUGIN_VERSION]/workspace.html"
}
},
{
"name": "inspect_codex_security_setup",
"title": "Validate Codex Security Setup",
"description": "App-only. Resolve and validate the complete local target, scope, mode, and exact Git change set without saving setup.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"type": "object",
"properties": {
"diffTarget": {
"oneOf": [
{
"type": "object",
"properties": {
"kind": {
"type": "string",
"const": "working_tree"
},
"baseRevision": {
"type": "string",
"minLength": 1,
"maxLength": 512
},
"contentDigest": {
"type": "string",
"minLength": 1,
"maxLength": 128
},
"headRevision": {
"type": "string",
"minLength": 1,
"maxLength": 512
}
},
"required": [
"kind"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"kind": {
"type": "string",
"const": "commit"
},
"baseRevision": {
"type": "string",
"minLength": 1,
"maxLength": 512
},
"headRevision": {
"type": "string",
"minLength": 1,
"maxLength": 512
}
},
"required": [
"kind",
"headRevision"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"kind": {
"type": "string",
"const": "range"
},
"baseRevision": {
"type": "string",
"minLength": 1,
"maxLength": 512
},
"headRevision": {
"type": "string",
"minLength": 1,
"maxLength": 512
}
},
"required": [
"kind",
"baseRevision",
"headRevision"
],
"additionalProperties": false
}
]
},
"mode": {
"type": "string",
"enum": [
"diff",
"standard",
"deep"
]
},
"scope": {
"type": "string",
"minLength": 1,
"maxLength": 4096
},
"targetPath": {
"type": "string",
"minLength": 1,
"maxLength": 4096
}
},
"required": [
"mode",
"scope",
"targetPath"
]
},
"annotations": {
"readOnlyHint": true,
"destructiveHint": false,
"idempotentHint": true,
"openWorldHint": false
},
"execution": {
"taskSupport": "forbidden"
},
"_meta": {
"ui": {
"resourceUri": "ui://codex-security/[PLUGIN_VERSION]/workspace.html",
"visibility": [
"app"
]
},
"ui/resourceUri": "ui://codex-security/[PLUGIN_VERSION]/workspace.html"
}
},
{
"name": "submit_codex_security_setup",
"title": "Save Codex Security Setup",
"description": "App-only. Validate and save bounded target, scope, mode, and optional context selections.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"type": "object",
"properties": {
"diffTarget": {
"oneOf": [
{
"type": "object",
"properties": {
"kind": {
"type": "string",
"const": "working_tree"
},
"baseRevision": {
"type": "string",
"minLength": 1,
"maxLength": 512
},
"contentDigest": {
"type": "string",
"minLength": 1,
"maxLength": 128
},
"headRevision": {
"type": "string",
"minLength": 1,
"maxLength": 512
}
},
"required": [
"kind"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"kind": {
"type": "string",
"const": "commit"
},
"baseRevision": {
"type": "string",
"minLength": 1,
"maxLength": 512
},
"headRevision": {
"type": "string",
"minLength": 1,
"maxLength": 512
}
},
"required": [
"kind",
"headRevision"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"kind": {
"type": "string",
"const": "range"
},
"baseRevision": {
"type": "string",
"minLength": 1,
"maxLength": 512
},
"headRevision": {
"type": "string",
"minLength": 1,
"maxLength": 512
}
},
"required": [
"kind",
"baseRevision",
"headRevision"
],
"additionalProperties": false
}
]
},
"mode": {
"type": "string",
"enum": [
"diff",
"standard",
"deep"
]
},
"scope": {
"type": "string",
"minLength": 1,
"maxLength": 4096
},
"sessionId": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
},
"targetPath": {
"type": "string",
"minLength": 1,
"maxLength": 4096
},
"targetSummary": {
"type": "string",
"maxLength": 2400
},
"userContext": {
"type": "string",
"maxLength": 2400
}
},
"required": [
"mode",
"scope",
"sessionId",
"targetPath"
]
},
"annotations": {
"readOnlyHint": false,
"destructiveHint": false,
"idempotentHint": true,
"openWorldHint": false
},
"execution": {
"taskSupport": "forbidden"
},
"_meta": {
"ui": {
"resourceUri": "ui://codex-security/[PLUGIN_VERSION]/workspace.html",
"visibility": [
"app"
]
},
"ui/resourceUri": "ui://codex-security/[PLUGIN_VERSION]/workspace.html"
}
},
{
"name": "start_codex_security_scan",
"title": "Start Codex Security Scan",
"description": "App-only. Create a scan record and its local artifact directory before Codex analysis begins.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"type": "object",
"properties": {
"sessionId": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
}
},
"required": [
"sessionId"
]
},
"annotations": {
"readOnlyHint": false,
"destructiveHint": false,
"idempotentHint": false,
"openWorldHint": false
},
"execution": {
"taskSupport": "forbidden"
},
"_meta": {
"ui": {
"resourceUri": "ui://codex-security/[PLUGIN_VERSION]/workspace.html",
"visibility": [
"app"
]
},
"ui/resourceUri": "ui://codex-security/[PLUGIN_VERSION]/workspace.html"
}
},
{
"name": "cancel_codex_security_scan",
"title": "Cancel Codex Security Scan",
"description": "App-only. Stop a running scan and prevent further progress or completion updates.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"type": "object",
"properties": {
"scanId": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
}
},
"required": [
"scanId"
]
},
"annotations": {
"readOnlyHint": false,
"destructiveHint": true,
"idempotentHint": true,
"openWorldHint": false
},
"execution": {
"taskSupport": "forbidden"
},
"_meta": {
"ui": {
"resourceUri": "ui://codex-security/[PLUGIN_VERSION]/workspace.html",
"visibility": [
"app"
]
},
"ui/resourceUri": "ui://codex-security/[PLUGIN_VERSION]/workspace.html"
}
},
{
"name": "mark_codex_security_scan_handoff_delivered",
"title": "Record Delivered Codex Security Handoff",
"description": "App-only. Record that the launched scan instructions were delivered to Codex.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"type": "object",
"properties": {
"claimToken": {
"anyOf": [
{
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
},
{
"type": "string",
"pattern": "^recovery_[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$"
}
]
},
"scanId": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
}
},
"required": [
"claimToken",
"scanId"
]
},
"annotations": {
"readOnlyHint": false,
"destructiveHint": false,
"idempotentHint": true,
"openWorldHint": false
},
"execution": {
"taskSupport": "forbidden"
},
"_meta": {
"ui": {
"resourceUri": "ui://codex-security/[PLUGIN_VERSION]/workspace.html",
"visibility": [
"app"
]
},
"ui/resourceUri": "ui://codex-security/[PLUGIN_VERSION]/workspace.html"
}
},
{
"name": "claim_codex_security_scan_handoff_delivery",
"title": "Claim Codex Security Handoff Delivery",
"description": "App-only. Durably claim scan handoff delivery before sending continuation instructions to Codex.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"type": "object",
"properties": {
"claimToken": {
"anyOf": [
{
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
},
{
"type": "string",
"pattern": "^recovery_[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$"
}
]
},
"scanId": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
},
"takeOverStale": {
"type": "boolean"
}
},
"required": [
"claimToken",
"scanId"
]
},
"annotations": {
"readOnlyHint": false,
"destructiveHint": false,
"idempotentHint": true,
"openWorldHint": false
},
"execution": {
"taskSupport": "forbidden"
},
"_meta": {
"ui": {
"resourceUri": "ui://codex-security/[PLUGIN_VERSION]/workspace.html",
"visibility": [
"app"
]
},
"ui/resourceUri": "ui://codex-security/[PLUGIN_VERSION]/workspace.html"
}
},
{
"name": "release_codex_security_scan_handoff_delivery",
"title": "Release Codex Security Handoff Delivery",
"description": "App-only. Release a failed scan handoff delivery claim so the app can retry it.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"type": "object",
"properties": {
"claimToken": {
"anyOf": [
{
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
},
{
"type": "string",
"pattern": "^recovery_[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$"
}
]
},
"scanId": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
}
},
"required": [
"claimToken",
"scanId"
]
},
"annotations": {
"readOnlyHint": false,
"destructiveHint": false,
"idempotentHint": true,
"openWorldHint": false
},
"execution": {
"taskSupport": "forbidden"
},
"_meta": {
"ui": {
"resourceUri": "ui://codex-security/[PLUGIN_VERSION]/workspace.html",
"visibility": [
"app"
]
},
"ui/resourceUri": "ui://codex-security/[PLUGIN_VERSION]/workspace.html"
}
},
{
"name": "get_codex_security_scan_context",
"title": "Get Codex Security Scan Context",
"description": "Load the authoritative target, mode, optional user context, artifact directory, live progress, and optional selected finding for a launched scan. Validated legacy finding details may be migrated.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"type": "object",
"properties": {
"scanId": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
},
"handoffClaimToken": {
"description": "Opaque delivery token returned by await_codex_security_scan_start or the explicit recovery action. Pass it once so Codex can acknowledge that this continuation received the scan.",
"anyOf": [
{
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
},
{
"type": "string",
"pattern": "^recovery_[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$"
}
]
},
"occurrenceId": {
"description": "Optional finding occurrence to include even when it is outside the bounded findings prefix.",
"type": "string",
"minLength": 1,
"maxLength": 256
}
},
"required": [
"scanId"
]
},
"annotations": {
"readOnlyHint": false,
"destructiveHint": false,
"idempotentHint": true,
"openWorldHint": false
},
"execution": {
"taskSupport": "forbidden"
},
"_meta": {
"ui": {
"visibility": [
"model"
]
}
}
},
{
"name": "update_codex_security_scan_progress",
"title": "Update Codex Security Scan Progress",
"description": "Record a meaningful live scan phase or coverage milestone in the Codex Security workbench.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"type": "object",
"properties": {
"deepReviewPass": {
"description": "Current Deep Scan discovery pass. Send it when starting each pass together with that pass's total and zero completed items.",
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 9007199254740991
},
"phase": {
"description": "Current workflow phase. Send it immediately when the scan enters a new phase so the live workspace advances.",
"type": "string",
"enum": [
"preflight",
"threat_model",
"discovery",
"validation",
"attack_path",
"reporting"
]
},
"reportableFindingsCount": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
"reviewItemsCompleted": {
"description": "Cumulative completed review receipts in the current discovery pass. Increment only after a review and its coverage receipt are complete.",
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
"reviewItemsTotal": {
"description": "Expected review receipts in the current discovery pass, fixed after the worklist and worker assignments are known.",
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
"scanId": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
}
},
"required": [
"scanId"
]
},
"annotations": {
"readOnlyHint": false,
"destructiveHint": false,
"idempotentHint": true,
"openWorldHint": false
},
"execution": {
"taskSupport": "forbidden"
},
"_meta": {
"ui": {
"visibility": [
"model"
]
}
}
},
{
"name": "complete_codex_security_scan",
"title": "Complete Codex Security Scan",
"description": "Validate and index finalized scan artifacts, then mark the Codex Security scan complete.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"type": "object",
"properties": {
"scanId": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
}
},
"required": [
"scanId"
]
},
"annotations": {
"readOnlyHint": false,
"destructiveHint": false,
"idempotentHint": true,
"openWorldHint": false
},
"execution": {
"taskSupport": "forbidden"
},
"_meta": {
"ui": {
"resourceUri": "ui://codex-security/[PLUGIN_VERSION]/workspace.html",
"visibility": [
"model"
]
},
"ui/resourceUri": "ui://codex-security/[PLUGIN_VERSION]/workspace.html",
"openai/outputTemplate": "ui://codex-security/[PLUGIN_VERSION]/workspace.html",
"openai/widgetAccessible": true
}
},
{
"name": "fail_codex_security_scan",
"title": "Fail Codex Security Scan",
"description": "Permanently mark a launched Codex Security scan as failed after an unrecoverable blocker or explicit cancellation. This terminal action cannot be resumed; incomplete or otherwise resumable work must remain running.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"type": "object",
"properties": {
"message": {
"type": "string",
"minLength": 1,
"maxLength": 2400
},
"scanId": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
}
},
"required": [
"message",
"scanId"
]
},
"annotations": {
"readOnlyHint": false,
"destructiveHint": true,
"idempotentHint": true,
"openWorldHint": false
},
"execution": {
"taskSupport": "forbidden"
},
"_meta": {
"ui": {
"visibility": [
"model"
]
}
}
},
{
"name": "set_codex_security_finding_triage",
"title": "Update Codex Security Finding Status",
"description": "App-only. Persist a completed finding's local open or closed triage status. Closed findings require one bounded close reason; reopening clears it.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"type": "object",
"properties": {
"closeReason": {
"type": "string",
"enum": [
"already_fixed",
"wont_fix",
"false_positive"
]
},
"note": {
"type": "string",
"maxLength": 2400
},
"occurrenceId": {
"type": "string",
"minLength": 1,
"maxLength": 256
},
"status": {
"type": "string",
"enum": [
"open",
"closed"
]
}
},
"required": [
"occurrenceId",
"status"
]
},
"annotations": {
"readOnlyHint": false,
"destructiveHint": false,
"idempotentHint": true,
"openWorldHint": false
},
"execution": {
"taskSupport": "forbidden"
},
"_meta": {
"ui": {
"resourceUri": "ui://codex-security/[PLUGIN_VERSION]/workspace.html",
"visibility": [
"app"
]
},
"ui/resourceUri": "ui://codex-security/[PLUGIN_VERSION]/workspace.html"
}
},
{
"name": "request_codex_security_finding_remediation",
"title": "Request Codex Security Finding Remediation",
"description": "App-only. Queue a completed finding for Codex remediation before sending the host a generate or regenerate request.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"type": "object",
"properties": {
"actionToken": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
},
"occurrenceId": {
"type": "string",
"minLength": 1,
"maxLength": 256
},
"requestId": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
}
},
"required": [
"actionToken",
"occurrenceId",
"requestId"
]
},
"annotations": {
"readOnlyHint": false,
"destructiveHint": false,
"idempotentHint": true,
"openWorldHint": false
},
"execution": {
"taskSupport": "forbidden"
},
"_meta": {
"ui": {
"resourceUri": "ui://codex-security/[PLUGIN_VERSION]/workspace.html",
"visibility": [
"app"
]
},
"ui/resourceUri": "ui://codex-security/[PLUGIN_VERSION]/workspace.html"
}
},
{
"name": "request_codex_security_finding_remediation_action",
"title": "Request Codex Security Finding Remediation Action",
"description": "App-only. Durably claim an apply or verify handoff before asking Codex to perform the local working-tree operation.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"type": "object",
"properties": {
"action": {
"type": "string",
"enum": [
"apply",
"verify"
]
},
"actionToken": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
},
"expectedVersion": {
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 9007199254740991
},
"occurrenceId": {
"type": "string",
"minLength": 1,
"maxLength": 256
},
"requestId": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
}
},
"required": [
"action",
"actionToken",
"expectedVersion",
"occurrenceId",
"requestId"
]
},
"annotations": {
"readOnlyHint": false,
"destructiveHint": false,
"idempotentHint": true,
"openWorldHint": false
},
"execution": {
"taskSupport": "forbidden"
},
"_meta": {
"ui": {
"resourceUri": "ui://codex-security/[PLUGIN_VERSION]/workspace.html",
"visibility": [
"app"
]
},
"ui/resourceUri": "ui://codex-security/[PLUGIN_VERSION]/workspace.html"
}
},
{
"name": "claim_codex_security_finding_remediation_resend",
"title": "Claim Codex Security Finding Remediation Resend",
"description": "App-only. Atomically take ownership of an unowned or stale remediation host request before resending it.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"type": "object",
"properties": {
"actionToken": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
},
"occurrenceId": {
"type": "string",
"minLength": 1,
"maxLength": 256
},
"requestId": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
}
},
"required": [
"actionToken",
"occurrenceId",
"requestId"
]
},
"annotations": {
"readOnlyHint": false,
"destructiveHint": false,
"idempotentHint": true,
"openWorldHint": false
},
"execution": {
"taskSupport": "forbidden"
},
"_meta": {
"ui": {
"resourceUri": "ui://codex-security/[PLUGIN_VERSION]/workspace.html",
"visibility": [
"app"
]
},
"ui/resourceUri": "ui://codex-security/[PLUGIN_VERSION]/workspace.html"
}
},
{
"name": "release_codex_security_finding_remediation_claim",
"title": "Release Codex Security Finding Remediation Claim",
"description": "App-only. Release a locally owned remediation host request after message delivery fails.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"type": "object",
"properties": {
"actionToken": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
},
"occurrenceId": {
"type": "string",
"minLength": 1,
"maxLength": 256
},
"requestId": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
}
},
"required": [
"actionToken",
"occurrenceId",
"requestId"
]
},
"annotations": {
"readOnlyHint": false,
"destructiveHint": false,
"idempotentHint": true,
"openWorldHint": false
},
"execution": {
"taskSupport": "forbidden"
},
"_meta": {
"ui": {
"resourceUri": "ui://codex-security/[PLUGIN_VERSION]/workspace.html",
"visibility": [
"app"
]
},
"ui/resourceUri": "ui://codex-security/[PLUGIN_VERSION]/workspace.html"
}
},
{
"name": "cancel_codex_security_finding_remediation_request",
"title": "Cancel Codex Security Finding Remediation Request",
"description": "App-only. Roll back an owned remediation request after the user declines its host follow-up.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"type": "object",
"properties": {
"actionToken": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
},
"occurrenceId": {
"type": "string",
"minLength": 1,
"maxLength": 256
},
"requestId": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
}
},
"required": [
"actionToken",
"occurrenceId",
"requestId"
]
},
"annotations": {
"readOnlyHint": false,
"destructiveHint": true,
"idempotentHint": true,
"openWorldHint": false
},
"execution": {
"taskSupport": "forbidden"
},
"_meta": {
"ui": {
"resourceUri": "ui://codex-security/[PLUGIN_VERSION]/workspace.html",
"visibility": [
"app"
]
},
"ui/resourceUri": "ui://codex-security/[PLUGIN_VERSION]/workspace.html"
}
},
{
"name": "mark_codex_security_finding_remediation_delivered",
"title": "Mark Codex Security Finding Remediation Delivered",
"description": "App-only. Seal host-message delivery ownership before Codex starts a remediation worker.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"type": "object",
"properties": {
"actionToken": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
},
"occurrenceId": {
"type": "string",
"minLength": 1,
"maxLength": 256
},
"requestId": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
}
},
"required": [
"actionToken",
"occurrenceId",
"requestId"
]
},
"annotations": {
"readOnlyHint": false,
"destructiveHint": false,
"idempotentHint": true,
"openWorldHint": false
},
"execution": {
"taskSupport": "forbidden"
},
"_meta": {
"ui": {
"resourceUri": "ui://codex-security/[PLUGIN_VERSION]/workspace.html",
"visibility": [
"app"
]
},
"ui/resourceUri": "ui://codex-security/[PLUGIN_VERSION]/workspace.html"
}
},
{
"name": "set_codex_security_finding_remediation",
"title": "Update Codex Security Finding Remediation",
"description": "Persist the bounded local remediation workflow state for a completed finding. The UI may mark a request as queued; Codex records generated, applied, verifying, verified, or failed states after performing the corresponding work.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"type": "object",
"properties": {
"actionToken": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
},
"baseRevision": {
"type": "string",
"minLength": 1,
"maxLength": 512
},
"expectedVersion": {
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 9007199254740991
},
"occurrenceId": {
"type": "string",
"minLength": 1,
"maxLength": 256
},
"patchDigest": {
"type": "string",
"pattern": "^sha256:[a-f0-9]{64}$"
},
"patchPath": {
"type": "string",
"minLength": 1,
"maxLength": 4096
},
"requestId": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
},
"state": {
"type": "string",
"enum": [
"generated",
"applied",
"verifying",
"verified",
"failed"
]
},
"summary": {
"type": "string",
"maxLength": 2400
},
"verificationSummary": {
"type": "string",
"maxLength": 2400
}
},
"required": [
"actionToken",
"expectedVersion",
"occurrenceId",
"requestId",
"state"
]
},
"annotations": {
"readOnlyHint": false,
"destructiveHint": false,
"idempotentHint": false,
"openWorldHint": false
},
"execution": {
"taskSupport": "forbidden"
},
"_meta": {
"ui": {
"visibility": [
"model"
]
}
}
},
{
"name": "export_codex_security_findings",
"title": "Export Codex Security Findings",
"description": "App-only. Export completed local findings as canonical JSON, deterministic SARIF, or a CSV projection. Exported files remain inside the sealed scan directory.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"type": "object",
"properties": {
"format": {
"type": "string",
"enum": [
"csv",
"json",
"sarif"
]
},
"scanId": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
}
},
"required": [
"format",
"scanId"
]
},
"annotations": {
"readOnlyHint": false,
"destructiveHint": false,
"idempotentHint": true,
"openWorldHint": false
},
"execution": {
"taskSupport": "forbidden"
},
"_meta": {
"ui": {
"resourceUri": "ui://codex-security/[PLUGIN_VERSION]/workspace.html",
"visibility": [
"app"
]
},
"ui/resourceUri": "ui://codex-security/[PLUGIN_VERSION]/workspace.html"
}
},
{
"name": "list_codex_security_findings",
"title": "List Codex Security Findings",
"description": "App-only. Load one bounded page of indexed findings for a completed local scan, migrating validated legacy finding details when needed.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"type": "object",
"properties": {
"limit": {
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 50
},
"offset": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
"scanId": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
}
},
"required": [
"scanId"
]
},
"annotations": {
"readOnlyHint": false,
"destructiveHint": false,
"idempotentHint": true,
"openWorldHint": false
},
"execution": {
"taskSupport": "forbidden"
},
"_meta": {
"ui": {
"resourceUri": "ui://codex-security/[PLUGIN_VERSION]/workspace.html",
"visibility": [
"app"
]
},
"ui/resourceUri": "ui://codex-security/[PLUGIN_VERSION]/workspace.html"
}
},
{
"name": "sites.get_environment",
"title": "get_environment",
"description": "Deprecated legacy Codex app alias. Use get_environment_variables instead.",
"inputSchema": {
"properties": {
"project_id": {
"description": "Site project ID",
"title": "Project Id",
"type": "string"
}
},
"required": [
"project_id"
],
"title": "get_environment_input",
"type": "object",
"additionalProperties": false
},
"outputSchema": {
"properties": {
"result": {
"properties": {
"project_id": {
"title": "Project Id",
"type": "string"
},
"entries": {
"items": {
"properties": {
"key": {
"title": "Key",
"type": "string"
},
"value": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Value"
},
"is_secret": {
"default": false,
"title": "Is Secret",
"type": "boolean"
},
"type": {
"const": "envvar",
"default": "envvar",
"title": "Type",
"type": "string"
}
},
"required": [
"key",
"value"
],
"title": "AppgardenEnvironmentEnvVarEntryResponse",
"type": "object",
"additionalProperties": false
},
"title": "Entries",
"type": "array"
},
"revision": {
"title": "Revision",
"type": "integer"
},
"updated_at": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Updated At"
}
},
"required": [
"project_id",
"entries",
"revision",
"updated_at"
],
"title": "AppgardenEnvironmentResponse",
"type": "object",
"additionalProperties": false
}
},
"required": [
"result"
],
"title": "get_environment_output",
"type": "object",
"additionalProperties": false
},
"annotations": {
"readOnlyHint": true,
"destructiveHint": false,
"openWorldHint": false
},
"_meta": {
"openai/outputTemplate": null,
"ui": {
"visibility": [
"app"
]
},
"resource_name": "sites.get_environment",
"_codex_apps": {
"resource_uri": "/[CONNECTOR_ID]/implicit_link::[CONNECTOR_ID]/get_environment",
"contains_mcp_source": false
},
"connector_id": "[CONNECTOR_ID]",
"connector_name": "Sites",
"connector_description": "Use Sites to build, save, deploy, and inspect websites such as landing pages, portfolios, dashboards, portals, trackers, hubs, games, and internal tools. Always use Sites when .openai/hosting.json exists. Use Sites skills for local implementation, validation, source preparation, and artifact packaging. Use this connector for site creation, runtime environment variables, versions, production deployments, and access controls. Read .openai/hosting.json before creating a site and reuse its project_id when present. Treat Sites IDs and cursors as opaque: copy them exactly from .openai/hosting.json or Sites responses as applicable, and never invent, reformat, derive, or substitute them. Never call create_site more than once for the same local site. Push the exact source state before saving a version. commit_sha must identify that pushed state, and any archive must be built from it. Deploy only saved versions; every Sites deployment URL is production. Inspect deployment status when the initial result is non-terminal or the user asks for progress. Unless the user asks for local-only work or a saved version without deployment, finish deployable site work with a production deployment.",
"link_id": "implicit_link::[CONNECTOR_ID]"
}
},
{
"name": "sites.get_project",
"title": "get_project",
"description": "Deprecated legacy Codex app alias. Use get_site instead.",
"inputSchema": {
"properties": {
"project_id": {
"description": "Site project ID",
"title": "Project Id",
"type": "string"
}
},
"required": [
"project_id"
],
"title": "get_project_input",
"type": "object",
"additionalProperties": false
},
"outputSchema": {
"properties": {
"result": {
"properties": {
"id": {
"description": "Opaque site project ID. Pass this exact value as project_id.",
"title": "Id",
"type": "string"
},
"title": {
"title": "Title",
"type": "string"
},
"description": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Description"
},
"slug": {
"title": "Slug",
"type": "string"
},
"status": {
"enum": [
"active",
"archived",
"suspended"
],
"title": "AppProjectStatus",
"type": "string"
},
"auth_client_id": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Auth Client Id"
},
"latest_version_number": {
"title": "Latest Version Number",
"type": "integer"
},
"current_preview_url": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Current Preview Url"
},
"current_live_url": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Current Live Url"
},
"screenshot_url": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Screenshot Url"
},
"disabled_by": {
"anyOf": [
{
"enum": [
"workspace_admin",
"openai"
],
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"title": "Disabled By"
},
"created_at": {
"title": "Created At",
"type": "string"
},
"updated_at": {
"title": "Updated At",
"type": "string"
},
"source_repository_credential": {
"anyOf": [
{
"properties": {
"provider": {
"description": "Source repository provider.",
"title": "Provider",
"type": "string"
},
"app_repository_id": {
"description": "AppGen AppRepository id.",
"title": "App Repository Id",
"type": "string"
},
"repository": {
"description": "Provider repository name bound to the AppGen project.",
"title": "Repository",
"type": "string"
},
"branch": {
"description": "Default branch the client should push.",
"title": "Branch",
"type": "string"
},
"remote_url": {
"description": "Git remote URL without embedded credentials.",
"title": "Remote Url",
"type": "string"
},
"token": {
"description": "Short-lived repo-scoped Git token.",
"title": "Token",
"type": "string"
},
"token_expires_at": {
"description": "Token expiration timestamp when provided.",
"title": "Token Expires At",
"type": "string"
},
"auth_mode": {
"description": "Git authentication mode for the token.",
"title": "Auth Mode",
"type": "string"
}
},
"required": [
"provider",
"app_repository_id",
"repository",
"branch",
"remote_url",
"token",
"token_expires_at",
"auth_mode"
],
"title": "AppgardenSourceRepositoryCredentialResponse",
"type": "object",
"additionalProperties": false
},
{
"type": "null"
}
],
"default": null,
"description": "Short-lived source repository write credential when requested."
},
"access_mode": {
"anyOf": [
{
"enum": [
"public",
"admins_only",
"workspace_all",
"custom"
],
"title": "AppProjectAccessMode",
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "Workspace access mode for this Sites project, or null for non-workspace apps."
},
"access_policy": {
"anyOf": [
{
"properties": {
"project_id": {
"description": "Appgen project ID",
"title": "Project Id",
"type": "string"
},
"access_mode": {
"allOf": [
{
"enum": [
"public",
"admins_only",
"workspace_all",
"custom"
],
"title": "AppProjectAccessMode",
"type": "string"
}
],
"description": "Access mode for the app."
},
"allowed_account_user_ids": {
"description": "Account user ID allowlist for the app.",
"items": {
"type": "string"
},
"title": "Allowed Account User Ids",
"type": "array"
},
"allowed_users": {
"description": "User details resolved from allowed_account_user_ids.",
"items": {
"properties": {
"account_user_id": {
"description": "Account user ID for the allowed user.",
"title": "Account User Id",
"type": "string"
},
"email": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "Email address for the allowed user, when available.",
"title": "Email"
},
"name": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "Display name for the allowed user, when available.",
"title": "Name"
}
},
"required": [
"account_user_id"
],
"title": "AppGardenAccessUserResponse",
"type": "object",
"additionalProperties": false
},
"title": "Allowed Users",
"type": "array"
},
"allowed_groups": {
"description": "Group details resolved from allowed workspace and tenant group IDs.",
"items": {
"properties": {
"id": {
"description": "Group ID to use in an Appgen access policy.",
"title": "Id",
"type": "string"
},
"name": {
"description": "Group display name.",
"title": "Name",
"type": "string"
},
"size": {
"description": "Total number of members in the group.",
"title": "Size",
"type": "integer"
}
},
"required": [
"id",
"name",
"size"
],
"title": "AppGardenAccessGroupResponse",
"type": "object",
"additionalProperties": false
},
"title": "Allowed Groups",
"type": "array"
},
"allowed_workspace_group_ids": {
"description": "Workspace group ID allowlist for the app.",
"items": {
"type": "string"
},
"title": "Allowed Workspace Group Ids",
"type": "array"
},
"allowed_tenant_group_ids": {
"description": "Tenant group ID allowlist for the app.",
"items": {
"type": "string"
},
"title": "Allowed Tenant Group Ids",
"type": "array"
},
"revision": {
"description": "Monotonic access policy revision.",
"title": "Revision",
"type": "integer"
},
"updated_at": {
"description": "Access policy update timestamp.",
"title": "Updated At",
"type": "string"
}
},
"required": [
"project_id",
"access_mode",
"allowed_account_user_ids",
"allowed_users",
"allowed_groups",
"allowed_workspace_group_ids",
"allowed_tenant_group_ids",
"revision",
"updated_at"
],
"title": "AppGardenAccessPolicyResponse",
"type": "object",
"additionalProperties": false
},
{
"type": "null"
}
],
"default": null,
"description": "Workspace access policy for this Appgen project, or null for non-workspace apps."
},
"available_access_modes": {
"anyOf": [
{
"items": {
"enum": [
"public",
"workspace_all",
"custom"
],
"title": "AppProjectSettableAccessMode",
"type": "string"
},
"type": "array"
},
{
"type": "null"
}
],
"default": null,
"description": "Access modes the current user may set. Omitted when the capability is unavailable.",
"title": "Available Access Modes"
},
"siwc_bypass_bearer_token": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "Bearer token accepted by Sites dispatch in the OAI-Sites-Authorization header.",
"title": "Siwc Bypass Bearer Token"
}
},
"required": [
"id",
"title",
"description",
"slug",
"status",
"auth_client_id",
"latest_version_number",
"current_preview_url",
"current_live_url",
"screenshot_url",
"created_at",
"updated_at"
],
"title": "AppgardenProjectDetailResponse",
"type": "object",
"additionalProperties": false
}
},
"required": [
"result"
],
"title": "get_project_output",
"type": "object",
"additionalProperties": false
},
"annotations": {
"readOnlyHint": true,
"destructiveHint": false,
"openWorldHint": false
},
"_meta": {
"openai/outputTemplate": null,
"ui": {
"visibility": [
"app"
]
},
"resource_name": "sites.get_project",
"_codex_apps": {
"resource_uri": "/[CONNECTOR_ID]/implicit_link::[CONNECTOR_ID]/get_project",
"contains_mcp_source": false
},
"connector_id": "[CONNECTOR_ID]",
"connector_name": "Sites",
"connector_description": "Use Sites to build, save, deploy, and inspect websites such as landing pages, portfolios, dashboards, portals, trackers, hubs, games, and internal tools. Always use Sites when .openai/hosting.json exists. Use Sites skills for local implementation, validation, source preparation, and artifact packaging. Use this connector for site creation, runtime environment variables, versions, production deployments, and access controls. Read .openai/hosting.json before creating a site and reuse its project_id when present. Treat Sites IDs and cursors as opaque: copy them exactly from .openai/hosting.json or Sites responses as applicable, and never invent, reformat, derive, or substitute them. Never call create_site more than once for the same local site. Push the exact source state before saving a version. commit_sha must identify that pushed state, and any archive must be built from it. Deploy only saved versions; every Sites deployment URL is production. Inspect deployment status when the initial result is non-terminal or the user asks for progress. Unless the user asks for local-only work or a saved version without deployment, finish deployable site work with a production deployment.",
"link_id": "implicit_link::[CONNECTOR_ID]"
}
},
{
"name": "sites.get_site_analytics_overview",
"title": "get_site_analytics_overview",
"description": "Get overall and hourly or daily page views, unique visitors, and the top five pages for a site analytics dashboard. Hourly windows may be up to 30 days and daily windows up to 90 days. Both timestamps must align to the requested bucket anchored at fixed UTC-08:00.",
"inputSchema": {
"properties": {
"project_id": {
"description": "Exact opaque site project ID. Copy it verbatim from .openai/hosting.json's project_id or the id field returned by create_site, list_sites, or get_site. Never invent, modify, or substitute another identifier.",
"title": "Project Id",
"type": "string"
},
"start_time_ms": {
"description": "Inclusive analytics window start as Unix epoch milliseconds.",
"minimum": 0,
"title": "Start Time Ms",
"type": "integer"
},
"end_time_ms": {
"description": "Exclusive analytics window end as Unix epoch milliseconds.",
"minimum": 0,
"title": "End Time Ms",
"type": "integer"
},
"granularity": {
"enum": [
"1h",
"1d"
],
"title": "AppgardenAnalyticsGranularity",
"type": "string",
"default": "1d",
"description": "Timeseries bucket size."
}
},
"required": [
"project_id",
"start_time_ms",
"end_time_ms"
],
"title": "get_site_analytics_overview_input",
"type": "object",
"additionalProperties": false
},
"outputSchema": {
"properties": {
"result": {
"properties": {
"project_id": {
"description": "Opaque site project ID. Pass this exact value as project_id.",
"title": "Project Id",
"type": "string"
},
"window": {
"properties": {
"start_time_ms": {
"title": "Start Time Ms",
"type": "integer"
},
"end_time_ms": {
"title": "End Time Ms",
"type": "integer"
},
"granularity": {
"enum": [
"1h",
"1d"
],
"title": "AppgardenAnalyticsGranularity",
"type": "string"
}
},
"required": [
"start_time_ms",
"end_time_ms",
"granularity"
],
"title": "AppgardenAnalyticsWindowResponse",
"type": "object",
"additionalProperties": false
},
"overall": {
"properties": {
"page_views": {
"properties": {
"value": {
"minimum": 0,
"title": "Value",
"type": "number"
}
},
"required": [
"value"
],
"title": "AppgardenAnalyticsValueResponse",
"type": "object",
"additionalProperties": false
},
"unique_visitors": {
"properties": {
"value": {
"minimum": 0,
"title": "Value",
"type": "number"
}
},
"required": [
"value"
],
"title": "AppgardenAnalyticsValueResponse",
"type": "object",
"additionalProperties": false
}
},
"required": [
"page_views",
"unique_visitors"
],
"title": "AppgardenAnalyticsOverviewOverallResponse",
"type": "object",
"additionalProperties": false
},
"timeseries": {
"properties": {
"points": {
"items": {
"properties": {
"timestamp_ms": {
"title": "Timestamp Ms",
"type": "integer"
},
"page_views": {
"minimum": 0,
"title": "Page Views",
"type": "number"
},
"unique_visitors": {
"minimum": 0,
"title": "Unique Visitors",
"type": "number"
}
},
"required": [
"timestamp_ms",
"page_views",
"unique_visitors"
],
"title": "AppgardenAnalyticsOverviewPointResponse",
"type": "object",
"additionalProperties": false
},
"title": "Points",
"type": "array"
}
},
"required": [
"points"
],
"title": "AppgardenAnalyticsOverviewTimeseriesResponse",
"type": "object",
"additionalProperties": false
},
"top_pages": {
"items": {
"properties": {
"path": {
"minLength": 1,
"title": "Path",
"type": "string"
},
"page_views": {
"minimum": 0,
"title": "Page Views",
"type": "number"
},
"unique_visitors": {
"minimum": 0,
"title": "Unique Visitors",
"type": "number"
}
},
"required": [
"path",
"page_views",
"unique_visitors"
],
"title": "AppgardenAnalyticsOverviewTopPageResponse",
"type": "object",
"additionalProperties": false
},
"title": "Top Pages",
"type": "array"
}
},
"required": [
"project_id",
"window",
"overall",
"timeseries",
"top_pages"
],
"title": "AppgardenAnalyticsOverviewResponse",
"type": "object",
"additionalProperties": false
}
},
"required": [
"result"
],
"title": "get_site_analytics_overview_output",
"type": "object",
"additionalProperties": false
},
"annotations": {
"readOnlyHint": true,
"destructiveHint": false,
"openWorldHint": true
},
"_meta": {
"openai/outputTemplate": null,
"ui": {
"visibility": [
"app"
]
},
"resource_name": "sites.get_site_analytics_overview",
"_codex_apps": {
"resource_uri": "/[CONNECTOR_ID]/implicit_link::[CONNECTOR_ID]/get_site_analytics_overview",
"contains_mcp_source": false
},
"connector_id": "[CONNECTOR_ID]",
"connector_name": "Sites",
"connector_description": "Use Sites to build, save, deploy, and inspect websites such as landing pages, portfolios, dashboards, portals, trackers, hubs, games, and internal tools. Always use Sites when .openai/hosting.json exists. Use Sites skills for local implementation, validation, source preparation, and artifact packaging. Use this connector for site creation, runtime environment variables, versions, production deployments, and access controls. Read .openai/hosting.json before creating a site and reuse its project_id when present. Treat Sites IDs and cursors as opaque: copy them exactly from .openai/hosting.json or Sites responses as applicable, and never invent, reformat, derive, or substitute them. Never call create_site more than once for the same local site. Push the exact source state before saving a version. commit_sha must identify that pushed state, and any archive must be built from it. Deploy only saved versions; every Sites deployment URL is production. Inspect deployment status when the initial result is non-terminal or the user asks for progress. Unless the user asks for local-only work or a saved version without deployment, finish deployable site work with a production deployment.",
"link_id": "implicit_link::[CONNECTOR_ID]"
}
},
{
"name": "sites.list_projects",
"title": "list_projects",
"description": "Deprecated legacy Codex app alias. Use list_sites instead.",
"inputSchema": {
"properties": {
"limit": {
"description": "Maximum number of sites to return",
"title": "Limit",
"type": "integer"
},
"cursor": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "Cursor returned by a previous list_projects call",
"title": "Cursor"
}
},
"required": [
"limit"
],
"title": "list_projects_input",
"type": "object",
"additionalProperties": false
},
"outputSchema": {
"properties": {
"result": {
"properties": {
"items": {
"description": "Appgen projects in page",
"items": {
"properties": {
"id": {
"description": "Opaque site project ID. Pass this exact value as project_id.",
"title": "Id",
"type": "string"
},
"title": {
"title": "Title",
"type": "string"
},
"description": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Description"
},
"slug": {
"title": "Slug",
"type": "string"
},
"status": {
"enum": [
"active",
"archived",
"suspended"
],
"title": "AppProjectStatus",
"type": "string"
},
"auth_client_id": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Auth Client Id"
},
"latest_version_number": {
"title": "Latest Version Number",
"type": "integer"
},
"current_preview_url": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Current Preview Url"
},
"current_live_url": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Current Live Url"
},
"screenshot_url": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Screenshot Url"
},
"disabled_by": {
"anyOf": [
{
"enum": [
"workspace_admin",
"openai"
],
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"title": "Disabled By"
},
"created_at": {
"title": "Created At",
"type": "string"
},
"updated_at": {
"title": "Updated At",
"type": "string"
},
"source_repository_credential": {
"anyOf": [
{
"properties": {
"provider": {
"description": "Source repository provider.",
"title": "Provider",
"type": "string"
},
"app_repository_id": {
"description": "AppGen AppRepository id.",
"title": "App Repository Id",
"type": "string"
},
"repository": {
"description": "Provider repository name bound to the AppGen project.",
"title": "Repository",
"type": "string"
},
"branch": {
"description": "Default branch the client should push.",
"title": "Branch",
"type": "string"
},
"remote_url": {
"description": "Git remote URL without embedded credentials.",
"title": "Remote Url",
"type": "string"
},
"token": {
"description": "Short-lived repo-scoped Git token.",
"title": "Token",
"type": "string"
},
"token_expires_at": {
"description": "Token expiration timestamp when provided.",
"title": "Token Expires At",
"type": "string"
},
"auth_mode": {
"description": "Git authentication mode for the token.",
"title": "Auth Mode",
"type": "string"
}
},
"required": [
"provider",
"app_repository_id",
"repository",
"branch",
"remote_url",
"token",
"token_expires_at",
"auth_mode"
],
"title": "AppgardenSourceRepositoryCredentialResponse",
"type": "object",
"additionalProperties": false
},
{
"type": "null"
}
],
"default": null,
"description": "Short-lived source repository write credential when requested."
},
"access_mode": {
"anyOf": [
{
"enum": [
"public",
"admins_only",
"workspace_all",
"custom"
],
"title": "AppProjectAccessMode",
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "Workspace access mode for this Sites project, or null for non-workspace apps."
},
"access_policy": {
"anyOf": [
{
"properties": {
"project_id": {
"description": "Appgen project ID",
"title": "Project Id",
"type": "string"
},
"access_mode": {
"allOf": [
{
"enum": [
"public",
"admins_only",
"workspace_all",
"custom"
],
"title": "AppProjectAccessMode",
"type": "string"
}
],
"description": "Access mode for the app."
},
"allowed_account_user_ids": {
"description": "Account user ID allowlist for the app.",
"items": {
"type": "string"
},
"title": "Allowed Account User Ids",
"type": "array"
},
"allowed_users": {
"description": "User details resolved from allowed_account_user_ids.",
"items": {
"properties": {
"account_user_id": {
"description": "Account user ID for the allowed user.",
"title": "Account User Id",
"type": "string"
},
"email": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "Email address for the allowed user, when available.",
"title": "Email"
},
"name": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "Display name for the allowed user, when available.",
"title": "Name"
}
},
"required": [
"account_user_id"
],
"title": "AppGardenAccessUserResponse",
"type": "object",
"additionalProperties": false
},
"title": "Allowed Users",
"type": "array"
},
"allowed_groups": {
"description": "Group details resolved from allowed workspace and tenant group IDs.",
"items": {
"properties": {
"id": {
"description": "Group ID to use in an Appgen access policy.",
"title": "Id",
"type": "string"
},
"name": {
"description": "Group display name.",
"title": "Name",
"type": "string"
},
"size": {
"description": "Total number of members in the group.",
"title": "Size",
"type": "integer"
}
},
"required": [
"id",
"name",
"size"
],
"title": "AppGardenAccessGroupResponse",
"type": "object",
"additionalProperties": false
},
"title": "Allowed Groups",
"type": "array"
},
"allowed_workspace_group_ids": {
"description": "Workspace group ID allowlist for the app.",
"items": {
"type": "string"
},
"title": "Allowed Workspace Group Ids",
"type": "array"
},
"allowed_tenant_group_ids": {
"description": "Tenant group ID allowlist for the app.",
"items": {
"type": "string"
},
"title": "Allowed Tenant Group Ids",
"type": "array"
},
"revision": {
"description": "Monotonic access policy revision.",
"title": "Revision",
"type": "integer"
},
"updated_at": {
"description": "Access policy update timestamp.",
"title": "Updated At",
"type": "string"
}
},
"required": [
"project_id",
"access_mode",
"allowed_account_user_ids",
"allowed_users",
"allowed_groups",
"allowed_workspace_group_ids",
"allowed_tenant_group_ids",
"revision",
"updated_at"
],
"title": "AppGardenAccessPolicyResponse",
"type": "object",
"additionalProperties": false
},
{
"type": "null"
}
],
"default": null,
"description": "Workspace access policy for this Appgen project, or null for non-workspace apps."
},
"available_access_modes": {
"anyOf": [
{
"items": {
"enum": [
"public",
"workspace_all",
"custom"
],
"title": "AppProjectSettableAccessMode",
"type": "string"
},
"type": "array"
},
{
"type": "null"
}
],
"default": null,
"description": "Access modes the current user may set. Omitted when the capability is unavailable.",
"title": "Available Access Modes"
}
},
"required": [
"id",
"title",
"description",
"slug",
"status",
"auth_client_id",
"latest_version_number",
"current_preview_url",
"current_live_url",
"screenshot_url",
"created_at",
"updated_at"
],
"title": "AppgardenProjectWithAccessResponse",
"type": "object",
"additionalProperties": false
},
"title": "Items",
"type": "array"
},
"cursor": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "Cursor for the next page, if any",
"title": "Cursor"
}
},
"required": [
"items"
],
"title": "AppgardenProjectPageResponse",
"type": "object",
"additionalProperties": false
}
},
"required": [
"result"
],
"title": "list_projects_output",
"type": "object",
"additionalProperties": false
},
"annotations": {
"readOnlyHint": true,
"destructiveHint": false,
"openWorldHint": false
},
"_meta": {
"openai/outputTemplate": null,
"ui": {
"visibility": [
"app"
]
},
"resource_name": "sites.list_projects",
"_codex_apps": {
"resource_uri": "/[CONNECTOR_ID]/implicit_link::[CONNECTOR_ID]/list_projects",
"contains_mcp_source": false
},
"connector_id": "[CONNECTOR_ID]",
"connector_name": "Sites",
"connector_description": "Use Sites to build, save, deploy, and inspect websites such as landing pages, portfolios, dashboards, portals, trackers, hubs, games, and internal tools. Always use Sites when .openai/hosting.json exists. Use Sites skills for local implementation, validation, source preparation, and artifact packaging. Use this connector for site creation, runtime environment variables, versions, production deployments, and access controls. Read .openai/hosting.json before creating a site and reuse its project_id when present. Treat Sites IDs and cursors as opaque: copy them exactly from .openai/hosting.json or Sites responses as applicable, and never invent, reformat, derive, or substitute them. Never call create_site more than once for the same local site. Push the exact source state before saving a version. commit_sha must identify that pushed state, and any archive must be built from it. Deploy only saved versions; every Sites deployment URL is production. Inspect deployment status when the initial result is non-terminal or the user asks for progress. Unless the user asks for local-only work or a saved version without deployment, finish deployable site work with a production deployment.",
"link_id": "implicit_link::[CONNECTOR_ID]"
}
},
{
"name": "sites.list_site_analytics_events",
"title": "list_site_analytics_events",
"description": "List custom event names observed for a site during a window of up to 90 days.",
"inputSchema": {
"properties": {
"project_id": {
"description": "Exact opaque site project ID. Copy it verbatim from .openai/hosting.json's project_id or the id field returned by create_site, list_sites, or get_site. Never invent, modify, or substitute another identifier.",
"title": "Project Id",
"type": "string"
},
"start_time_ms": {
"description": "Inclusive analytics window start as Unix epoch milliseconds.",
"minimum": 0,
"title": "Start Time Ms",
"type": "integer"
},
"end_time_ms": {
"description": "Exclusive analytics window end as Unix epoch milliseconds.",
"minimum": 0,
"title": "End Time Ms",
"type": "integer"
}
},
"required": [
"project_id",
"start_time_ms",
"end_time_ms"
],
"title": "list_site_analytics_events_input",
"type": "object",
"additionalProperties": false
},
"outputSchema": {
"properties": {
"result": {
"properties": {
"project_id": {
"description": "Opaque site project ID. Pass this exact value as project_id.",
"title": "Project Id",
"type": "string"
},
"event_names": {
"items": {
"maxLength": 64,
"minLength": 1,
"pattern": "^[^\\x00-\\x1f\\x7f]+$",
"type": "string"
},
"title": "Event Names",
"type": "array"
}
},
"required": [
"project_id",
"event_names"
],
"title": "AppgardenAnalyticsEventsResponse",
"type": "object",
"additionalProperties": false
}
},
"required": [
"result"
],
"title": "list_site_analytics_events_output",
"type": "object",
"additionalProperties": false
},
"annotations": {
"readOnlyHint": true,
"destructiveHint": false,
"openWorldHint": true
},
"_meta": {
"openai/outputTemplate": null,
"ui": {
"visibility": [
"app"
]
},
"resource_name": "sites.list_site_analytics_events",
"_codex_apps": {
"resource_uri": "/[CONNECTOR_ID]/implicit_link::[CONNECTOR_ID]/list_site_analytics_events",
"contains_mcp_source": false
},
"connector_id": "[CONNECTOR_ID]",
"connector_name": "Sites",
"connector_description": "Use Sites to build, save, deploy, and inspect websites such as landing pages, portfolios, dashboards, portals, trackers, hubs, games, and internal tools. Always use Sites when .openai/hosting.json exists. Use Sites skills for local implementation, validation, source preparation, and artifact packaging. Use this connector for site creation, runtime environment variables, versions, production deployments, and access controls. Read .openai/hosting.json before creating a site and reuse its project_id when present. Treat Sites IDs and cursors as opaque: copy them exactly from .openai/hosting.json or Sites responses as applicable, and never invent, reformat, derive, or substitute them. Never call create_site more than once for the same local site. Push the exact source state before saving a version. commit_sha must identify that pushed state, and any archive must be built from it. Deploy only saved versions; every Sites deployment URL is production. Inspect deployment status when the initial result is non-terminal or the user asks for progress. Unless the user asks for local-only work or a saved version without deployment, finish deployable site work with a production deployment.",
"link_id": "implicit_link::[CONNECTOR_ID]"
}
},
{
"name": "sites.query_site_analytics_event",
"title": "query_site_analytics_event",
"description": "Query daily occurrence counts and unique visitors for one custom site event. The requested window may be up to 90 days and must align to daily buckets anchored at fixed UTC-08:00.",
"inputSchema": {
"properties": {
"project_id": {
"description": "Exact opaque site project ID. Copy it verbatim from .openai/hosting.json's project_id or the id field returned by create_site, list_sites, or get_site. Never invent, modify, or substitute another identifier.",
"title": "Project Id",
"type": "string"
},
"event_name": {
"description": "Custom event name returned by list_site_analytics_events.",
"maxLength": 64,
"minLength": 1,
"pattern": "^[^\\x00-\\x1f\\x7f]+$",
"title": "Event Name",
"type": "string"
},
"start_time_ms": {
"description": "Inclusive analytics window start as Unix epoch milliseconds.",
"minimum": 0,
"title": "Start Time Ms",
"type": "integer"
},
"end_time_ms": {
"description": "Exclusive analytics window end as Unix epoch milliseconds.",
"minimum": 0,
"title": "End Time Ms",
"type": "integer"
}
},
"required": [
"project_id",
"event_name",
"start_time_ms",
"end_time_ms"
],
"title": "query_site_analytics_event_input",
"type": "object",
"additionalProperties": false
},
"outputSchema": {
"properties": {
"result": {
"properties": {
"project_id": {
"description": "Opaque site project ID. Pass this exact value as project_id.",
"title": "Project Id",
"type": "string"
},
"event_name": {
"maxLength": 64,
"minLength": 1,
"pattern": "^[^\\x00-\\x1f\\x7f]+$",
"title": "Event Name",
"type": "string"
},
"window": {
"properties": {
"start_time_ms": {
"title": "Start Time Ms",
"type": "integer"
},
"end_time_ms": {
"title": "End Time Ms",
"type": "integer"
},
"granularity": {
"enum": [
"1h",
"1d"
],
"title": "AppgardenAnalyticsGranularity",
"type": "string"
}
},
"required": [
"start_time_ms",
"end_time_ms",
"granularity"
],
"title": "AppgardenAnalyticsWindowResponse",
"type": "object",
"additionalProperties": false
},
"overall": {
"properties": {
"occurrences": {
"properties": {
"value": {
"minimum": 0,
"title": "Value",
"type": "number"
}
},
"required": [
"value"
],
"title": "AppgardenAnalyticsValueResponse",
"type": "object",
"additionalProperties": false
},
"unique_visitors": {
"properties": {
"value": {
"minimum": 0,
"title": "Value",
"type": "number"
}
},
"required": [
"value"
],
"title": "AppgardenAnalyticsValueResponse",
"type": "object",
"additionalProperties": false
}
},
"required": [
"occurrences",
"unique_visitors"
],
"title": "AppgardenAnalyticsEventOverallResponse",
"type": "object",
"additionalProperties": false
},
"timeseries": {
"properties": {
"points": {
"items": {
"properties": {
"timestamp_ms": {
"title": "Timestamp Ms",
"type": "integer"
},
"occurrences": {
"minimum": 0,
"title": "Occurrences",
"type": "number"
}
},
"required": [
"timestamp_ms",
"occurrences"
],
"title": "AppgardenAnalyticsEventPointResponse",
"type": "object",
"additionalProperties": false
},
"title": "Points",
"type": "array"
}
},
"required": [
"points"
],
"title": "AppgardenAnalyticsEventTimeseriesResponse",
"type": "object",
"additionalProperties": false
}
},
"required": [
"project_id",
"event_name",
"window",
"overall",
"timeseries"
],
"title": "AppgardenAnalyticsEventResponse",
"type": "object",
"additionalProperties": false
}
},
"required": [
"result"
],
"title": "query_site_analytics_event_output",
"type": "object",
"additionalProperties": false
},
"annotations": {
"readOnlyHint": true,
"destructiveHint": false,
"openWorldHint": true
},
"_meta": {
"openai/outputTemplate": null,
"ui": {
"visibility": [
"app"
]
},
"resource_name": "sites.query_site_analytics_event",
"_codex_apps": {
"resource_uri": "/[CONNECTOR_ID]/implicit_link::[CONNECTOR_ID]/query_site_analytics_event",
"contains_mcp_source": false
},
"connector_id": "[CONNECTOR_ID]",
"connector_name": "Sites",
"connector_description": "Use Sites to build, save, deploy, and inspect websites such as landing pages, portfolios, dashboards, portals, trackers, hubs, games, and internal tools. Always use Sites when .openai/hosting.json exists. Use Sites skills for local implementation, validation, source preparation, and artifact packaging. Use this connector for site creation, runtime environment variables, versions, production deployments, and access controls. Read .openai/hosting.json before creating a site and reuse its project_id when present. Treat Sites IDs and cursors as opaque: copy them exactly from .openai/hosting.json or Sites responses as applicable, and never invent, reformat, derive, or substitute them. Never call create_site more than once for the same local site. Push the exact source state before saving a version. commit_sha must identify that pushed state, and any archive must be built from it. Deploy only saved versions; every Sites deployment URL is production. Inspect deployment status when the initial result is non-terminal or the user asks for progress. Unless the user asks for local-only work or a saved version without deployment, finish deployable site work with a production deployment.",
"link_id": "implicit_link::[CONNECTOR_ID]"
}
},
{
"name": "sites.update_access",
"title": "update_access",
"description": "Deprecated legacy Codex app alias. Use update_site_access instead.",
"inputSchema": {
"properties": {
"project_id": {
"description": "Workspace site project ID",
"title": "Project Id",
"type": "string"
},
"access_mode": {
"description": "Required access mode for the site: workspace_all grants all active workspace users; custom uses the supplied user and group allowlists.",
"enum": [
"workspace_all",
"custom"
],
"title": "Access Mode",
"type": "string"
},
"allowed_user_emails": {
"anyOf": [
{
"items": {
"type": "string"
},
"type": "array"
},
{
"type": "null"
}
],
"default": null,
"description": "User email allowlist for the site.",
"title": "Allowed User Emails"
},
"allowed_workspace_group_ids": {
"anyOf": [
{
"items": {
"type": "string"
},
"type": "array"
},
{
"type": "null"
}
],
"default": null,
"description": "Workspace group ID allowlist for the site.",
"title": "Allowed Workspace Group Ids"
},
"allowed_tenant_group_ids": {
"anyOf": [
{
"items": {
"type": "string"
},
"type": "array"
},
{
"type": "null"
}
],
"default": null,
"description": "Tenant group ID allowlist for the site.",
"title": "Allowed Tenant Group Ids"
}
},
"required": [
"project_id",
"access_mode"
],
"title": "update_access_input",
"type": "object",
"additionalProperties": false
},
"outputSchema": {
"properties": {
"result": {
"properties": {
"project_id": {
"description": "Appgen project ID",
"title": "Project Id",
"type": "string"
},
"access_mode": {
"allOf": [
{
"enum": [
"public",
"admins_only",
"workspace_all",
"custom"
],
"title": "AppProjectAccessMode",
"type": "string"
}
],
"description": "Access mode for the app."
},
"allowed_account_user_ids": {
"description": "Account user ID allowlist for the app.",
"items": {
"type": "string"
},
"title": "Allowed Account User Ids",
"type": "array"
},
"allowed_users": {
"description": "User details resolved from allowed_account_user_ids.",
"items": {
"properties": {
"account_user_id": {
"description": "Account user ID for the allowed user.",
"title": "Account User Id",
"type": "string"
},
"email": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "Email address for the allowed user, when available.",
"title": "Email"
},
"name": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "Display name for the allowed user, when available.",
"title": "Name"
}
},
"required": [
"account_user_id"
],
"title": "AppGardenAccessUserResponse",
"type": "object",
"additionalProperties": false
},
"title": "Allowed Users",
"type": "array"
},
"allowed_groups": {
"description": "Group details resolved from allowed workspace and tenant group IDs.",
"items": {
"properties": {
"id": {
"description": "Group ID to use in an Appgen access policy.",
"title": "Id",
"type": "string"
},
"name": {
"description": "Group display name.",
"title": "Name",
"type": "string"
},
"size": {
"description": "Total number of members in the group.",
"title": "Size",
"type": "integer"
}
},
"required": [
"id",
"name",
"size"
],
"title": "AppGardenAccessGroupResponse",
"type": "object",
"additionalProperties": false
},
"title": "Allowed Groups",
"type": "array"
},
"allowed_workspace_group_ids": {
"description": "Workspace group ID allowlist for the app.",
"items": {
"type": "string"
},
"title": "Allowed Workspace Group Ids",
"type": "array"
},
"allowed_tenant_group_ids": {
"description": "Tenant group ID allowlist for the app.",
"items": {
"type": "string"
},
"title": "Allowed Tenant Group Ids",
"type": "array"
},
"revision": {
"description": "Monotonic access policy revision.",
"title": "Revision",
"type": "integer"
},
"updated_at": {
"description": "Access policy update timestamp.",
"title": "Updated At",
"type": "string"
}
},
"required": [
"project_id",
"access_mode",
"allowed_account_user_ids",
"allowed_users",
"allowed_groups",
"allowed_workspace_group_ids",
"allowed_tenant_group_ids",
"revision",
"updated_at"
],
"title": "AppGardenAccessPolicyResponse",
"type": "object",
"additionalProperties": false
}
},
"required": [
"result"
],
"title": "update_access_output",
"type": "object",
"additionalProperties": false
},
"annotations": {
"readOnlyHint": false,
"destructiveHint": false,
"openWorldHint": false
},
"_meta": {
"openai/outputTemplate": null,
"ui": {
"visibility": [
"app"
]
},
"_codex_apps": {
"accepted_mcp_request_meta_keys": [
"openai/codex_client_type"
],
"resource_uri": "/[CONNECTOR_ID]/implicit_link::[CONNECTOR_ID]/update_access",
"contains_mcp_source": false
},
"resource_name": "sites.update_access",
"connector_id": "[CONNECTOR_ID]",
"connector_name": "Sites",
"connector_description": "Use Sites to build, save, deploy, and inspect websites such as landing pages, portfolios, dashboards, portals, trackers, hubs, games, and internal tools. Always use Sites when .openai/hosting.json exists. Use Sites skills for local implementation, validation, source preparation, and artifact packaging. Use this connector for site creation, runtime environment variables, versions, production deployments, and access controls. Read .openai/hosting.json before creating a site and reuse its project_id when present. Treat Sites IDs and cursors as opaque: copy them exactly from .openai/hosting.json or Sites responses as applicable, and never invent, reformat, derive, or substitute them. Never call create_site more than once for the same local site. Push the exact source state before saving a version. commit_sha must identify that pushed state, and any archive must be built from it. Deploy only saved versions; every Sites deployment URL is production. Inspect deployment status when the initial result is non-terminal or the user asks for progress. Unless the user asks for local-only work or a saved version without deployment, finish deployable site work with a production deployment.",
"link_id": "implicit_link::[CONNECTOR_ID]"
}
},
{
"name": "sites.update_environment",
"title": "update_environment",
"description": "Deprecated legacy Codex app alias. Use update_environment_variables instead.",
"inputSchema": {
"properties": {
"project_id": {
"description": "Site project ID",
"title": "Project Id",
"type": "string"
},
"set_values": {
"description": "Environment entries to create or replace.",
"items": {
"properties": {
"key": {
"description": "Required non-empty, case-sensitive environment variable name.",
"title": "Key",
"type": "string"
},
"value": {
"title": "Value",
"type": "string"
},
"is_secret": {
"default": false,
"description": "Set true for sensitive values so they are not returned in plaintext.",
"title": "Is Secret",
"type": "boolean"
},
"type": {
"const": "envvar",
"default": "envvar",
"title": "Type",
"type": "string"
}
},
"required": [
"key",
"value"
],
"title": "UpdateAppgardenEnvironmentEnvVarEntryRequest",
"type": "object",
"additionalProperties": false
},
"title": "Set Values",
"type": "array"
},
"remove": {
"anyOf": [
{
"items": {
"type": "string"
},
"type": "array"
},
{
"type": "null"
}
],
"default": null,
"description": "Environment keys to remove.",
"title": "Remove"
}
},
"required": [
"project_id",
"set_values"
],
"title": "update_environment_input",
"type": "object",
"additionalProperties": false
},
"outputSchema": {
"properties": {
"result": {
"properties": {
"project_id": {
"title": "Project Id",
"type": "string"
},
"entries": {
"items": {
"properties": {
"key": {
"title": "Key",
"type": "string"
},
"value": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Value"
},
"is_secret": {
"default": false,
"title": "Is Secret",
"type": "boolean"
},
"type": {
"const": "envvar",
"default": "envvar",
"title": "Type",
"type": "string"
}
},
"required": [
"key",
"value"
],
"title": "AppgardenEnvironmentEnvVarEntryResponse",
"type": "object",
"additionalProperties": false
},
"title": "Entries",
"type": "array"
},
"revision": {
"title": "Revision",
"type": "integer"
},
"updated_at": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Updated At"
}
},
"required": [
"project_id",
"entries",
"revision",
"updated_at"
],
"title": "AppgardenEnvironmentResponse",
"type": "object",
"additionalProperties": false
}
},
"required": [
"result"
],
"title": "update_environment_output",
"type": "object",
"additionalProperties": false
},
"annotations": {
"readOnlyHint": false,
"destructiveHint": false,
"openWorldHint": false
},
"_meta": {
"openai/outputTemplate": null,
"ui": {
"visibility": [
"app"
]
},
"resource_name": "sites.update_environment",
"_codex_apps": {
"resource_uri": "/[CONNECTOR_ID]/implicit_link::[CONNECTOR_ID]/update_environment",
"contains_mcp_source": false
},
"connector_id": "[CONNECTOR_ID]",
"connector_name": "Sites",
"connector_description": "Use Sites to build, save, deploy, and inspect websites such as landing pages, portfolios, dashboards, portals, trackers, hubs, games, and internal tools. Always use Sites when .openai/hosting.json exists. Use Sites skills for local implementation, validation, source preparation, and artifact packaging. Use this connector for site creation, runtime environment variables, versions, production deployments, and access controls. Read .openai/hosting.json before creating a site and reuse its project_id when present. Treat Sites IDs and cursors as opaque: copy them exactly from .openai/hosting.json or Sites responses as applicable, and never invent, reformat, derive, or substitute them. Never call create_site more than once for the same local site. Push the exact source state before saving a version. commit_sha must identify that pushed state, and any archive must be built from it. Deploy only saved versions; every Sites deployment URL is production. Inspect deployment status when the initial result is non-terminal or the user asks for progress. Unless the user asks for local-only work or a saved version without deployment, finish deployable site work with a production deployment.",
"link_id": "implicit_link::[CONNECTOR_ID]"
}
}
]