{"ok":true,"site":{"host":"omercelik.github.io","url":"https://omercelik.github.io/frame-webmcp/","type":"live","desc":"Frame — design with your agent. Shared live artboard for humans and ChatGPT via WebMCP.","tools":[{"name":"get_canvas_state","kind":"answer","impl":"imperative","description":"Return Frame artboard size, object summaries, and current selection.","annotations":{"readOnlyHint":true,"openWorldHint":false},"inputSchema":{"type":"object","properties":{}},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/frame-webmcp/"},{"name":"list_objects","kind":"answer","impl":"imperative","description":"List all canvas objects with id, type, name, and bounds.","annotations":{"readOnlyHint":true},"inputSchema":{"type":"object","properties":{}},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/frame-webmcp/"},{"name":"add_rect","kind":"act","impl":"imperative","description":"Create a rectangle on the Frame artboard. Optional x,y,w,h,fill,stroke,name.","annotations":{"readOnlyHint":false},"inputSchema":{"type":"object","properties":{"x":{"type":"number"},"y":{"type":"number"},"w":{"type":"number"},"h":{"type":"number"},"fill":{"type":"string"},"stroke":{"type":"string"},"name":{"type":"string"}}},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/frame-webmcp/"},{"name":"add_ellipse","kind":"act","impl":"imperative","description":"Create an ellipse on the Frame artboard.","annotations":{"readOnlyHint":false},"inputSchema":{"type":"object","properties":{"x":{"type":"number"},"y":{"type":"number"},"w":{"type":"number"},"h":{"type":"number"},"fill":{"type":"string"},"name":{"type":"string"}}},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/frame-webmcp/"},{"name":"add_text","kind":"act","impl":"imperative","description":"Create a text object. Optional text, fontSize, x,y,w,h,fill.","annotations":{"readOnlyHint":false},"inputSchema":{"type":"object","properties":{"text":{"type":"string"},"fontSize":{"type":"number"},"x":{"type":"number"},"y":{"type":"number"},"w":{"type":"number"},"h":{"type":"number"},"fill":{"type":"string"},"name":{"type":"string"}}},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/frame-webmcp/"},{"name":"update_object","kind":"act","impl":"imperative","description":"Patch any props on an object by id (x,y,w,h,rotation,fill,stroke,opacity,text,fontSize,name).","annotations":{"readOnlyHint":false,"idempotentHint":true},"inputSchema":{"type":"object","properties":{"id":{"type":"string"},"x":{"type":"number"},"y":{"type":"number"},"w":{"type":"number"},"h":{"type":"number"},"rotation":{"type":"number"},"fill":{"type":"string"},"stroke":{"type":"string"},"opacity":{"type":"number"},"text":{"type":"string"},"fontSize":{"type":"number"},"name":{"type":"string"}},"required":["id"]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/frame-webmcp/"},{"name":"set_text","kind":"act","impl":"imperative","description":"Set text content and optional fontSize on a text object.","annotations":{"readOnlyHint":false,"idempotentHint":true},"inputSchema":{"type":"object","properties":{"id":{"type":"string"},"text":{"type":"string"},"fontSize":{"type":"number"}},"required":["id"]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/frame-webmcp/"},{"name":"set_fill","kind":"act","impl":"imperative","description":"Set fill color (CSS color string) on an object.","annotations":{"readOnlyHint":false,"idempotentHint":true},"inputSchema":{"type":"object","properties":{"id":{"type":"string"},"fill":{"type":"string"}},"required":["id","fill"]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/frame-webmcp/"},{"name":"set_stroke","kind":"act","impl":"imperative","description":"Set stroke color and optional strokeWidth.","annotations":{"readOnlyHint":false,"idempotentHint":true},"inputSchema":{"type":"object","properties":{"id":{"type":"string"},"stroke":{"type":"string"},"strokeWidth":{"type":"number"}},"required":["id","stroke"]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/frame-webmcp/"},{"name":"move_object","kind":"act","impl":"imperative","description":"Move an object to absolute x,y on the artboard.","annotations":{"readOnlyHint":false},"inputSchema":{"type":"object","properties":{"id":{"type":"string"},"x":{"type":"number"},"y":{"type":"number"}},"required":["id","x","y"]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/frame-webmcp/"},{"name":"resize_object","kind":"act","impl":"imperative","description":"Resize an object to width w and height h.","annotations":{"readOnlyHint":false},"inputSchema":{"type":"object","properties":{"id":{"type":"string"},"w":{"type":"number"},"h":{"type":"number"}},"required":["id","w","h"]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/frame-webmcp/"},{"name":"rotate_object","kind":"act","impl":"imperative","description":"Set rotation in degrees.","annotations":{"readOnlyHint":false},"inputSchema":{"type":"object","properties":{"id":{"type":"string"},"rotation":{"type":"number"}},"required":["id","rotation"]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/frame-webmcp/"},{"name":"align_selection","kind":"act","impl":"imperative","description":"Align selection (or given ids) left|center|right|top|middle|bottom.","annotations":{"readOnlyHint":false},"inputSchema":{"type":"object","properties":{"mode":{"type":"string","enum":["left","center","right","top","middle","bottom"]},"ids":{"type":"array","items":{"type":"string"}}},"required":["mode"]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/frame-webmcp/"},{"name":"duplicate_object","kind":"act","impl":"imperative","description":"Duplicate an object by id; returns the new object.","annotations":{"readOnlyHint":false},"inputSchema":{"type":"object","properties":{"id":{"type":"string"}},"required":["id"]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/frame-webmcp/"},{"name":"delete_object","kind":"transact","impl":"imperative","description":"Delete an object by id. Consequential side effect — not read-only.","annotations":{"readOnlyHint":false,"destructiveHint":true},"inputSchema":{"type":"object","properties":{"id":{"type":"string"}},"required":["id"]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/frame-webmcp/"},{"name":"reorder_object","kind":"act","impl":"imperative","description":"Change z-order: forward|backward|front|back.","annotations":{"readOnlyHint":false},"inputSchema":{"type":"object","properties":{"id":{"type":"string"},"mode":{"type":"string","enum":["forward","backward","front","back"]}},"required":["id","mode"]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/frame-webmcp/"},{"name":"select_objects","kind":"act","impl":"imperative","description":"Select objects by id list (empty clears selection).","annotations":{"readOnlyHint":false,"idempotentHint":true},"inputSchema":{"type":"object","properties":{"ids":{"type":"array","items":{"type":"string"}}},"required":["ids"]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/frame-webmcp/"},{"name":"suggest_layout","kind":"act","impl":"imperative","description":"Suggest a tidy card/title layout for current objects. Pass apply=true to write positions via updates. Soft/read-only when apply is false.","annotations":{"readOnlyHint":true},"inputSchema":{"type":"object","properties":{"apply":{"type":"boolean","description":"If true, apply suggestions to the canvas"}}},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/frame-webmcp/"},{"name":"clear_canvas","kind":"act","impl":"imperative","description":"Remove all objects from the artboard. Consequential — not read-only.","annotations":{"readOnlyHint":false,"destructiveHint":true},"inputSchema":{"type":"object","properties":{}},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/frame-webmcp/"},{"name":"export_png","kind":"act","impl":"imperative","description":"Trigger a PNG download of the artboard (side effect). Returns ok; data URL is not inlined.","annotations":{"readOnlyHint":false},"inputSchema":{"type":"object","properties":{}},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/frame-webmcp/"}],"category":"Productivity & Business","favicon":"/favicons/omercelik.github.io.svg","apiSurface":"spec","toolCount":20}}