workflow-studio
Local no-code builder + observability dashboard for Claude Code Workflow runs — a Claude Code plugin (uvx workflow-studio).
Install / Use
claude mcp add hculap -- npx -y github:hculap/workflow-studioIf the server publishes to npm under a different name, use that package instead — check the repo README.
MCP Server
Model Context Protocol server
Quality Score
Category
AutomationSupported Platforms
Tags
Our assessment of workflow-studio
workflow-studio scores 83/100 on our quality scale, 2230th of 2,897 Automation skills we index.
Its MCP Server is 13 KB long, well organised into 31 sections with 11 code examples: a thorough specification that gives an agent plenty to work with.
It has 3 GitHub stars, so there is little community track record yet; judge it on its content.
Maintenance, license and trust
- The repository was last updated today, so workflow-studio is actively maintained.
- It is released under the MIT license, a permissive license that allows use, modification and commercial use with attribution.
- Its trust signals score 92/100, with 1 caution from licensing, adoption, age or documentation. These come from repository metadata, not a code audit — read the skill file before letting an agent act on it.
workflow-studio compared with similar skills
All 4 of these similar skills score higher than workflow-studio; compare them before choosing.
| Skill | Score | Stars | Updated | Format |
|---|---|---|---|---|
| workflow-studio (this skill)by hculap | 83 | 3 | today | MCP Server |
| Agent-Reachby Panniantong | 100 | 94.8k | 1d ago | CLAUDE.md |
| headroomby headroomlabs-ai | 100 | 74.8k | today | CLAUDE.md |
| CowAgentby zhayujie | 100 | 47.3k | today | CLAUDE.md |
| Scraplingby D4Vinci | 100 | 86.5k | 1d ago | MCP Server |
Frequently asked questions
- How do I install workflow-studio?
- Run
claude mcp add hculap -- npx -y github:hculap/workflow-studio. The install tabs above show the steps for each supported agent. - Which AI agents does workflow-studio work with?
- It is written for Claude Code and Claude Desktop, as a MCP Server file. Other agents that read the same format can often use it too.
- Is workflow-studio safe to use?
- It is MIT-licensed and scores 92/100 on trust signals. Skills are instructions an agent will follow, so read the file before installing it and do not approve commands you do not understand.
- Is workflow-studio still maintained?
- The repository was last updated today, so workflow-studio is actively maintained.
Skill content
View source on GitHubWorkflow Studio
A local, no-code builder and observability dashboard for Claude Code's Workflow tool — exposed to the agent over MCP.
Website: szymonpaluch.com/workflow-studio · Install: uvx workflow-studio (PyPI)
Claude Code's Workflow tool is a deterministic multi-agent orchestration primitive — fan-out subagents, pipelines, adversarial review, loops. Workflow Studio gives you two things it doesn't have on its own: a way to watch what a run actually did (phases, agents, tokens, timing, which branch was taken), and a way to author new workflows visually instead of hand-writing the JS. It then exposes both halves to the Claude Code agent over MCP, so you and the agent work through one live surface instead of a script file dropped on disk that the agent can't see.
Everything runs locally. The dashboard binds 127.0.0.1, reads your local Claude Code data on disk, and makes no network calls — no telemetry.
Screenshots
Observe
A real deep-research run — Scope → Search → Fetch → Verify → Synthesize — that fanned out to 111 agents across 5 phases (513 tool calls, 3.7M tokens, ~22 min):

Each node is a phase; the ring shows how many of its agents finished, and each edge shows how one stage's output feeds the next (75 ag → [object ×75]). Every number here is read from the run's own overlay — measured, not guessed.
Flip to the timeline lens for the wall-clock view. Here a shorter landing-interactive-review run (9m 49s): the Review fan-out (blue) runs first, then Verify (pink) staggers in as each agent lands.

Author
The no-code block builder. Add typed blocks from + Agents / + Data / + Control, wire them up, and hit Run — it compiles to a runnable Workflow script (this one: START → agent → fan-out ×10 → fan-out ×10 → agent):

