coldpass

ansuman-shukla/whiteboard-mcp

GitHub ↗ · How this check works

Per-setup public labels: Linux / Haiku: Works · Linux / Luna: Works

Static status badge · SVG · read-only JSON. Embed with ![Coldpass status](https://coldpass.dev/badge/ansuman-shukla--whiteboard-mcp.svg).

mcp-server

Works

The recorded run passed on 2 setups.

Answers apply to each recorded setup, revision and operation. Earlier observations remain in Run details.

Tested on Linux
PlatformHaikuLuna
Linuxyesyes

Linux / Haiku 5.5: yes · Oct 28, 2026 · 244413822319 · claude-code / 2.1.310 (Claude Code)
Recorded operation: node <guest-path> mcp · local stdio MCP start + initialize + tools/list

Linux / Luna: yes · Oct 28, 2026 · 244413822319 · codex / codex-cli 0.164.0
Recorded operation: node dist/cli.js call canvas_open '{}'

Does what it says
1 of 1 claims checked out
  • Open the current chat's board: Real input produced the expected result: The board is empty.

    Source: One command install for every agent

    Input: {}

    Expected: The board is empty.

    Command: node dist/cli.js call canvas_open '{}'

    Observed: The board is empty.

MCP
No
Local or hosted
local
Local: runs on your machine
Needs keys or browser
None seen
Maintained
Maintained
actively maintained: last commit 0 days ago; 186 commits and 30 merged PRs in 90 days; 10 open issues, 2 open PRs; latest release 2026-10-27

Last commit Oct 27, 2026

Setup time
1 min 43 s
1 min 43 s to a working result
Issue
none found in recorded check
Examples
1 of 1 ran as expected
  • Open the current board with the documented CLI: command completed successfully

    Source: docs/clients.md, Agents without MCP

    Input: canvas_open

    Expected: board opened

    Command: node dist/cli.js call canvas_open

    Observed: This chat's board: this chat's board (untitled; name it with canvas_open {title}) [workspace-f5dacf]. Nobody is watching the board; the human can open http://127.0.0.1:47428/c/workspace-f5dacf/68ad315d1c9c07992e41d46c82f413339e16d78ef9abe60d466dd371974ef251/. The board is empty.

Evidence
README behavior checked
Agent interfaces
CLI
CLI

Observed interfaces were exercised by the checker. Documentation alone does not confirm compatibility.

Tested with
Codex / Luna
  • Linux: Codex / Luna · agent codex-cli 0.164.0 · Checked operation passed · Oct 28, 2026 on 244413822319

Each entry describes its recorded operation and source revision.

Safety
No unexpected network or file activity found in these checks

No problems traced to this repository code in these checks; a short run cannot prove safety. 24 listed items (named-host connections, static matches, dependency advisories) are below and do not change this verdict.

OSV reports a known vulnerability in this dependency version. 3 distinct locations. 12 findings.

Reviewed as expected for a test run: attempted writes that failed, so nothing was written.

Reviewed as expected for a test run: attempted writes that failed, so nothing was written; resolver address lookups that send no data.

Full event, path and process lists for each observed setup:

Run details

Haiku 5.5

Native agent · Checked operation passed

Checked operation node <guest-path> mcp · local stdio MCP start + initialize + tools/list

Agent-reported scope: Build the whiteboard-mcp server from the pinned source and drive its MCP stdio server to draw on a live canvas (canvas_draw returns 'Created: title'), plus the CLI 'call' subcommand and the documented npm test suite.

MCP server returned: whiteboard-mcp · version 0.3.1.

MCP tools returned: canvas_open, canvas_read, canvas_draw, canvas_delete, canvas_focus, canvas_screenshot, canvas_mermaid, canvas_export, canvas_save, canvas_search, canvas_guide. Tool listing does not establish authenticated tool-call success.

Run details
run
ansuman-shukla--whiteboard-mcp-claude-haiku-5-5-1793199739872747792
date
Oct 28, 2026
time to working
556.8s
product hosting / execution
Local stdio MCP server in the guest
recorded operation scope
product operation
model
claude-haiku-5-5
agent / version
claude-code / 2.1.310 (Claude Code)
platform
linux
reported cost
$0.017706
Recorded source
https://github.com/ansuman-shukla/whiteboard-mcp
Backend
hyperv
Tool transport
mcp-assigned-vm
Requested source pin (not an observed revision)
{"commit": "244413822319a65ef8eedc8d8534448a47b5e637", "url": "https://github.com/ansuman-shukla/whiteboard-mcp"}
Test version
readme-2d57868128a84902c09a58991c46c5fe288928e55b1de8282ab5003e13159c2f
revision
244413822319a65ef8eedc8d8534448a47b5e637
Whose fault: not assigned · resolved

Safety: Review signals: 12 known vulnerability.

Review signals: 12 known vulnerability.

Reviewed as expected for a test run: attempted writes that failed, so nothing was written; resolver address lookups that send no data.

OSV reports a known vulnerability in this dependency version. 3 distinct locations. 12 findings.

OSV scanned supported lockfiles; unpinned dependencies and unsupported formats are outside this check.

A short run cannot establish that code is safe.

Connections show IP addresses; proxies can hide the final hostname.

Tracing covers dispatched commands and their children, not the whole OS; guest root can interfere with tracing.

Full safety evidence →

Answers recorded for this run
  • Whiteboard MCP lets the coding agent draw diagrams on a live board beside the chat: Real input produced the expected result: Created: title

    Source: Your coding agent draws diagrams on a live board beside the chat, and sees what you draw back.

    Input: {"tool": "canvas_draw", "arguments": {"elements": [{"type": "text", "id": "title", "text": "Hello whiteboard"}]}}

    Expected: the tool reports the element was created

    Command: node <guest-path> mcp tools/call {"tool": "canvas_draw", "arguments": {"elements": [{"type": "text", "id": "title", "text": "Hello whiteboard"}]}}

    Observed: …Created: title\nCanvas: 1 element · bounds (0,0)–(186,25) · showing 1\ntext \"title\" \"Hello whiteboard\" (0,0)\ncould not open (spawn xdg-open ENOENT), so the human can't see the board yet; ask them to open http://127.0.0.1:47428/c/workspace-f807a4/21a94cc71be9bb3ff08775c569ac64da18cc477bc4e4f65f54f8efc926984595/."}]}

