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.
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_workflowThis 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."
- π§© 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)
- π 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.exeon the box with friendly-name detection (Playwright MCP, Desktop Commander, Filesystem MCP, β¦) - πͺͺ Process lineage β sees through
cmd.exe/pwsh.exewrappers to the real spawning parent - πͺ Listening ports per PID
- πΎ Backup/restore β single process or full ecosystem JSON
- 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 inserver.js - Local-first β everything stays on
127.0.0.1; nothing phones home
- 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
git clone https://github.com/withnazmul/node-server-dashboard.git
cd node-server-dashboard
node server.jsWindows: 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.
pm2 start server.js --name node-dashboard
pm2 save
pm2 startup # follow the printed instruction onceThe 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 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 |
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β 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).
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
The dashboard exposes a small JSON API on 127.0.0.1:9615. Useful if you want to script around it.
| 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 |
| 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 |
| 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.jsPer-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) |
- The dashboard binds to
127.0.0.1by 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.
npm run checkRuns node --check against every backend module. The CI workflow does the same on every push.
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
- 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:
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
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