{"ok":true,"name":"roastify_move_elements","description":"Move a group of elements together and/or resize elements; commit a new version. The Designer can move only one layer at a time, so a block of layered content (a spec panel, a logo lockup) drifts out of alignment when its backing shape is moved alone. This relocks that block: name the ids and shift them as one rigid object, and separately re-centre or resize individual rectangles. The store is configuration management: the edit is committed back to the SAME design_id (git tracks the diff). Apply ","inputSchema":{"type":"object","required":["design_id","edits"],"properties":{"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)."},"edits":{"type":"array","items":{"type":"object","additionalProperties":true},"description":"A list of geometry edits, each one of:\n- group shift: {\"ids\": [\"a\", \"b\", ...], \"dx\": N, \"dy\": M} — add the same\n  delta to every listed element's x/y (design units; +dy is down, +dx is\n  right). Use this to move a whole block together.\n- absolute set: {\"id\": \"a\", \"x\": ?, \"y\": ?, \"width\": ?, \"height\": ?,\n  \"fontSize\": ?, \"fill\": ?, \"stroke\": ?, \"align\": ?, \"fontFamily\": ?,\n  \"z\": ?} — set only the keys you include.\n  What the size keys mean depends on the element: on a RECTANGLE/line/image,\n  width and height are the frame and set directly; on a TEXT layer, width is\n  the wrap frame and fontSize the type size (both settable) while height is\n  DERIVED — it re-measures from the reflowed text, and a height you pass for a\n  text layer is ignored. Use fontSize to match one label's size to a peer.\n  align (left|center|right|justify) and fontFamily apply to TEXT only — use\n  them when a repurposed layer still carries a donor's right-align or face\n  (read `fonts` from get_design_text for known families). fill/stroke are\n  colour strings settable on any element — e.g. give a roast-scale dot a dark\n  fill to fill it, or clear the fill to empty it (read each dot's current fill\n  from roastify_get_design_text's `elements`). z reorders paint order in the\n  elements array: an integer index, or \"front\" / \"back\".\nGet element ids and their current geometry from roastify_get_design_text."},"label":{"type":"string","default":"","description":"Rename the design (optional). Defaults to keeping its current label."},"design_id":{"type":"string","description":"The design to edit, from roastify_list_designs."},"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."},"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_move_elements","page":"https://agentboardai.app/site/roastify.tollbooth-dpyc.com"}