workflow-atlas
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
No arguments | |||
Capabilities
Features and capabilities supported by this server
| Capability | Details |
|---|---|
| tools | {} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| 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
| Name | Description |
|---|---|
No prompts | |
Resources
Contextual data attached and managed by the client
| Name | Description |
|---|---|
No resources | |
Latest Blog Posts
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
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