The two halves
1. Observe
A React dashboard that reads Claude Code's own on-disk run artifacts (~/.claude/projects/**/subagents/workflows/wf_*) and renders each run as a graph/timeline: phases, per-agent nodes, tokens, timing, and which branch was taken. Live runs are included and the view auto-refreshes as a run progresses.
2. Author
A no-code block builder (canvas) that compiles to a runnable Workflow script. It emits real Workflow primitives — agent(), phase(), parallel(), pipeline(), log() — plus a @wf-builder sidecar comment so designs round-trip losslessly between the canvas and the generated script.
There are 12 block kinds:
| Block | What it is |
|-------|------------|
| agent | A single agent with a prompt |
| fanout | N agents in parallel |
| loop | One agent improves the result over N rounds (in place) |
| subwf | A nested workflow |
| gate | Agent only when a predecessor field meets a condition (0..1) |
| filter | Filter a list by an element field — no agent |
| switch | Branch on a predecessor enum field value (k-way) — no agent |
| pipeline | Each list element flows through the stages independently (no barrier) |
| rank | Sort a list by a field and keep the top N — no agent |
| input | A fixed list of elements (a source for fan-out/pipeline/ranking) — no agent |
| param | A named value (text/path/number) for @{…} in prompts — no agent |
| start | The entry anchor — no agent. Blocks wired from it are the start; 2+ run in parallel |
For the agent (MCP)
The package ships a hand-rolled, dependency-free JSON-RPC 2.0 stdio MCP server (no SDK, so the package stays zero-dependency and uvx-startable with no resolution step). It runs via the workflow-studio mcp subcommand and exposes 9 tools:
| Tool | Kind | What it does |
|------|------|--------------|
| get_context | read | The scope this server operates under (launch project, path, current session) plus a doctor view (dataDir/tasksRoot/dist). Call first. |
| list_projects | read | Every Claude Code project on the machine with workflow history. |
| list_runs | read | OBSERVED runs in the current project (live first, then newest): name, agent count, status, age. |
| get_run | read | Full OBSERVED graph of one run: phases, agents, logs, tokens, timing. |
| list_workflows | read | Reusable workflows visible in the project (builder designs + workflows observed from runs), with honest source. |
| get_workflow | read | One workflow by name: its runnable script, a decoded contract (when hasSidecar), and the runs sharing its name. |
| get_run_design | read | The DECLARED design a specific run executed: script + source + decoded contract. |
| save_workflow | write | Draft a Workflow script INTO the human's block builder (appears in list_workflows). Returns the path + editable flag; refuses to overwrite an existing name unless overwrite=true. |
| promote_run | write | Promote an existing run into a named, reusable workflow (copies the run's own script). Refuses if the name already exists. |
Honesty flags (baked into the data)
The project's ethos is not conflating what was observed with what was declared, so the flags live in the tool payloads, not in prose:
- Observed run data (
get_run,list_runs) carries:taskMatched—falsemeans the overlay was garbage-collected and the metrics are heuristic/unknown, not measured.status—liveorincompletemeans the elapsed span is a lower bound, not a final measurement.
- Declared designs (
get_workflow,get_run_design) carry:source—'snapshot'= exactly what ran,'template'= a mutable fallback that may differ from what ran,null= none recorded.hasSidecar+ a decodedcontract(declared inputs + per-agent output schema + block/edge skeleton).hasSidecar=falsemeans the structure is best-effort recovery, not a faithful design.
The server cannot start a run
It hands the agent a design's script; the agent runs that script with its own Workflow tool. There is no path by which this server injects a run into your session.
Why MCP — the collaboration story
Without this, the only human↔agent channel is a script file dropped on disk that the agent is blind to. The MCP server turns it into a live two-way surface: the agent discovers what you built in the builder, reads a design's declared contract, runs it with its own Workflow tool, inspects the resulting observations, and drafts designs back into your builder for you to review and refine. One surface, both directions.
Install
Requires uv/uvx on your PATH. The package is published on PyPI as
workflow-studio — nothing to build.
Hand it to your agent (easiest)
You're probably already in a coding agent. Paste this and let it do the whole install:
Read https://github.com/hculap/workflow-studio/blob/main/AGENT_INSTALL.md and set up Workflow Studio for me — run the steps, verify it, and tell me whether to restart Claude Code.
It points the agent at AGENT_INSTALL.md — a short guide that has it register the marketplace, install the plugin, verify the MCP server is connected, and tell you when to restart. The manual commands below do the same thing by hand.
Plugin (recommended)
/plugin marketplace add hculap/workflow-studio
/plugin install workflow-studio@workflow-studio
Then /mcp lists workflow-studio (9 tools) and /workflow-studio:dashboard opens the UI. The plugin
launches the MCP server with uvx workflow-studio==0.2.0 mcp, pulling that exact version from PyPI.
Local dev (from a checkout, before pushing the marketplace repo)
/plugin marketplace add /absolute/path/to/plugin-marketplace
/plugin install workflow-studio@workflow-studio
MCP server only (no plugin)
claude mcp add workflow-studio -s user -- uvx workflow-studio mcp
Dashboard (standalone)
uvx workflow-studio
Behind a reverse proxy (subpath) · v0.2.0+
By default the dashboard is served at the root (http://127.0.0.1:8787/). To mount it under a
subpath — e.g. when location / on your domain is already taken — set a base path. It's a runtime
setting (the PyPI build stays mount-agnostic), so nothing is hard-coded:
WORKFLOW_STUDIO_BASE_PATH=/workflow-studio workflow-studio --no-open
# or: workflow-studio --no-open --base-path /workflow-studio
The server then stamps a <base href> into index.html and prefixes every asset/API/router path, so
assets, the data API, and deep-linked runs all resolve under the prefix. Example nginx (the dashboard
polls over plain HTTP — no WebSocket/SSE, so no Upgrade handling is needed):
location = /workflow-studio { return 301 /workflow-studio/; }
location /workflow-studio/ {
proxy_pass http://127.0.0.1:8787; # no trailing slash: forwards the full path incl. the prefix
proxy_set_header Host $host;
proxy_set_header X-Forwarded-Proto $scheme;
}
Stripping proxies work too — the server strips the prefix itself if present, so it doesn't matter
whether the proxy forwards /workflow-studio/runs or the bare /runs.
Run it as a hardened systemd service
To keep it up behind the proxy, run the dashboard as a service. A hardened unit (adapt User and the
/home/<user> paths):
# /etc/systemd/system/workflow-studio.service
[Unit]
Description=Workflow Studio
After=network-online.target
Wants=network-online.target
[Service]
Type=simple
User=<user>
Environment=HOME=/home/<user>
Environment=PATH=/home/<user>/.local/bin:/usr/bin:/bin
Environment=WORKFLOW_STUDIO_BASE_PATH=/workflow-studio
Environment=WORKFLOW_STUDIO_NO_OPEN=1
ExecStart=/home/<user>/.local/bin/uvx workflow-studio --host 127.0.0.1 --port 8787 --no-open --all-projects
Restart=on-failure
# ── hardening ──
NoNewPrivileges=true
ProtectSystem=strict
ProtectHome=read-only
# uvx materializes its tool environment here — REQUIRED under ProtectSystem=strict or the service
# won't start (add ~/.cache/uv too for a cold first run). The data dir is where "Save as template" writes.
ReadWritePaths=/home/<user>/.local/share/uv /home/<user>/.cache/uv /home/<user>/.local/share/workflow-studio
# ProtectSystem=strict also mounts /tmp read-only — give the service its own writable /tmp.
# Safe: Workflow Studio reads run artifacts from under $HOME, never /tmp.
PrivateTmp=true
[Install]
WantedBy=multi-user.target
Then sudo systemctl daemon-reload && sudo systemctl enable --now workflow-studio.
Two hardening gotchas that block startup under ProtectSystem=strict, both handled above:
ReadWritePathsmust include uv's tool dir (~/.local/share/uv, plus~/.cache/uvon a cold machine) —uvxwrites the resolved package there; with the rest of the FS read-only it can't launch.PrivateTmp=true—strictmakes/tmpread-only; a private tmp restores a writable one. It's safe because run data lives under$HOME, not/tmp.
Scope. A service has no "current project", so --all-projects shows runs from the whole machine.
To pin it to one project instead, drop that flag and add --project /home/<user>/path/to/project
(then systemctl daemon-reload && systemctl restart workflow-studio).
Status
The package is live on PyPI — uvx workflow-studio and uvx workflow-studio mcp work today, and
/plugin marketplace add hculap/workflow-studio installs the plu
Truncated for display — read the full file on GitHub.
Related Skills
Agent-Reach
94.8kGive your AI agent eyes to see the entire internet. Read & search Twitter, Reddit, YouTube, GitHub, Bilibili, XiaoHongShu — one CLI, zero API fees.
headroom
74.8kCompress tool outputs, logs, files, and RAG chunks before they reach the LLM. 20% fewer tokens for coding agents, 60-95% fewer tokens for JSON, same answers. Library, proxy, MCP server.
CowAgent
47.3kOpen-source personal AI assistant & Agent Harness. Plans tasks, runs tools and skills, self-evolves with memory and knowledge. Multi-agent, multi-model, multi-channel. Lightweight, extensible, one-line install.
Scrapling
86.5k🕷️ An adaptive Web Scraping framework that handles everything from a single request to a full-scale crawl! Don't be shy, join here: https://discord.gg/EMgGbDceNQ and follow here for daily tips and tricks: https://x.com/Scrapling_dev
Languages
Trust signals
From repository metadata: license, adoption, age and documentation. Not a code audit — see the Safety scan above for what the skill file itself contains.
