Skip to content

NazmulGit/NodeDeck

Folders and files

NameName
Last commit message
Last commit date

Latest commit

Β 

History

2 Commits
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 

Repository files navigation

Node Server Dashboard + MCP Control Center

Zero-dependency Node.js dashboard for managing PM2 + system-wide Node processes, plus a full control center for the Docker MCP Toolkit β€” browse the catalog, build profiles, manage secrets, run the gateway, and connect any AI client (Claude Code, Cursor, Claude Desktop, OpenClaw.ai, Paperclip, …) all from one local web UI.

Features Setup time Node License Dependencies Platform


Why this exists

The Docker MCP Toolkit ships an excellent CLI β€” but if you actually use it you end up juggling commands like:

docker mcp catalog show mcp/docker-mcp-catalog:latest --format json
docker mcp profile create --id dev_workflow --name "Dev workflow"
docker mcp profile server add dev_workflow --server catalog://mcp/docker-mcp-catalog:latest/github
docker mcp secret set github.token=...
docker mcp client connect claude-code --global
docker mcp gateway run --profile dev_workflow

This dashboard wraps all of that in a guided, point-and-click UI on top of your existing toolkit β€” no extra services to install, no daemons to babysit. Zero npm dependencies. It's just node server.js and a browser.

It also keeps everything the original PM2 dashboard already did (live process metrics, start/stop, log tailing, etc.) so you have one home for "everything running on this box."


✨ Features

MCP Control Center (powered by Docker MCP Toolkit)

  • 🧩 Browse the full Docker MCP catalog (316+ servers) β€” filterable by category, with tool/secret/env metadata previewed
  • πŸͺ„ Import wizard β€” multi-select MCPs from the catalog, drop into a new or existing profile, set required secrets, all in 5 guided steps
  • πŸ“¦ Profile manager β€” create, edit, run, delete; live "servers in this profile" panel
  • πŸ” Per-profile auth β€” see exactly which secrets each profile's servers need, set values via the OS keychain (docker mcp secret)
  • πŸšͺ Gateway control β€” start/stop the MCP gateway with a chosen profile, watch logs scroll in real time
  • πŸ”— One-click client connections β€” auto-configurable for 16 supported clients (Claude Code, Claude Desktop, Cursor, VS Code, Cline, Continue, Codex, Cursor, Gemini, Goose, Gordon, Kiro, LM Studio, OpenCode, Sema4, Zed) plus manual config-snippet generators for OpenClaw.ai, Paperclip Dashboard, or anything else
  • πŸ”§ Custom MCP catalog β€” add npx-based or command-based MCPs that live outside the Docker catalog
  • βž• New process from Docker β€” pick any MCP from the catalog and run it as a managed PM2 process (uses docker run -i --rm)

Process management (the original dashboard)

  • πŸ“Š Live system metrics (CPU per-core, RAM, disks, uptime)
  • βš™οΈ PM2 control β€” start/stop/restart/reload/scale/logs/flush, fork or cluster, env vars, watch mode
  • 🟒 External Node process detection β€” every node.exe on the box with friendly-name detection (Playwright MCP, Desktop Commander, Filesystem MCP, …)
  • πŸͺͺ Process lineage β€” sees through cmd.exe/pwsh.exe wrappers to the real spawning parent
  • πŸšͺ Listening ports per PID
  • πŸ’Ύ Backup/restore β€” single process or full ecosystem JSON

Architecture

  • Zero npm dependencies β€” pure Node.js standard library + vanilla JS
  • Single-file install β€” copy the folder, run start.bat / start.sh
  • 21 dedicated pages behind a sidebar menu, each focused on one task
  • Modular backend β€” lib/ modules wrap PM2, Docker MCP, and system stats; routes are a flat table in server.js
  • Local-first β€” everything stays on 127.0.0.1; nothing phones home

πŸš€ Quick start

Requirements

  • Node.js β‰₯ 14 (download)
  • Docker Desktop with the Docker MCP Toolkit extension installed (install guide)
  • PM2 (optional but recommended for the process side):
    npm install -g pm2

Install

