Skip to main content
Glama

Server Configuration

Describes the environment variables required to run the server.

NameRequiredDescriptionDefault

No arguments

Capabilities

Features and capabilities supported by this server

CapabilityDetails
tools
{}

Tools

Functions exposed to the LLM to take actions

NameDescription
list_algorithmsA

List the algorithm storyboards and whether each has a saved review.

get_algorithmA

Read the full JSON spec of an algorithm storyboard (meta, kind, code, params, steps or builtin).

list_sheetsA

Table of contents: every sheet's id/code/name/title/sub + per-status node counts + its current rev (the concurrency token), with NO boards — the cheap way to see what exists before reading any board. Start here, then drill in with get_sheet / get_node.

get_reviewC

Read the saved review (tuned params + per-step comments + decisions) for an algorithm.

list_open_questionsA

List every authored open question — across algorithm storyboards AND workflow sheets — and whether each has been decided yet.

list_sharedA

List shared components (transcluded boards): every sheet marked shared or mounted via a node.boardRef, with its single status, its deep-link url (#sheetId), and the cards that mount it. Derived, not stored.

find_nodesA

Find / index workflow nodes by text or status, returning each match's node PATH so you jump straight to a card instead of drilling board by board. Pass the path straight to get_node or set_node to read/patch that card. (For edit_board, whose "at" addresses a BOARD, use the card's PARENT board — drop the last id from the path — and reference the card's id in nodes[].) With NO query it INDEXES every node across all sheets at every nesting depth. query = case-insensitive substring matched against a node's id / title / sub / detail.note / detail.in / detail.out / detail.open / algorithm (e.g. "Npgsql"). status = done|partial|todo filter. sheet = scope to one sheet (else the whole project). A boardRef mount shows as a leaf (→mounts ); edit its contents on the source sheet.

save_algorithmA

Create or replace an algorithm storyboard from a JSON spec. spec = { id (slug), tag?, name, title?, sub?, workflow?{sheet,label}, layout?{ width (overall page px, 700-2400), height (stage min-height px, 240-1600), sidebarWidth (pseudocode/narration column px, 260-720) } for bigger storyboards, kind ("array"|"calc"), code (pseudocode lines[]), params? [{ key, label, sym?, value, unit?, min, max, step, hint? }], and EITHER steps[] (explicit frames) OR builtin (one of: binary-search, bubble-sort, euclid-gcd) + data + questions?[{ step, text }] }. A frame (kind "array") = { array[], cls{index:state}, ptr{label:index}, note, line, verdict{ok?,text}, question? } where state ∈ idle|active|compare|lo|hi|mid|eliminated|found|sorted. A row (kind "calc") = { label, result?, unit?, expr?, sub?, kind?(input|result), bad?, line, note, question? }. Persists to this session's project.

delete_algorithmC

Delete an algorithm storyboard and its review. Persists.

get_sheetA

Read ONE workflow sheet by id. A deeply nested sheet can be huge — pass "depth" (positive int) to include nested child boards only that many levels deep (a deeper node.board becomes a stub { nodes, path } you fetch with get_node). Omit depth for the full sheet. Reading a sheet records its rev so a later edit_board/set_node/save_sheet is rejected if a human changed it meanwhile (see save_sheet).

get_nodeA

Read ONE node addressed by the same #sheet/nodeId/nodeId path the URL hash uses (or a stub's more.path) — jump straight to one pillar/sub-board instead of dumping the whole sheet. Returns that node with its own child board pruned to "depth" (default 1; deeper child boards become { nodes, path } stubs). To EDIT what you read here, use set_node (one card) or edit_board (a whole board) — never resend the sheet.

save_sheetA

Upsert ONE workflow sheet by id — create it or replace it in place WITHOUT resending the others. sheet = { id (slug), code (SHORT badge), name, title, sub, schema? (2 for the v2 board form), shared? (true ⇒ this sheet is a reusable COMPONENT other sheets mount), status? (done|partial|todo — a shared component's single status, mirrored by every mount), AND EITHER legacy stations[] OR a v2 "board" }. A v2 board (the infinite-canvas / nested-chart form the app now renders) = { nodes:[ NODE ], edges:[ EDGE ], view?:{x,y,zoom} }. NODE = { id (unique within this board), x, y, w?, h? (local px), title, sub?, status (done|partial|todo), detail?{in[],out[],note,open[]}, algorithm?, board? (a NESTED child board — revealed by zooming into the node), boardRef? (TRANSCLUDE another sheet by id instead of owning a board — mounts that shared component live+read-only and inherits its status; mutually exclusive with board; see list_shared) }. EDGE = { id, from (node id in THIS board), to (node id in THIS board), kind? (flow|loop|dep), label?, fromSide? (top|right|bottom|left — the side the edge leaves the source node) } — edges are intra-board only; link across levels by nesting, not by an edge. Legacy stations[] sheets still load and auto-migrate to a board on read. Use this to CREATE a sheet or rewrite it wholesale; for surgical edits to an existing sheet prefer edit_board / set_node (they don't resend the tree). CONCURRENCY: pass "baseRev" (a sheet's rev from list_sheets or a prior write) to make the write FAIL if the sheet changed since — by default a write is auto-rejected if a human edited the sheet in the app since you last read it; pass force:true to overwrite anyway. Returns created-or-updated + the new rev + lint warnings. Persists to this session's project.

delete_sheetA

Delete ONE workflow sheet by id (pass baseRev/force as in save_sheet to guard against a concurrent human edit). Persists.

reorder_sheetsA

Reorder the sheets in the left index. order = [id, …]; any sheet id you omit keeps its order at the end. Persists.

edit_boardA

GRANULAR write — edit cards & connections in ONE board WITHOUT resending the sheet. This is the primary way to keep the diagram in sync as you work (mark a card done, add a step, wire two cards). "at" addresses the board: the sheet id = its ROOT board, or "sheetId/nodeId/…" = the child board inside that container node (every non-leaf node on the path must already exist; only a leaf container's missing board is created so you can author into it). nodes[] UPSERT-MERGE by id: an existing id patches just the fields you pass (top-level keys replace; "detail" merges per key — set {detail:{note}} and detail.in/out/open are untouched; a null value CLEARS a field; an array replaces the whole array); a new id CREATES the node (needs a title; auto-placed below the board's bbox — pass x/y to override). edges[] upsert by id (omit id to create one; from/to must be node ids in THIS board; kind? flow|loop|dep, label?, fromSide? top|right|bottom|left). deleteNodes[] removes nodes (and cascades their incident edges); deleteEdges[] removes edges by id. One atomic, validated write. CONCURRENCY: auto-rejected if a human edited the sheet in the app since you last read it (re-read & re-apply, or pass force:true); pass baseRev (from list_sheets / a prior write) to pin it explicitly. Returns what changed + the new rev. Persists.

set_nodeA

Shorthand to edit ONE card: patch a single node addressed by its "sheetId/nodeId[/nodeId…]" path (the URL-hash form get_node uses). "set" is merged into the node with the same rules as edit_board.nodes[] (top-level replaces; detail merges per key; null clears; arrays replace). PATCH-by-default: if the node does not exist this ERRORS (so a typo can't silently create a phantom) — pass create:true to add it (a new node needs a title). For edges, deletes, or several cards at once, use edit_board. CONCURRENCY: same auto-guard as edit_board (baseRev / force). Returns created|updated + the new rev. Persists.

set_workflow_decisionB

Answer a workflow open question — record a decision against a station/track open[] item, identified by its sheet id and the EXACT question text (see list_open_questions). Persists.

reopen_workflow_questionC

Clear a recorded decision so a workflow open question is open again. Persists.

set_paramC

Set one param value in an algorithm review (re-evaluates the storyboard live). Persists.

set_commentB

Set (or clear, with empty text) a comment on a step of an algorithm. Persists.

set_decisionC

Resolve an open question: record the decision (answer) on a step. Persists.

reopen_questionB

Clear a recorded decision so the question is open again. Persists.

list_filesA

List the raw app files you may read/edit to design the look (CSS, HTML, JS at the app root). Excludes server/ and the demo seed.

get_fileB

Read a raw app file (e.g. styles.css, index.html, algorithms.html) to design the look.

set_fileA

Overwrite a raw app file to restyle/redesign the app. Allowed extensions: css, html, js, json, svg, md, txt. Cannot touch server/ or the demo seed (use the content tools for project data). No guardrails on the markup itself — local tooling.

Prompts

Interactive templates invoked by user choice

NameDescription

No prompts

Resources

Contextual data attached and managed by the client

NameDescription

No resources

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/claudiu-deving/workflow-atlas'

If you have feedback or need assistance with the MCP directory API, please join our Discord server