{"ok":true,"name":"roastify_add_design_element","description":"Add a new element (text or image) to a design and commit a new version of it. The store is configuration management: the element is committed back to the SAME design_id (git tracks the diff). The new element's id comes back, so you can immediately edit a text element by id with update_design_text, or move/reorder either kind with move_elements. Placement is validated server-side and REFUSED, not warned: the element must fall inside the named panel (with a default margin — the dieline carries no ","inputSchema":{"type":"object","required":["design_id"],"properties":{"src":{"type":"string","default":"","description":"An image src already present in this design (kind=\"image\"); alternative\nto src_from. New uploads are refused — only reuse an asset already on\nthe design."},"face":{"type":"string","default":"","description":"The panel to place it on — one of the `panels` from get_design_text\n(e.g. \"right\"). On multi-panel boxes the element must fall inside that\npanel; face is required there. On single-face products (Tubes: `panels`\nis empty) any face is accepted and containment uses the design's sheet\nbounds instead."},"kind":{"type":"string","default":"text","description":"\"text\" (default) or \"image\"."},"npub":{"type":"string","default":"","description":"The patron's Nostr public key (npub1...). Tool fees are paid from this patron's balance. The connection proves the caller holds it: a request signed with npub's key (NIP-98 `Authorization: Nostr`), or an OAuth connection that holds npub (see held_identities)."},"text":{"type":"string","default":"","description":"The element's text (\\n for line breaks). Required when kind=\"text\"."},"label":{"type":"string","default":"","description":"Rename the design (optional). Defaults to keeping its current label."},"width":{"type":"integer","default":0,"description":"The text box (wrap) width, or the image frame width, in design units.\nDefaults to the panel width minus margins for text; required for images\nwhen not defaulting from the donor."},"height":{"type":"integer","default":0,"description":"Image frame height in design units (kind=\"image\" only). Defaults to\nthe donor image's height when src_from is set."},"position":{"anyOf":[{"type":"object","additionalProperties":true},{"type":"null"}],"default":null,"description":"Where to place it. Either absolute {\"x\": N, \"y\": M} (top-left in\ndesign units), or relative to an existing element:\n{\"below\"|\"above\"|\"rightOf\"|\"leftOf\": \"layer_id\", \"gap\": G}. Relative is\nbest when there's a sibling to anchor to; an empty panel needs absolute."},"src_from":{"type":"string","default":"","description":"Existing IMAGE element id whose src to copy (kind=\"image\")."},"design_id":{"type":"string","description":"The design to add to, from roastify_list_designs."},"style_from":{"type":"string","default":"","description":"An existing TEXT layer id (from get_design_text) whose font,\nsize, weight, colour, alignment, and leading the new text element inherits.\nRequired when kind=\"text\"."},"version_tag":{"type":"string","default":"","description":"The NEXT semver version (MAJOR.MINOR.PATCH, e.g. 1.3.0, no 'v') — call\nroastify_list_design_versions and increment. Required; reusing one is refused."},"client_req_id":{"type":"string","default":"","description":"Your idempotency key."},"commit_message":{"type":"string","default":"","description":"A specific description of WHAT changed and WHY — a real commit\nmessage, not a placeholder like 'save this' or 'update'. Required."}},"additionalProperties":false},"serverUrl":"https://roastify.tollbooth-dpyc.com/mcp","transport":"http","handshake":"ok","host":"roastify.tollbooth-dpyc.com","score":40,"grade":"C","auth":"api-key","lastScannedAt":"2026-10-30T13:08:40.589Z","stale":false,"permalink":"https://agentboardai.app/mcp/roastify.tollbooth-dpyc.com/roastify_add_design_element","page":"https://agentboardai.app/site/roastify.tollbooth-dpyc.com"}