Tools
Every tool the MCP server offers, and its arguments.
shaders_get
Returns a published version's graph and texture assets: the latest, or the one named by version. An unpublished shader is not served. draft=1 serves the current saved graph instead and requires a preview token. slim=1 shapes the graph as shaders_read slim does (no edge ids, no port lists the catalogue restores), for reading rather than rendering. Responses carry an ETag and honour If-None-Match.
Works with any token, including preview tokens.
| Argument | Type | Required | Description |
|---|---|---|---|
id | string | yes | |
version | string | no | |
draft | boolean | no | |
slim | boolean | no |
nodes_list
Search the built-in catalogue: registry nodes (kind node, one TSL function each, id like sin) and official presets (kind preset, whole effects, id like official:ripple). q matches id, label and description. With no filters, returns the category list instead of nodes. Each entry lists its inputs as name:type and its output type. Never guess ids or port names: find them here, then read details with nodes_get.
Works with any token, including preview tokens.
| Argument | Type | Required | Description |
|---|---|---|---|
q | string | no | |
category | string | no | |
kind | "node" | "preset" | no | |
limit | integer | no |
nodes_get
Full detail for a registry node id or an official:<id> preset. Registry nodes: every port with type and default, the TSL function and module implementing it, a help text and an example graph with its generated TSL code. Presets: versions, exposed inputs with defaults and named outputs (the instance's ports), help and a showcase example graph; internals: true adds the preset's own authored graph and generated TSL code. Example graphs are valid input to shaders_edit replace_graph.
Works with any token, including preview tokens.
| Argument | Type | Required | Description |
|---|---|---|---|
id | string | yes | |
internals | boolean | "true" | "false" | no |
docs_search
Full-text search over the product documentation. Returns matching pages and headings with their slug; read one with docs_read.
Works with any token, including preview tokens.
| Argument | Type | Required | Description |
|---|---|---|---|
q | string | yes |
docs_read
One documentation page as markdown, by slug (e.g. concepts/shader-inputs, quickstart). Through MCP the slug may also be a resource URI the server exposes (fluorite://guide, fluorite://graph-format), for clients that cannot read resources.
Works with any token, including preview tokens.
| Argument | Type | Required | Description |
|---|---|---|---|
slug | string | yes |
graph_validate
Checks a stored graph: node and preset ids exist, every edge's ports exist and types are compatible, zones are paired, names are legal and unique, and every output compiles. Returns diagnostics (errors block publishing; warnings do not), the exposed-input and named-output interface, and the primary output type. Free and stateless; shaders_create, shaders_edit and shaders_fork run it too.
Works with any token, including preview tokens.
| Argument | Type | Required | Description |
|---|---|---|---|
graph | object | yes | A shader graph as the editor stores it. Node types: flowNode (data.tslNodeId), inputNode (data.kind + value fields), textureNode (data.pathname, data.source, data.fit: stretch | cover | contain), textNode (data.text, data.font, data.weight, data.align, data.letterSpacing, data.lineHeight; inputs uv, center, size; output a signed distance), outputNode (id __output__, input color), namedOutputNode (data.outputName, input value), repeatStartNode/repeatEndNode and feedbackStartNode/feedbackEndNode (end data.startId), shaderNode (data.shaderId, data.version, data.official; or a local group: data.group true, data.name, data.graph). Registry port lists and official preset graphs may be omitted; they are restored from the catalogue. |
shaders_search
Public shaders, newest first, matching q on name or description, optionally one category or one organization org. Page with cursor from the previous nextCursor. Read one's graph with shaders_read, start from it with shaders_fork, or embed it as a node with the shaders_edit import_shader op.
Works with any token, including preview tokens.
| Argument | Type | Required | Description |
|---|---|---|---|
q | string | no | |
category | string | no | |
org | string | no | |
cursor | string | no |
shaders_read
A shader as authored: metadata, versions, the graph with its instances and positions, interface, a node summary (counts by type, presets used, shaders imported) and generated TSL code. Without draft, serves a published version (latest, or version) of a public shader to anyone, or of a private one to its organization. With draft: true, serves the current saved graph and its revision to a token of the owning organization; pass that revision to shaders_edit. slim: true drops node positions, edge ids and the generated code, and shows each group by its name and ports only, for large graphs. group (a group node's id) returns that group's inner graph in place of the shader's, slim with slim.
Works with any token, including preview tokens.
| Argument | Type | Required | Description |
|---|---|---|---|
id | string | yes | |
version | string | no | |
draft | boolean | no | |
slim | boolean | no | |
group | string | no |
shaders_list
Shaders in one of your organizations, most recently updated first, with their current revision, latest published version and folderId. q filters by name; folderId lists one folder (from folders_list), and folderId: "root" the shaders in no folder. Pages of up to 200 rows (limit, default 200): pass nextCursor back as cursor for the next page; it is null on the last page, and truncated is true exactly when it is not. A shader edited while you page jumps to the front, behind the cursor, so later pages never show it; list again from the start to catch it.
Works with any token, including preview tokens.
| Argument | Type | Required | Description |
|---|---|---|---|
org | string | no | Organization slug (see me_get). Omitted: your personal organization. Org API keys always act in their own organization. |
q | string | no | |
folderId | string | no | A folder id, or "root" for the shaders in no folder. |
includeArchived | boolean | no | |
cursor | string | no | The previous page's nextCursor. |
limit | integer | no |
shaders_create
Creates a private draft. graph is optional; the default is a starter graph with a UV node feeding the output. Returns the id, revision 0, the editor URL and the graph's diagnostics. Build it up with shaders_edit.
Needs a personal token or an org API key.
| Argument | Type | Required | Description |
|---|---|---|---|
org | string | no | Organization slug (see me_get). Omitted: your personal organization. Org API keys always act in their own organization. |
name | string | no | |
graph | object | no | A shader graph as the editor stores it. Node types: flowNode (data.tslNodeId), inputNode (data.kind + value fields), textureNode (data.pathname, data.source, data.fit: stretch | cover | contain), textNode (data.text, data.font, data.weight, data.align, data.letterSpacing, data.lineHeight; inputs uv, center, size; output a signed distance), outputNode (id __output__, input color), namedOutputNode (data.outputName, input value), repeatStartNode/repeatEndNode and feedbackStartNode/feedbackEndNode (end data.startId), shaderNode (data.shaderId, data.version, data.official; or a local group: data.group true, data.name, data.graph). Registry port lists and official preset graphs may be omitted; they are restored from the catalogue. |
shaders_edit
Applies up to 200 ops in order to the draft graph; split a larger rebuild into several calls. All or nothing: if any op fails the graph is untouched and the error names the failing opIndex. expectedRevision must equal the current revision (from shaders_read with draft, or the last write); on mismatch nothing is written and the error carries the current revision. New nodes get ids like <base>_1 unless you pass id; the response lists created ids in order. Omitted positions are laid out automatically. Ops: add_node {tslNodeId, inputs?: {port: literal}} (inputs set port values on the node), add_input {kind, value, exposed?, inputName?, spatial?}, add_texture {pathname | source: webcam}, add_text {text, font?, weight?, align?, letterSpacing?, lineHeight?} (a signed distance to the text), set_text {id, text?, …style}, add_preset {presetId, inputs?}, import_shader {shaderId, version?, inputs?}, add_named_output {outputName}, add_repeat {count?, slots?} (creates <id> and <id>_end; start takes initial, count and gives state, index; end takes next and gives output), add_feedback (creates <id> and <id>_end; start gives state, last frame's value, and its components state.x…; end takes next and gives output), remove_node, connect {source, sourceHandle = output, a swizzle x/y/z/w/r/g/b of it, or <handle>.x for a component of another vector output such as state1.x or a named output's glow.x, target, targetHandle}, disconnect, set_input {id, value} (value has the input's component count, a float 1 and a vec2 2, or is one number filling every component), set_value {id, port, value | null} (the value an unwired port of a registry node, preset, instance, group or text node reads), expose_input, rename_node (renames a group too), move_node, group_nodes {ids, name, inputNames?, outputNames?} (folds nodes into a group; its id is in created; ports default to the name of the port each wire feeds; inputNames may key a node inside an earlier group by its id or <group>::node; a wire at a Repeat or Feedback node gets a pass-through mul by 1), ungroup {id} (also splices an official preset instance into its nodes; their ids are in created), tidy (lays out, folds single-use constants into ports, sets previews; run it last), replace_graph. Connecting to an occupied input replaces its edge. The response carries diagnostics, the new interface, groups: every group with its input and output ports, and notes: what an op chose for you (inserted pass-through ids, a requested port name suffixed because it was taken).
Needs a personal token or an org API key.
| Argument | Type | Required | Description |
|---|---|---|---|
id | string | yes | |
expectedRevision | integer | yes | |
ops | object[] | yes |
Each entry of ops is one of:
| Op | Fields | Notes |
|---|---|---|
add_node | tslNodeId, inputs?, id?, position? | Add a registry node. inputs sets port values on the node (no constant nodes); one number into a vector or color port fills every component. An unwired port without a value reads its default; spatial ports (uv, noise position) read the screen uv. |
add_input | kind, value?, exposed?, inputName?, spatial?, id?, position? | Add a constant or exposed input; spatial: true on a vec2 makes it read the screen uv while nothing feeds it, as a group's or preset's uv port does. value has the kind's component count, is one number filling every component, or is omitted for zeros. Color values are linear RGB: sRGB 0.5 grey is 0.214. |
add_texture | pathname?, source?, fit?, exposed?, inputName?, id?, position? | Add a texture node sampling an uploaded image or video by pathname, or the viewer's camera with source: "webcam". Takes uv, gives a vec4. fit maps the image onto the canvas at its real aspect: "stretch" (default) fills it distorted, "cover" fills it cropping the image, "contain" shows the whole image with zero (transparent) outside it. Exposed, a consumer swaps the image by name. |
add_text | text?, font?, weight?, align?, letterSpacing?, lineHeight?, exposed?, inputName?, inputs?, id?, position? | Add a text node: the signed distance (float, negative inside) to the text, laid out around center with size the em height in uv. Feed it to Fill, Stroke, Glow or Shadow. font is a bundled font path (/fonts/inter.woff2, the default) or an uploaded font's pathname; weight 1 to 1000, align for multiple lines, letterSpacing and lineHeight in em. inputs sets center and size; uv reads the screen uv unless wired. Exposed, a consumer sets the text by name. |
set_text | id, text?, font?, weight?, align?, letterSpacing?, lineHeight? | Change a text node's text or style; omitted fields stay. |
set_texture | id, fit | Change how a texture node fits its image onto the canvas. |
add_preset | presetId, version?, inputs?, id?, position? | Add an official preset. inputs sets its port values; one number into a vector or color input fills every component. Its uv port reads the screen uv while unwired. |
import_shader | shaderId, version?, inputs?, id?, position? | Instance a published shader. inputs sets its port values; one number into a vector or color input fills every component. |
add_named_output | outputName, id?, position? | |
add_repeat | count?, slots?, id?, position? | |
add_feedback | id?, position? | |
remove_node | id | |
connect | source, sourceHandle?, target, targetHandle | |
disconnect | edgeId?, target?, targetHandle? | |
set_input | id, value | Set an input node's value (set_value sets a port's). It must have the input's component count (1 for float, uint and bool, 2 to 4 for vecN, 3 for color) or be one number, which fills every component (0.5 is [0.5, 0.5, 0.5] for a color); another count is refused. |
set_value | id, port, value | Set the value an unwired input port of a registry node, preset, shader instance, group or text node reads; null clears it back to the default. A wire into the port wins while connected. One number into a vector or color port fills every component. |
expose_input | id, inputName | |
rename_node | id, label | |
move_node | id, position | |
group_nodes | ids, name, id?, inputNames?, outputNames? | Fold existing nodes into one named group. Every wire crossing the group becomes a port: an input per outside source, an output per inner source. Name ports with inputNames (keyed by the outside source, node or node.handle) and outputNames (keyed by the inner source); unnamed ones are derived. Groups cannot nest. |
ungroup | id | Splice a group's nodes back into the graph in its place. |
tidy | Lay the graph out left to right into the output, fold a constant read by one port into that port's value, drop uv nodes read only by spatial ports, split a uv feeding 4+ nodes into copies, and choose which previews show; groups are tidied inside too. Never changes what renders. Run it as the last edit. | |
replace_graph | graph |
shaders_update
Rename, describe (≤300 chars), categorize, change visibility, or file into a folder; send at least one of these fields. visibility: public lists a published shader in the community and requires a published version. folderId is a folder of the shader's organization (folders_list, folders_create); null moves it back to the root.
Needs a personal token or an org API key.
| Argument | Type | Required | Description |
|---|---|---|---|
id | string | yes | |
name | string | no | |
description | string | no | |
category | string | null | no | |
visibility | "private" | "public" | no | |
folderId | string | null | no |
shaders_fork
Copies a public shader's published version (latest, or version) into a new private draft you own, recording where it came from.
Needs a personal token or an org API key.
| Argument | Type | Required | Description |
|---|---|---|---|
id | string | yes | |
version | string | no | |
org | string | no | Organization slug (see me_get). Omitted: your personal organization. Org API keys always act in their own organization. |
name | string | no |
shaders_publish
Freezes the current draft as a new semver version (first publish is 1.0.0). Refuses a graph with error diagnostics. Publishing does not make a shader public; use shaders_update visibility for that. Returns the version, the slug and the embed URL.
Needs a personal token or an org API key.
| Argument | Type | Required | Description |
|---|---|---|---|
id | string | yes | |
bump | "major" | "minor" | "patch" | yes | |
changelog | string | no | |
slug | string | no |
folders_list
The folders of one of your organizations, by name. A shader sits in at most one folder; folders do not nest. File a shader with shaders_update folderId.
Works with any token, including preview tokens.
| Argument | Type | Required | Description |
|---|---|---|---|
org | string | no | Organization slug (see me_get). Omitted: your personal organization. Org API keys always act in their own organization. |
folders_create
Creates a folder in one of your organizations (color defaults to blue) and returns it. File shaders into it with shaders_update folderId.
Needs a personal token or an org API key.
| Argument | Type | Required | Description |
|---|---|---|---|
org | string | no | Organization slug (see me_get). Omitted: your personal organization. Org API keys always act in their own organization. |
name | string | yes | |
color | string | no | A palette color name such as blue, emerald or amber; an unknown one is refused with the full list. |
assets_list
Files uploaded to a shader, newest first. Use a pathname in the shaders_edit add_texture op. The local server's assets_upload tool adds one from a file on your machine.
Works with any token, including preview tokens.
| Argument | Type | Required | Description |
|---|---|---|---|
id | string | yes |
me_get
The caller: token kind, user (for personal tokens) and the organizations it can act in, by slug. Use a slug as org on other tools.
Works with any token, including preview tokens.
No arguments.
render
Render a shader to a PNG you can look at, with stats: mean colour, how much of
it is black, and whether any pixel is NaN. Pass either shaderId or an
unsaved graph, not both; an unsaved graph's uploaded textures load as they
do in their shader. times: [0, 0.5, 1, 2] shows motion in one image.
Only the local server returns images. The hosted server answers with a preview link for a published shader.
| Argument | Type | Required | Description |
|---|---|---|---|
shaderId | string | no | The shader to render. |
graph | object | no | An unsaved graph to render instead of a shader. |
version | string | no | A published version. Default: the latest. |
draft | boolean | no | Render your saved draft instead of a version. |
nodeId | string | no | Render one node's output, to inspect a branch. A node inside a group is groupId::innerId. |
output | string | no | Render a named output, or with nodeId on a group, that output of the group. |
inputs | Record<string, number | boolean | string | number[]> | no | Values for exposed inputs, by name. A texture input takes an asset pathname, as add_texture does, or an absolute image or video URL. |
times | number[] | no | Seconds, 1 to 8 of them. Default [1]. Several come back as one strip. |
size | 256 | 512 | no | Pixels on each frame's short side. Default 256. |
aspect | "1:1" | "4:5" | "2:3" | "9:16" | "16:9" | "3:2" | "3:4" | "4:3" | "21:9" | no | Each frame's shape, width:height. Default 1:1. |
warmupFrames | integer | no | Frames to run first, for feedback graphs. Default 45. |
cursor | [number, number] | no | Hold the pointer at [x, y], from 0 to 1 with the origin bottom-left. Default [0.5, 0.5]. |
cursorPath | [number, number, number][] | no | Move the pointer along [seconds, x, y] points instead, for pointer trails. |
assets_upload
Upload an image, video or font from your computer to a shader, up to 4 MB.
Returns its pathname, which the add_texture op or an add_text font
takes. Only the local server offers it.
| Argument | Type | Required | Description |
|---|---|---|---|
shaderId | string | yes | A shader you can edit. |
path | string | yes | The file's path on the machine running the server. |