Examples

  • The CLI runs a tool once: whiteboard-mcp call <tool> [json] draws an element on the board: command completed successfully

    Source: docs/configuration.md

    Input: canvas_draw with one text element id note

    Expected: the tool reports the element was created

    Command: node <guest-path> call canvas_draw '{"elements":[{"type":"text","id":"note","text":"CLI note"}]}'

    Observed: Updated: note Canvas: 1 element · bounds (0,0)–(93,25) · showing 1 text "note" "CLI note" (0,0) could not open (spawn xdg-open ENOENT), so the human can't see the board yet; ask them to open http://127.0.0.1:47428/c/workspace-6faa26/21a94cc71be9bb3ff08775c569ac64da18cc477bc4e4f65f54f8efc926984595/.

  • npm test runs the unit and integration suite (CONTRIBUTING.md Development section): command completed successfully

    Source: CONTRIBUTING.md

    Input: none

    Expected: all tests pass

    Command: npm test

    Observed: ests) 4ms ✓ tests/unit/registry.test.ts (4 tests) 4ms ↓ tests/vscode/vscode.test.ts (1 test | 1 skipped)  Test Files  19 passed | 1 skipped (20)  Tests  298 passed | 1 skipped (299)  Start at  15:11:08  Duration  57.19s (transform 1.14s, setup 0ms, import 2.83s, tests 42.39s, environment 1ms)

Local or hosted: local

What the agent did

Build the whiteboard-mcp server from the pinned source and drive its MCP stdio server to draw on a live canvas (canvas_draw returns 'Created: title'), plus the CLI 'call' subcommand and the documented npm test suite.