git clone https://github.com/withnazmul/node-server-dashboard.git
cd node-server-dashboard
node server.js

Windows: double-click start.bat or run it from PowerShell. Linux/macOS: ./start.sh (chmod +x first if needed).

Open http://127.0.0.1:9615 in your browser.

Run under PM2 (so the dashboard restarts on reboot)

pm2 start server.js --name node-dashboard
pm2 save
pm2 startup       # follow the printed instruction once

πŸ—ΊοΈ The menu

The sidebar groups every task into one of five sections β€” each menu item is its own page:

πŸ“Š Dashboard

── SETUP ──
πŸ› οΈ  Server Setup           Health checklist: Docker, MCP toolkit, profiles, clients, gateway
βž•  New Process            2 options: add manually OR import from Docker catalog
🧩  Browse Catalog         Browse 316+ MCP servers, filter by category
πŸ”§  Add Custom MCP         Save an npx/command-based MCP outside Docker
πŸͺ„  Import Wizard          5-step batch import (multi-select β†’ profile β†’ secrets β†’ review)

── PROFILES ──
✨  Create Profile         New profile + optional pre-pick servers
✎  Edit Profile           Pick profile β†’ add/remove servers
β–Ά  Run Profile            Pick profile β†’ start gateway β†’ live logs
πŸ”  Profile Auth           Surface required secrets, set via OS keychain
πŸ“¦  All Profiles           Full list view

── CONNECT ──
πŸ€–  Claude Code            Pick profile β†’ connect/disconnect/reconnect
πŸ–₯️  Claude Desktop         Same, focused on this client
⚑  Cursor                 Same, focused on this client
🌐  OpenClaw.ai            Profile-aware config snippet generator
πŸ“Ž  Paperclip              Profile-aware config snippet generator
πŸ”—  Manual Connect         Form to add/edit any manual client
πŸͺ„  Connect Wizard         4-step guided connect flow
πŸ”Œ  All Clients            Live status of every supported + manual client

── TOOLS ──
πŸšͺ  MCP Gateway            Start/stop, profile picker, live logs
πŸ—οΈ  Secrets Vault          List/add/update/delete OS keychain secrets
βš™οΈ  Settings               Health and environment info

πŸ“Έ Screenshots

Screenshots haven't been generated for this commit. Add yours by running the dashboard and taking shots of each page, then dropping them in docs/screenshots/ and updating this section.

Page Description
Dashboard PM2 + external Node processes with live CPU/RAM/IO metrics
Browse Catalog 316+ MCP servers, search + category filter, tool/secret previews
Import Wizard 5-step: source β†’ pick β†’ destination β†’ auth β†’ review
Profile Editor Side-by-side: servers in profile vs add-from-catalog
Connect Claude Code Focused page: pick profile β†’ connect, plus fallback config snippet
Connect OpenClaw.ai / Paperclip Auto-generated config snippet (Stdio/SSE/Env formats) with copy-to-clipboard
MCP Gateway Start/stop with profile picker, live log tail

🧠 Architecture

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚  Browser (127.0.0.1:9615)                                        β”‚
β”‚  └── Sidebar menu β†’ 21 page modules (vanilla JS, no framework)   β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                            β”‚ HTTP/JSON
                            β–Ό
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚  server.js  (~190 lines: HTTP router + static file serving)      β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                            β”‚
        β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
        β–Ό                   β–Ό                           β–Ό
   lib/system.js       lib/pm2.js                  lib/docker-mcp.js
   lib/procs.js                                    lib/store.js
        β”‚                   β”‚                           β”‚
        β–Ό                   β–Ό                           β–Ό
   Native APIs:        pm2 CLI                     docker mcp CLI
   - os.cpus()         (jlist, start,              (catalog show,
   - WMIC / ps          stop, scale,                profile create,
   - netstat -ano       logs, flush,                client connect,
                        save, resurrect)            secret set,
                                                    gateway run)

See docs/ARCHITECTURE.md for the deep-dive (file layout, route map, state model, frontend page contract).

File layout

