{
  "markdown": "# SudoMock MCP Server\n\n> Generate photorealistic product mockups from Claude, Cursor, Windsurf, and VS Code.\n\n[Model Context Protocol](https://modelcontextprotocol.io/introduction) server for the [SudoMock](https://sudomock.com) mockup generation API. Upload PSD templates, place artwork onto smart objects, edit supported text layers, and get rendered image URLs -- all through natural language.\n\n## Quick Start\n\nThis is a local **stdio** server: your MCP client launches it as a child process\nvia `npx` and authenticates with your `SUDOMOCK_API_KEY`.\n\n```bash\nclaude mcp add sudomock \\\n  -e SUDOMOCK_API_KEY=sm_your_key_here \\\n  -- npx -y @sudomock/mcp\n```\n\nGet your API key at [sudomock.com/dashboard/api-keys](https://sudomock.com/dashboard/api-keys).\n\n<details>\n<summary>JSON config for other clients (Cursor, Windsurf, VS Code)</summary>\n\n```json\n{\n  \"mcpServers\": {\n    \"sudomock\": {\n      \"command\": \"npx\",\n      \"args\": [\"-y\", \"@sudomock/mcp\"],\n      \"env\": {\n        \"SUDOMOCK_API_KEY\": \"sm_your_key_here\"\n      }\n    }\n  }\n}\n```\n\n</details>\n\n> **Note:** A hosted remote (HTTP/OAuth) transport is not available yet. This\n> package only ships the local stdio server shown above.\n\n## Tools\n\n| Tool | Description | Credits |\n|------|-------------|---------|\n| `list_mockups` | List your uploaded mockup templates | 0 |\n| `get_mockup_details` | Get smart object UUIDs, dimensions, blend modes | 0 |\n| `render_mockup` | Render a mockup with artwork and/or editable text | 1 |\n| `remove_background` | Get a transparent-PNG cutout through a 7-day signed URL | 25 |\n| `create_2d_mockup` | Create a 2D mockup and detect printable surfaces automatically | 25 |\n| `render_2d_surface` | Print artwork across a whole product surface (all-over) | 5 |\n| `render_2d_print_area` | Print artwork into one saved print area (a drawn zone) | 5 |\n| `render_video` | Animate a mockup into a video clip (always async) | cost-based (one per account at no charge, then cost-based) |\n| `upload_psd` | Upload a Photoshop PSD/PSB template (sync or async) | 0 |\n| `list_2d_mockups` | List saved 2D templates; use `customizable_only` for shopper-ready items | 0 |\n| `get_2d_mockup` | Get one 2D mockup's saved print areas and its product surfaces | 0 |\n| `update_2d_print_areas` | Replace a 2D mockup's print-area geometry | 0 |\n| `delete_2d_mockup` | Delete a 2D mockup template | 0 |\n| `get_job` | Check the status of an async job by job_id | 0 |\n| `wait_for_job` | Poll an async job until it succeeds or fails | 0 |\n| `list_jobs` | List async render, video, upload, and 2D jobs | 0 |\n| `get_account` | Check plan, credits, prepaid balance, and usage | 0 |\n| `update_mockup` | Rename a mockup template | 0 |\n| `delete_mockup` | Delete a mockup template | 0 |\n| `create_webhook_endpoint` | Register a webhook for async job completion | 0 |\n| `list_webhook_endpoints` | List your webhook endpoints | 0 |\n| `update_webhook_endpoint` | Edit or enable/disable a webhook endpoint | 0 |\n| `delete_webhook_endpoint` | Delete a webhook endpoint | 0 |\n| `rotate_webhook_secret` | Rotate a webhook signing secret | 0 |\n| `test_webhook_endpoint` | Send a signed `webhook.test` event | 0 |\n| `list_webhook_deliveries` | List delivery attempts for an endpoint | 0 |\n| `replay_webhook_delivery` | Replay a single failed delivery | 0 |\n\n### Async jobs\n\n`render_mockup`, `upload_psd`, `create_2d_mockup`, and both 2D render tools\naccept `is_async: true`, and `render_video` is always async. These return a\n`job_id` immediately (HTTP 202) instead of a final result. (`create_2d_mockup`\nand the 2D render tools are synchronous by default and return the mockup /\nrender directly.) Poll it with `get_job`, or let `wait_for_job` block until the job\nreaches a terminal status and hands back `result_url`, `mockup_uuid`,\n`credits_charged`, and `payg` (`{credits, unit_price, cost}` for pay-as-you-go\njobs, otherwise `null`).\n\nFor a 2D render, pick the tool that matches the target you read from\n`get_2d_mockup`. Every printable product in the photo is a surface with its own\n`surface_uuid`: `render_2d_surface` prints across the whole of one, and takes\neither a `coverage` percentage or an explicit `width` + `height`. A print area\nis a bounded zone somebody drew on a product, such as a chest logo:\n`render_2d_print_area` takes its `print_area_uuid`, and either a `fit` or an\nexplicit `width` + `height`. A product can have both, and they are separate\ntargets -- a saved print area does not close off the surface it sits on.\n\nSizing has one answer per render: send the relative option or the exact box,\nnever both, and send `width` and `height` together. `position`, `offset_x`,\n`offset_y` and `rotation` place the artwork on either kind of target. Anything\nyou leave out is left out of the request, so the renderer's own default\napplies rather than a copy of it kept here.\n\n### Background removal\n\n`remove_background` returns a transparent-PNG URL valid for 7 days. You can\npass that URL straight back as `artwork_url` during that window. To clean\nartwork inline during a single render instead, pass\n`remove_background: true` to `render_mockup` or either 2D render tool. Either way it\ncosts 25 credits per artwork, refunded automatically if processing fails.\n\n### Webhooks\n\nRegister an endpoint with `create_webhook_endpoint` to be notified when async\njobs finish. Deliveries are signed with TWO headers: `X-SudoMock-Signature`\n(a hex HMAC-SHA256 over `${timestamp}.${rawBody}` using the secret returned at\ncreation/rotation) and `X-SudoMock-Timestamp` (unix seconds). Verify in constant\ntime and reject if `|now - timestamp| > 300s`.\n\nRender, upload, and video job deliveries use\n`{event, job_id, kind, status, result_url, error, created_at}`. The typed 2D\ncreation events add `version`, `mockup_id`, `name`, and either `print_areas`\n(`ready`) or `reason` (`rejected`). The typed 2D render events carry\n`mockup_id`, `result_url`, a public `{error_code, message}` failure when\napplicable, and optional `export_format` / `duration_ms`. Event types:\n`render.succeeded`, `render.failed`, `upload.succeeded`, `video.succeeded`,\n`video.failed`, `2d_mockup.ready`, `2d_mockup.rejected`, `2d_mockup.failed`,\n`2d_render.succeeded`, `2d_render.failed`, `webhook.test`.\n\n## Pricing and account limits\n\nPay as you go is the entry tier, and it has no subscription. One PSD render costs\n**$0.10**, so $1 covers 10 of them. The minimum first payment is **$5**. 2D Mockups\nand video are priced by what they cost to produce rather than at the flat render\nrate, which is why the Credits column above is not uniform.\n\nVolume plans start at **$25/month** for 5,000 renders. The lowest self-serve rate is\n**$2.42 per 1,000 renders**, on the annual Pro 50K plan.\n\nA new account starts with **500 credits, granted once**, and needs no card to spend\nthem. Until a card is verified and the $5 minimum is funded, that account is in\ntrial, and every render it makes is watermarked and capped at **1,024 px**. It can\nkeep **5** PSD templates, run **one** render at a time, and a template that has gone\n13 days without a render is removed.\n\nFunding the balance lifts all of it at once. The watermark and the width cap come\noff, stored templates go to **150**, renders run **25** at a time alongside **10**\nconcurrent uploads, and templates stop being removed for sitting idle.\n\nTrial is not a separate plan. It is the unfunded state of the pay-as-you-go tier, so\n`get_account` reports the same tier before and after funding; the balance is what\nchanges.\n\nBecause of that, an account paying as it goes has no monthly allowance, and\n`get_account` reports `credits_limit` and `credits_remaining` as `0` while the\naccount is perfectly able to pay. Read `prepaid_balance` alongside them, or read\n`funding_summary`, which states both in one line and never reports a funded account\nas `0 / 0`.\n\n## Example requests\n\n- \"List my mockup templates\"\n- \"Render the t-shirt mockup with this design: https://example.com/logo.png\"\n- \"Replace the editable headline text, then render the mockup\"\n- \"Cut out the background from this product photo, then render it on the tote bag\"\n- \"List my 2D mockups, then render the first one with this artwork: https://example.com/logo.png\"\n- \"Render this design asynchronously and wait for it to finish\"\n- \"Queue that 2D mockup render async and give me the job id to track\"\n- \"Animate the hoodie mockup into a 5-second video clip\"\n- \"Upload this PSD as a new template: https://example.com/mockup.psd\"\n- \"Set up a webhook at https://example.com/hooks so I get notified when renders finish\"\n- \"How many credits do I have left?\"\n\n## Links\n\n- [Dashboard](https://sudomock.com/dashboard) -- Manage mockups and API keys\n- [API Docs](https://sudomock.com/docs) -- Full REST API reference\n- [Pricing](https://sudomock.com/pricing)\n- [Status](https://sudomock.statuspage.io) -- Service uptime\n\n## License\n\nMIT\n",
  "bytes": 8851,
  "sha": "1e3aec3883bbfcaa2f767a34466cba752eac814bebae3600e987c98cb1508b8a",
  "repo_slug": "sudomock/mcp-server",
  "fonte": "repo",
  "truncated": false,
  "api": "https://agentalog.com/api/listings/mcp_io_github_sudomock_mcp_486fcd22/readme"
}