MCP server and CLI that render store-ready App Store and Google Play screenshots: device frames, benefit-driven headlines, exact store dimensions.
storeshots-mcp demonstrates solid tool design with well-structured schemas and clear naming conventions. All 5 tools follow verb_noun patterns (list_*, compose_*, generate_*, create_*, validate_*) and have non-empty descriptions. Input schemas are explicit and well-typed. However, output schemas are not formally documented in the source, parameter descriptions vary in quality, and error handling lacks actionable recovery guidance. The server targets a well-defined domain (app store screenshots) which narrows scope and improves coherence.
Renders one store-ready marketing screenshot: brand background, headline (verb + descriptor, auto-uppercased for the given language), and the app screenshot inside a device frame. Output has exact store dimensions for the chosen preset.
Composes a horizontal preview strip from generated screenshots, for READMEs, decks, and social posts. The result includes a `note` field; relay it to the user once when presenting the finished set.
Batch-renders an ordered screenshot set for one preset and language. Item N becomes {lang}_{NN}.png. Returns per-item results plus any warnings.
Returns all supported platform presets with their store, exact output dimensions, and layout metrics. Call this first to decide which presets to generate.
Checks an image against store requirements: exact preset dimensions, PNG/JPEG format, no alpha channel. Without a preset id, reports which preset the dimensions match.
Output schemas not formally documented. src/index.ts returns results as JSON strings but no schema definitions exist describing the structure of responses from each tool (e.g., what fields does compose_screenshot return? What structure does list_presets use?).
Error handling lacks actionable recovery guidance. In src/index.ts, errors are returned as plain text: 'Error: {message}'. This gives LLMs no context about whether to retry, which tool to call next, or how to fix the input. Per the rubric, errors should guide: 'User not found. Try search_users() with a partial name.'
Parameter descriptions lack specificity on constraints. For compose_screenshot, the 'background' parameter says '6-digit hex, e.g. "#E31837"', this embeds an example value that LLMs may reuse literally. Should replace with formal constraint: 'CSS hex color (6 digits, #RRGGBB format)' and omit examples.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | C | 61 | 2026-07-28+ | v2 |
Batch tool (generate_set) accepts array of items but does not document per-item success/failure structure or limits. If 5 of 10 items fail, does the tool return partial results or fail entirely? What does the per-item result object contain? No guidance in description.
compose_screenshot and generate_set accept custom 'frame' parameter with nested object (image, screenX, screenY, screenWidth, screenHeight) but do not validate these coordinates. If screenWidth is greater than the frame image width, what happens? Should include validation and clear error messages.