Discover MCPs & agents
Loading MCPs and agents…
Loading MCPs and agents…
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.
From the repo.
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_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."
docker mcp secret)docker run -i --rm)node.exe on the box with friendly-name detection (Playwright MCP, Desktop Commander, Filesystem MCP, …)cmd.exe/pwsh.exe wrappers to the real spawning parentstart.bat / start.shlib/ modules wrap PM2, Docker MCP, and system stats; routes are a flat table in server.js127.0.0.1; nothing phones homenpm install -g pm2
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.
pm2 start server.js --name node-dashboard
pm2 save
pm2 startup # follow the printed instruction once
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 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.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) |
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.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.If you find a security issue, please see SECURITY.md.
npm run check
Runs 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:
docker mcp tools) inside the profile editordocker mcp template)See CHANGELOG.md. Highlights:
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
Replace {MCP_ENDPOINT_URL} with this MCP’s endpoint URL (from its repo or docs above). No API key — you connect directly.
Tool
OS
Config file: ~/.cursor/mcp.json
{
"mcpServers": {
"mcp-server": {
"url": "{MCP_ENDPOINT_URL}"
}
}
}Paste into mcpServers in the config file. Restart Cursor after saving.
If this MCP is also published on mcpchannel.ai, you can subscribe from Browse and use the gateway config there instead.