node-server-dashboard/
β”œβ”€β”€ server.js              # HTTP router (slim)
β”œβ”€β”€ package.json
β”œβ”€β”€ start.bat / start.sh   # OS launchers
β”œβ”€β”€ lib/
β”‚   β”œβ”€β”€ util.js            # runCmd helpers, byte/date formatters
β”‚   β”œβ”€β”€ system.js          # CPU/RAM/disk metrics
β”‚   β”œβ”€β”€ procs.js           # node.exe metrics + friendly-name detection
β”‚   β”œβ”€β”€ pm2.js             # pm2 CLI wrappers
β”‚   β”œβ”€β”€ docker-mcp.js      # docker mcp CLI wrappers (catalog/profiles/clients/secrets/gateway)
β”‚   └── store.js           # tiny JSON file persistence (custom catalog, manual clients)
β”œβ”€β”€ public/
β”‚   β”œβ”€β”€ index.html         # single page with sidebar + 21 page sections
β”‚   β”œβ”€β”€ app.js             # shared core: api, toast, promptModal, page router
β”‚   β”œβ”€β”€ style.css          # all styling
β”‚   └── pages/
β”‚       β”œβ”€β”€ dashboard.js
β”‚       β”œβ”€β”€ setup.js
β”‚       β”œβ”€β”€ process-new.js          # 2-option page: manual / Docker import
β”‚       β”œβ”€β”€ catalog.js              # browse Docker catalog
β”‚       β”œβ”€β”€ catalog-add.js          # focused: add custom MCP
β”‚       β”œβ”€β”€ import.js               # 5-step import wizard
β”‚       β”œβ”€β”€ profile-create.js       # focused
β”‚       β”œβ”€β”€ profile-edit.js         # focused
β”‚       β”œβ”€β”€ profile-run.js          # focused
β”‚       β”œβ”€β”€ profile-auth.js         # focused
β”‚       β”œβ”€β”€ profiles.js             # all profiles (list view)
β”‚       β”œβ”€β”€ connect-shared.js       # helpers used by every Connect page
β”‚       β”œβ”€β”€ connect-claude-code.js
β”‚       β”œβ”€β”€ connect-claude-desktop.js
β”‚       β”œβ”€β”€ connect-cursor.js
β”‚       β”œβ”€β”€ connect-openclaw.js
β”‚       β”œβ”€β”€ connect-paperclip.js
β”‚       β”œβ”€β”€ connect-manual.js
β”‚       β”œβ”€β”€ connect.js              # 4-step connect wizard
β”‚       β”œβ”€β”€ connections.js          # all clients (list view)
β”‚       β”œβ”€β”€ gateway.js              # focused: gateway control + logs
β”‚       β”œβ”€β”€ secrets.js              # focused: secrets vault
β”‚       └── settings.js             # health + env info
β”œβ”€β”€ data/                  # gitignored, populated at runtime
β”‚   └── .gitkeep
└── docs/
    β”œβ”€β”€ ARCHITECTURE.md
    β”œβ”€β”€ QUICKSTART.md
    └── FAQ.md

πŸ”Œ API reference

The dashboard exposes a small JSON API on 127.0.0.1:9615. Useful if you want to script around it.

System & process management

Method Path Returns
GET /api/system CPU, RAM, disk, hostname, uptime
GET /api/processes { pm2: [...], node: [...] }
GET /api/describe/:id Full PM2 describe object
GET /api/logs/:id?lines=200 Tail of PM2 logs (text)
POST /api/start Start a process via PM2
POST /api/(stop|restart|reload|delete)/:id PM2 lifecycle
POST /api/scale/:id { instances: N }
POST /api/reset/:id Reset restart counter
POST /api/flush/:id Flush logs
POST /api/save / /api/resurrect PM2 dump/restore
POST /api/kill/:pid / /api/killtree/:pid Force-kill external proc
GET /api/backup/:id / /api/backup-all Download JSON backup

MCP routes

