Atlas / MCP servers / beingmechon / stackdeck

stackdeckCAUTION

mcp/beingmechon/stackdeck

Your projects folder, as a control panel: start, stop, branch-switch and watch your local dev services. Zero dependencies, never talks to the internet.

Verdict
CAUTION
Grade
C
Trust score
73 /100
Exposed tools
9 5r · 2w · 2d
Transport
—
License
MIT
Stars
0
01

Overview

From the repository's own README, as read at the audited commit. Badges and raw HTML are left out.

[](https://github.com/beingmechon/stackdeck/actions/workflows/ci.yml)

Your agent made four worktrees. Something has to run them.

Making the worktree is the easy part. The hour after is the problem: four branches, four dev servers, ports you didn't choose, and no idea which are up or what they're printing. Stackdeck starts them, keeps them running, streams their logs, shows every port on the machine, and hands all of it to your agent over MCP.

It works on the rest of your projects folder too — scans your roots, works out how to run each repo across ~15 ecosystems, boards them all. One Node process, one HTML page, no dependencies, bound to 127.0.0.1, never talks to the internet.

Install

npm i -g stackdeck                                                 # npm
brew install beingmechon/tap/stackdeck                             # Homebrew
curl -fsSL https://beingmechon.github.io/stackdeck/install.sh | sh  # no npm needed
stackdeck        # starts the daemon, opens http://localhost:8899
stackdeck tui    # the same board, in your terminal

Point it at your projects folder in settings, then press configure on any project. npx stackdeck runs it without installing anything.

Node 18.13+, macOS or Linux — WSL2 included, with caveats; Windows-native is out of scope. The curl installer unpacks into ~/.local after checking the tarball against the hash npm recorded at publish time (read it first); undo with ... | sh -s -- --uninstall.

stackdeck  5 running · 12 stopped
─────────────────────────────────────────────────────────────
Read from source at commit d9be53ae6184OBSERVED · 2026-10-12
02

Connect

Built from this server's own package name, version and transport as found in its source — not copied from anyone's documentation, so it cannot drift against a page we do not control.

claude-code
claude mcp add web -- npx -y @acme/web
claude-desktop
{
  "mcpServers": {
    "web": {
      "command": "npx",
      "args": [
        "-y",
        "@acme/web"
      ]
    }
  }
}
03

Exposed tools (9)

5 read · 2 write · 2 destructive. Blast radius: 2 tools can delete or overwrite — an agent that can be talked into calling a tool can be talked into calling this one.

ToolRiskDescription
get_logsreadReturn the most recent log lines for a service (from its on-disk log).
kill_piddestructiveKill a process by pid. Only pids currently holding a listening port can be killed; the daemon
list_portsreadEvery listening TCP port on this machine, not just configured services: port, pid, process, full command, age, which Stackdeck service owns it, whether it is an OS process, and whether it belongs to another user (then it cannot be inspected or killed without sudo, which Stackdeck never uses).
list_servicesreadList all Stackdeck services with running state, port, pid, git branch, and dirty flag.
list_worktreesreadEvery git worktree of a service
restart_servicewriteRestart a service by name.
stop_servicedestructiveStop (kill) a service by name.
stop_worktreewriteStop a running worktree instance by its key (the \
whats_on_portreadWhat is holding a specific port, if anything. Use this before starting a service that failed to bind.
04

Trust audit

CAUTIONgrade C · trust 73/100 Install with care. The audit found things worth knowing before you trust its output.

LayerWhat it checksResult
L0Provenance & inventoryWARN
L1Static analysis of the codeWARN
L2Instruction surface (what it tells the agent)PASS
L3Class-specific surfaceWARN
L4Behavioural (sandbox)SKIPPED

What the source does

Filesystem
declared (1 observation(s))
Network
declared (8 observation(s))
Shell
none-observed
Dependencies
not all pinned
Secrets in source
found

Findings (23)

MEDIUMInventory / provenance · inv.binary · CWE-1104
scripts/Stackdeck.icns
Stackdeck.icns
Why it matters. a compiled or binary member cannot be reviewed from source
Fix. ship source, or explain the binary in the README
MEDIUMNetwork egress · net.raw_ip · CWE-200, CWE-319
bin/stackdeck.js:51
const BASE = `http://127.0.0.1:${PORT}`;
MEDIUMHard-coded secrets · secret.db_uri · CWE-798, CWE-321
test/db-isolation.test.js:106
rewriteDbUrl("postgres://user:pw@localhost:5432/app_dev", "sd_app_x"),
MEDIUMHard-coded secrets · secret.db_uri · CWE-798, CWE-321
test/db-isolation.test.js:111
const out = rewriteDbUrl("postgres://u:[email protected]:5433/app?sslmode=require&pool=5", "sd_app_x");
MEDIUMHard-coded secrets · secret.db_uri · CWE-798, CWE-321
test/db-isolation.test.js:128
const out = rewriteDbUrl("postgres://user:p%40ss%3Aword@localhost/app", "sd_x");
MEDIUMHard-coded secrets · secret.db_uri · CWE-798, CWE-321
test/db-isolation.test.js:151
const src = "postgres://u:p@localhost:5432/production_like";
MEDIUMFilesystem / path · mcp.destructive_tools · CWE-22, CWE-59
kill_pid, stop_service
Why it matters. 2 tool(s) can delete or overwrite
Fix. prefer a read-only mode or scoped tokens; the page states the blast radius
LOWInventory / provenance · inv.hidden_file · CWE-1104
docs/.nojekyll
.nojekyll
Why it matters. hidden member outside the usual dotfiles
Fix. review its purpose
LOWInsecure crypto · crypto.weak_hash · CWE-327, CWE-338
server.js:1312
const digest = crypto.createHash("sha1").update(`${svc}\u0000${branch}`).digest("hex").slice(0, 6);
LOWFilesystem / path · fs.traversal · CWE-22, CWE-59
test/sanitize.test.js:74
"../../etc/passwd",
LOWFilesystem / path · fs.traversal · CWE-22, CWE-59
test/sanitize.test.js:76
"a/../../b",
LOWFilesystem / path · fs.traversal · CWE-22, CWE-59
test/worktree-links.test.js:166
const r = linkHeavyDirs({ name: "s", linkDirs: ["../../etc", "..", "../escape-secret"] }, main, wt);
LOWNetwork egress · net.raw_ip · CWE-200, CWE-319
.github/workflows/ci.yml:78
if [ "$(curl -s -o /dev/null -w '%{http_code}' "http://127.0.0.1:$STACKDECK_PORT/api/ping")" = "200" ]; then
LOWNetwork egress · net.raw_ip · CWE-200, CWE-319
test/readiness.test.js:89
const r = await waitReadyFor({ readyWhen: { http: `http://127.0.0.1:${port}/health` }, alive: () => true }, 5000);
LOWNetwork egress · net.raw_ip · CWE-200, CWE-319
test/readiness.test.js:97
const r = await waitReadyFor({ readyWhen: { http: `http://127.0.0.1:${port}/` }, alive: () => true }, 8000);
LOWNetwork egress · net.raw_ip · CWE-200, CWE-319
test/readiness.test.js:109
res.writeHead(302, { Location: `http://127.0.0.1:${target.port}/` });
LOWSupply chain · supply.unpinned · CWE-829, CWE-1357
test/fixtures/projects/django/requirements.txt
django
Why it matters. 1 requirement(s) not pinned with ==
Fix. pin exact versions
INFOInventory / provenance · inv.oversize · CWE-1104
docs/demo.gif
docs/demo.gif
Why it matters. 4450781 bytes not read
INFOPrompt injection · prompt.credential_read · CWE-94, CWE-1427
CHANGELOG.md:45
- `isolateDb` never read the `.env` file, which is where essentially every
Why it matters. asks the agent to read credentials
INFOSupply chain · prompt.pipe_to_shell · CWE-829, CWE-1357
CHANGELOG.md:231
- A landing page, a `curl | sh` installer, and a Homebrew formula.
INFOSupply chain · prompt.pipe_to_shell · CWE-829, CWE-1357
README.md:24
curl -fsSL https://beingmechon.github.io/stackdeck/install.sh | sh  # no npm needed
INFOSupply chain · prompt.pipe_to_shell · CWE-829, CWE-1357
docs/index.html:284
<div class="cmd"><span class="prompt" aria-hidden="true">$</span><code>curl -fsSL https://beingmechon.github.io/stackdeck/install.sh | sh</code><button class="copy" type="button">Copy</button></div>
INFOSupply chain · prompt.pipe_to_shell · CWE-829, CWE-1357
docs/index.html:496
<pre><span class="f">$</span> curl -fsSL https://beingmechon.github.io/stackdeck/install.sh | sh</pre>

Gates applied: no_behavioural_pass.

Audited 2026-10-12 · audit v0.4.1 · source sha d9be53ae6184full audit observations/trust-audit/mcp-server/beingmechon__stackdeck.json · Report an issue / request a re-scan
05

Audit history

Every audit this server has had. A grade with a past is a grade somebody is still checking.

DateSourceVerdictGradeScoreChange
2026-10-12d9be53ae6184CAUTIONC73first audit
06

Questions

What is the stackdeck MCP server?

Your projects folder, as a control panel: start, stop, branch-switch and watch your local dev services. Zero dependencies, never talks to the internet.

What tools does stackdeck expose?

9 in total: 5 read-only, 2 that write, and 2 that can delete or overwrite (kill_pid, stop_service). Every one is listed on this page with its risk.

Is stackdeck safe to connect to an agent?

With care. The audit graded it C (73/100) and found 23 things worth knowing before you trust this server, listed below with the exact line each was found on. Separately from the audit: 2 of its tools can destroy data, so scope the token you give it to what you actually need.

What credentials does stackdeck need?

No credential environment variables were found in its source, so it appears to need none.

How current is this page?

The grade is for one exact copy of the source (d9be53ae6184), read on 2026-10-12. The repository is watched and re-audited when it changes.

Advertisement