About shotframe
shotframe is an MCP server and CLI that submits screen layouts and image files to the AppScreen API to produce App Store and Google Play screenshots. It can return a render job for polling or a download link.
Key features
- 01Submit layouts and image files for rendering
- 02Read local files or accept inline base64
- 03Poll render jobs for status
- 04Retrieve signed download links
- 05Surface API quota and cost details
Use cases
- 01Prepare store screenshots from screen layouts
- 02Track an asynchronous screenshot render
- 03Refresh an expired signed download link
MCP support
Provides MCP tools to render screenshots through the AppScreen API and poll render jobs for status and download URLs.
Configuration
Local server config is the same for every client. Copy it into your client’s MCP config file.
Tools
2Saved tool list · updated 1w ago
| Parameter | Type | Required | Description |
|---|---|---|---|
| files | array | No | Image files; each item is an object {name, path} or {name, base64}, carrying exactly one of path or base64. |
| screens | array | Yes | Screen layouts as JSON objects; structure is defined by the AppScreen API and passed through opaquely. |
Details
From the project READMEshotframe
Need App Store or Google Play screenshots for a store listing? shotframe hands the AppScreen API a set of screen layouts plus the image files they reference, and gives you back either a render job you can poll or a direct download link for the finished screenshots.
How a render flows:
screens— the layouts, as JSON objects. Their structure is defined by the AppScreen API; shotframe passes them through untouched and cannot validate them for you.files— the images the layouts use. Each item names a file and carries exactly one source: a localpath(the client reads the bytes off disk and encodes them; a leading~/expands to your home directory) or inlinebase64(meant only for tiny synthetic test images). An unreadable path fails the call before any request is made.- The reply preserves the API's own fields — a
jobIdfor keyed/async renders or a download link for anonymous/inline ones, plusbalanceandcostwhen reported. Quota metadata the API reports is surfaced on the MCP result's_meta(quota, andbalance/cost/upgradeUrlwhen present).
Poll a job with its jobId to learn its status and, when it
is done, get a signed download URL. Signed URLs expire after
about an hour; poll again to refresh one.
Configuration
The API key is optional — anonymous use works, capped by the service at 5 lifetime renders:
export APPSCREEN_API_KEY="your key" # optional
Rendering spends your own AppScreen workspace credits; when
they run out the API answers 402 and the tool reports it as
an insufficient_credits error carrying the API's cost and
balance text. shotframe itself holds no payment instrument.
Other environment variables:
APPSCREEN_BASE_URL— API base URL (https://api.appscreen.coby default)APPSCREEN_MCP_CLIENT— sent as theX-MCP-Clientheader, identifying the calling client
CLI
npx @reneturcios/shotframe render_screenshots '{"screens":[{"device":"iphone"}], "files":[{"name":"icon.png","path":"~/shots/icon.png"}]}'
npx @reneturcios/shotframe get_render_status '{"job_id":"job-123"}'
npx @reneturcios/shotframe --version
Output is the API result body as JSON. Exit codes: 0 on
success, 1 on a runtime error (including a validation
failure, an unreadable file, or an upstream error), 2 on a
usage error.
MCP server
npx -y @reneturcios/shotframe mcp
MCP client config:
{
"mcpServers": {
"shotframe": {
"command": "npx",
"args": ["-y", "@reneturcios/shotframe", "mcp"],
"env": { "APPSCREEN_API_KEY": "your key" }
}
}
}
Tools
render_screenshots— Render App Store and Google Play screenshots from screens (layout JSON) and image files. Returns a jobId for keyed/async renders or a download link for anonymous/inline renders.screensis required;filesis optional.get_render_status— Poll a render job by jobId. Returns the status and a signed download URL when done. Signed URLs expire after about an hour; re-poll to refresh.
Docker
docker run -i -e APPSCREEN_API_KEY="your key" ghcr.io/cloudcorprecords/shotframe
docker run --rm ghcr.io/cloudcorprecords/shotframe get_render_status '{"job_id":"job-123"}'
Development
npm install
npm run build # tsc -> dist/
npm test # tsx --test test/*.test.ts (fake fetch + temp files, no network)
npm run dev # run the CLI from source
License
MIT — Copyright (c) 2026 Rene Turcios
Comments
New to MCP?
From what the protocol is to installing your first server, these answers cover most first questions.
An open protocol that defines how AI applications connect to external tools and data in a uniform way. Clients talk to the model; MCP servers provide tools, resources and prompt templates. They exchange standard messages, so one server can be reused by many clients.