Fluorite
MCP server

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.

ArgumentTypeRequiredDescription
idstringyes
versionstringno
draftbooleanno
slimbooleanno

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.

ArgumentTypeRequiredDescription
qstringno
categorystringno
kind"node" | "preset"no
limitintegerno

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.

ArgumentTypeRequiredDescription
idstringyes
internalsboolean | "true" | "false"no

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.

ArgumentTypeRequiredDescription
qstringyes

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.

ArgumentTypeRequiredDescription
slugstringyes

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.

ArgumentTypeRequiredDescription
graphobjectyesA 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.

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.

ArgumentTypeRequiredDescription
qstringno
categorystringno
orgstringno
cursorstringno

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.

ArgumentTypeRequiredDescription
idstringyes
versionstringno
draftbooleanno
slimbooleanno
groupstringno

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.

ArgumentTypeRequiredDescription
orgstringnoOrganization slug (see me_get). Omitted: your personal organization. Org API keys always act in their own organization.
qstringno
folderIdstringnoA folder id, or "root" for the shaders in no folder.
includeArchivedbooleanno
cursorstringnoThe previous page's nextCursor.
limitintegerno

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.

ArgumentTypeRequiredDescription
orgstringnoOrganization slug (see me_get). Omitted: your personal organization. Org API keys always act in their own organization.
namestringno
graphobjectnoA 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.

ArgumentTypeRequiredDescription
idstringyes
expectedRevisionintegeryes
opsobject[]yes

Each entry of ops is one of:

OpFieldsNotes
add_nodetslNodeId, 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_inputkind, 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_texturepathname?, 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_texttext?, 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_textid, text?, font?, weight?, align?, letterSpacing?, lineHeight?Change a text node's text or style; omitted fields stay.
set_textureid, fitChange how a texture node fits its image onto the canvas.
add_presetpresetId, 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_shadershaderId, 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_outputoutputName, id?, position?
add_repeatcount?, slots?, id?, position?
add_feedbackid?, position?
remove_nodeid
connectsource, sourceHandle?, target, targetHandle
disconnectedgeId?, target?, targetHandle?
set_inputid, valueSet 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_valueid, port, valueSet 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_inputid, inputName
rename_nodeid, label
move_nodeid, position
group_nodesids, 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.
ungroupidSplice a group's nodes back into the graph in its place.
tidyLay 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_graphgraph

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.

ArgumentTypeRequiredDescription
idstringyes
namestringno
descriptionstringno
categorystring | nullno
visibility"private" | "public"no
folderIdstring | nullno

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.

ArgumentTypeRequiredDescription
idstringyes
versionstringno
orgstringnoOrganization slug (see me_get). Omitted: your personal organization. Org API keys always act in their own organization.
namestringno

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.

ArgumentTypeRequiredDescription
idstringyes
bump"major" | "minor" | "patch"yes
changelogstringno
slugstringno

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.

ArgumentTypeRequiredDescription
orgstringnoOrganization 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.

ArgumentTypeRequiredDescription
orgstringnoOrganization slug (see me_get). Omitted: your personal organization. Org API keys always act in their own organization.
namestringyes
colorstringnoA 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.

ArgumentTypeRequiredDescription
idstringyes

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.

ArgumentTypeRequiredDescription
shaderIdstringnoThe shader to render.
graphobjectnoAn unsaved graph to render instead of a shader.
versionstringnoA published version. Default: the latest.
draftbooleannoRender your saved draft instead of a version.
nodeIdstringnoRender one node's output, to inspect a branch. A node inside a group is groupId::innerId.
outputstringnoRender a named output, or with nodeId on a group, that output of the group.
inputsRecord<string, number | boolean | string | number[]>noValues for exposed inputs, by name. A texture input takes an asset pathname, as add_texture does, or an absolute image or video URL.
timesnumber[]noSeconds, 1 to 8 of them. Default [1]. Several come back as one strip.
size256 | 512noPixels 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"noEach frame's shape, width:height. Default 1:1.
warmupFramesintegernoFrames to run first, for feedback graphs. Default 45.
cursor[number, number]noHold the pointer at [x, y], from 0 to 1 with the origin bottom-left. Default [0.5, 0.5].
cursorPath[number, number, number][]noMove 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.

ArgumentTypeRequiredDescription
shaderIdstringyesA shader you can edit.
pathstringyesThe file's path on the machine running the server.

On this page