 Command

Pranesh Nikhar's personal site. Vim-style keybinds for navigation; theme + font pickers below.

Theme
 Font Body Code
Reader
Keybinds
Navigation
j / ↓ Next item k / ↑ Previous item g First item in region G Last item in region zz Center focused item h / l Move left/right region ] / [ Next/previous heading } / { Next/previous block d / u Half-page down/up
Layout
<zh> / <zl> Toggle left/right sidebar <zr> Toggle reader view <zj> / <zk> Focus main/navbar <S-h/j/k/l> Focus left/main/navbar/right ⌃H / ⌃L Focus left/right sidebar ⌃J / ⌃K Focus main/navbar ⇧C / ⇧E Collapse / expand all sections
Dialogs
⌃P / : Command palette ⌃X Theme picker / Search ? Show keybinds Esc / ⌃C Close dialog
History
n Next document b Previous document ⌃O History back ⌃I History forward
 Search
about: Pranesh Nikhar about/more: πŸͺͺ More docs/test: Docs Test ideas: πŸ’‘ Ideas more: βž• More now: Now posts: πŸ“¬ Posts projects: πŸ“š Projects webtui: Style posts/agentic-eda: πŸ“Š AgenticEDA β€” Automated Exploratory Data Analysis with LangGraph posts/cap-theorem-outage-story: 🌐 CAP Theorem with a Real Outage Story posts/codepilot: ✈️ CodePilot β€” From Requirements to Deployable FastAPI Backend posts/common-auth-mistakes: πŸ” Common Auth Mistakes Developers Make posts/compiled-vs-jit-vs-interpreted: ⚑ Why Is X Language Fast or Slow? β€” Compiled vs JIT vs Interpreted posts/cs-degree-gaps: πŸŽ“ Things CS Degrees Don't Teach You posts/cve-2025-breach-analysis: πŸ›‘οΈ CVE-2025 Breach Analysis β€” Midnight Blizzard and the 16 Billion Credential Leak posts/fixloop: πŸ”„ FixLoop β€” AI Agent Loop for Self-Correcting Code posts/functional-vs-oop: ⚑ Functional vs OOP β€” Same Problem, Both Ways posts/getman: 🦾 Getman β€” Declarative API Tester for CLI & TUI posts/how-compilers-optimize: βš™οΈ How Compilers Actually Optimize Your Code posts/http3-quic: ⚑ HTTP/3 and QUIC β€” Why They Matter posts/leetcode-vs-engineering: 🧩 LeetCode vs Real Engineering Skills posts/llm-from-scratch: 🧠 LLM from Scratch β€” GPT-Style Transformer in PyTorch posts/lsm-trees-bloom-filters: 🌳 LSM Trees & Bloom Filters β€” Production Deep Dive posts/mcp-workflow-builder: πŸ”§ MCP Workflow Builder β€” Visual DAG for MCP Tools posts/persistent-memory: 🧠 Persistent Memory β€” Long-Term Memory for AI Agents via MCP posts/playcli: 🎬 PlayCLI β€” Terminal Video Player posts/postgres-mvcc: πŸ—„οΈ How PostgreSQL MVCC Works β€” Multi-Version Concurrency Control Deep Dive posts/raft-consensus: β›΅ Raft Consensus Algorithm Explained posts/rust-borrow-checker: πŸ¦€ Rust Borrow Checker β€” Catches Real Bugs posts/titan: πŸ€– Titan β€” Terminal AI Coding Agent posts/what-happens-url: 🌐 What Happens Between Typing a URL and Seeing the Page posts/what-happens-when-you-run-a-program: βš™οΈ What Actually Happens When You Run a Program posts/zero-knowledge-proofs: πŸ” Zero-Knowledge Proofs Explained Simply webtui/components/accordion: Accordion webtui/components/badge: Badge webtui/components/button: Button webtui/components/checkbox: Checkbox webtui/components/dialog: Dialog webtui/components/input: Input webtui/components/popover: Popover webtui/components/pre: Pre webtui/components/progress: Progress webtui/components/radio: Radio webtui/components/range: Range webtui/components/separator: Separator webtui/components/spinner: Spinner webtui/components/switch: Switch webtui/components/table: Table webtui/components/textarea: Textarea webtui/components/tooltip: Popover webtui/components/typography: Typography webtui/components/view: View webtui/contributing/contributing: Contributing webtui/contributing/contributing: ## Local Development webtui/contributing/contributing: ## Issues webtui/contributing/contributing: ## Pull Requests webtui/contributing/style-guide: Style Guide webtui/contributing/style-guide: ## CSS Units webtui/contributing/style-guide: ## Selectors webtui/contributing/style-guide: ## Documentation webtui/installation/astro: Astro webtui/installation/astro: ## Scoping webtui/installation/astro: ### Frontmatter Imports webtui/installation/astro: ### β€Ήstyleβ€Ί tag webtui/installation/astro: ### Full Library Import webtui/installation/nextjs: Next.js webtui/installation/vite: Vite webtui/plugins/plugin-dev: Developing Plugins webtui/plugins/plugin-dev: ### Style Layers webtui/plugins/plugin-nf: Nerd Font Plugin webtui/plugins/theme-catppuccin: Catppuccin Theme webtui/plugins/theme-custom: Custom Theme webtui/plugins/theme-everforest: Everforest Theme webtui/plugins/theme-gruvbox: Gruvbox Theme webtui/plugins/theme-nord: Nord Theme webtui/plugins/theme-vitesse: Vitesse Theme webtui/start/ascii-boxes: ASCII Boxes webtui/start/changelog: Changelog webtui/start/installation: Installation webtui/start/installation: ## Installation webtui/start/installation: ## Using CSS webtui/start/installation: ## Using ESM webtui/start/installation: ## Using a CDN webtui/start/installation: ## Full Library Import webtui/start/installation: ### CSS webtui/start/installation: ### ESM webtui/start/installation: ### CDN webtui/start/intro: Introduction webtui/start/intro: ## Features webtui/start/plugins: Plugins webtui/start/plugins: ## Official Plugins webtui/start/plugins: ### Themes webtui/start/plugins: ## Community Plugins webtui/start/theming: Theming webtui/start/theming: ## CSS Variables webtui/start/theming: ### Font Styles webtui/start/theming: ### Colors webtui/start/theming: ### Light & Dark webtui/start/theming: ## Theme Plugins webtui/start/theming: ### Using Multiple Theme Accents webtui/start/tuis-vs-guis: TUIs vs GUIs webtui/start/tuis-vs-guis: ## Monospace Fonts webtui/start/tuis-vs-guis: ## Character Cells
 Theme Current: Light j/k or ↑/↓ + Enter

πŸ”§ MCP Workflow Builder β€” Visual DAG for MCP Tools

Drag-and-drop canvas for chaining MCP tools into multi-step pipelines. Export as standalone TypeScript scripts. React Flow frontend, Express backend, SQLite persistence.

🎯 What It Does

MCP Workflow Builder is a visual drag-and-drop canvas for chaining MCP (Model Context Protocol) tools into multi-step pipelines β€” no coding required. Connect MCP servers, drag tools onto a React Flow canvas, wire them into a directed acyclic graph (DAG), and execute with real-time streaming.

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”    β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”    β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚  Start   β”‚ β†’  β”‚  Tool A  β”‚ β†’  β”‚  Tool B  β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜    β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜    β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                               β”‚
                               ↓
                            β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”
                            β”‚  End     β”‚
                            β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

🧱 Tech Stack

ComponentTechnology
FrontendReact 18, Vite 5, React Flow 11, Tailwind CSS 3
BackendExpress 4, better-sqlite3
SDK@modelcontextprotocol/sdk
StreamingServer-Sent Events (SSE) for real-time execution
ExportStandalone TypeScript script generation

πŸ—οΈ Architecture

β”œβ”€β”€ client/
β”‚   β”œβ”€β”€ WorkflowCanvas.tsx      # Main React Flow canvas
β”‚   β”œβ”€β”€ ToolPalette.tsx         # Left sidebar with searchable tool list
β”‚   β”œβ”€β”€ component/
β”‚   β”‚   β”œβ”€β”€ ConditionNode.tsx
β”‚   β”‚   β”œβ”€β”€ ToolNode.tsx
β”‚   β”‚   └── SubworkflowNode.tsx
β”‚   β”œβ”€β”€ MCPConnectionDialog.tsx  # Add new MCP server
β”‚   β”œβ”€β”€ TemplateDialog.tsx       # Load from template
β”‚   β”œβ”€β”€ ExecutionPanel.tsx       # 200-line terminal log, SSE stream
β”‚   β”œβ”€β”€ ErrorBoundary.tsx
β”‚   └── hooks/
β”‚       β”œβ”€β”€ useWorkflow.ts
β”‚       β”œβ”€β”€ useExecution.ts
β”‚       └── useMCP.ts
β”‚
β”œβ”€β”€ server/
β”‚   β”œβ”€β”€ routes/
β”‚   β”‚   β”œβ”€β”€ workflows.ts        # CRUD for workflows
β”‚   β”‚   β”œβ”€β”€ mcp.ts              # MCP server management
β”‚   β”‚   β”œβ”€β”€ execution.ts        # Pipeline execution
β”‚   β”‚   └── templates.ts        # Template storage
β”‚   β”œβ”€β”€ services/
β”‚   β”‚   β”œβ”€β”€ execution-engine.ts  # Topological sort, parameter binding, SSE
β”‚   β”‚   β”œβ”€β”€ mcp-connection.ts   # stdio transport, tool discovery
β”‚   β”‚   β”œβ”€β”€ workflow-store.ts   # SQLite CRUD
β”‚   β”‚   β”œβ”€β”€ template-store.ts   # Template management
β”‚   β”‚   β”œβ”€β”€ export-generator.ts # TypeScript export
β”‚   β”‚   └── execution-store.ts  # History
β”‚   └── data/workflows.db       # SQLite database
β”‚
└── shared/
    └── types/
        └── index.ts            # Shared TypeScript types

🧩 Node Types

Node TypePurpose
StartEntry point, defines initial parameters
EndTerminal node, collects final outputs
InputUser-input prompt/parameter node
ToolExecutes an MCP tool with parameter bindings
ConditionBranches based on expressions: ==, !=, >, <, >=, <=, contains, startsWith, isEmpty
SubworkflowNests another saved workflow as a step

πŸ”„ Execution Engine

The execution engine (execution-engine.ts) processes the DAG:

  1. Topological sort with cycle detection (prevents infinite loops)
  2. Parameter binding: {{nodeId.prop}} syntax resolves upstream outputs
  3. Condition evaluation: branch expressions determine which path to follow
  4. Branch skipping: inactive branches get skipped status
  5. SSE streaming: real-time push of each step’s result to the frontend

πŸ“¦ Templates

4 built-in templates to get started:

  • Code Review: Analyze code β†’ linter β†’ security scan β†’ report
  • Data Pipeline: Fetch data β†’ transform β†’ validate β†’ export
  • Research: Web search β†’ extract β†’ summarize β†’ save
  • Custom: Empty canvas

πŸ“€ Export

Pipelines can be exported as standalone TypeScript scripts with zero external dependencies beyond @modelcontextprotocol/sdk:

import { Client } from '@modelcontextprotocol/sdk/client/index.js'
import { StdioClientTransport } from '@modelcontextprotocol/sdk/client/stdio.js'

const client = new Client({ name: 'exported-pipeline', version: '1.0.0' })

async function evaluate(step: Step, context: Map<string, any>): Promise<any> {
  // Inline the pipeline logic
}

πŸš€ Quick Start

# Start the server
cd server && npm install && npm start
# β†’ Server on http://localhost:3001

# Start the client
cd client && npm install && npm dev
# β†’ UI on http://localhost:5173

# Add an MCP server, drag tools onto the canvas
# Wire them together, hit execute

πŸ’‘ Why It’s Interesting

MCP tools are powerful individually, but their real potential is in composition β€” chaining multiple tools together to solve complex tasks. The Workflow Builder makes this visual, interactive, and exportable. The DAG-based execution with parameter binding, conditional branching, and real-time SSE streaming turns a collection of individual MCP servers into a full pipeline orchestrator. The TypeScript export feature means your visual workflow becomes a deployable script β€” best of both worlds.

 praneshnikhar.site / posts / mcp-workflow-builder Β· Top 1:1