
Generate App Store Screenshots With Codex
Register the Screenies MCP server with codex mcp add, set the approval mode and sandbox network access once, and let Codex turn your Simulator captures into an App Store screenshot set.
On this page
Run codex mcp add screenies --url https://screenies.app/mcp, approve the Screenies sign-in that opens in your browser, and Codex can generate App Store screenshots from a plain request in any session. The rest of this guide covers the two Codex settings that decide how smooth that run is: which tool calls stop for approval, and whether the upload command can reach the network.
Under the hood, Screenies runs as a hosted MCP server, and Codex keeps its entry in ~/.codex/config.toml alongside any other servers you use. Codex reads the tool list from the server at startup, including a read-only flag on each tool, and uses that flag together with your approval setting to decide when to pause. A typical run creates the app record, requests upload URLs, pushes your captures with curl, starts a batch, polls it, and downloads the finished PNGs. Creating the app record, uploading, and starting the batch are the steps that change anything, and the config below is built around them. Your working tree only changes if you ask Codex to save the output there.
The finished config.toml entry
Here is the complete entry up front; the sections after it explain each line:
[mcp_servers.screenies]
url = "https://screenies.app/mcp"
default_tools_approval_mode = "writes"
[sandbox_workspace_write]
network_access = true
The first table registers the server and sets how its tools are approved. The second is a general Codex sandbox setting that lets shell commands use the network, and it applies to every command in the session, so leave it out if you'd rather approve the upload each time. You'll find the current server snippet on the Screenies Codex setup page.
Add the server and sign in
The command form writes the first two lines for you:
codex mcp add screenies --url https://screenies.app/mcp
Codex confirms the new global server, detects that Screenies uses OAuth, and opens a browser tab. You sign in with Google and approve Codex on the Screenies consent page, after which Codex holds a token scoped to the workspaces and apps your account can already open. If you pasted the table into config.toml by hand instead, run codex mcp login screenies to get the same browser step, and use that command again whenever the connection needs a fresh sign-in.
Inside a session, /mcp lists the servers Codex has loaded, which confirms that screenies is active. The Codex CLI, the IDE extension, and the ChatGPT desktop app read the same config.toml, so the entry works in all three after one sign-in. You can also keep the table in a project's .codex/config.toml, which Codex reads only for projects you've marked as trusted.
Approval mode: why writes fits this server
Codex has four values for default_tools_approval_mode: auto, prompt, writes, and approve. In the Codex source, prompt asks before every tool call, approve never asks, and writes asks unless the tool declares itself read-only. Screenies sets that read-only flag on the tools that only look things up or hand out URLs: whoami, list_apps, get_app, get_batch_status, get_credit_balance, get_logo_status, and request_screenshot_upload. Under writes, Codex runs those without stopping, which matters most while it polls a batch every 15 to 30 seconds. Everything that spends credits or changes your app still pauses for you, including generate_screenshot_set, localize_set, regenerate_failed, generate_logo, the delete_ tools, and buy_credits (only a workspace owner can call it, and what comes back is a payment URL).
You can loosen one tool without loosening the rest. edit_headline changes a slide's text and costs nothing, so if you plan to iterate on copy, add a per-tool table:
[mcp_servers.screenies.tools.edit_headline]
approval_mode = "approve"
With that, Codex rewrites headlines without asking, while batches and translations still wait for your approval.
Network access for the capture upload
The upload is the one step Codex runs as a shell command. request_screenshot_upload returns a signed URL for each file, good for 30 minutes, and Codex uploads the file bytes to it in a PUT request, with curl and the matching content-type header. Codex's default workspace sandbox keeps shell commands offline unless network_access is on, so without the setting above the first curl usually fails and Codex asks to rerun it with network access. Approving that once per session is a reasonable middle ground. The MCP calls go over Codex's own connection to the server, so they work either way.
If your captures aren't on disk yet, Codex can take them from a booted iOS Simulator with xcrun simctl io booted screenshot <path> as you move between screens.
A run from a Codex session
Open codex in the app's repository. Codex can read your existing store copy, which gives the set a better brief than a sentence typed from memory. A request like this works:
Using the screenies server, create an app from fastlane/metadata/en-US/name.txt and description.txt (show me the description first). Upload the PNGs in ./captures/iphone and generate a portrait iPhone set. Save the finished slides to ./store-output.
What Codex does with it, in order:
- Reads both metadata files and shows you the description it plans to send.
- Calls
create_appwith the name, description, and an App Store category, pausing for approval underwrites. - Calls
request_screenshot_uploadfor one URL per capture, then runs thecurluploads. - Calls
generate_screenshot_set, which pauses for your approval and returns a batch ID right away. - Polls
get_batch_statusuntil every slide is done, usually three to six minutes in total. - Downloads each slide from its link, which stays valid for 24 hours, into
./store-output.
Because step 4 returns immediately and rendering happens on Screenies, Codex's 60-second tool_timeout_sec default doesn't need changing. For an iPad or Android set, say so in the request and supply captures from that device; each batch covers one device and orientation, and the App Store screenshot sizes page lists the output dimensions.
Codex skills and hosted servers in the results
The pages ranking for this search mostly offer skills. ParthJadhav's app-store-screenshots ranked first when we checked in September 2026 and names Codex as a supported agent, and ScreenshotWhale's Codex post walks through a one-command skill install. A skill lives on disk as instructions and scripts, so Codex treats its steps like any other shell work in your sandbox. AppLaunchFlow is the other hosted MCP option on page one, and Screenies works the same way from Codex's side: a URL in config.toml, an OAuth sign-in, and tools that carry their own approval hints. The difference shows up in the approval prompts, since Codex can tell a read-only MCP call from a spending one, while a skill's curl or node commands all look alike to the sandbox. If you also work in other agents, the Claude Code screenshot workflow and the Cursor mcp.json setup for screenshots connect to the same account.
What a Codex run spends
Under writes, a six-slide iPhone set costs six credits the moment you approve generate_screenshot_set, and an iPad set costs two per slide. A slide that fails refunds its credit on its own, while regenerate_failed charges one credit per slide it retries, and localize_set adds 0.1 credits per slide per locale. Screenies has no subscription: you buy a Starter, Launch, or Studio pack once (Starter is 12 credits for $9), and the pricing page has the other two.
Codex setup questions
Which approval mode should I use for a first run?
prompt is the cautious choice, since Codex then stops before every Screenies call and you see the whole sequence once. Switch to writes when the polling prompts start to feel like busywork.
What happens if my balance is too low for the batch?
Screenies refuses the generate_screenshot_set call before charging anything, and Codex shows the error in the session. Ask it to call get_credit_balance to see the gap; if you want to top up from the terminal, buy_credits returns a checkout link after you approve the call.
Can Codex write the first set in another language?
Yes, if you name the language in your request. generate_screenshot_set takes an App Store locale code such as de-DE or ko for the headlines, and later translations of that set go through localize_set.
How do I disconnect Codex from my account?
codex mcp logout screenies deletes the stored token on your machine. To cut access on the server side as well, revoke the agent in your Screenies account settings; tokens issued before that can stay valid for up to an hour.
Can I use the same server in ChatGPT on the web?
On the web, ChatGPT adds custom MCP servers through Developer mode on Plus, Pro, Business, Enterprise, and Edu plans. The ChatGPT setup page has those steps.
Related guides

Generate App Store Screenshots With Cursor
Add the Screenies MCP server to Cursor's mcp.json, sign in once, and have the agent upload your Simulator captures and generate an App Store screenshot set from chat.

Generate App Store Screenshots With Claude Code
Connect Screenies' remote MCP server to Claude Code and generate, localize, and download a full App Store screenshot set from prompts, with no local build to run.

Remote MCP Server OAuth on Cloudflare Workers
How Screenies helps MCP clients find the login flow, checks access tokens inside a Cloudflare Worker, and limits tools to the user's workspace permissions.