AppScreens MCP Guide
The AppScreens MCP server lets Claude query the screenshot archive directly: search apps, read screenshot URLs, and browse version history. claude.ai, Claude Desktop, and Claude Design add it as a custom connector by URL, and Claude Code authorizes the same way from the terminal; Cursor, Codex, and other MCP clients use a personal token. This guide covers every tool, what each surface can and cannot do, how to connect both ways, example workflows, and troubleshooting. For a quick overview, see the MCP feature page.
What the MCP does
AppScreens is a curated archive of top app store screenshots, each classified by layout pattern and ASO marketing strategy, with historical versions preserved. The MCP server exposes that archive to AI agents as a small set of read-only tools over Streamable HTTP (POST only) at https://appscreens.store/api/mcp. Instead of scraping the App Store or guessing, your agent gets structured results and direct, fetchable screenshot URLs.
Access requires a Pro plan, whichever way you connect. What differs is the credential: the hosted Claude surfaces obtain an OAuth access token when you approve the connector, and everything else sends a personal ascr_ token generated in Settings → MCP server.
What each surface can do
The tools that carry screenshots hand back image URLs, not images, and whether anything opens a URL is up to the client. The exception is get_screenshot, which returns one screenshot as image data instead — so a client that renders MCP image content can actually look at it. Which clients do is the fact most worth knowing before you start:
| Surface | How you connect | Calls the tools | Screenshots |
|---|---|---|---|
| claude.ai | Custom connector by URL (OAuth) | Yes — all 7 | Reads them — get_screenshot puts the image in front of Claude |
| Claude Desktop | Custom connector by URL (OAuth) | Yes — all 7 | Reads them — get_screenshot puts the image in front of Claude |
| Claude Design | Custom connector by URL (OAuth) | Yes — reads metadata and tags mid-design | Reads them — get_screenshot puts the image in front of Claude |
| Claude Code | OAuth over a loopback redirect (personal ascr_ token for headless use) | Yes — all 7 | The same, and it can fetch a screenshot URL with its own tools |
| Cursor / Codex | Personal ascr_ token | Yes — all 7 | Links from the metadata tools, the image itself from get_screenshot |
In practice: ask Claude to reason from the archive's metadata, classifications, and history, and to call get_screenshot for the one or two screenshots you actually want examined. Asking it to critique an image it was only given a link to will not work — name the tool, or ask a question that can only be answered by looking.
Tool reference
Every tool is read-only. A typical session starts with list_categories / list_tags to discover filter values, then search_apps to find apps, then get_app or get_app_history for screenshots. Six of the seven read the archive; draft_screenshots is the one that hands something back out of it, into the screenshot generator.
search_apps
- Purpose: Search and filter the archive; the entry point for most workflows.
- Inputs: query (name), platform (ios/android), category, layout[] and strategy[] tag slugs, page, limit (max 20). Filters combine with AND; slugs within layout/strategy combine with OR.
- Returns: Paginated app summaries — enough to pick an app, then call get_app for screenshots. Each result carries tagSource plus either tags (classified from that app's own screenshots) or categoryTags (a per-category default). Results mix the two, so read it per result.
get_app
- Purpose: Read one app's full detail and current screenshots.
- Inputs: app — an id or slug returned by search_apps.
- Returns: App metadata plus the current screenshot set and any video previews, each with an absolute, publicly fetchable image URL — and the same tagSource / tags / categoryTags split as search_apps.
list_tags
- Purpose: Discover the layout and ASO-strategy vocabulary used as filters.
- Inputs: type (optional) — layout or aso_strategy to narrow the list.
- Returns: Tag names and slugs you can pass to search_apps as layout[] or strategy[]. These are listing-level labels, and a slug filter matches apps tagged either way — check each result's tagSource before treating a tag as a fact about that app.
list_categories
- Purpose: Discover valid category filter values.
- Inputs: None.
- Returns: Every app category present in the archive, usable as the search_apps category filter.
get_screenshot
- Purpose: Look at one screenshot instead of linking to it.
- Inputs: app (id or slug), sequence (1-based, from get_app), size — "full" (the original upload) or "thumb" (a 400px-wide copy, roughly six times smaller).
- Returns: The screenshot as image data, plus a text block naming the source URL, orientation, original dimensions, byte size, and which sequences exist. Rows predating thumbnails fall back to the full image and say so in sizeServed.
get_app_history
- Purpose: Read historical snapshots for an app (Time Machine).
- Inputs: app (id or slug), page, limit (max 10).
- Returns: Past screenshot snapshots, newest first, each with absolute image URLs — for tracking how a listing changed.
draft_screenshots
- Purpose: Hand a proposed screenshot set to the generator as a link.
- Inputs: slides (1-10, each a headline of up to 60 characters, a subtitle of up to 140, and an optional layout), brand (three 6-digit hex colours plus an optional font name), device, and an optional template id.
- Returns: A /generator link carrying the draft in its URL fragment, plus the slide count and headlines. It stores nothing and reads nothing: the link is built from what you passed in, which is why it is still a read-only tool.
Image URLs from get_app and get_app_history are absolute and publicly fetchable, so anything that can make an HTTP request can load them. When you want the screenshot in front of the model rather than linked, use get_screenshot, which returns the image data itself — one screenshot per call, deliberately, so a listing's worth of images never lands in context at once.
Prompt reference
The server also ships three prompts — ready-made research workflows that fix the tool order, the screenshot budget, and the comparisons that would be misleading. Fill in the app or concept and the sequence runs itself, so a good answer stops depending on how well the request was phrased.
competitor_teardown
- Purpose: Research how the leading apps for a concept sell themselves, and what gap that leaves.
- Arguments: concept — the product idea, e.g. "AI calorie tracker". platform (optional) — "ios" or "android"; omit it and the agent is told to pick one and say which.
- Guardrails: Counts are never compared across stores, because iOS and Android cap listing screenshots differently — a cross-platform count measures the store, not the app. Screenshot count is kept out of the headline findings, tagSource is checked before any tag is cited, and claims are anchored to the versionString they came from.
screenshot_audit
- Purpose: Audit one listing shot by shot, optionally against a named rival.
- Arguments: app — id or slug. against (optional) — a rival id or slug; supplying it loads both listings before either is judged, so neither gets read in isolation.
- Guardrails: Caption text is read at size "full" for the first few shots and "thumb" beyond, never judged off a 400px copy — and the listing is not pulled in at full size by reflex, since images are the expensive call.
listing_changes
- Purpose: Diff an app's past snapshots to trace how its listing evolved.
- Arguments: app — id or slug. limit (optional) — how many snapshots back, 1-10, default 3; out-of-range values are clamped rather than rejected.
- Guardrails: Snapshots are treated as captures, not releases: a change between two of them happened somewhere in that window, so no capture date is reported as a ship date. Changes that cannot be explained are flagged rather than given an invented rationale.
MCP prompt arguments are strings, so every value above arrives as text — limit is parsed and clamped, and a platform that names no real store is ignored rather than turned into a filter that matches nothing. Where the prompts appear depends on the client: a client that supports MCP prompts surfaces them in its own prompt or command menu, and one that does not still gets all seven tools — you phrase the request yourself, and the example workflows below spell out what to ask for.
Connect your client
Sign in with your AppScreens account
In claude.ai, Claude Desktop, or Claude Design, open your connector settings, choose to add a custom connector, and paste https://appscreens.store/api/mcp as the server URL. Claude Code reaches the same flow from the terminal — its tab below has the command. Claude then discovers the authorization server, registers itself, and sends you to an AppScreens consent screen; approve it and the tools appear. No credential to store and nothing to update when you rotate a token — and you can cut the connection off again under Connected apps in Settings.
Implementing a client yourself? Discovery starts at the two documents this endpoint publishes: /.well-known/oauth-protected-resource (RFC 9728) names the resource and points at the authorization server, and /.well-known/oauth-authorization-server (RFC 8414) carries its endpoints. Clients are public, PKCE (S256) is required, and only Claude's own callbacks plus RFC 8252 loopback redirects can be registered.
Or connect with a personal token
For Cursor, Codex, and anything else that speaks Streamable HTTP — or for headless and CI use, where no browser can open the consent screen — generate a personal token in Settings → MCP server (Pro required). Your token is shown once — copy it immediately. Then pick your client below and paste the snippet, replacing the placeholder with your token. There is one token per account, so rotating it invalidates every client still holding the old value.
Any client that supports Streamable HTTP works — the Other tab gives a generic configuration. The endpoint is POST-only and expects an Authorization: Bearer <token> header.
Example workflows
What to ask for when you are driving the tools yourself. The first two have a shipped prompt that does the same job with the guardrails already in place — reach for competitor_teardown or listing_changes if your client offers them, and use these when it does not.
Competitive ASO research
Ask your agent: “Find iOS finance apps that use social proof in their screenshots, and summarize the common layout.” The agent calls list_tags to resolve the social proof strategy slug, search_apps with platform: ios, category: Finance, and the strategy filter, then get_app on the top results to read their metadata and screenshot URLs — and get_screenshot on the two or three whose treatment you actually want described.
One thing to insist on: a strategy filter matches apps tagged from their own screenshots andapps carrying their category's default, so “matched the social proof filter” is not the same claim as “uses social proof”. Tell the agent to check tagSource on each result and report a tag as a finding about that app only when it reads per_app — otherwise say the app sits in a category tagged that way, or go and look at the screenshots.
Tracking a listing over time
Ask: “Show me how Duolingo’s screenshots changed over time.” The agent runs search_apps to find the app, then get_app_history to pull historical snapshots newest-first and describe what changed between versions.
Building your own screenshot set
Ask: “What layout do the top meditation apps lead with? Then draft me a five-slide set for a sleep-tracking app.” The agent researches the category through the read tools, then calls draft_screenshots and hands back a link. Opening it loads the screenshot generator with the captions, layouts, and brand colours in place; you drop in your own screenshots and export every Apple-required resolution.
Two things worth knowing before you use it. The draft carries no image data— the slots arrive empty and you fill them, because the archive holds other companies' screenshots. And if you already have work open in the generator, the link asks before replacing it; there is no undo across a reload, so decline and the draft is simply discarded.
Researching without leaving the design
With the connector added to Claude Design, ask mid-task: “Which ASO strategies do the top 5 meditation apps use? Summarize them as a slide.”Claude resolves the tags and categories through the same tools and writes the answer straight into what you are building. Two habits make it work: state your target resolution as an explicit constraint in the prompt (“1284×2778, portrait”) — the dimensions in the payload will not set the canvas, and a first draft can come back in the wrong orientation — and lead with questions the archive's metadata and tags can answer, naming get_screenshot when you want a specific screenshot pulled in and examined.
Troubleshooting
- “The MCP connector is a Pro feature” on the approval screen — a
402. The AppScreens account you signed in with is on Free. Upgrade (see pricing) and add the connector again; the plan is checked before any credential is issued, so nothing was created in the meantime. - A tool is missing from the connector— connectors cache their tool list when you connect, so a newly released tool does not appear on an existing connection. Reconnect the connector (or remove and re-add it) and the list refreshes; new tools arrive set to “needs approval” until you allow them.
- Connector added but the tools are never called— adding a connector does not force Claude to use it. Enable it for the conversation in the tools menu, and name the archive in your prompt (“using AppScreens, find…”) until it is habitual.
- Registration or redirect rejected— the authorization server allowlists Claude's own callbacks and RFC 8252 loopback redirects, and nothing else. A hosted third-party client cannot register its callback; use a personal token instead.
- A connector that worked stopped working — access tokens last an hour and clients refresh them silently, so this is usually not expiry. Check Connected apps in Settings: if the connection was revoked there (or with Revoke all), add the connector again and re-approve.
- Screenshots come back as links — expected from the metadata tools: they return absolute image URLs, and the hosted Claude surfaces cite rather than open them. Ask for
get_screenshotby name when you want the image itself. See the surface table above. - “Screenshot N not found” from
get_screenshot— sequences are 1-based and belong to the listing's current snapshot. The error names the sequences that do exist;get_applists them alongside each screenshot's URL. - 401 Unauthorized — the token is missing, malformed, or has been revoked/rotated. Confirm the
Authorization: Bearer <token>header is present and matches your current token. If in doubt, rotate in Settings and update your client. - 403 Forbidden — your account is not on Pro. MCP access requires a Pro plan; see pricing.
- App not found — the id or slug isn't valid. Use
search_appsto get current ids and slugs rather than guessing. - Lost your token — tokens are shown once. Rotate in Settings to get a new one; the old token stops working immediately.
Frequently asked questions
Do I need a Pro plan to use the MCP?
Yes, on both paths. Approving the connector on a Free account stops at the consent screen with a 402, and personal tokens can only be generated on Pro. Browsing the website stays free.
Do I have to write the prompt myself?
Not for the common jobs. The server ships three prompts — competitor_teardown, screenshot_audit, and listing_changes — that a client supporting MCP prompts surfaces in its own prompt menu. Each one fixes the tool order, the screenshot budget, and the comparisons that would mislead, so the quality of the answer stops depending on the phrasing. Free-form questions still work against all seven tools.
Is the MCP read-only?
Yes. Every tool is read-only — agents can search and read the archive but cannot change any data. draft_screenshots is not the exception it looks like: it builds a link out of what you passed it, storing nothing and reading nothing.
Can the MCP create the screenshots?
It writes them; the generator renders them. draft_screenshots returns a link that opens the generator with the captions, layouts, and brand colours already set, and you add your own app screenshots there and export. Nothing in the handoff carries image data — a slide that tries to is rejected outright — because the archive holds other companies' screenshots and those have no business in your listing.
What transport does the server use?
The server speaks Streamable HTTP (POST only) at https://appscreens.store/api/mcp. Credentials go in the Authorization header — either an OAuth access token obtained by approving the connector, or a personal ascr_ token from Settings.
Are screenshot URLs directly downloadable?
Yes — they are absolute and publicly fetchable, so anything that can make an HTTP request can download them. Whether your client does is another matter: the hosted Claude surfaces cite and link a URL rather than opening it. When you want a screenshot actually looked at, call get_screenshot, which returns the image data itself instead of a link.
How do I disconnect a connector or revoke a token?
Both live in Settings under the MCP server section. Connected apps lists every connector you approved, each with Disconnect; Rotate replaces your personal token (the old one stops working immediately) and Revoke removes it. Revoke all cuts off everything at once.