imagcon-mcp presents moderate definition quality with significant gaps. Of 9 tools, 6 have descriptions and most have documented input schemas, but several critical issues undermine production readiness. Tool naming is generally clear and action-oriented (generate_, save_, list_, create_), but parameter descriptions are sparse or missing in places. Several tools (especially the metered ones: generate_image, create_icons_from_key, install_pwa_pack, create_icons_from_upload, generate_splash) duplicate near-identical descriptions with boilerplate payment challenge language, reducing clarity. The server exposes payment credential handling via _meta (params._meta["org.paymentauth/credential"]), which is a custom non-standard pattern and risks leaking sensitive auth data into logs. Error handling is present but generic, payment challenge handling uses custom exceptions (PaymentRequiredError, PaymentVerificationFailedError) with opaque challenge structures, not actionable recovery guidance. Output schemas are mostly free-form JSON strings, not structured objects. Baseline: avg tool desc length should be 194 chars; most here are 100-400 chars with heavy boilerplate. Only 3 of 9 tools have genuinely distinct, concise descriptions (list_saved_images, save_image, preflight_splash).
Generate a PWA install pack from an existing image_key and extract it. After the result: write html_head into index.html. The ZIP is rooted at public/, so output_dir should be the project root (default ./). Pass an ABSOLUTE path. Do not pass .../public/icons — that nests public/ inside icons/. Icons cost 1 credit (or a free Lighthouse pack). Splash is a second credit and defaults to false. This tool is metered: when the account has no free allowance or credits, it raises an MPP payment challenge (JSON-RPC -32042). Retry the same call with the payment credential in params._meta["org.paymentauth/credential"] to settle and run; the result then carries a receipt in its _meta.
Upload an image file, generate a PWA install pack from it, and extract it. After the result: write html_head into index.html. The ZIP is rooted at public/, so output_dir should be the project root (default ./). Pass an ABSOLUTE path. Do not pass .../public/icons — that nests public/ inside icons/. Icons cost 1 credit (or a free Lighthouse pack). Splash is a second credit and defaults to false. This tool is metered: when the account has no free allowance or credits, it raises an MPP payment challenge (JSON-RPC -32042). Retry the same call with the payment credential in params._meta["org.paymentauth/credential"] to settle and run; the result then carries a receipt in its _meta.
Generate an image from a text description and return its image_key and a preview URL. style: flat, metallic, 2d-game, clay, 3d, gradient, or glassmorphism. output_type: icon (default), logo, mascot, or illustration. This tool is metered: when the account has no free allowance or credits, it raises an MPP payment challenge (JSON-RPC -32042). Retry the same call with the payment credential in params._meta["org.paymentauth/credential"] to settle and run; the result then carries a receipt in its _meta.
Payment challenge handling exposed via _meta["org.paymentauth/credential"], non-standard custom pattern, risks leaking auth credentials into logs and prompt history. Best practice: server-side secret injection via environment/vault.
Five metered tools (generate_image, create_icons_from_key, install_pwa_pack, create_icons_from_upload, generate_splash) repeat near-identical 250-300 char payment boilerplate in descriptions, obscuring core functionality. Descriptions should focus on what the tool does; payment mechanics belong in error responses or separate documentation.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | D | 57 | 2026-07-28+ | v2 |
Generate splash screens from an image_key and extract the set to output_dir. After the result: write the manifest into your HTML. The ZIP is rooted at public/, so output_dir should be the project root (default ./). Pass an ABSOLUTE path. Splash screens cost 1 credit. This tool is metered: when the account has no free allowance or credits, it raises an MPP payment challenge (JSON-RPC -32042). Retry the same call with the payment credential in params._meta["org.paymentauth/credential"] to settle and run; the result then carries a receipt in its _meta.
Generate a PWA install pack from a text description and extract it. Full pipeline: AI-gen image, generate icons, extract to output_dir. After the result: write html_head into index.html. The ZIP is rooted at public/, so output_dir should be the project root (default ./). Pass an ABSOLUTE path. Do not pass .../public/icons — that nests public/ inside icons/. Icons cost 1 credit (or a free Lighthouse pack). Splash is a second credit and defaults to false. This tool is metered: when the account has no free allowance or credits, it raises an MPP payment challenge (JSON-RPC -32042). Retry the same call with the payment credential in params._meta["org.paymentauth/credential"] to settle and run; the result then carries a receipt in its _meta.
List all saved images in the gallery
Check if the account can export a splash screen set before generating one.
Save an image to the gallery
Upload an image file and return its image_key. Supports PNG, JPEG, and WebP formats.
No enum constraints on style parameter (flat, metallic, 2d-game, clay, 3d, gradient, glassmorphism). Described as free-form string, LLM may hallucinate invalid values like 'neon' or 'retro'. Schema should declare: {"enum": ["flat", "metallic", "2d-game", "clay", "3d", "gradient", "glassmorphism"]}.
No enum constraints on output_type parameter (icon, logo, mascot, illustration). Free-form string invites hallucinated values. Should be enum.
Color parameters (theme_color, background_color) accept free-form strings with hint '#RRGGBB' in description, but no regex pattern or format constraint in schema. LLM may pass 'red', 'rgb(255,0,0)', or '0xff0000'. Schema should enforce pattern: {"type": "string", "pattern": "^#[0-9a-fA-F]{6}$"}.
output_dir parameter requires absolute path and must not nest under public/, but these are documented only in description text, not as schema constraints. Critical path validation belongs in parameter schema and error messages, not prose.
All tools return results as free-form JSON strings (json.dumps()), not structured objects with typed fields. LLM must parse string output; error-prone and wastes tokens. Should return structured CallToolResult.
Error handling for payment challenges uses custom PaymentRequiredError and PaymentVerificationFailedError exceptions with challenge structures, but error responses lack actionable recovery guidance. LLM does not know: Can I retry? Should I ask user for payment? Is this fatal? Errors should include explicit next-step guidance.
Tool 'create_icons_from_upload' combines upload + icon generation + extraction into one tool. Violates single-responsibility principle. Should split into separate tools so agent can compose and retry independently.
Descriptions for several tools (create_icons_from_key, install_pwa_pack, create_icons_from_upload, generate_splash) include detailed post-processing instructions ('After the result: write html_head into index.html...'), which belong in separate user-facing docs, not tool descriptions. Descriptions should focus on what the tool DOES, not post-execution manual steps.