Method Path Returns
GET /api/mcp/health { docker, mcp, version }
GET /api/mcp/catalogs { docker: [...], custom: [...] }
GET /api/mcp/catalog?ref=... Full catalog with all servers/tools
POST /api/mcp/custom-catalog Add custom MCP
DELETE /api/mcp/custom-catalog/:id Remove custom MCP
GET /api/mcp/profiles List of profile { id, name }
GET /api/mcp/profile/:id Full profile with servers
POST /api/mcp/profile Create profile ({ id, name })
DELETE /api/mcp/profile/:id Remove profile
POST /api/mcp/profile/:id/server/(add|remove) Add/remove server
GET /api/mcp/profile/:id/export Download profile YAML
GET /api/mcp/clients { supported, clients, manual }
POST /api/mcp/client/:name/(connect|disconnect) Wire client
POST /api/mcp/manual-client Add/edit manual client
DELETE /api/mcp/manual-client/:id Remove manual client
GET /api/mcp/secrets List secret names
POST /api/mcp/secret Set secret ({ name, value })
DELETE /api/mcp/secret/:name Remove secret
GET /api/mcp/gateway Gateway status + recent logs
POST /api/mcp/gateway/(start|stop) Control gateway

πŸ› οΈ Configuration

Env var Default What it does
PORT 9615 Port the dashboard listens on
HOST 127.0.0.1 Interface to bind to (default: localhost only)

Example:

# Listen on all interfaces (use with caution β€” see security notes)
HOST=0.0.0.0 PORT=8080 node server.js

Per-user state lives in data/:

File Contents
data/custom-catalog.json Your custom (non-Docker) MCP definitions
data/manual-clients.json OpenClaw.ai, Paperclip, and any custom client configs
data/settings.json UI preferences (theme, refresh interval)

πŸ”’ Security notes

  • The dashboard binds to 127.0.0.1 by default. Don't expose it to the public internet β€” it can spawn processes, run docker commands, and write to your OS keychain.
  • All secrets are stored in your OS keychain via docker mcp secret set, which uses the macOS Keychain / Windows Credential Manager / Linux Secret Service depending on your platform. The dashboard never writes secret values to disk.
  • The dashboard never makes outbound network calls. All catalog data comes from your local Docker MCP installation.

If you find a security issue, please see SECURITY.md.


πŸ§ͺ Sanity check

npm run check

Runs node --check against every backend module. The CI workflow does the same on every push.


🀝 Contributing

Pull requests welcome! See CONTRIBUTING.md for the dev setup, coding style, and how to propose a new feature.

Some good first issues:

  • Add screenshots (the README has placeholders)
  • Build a per-tool allowlist editor (docker mcp tools) inside the profile editor
  • Add an OAuth helper for MCPs that need browser-based auth (GitHub, Notion, …)
  • Add a profile-template browser (docker mcp template)
  • WebSocket/SSE log tail instead of polling

πŸ“š Resources

  • Model Context Protocol β€” the open spec this is all built on
  • Docker MCP Toolkit β€” Docker's container-based MCP runtime (this dashboard wraps its CLI)
  • Docker MCP Catalog β€” the Docker Hub namespace where catalog images live
  • Anthropic / Claude Code β€” primary client this dashboard targets
  • PM2 β€” the process manager this dashboard wraps
  • Related projects:
    • Cline β€” VS Code MCP client (auto-configurable here)
    • Cursor β€” IDE with MCP support
    • Goose β€” Block's MCP-native AI assistant

πŸ“œ Changelog

See CHANGELOG.md. Highlights:

  • 2.0.0 β€” MCP Control Center: 21 dedicated pages, sidebar nav, full Docker MCP Toolkit integration
  • 1.1.0 β€” Added external Node process detection with friendly names + listening ports
  • 1.0.0 β€” Initial PM2 dashboard release

πŸ“„ License

MIT β€” do whatever you want with it. Attribution appreciated but not required.


Built with vanilla JS, zero npm dependencies, and the Docker MCP Toolkit.
Found a bug? Open an issue Β· Want a feature? PRs welcome

About

NodeDeck - local-first dashboard & control center for Docker MCP Toolkit + PM2. Browse the MCP catalog, build profiles, manage secrets, run the gateway, and connect Claude, Cursor, VS Code & 16+ AI clients. Zero npm dependencies.

Topics

Resources

License

Contributing

Security policy

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors