Skip to main content
Glama
Zw-awa

ssh-session-mcp

by Zw-awa

ssh-session-mcp

中文 | English

License: Apache%202.0 Node.js Version TypeScript npm version

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.

ssh-session-mcp hero demo

Contents

Related MCP server: interminal

Install At A Glance

  • Normal users do not need to git clone this repository.

  • Preferred install path for MCP clients: npx -y ssh-session-mcp --viewerPort=auto

  • Preferred install path for human operators who want local binaries: npm install -g ssh-session-mcp

  • Official container distribution can be published to a public registry such as docker.io/zwawa/ssh-session-mcp

  • git clone is only for contributors, source builds, and local development.

  • For the common desktop MCP workflow, 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.

Why It Exists

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:

  • One shared PTY for both the human and the AI

  • Browser terminal for live inspection and manual intervention

  • Input lock so the AI does not type over the user

  • Safe/full execution modes for risky commands

  • Configurable default policy rules plus session-level custom rule overrides

  • Async command tracking for long-running remote work

  • Multi-device and multi-connection profile support

  • Local debug mode for demos, offline testing, and prompt iteration

Best Fit

  • AI-assisted remote development on Linux boards and SSH servers

  • Embedded, ROS, training, and deployment hosts that need a real terminal

  • Users who want the AI to help, but do not want to surrender the terminal

  • MCP Marketplace listings where the install and demo path must be clear

Project Structure

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

Quick Start

1. Agent-First Install (Auto-download on first run)

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 Code

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

codex mcp add ssh-session-mcp -- npx -y ssh-session-mcp --viewerPort=auto

OpenCode

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.

2. Fastest Local Demo

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.

3. Register As An MCP Server

Use the MCP server binary directly when wiring a client:

# Global install
npm install -g ssh-session-mcp

# Server command used by MCP clients
ssh-session-mcp --viewerPort=auto
# Claude Code
claude mcp add --transport stdio ssh-session-mcp -- ssh-session-mcp --viewerPort=auto

# Codex CLI
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

4. Connect To A Real SSH Target

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

5. Multi-Device Config

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:

  1. --config=/path/to/config.json

  2. Workspace ssh-session-mcp.config.json

  3. User-global config

  4. Legacy .env fallback

Important:

  • Config discovery is based on the MCP process working directory.

  • auth.password is intentionally unsupported. Use auth.passwordEnv or auth.keyPath.

  • Secrets belong in .env or the parent environment, not in repo-tracked JSON.

6. Docker Status

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:<version>

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:

  • The image defaults VIEWER_PORT to 8793 when unset so the browser viewer can be published reliably.

  • The image defaults 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.

  • Mount config files or SSH keys read-only when possible.

  • Prefer mounting SSH keys from a directory outside the repo root.

  • In 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.

  • Avoid putting passwords directly on the command line. Prefer exported env vars, Compose .env, or --env-file.

  • For stdio MCP clients, Docker is viable, but host-native 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 CLI
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:

  • The primary workflow is a local stdio MCP server command, not a long-lived network service.

  • You want a pinned Node/runtime environment without a local install.

  • You need registry-based distribution for a team or managed host.

  • You want container-level isolation for the MCP server process.

For many users, publishing to npm and recommending npx -y ssh-session-mcp --viewerPort=auto is still the lower-friction install path.

Viewer And Collaboration Model

The browser viewer is not decorative. It is part of the workflow:

  • The user can see exactly what the AI did.

  • The AI can pause when the user takes over.

  • Password prompts, pagers, and editors become visible state instead of hidden failure modes.

  • Session diagnostics and history turn terminal debugging into something inspectable.

Marketplace-Friendly Flow

For users:

install -> launch viewer -> connect once -> keep the session alive -> let the AI help

For agents:

ssh-quick-connect -> ssh-run -> inspect output -> ssh-command-status if needed -> ssh-run again

Use AGENT.md when you want the AI to install, inspect config, connect devices, and help the user end-to-end. Compatibility notes for older agent setups remain in AI_AGENT_GUIDE.md.

Core Differences From A Stateless MCP SSH Wrapper

  • Shared PTY instead of one-off command execution

  • Actor-aware transcript markers for user, system, and agent input

  • Terminal-state checks before dangerous or nonsensical writes

  • Auto cleanup for sessions and viewer processes

  • Session-scoped browser viewer with diagnostics and history

  • Local debug mode with --local for offline testing

Operation Modes

Mode

Behavior

safe

Default per session. Automatically blocks obviously dangerous, interactive, or never-ending commands.

full

Per session. Relaxes the guardrails for advanced use, while still blocking a small set of clearly destructive abuse cases.

Each session now owns its own safe / full mode. Switching one browser terminal to full does not change other sessions.

The default rule set can be customized if needed. Custom rules now support:

  • error: block the command

  • warning: allow but surface a warning

  • log: allow and annotate only

Rule precedence is error > warning > log, and within the same level, earlier rules win.

Lock Policy

The browser terminal UI lets the operator choose one of these input policies:

Policy

What the operator experiences

common

User and agent can both type into the shared terminal.

user

Only the user can type. Agent write actions are blocked.

auto

The user can start typing without fighting the agent. While the user is actively drafting input, agent writes are blocked.

agent

Only the agent can type. User input is blocked until the policy changes.

When the terminal is not available for agent input, tools such as ssh-run, ssh-session-send, and ssh-session-control return a blocked response instead of forcing input into the PTY.

MCP Tools

Tool

Purpose

ssh-quick-connect

Connect or reuse the default target and optionally open the viewer

ssh-run

Execute a command with completion detection and exit-code capture

ssh-status

Inspect sessions, viewer state, and operation mode

ssh-command-status

Poll async command progress

ssh-retry

Retry flaky commands with backoff

ssh-session-policy-list

Inspect inherited defaults and current session custom policy rules

ssh-session-policy-upsert

Add or update a session-level custom policy rule

ssh-session-policy-remove

Remove a session-level custom policy rule

ssh-session-policy-reset

Reset session custom rules back to inherited defaults

Full Tool Catalog

Tool

Purpose

ssh-session-open

Open a session with explicit SSH parameters

ssh-session-send

Send raw PTY input

ssh-device-list

List configured devices and defaults

ssh-session-read

Read buffered terminal output by offset

ssh-session-watch

Long-poll for output and dashboard changes

ssh-session-history

Read line-numbered mixed terminal history

ssh-session-control

Send control keys such as ctrl_c, arrows, or tab

ssh-session-resize

Resize the PTY

ssh-session-list

List tracked sessions

ssh-session-diagnostics

Inspect lock state, warnings, running command state, and viewer health

ssh-session-policy-list

Show inherited policy defaults and the current session rule set

ssh-session-policy-upsert

Add or update a session-specific custom policy rule

ssh-session-policy-remove

Remove a session-specific custom policy rule

ssh-session-policy-reset

Restore inherited rules for the current session

ssh-session-set-active

Choose the default session

ssh-viewer-ensure

Open or reuse the local viewer

ssh-viewer-list

List tracked viewer processes

ssh-session-close

Close a session cleanly

ssh-quick-connect

One-step connect flow for agents

ssh-run

Main command execution tool

ssh-status

Runtime overview

ssh-command-status

Async poller

ssh-retry

Retry executor

Local Operator Commands

These helpers are for humans on the workstation that owns the viewer:

ssh-session-mcp-ctl status
ssh-session-mcp-ctl devices
ssh-session-mcp-ctl launch --viewerPort=auto
ssh-session-mcp-ctl launch --local --viewerPort=auto
ssh-session-mcp-ctl logs --tail=60
ssh-session-mcp-ctl cleanup

Default rule library management for operators:

ssh-session-mcp-config policy list --scope=merged
ssh-session-mcp-config policy set error-kubectl-delete --pattern="\\bkubectl\\s+delete\\b" --category=dangerous --action=error --priority=0 --message="kubectl delete is blocked in safe mode"
ssh-session-mcp-config policy remove error-kubectl-delete

Equivalent repo-local commands also exist:

npm run launch
npm run status
npm run devices
npm run logs
npm run cleanup

Configuration Summary

Key environment variables:

Variable

Meaning

Default

SSH_HOST

Legacy single-target SSH host

required in legacy mode

SSH_PORT

Legacy single-target SSH port

22

SSH_USER

Legacy single-target SSH user

required in legacy mode

SSH_PASSWORD

Password auth

empty

SSH_KEY

Local private key path

empty

SSH_PASSWORD_FILE

File containing the SSH password

empty

SSH_KEY_FILE

File containing the SSH private key

empty

SSH_MCP_INSTANCE

Runtime isolation key

proc-<pid> or helper-selected

SSH_MCP_CONFIG

Explicit config file path

auto-discovery

SSH_MCP_STATE_DIR

Runtime state root directory

platform default

VIEWER_HOST

Viewer bind host

127.0.0.1

VIEWER_PORT

Viewer port or auto

0 unless configured

VIEWER_ACCESS_MODE

Viewer IP filter mode

config-driven

SSH_MCP_MODE

safe or full

safe

SSH_MCP_LOCAL

Launch a local shell instead of SSH

false

SSH_MCP_DEBUG

Enable debug browser actions

false

AUTO_OPEN_TERMINAL

Auto-open browser terminal

false

SSH_MCP_LOG_MODE

off, meta, or stderr logging

off

SSH_MCP_LOG_DIR

Metadata log directory

platform default

Distributed v0

Distributed v0 intentionally implements a narrow boundary:

  • Supported runtime modes: single-node and distributed

  • Distributed mode shares control-plane state only: node heartbeat, session metadata, binding metadata, command metadata, and viewer access policy

  • When the current replica is not the owner, HTTP APIs return REMOTE_OWNER, HTML pages render a remote-owner error page, and websocket attaches close with code 4009

  • Cross-node PTY migration is not supported

  • Transparent cross-node HTTP or websocket proxying is not supported

Distributed v0 requires Redis for real multi-node deployments. SSH_MCP_STORE=memory only exists for local skeleton testing and does not provide a shared store across replicas.

Distributed configuration:

Variable

Meaning

Default

SSH_MCP_RUNTIME_MODE

single-node or distributed

single-node

SSH_MCP_STORE

memory or redis

redis in distributed mode, otherwise memory

SSH_MCP_REDIS_URL

Redis connection URL

required when SSH_MCP_STORE=redis

SSH_MCP_NODE_ID

Stable logical node id for this replica

runtime instance id

SSH_MCP_PUBLIC_BASE_URL

Public viewer base URL advertised to other replicas

unset

SSH_MCP_AUTH_MODE

off or proxy

off

SSH_MCP_TRUST_PROXY

Whether to trust authenticated proxy headers

false

SSH_MCP_AUTH_USER_HEADER

Authenticated user header name

x-ssh-session-mcp-user

SSH_MCP_AUTH_ROLE_HEADER

Authenticated role header name

x-ssh-session-mcp-role

Recommended distributed env example:

SSH_MCP_RUNTIME_MODE=distributed
SSH_MCP_STORE=redis
SSH_MCP_REDIS_URL=redis://redis:6379/0
SSH_MCP_NODE_ID=node-a
SSH_MCP_PUBLIC_BASE_URL=https://ssh-mcp.example.com
SSH_MCP_AUTH_MODE=proxy
SSH_MCP_TRUST_PROXY=true
SSH_MCP_AUTH_USER_HEADER=x-forwarded-user
SSH_MCP_AUTH_ROLE_HEADER=x-forwarded-role

Proxy auth is most useful in distributed mode behind a trusted reverse proxy. The built-in role mapping is:

  • viewer_read: pages, session list/read endpoints, history, diagnostics, health, readiness, metrics

  • viewer_write: attach input, resize, control

  • session_admin: mode changes, policy updates, close, set-active, debug-agent actions, local debug session creation

Macro / Environment Variable Reference

Use these variables according to your installation path:

Variable

Required When

Accepted Values / Example

Notes

SSH_HOST

Legacy single-target SSH mode

YOUR_DEVICE_HOST

Required unless you use ssh-session-mcp.config.json or --local.

SSH_PORT

Legacy single-target SSH mode

22

Optional in legacy mode; defaults to 22.

SSH_USER

Legacy single-target SSH mode

YOUR_DEVICE_USER

Required unless you use device profiles.

SSH_PASSWORD

Password-based auth

exported env var

Prefer env export over putting the password directly in the command line.

SSH_PASSWORD_FILE

Password-based auth via secret file

/run/secrets/ssh_password

The file contents are used as the password. This is the preferred pattern for Docker and Kubernetes secrets.

SSH_KEY

Key-based auth in legacy mode

/absolute/path/to/private/key

The path must exist on the host running the MCP server.

SSH_KEY_FILE

Key-based auth via secret file

/run/secrets/ssh_private_key

The file contents are used as the private key. This works well with mounted container secrets.

SSH_MCP_CONFIG

Profile-based mode or config outside cwd

/path/to/ssh-session-mcp.config.json

Use this when config auto-discovery is not enough.

SSH_MCP_INSTANCE

Multi-agent / multi-client isolation

agent-a

Use different values when two agents should not share runtime state.

SSH_MCP_STATE_DIR

Runtime state root override

/workspace/state

Controls where per-instance server info, viewer state, and default logs are stored. Mount it persistently in containers.

SSH_MCP_RUNTIME_MODE

Distributed topology selection

single-node, distributed

Distributed v0 only shares control-plane state; it does not migrate PTYs across nodes.

SSH_MCP_STORE

Distributed state backend

memory, redis

Use redis for any real multi-node deployment. memory is only for local distributed skeleton testing.

SSH_MCP_REDIS_URL

Redis backend enabled

redis://redis:6379/0

Required when SSH_MCP_RUNTIME_MODE=distributed and SSH_MCP_STORE=redis.

SSH_MCP_NODE_ID

Stable distributed node id

node-a

Useful when multiple replicas share Redis and need durable owner ids.

SSH_MCP_PUBLIC_BASE_URL

Public routing hint for this node

https://ssh-mcp.example.com

Used in REMOTE_OWNER payloads and cluster status output.

SSH_MCP_AUTH_MODE

Viewer auth mode

off, proxy

proxy is recommended only behind a trusted reverse proxy.

SSH_MCP_TRUST_PROXY

Trust viewer identity headers

true, false

Must be enabled together with SSH_MCP_AUTH_MODE=proxy.

SSH_MCP_AUTH_USER_HEADER

Proxy-auth viewer user header

x-forwarded-user

Header names are normalized to lowercase internally.

SSH_MCP_AUTH_ROLE_HEADER

Proxy-auth viewer role header

x-forwarded-role

Roles are comma-separated and mapped to viewer_read, viewer_write, session_admin.

VIEWER_HOST

Custom viewer bind

127.0.0.1, 0.0.0.0

Use 0.0.0.0 inside containers; keep 127.0.0.1 on normal host installs unless you need remote access.

VIEWER_PORT

Viewer enabled

auto, 0, 8793

auto picks a free port, 0 disables the viewer, fixed ports are best for Docker.

VIEWER_ACCESS_MODE

Viewer access control mode

allow_all, allowlist, denylist

Usually edited in the viewer home page. Keep allow_all only when you stay on localhost.

AUTO_OPEN_TERMINAL

Auto-open viewer tab

true, false

Usually false in containers.

SSH_MCP_MODE

Runtime safety mode

safe, full

safe is the recommended default.

SSH_MCP_LOCAL

Local demo mode

true, false

Starts a local shell instead of SSH.

SSH_MCP_DEBUG

Browser debug controls

true, false

Intended for demos and troubleshooting.

SSH_MCP_LOG_MODE

Runtime metadata logging

off, meta, stderr

meta writes JSONL metadata logs without storing raw secrets. stderr is the preferred container mode because it preserves stdio MCP transport while exposing structured logs to the container runtime.

SSH_MCP_LOG_DIR

Override metadata log directory

/workspace/state/instances/<instance>/logs

Mainly useful with SSH_MCP_LOG_MODE=meta; ignored for stderr.

SSH_KEY_DIR

Docker Compose profile-based example

/path/to/host/keys

Optional in docker-compose.yml; when unset it falls back to ./keys.

SSH_SESSION_MCP_IMAGE

Docker Compose image override

docker.io/zwawa/ssh-session-mcp:latest

Override this if you mirror the image or test another tag.

Minimum Required Settings

Choose one of these minimum configuration sets:

  • Local demo: SSH_MCP_LOCAL=true and VIEWER_PORT=auto

  • Legacy SSH with password: SSH_HOST, SSH_USER, SSH_PASSWORD

  • Legacy SSH with key: SSH_HOST, SSH_USER, SSH_KEY

  • Profile-based mode: ssh-session-mcp.config.json, plus any passwordEnv variables referenced by that config

  • Docker Compose profile mode: ssh-session-mcp.config.json, optional SSH_KEY_DIR, optional SSH_SESSION_MCP_IMAGE

Container Runtime Notes

  • Container defaults now set SSH_MCP_LOG_MODE=stderr so logs go to the container runtime without corrupting stdio MCP transport.

  • Mount SSH_MCP_STATE_DIR persistently when you want viewer policy, server info, and state files to survive container restarts.

  • Distributed multi-node deployments need Redis plus a routable SSH_MCP_PUBLIC_BASE_URL per replica.

  • Distributed v0 does not provide cross-node PTY migration or transparent cross-node proxying. Route requests to the owner node when you receive REMOTE_OWNER.

  • Health endpoints:

    • /livez for process liveness

    • /readyz for readiness checks

    • /metrics for Prometheus text metrics

  • Example single-instance Kubernetes baseline: docs/examples/ssh-session-mcp.k8s.single-instance.yaml

  • Example distributed Kubernetes baseline: docs/examples/ssh-session-mcp.k8s.distributed.example.yaml

  • Primary Kubernetes installation path: deploy/helm/ssh-session-mcp

Example config file: docs/examples/ssh-session-mcp.config.example.json

Security

  • The package never requires raw passwords inside tracked JSON config.

  • .env is ignored by git and npm.

  • Viewer HTTP binds to localhost by default.

  • The MCP server treats terminal mode and input lock as first-class safety signals.

  • CI runs Trivy filesystem and container-image scans against high and critical vulnerabilities.

  • CI installs a pinned Trivy CLI release with checksum verification instead of relying on a floating third-party action tag.

  • Release builds generate a CycloneDX SBOM for the published GHCR image digest and attach it to the GitHub release.

  • Release builds sign the published GHCR image digest with keyless Cosign.

  • GHCR digest is the primary verification path. Docker Hub remains a distribution path, not the main signature-verification target.

See SECURITY.md for the full policy.

Platform Notes

  • Windows 10/11: first-class host environment

  • Linux: strong fit for headless MCP + browser viewer workflows

  • macOS: standard Node.js path supported

  • Remote Linux hosts: first-class target

More detail: docs/platform-compatibility.md

Docs

Development

Clone the repo only if you want to modify the source, run tests locally, or build release artifacts.

npm install
npm run build
npm run test
npm run validate:repo
npm run build:site

GitHub Actions included in this repo can:

  • run CI on push and pull request

  • deploy a GitHub Pages landing page from dist/

  • build a tagged GitHub Release with the npm package tarball attached

License

Apache-2.0. See LICENSE.

Available Tools

23 tools
ssh-command-statusA

Check the status of a long-running async command. Returns current output if completed, or partial output if still running.

ParametersJSON Schema
NameRequiredDescriptionDefault
maxCharsNoMax chars to read from output (default 16000)
commandIdYesThe async command ID returned by ssh-run

TDQS

