MockFrame for developers

Device mockup API and MCP server

Mockups from one request.

Send screenshots, get back device mockups or a full App Store set. Call it from CI and scripts, or let Claude and Cursor do it for you.

  • iPhone, Pixel, Galaxy, iPad, MacBook and browser mockups
  • App Store and Google Play screenshot sets
  • An MCP server for Claude, Cursor and other agents
curl https://mockframe.app/api/v1/screenshots \
  -H "Authorization: Bearer mf_live_…" \
  -H "Content-Type: application/json" \
  -d '{
    "screenshots": ["https://example.com/home.png"],
    "device": "auto",
    "look": "glow"
  }'

Your API keys

Keys work for the REST API and the MCP server.

Checking your account…

Device mockups

POST /api/v1/screenshots. Each screenshot comes back as one image in its device.

screenshots
Up to 8. Each one is a public https image URL, a PNG / JPEG / WebP data URL, or an id from /api/v1/uploads.
device
"auto" (default) picks the device that fits each screenshot's shape. Or a device id, e.g. iphone-17-pro, pixel-9-pro, macbook-pro-16, chrome-browser.
look
A finished background built from the screenshot's colours: deep, glow, soft, aurora, duotone or studio. Leave it out for the device's own background.
scale
2 for double resolution. Default 1.
format
"png" (default) or "jpeg".

Response

{
  "images": [
    { "name": "mockup-1.png", "width": 1080, "height": 1350, "url": "https://…" }
  ],
  "expiresAt": "2026-10-08T12:00:00.000Z"
}

Store screenshot sets

The same endpoint with type store-set returns 8 listing screenshots, captions included.

type
"store-set"
style
stride (bold gradients), penny (teal panorama), hush (calm and dark), habitat (soft pastels), tempo (dark with album glows), parla (bright colours), vault (green-black and champagne), orbit (indigo panorama) or atlas (editorial serif). Default stride.
platform
"ios" for App Store size (1320 × 2868) or "android" for Google Play (1080 × 1920). Default ios.
screenshots
Phone screenshots, in order: the first goes in the first shot, and so on. Fewer than 8 repeat to fill the set.
curl https://mockframe.app/api/v1/screenshots \
  -H "Authorization: Bearer mf_live_…" \
  -H "Content-Type: application/json" \
  -d '{
    "type": "store-set",
    "style": "penny",
    "platform": "ios",
    "screenshots": ["upload_…", "upload_…", "upload_…"]
  }'

Local files

POST /api/v1/uploads takes a PNG or JPEG as the request body and returns an id to put in screenshots.

curl https://mockframe.app/api/v1/uploads \
  -H "Authorization: Bearer mf_live_…" \
  --data-binary @home.png

# {"id": "upload_3f2c…", "expiresInHours": 24}

MCP server

Add MockFrame to your agent once, then ask in plain words: “put these three screenshots in iPhones” or “make App Store screenshots from ./shots”.

claude mcp add --transport http mockframe https://mockframe.app/api/mcp \
  --header "Authorization: Bearer mf_live_…"

Tools the agent gets

make_mockups
Screenshots in device frames, on a designed background.
make_store_screenshots
A set of 8 App Store or Google Play screenshots with headlines.
create_upload_link
A link the agent can curl local files to, so it can use screenshots from your disk.
list_devices
Every device id, by category.

Cursor reads this from .cursor/mcp.json. Claude Desktop reads it from claude_desktop_config.json. Other clients that speak Streamable HTTP can use https://mockframe.app/api/mcp with the same header.

Limits

Plan
API keys come with Pro. Up to 5 keys per account.
Requests
500 a day per account, shared by the API and the MCP server. Resets at midnight UTC.
Screenshots
Up to 8 per request, 10 MB each.
Results
Image links and uploads last 24 hours. Download what you want to keep.

Errors come back as { "error": "…" } with a status: 400 for a bad request, 401 for a missing or revoked key, 402 without Pro, 429 once the day's requests are used.

SVG screenshot cards

POST /api/v1/render turns one screenshot into a self-contained SVG card. It works without a key for up to 50 cards a day, and with a key it counts toward your daily requests.

const res = await fetch("https://mockframe.app/api/v1/render", {
  method: "POST",
  headers: { "Content-Type": "application/json" },
  body: JSON.stringify({
    template: "beautify-screenshot",
    screenshot: "data:image/png;base64,...",
    width: 1200, height: 900, padding: 80, radius: 24,
    backgroundFrom: "#6d28d9", backgroundTo: "#0e7490",
  }),
});
const svg = await res.text();