sysdesign-board
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@sysdesign-board Start a system design interview with me on my sketch board."
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
sketch/design — the system design interview board
A hand-drawn whiteboard for system design mock interviews, plus an MCP server that turns Claude or ChatGPT into your interviewer. It sees your board, listens to you, talks back, pins questions on your components, and ends with scored feedback.

Pencil-style canvas: a paper or chalkboard theme, with shapes that look drawn by hand (rough.js + perfect-freehand)
27 system design components: load balancer, API gateway, CDN, cache, SQL and NoSQL databases, object store, queue, Kafka-style stream, pub/sub, workers, serverless functions, auth, monitoring, ML and more
Arrows that stay attached to components, with labels, curved or elbow routes, and dashed lines for async flows. Hover a component and drag its blue dot to connect it.
Interview panel: the problem, a timer, a phase tracker, chat, voice in (speech-to-text) and voice out (the interviewer's replies are read aloud)
The interviewer can read your diagram as structured data, look at a picture of it, pin comments on components, highlight things, sketch reference designs, and grade you at the end
Runs entirely on your machine. The AI runs in your own Claude or ChatGPT app, on your existing subscription, with no API keys.
Install
Requires Node.js 18+.
Your AI app | How to connect | Billed to |
Claude Desktop | Double-click | Claude Pro / Max |
Claude Code |
| Claude Pro / Max |
Codex CLI | Add it to | ChatGPT Plus / Pro |
ChatGPT (desktop / web) | Developer Mode connector through a tunnel (below) | ChatGPT Plus / Pro |
Cursor, Windsurf, VS Code, others | The standard MCP JSON (below) | Your plan there |
The .mcpb one-click file is Claude Desktop only. Every other app runs the same npm package.
Claude Desktop
Option A: one-click. Download the .mcpb file from Releases and double-click it. Claude Desktop shows an install dialog.
Option B: command line. First quit Claude Desktop completely (macOS: ⌘Q; Windows: tray icon → Quit). Claude rewrites its config file from memory when it quits, which would drop the new entry. Then run:
npx -y sysdesign-board installReopen Claude Desktop.
Option C: edit the config yourself (again, with Claude Desktop quit). The file is at:
macOS:
~/Library/Application Support/Claude/claude_desktop_config.jsonWindows:
%APPDATA%\Claude\claude_desktop_config.jsonLinux (unofficial builds):
~/.config/Claude/claude_desktop_config.json
{
"mcpServers": {
"sysdesign-board": { "command": "npx", "args": ["-y", "sysdesign-board"] }
}
}On Windows, use "command": "cmd", "args": ["/c", "npx", "-y", "sysdesign-board"]. If Claude can't find npx (common with nvm, Volta or asdf), use the absolute path from which npx (macOS/Linux) or where npx (Windows).
Claude Code
Either add the server directly:
claude mcp add sysdesign-board -- npx -y sysdesign-boardOr install the plugin, which also adds an interview skill, from this repo's marketplace. Run these inside Claude Code:
/plugin marketplace add tGhattas/sysdesign-board
/plugin install sysdesign-board@sysdesign-boardCodex CLI
Add this to ~/.codex/config.toml (Windows: %USERPROFILE%\.codex\config.toml):
[mcp_servers.sysdesign-board]
command = "npx"
args = ["-y", "sysdesign-board"]
tool_timeout_sec = 120ChatGPT app
ChatGPT connects to MCP servers over public HTTPS, so you run the board locally and expose only its /mcp endpoint through a tunnel. The board itself, its API and its WebSocket refuse any request that doesn't come from localhost.
Start the board, and keep this running:
npx -y sysdesign-board serveIn another terminal, open a tunnel (here with cloudflared):
cloudflared tunnel --url http://localhost:4321Get your private connector token:
npx -y sysdesign-board tokenIn ChatGPT, go to Settings → Apps & Connectors → Advanced, enable Developer Mode, then Create a connector with the URL
https://<your-tunnel>.trycloudflare.com/mcp?token=<token>and no authentication.
Treat that URL like a password. To change the token, delete ~/.sysdesign-board/token, or set SYSDESIGN_TOKEN yourself.
Any other MCP client
{ "command": "npx", "args": ["-y", "sysdesign-board"] }Related MCP server: Excalidraw Architect MCP
Use it
Start a new chat and say:
Start a system design interview with me on my sketch board.
Or use the interview prompt from your app's prompt or slash menu. The board opens at http://localhost:4321.
Draw your design. Talk with the 🎤 mic (your message is sent when you pause) or type in the panel.
The interviewer keeps listening between replies. It is woken by what you say, and when you stop drawing for a few seconds.
Click I'm done when you're finished to get a feedback card with scores.
The board also works without any AI: run npx -y sysdesign-board serve and open http://localhost:4321.
Tools the interviewer gets
Tool | What it does |
| Sets the problem, level and duration, opens the board, and speaks the opening line |
| Waits for your speech or messages, or for board changes once you stop drawing |
| Sends a chat message, read aloud |
| Structured diagram: components, connections (with labels; dashed means async), zones, notes, and what changed |
| A PNG of the whole board (for handwriting and sketches) |
| Pin or remove "INTERVIEWER" comment bubbles on components |
| Makes components glow, optionally zooming to them |
| Adds components, connections, notes and zones in the same sketchy style |
| Requirements → Estimation → API & Data → High-level → Deep dive → Wrap-up |
| Feedback card with 1–5 scores, strengths and improvements |
| Housekeeping |
Voice
Speech-to-text uses the browser's Web Speech API. Use Chrome, Edge or Safari; Firefox doesn't support it.
Text-to-speech uses your system voices. Toggle it with "Voice replies" in the panel. The mic pauses while the interviewer speaks, so it doesn't transcribe itself.
The native voice modes inside the ChatGPT and Claude apps can't be piped into another page. Those voice models are only available through paid APIs.
Keyboard
V select · H hand / hold Space · R rect · D diamond · O ellipse · A arrow · L line · P pen · T text · N sticky note · F zone · E eraser · K laser · C components · I interview panel · Q tool lock · G grid snap · ⌘/Ctrl Z undo · ⌘/Ctrl D duplicate · ⇧1 fit · ? all shortcuts
Privacy Policy
The full policy is in PRIVACY.md. In short:
What it handles: your board, the interview chat and voice transcripts, your settings, and a local access token.
Where it's stored: only on your machine, in the browser's local storage for the board page and in
~/.sysdesign-board/. The author runs no server, and there are no accounts, analytics or telemetry.What leaves your computer:
When the AI interviewer calls a tool, the AI app you connected receives the board description, a picture of the board, your messages and your transcripts, under that provider's privacy policy.
The mic uses your browser's speech recognition. Chrome sends the audio to Google; Safari uses Apple's speech service.
npxdownloads the package from npm.With the optional tunnel,
/mcprequests pass through the tunnel provider.
Security:
The board, its API and its WebSocket only answer
localhostrequests fromlocalhostpages. Other websites and tunnels are refused, which also blocks DNS-rebinding attacks.The HTTP endpoint (
/mcp) always requires the token.
Sharing and retention: nothing is sold or shared. Data stays until you clear the board or delete
~/.sysdesign-board/.Contact: open an issue.
Troubleshooting
The server doesn't appear in Claude Desktop. Claude was probably running when the config was edited and saved over it. Quit it fully, run
npx -y sysdesign-board install, then reopen."npx: command not found" in Claude's logs. Use an absolute path to
npx(see Option C), or runnpx -y sysdesign-board install, which writes absolute paths for you.Port 4321 is taken. Set
SYSDESIGN_PORT(or--port=5000). In the.mcpbextension it's a setting.The mic does nothing. Open the board in Chrome, Edge or Safari and allow microphone access.
Several apps connected at once? That's fine. The first one hosts the board and the others share it.
CLI
sysdesign-board MCP server over stdio (what AI apps launch)
sysdesign-board serve Board + HTTP MCP endpoint only
sysdesign-board install Add to Claude Desktop (quit it first) [--npx | --local]
sysdesign-board token Print the HTTP MCP token / URLDevelopment
git clone <this repo> && cd sysdesign-board
npm install
npm run devnpm run dev starts the hub on :4321 with reload, and Vite on :5173. Other scripts:
Command | What it does |
| Builds the board UI and bundles the server into one file |
| Packs |
| Type-checks the web and server code |
| Drives every MCP tool against a running board |
| Refreshes the Claude plugin's |
Releasing a new version:
Run
npm version <x.y.z> --no-git-tag-version. This also updatesserver.jsonand the plugin's version and pinned dependency.Run
npm publish.Run
npm run lock:plugin. The lockfile needs the published package's checksum, so this comes after publishing.Commit, then tag and push.
Make a GitHub release with
npm run build:mcpb.Run
mcp-publisher publishfor the MCP Registry.
The code lives in three folders:
web/: the board (React UI plus the canvas engine inweb/src/engine.ts; renderer and component glyphs inweb/src/render/)server/: the hub (HTTP, WebSocket and persistence), the MCP tools and the CLIshared/: the data model, component catalog and geometry
License
Available Tools
13 toolsannotatePin a comment on the boardA
Pin an interviewer comment bubble on the board, pointing at a component (by id or label) or at a position. Great for "what if this fails?" style probes.
Inputs: text (required), x, y, target.
clear_annotationsRemove interviewer commentsBDestructiveIdempotent
Remove your pinned comments (all, or specific ids).
Inputs: ids.
draw_on_boardDraw on the boardB
Add components, connections, sticky notes and zones in the same sketchy style (marked as drawn by the interviewer). Use sparingly — the candidate should drive. Component kinds: user (User), browser (Web App), mobile (Mobile App), dns (DNS), cdn (CDN), lb (Load Balancer), gateway (API Gateway), firewall (Rate Limiter), server (App Server), service (Service), worker (Worker), lambda (Function), cron (Scheduler), sql (SQL DB), nosql (NoSQL DB), cache (Cache), storage (Object Store), search (Search Index), warehouse (Data Warehouse), queue (Queue), stream (Event Stream), pubsub (Pub/Sub), notify (Notifications), auth (Auth), monitor (Monitoring), ml (ML Model), external (External API). Connections reference a component by its ref/label (new or existing) or id. Positions are optional (auto-laid out to the right of existing content).
Inputs: notes, zones, components, connections.
end_interviewEnd the interview with feedbackB
Close the session and show a feedback card on the board. Scores are 1-5.
Inputs: scores (required), summary (required), strengths (required), improvements (required), +1 more.
get_boardRead the boardARead-only
Structured description of the board: components (type, label, id, position, zone), connections (from -> to, label, dashed=async), zones, notes and text, freehand strokes, plus what changed since you last looked.
Inputs: include_json.
get_board_imageLook at the boardARead-only
A PNG picture of the whole board as the candidate sees it (handwriting, sketches, layout). Use when get_board mentions freehand strokes or you need visual context.
Inputs: no named parameters.
get_transcriptConversation transcriptARead-only
Full chat/voice transcript of the current session.
Inputs: no named parameters.
highlightPoint at componentsAIdempotent
Make components glow on the candidate’s board (e.g. while asking about them). Optionally scroll/zoom their view to them.
Inputs: targets (required), focus, seconds.
open_boardOpen the boardAIdempotent
Open the sketch board in the user’s browser and return its URL.
Inputs: no named parameters.
saySpeak to the candidateA
Send a message to the candidate. It appears in the board chat and is read aloud. Keep it short and conversational (no markdown).
Inputs: text (required), speak.
set_phaseMove to an interview phaseAIdempotent
Update the phase tracker the candidate sees: requirements (Requirements), estimation (Estimation), api (API & Data), high-level (High-level), deep-dive (Deep dive), wrap-up (Wrap-up).
Inputs: phase (required).
start_interviewStart a system design interviewADestructive
Start a new interview session on the board: sets the problem statement, timer and phase, opens the board, and posts your opening message (spoken aloud to the candidate).
Inputs: title (required), problem (required), level, clear_board, +2 more.
wait_for_candidateListen to the candidateARead-only
Block until the candidate says something (typed or by voice), the board changes and then settles, or the timeout passes. Returns what they said, what changed on the board, and interview timing. Call this in a loop between your replies.
Inputs: timeout_seconds.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
Loading tool schema changelog…
TDQS
Scored across 13 tools
Most tools map to clearly distinct actions: say (chat), annotate (pinned comment), highlight (glow), draw_on_board (add shapes), get_board (structured data), and get_board_image (visual) are well separated by their descriptions. Minor overlap exists between open_board and start_interview (which also opens the board), and between the two board-reading tools, but the descriptions resolve these.
The dominant pattern is snake_case verb_noun (open_board, start_interview, get_board_image, clear_annotations, set_phase, end_interview, get_transcript), which is predictable. The bare-verb exceptions (say, annotate, highlight) are simple single-target actions and remain readable, so the deviation is minor.
13 tools sits comfortably in the well-scoped range, and each one covers a distinct facet of a live interview session (conversation, observation, intervention, lifecycle). No tool looks redundant or like filler.
The lifecycle is well covered: start_interview, the wait_for_candidate loop, say, board inspection, annotation, phase tracking, end_interview, and get_transcript. Gaps are minor but real: there is no way to undo or delete interviewer-drawn components (only clear_annotations for pinned comments) and no explicit pause/reset of the timer or session state.
Maintenance
Related MCP Connectors
Turn calls and notes into process flow diagrams in Claude, ChatGPT, VS Code, Cursor, and Teams.
Record your pitch in Claude or ChatGPT and get instant feedback on your delivery.
AI interview practice and career preparation with user-controlled guidance.
Bot-free macOS Zoom/Meet/Teams call transcripts, Apple Vision screen OCR, and live SQLite MCP.
1
Related MCP Servers
- AlicenseAqualityDmaintenanceA technical interviewer that ingests GitHub repos, teaches you your own code, and conducts mock interviews with persistent memory of your weak spots.849 npm1MIT
- FlicenseNot gradedqualityAmaintenanceEnables AI coding assistants to turn architecture and engineering concepts into auto-laid-out, hand-drawn Excalidraw diagrams across 25 types, with natural-language revision and SVG/PNG export. Optionally persists systems as a queryable, version-controlled architecture knowledge graph while running fully offline without API keys.-
- FlicenseNot gradedqualityAmaintenanceEnables AI assistants to turn natural-language descriptions of systems, flows, and data into 25 types of hand-drawn Excalidraw diagrams with automatic layout and architecture-aware styling, then revise them conversationally and export to SVG or PNG. It can also persist a system as a version-controlled, queryable architecture knowledge graph, running fully offline without API keys.-
- FlicenseNot gradedqualityAmaintenanceEnables AI coding assistants to turn architectural and conceptual descriptions into fully laid-out, hand-drawn Excalidraw diagrams across 25 diagram types, with automatic technology-aware styling, natural-language revisions, and SVG/PNG export. It can also persist systems as a queryable, version-controlled architecture knowledge graph while running entirely offline without API keys.-