Spec Driven Development
MCP Server that facilitates spec-driven development workflows, not just Vibe Coding.
Description from the maker (original English)
Shared SSH PTY runtime for MCP clients with viewer, input lock, async tracking, and policy rules.
These three are never merged into one score: opinions, measurements and popularity are different things.
We have not written a plain-language summary for this one yet. Below are the facts we read from the registry.
Pick the AI app you use, then copy the settings.
SSH_MCP_CONFIG, SSH_MCP_INSTANCE, VIEWER_PORT, VIEWER_HOST, AUTO_OPEN_TERMINAL, SSH_MCP_MODE, SSH_MCP_LOCAL, SSH_MCP_DEBUG, SSH_HOST, SSH_PORT, SSH_USER, SSH_PASSWORD, SSH_KEYValues marked secret are keys to your account. Never share them or paste them into a chat.
You need
Which app do you use?
Pick your app above. We remember it, so next time the button says “Install in …”.
Open Claude Desktop → Settings → Developer → Edit Config, and paste this into claude_desktop_config.json
{
"mcpServers": {
"ssh-session": {
"command": "npx",
"args": [
"-y",
"ssh-session-mcp"
],
"env": {
"SSH_MCP_CONFIG": "your-value",
"SSH_MCP_INSTANCE": "your-value",
"VIEWER_PORT": "your-value",
"VIEWER_HOST": "your-value",
"AUTO_OPEN_TERMINAL": "your-value",
"SSH_MCP_MODE": "your-value",
"SSH_MCP_LOCAL": "your-value",
"SSH_MCP_DEBUG": "your-value",
"SSH_HOST": "your-value",
"SSH_PORT": "your-value",
"SSH_USER": "your-value",
"SSH_PASSWORD": "your-value",
"SSH_KEY": "your-value"
}
}
}
}Run this in your terminal
claude mcp add ssh-session --env SSH_MCP_CONFIG=your-value --env SSH_MCP_INSTANCE=your-value --env VIEWER_PORT=your-value --env VIEWER_HOST=your-value --env AUTO_OPEN_TERMINAL=your-value --env SSH_MCP_MODE=your-value --env SSH_MCP_LOCAL=your-value --env SSH_MCP_DEBUG=your-value --env SSH_HOST=your-value --env SSH_PORT=your-value --env SSH_USER=your-value --env SSH_PASSWORD=your-value --env SSH_KEY=your-value -- npx -y ssh-session-mcpFill in the empty values before running it.
Paste into .cursor/mcp.json in your project, or ~/.cursor/mcp.json
{
"mcpServers": {
"ssh-session": {
"command": "npx",
"args": [
"-y",
"ssh-session-mcp"
],
"env": {
"SSH_MCP_CONFIG": "your-value",
"SSH_MCP_INSTANCE": "your-value",
"VIEWER_PORT": "your-value",
"VIEWER_HOST": "your-value",
"AUTO_OPEN_TERMINAL": "your-value",
"SSH_MCP_MODE": "your-value",
"SSH_MCP_LOCAL": "your-value",
"SSH_MCP_DEBUG": "your-value",
"SSH_HOST": "your-value",
"SSH_PORT": "your-value",
"SSH_USER": "your-value",
"SSH_PASSWORD": "your-value",
"SSH_KEY": "your-value"
}
}
}
}Your browser asks to open the app, then the app shows the settings and asks you to confirm. Key values are left empty for you to fill in.
Paste into .vscode/mcp.json in your project
{
"servers": {
"ssh-session": {
"type": "stdio",
"command": "npx",
"args": [
"-y",
"ssh-session-mcp"
],
"env": {
"SSH_MCP_CONFIG": "your-value",
"SSH_MCP_INSTANCE": "your-value",
"VIEWER_PORT": "your-value",
"VIEWER_HOST": "your-value",
"AUTO_OPEN_TERMINAL": "your-value",
"SSH_MCP_MODE": "your-value",
"SSH_MCP_LOCAL": "your-value",
"SSH_MCP_DEBUG": "your-value",
"SSH_HOST": "your-value",
"SSH_PORT": "your-value",
"SSH_USER": "your-value",
"SSH_PASSWORD": "your-value",
"SSH_KEY": "your-value"
}
}
}
}Your browser asks to open the app, then the app shows the settings and asks you to confirm. Key values are left empty for you to fill in.
This one runs on your computer, and ChatGPT can only connect to servers on the internet. Pick another app.
Your choice stays on this device in a cookie; no account needed.
SSH_MCP_CONFIG envSSH_MCP_INSTANCE envVIEWER_PORT envVIEWER_HOST envAUTO_OPEN_TERMINAL envSSH_MCP_MODE envSSH_MCP_LOCAL envSSH_MCP_DEBUG envSSH_HOST envSSH_PORT envSSH_USER envSSH_KEY envThese settings are generated from the maker’s registry entry. If the README says otherwise, follow the README.
Runs on your computer; the tool list appears in your AI app after you install it.
We check information anyone can see; we have not read the code. Checks that do not apply are left out of the count. · Checked Nov 7, 2026
The registry name was verified with the GitHub account Zw-awa, which owns the repo
We have not read this repo from GitHub yet
We have not read this repo from GitHub yet
This one runs on your computer; there is no internet endpoint
Runs on your computer and uses local settings instead
Runs on your computer; we can only read tool lists from internet endpoints
Compared with every active server in this category in the registry. Stars count only when the publisher owns the repo.
It passed 1 of 1 applicable basic checks. We have not read the code. Before adding a key or token, see what access the server asks for and use a key with only the permissions you need.
You need to fill in: SSH_PASSWORD
It runs on your computer. Your AI app starts it when needed, and data does not pass through the maker’s servers (unless it calls an online service itself).
The GitHub repo last changed –, and the latest version (2.7.1) reached the registry 6 months ago.
Apps that support MCP, such as Claude Desktop, Claude Code, Cursor and VS Code. You also need Node.js on your computer.
In the same category: Spec Driven Development, Remote Desktop Commander, Starreel
Servers in the same category from other makers, sorted by stars.
Reading a card:★ GitHub starsiThree pillars: reviews · checks · usageiUpdated = latest version published to the registryi
MCP Server that facilitates spec-driven development workflows, not just Vibe Coding.
Remote Desktop Commander: use files, terminal and processes on your own computers from any AI app.
Turn a script into a finished, downloadable short-drama episode — via MCP or REST.
Copied from the maker’s repo as written. PopNx MCP has not reviewed or endorsed it. HTML, images and scripts are removed. Links lead off this site.
中文 | English
Persistent shared-terminal runtime for MCP clients over SSH.
ssh-session-mcp gives the user and the AI the same SSH PTY session, adds a browser viewer, tracks who typed what, and makes long-running remote work manageable instead of stateless.
git clone this repository.npx -y ssh-session-mcp --viewerPort=autonpm install -g ssh-session-mcpdocker.io/zwawa/ssh-session-mcpgit clone is only for contributors, source builds, and local development.npx or a global npm install is still the lowest-friction path. Docker is mainly useful when you want a pinned runtime, container-based deployment, or registry-backed distribution.Most SSH-oriented MCP servers can execute commands, but they do not manage terminal state well enough for real collaboration.
ssh-session-mcp focuses on the missing runtime layer:
Key directories and files:
| Path | Purpose |
|---|---|
src/ | Core TypeScript implementation for the MCP server, SSH session runtime, viewer, tools, and config CLIs |
src/viewer-html/ | HTML page generators and browser-side scripts for the terminal viewer |
test/ | Vitest coverage for runtime behavior, viewer contracts, config loading, and repository validation |
docs/ | Supporting documentation such as contracts, failure taxonomy, platform notes, and Docker usage |
docs/examples/ | Example config files for normal and Docker-oriented setups |
scripts/ | Build, version sync, and local operator helper scripts |
deploy/helm/ | Helm chart for Kubernetes deployment in single-node or distributed v0 mode |
site/ | GitHub Pages landing page source |
dist/ | Generated static site output from npm run build:site |
build/ | Generated JavaScript output from npm run build |
Dockerfile | Container image build definition |
docker-compose.yml | Profile-based Docker Compose example |
docker-compose.env.yml | Legacy .env-style Docker Compose example |
server.json | MCP server metadata for marketplace-style distribution |
AGENT.md | Primary agent/operator playbook |
llms-install.md | Agent-focused installation and environment checklist |
.env.example | Legacy single-target environment variable template |
If the goal is to let Claude Code, Codex, or OpenCode install the server automatically, prefer npx -y ssh-session-mcp in the MCP command instead of a prior global install.
For Cline Marketplace and other agent installers, see llms-install.md. This repo is structured to be one-click installable through an npx -y ssh-session-mcp --viewerPort=auto command.
claude mcp add --transport stdio ssh-session-mcp -- npx -y ssh-session-mcp --viewerPort=auto
Windows note from the Claude Code docs: native Windows users should wrap npx with cmd /c for stdio MCP servers.
claude mcp add --transport stdio ssh-session-mcp -- cmd /c npx -y ssh-session-mcp --viewerPort=auto
codex mcp add ssh-session-mcp -- npx -y ssh-session-mcp --viewerPort=auto
OpenCode's opencode mcp add flow is interactive. Choose a local MCP server and use this command:
npx -y ssh-session-mcp --viewerPort=auto
If you prefer config instead of the interactive flow:
{
"$schema": "https://opencode.ai/config.json", "mcp": { "ssh-session-mcp": { "type": "local", "command": ["npx", "-y", "ssh-session-mcp", "--viewerPort=auto"] } } }
This is the closest thing to "automatic installation" for stdio MCP servers today: the MCP client stores the command, and npx -y downloads the package automatically the first time it runs.
npm install -g ssh-session-mcp
ssh-session-mcp-ctl launch --local --viewerPort=auto
This starts a local shell instead of SSH and opens the browser terminal, which is the easiest way to test the MCP runtime before touching a real server.
Use the MCP server binary directly when wiring a client:
# Global install
npm install -g ssh-session-mcp
ssh-session-mcp --viewerPort=auto
# Claude Code
claude mcp add --transport stdio ssh-session-mcp -- ssh-session-mcp --viewerPort=auto
codex mcp add ssh-session-mcp -- ssh-session-mcp --viewerPort=auto
If you prefer npx instead of a global install:
npx -y ssh-session-mcp --viewerPort=auto
Create .env from .env.example:
cp .env.example .env
SSH_HOST=YOUR_DEVICE_HOST
SSH_PORT=22 SSH_USER=YOUR_DEVICE_USER SSH_PASSWORD= SSH_KEY= VIEWER_PORT=auto AUTO_OPEN_TERMINAL=false SSH_MCP_MODE=safe
Then launch:
ssh-session-mcp-ctl launch --viewerPort=auto
For multiple boards or named targets, create ssh-session-mcp.config.json:
{
"defaultDevice": "DEVICE_A_ID", "devices": [ { "id": "DEVICE_A_ID", "host": "DEVICE_A_HOST", "port": 22, "user": "DEVICE_A_USER", "auth": { "passwordEnv": "DEVICE_A_PASSWORD" }, "defaults": { "term": "xterm-256color", "cols": 120, "rows": 40, "autoOpenViewer": true, "viewerMode": "browser" } } ] }
Discovery order:
--config=/path/to/config.jsonssh-session-mcp.config.json.env fallbackImportant:
auth.password is intentionally unsupported. Use auth.passwordEnv or auth.keyPath..env or the parent environment, not in repo-tracked JSON.Public Docker images should be distributed through Docker Hub, with GitHub Container Registry as an optional secondary registry:
docker.io/zwawa/ssh-session-mcp:<version>
docker.io/zwawa/ssh-session-mcp:latest ghcr.io/zw-awa/ssh-session-mcp:
Recommended container launch for a real SSH target:
docker run --rm -i \
-p 8793:8793 \ -e VIEWER_PORT=8793 \ -e VIEWER_HOST=0.0.0.0 \ -e SSH_HOST=YOUR_DEVICE_HOST \ -e SSH_PORT=22 \ -e SSH_USER=YOUR_DEVICE_USER \ -e SSH_PASSWORD \ docker.io/zwawa/ssh-session-mcp:latest
Export the password in your shell first instead of placing it directly on the command line.
Recommended launch for profile-based config:
docker run --rm -i \
-p 8793:8793 \ -e VIEWER_PORT=8793 \ -e VIEWER_HOST=0.0.0.0 \ -e SSH_MCP_CONFIG=/workspace/ssh-session-mcp.config.json \ -v "$PWD/ssh-session-mcp.config.json:/workspace/ssh-session-mcp.config.json:ro" \ -v "/path/to/host/keys:/workspace/keys:ro" \ docker.io/zwawa/ssh-session-mcp:latest
Equivalent Compose example:
docker compose up -d
See docker-compose.yml for a ready-to-run example that mounts ssh-session-mcp.config.json, publishes the viewer on 8793, and uses SSH_KEY_DIR when set or falls back to a dedicated ./keys directory. For the full Docker guide, including the legacy .env compose variant and MCP client config snippets, see docs/docker.md. For a container-oriented profile example, see docs/examples/ssh-session-mcp.config.docker.example.json.
Container-specific notes:
VIEWER_PORT to 8793 when unset so the browser viewer can be published reliably.VIEWER_HOST to 0.0.0.0 inside the container so the mapped port is reachable from the host.AUTO_OPEN_TERMINAL defaults to false in the container because browser auto-open from inside a container is usually not useful.docker-compose.yml, SSH_KEY_DIR overrides the default key mount path. If it is unset, Compose falls back to ./keys, not the repo root..env, or --env-file.npx is still simpler unless your client explicitly prefers containerized commands.Docker-based MCP client command examples:
# Claude Code
claude mcp add --transport stdio ssh-session-mcp -- docker run --rm -i -p 8793:8793 -e VIEWER_PORT=8793 -e VIEWER_HOST=0.0.0.0 docker.io/zwawa/ssh-session-mcp:latest
codex mcp add ssh-session-mcp -- docker run --rm -i -p 8793:8793 -e VIEWER_PORT=8793 -e VIEWER_HOST=0.0.0.0 docker.io/zwawa/ssh-session-mcp:latest
For JSON-based MCP clients, the same pattern works by using docker as the command and passing the remaining run ... docker.io/zwawa/ssh-session-mcp:latest tokens as args.
This is useful when:
For many users, publishing to npm and recommending npx -y ssh-session-mcp --viewerPort=auto is still the lower-friction install path.
The browser viewer is not decorative. It is part of the workflow:
For users:
install -> launch viewer -> connect once -> keep the session alive -> let the AI help
For agents:
ssh-quOnly the beginning is shown; read the rest in the repo