figma_server_info
Server version, WebSocket port, connection state and connected document info.
Takes no parameters.

io.github.duncanbottrillPublished by GitHub account duncanbottrillv1.0.1Updated Nov 1, 2026
Claude in your Figma file. Builds with your components, checks what it wrote. Runs on your computer.
Deskhand connects Claude to a Figma file through a local plugin, letting it read, build, edit, export and review designs on your machine.
Desktop only via STDIO. STDIO servers start a local process, so they need the SourceWeft desktop host.
Server version, WebSocket port, connection state and connected document info.
Takes no parameters.
File info, current page and selection. Call once per conversation; every tool reports NOT_CONNECTED if the plugin is down.
Takes no parameters.
Recent selection changes, newest first, with timestamps. Default: the user's own selections; source: 'all' adds those made by bridge commands. Served from a server buffer, so it works after the plugin disconnects. If the default returns nothing, retry with source: 'all'.
limitsourceCheck the bridge end to end: versions, plugin handshake, buffered events, reverse round-trip timing. Call when a tool fails or after an upgrade.
Takes no parameters.
Deskhand licence state: trial days left, masked key, last check.
Takes no parameters.
Activate a Deskhand licence key.
keyrequiredRun JavaScript in the Figma plugin: an async function body with figma (Plugin API) and bridge (log, sleep, icon, text, instance, image, snapshot; progress/cancelled in jobs). Return plain data, never nodes (EXECUTE_BAD_RETURN). Errors: EXECUTE_SYNC_API, EXECUTE_SYNTAX, EXECUTE_FAILED. job: true past 30 s, then figma_job_status (waits). screenshot renders it. Recipes: figma_get_design_rules.
jobcoderequiredlintlabeltimeoutMsscreenshotWaits for a figma_execute job to end (up to waitMs), then returns state (running | done | error | cancelled | timeout), progress and the result or error. Jobs live for the server session.
jobIdrequiredwaitMsAsk a running figma_execute job to stop (sets the flag bridge.cancelled() returns; scripts that never check it run to completion). Poll figma_job_status.
jobIdrequiredList pages (ids and names). The active page is in figma_get_context.
Takes no parameters.
Full node details by id: geometry, fills, strokes, effects, auto-layout, text, constraints, boundVariables, explicitVariableModes, childIds. Default-valued props are omitted unless verbose. Composite instance ids (I<inst>;<child>) resolve; unknown ids land in notFound. Find ids with figma_search_nodes/figma_get_children first.
depthnodeIdsrequiredverboseSet fill color. Accepts hex shorthand or fills array.
fillsrequirednodeIdrequiredSet stroke color and/or weight. Per-side weights (strokeTopWeight etc., for border-top-only dividers) work on RECTANGLE and frame-like nodes only. Omit `strokes` to change weights only.
nodeIdrequiredstrokesstrokeWeightstrokeTopWeightstrokeLeftWeightstrokeRightWeightstrokeBottomWeightCreate a rectangle.
xynamefillswidthheightparentIdSet text content. Auto-loads fonts.
textrequirednodeIdrequiredDuplicate nodes.
offsetnodeIdsrequiredparentIdDelete nodes.
nodeIdsrequiredMove nodes. Use relative=true for offset.
xynodeIdsrequiredrelativeResize nodes to explicit pixels. To fit a child to its parent prefer figma_set_layout_align STRETCH (keeps size binds). Instance sublayers are rejected (INSTANCE_SUBLAYER_RESTRICTED): resize the master. Size binds are re-applied; the result is read back: RESIZE_NO_OP for a no-op, a clamp is a warning.
widthheightnodeIdsrequiredSet or clear minWidth/maxWidth/minHeight/maxHeight: a number sets, null clears, omit leaves it. Applies to auto-layout frames and their direct children (others get a warning). Verified by readback (LIMIT_NOT_APPLIED / LIMIT_NOT_CLEARED). A variable-bound field keeps its bound value; unbind with figma_unbind_variable.
nodeIdsrequiredmaxWidthminWidthmaxHeightminHeightSet opacity (0-1).
nodeIdrequiredopacityrequiredShow or hide nodes via node.visible; don't bind a BOOLEAN variable or set opacity to 0 for this.
nodeIdsrequiredvisiblerequiredSet whether frame-like nodes (FRAME, COMPONENT, COMPONENT_SET, INSTANCE, SLOT, SLIDE) clip children to their bounds; others error.
nodeIdsrequiredclipsContentrequiredSet corner radius. Use individual values for asymmetric.
nodeIdrequiredradiustopLefttopRightbottomLeftbottomRightGroup nodes.
namenodeIdsrequiredUngroup nodes.
nodeIdsrequiredCreate a frame.
xynamefillswidthheightparentIdCreate a text node.
xynametextfillsfontSizeparentIdfontStylefontFamilySet selection. Empty array clears.
nodeIdsrequiredSwitch to a different page in the Figma document.
pageIdrequiredExport a node as PNG, SVG, JPG or PDF to disk and return { path, format, scale, bytes }; read the file to view it. outputPath sets the destination; returnBase64: true inlines raw data instead. To see the render in context use figma_screenshot.
scaleformatnodeIdrequiredoutputPathreturnBase64Render a node (or the selection) as PNG and return it inline, with path, pixel size and scale. Scale is reduced to fit maxPixels (default 1,000,000); the inline image stays under 200 KB (one retry at half scale), larger renders stay on disk. Use after layout changes: readback cannot see overlap, clipping or mid-word breaks.
scaleinlinenodeIdmaxPixelsPixel-diff a built frame against a reference node. Both render at the reference's effective scale; returns mismatchPercent, a per-quadrant breakdown (tl/tr/bl/br), the size delta and paths to the diff/ref/built PNGs. A mismatch in one quadrant usually means one misplaced element.
scalemaxPixelsrefNodeIdrequiredthresholdinlineDiffbuiltNodeIdrequiredExport many nodes in one call, each at a scale or targetWidth (scale = targetWidth / node width, clamped 0.01–4). Files go to outputDir (default: a fresh folder under ~/.deskhand/exports/) named by namePattern with tokens {name} {id} {scale} {ext} {index}. One row per item (path and size, or an error); nothing is inlined.
itemsrequiredoutputDirnamePatternCheck icon concepts against the bundled Lucide set before drawing anything; never hand-draw glyphs. Aliases resolve (close → x), then exact names; otherwise you get real-name suggestions: pick one, do not invent. Insert with figma_place_icon or bridge.icon.
conceptsrequiredInsert a Lucide icon as a vector frame named icon/<concept>. Resolves like figma_resolve_icon. Appended to parentId (or the current page) at x/y, scaled and stroked.
xysizecolorconceptrequiredparentIdInsert an iOS chrome template (status-bar 393×54, home-indicator 393×34, keyboard 393×291), named chrome/<kind>. With parentId it scales to the parent width, top or bottom unless y is given.
ykindrequiredthemeparentIdPer-screen quality gate: lint one frame → { pass, findings, counts, fixes }; a finding carries its own fix only when it differs from fixes[code]. Errors: invisible text, overflow, zero-size, collapsed auto-layout, low contrast. Warnings: misaligned rows, hand-drawn icons, placeholder avatars, raw fills/text, detached instances. Capped at 200, errors first.
checksnodeIdrequiredRead the brand the open file already defines: local paint/text/effect styles, every component and set (keys, variant properties, all pages) and common frame sizes; samples fills and fonts when there are no styles. Use its colours, type and components in everything you build. Cached under ~/.deskhand/brands/ so bridge.instance(name) can import components later.
Takes no parameters.
Fill a node with an image from an absolute path (~/ allowed) or http(s) URL: PNG, JPEG, GIF or WebP, up to 4096 px per side and 20 MB. Replaces the fills with one IMAGE fill. Use for photos, avatars and reference art instead of placeholder shapes; bridge.image does the same in scripts.
nodeIdrequiredsourcerequiredscaleModeSave a restorable copy of a node before a risky edit: cloned onto a "🗄 Bridge Snapshots" page with parent/index/position recorded. Keeps the newest 10 per file. Restore with figma_restore_snapshot or bridge.snapshot() in scripts.
labelnodeIdrequiredUndo to a snapshot: removes the current node (if present) and moves the saved clone back to its recorded parent/index/position/name. New id: restoredId — update ids you held. Snapshot is consumed. SNAPSHOT_NOT_FOUND if unknown or the clone was deleted.
snapshotIdrequiredList saved snapshots in this file, newest first, with whether each clone still exists. Returns { count, page, snapshots }.
Takes no parameters.
One cookbook section as markdown: rules plus a runnable figma_execute recipe. Sections: helpers, auto-layout, components, variants, text, lint, jobs, reference-match. Read it before building that kind of thing. Whole cookbook: skill://deskhand/COOKBOOK.md. Needs no plugin.
sectionrequiredCreate ellipse. Use arcData for arcs/rings.
xynamefillswidthheightarcDataparentIdSet effects. Replaces existing.
nodeIdrequiredeffectsrequiredConfigure auto-layout on a frame: direction, sizing modes, alignment, padding, spacing, wrap. Size variable binds are captured and re-applied (rebound/warnings). See skill://deskhand/SKILL.md.
nodeIdrequiredlayoutModelayoutWrappaddingTopitemSpacingpaddingLeftpaddingRightpaddingBottomcounterAxisSpacingcounterAxisAlignItemscounterAxisSizingModeprimaryAxisAlignItems+1 moreList all local styles (colors, text, effects, grids). To find specific styles by name use figma_search_styles: fewer tokens.
typelimitoffsetverboseApply a local style (paint, text, stroke, effect, grid) to a node using Figma's async setters. The applied id is read back: appliedStyleId with verified: true, or STYLE_NOT_APPLIED.
nodeIdrequiredstyleIdrequiredpropertyrequiredCreate a component.
xynamefillswidthheightparentIdfromNodeIddescriptionCreate a component instance.
xynameparentIdcomponentIdrequiredAll local variables and collections: types (COLOR, FLOAT, STRING, BOOLEAN), modes, values. Paged: limit (default 100) and offset; next gives the following page.
typelimitoffsetSearch variables by name pattern (e.g. "tailwind/orange/*"). Compact results, far fewer tokens than figma_get_local_variables.
typelimitoffsetcompactnamePatternnameContainscollectionNameSearch nodes by name within a scope (parentId required). Preferred for finding frames, sections or elements; compact results (~50 tokens/node).
limittypesoffsetcompactmaxDepthparentIdrequirednamePatternnameContainsSearch local components by name. Returns compact metadata.
limitoffsetcompactnamePatternnameContainsincludeVariantsSearch local styles by name; cheaper than figma_get_local_styles.
typelimitoffsetcompactnameContainsImmediate children of a node — more efficient than figma_get_nodes for browsing hierarchy. Default limit 100, with truncated/next for paging. Compact results include x/y for layout. Composite instance-sublayer parent IDs resolve too.
limitoffsetcompactparentIdrequiredSet a variable's value for a mode, or bind it to a node property or local style (styleId + field). Text styles bind font/spacing fields; paint styles bind 'paints'. Verified by readback (BIND_NOT_APPLIED otherwise). width/height on an instance sublayer: INSTANCE_SUBLAYER_RESTRICTED, bind the master.
fieldvaluemodeIdnodeIdstyleIdpaintIndexvariableIdrequiredCreate a line.
xynamelengthstrokesparentIdrotationstrokeCapstrokeWeightSet resize constraints on a node: how it resizes when its parent frame resizes. Only for nodes inside frames (not auto-layout frames).
nodeIdrequiredverticalhorizontalDetach an instance into a regular frame: keeps overrides, severs the link to the main component.
nodeIdrequiredSet how a child behaves in an auto-layout frame: alignment (STRETCH), growth (fill container) and absolute positioning.
nodeIdrequiredlayoutGrowlayoutAlignlayoutPositioningRename one or more nodes (a batch shares one name).
namerequirednodeIdnodeIdsChange a node's z-order among its siblings. position is the FINAL index (0 = back/bottom, childCount-1 = front/top); 'back' and 'front' also work. Out-of-range values are clamped. Verified by readback (REORDER_FAILED otherwise). Children of instances cannot be reordered (INSTANCE_SUBLAYER_RESTRICTED): reorder on the master.
nodeIdrequiredpositionrequiredSet text font properties.
nodeIdrequiredfontSizetextCasefontStylefontFamilylineHeightletterSpacingtextDecorationtextAlignVerticaltextAlignHorizontalCreate a paint style.
namerequiredfillsrequireddescriptionCreate a text style.
namerequiredfontSizetextCasefontStylefontFamilylineHeightdescriptionletterSpacingtextDecorationDelete a local style (paint, text, effect or grid). Library styles return REMOTE_STYLE. Nodes keep their resolved values but lose the link.
styleIdrequiredCreate a variable collection.
namerequiredmodesCreate a variable in a collection.
namerequiredtyperequiredvaluescopesaliasOfdescriptioncollectionIdrequiredRename a variable; "/" makes groups.
namerequiredvariableIdrequiredDelete variables. Cannot be undone.
variableIdsrequiredDelete a variable collection and all its variables. Cannot be undone.
collectionIdrequiredRename a variable collection.
namerequiredcollectionIdrequiredRename a mode in a variable collection.
namerequiredmodeIdrequiredcollectionIdrequiredAdd a new mode to a variable collection.
namerequiredcollectionIdrequiredDelete a mode from a variable collection. Cannot delete the last mode.
modeIdrequiredcollectionIdrequiredPin an explicit variable mode on nodes or pages (e.g. a mobile frame pinned to the Spacing collection's mobile mode), or clear: true to unpin. Works on scene nodes and page ids. Echoes explicitVariableModes ({} = nothing pinned).
clearmodeIdnodeIdsrequiredcollectionIdrequiredRemove a variable binding from a node property, verified by readback (UNBIND_FAILED otherwise). For minWidth/maxWidth/minHeight/maxHeight the leftover literal clamp is cleared too (previousLiteral, clearedLiteral).
fieldrequirednodeIdrequiredpaintIndexCreate a page. Figma Design only: FigJam returns FIGMA_DESIGN_ONLY (create FigJam pages in its UI).
namerequiredindexRename a page.
namerequiredpageIdrequiredDelete a page. The last page cannot be deleted.
pageIdrequiredMove nodes to a different parent.
indexnodeIdsrequirednewParentIdrequiredMove nodes from their current page to a different page.
xynodeIdsrequiredtargetPageIdrequiredSwap an instance to a different component, keeping position and size.
instanceIdrequirednewComponentIdrequiredClone a page and its contents, inserted after the original. Figma Design only (FIGMA_DESIGN_ONLY in FigJam).
namepageIdrequiredRotate nodes by degrees. pivot 'center' (default) keeps the visual centre in place; 'top-left' is Figma's raw rotation, which moves the centre. Children of auto-layout parents (unless ABSOLUTE) cannot use a centre pivot: they get top-left plus a warning. Echoes appliedPivot, rotation and absoluteBoundingBox.
pivotnodeIdsrequiredrotationrequiredCombine components into a variant set; names must use variant naming (e.g. "Size=Large").
componentIdsrequiredFigJam only: create a sticky note (fixed 240×240). Author name/visibility are set by Figma and cannot be changed.
xytextfillsparentIdisWideWidthFigJam only: toggle a sticky between square and wide. Use figma_set_text for body text.
nodeIdrequiredisWideWidthFigJam only: flowchart shape with embedded text (30 shape types; cornerRadius is fixed).
xytextfillswidthheightstrokesparentIdshapeTyperequiredstrokeWeightFigJam only: change the shape type of a shape-with-text node.
nodeIdrequiredshapeTyperequiredFigJam only: connector (arrow) between two nodes. Endpoints attach via magnets (AUTO recommended), fixed positions, or float free. Default end cap ARROW_EQUILATERAL. STRAIGHT only supports CENTER/NONE magnets.
endtextstartendCapstrokeslineTypeparentIdstartCapstrokeWeightFigJam only: modify an existing connector's endpoints, line type, end caps, or label.
endtextstartendCapnodeIdrequiredlineTypestartCapCreate a labeled section (works in both Figma Design and FigJam) to group content. Supports dev status (READY_FOR_DEV/COMPLETED).
xynamefillswidthheightparentIddevStatusdevStatusDescriptionsectionContentsHiddenUpdate a section's name, dev status, or content visibility. Pass devStatus: null to clear.
namenodeIdrequireddevStatusdevStatusDescriptionsectionContentsHiddenFigJam only: create a table (default 2×2), optionally seeded via cells.
xycellsfillsnumRowsparentIdnumColumnsFigJam only: set the text and/or fill color of a single table cell.
rowrequiredtextfillscolumnrequirednodeIdrequiredFigJam only: insert a row at the given index (existing rows at and after the index shift down).
nodeIdrequiredrowIndexrequiredFigJam only: insert a column at the given index (existing columns at and after the index shift right).
nodeIdrequiredcolumnIndexrequiredFigJam only: remove the row at the given index.
nodeIdrequiredrowIndexrequiredFigJam only: remove the column at the given index.
nodeIdrequiredcolumnIndexrequiredFigJam only: set the height of a table row.
heightrequirednodeIdrequiredrowIndexrequiredFigJam only: set the width of a table column.
widthrequirednodeIdrequiredcolumnIndexrequiredFigJam only: move a row from one index to another.
nodeIdrequiredtoIndexrequiredfromIndexrequiredFigJam only: move a column from one index to another.
nodeIdrequiredtoIndexrequiredfromIndexrequiredFigJam only: create a syntax-highlighted code block.
xycoderequiredparentIdcodeLanguageFigJam only: update an existing code block's code text or language.
codenodeIdrequiredcodeLanguageFigJam only: link preview from a URL: EMBED for OEmbed providers (YouTube, Spotify), else LINK_UNFURL (OpenGraph/Twitter card). Response includes nodeType.
xyurlrequiredparentIdPrototype (Figma Design only): get a node's reactions (trigger and action details).
nodeIdrequiredPrototype (Figma Design only): add an interaction to a node; existing reactions are kept.
actionrequirednodeIdrequiredtriggerrequiredPrototype (Figma Design only): remove a reaction by its zero-based index; find it with figma_get_reactions first.
indexrequirednodeIdrequiredPrototype (Figma Design only): set a top-level frame as a flow starting point on the page, or clear it. Stored page-level as { nodeId, name } entries.
clearnodeIdrequiredflowName65% of the applicable checks met
How complete this listing is, computed from the registry entry, the endpoint and public sources. Not a rating of the server and not a statement that it is safe or working today: reachability is a dated check, and no installs or reviews go into the score.
Declare the credential headers in the registry entry, or keep the endpoint answering the probe so its auth can be classified.
Declare a GitHub repository with a README, or serve resource_documentation in the OAuth protected-resource metadata.
Declare a license in the repository or the registry entry.