A4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description discloses key behavioral traits: returns current/partial output, handles both completed and running states. However, it omits edge cases like invalid commandId or repeated checks.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Single sentence efficiently states purpose and key behavior, no redundancy, front-loaded.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple status-check tool, the description covers purpose and return behavior, but lacks explicit mention of prerequisite (commandId from ssh-run) and error handling.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema covers 100% of parameters, description adds minimal extra meaning beyond schema (e.g., clarifies commandId is from ssh-run, but that's implied). Baseline 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states it checks the status of an async command, specifies return behavior (completed vs partial output), and distinguishes from siblings like ssh-run which starts commands.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies usage after an async command (via commandId) but does not explicitly state when to use vs alternatives, nor provide exclusions. Only implicit context.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

ssh-device-listA

List configured SSH device profiles discovered from ssh-session-mcp.config.json.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description is the sole source of behavioral information. It states it lists profiles from a config file, implying a read-only operation, but does not disclose details like existence requirements or error handling.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single, clear sentence with no extraneous content. Information is front-loaded and efficient.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a tool with no parameters and no output schema, the description adequately explains the tool's function. It could briefly mention that the config file must exist, but it is sufficiently complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

There are no parameters, so the description need not add parameter-specific meaning. Per instruction, 0 parameters yields a baseline score of 4.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states it lists configured SSH device profiles from a specific configuration file, using a specific verb and resource. It distinguishes from sibling tools that deal with sessions, diagnostics, etc.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description does not provide explicit guidance on when to use this tool vs alternatives. However, its purpose is straightforward and can be inferred from context.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

ssh-quick-connectA

One-step: open SSH session using configured device profiles when available, otherwise fall back to legacy .env defaults. Reuse an existing session when possible and return viewer details when enabled.

ParametersJSON Schema
NameRequiredDescriptionDefault
deviceNoDevice profile id. Defaults to config defaultDevice when available
sessionNameNoOptional session name. Defaults to "default"
connectionNameNoLogical connection name. Defaults to "main" for profile-based sessions

TDQS

A3.5/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description discloses reuse of existing sessions and return of viewer details when enabled. However, it omits failure modes, authentication requirements, or side effects of reuse. Partial but insufficient for safety.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences, front-loaded with key action ('One-step: open SSH session'), and zero wasted words. Every phrase adds value.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

No output schema exists, so the description should hint at return structure. It mentions 'viewer details when enabled' but not format or error handling. Adequate for a simple tool but leaves gaps given complexity (reuse, fallback).

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, and the description adds context about device profiles and fallback. However, it does not explain the parameters beyond what the schema already provides (e.g., default values and meanings).

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool opens an SSH session in one step, using device profiles or fallback to .env defaults. It implies a streamlined operation but does not explicitly differentiate from sibling tools like ssh-session-open.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description mentions 'one-step' and reuse behavior but provides no explicit guidance on when to use this tool vs alternatives like ssh-session-open or ssh-run. Usage context is implied but not articulated.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

ssh-retryA

Execute a command with automatic retry and backoff on failure. Useful for flaky network commands or services that need time to start.

ParametersJSON Schema
NameRequiredDescriptionDefault
backoffNoBackoff strategy (default "exponential")
commandYesShell command to execute
delayMsNoBase delay between retries in ms (default 1000)
sessionNoSession name or id. Defaults to "default"
maxRetriesNoMaximum number of retries (default 3)
failPatternNoRegex pattern - if output matches this, consider command failed regardless of exit code
successPatternNoRegex pattern - if output matches this, consider command successful regardless of exit code

TDQS

A4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description must fully inform. It states automatic retry and backoff on failure but does not detail what constitutes failure (exit code vs. output patterns), nor does it mention side effects or session behavior. This leaves some ambiguity for the agent.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences, front-loaded with the core purpose. No redundant words. Every part contributes to understanding the tool's function.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given 7 well-documented parameters and no output schema, the description covers the main use case. However, it omits details on retry behavior (e.g., when retries stop, maxRetries impact) and session context, which could be useful for an agent.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema has 100% coverage, so the baseline is 3. The description adds general context ('flaky network commands') but does not provide additional meaning beyond schema fields like 'command' or 'backoff'. It fails to explain how parameters like 'failPattern' and 'successPattern' interact with retry logic.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the verb 'Execute' and the resource 'command with automatic retry and backoff on failure'. It distinguishes from sibling tools like ssh-run by specifying the retry and backoff behavior, making it clear that this tool is for unreliable commands.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description mentions it is 'useful for flaky network commands or services that need time to start', giving clear context. However, it does not explicitly state when not to use it or mention alternatives (e.g., ssh-run for one-shot execution).

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

ssh-runA

Execute a command in the SSH session and return the output. Uses intelligent completion detection (prompt matching + idle timeout). In safe mode, dangerous/interactive commands are blocked. Long-running commands automatically transition to async mode.

ParametersJSON Schema
NameRequiredDescriptionDefault
idleMsNoIdle timeout in ms - if no new output for this duration, consider command done (default 2000)
waitMsNoMaximum wait time in ms (default 30000). Command may return earlier if prompt detected or idle timeout reached.
commandYesShell command to execute
sessionNoSession name or id. Defaults to "default"
maxCharsNoMax chars to read from output (default 16000). When output exceeds this limit, head (30%) and tail (70%) are returned with the middle omitted.

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description fully discloses key behaviors: intelligent completion detection, safe mode blocking dangerous commands, and automatic async for long-running commands. This provides good understanding of the tool's operation beyond a simple command execution.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three short sentences with no wasted words. Each sentence adds essential information: purpose, completion detection, safety/async. Ideal front-loading of the most important information first.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the complexity of an SSH command execution tool with multiple parameters and no output schema, the description covers the main behaviors (completion, safety, async, truncation). It does not mention error handling or exit codes, but the core functionality is well explained.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema covers all 5 parameters with descriptions (100% coverage). The description adds value by explaining idle timeout default behavior, maximum wait time, and the truncation scheme (head 30%, tail 70%) for maxChars, which goes beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool executes a command in an SSH session and returns output. It distinguishes from siblings by mentioning intelligent completion detection, safe mode, and async mode, which sets it apart from tools like ssh-session-send or ssh-command-status.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies usage for running commands and getting output, but lacks explicit guidance on when to avoid this tool in favor of alternatives (e.g., for interactive commands, use ssh-session-send). No exclusions or siblings are directly referenced.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

ssh-session-closeA

Close an interactive SSH PTY session immediately and remove it from the MCP server.

ParametersJSON Schema
NameRequiredDescriptionDefault
sessionNoSession id, session ref, or session name. Defaults to the active session

TDQS

A3.5/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description mentions 'immediately' and 'remove from the MCP server', which gives some behavioral insight. However, it does not disclose potential side effects (e.g., terminating foreground processes, unsaved data loss) or any authorization requirements. Since no annotations are provided, the burden is on the description, which is only partially met.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single, well-structured sentence that immediately conveys the core purpose. It contains no filler or redundant information, making it highly concise and front-loaded.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple destructive action with no output schema, the description covers the essential action but lacks context on success/failure messages, error states, or post-conditions. Additional details about what happens after closing (e.g., session resource freed) would improve completeness.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema already describes the parameter with 100% coverage, including its type, default behavior, and acceptable values. The description adds no additional meaning beyond what the schema provides, so a baseline score of 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb 'Close' and identifies the resource as an 'interactive SSH PTY session'. It also clarifies the effect ('immediately and remove from the MCP server'), which clearly distinguishes this tool from sibling tools like ssh-session-open or ssh-session-send.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides no guidance on when to use this tool versus alternatives, no prerequisites, and no warnings about when not to use it. For a session-closing tool, explicit context about active sessions or safety checks would improve usability.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

ssh-session-controlB

Send a control key to an interactive SSH PTY session. Actor is shown inline in the dashboard transcript.

ParametersJSON Schema
NameRequiredDescriptionDefault
actorNoLabel for the sender shown inline in the dashboard, e.g. codex, claude, user
controlYesControl key to send
sessionNoSession id, session ref, or session name. Defaults to the active session

TDQS

B3.4/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description should fully disclose behavior. It only states that the actor is shown in the dashboard transcript, but does not mention side effects (e.g., ctrl_c may terminate a process), return values, or error conditions.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences, no unnecessary words. The most important information is front-loaded.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a tool with 3 parameters and no output schema or annotations, the description is too brief. It lacks information about the effect of each control key, the response format, and error handling, leaving the agent with significant gaps.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, yet the description adds value: it explains that the actor parameter is a label shown inline, and that the session parameter defaults to the active session. This goes beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the verb 'send' and the resource 'control key to an interactive SSH PTY session'. The enum of control keys further distinguishes it from sibling tools like ssh-session-send which sends arbitrary text.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No explicit guidance on when to use this tool vs alternatives. The description does not mention scenarios, prerequisites, or when not to use it.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

ssh-session-diagnosticsA

Inspect session health, buffer trim state, viewer attachment state, input lock state, and tracked command metadata.

ParametersJSON Schema
NameRequiredDescriptionDefault
sessionNoSession id or unique session name. Omit to inspect all tracked sessions

TDQS

A3.6/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries full burden. It implies a read-only inspection but does not explicitly confirm no side effects, no authentication needs, or other behavioral traits beyond listing inspection targets. Adequate but lacks depth.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single sentence that front-loads the verb 'Inspect' and lists all relevant items without any wasted words or redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description covers the main diagnostic aspects (health, buffer, viewer, etc.) and is complete for its purpose, though it could mention what the output looks like or that it's a read-only snapshot. Minor gap.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% with one parameter already well-described in the schema. The description adds no additional meaning beyond the schema's parameter description, so baseline 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses 'Inspect' as a specific verb and lists the exact resources (session health, buffer trim state, viewer attachment state, etc.), clearly distinguishing it from sibling tools like ssh-session-list or ssh-session-read which have different purposes.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No explicit guidance is provided on when to use this tool versus alternatives. Given there are many similar sibling tools (e.g., ssh-session-list, ssh-session-read), specifying usage context would significantly aid selection.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

ssh-session-historyA

Read line-numbered session history built from terminal output and user/agent actions.

ParametersJSON Schema
NameRequiredDescriptionDefault
lineNoRead from this history line number
sessionNoSession id, session ref, or session name. Defaults to the active session
maxLinesNoMaximum number of history lines to return

TDQS

A3.5/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations provided, so description carries full burden. It discloses read-only behavior and line-numbering, but does not mention performance, limits, authentication needs, or whether history is persisted. Adequate but leaves gaps.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Single sentence, front-loaded with verb and resource, no superfluous words. Highly efficient.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

No output schema, but description does not specify return format (e.g., array of strings or objects). Lacks details on pagination or total lines. Adequate for a simple read tool but could be more complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% with each parameter described. The description adds no additional parameter context beyond the schema. Baseline 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Description clearly states verb 'Read' and specific resource 'line-numbered session history', with additional detail on content origin ('built from terminal output and user/agent actions'). Distinguishes from siblings like ssh-session-read (likely current output) and ssh-session-list (list sessions).

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No guidance on when to use this tool versus alternatives (e.g., ssh-session-read, ssh-session-list). Does not mention prerequisites or context. The description only states functionality without usage direction.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

ssh-session-listA

List tracked SSH PTY sessions. Closed sessions are kept briefly for inspection, then automatically pruned.

ParametersJSON Schema
NameRequiredDescriptionDefault
deviceNoFilter by device id
includeClosedNoInclude recently closed retained sessions
connectionNameNoFilter by connection name

TDQS

A3.6/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries full burden. It reveals that closed sessions are retained briefly then pruned, which is useful, but lacks details on retention duration, authentication requirements, or side effects.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a concise two sentences that front-load the primary action. No extraneous words, and every sentence adds value.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool has three optional parameters with full schema descriptions and no output schema, the description adequately explains the core behavior including closed session retention. Minor omissions like pagination are acceptable for a list tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Input schema has 100% description coverage for all three parameters. The tool description does not add additional meaning beyond what is already in the schema, so baseline score is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the action (list) and resource (tracked SSH PTY sessions). It is distinct from sibling tools like ssh-session-history and ssh-session-diagnostics, though it does not explicitly differentiate from them.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides context that closed sessions are kept briefly for inspection, but it does not specify when to use this tool over alternatives such as ssh-session-history or ssh-session-diagnostics.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

ssh-session-openB

Open a persistent interactive SSH PTY session with automatic idle cleanup and a terminal-style dashboard view.

ParametersJSON Schema
NameRequiredDescriptionDefault
keyNoPath to a private SSH key on the local machine
colsNoPTY column count
hostNoSSH host. Falls back to server --host if omitted
portNoSSH port. Falls back to server --port or 22
rowsNoPTY row count
termNoPTY TERM value
userNoSSH username. Falls back to server --user if omitted
deviceNoDevice profile id from ssh-session-mcp.config.json
passwordNoSSH password
viewerModeNoViewer launch mode when autoOpenViewer is enabled
sessionNameNoOptional human-readable alias for the session
startupInputNoRaw text to send immediately after opening the session
idleTimeoutMsNoAuto-close the SSH session after this much inactivity. 0 disables idle cleanup
startupWaitMsNoHow long to wait before capturing the initial dashboard
autoOpenViewerNoAutomatically ensure a local viewer is opened for this session
connectionNameNoLogical connection name for the selected device
dashboardWidthNoRendered dashboard width in columns
dashboardHeightNoRendered dashboard height in rows
includeDashboardNoInclude the rendered dashboard text in the tool response
closedRetentionMsNoHow long to keep a closed session summary/transcript in memory before pruning
startupInputActorNoActor label for startupInput, e.g. codex, claude, user
stripAnsiFromLeftNoStrip ANSI escape sequences from rendered SSH output
dashboardLeftCharsNoHow many recent transcript chars to retain in the rendered viewer
dashboardRightEventsNoHow many recent input/control/lifecycle events to retain for actor markers
viewerSingletonScopeNoHow viewer singleton deduplication is scoped when autoOpenViewer is enabled

TDQS

B3.2/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description must fully disclose behavioral traits. It mentions idle cleanup and a dashboard, but omits important details such as the session lifecycle (needs manual closure), potential viewer side effects, and requirements like SSH keys or passwords. The description is too brief for a complex tool with 25 parameters.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single concise sentence, but for a tool with 25 parameters and many siblings, it is too brief to be fully informative. It is front-loaded but sacrifices necessary detail, making it adequate but not optimal.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's complexity (25 parameters, many siblings, no output schema, no annotations), the description is incomplete. It does not explain the session model, how it relates to other session tools, or what the dashboard contains. The agent would need additional context to use it properly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema has 100% description coverage, so the description adds minimal value beyond stating the overall purpose. It alludes to idleTimeoutMs and dashboard parameters, but does not provide new semantics for individual parameters. A baseline of 3 is appropriate given high schema coverage.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states it opens a persistent interactive SSH PTY session, with automatic idle cleanup and a dashboard view. This distinguishes it from siblings like ssh-run (one-off commands) and ssh-quick-connect (quick connections) by emphasizing persistence and interactivity.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies use for persistent interactive sessions but does not explicitly contrast with alternatives like ssh-run or ssh-quick-connect. No when-to-use or when-not-to-use guidance is given, leaving the agent to infer from context.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

ssh-session-policy-listB

List the inherited and session-level custom policy rules currently active for an SSH session.

ParametersJSON Schema
NameRequiredDescriptionDefault
sessionNoSession id, session ref, or session name. Defaults to the active session

TDQS

B3.4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description must carry behavioral transparency. It correctly indicates a read-only operation by stating 'list', and specifies what is returned (inherited and session-level rules). However, it does not mention any potential side effects, permissions, or rate limits. The description is adequate but not thorough.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single clear sentence with no extraneous information. It is appropriately front-loaded. A slightly longer description that includes usage guidance would still be concise.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Without an output schema, the description provides a reasonable idea of return values (inherited and session-level custom policy rules). However, it does not clarify the structure of these rules, the scope of 'inherited', or how to interpret the list. Given the tool's simplicity, it is moderately complete but could be enhanced.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% with a single optional parameter 'session' already described in the schema. The description adds no additional meaning beyond the schema. Baseline score of 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states it lists 'inherited and session-level custom policy rules' for an SSH session. The verb 'list' and resource 'policy rules' are specific, and it distinguishes from siblings like ssh-session-policy-upsert (create/update) and ssh-session-policy-remove (delete). However, it could more explicitly contrast with these siblings.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies usage to view active policies, but provides no explicit guidance on when to use this vs alternatives like ssh-session-policy-upsert or ssh-session-policy-remove. No when-not-to-use or prerequisite context is given.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

ssh-session-policy-removeB

Remove a session-level custom policy rule by id.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesRule id to remove from the current session rule set
sessionNoSession id, session ref, or session name. Defaults to the active session

TDQS

B3.4/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries full responsibility. It only implies a destructive action but does not disclose effects, reversibility, or required permissions. Minimal behavioral context is provided.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single sentence that is concise and front-loaded with the verb and object. No unnecessary information is present.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the low complexity and high schema coverage, the description covers the essential purpose. However, for a destructive tool, a note about irreversibility or permissions would improve completeness, so it is slightly above average.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, and the description adds no additional meaning beyond the schema. The baseline score is appropriate as the description does not enhance understanding of the parameters.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the action (remove), the resource (session-level custom policy rule), and the key parameter (by id). It is distinct from sibling tools like ssh-session-policy-list and ssh-session-policy-upsert.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description does not provide any guidance on when to use this tool versus alternatives such as ssh-session-policy-reset. It lacks context about prerequisites or situations where it should or should not be used.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

ssh-session-policy-resetA

Reset the current session custom policy rules back to the inherited defaults loaded from configuration.

ParametersJSON Schema
NameRequiredDescriptionDefault
sessionNoSession id, session ref, or session name. Defaults to the active session

TDQS

A3.8/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description bears full responsibility. It discloses the reset action and the result (back to inherited defaults), but does not mention side effects, permissions, or immediacy. Adequate for a simple operation.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single sentence that front-loads the verb and resource. Every word is necessary, no redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple reset operation with one optional parameter and no output schema, the description sufficiently conveys the tool's effect. It could optionally mention the return behavior, but it is not deficient.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100% for the single optional 'session' parameter, which already explains its meaning and default. The tool description adds no extra parameter-level information beyond noting 'current session', which is consistent with the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the action ('Reset') and the target ('current session custom policy rules'), and distinguishes from sibling tools like ssh-session-policy-upsert and ssh-session-policy-remove by specifying 'back to inherited defaults'.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies usage when wanting to revert custom policy rules to defaults, but does not explicitly state when to use this tool versus alternatives (e.g., manually removing rules). No when-not-to-use guidance is provided.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

ssh-session-policy-upsertA

Add or update a session-level custom policy rule. Session rules are applied after immutable built-in hard blocks and before the built-in safe/full warning set.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesStable rule id used for future updates or removal
modeNoWhich operation mode the rule applies to
flagsNoOptional JavaScript regex flags, for example i or gi
actionYeserror blocks the command, warning allows it with warning metadata, log only annotates it
enabledNoWhether the rule is active. Defaults to true
messageYesHuman-readable reason shown when the rule matches
patternYesJavaScript regular expression source without surrounding slashes
sessionNoSession id, session ref, or session name. Defaults to the active session
categoryYesRule category shown in blocked/warned responses
priorityNoLower numbers run earlier within the same severity band
suggestionNoOptional remediation hint shown alongside the message

TDQS

A3.7/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations; description adds context about rule application order (after hard blocks, before warnings) but lacks details on side effects, authentication needs, or whether updates affect existing sessions.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences, front-loaded with action, no wasted words.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Adequate but leaves gaps: no output schema, no default for 'mode', no explanation of return value. For 11 parameters, additional context on update behavior would help.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so description adds no further parameter meaning beyond what schema provides. Baseline score of 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Description clearly states 'Add or update a session-level custom policy rule' with specific verb and resource, and distinguishes the rule's position relative to other policy layers.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Implies usage via rule ordering but does not explicitly state when to use vs alternatives like ssh-session-policy-list or ssh-session-policy-reset. No guidance on when to add vs update.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

ssh-session-readA

Read raw buffered terminal output from an SSH PTY session. Supports optional long-polling for new terminal output.

ParametersJSON Schema
NameRequiredDescriptionDefault
offsetNoRead from this output offset. If omitted, return the latest tail
sessionNoSession id, session ref, or session name. Defaults to the active session
maxCharsNoMaximum chars to return
waitForChangeMsNoWait up to this many milliseconds for new terminal output before returning

TDQS

A3.7/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries full burden. It discloses that it reads buffered output and supports long-polling, but does not mention behaviors like behavior when no data, connection state requirements, or error handling.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences, no fluff. The first sentence states core purpose, the second adds a key feature. Front-loaded and efficient.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 4-parameter tool with no output schema and no annotations, the description covers basic functionality but lacks details on return format, error conditions, and when to use specific parameters like offset or maxChars.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the baseline is 3. The description adds context about 'long-polling' which relates to waitForChangeMs, but does not significantly enhance understanding of parameters beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the verb 'Read' and the resource 'raw buffered terminal output from an SSH PTY session'. It distinguishes from sibling tools like ssh-session-send or ssh-session-control by specifying it reads output, and mentions optional long-polling as a unique feature.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No explicit guidance on when to use this tool versus alternatives like ssh-session-watch or ssh-session-history. The description implies it is for reading current buffered output, but lacks exclusions or context about alternatives.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

ssh-session-resizeA

Resize the PTY window of an interactive SSH session.

ParametersJSON Schema
NameRequiredDescriptionDefault
colsYesNew column count
rowsYesNew row count
sessionNoSession id, session ref, or session name. Defaults to the active session

TDQS

A3.5/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description states it resizes a PTY window, implying modification of session state. However, without annotations, more context (e.g., is it safe during command execution, does it revert on disconnect) would be beneficial. It is adequate but minimal.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single, front-loaded sentence that directly conveys the purpose with no superfluous information. Every word earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's simplicity and no output schema, the description covers the core action. However, it omits context like dependency on an active session or potential impact on ongoing input/output, leaving some gaps for agents.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

All three parameters have descriptions in the schema, so the baseline is 3. The description does not add additional meaning beyond what the schema provides (row/col counts and session identifier).

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly identifies the verb 'resize' and the resource 'PTY window of an interactive SSH session'. It distinguishes this tool from siblings like ssh-session-open or ssh-session-send by specifying the specific action.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No guidance is provided on when to use this tool versus alternatives, prerequisites (e.g., an active SSH session), or when not to use it. This lacks context for an agent to decide appropriately.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

ssh-session-sendA

Send raw input to an interactive SSH PTY session. Actor is shown inline in the dashboard transcript.

ParametersJSON Schema
NameRequiredDescriptionDefault
actorNoLabel for the sender shown inline in the dashboard, e.g. codex, claude, user
inputYesRaw text to send into the PTY
sessionNoSession id, session ref, or session name. Defaults to the active session
appendNewlineNoAppend a newline after the input

TDQS

A4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description must carry full burden. It discloses that the actor is shown in the dashboard, but does not mention side effects, permissions, or that the session must be open, which is critical for a mutation tool.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Single sentence that is front-loaded and contains no filler. Every word contributes to clarity and purpose.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple send tool, the description is reasonably complete. However, it omits mention of return behavior and prerequisites (e.g., session must be active), which would be helpful given no output schema.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so baseline 3. The description adds value by explaining that the 'actor' parameter controls the label shown in the dashboard, which complements the schema description. Other parameters are adequately covered by schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Description clearly states the verb 'Send' and resource 'raw input to an interactive SSH PTY session', and distinguishes from sibling tools like ssh-session-read (reads output) and ssh-run (non-interactive command execution).

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies usage for sending input to an interactive session but does not explicitly state when to use it versus alternatives (e.g., ssh-run) or provide prerequisites like an active session.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

ssh-session-set-activeB

Set or clear the active session used by tools when the session argument is omitted.

ParametersJSON Schema
NameRequiredDescriptionDefault
sessionNoSession id, session ref, or session name. Omit to clear the active session

TDQS

B3.4/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, description carries full burden but only states basic set/clear behavior, missing side effects, scope, permissions, or lifecycle impact of the active session.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Single sentence, no redundancy, but could benefit from slight restructuring for readability; overall very concise and front-loaded.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given simplicity (one optional param, no output schema) and numerous siblings, description is adequate but lacks guidance on when to set vs clear and overall active session impact.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so baseline is 3; tool description adds context about why the session matters (omission in other tools), but does not significantly enhance parameter meaning beyond the schema's description.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Description clearly states the action (set or clear) and the resource (active session), distinguishing it from sibling tools like ssh-session-open or ssh-session-list, which have different purposes.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Description implies usage as a default for other tools that omit session argument, but provides no explicit when-to-use or alternatives, leaving context implied rather than stated.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

ssh-session-watchA

Long-poll an SSH PTY session and render a terminal-style dashboard with inline actor markers.

ParametersJSON Schema
NameRequiredDescriptionDefault
sessionNoSession id, session ref, or session name. Defaults to the active session
eventSeqNoWait until transcript events grow beyond this sequence number
outputOffsetNoWait until terminal output grows beyond this offset
dashboardWidthNoRendered dashboard width in columns
dashboardHeightNoRendered dashboard height in rows
waitForChangeMsNoLong-poll duration in milliseconds
includeDashboardNoInclude the rendered dashboard text in the tool response
stripAnsiFromLeftNoStrip ANSI escape sequences from rendered SSH output
dashboardLeftCharsNoHow many recent transcript chars to retain in the rendered viewer
dashboardRightEventsNoHow many recent input/control/lifecycle events to retain for actor markers

TDQS

A3.7/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description discloses the key behaviors: long-polling (waiting for changes) and rendering a dashboard. However, it does not elaborate on whether the tool is read-only, if it has side effects, or any rate limits. Given no annotations, more detail would be beneficial.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single sentence that is front-loaded with the action and outcome. Every part of the sentence is meaningful, with no wasted words.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool has 10 configurable parameters and no output schema, the description provides a high-level understanding but lacks details on what the dashboard looks like, the response format, or the meaning of 'inline actor markers'. It is adequate but not fully comprehensive.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, with each parameter described in the schema. The tool description does not add additional meaning beyond the schema, so it meets the baseline of 3. No extra parameter semantics are provided.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's action ('Long-poll an SSH PTY session') and its outcome ('render a terminal-style dashboard with inline actor markers'). It distinguishes from sibling tools like ssh-session-read (which reads output) and ssh-session-send (which sends input).

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies usage for monitoring a session with a dashboard, but does not explicitly state when to use this tool over alternatives like ssh-session-read or ssh-session-history. No exclusions or prerequisites are mentioned.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

ssh-statusA

Quick status check: list active sessions, viewer URL, connection state. Use this to check if a session is already running.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A3.6/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Without annotations, the description must disclose behavioral traits. It describes the tool as a quick status check, implying read-only behavior, but does not explicitly state that no modifications occur, nor does it mention authentication requirements or other potential side effects. For a simple read operation, this is minimally adequate but could be more explicit.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is exceptionally concise, with only two sentences (15 words) that front-load the action and purpose. Every word adds value, and there is no redundant or extraneous content.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool has no parameters, no output schema, and many sibling tools, the description provides a basic outline of what it returns (list of sessions, viewer URL, connection state). However, it lacks details on the output format or how it compares to similar tools, making it minimally complete but insufficient for a fully informed choice.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema has no parameters, so schema description coverage is 100%. The description does not need to add parameter details, and the baseline score of 4 applies because there are no parameters to explain.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool lists active sessions, viewer URL, and connection state, and provides a specific use case (check if a session is running). However, it does not explicitly differentiate from similar sibling tools like ssh-session-list, which also lists sessions, though the 'quick status check' phrasing implies a lighter operation.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description includes 'Use this to check if a session is already running,' which provides some context, but it does not specify when to use this tool versus alternatives like ssh-session-diagnostics or ssh-session-list, nor does it mention any exclusions or prerequisites.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

ssh-viewer-ensureA

Ensure that a viewer exists for a session. Terminal mode is singleton-scoped and will reuse a running viewer instead of opening duplicates.

ParametersJSON Schema
NameRequiredDescriptionDefault
modeNoViewer launch mode
sessionNoSession id, session ref, or session name. Defaults to the active session
singletonScopeNoDeduplication scope for terminal viewers

TDQS

A3.5/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations provided, so description carries full burden. It reveals singleton-scoping for terminal mode but does not disclose potential side effects (e.g., launching a browser viewer), required permissions, error conditions, or state modifications beyond ensuring existence.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences: first states purpose, second adds key behavioral detail. No extraneous information. Highly efficient.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema and no annotations, the description is somewhat incomplete. It explains terminal mode behavior but not browser mode, return values, or error scenarios. For a tool with 3 optional parameters, some usage context is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema provides 100% coverage with descriptions for all 3 parameters. Description adds context about terminal mode singleton-scoping, which enhances understanding of mode and singletonScope. However, overall parameter explanation is already adequate in schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool ensures a viewer exists for a session, with specific behavior for terminal mode. It distinguishes from sibling ssh-viewer-list which lists viewers, and other session tools.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description notes terminal mode reuses running viewers, but does not explicitly contrast with browser mode or explain when to use this tool over alternatives like ssh-viewer-list or ssh-session-open. Some guidance is implied but not explicit.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

ssh-viewer-listB

List persisted local viewer processes and their current binding state.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

B3.4/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are present, so the description bears full responsibility for behavioral disclosure. It states the tool lists processes (a read operation), but does not mention whether authentication is needed, if there are side effects, or what happens if no processes exist. This is insufficient for a tool with zero annotation coverage.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single, concise sentence immediately stating the action and scope. It is front-loaded and contains no extraneous information, making it highly efficient for an AI agent to parse.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Without an output schema, the description should explain the return format, but it only vaguely mentions 'list processes and their current binding state'. It lacks details on data structure, pagination, or error conditions, leaving significant gaps for an agent invoking the tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

There are no parameters, and the schema coverage is 100%. The description adds context by clarifying what is listed (processes and binding state), which is meaningful beyond the empty schema. A baseline of 4 is appropriate given zero parameters and clear description of the output scope.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb 'List' and identifies the resource 'persisted local viewer processes' along with their 'current binding state'. This clearly differentiates from sibling tools like ssh-session-list or ssh-device-list, which focus on different resources.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No guidance is provided on when to use this tool versus alternatives such as ssh-session-list or ssh-viewer-ensure. The description does not mention prerequisites, side effects, or any conditions that would make it preferable.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections. Dates show when Glama detected each change.

  1. 23 tool updatesv2.8.0
    • First observedssh-command-status
    • First observedssh-device-list
    • First observedssh-quick-connect
    • First observedssh-retry
    • First observedssh-run
    • First observedssh-session-close
    • First observedssh-session-control
    • First observedssh-session-diagnostics
    • First observedssh-session-history
    • First observedssh-session-list
    • First observedssh-session-open
    • First observedssh-session-policy-list
    • First observedssh-session-policy-remove
    • First observedssh-session-policy-reset
    • First observedssh-session-policy-upsert
    • First observedssh-session-read
    • First observedssh-session-resize
    • First observedssh-session-send
    • First observedssh-session-set-active
    • First observedssh-session-watch
    • First observedssh-status
    • First observedssh-viewer-ensure
    • First observedssh-viewer-list

TDQS

A3.7/5.0
Disambiguation5/5

All tools have clearly distinct purposes, with specific actions on different resources (devices, sessions, viewers, policies). No two tools overlap in functionality.

Naming Consistency4/5

Prefix 'ssh-' is consistent, and most tools follow a 'resource-action' pattern (e.g., ssh-session-open). Minor deviations include 'ssh-run', 'ssh-status', and 'ssh-retry' which drop the 'session-' prefix despite being session-related.

Tool Count4/5

23 tools is on the higher end but justified by the breadth of SSH session management (lifecycle, policy, viewer, diagnostics). Each tool has a specific role, so the count feels well-scoped.

Completeness5/5

The tool set covers the full lifecycle of SSH sessions: connect, interact, monitor, close, plus policy and viewer management. No obvious gaps for the stated domain of interactive SSH PTY sessions.

Maintenance

ActivityStale
ResponsivenessSyncing

Resources

Unclaimed servers have limited discoverability.

Looking for Admin?

If you are the server author, to access and configure the admin panel.

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    C
    maintenance
    Terminal-first SSH access for MCP clients and AI agents, enabling interactive remote sessions, file uploads, and stateful workflows.
    11
    1
    MIT
  • A
    license
    A
    quality
    A
    maintenance
    MCP server for SSH and local terminal access. Supports interactive commands, long-running processes, and TUI apps like tmux/zellij
    6
    3
    MIT
  • F
    license
    Not graded
    quality
    D
    maintenance
    Enables SSH interactive session management through MCP, supporting commands, menus, and session lifecycle operations.
    1
    -
  • A
    license
    A
    quality
    B
    maintenance
    SSH orchestration MCP server for coding agents, enabling persistent bash sessions, hash-protected remote file editing, SFTP transfers, SSH tunnels, and multi-host orchestration with connection reuse across tools.
    14
    3
    Apache 2.0

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/Zw-awa/ssh-session-mcp'

If you have feedback or need assistance with the MCP directory API, please join our Discord server