cd <guest-path> && ls -la && cat README.md | head -c 6000 && python3 --version
cd <guest-path> && which node npm; node --version; npm --version; grep -n '"engines"' -A3 package.json; grep -n '"bin"' -A3 package.json; sed -n 1,80p package.json | head -c 3000; ls .coldpass; cat CONTRIBUTING.md
cd <guest-path> && PLAYWRIGHT_SKIP_BROWSER_DOWNLOAD=1 NODE_USE_ENV_PROXY=1 npm ci --no-audit --no-fund 2>&1 | tail -n 15; echo EXIT=$?
cd <guest-path> && npm run build 2>&1 | tail -n 15; echo EXIT=${PIPESTATUS[0]}; ls dist | head; ls -la dist/cli.js 2>&1
cd <guest-path> && head -c 3500 docs/tools.md; echo ----; node dist/cli.js --help 2>&1 | head -n 40
cd /tmp && timeout 120 node <guest-path> call canvas_guide '{}' 2>&1 | head -c 1500; echo; echo EXIT=${PIPESTATUS[0]}
cd /tmp && CLI=<guest-path>; timeout 120 node $CLI call canvas_draw '{"elements":[{"type":"rectangle","id":"api","label":"Checkout API"}]}' 2>&1 | head -c 1200; echo; echo EXIT=${PIPESTATUS[0]}; timeout 120 node $CLI call canvas_read '{}' 2>&1 | head -c 1200; echo; echo EXIT2=${PIPESTATUS[0]}
cd /tmp && CLI=<guest-path>; timeout 120 node $CLI call canvas_draw '{"elements":[{"type":"text","id":"title","text":"Hello whiteboard"}]}' 2>&1 | head -c 800; echo; echo EXIT=${PIPESTATUS[0]}; ls <guest-path>; grep -n "Your coding agent draws" <guest-path>
cd <guest-path> && cat > .coldpass/probe.json <<'EOF'
{"kind":"mcp","argv":["node","<guest-path>","mcp"],"cwd":"<guest-path>","tool":"canvas_draw","arguments":{"elements":[{"type":"text","id":"title","text":"Hello whiteboard"}]},"expected_text":"Created: title"}
EOF
cat > .coldpass/claims.json <<'EOF'
[{"kind":"claim","claim":"Whiteboard MCP lets the coding agent draw diagrams on a live board beside the chat","source":"Your coding agent draws diagrams on a live board beside the chat, and sees what you draw back.","input":"canvas_draw with one text element titled title","expected":"the tool reports the element was created","probe_kind":"mcp","argv":["node","<guest-path>","mcp"],"tool":"canvas_draw","arguments":{"elements":[{"type":"text","id":"title","text":"Hello whiteboard"}]},"expected_text":"Created: title","cwd":"<guest-path>"}]
EOF
python3 -m json.tool .coldpass/probe.json >/dev/null && python3 -m json.tool .coldpass/claims.json >/dev/null && echo OK; ls <guest-path> 2>&1; ls /inputs 2>&1
cd <guest-path> && <env-var>=<guest-path> timeout 600 python3 -I <guest-path> --validate --replay 2>&1 | tail -c 4000; echo EXIT=${PIPESTATUS[0]}
cd <guest-path> && timeout 900 npx vitest run 2>&1 | tail -n 12; echo EXIT=${PIPESTATUS[0]}; grep -rniE "cron|setInterval|--once|--now|schedule" src --include=*.ts | head -n 10
cd <guest-path> && timeout 900 npx vitest run --reporter=verbose 2>&1 | sed 's/\x1b\[[0-9;]*m//g' | grep -E "FAIL|AssertionError|Expected|Received|✗|×" | head -n 20
cd <guest-path> && grep -n "exports inside the workspace" -A30 tests/integration/mcp.test.ts | head -n 45
cd /tmp && CLI=<guest-path>; echo "HOME=$HOME"; timeout 120 node $CLI call canvas_export "{\"path\":\"$HOME/.exl-manual-check.excalidraw\"}" 2>&1 | head -c 600; echo; echo EXIT=${PIPESTATUS[0]}; ls -la $HOME/.exl-manual-check.excalidraw 2>&1; grep -rn "Refusing" <guest-path> | head -n 5
rm -f <guest-path>; ls -d <host-path> 2>/dev/null; getent passwd ubuntu | cut -d: -f6; cd <guest-path> && H=$(getent passwd ubuntu | cut -d: -f6); echo USE=$H; HOME=$H timeout 900 npx vitest run 2>&1 | sed 's/\x1b\[[0-9;]*m//g' | grep -E "Test Files|Tests  |FAIL" | head -n 8; echo EXIT=${PIPESTATUS[0]}
cd <guest-path> && sed -n 760,780p src/canvas/daemon.ts; grep -n -i "idle" docs/configuration.md | head -n 5
cd <guest-path> && grep -rln "run a tool once" --include=*.ts --include=*.md . 2>/dev/null | grep -v node_modules | grep -v dist | head -n 5; grep -rn "whiteboard-mcp call" docs README.md 2>/dev/null | head -n 3
cd <guest-path> && cat > .coldpass/examples.json <<'EOF'
[{"kind":"example","claim":"The CLI runs a tool once: whiteboard-mcp call <tool> [json] draws an element on the board","source":"docs/configuration.md","input":"canvas_draw with one text element id note","expected":"the tool reports the element was created","argv":["node","<guest-path>","call","canvas_draw","{\"elements\":[{\"type\":\"text\",\"id\":\"note\",\"text\":\"CLI note\"}]}"],"cwd":"<guest-path>","env":{},"expected_text":"Created: note"},{"kind":"example","claim":"npm test runs the unit and integration suite (CONTRIBUTING.md Development section)","source":"CONTRIBUTING.md","input":"none","expected":"all tests pass","argv":["npm","test"],"cwd":"<guest-path>","env":{"HOME":"<host-path>"},"expected_text":"298 passed"}]
EOF
cat > .coldpass/cycles.json <<'EOF'
{"detected":false,"checks":[],"reason":"Inspected README.md, docs/configuration.md, src/cli.ts and src/canvas/daemon.ts. The only interval (daemon.ts every(heartbeatMs, ...)) is an internal viewer-liveness heartbeat, not a user-facing cron, loop, webhook, --once or --now trigger, so no manual cycle was run."}
EOF
python3 -m json.tool .coldpass/examples.json >/dev/null && python3 -m json.tool .coldpass/cycles.json >/dev/null && echo OK
cd <guest-path> && <env-var>=<guest-path> timeout 900 python3 -I <guest-path> --validate --replay > <guest-path> 2><guest-path>; echo EXIT=$?; python3 -c "
import json
d=json.load(open('<guest-path>'))
print('valid', d.get('valid'), 'problems', d.get('problems'))
r=d.get('replay',{})
print('replay', r.get('status'))
det=r.get('details',{})
print(list(det.keys()))
" 2>&1 | head -c 2000; tail -c 600 <guest-path>
cd <guest-path> && python3 -c "
import json
d=json.load(open('<guest-path>'))
print(list(d.keys()))
for k,v in d.items():
    if k in ('valid','problems'): continue
    s=json.dumps(v)
    print(k, s[:700])
    print()
" | head -c 5000
cd <guest-path> && cat > .coldpass/report.json <<'EOF'
{"outcome":"working","fault_owner":null,"operation":"Build the whiteboard-mcp server from the pinned source and drive its MCP stdio server to draw on a live canvas (canvas_draw returns 'Created: title'), plus the CLI 'call' subcommand and the documented npm test suite.","operation_scope":"Linux guest, Node v22.23.4 (README/package.json require >=20), npm 10.9.9, Python 3.12.3 (checker). Local build of the pinned commit (dist/cli.js) rather than the published npx package. No browser was required; the Playwright browser download was skipped. Local daemon bound to 127.0.0.1 only.","steps":["npm ci (package.json devDependencies; PLAYWRIGHT_SKIP_BROWSER_DOWNLOAD=1 NODE_USE_ENV_PROXY=1)","npm run build (vite frontend + tsc server; CONTRIBUTING.md 'npm run build')","node dist/cli.js call canvas_guide '{}' (CLI 'call' subcommand, docs/configuration.md)","node dist/cli.js call canvas_draw with a rectangle, then canvas_read (round trip)","node dist/cli.js mcp tools/call canvas_draw with a text element (MCP probe and README claim)","npm test (CONTRIBUTING.md Development section)"],"deviations":["Used the locally built dist/cli.js (the pinned source) instead of 'npx -y @ansuman-shukla/whiteboard-mcp' from the README, so the tested code is exactly the pinned commit.","The README's npm test suite failed once on first run (tests/integration/mcp.test.ts 'exports inside the workspace and refuses paths outside the allowed roots'). Cause: the guest HOME is <guest-path>, which lies under the OS temp dir; the product's documented export rule allows the temp dir, so the export was accepted instead of refused. Rerun with HOME=<host-path> (outside /tmp) passed 298 tests with 1 skipped. This is a guest-environment issue, not a product defect, and the example records the HOME override in its env.","The /inputs/coldpass-preflight.py path named in the task does not exist; validation was run with <guest-path> as instructed.","No cron/loop/webhook/--once/--now product cycle was found; cycles.json has detected=false."],"stuck_step":null,"main_blocker":null,"plain_failure":null,"suggested_fix":"None required for the working path. Optionally make the export-refusal integration test independent of HOME location (for example by setting HOME outside os.tmpdir() in the test), so that npm test passes in guests where the home directory is under /tmp."}
EOF
python3 -m json.tool .coldpass/report.json >/dev/null && echo REPORT_OK; ls -la .coldpass; <env-var>=<guest-path> timeout 900 python3 -I <guest-path> --validate --replay 2>&1 | head -c 300
Earlier attempts (1)

Luna

Native agent · Checked operation passed

Checked operation node dist/cli.js call canvas_open '{}'

Agent-reported scope: Open and inspect a Whiteboard MCP canvas through its documented CLI

Run details
run
ansuman-shukla--whiteboard-mcp-gpt-6-luna-1793200868847247179
date
Oct 28, 2026
time to working
103.4s
product hosting / execution
Local command in the guest
recorded operation scope
product operation
model
gpt-6-luna
agent / version
codex / codex-cli 0.164.0
platform
linux
reported cost
not reported (not assumed free)
Recorded source
https://github.com/ansuman-shukla/whiteboard-mcp
Backend
hyperv
Tool transport
mcp-assigned-vm
Requested source pin (not an observed revision)
{"commit": "244413822319a65ef8eedc8d8534448a47b5e637", "url": "https://github.com/ansuman-shukla/whiteboard-mcp"}
Test version
readme-604d73685be33b2939b2632791fb1de37972f659febb28a139c60d6e81057c18
revision
244413822319a65ef8eedc8d8534448a47b5e637
Whose fault: not assigned · resolved

Safety: Review signals: 12 known vulnerability.

Review signals: 12 known vulnerability.

Reviewed as expected for a test run: attempted writes that failed, so nothing was written.

OSV reports a known vulnerability in this dependency version. 3 distinct locations. 12 findings.

OSV scanned supported lockfiles; unpinned dependencies and unsupported formats are outside this check.

A short run cannot establish that code is safe.

Connections show IP addresses; proxies can hide the final hostname.

Tracing covers dispatched commands and their children, not the whole OS; guest root can interfere with tracing.

Full safety evidence →

Answers recorded for this run
  • Open the current chat's board: Real input produced the expected result: The board is empty.

    Source: One command install for every agent

    Input: {}

    Expected: The board is empty.

    Command: node dist/cli.js call canvas_open '{}'

    Observed: The board is empty.

Examples

  • Open the current board with the documented CLI: command completed successfully

    Source: docs/clients.md, Agents without MCP

    Input: canvas_open

    Expected: board opened

    Command: node dist/cli.js call canvas_open

    Observed: This chat's board: this chat's board (untitled; name it with canvas_open {title}) [workspace-f5dacf]. Nobody is watching the board; the human can open http://127.0.0.1:47428/c/workspace-f5dacf/68ad315d1c9c07992e41d46c82f413339e16d78ef9abe60d466dd371974ef251/. The board is empty.

Local or hosted: local

What the agent did

Open and inspect a Whiteboard MCP canvas through its documented CLI

pwd; rg --files -g 'README*' -g 'pyproject.toml' -g 'package.json' -g 'requirements*' -g 'Dockerfile' | head -80; git status --short; python3 --version; sed -n '1,240p' README.md
ls -la; cat package.json; node --version; npm --version; sed -n '1,220p' docs/tools.md
cd <guest-path> && npm ci && npm run build
cd <guest-path> && sed -n '1,220p' docs/clients.md; sed -n '1,180p' src/cli.ts
cd <guest-path> && WHITEBOARD_OPEN=none node dist/cli.js call canvas_open '{}'
cd <guest-path> && mkdir -p .coldpass && cat > .coldpass/probe.json <<'EOF'
{"kind":"cli","argv":["node","dist/cli.js","call","canvas_open","{}"],"cwd":"<guest-path>","env":{"WHITEBOARD_OPEN":"none"},"expected_text":"The board is empty."}
EOF
cat > .coldpass/claims.json <<'EOF'
[{"kind":"claim","claim":"Open the current chat's board","source":"| `canvas_open` | Show this chat's board, give it a title, open another chat's board (this project first, then any folder), or load a saved copy |","input":"{}","expected":"The board is empty.","probe_kind":"cli","argv":["node","dist/cli.js","call","canvas_open","{}"],"expected_text":"The board is empty.","cwd":"<guest-path>","env":{"WHITEBOARD_OPEN":"none"}}]
EOF
cat > .coldpass/examples.json <<'EOF'
[{"kind":"example","claim":"Open the current board with the documented CLI","source":"docs/clients.md, Agents without MCP","input":"canvas_open","expected":"board opened","argv":["node","dist/cli.js","call","canvas_open"],"cwd":"<guest-path>","env":{"WHITEBOARD_OPEN":"none"},"expected_text":"The board is empty."}]
EOF
cat > .coldpass/cycles.json <<'EOF'
{"detected":false,"checks":[],"reason":"Inspected README.md, docs/clients.md and package entrypoints; no scheduled cycle, cron, loop, webhook, or --once trigger is documented."}
EOF

cd <guest-path> && <env-var>=<guest-path> python3 -I <guest-path> --validate --replay
cd <guest-path> && python3 - <<'PY'
import json
p='.coldpass/claims.json'; a=json.load(open(p)); a[0]['source']='One command install for every agent'; open(p,'w').write(json.dumps(a,indent=2))
PY

cd <guest-path> && <env-var>=<guest-path> python3 -I <guest-path> --validate --replay
cd <guest-path> && cat > .coldpass/report.json <<'EOF'
{"outcome":"working","fault_owner":null,"operation":"Open and inspect a Whiteboard MCP canvas through its documented CLI","operation_scope":"Local Node.js 20+ CLI with built server/frontend assets","steps":["Checked Python 3.12.3 and Node v22.23.4 against repository requirements","Installed dependencies with npm ci","Built frontend, server, and VS Code package with npm run build","Ran node dist/cli.js call canvas_open '{}' with WHITEBOARD_OPEN=none","Validated and replayed probe, README claim, example, and cycle record successfully"],"deviations":["Used the documented local-build CLI entrypoint because no supported desktop agent CLI was part of the guest environment"],"stuck_step":null,"main_blocker":null,"plain_failure":null,"suggested_fix":null}
EOF