remote-shell-mcp
Supports persistent interactive sessions to Docker containers, allowing AI assistants to run commands, transfer files, and manage containers via SSH-like access.
Supports persistent interactive sessions to Kubernetes pods via kubectl exec, enabling AI assistants to run commands, view logs, and manage containerized applications in a cluster.
Supports persistent interactive sessions to Vagrant-managed virtual machines, providing SSH-like access for AI assistants to manage and interact with the VM environment.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@remote-shell-mcp SSH into my server and tail the logs"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
Remote Shell MCP Server
Persistent SSH sessions for AI assistants. Give Claude, GPT, or any MCP-compatible AI the ability to maintain long-running remote shell connections—just like Warp does for developers.
What's New in v5.0
Feature | Description |
TTY Input | Respond to interactive prompts (passwords, confirmations) directly |
Swarm Mode | Launch parallel SSH sessions to multiple machines simultaneously |
Broadcast Commands | Execute the same command across all machines in a swarm |
Real-time Streaming | Monitor output in real-time with error pattern detection |
Auto-Interrupt | Automatically send Ctrl+C when errors are detected |
Related MCP server: mcp-ssh-terminal
What's New in v4.0
Feature | Description |
Block-Based Output | Warp-style command blocks with search, tagging, and copy |
Pane Management | tmux-style split panes for multi-view sessions |
Session Sharing | Real-time collaboration with shareable URLs |
Enhanced Persistence | Session state persistence and faster reconnection |
Heartbeat Monitoring | Faster disconnect detection |
The Problem
AI assistants can't maintain persistent connections to remote servers. Every command runs in isolation:
AI: Let me SSH into your server and check the logs.
AI: [runs: ssh user@server "cat /var/log/app.log"] # Opens connection, runs, closes
AI: Now let me check disk space.
AI: [runs: ssh user@server "df -h"] # Opens ANOTHER connection, runs, closesThis means:
No session state — environment variables, working directory, and context are lost
Repeated authentication — every command requires a new SSH handshake
No file transfers — can't easily upload configs or download logs
Broken workflows — can't
cdto a directory and then run commands there
The Solution
Remote Shell MCP provides Warp-like persistent shell sessions for AI assistants:
AI: [starts session → ssh user@server]
AI: [runs: cd /var/log] # Working directory persists
AI: [runs: tail -f app.log] # Can run interactive commands
AI: [sends: Ctrl+C] # Can send signals
AI: [downloads: error.log] # Can transfer files
AI: [forwards: 5432 → postgres] # Can forward ports
AI: [shares session] # Collaborate in real-time
AI: [ends session] # Explicit close when doneFeatures
Core Features
Feature | Description |
Auto-Detection | Recognizes SSH commands and starts sessions automatically |
Persistent Sessions | Connections stay open until explicitly closed |
Multi-Cloud Support | GCP, AWS, Azure, plain SSH, kubectl, docker, vagrant |
Multiple Sessions | Run concurrent connections with easy switching |
Signal Support | Send Ctrl+C (SIGINT), SIGTERM, SIGKILL |
Auto-Cleanup | Stale sessions cleaned up after 1 hour |
v4.0 Features
Feature | Description |
Blocks | Every command creates a searchable, taggable block |
Panes | Split view with broadcast commands |
Sharing | Real-time session collaboration |
Persistence | State saved to disk for recovery |
Heartbeat | Fast disconnect detection |
v3.0 Features
Feature | Description |
File Transfer |
|
Port Forwarding |
|
Smart Wait | Auto-adjusts timeout: 500ms for |
Directory Tracking | Tracks |
Auto-Reconnect | Configurable reconnection with backoff |
Output Search |
|
Installation
Prerequisites
Node.js 18+
npm or yarn
An MCP-compatible AI client (Claude Code, Claude Desktop, etc.)
Setup
# Clone the repository
git clone https://github.com/raghavharness/remote-shell-mcp
cd mcp-remote-shell
# Install dependencies
npm install
# Build
npm run buildConfigure Claude Code
Add to ~/.claude/settings.json:
{
"mcpServers": {
"remote-shell": {
"command": "node",
"args": ["/path/to/mcp-remote-shell/dist/index.js"]
}
}
}Usage
The shell Tool
The primary interface. Auto-detects remote commands and manages sessions:
# Start a session (auto-detected):
shell(command="ssh user@hostname")
shell(command="gcloud compute ssh my-vm --zone us-central1-a")
# Run commands in session:
shell(command="ls -la")
shell(command="cd /var/log")
# Smart wait auto-adjusts for slow commands:
shell(command="npm install") # Waits 20s automatically
# Interrupt (Ctrl+C):
shell(command="//stop")
# End session:
shell(command="//end")Block-Based Output (NEW in v4.0)
Every command creates a block that can be referenced later:
# List recent blocks
remote_blocks_list(limit=10)
# Get a specific block
remote_block_get(blockId="block-5")
# Search through blocks
remote_blocks_search(query="error")
# Copy just the output (no command)
remote_block_copy(blockId="block-5")
# Tag blocks for organization
remote_block_tag(blockId="block-5", tags=["important", "debug"])
# Find error blocks
remote_blocks_errors()Pane Management (NEW in v4.0)
tmux-style panes within a session:
# Split the current pane
remote_pane_split(direction="horizontal")
remote_pane_split(direction="vertical")
# List panes
remote_pane_list()
# Switch to a pane
remote_pane_focus(paneId="pane-1")
# Run command in specific pane (without switching)
remote_pane_exec(paneId="pane-1", command="tail -f /var/log/app.log")
# Broadcast command to ALL panes
remote_pane_broadcast(command="uptime")
# Close a pane
remote_pane_close(paneId="pane-1")TTY Input (NEW in v5.0)
Respond to interactive prompts directly:
# Check if session is waiting for input
remote_session_check_prompt()
# Send text input
remote_session_input(input="my-response")
# Send password (hidden in output)
remote_session_password(password="secret123")
# Send Y/N confirmation
remote_session_confirm(confirm=true)Swarm Mode (NEW in v5.0)
Launch parallel SSH sessions to multiple machines:
# Create a swarm of SSH connections
remote_swarm_create(
name="web-servers",
method="ssh",
targets=[
{ "id": "web1", "host": "10.0.0.1", "username": "admin" },
{ "id": "web2", "host": "10.0.0.2", "username": "admin" },
{ "id": "web3", "host": "10.0.0.3", "username": "admin" }
]
)
# Create a GCloud swarm
remote_swarm_create(
name="gcp-cluster",
method="gcloud",
targets=[
{ "id": "node1", "instance": "gke-node-1", "zone": "us-central1-a" },
{ "id": "node2", "instance": "gke-node-2", "zone": "us-central1-a" }
]
)
# Broadcast command to all targets
remote_swarm_exec(swarmId="swarm-1", command="uptime")
remote_swarm_exec(swarmId="swarm-1", command="df -h")
# Send input to all sessions (e.g., for sudo password)
remote_swarm_input(swarmId="swarm-1", input="mypassword")
# Interrupt all sessions
remote_swarm_interrupt(swarmId="swarm-1")
# List swarms
remote_swarm_list()
# Get detailed swarm status
remote_swarm_status(swarmId="swarm-1")
# End a swarm
remote_swarm_end(swarmId="swarm-1")
remote_swarm_end(swarmId="all") # End all swarmsReal-time Streaming (NEW in v5.0)
Enable real-time output streaming with error detection:
# Enable streaming with auto-interrupt on errors
remote_stream_enable(autoInterrupt=true)
# Add custom error patterns
remote_stream_enable(
autoInterrupt=true,
errorPatterns=["CRITICAL", "OutOfMemory", "Segfault"]
)
# Check streaming status
remote_stream_status()
# Disable streaming
remote_stream_disable()When streaming is enabled:
Output is monitored in real-time
Error patterns are detected immediately
Interactive prompts are detected
Auto-interrupt sends Ctrl+C when errors are found
Session Sharing (NEW in v4.0)
Share sessions for real-time collaboration:
# Share the current session
remote_session_share(permissions="view")
# Returns: http://localhost:3847/share/abc123
# Share with control access and password
remote_session_share(permissions="control", password="secret123")
# List active shares
remote_shares_list()
# Update share settings
remote_share_update(shareId="abc123", permissions="control")
# Stop sharing
remote_session_unshare()File Transfer
# Upload a local file to remote:
remote_file_upload(localPath="./config.yml", remotePath="/etc/myapp/config.yml")
# Download a remote file:
remote_file_download(remotePath="/var/log/app.log", localPath="./app.log")
# List remote directory:
remote_file_list(path="/var/log")Port Forwarding
# Local forward: access remote PostgreSQL on localhost:5433
remote_port_forward_local(localPort=5433, remoteHost="localhost", remotePort=5432)
# Remote forward: expose local dev server to remote
remote_port_forward_remote(remotePort=8080, localPort=3000)
# List active forwards:
remote_port_list()
# Stop a forward:
remote_port_stop(forwardId="fwd-1")Supported Connection Types
Type | Pattern | Example |
SSH |
|
|
GCP |
|
|
AWS |
|
|
Azure |
|
|
Kubernetes |
|
|
Docker |
|
|
Control Sequences & MCP Prompts
Every control sequence has a corresponding MCP prompt:
Exit Session
Sequence | MCP Prompt | Aliases |
|
|
|
|
|
Interrupt Command
Sequence | MCP Prompt | Aliases |
|
|
|
Blocks
MCP Prompt | Description |
| List recent command blocks |
| Get a specific block |
| Search through blocks |
| Find error blocks |
| Tag a block |
Panes
MCP Prompt | Description |
| Split current pane |
| List panes |
| Switch to pane |
| Close a pane |
| Broadcast command to all panes |
Sharing
MCP Prompt | Description |
| Share current session |
| Stop sharing |
| List active shares |
All Tools (50)
Tool | Purpose |
Core | |
| Primary tool - execute commands, auto-detect sessions |
| Start session with explicit parameters |
| List all sessions with details |
| Switch between sessions |
| End session(s) |
| View command history |
| Get raw output buffer |
| Send signals |
| Search history/output |
| Find error messages |
Files | |
| Upload file to remote |
| Download file from remote |
| List remote directory |
Ports | |
| Start local port forward |
| Start remote port forward |
| List port forwards |
| Stop port forward |
| Stop all port forwards |
Blocks (v4.0) | |
| List command blocks |
| Get specific block |
| Search blocks |
| Copy block output |
| Tag a block |
| Remove block tags |
| Toggle block collapsed |
| Find error blocks |
Panes (v4.0) | |
| Split pane |
| Focus pane |
| Close pane |
| List panes |
| Execute in specific pane |
| Broadcast to all panes |
| Rename pane |
| Focus next pane |
Sharing (v4.0) | |
| Share session |
| Stop sharing |
| List shares |
| Update share settings |
| Start share server |
| Stop share server |
Swarm (v5.0) | |
| Create parallel session swarm |
| List active swarms |
| Get swarm details |
| Broadcast command to swarm |
| Send input to all swarm sessions |
| Interrupt all swarm sessions |
| End swarm |
| Add target to swarm |
| Remove target from swarm |
Input/Streaming (v5.0) | |
| Send input to session |
| Check for pending prompts |
| Send Y/N confirmation |
| Send password (hidden) |
| Enable real-time streaming |
| Disable streaming |
| Get streaming status |
Smart Wait Time
Commands automatically get appropriate timeouts:
Command Type | Wait Time | Example |
Quick info | 500ms |
|
File read | 1s |
|
Search | 3s |
|
Default | 2s | Most commands |
Network | 10s |
|
Package install | 15-30s |
|
Build | 20-60s |
|
Override with explicit waitTime parameter when needed.
Example Workflow
User: Connect to prod and figure out why the app is slow
Claude: [shell: gcloud compute ssh prod-server --project myapp]
Session started: gcloud:prod-server
Working directory: /home/user
Claude: [shell: top -bn1 | head -20]
CPU at 95%! Checking what's using it...
[block-1]
Claude: [shell: ps aux --sort=-%cpu | head -10]
App process using 92% CPU.
[block-2]
Claude: [remote_blocks_search: query="error"]
Found 3 matches in block history...
Claude: [remote_pane_split: direction="horizontal"]
Split into 2 panes for monitoring
Claude: [remote_pane_exec: paneId="pane-1", command="tail -f /var/log/app.log"]
Watching logs in pane-1...
Claude: [remote_session_share: permissions="view"]
Shared session: http://localhost:3847/share/xyz789
(Ops team can watch live)
Claude: [shell: sudo systemctl restart myapp]
Service restarted.
Claude: [shell: //end]
Session ended. App should be recovering.Architecture
┌─────────────────┐ ┌───────────────────────────────┐ ┌─────────────────┐
│ AI Client │────▶│ Remote Shell MCP │────▶│ Remote Server │
│ (Claude Code) │ MCP │ Server │ │ (SSH/gcloud) │
└─────────────────┘ └───────────────────────────────┘ └─────────────────┘
│
┌───────────┴───────────┐
▼ ▼
┌───────────────┐ ┌───────────────┐
│Session Manager│ │ Features │
│ - Sessions │ │ - Blocks │
│ - Panes │ │ - Persistence │
│ - History │ │ - Sharing │
└───────────────┘ │ - FileTransfer│
│ - PortForward │
│ - SmartWait │
└───────────────┘
│
┌───────┴───────┐
▼ ▼
┌───────────┐ ┌───────────┐
│ WebSocket │ │ Web Client│
│ Server │──▶│ (Browser) │
└───────────┘ └───────────┘Module Structure
src/
├── index.ts # MCP server entry point
├── session-manager.ts # Session lifecycle management
├── types.ts # TypeScript interfaces
├── features/
│ ├── blocks.ts # Block-based output (v4.0)
│ ├── panes.ts # Pane management (v4.0)
│ ├── persistence.ts # Session persistence (v4.0)
│ ├── heartbeat.ts # Connection monitoring (v4.0)
│ ├── sharing/ # Session sharing (v4.0)
│ │ ├── share-manager.ts
│ │ └── ws-server.ts
│ ├── file-transfer.ts # SFTP/SCP operations
│ ├── port-forward.ts # Port forwarding
│ ├── smart-wait.ts # Command timeout logic
│ ├── directory-tracker.ts
│ ├── reconnect.ts
│ ├── output-search.ts
│ └── streaming.ts
├── tools/
│ ├── shell.ts # Main shell tool
│ ├── session-tools.ts # Session management
│ ├── file-tools.ts # File transfer tools
│ ├── port-tools.ts # Port forward tools
│ ├── block-tools.ts # Block tools (v4.0)
│ ├── pane-tools.ts # Pane tools (v4.0)
│ └── share-tools.ts # Share tools (v4.0)
├── prompts/
│ └── index.ts # MCP prompts
└── utils/
├── ansi.ts # Terminal formatting
├── terminal-ui.ts # UI helpers
└── patterns.ts # Command detectionDevelopment
# Install dependencies
npm install
# Build
npm run build
# Watch mode
npm run dev
# Run integration tests (local only)
npm test
# Run with live SSH (requires TEST_SSH_HOST, TEST_SSH_USER)
TEST_SSH_HOST=myserver TEST_SSH_USER=myuser npm testTroubleshooting
Session won't start
Ensure CLI tools are installed and authenticated (
gcloud auth login, etc.)Check SSH keys are configured
Commands timeout
Smart wait auto-adjusts, but override with
waitTimeparameterUse
//stopto interrupt stuck commands
File transfer fails
SSH2 sessions use SFTP (most reliable)
Child process sessions use base64 encoding
Port forward not working
Ensure local port is available
Check remote service is running
Share server issues
Default port is 3847
Use
remote_share_server_start(port=XXXX)to use a different portCheck firewall allows connections
License
MIT License - see LICENSE for details.
Keywords: MCP, Model Context Protocol, SSH, remote shell, AI tools, Claude, persistent sessions, terminal, DevOps, SFTP, port forwarding, cloud computing, tmux, panes, blocks, collaboration, sharing
Available Tools
56 toolsremote_block_collapseC
Toggle or set block collapsed state.
Inputs: blockId (required), collapsed.
remote_block_copyA
Get block output only (for copying).
Returns just the output without the command or metadata.
Inputs: blockId (required), stripAnsi.
remote_block_getA
Get a specific block by ID with full output.
Returns the complete command and output for a block.
Inputs: blockId (required), raw.
remote_blocks_errorsA
Find error blocks in session history.
Returns blocks that had errors (non-zero exit or error patterns).
Inputs: limit, sessionId.
remote_blocks_listB
List command blocks for a session.
Each command execution creates a "block" containing the command and its output. Blocks can be searched, tagged, and referenced by ID.
Inputs: limit, sessionId, showCollapsed.
remote_blocks_searchC
Search through command blocks.
Search command history and output across blocks.
Inputs: query (required), tags, limit, regex, +1 more.
remote_block_tagA
Add tags to a block for organization.
Tags can be used to filter blocks when searching.
Inputs: tags (required), blockId (required).
remote_block_untagA
Remove tags from a block.
Inputs: tags (required), blockId (required).
remote_file_downloadA
Download a file from the remote server to local machine.
Works with both SSH2 and child process sessions:
SSH2: Uses SFTP for efficient binary transfer
Child process: Uses base64 encoding through the shell
Example: Download logs or config files from a server.
Inputs: localPath (required), remotePath (required), sessionId.
remote_file_listA
List files in a remote directory with details (like ls -la).
Inputs: path (required), sessionId.
remote_file_uploadA
Upload a file from local machine to the remote server.
Works with both SSH2 and child process sessions:
SSH2: Uses SFTP for efficient binary transfer
Child process: Uses base64 encoding through the shell
Example: Upload a config file to the server.
Inputs: localPath (required), remotePath (required), sessionId.
remote_pane_broadcastA
Broadcast a command to all panes in a session.
Useful for running the same command in multiple contexts simultaneously.
Inputs: command (required), sessionId.
remote_pane_closeB
Close a pane (cannot close the last pane).
Inputs: paneId (required).
remote_pane_execA
Execute a command in a specific pane without switching focus.
Inputs: paneId (required), command (required).
remote_pane_focusC
Switch to a specific pane.
Inputs: paneId (required).
remote_pane_listA
List all panes for a session.
Inputs: sessionId.
remote_pane_nextB
Switch to the next pane in the session.
Inputs: sessionId.
remote_pane_renameB
Rename a pane for easier identification.
Inputs: name (required), paneId (required).
remote_pane_splitA
Split the current pane horizontally or vertically (tmux-style).
Creates a new pane within the session. Use for running multiple commands in parallel or monitoring.
Inputs: direction (required), paneId, sessionId.
remote_port_forward_localA
Start a LOCAL port forward (SSH -L style).
Listens on a local port and forwards connections to a port on the remote server.
Example: Access a database running on the remote server:
localPort: 5433
remoteHost: localhost
remotePort: 5432 → Connect to localhost:5433 to access the remote PostgreSQL
Inputs: localPort (required), remotePort (required), sessionId, remoteHost.
remote_port_forward_remoteA
Start a REMOTE port forward (SSH -R style).
Listens on a port on the remote server and forwards connections back to your local machine. Requires SSH2 session type.
Example: Expose a local dev server to the remote:
remotePort: 8080
localPort: 3000 → Remote server port 8080 forwards to your localhost:3000
Inputs: localPort (required), remotePort (required), localHost, sessionId.
remote_port_listA
List all active port forwards.
Inputs: sessionId.
remote_port_stopA
Stop a specific port forward by ID.
Inputs: forwardId (required), sessionId.
remote_port_stop_allA
Stop all port forwards for a session or all sessions.
Inputs: sessionId.
remote_session_check_promptA
Check if a session is waiting for user input (password, confirmation, etc.).
Returns details about any detected prompt and how to respond.
Inputs: sessionId.
remote_session_confirmA
Send a Y/N confirmation response to a session.
Inputs: confirm (required), waitTime, sessionId.
remote_session_endA
End remote session(s). Use sessionId='all' to end all sessions.
Inputs: sessionId.
remote_session_errorsA
Find error messages in session history (looks for 'error', 'failed', 'denied', etc.).
Inputs: limit, sessionId.
remote_session_historyB
Get command history for a session with working directories.
Inputs: limit, sessionId.
remote_session_inputA
Send input text to a session (respond to prompts, passwords, confirmations).
Use when a remote command is waiting for user input:
Password prompts
Y/N confirmations
Interactive text input
Any prompt ending with : or ?
Set hideInput=true for passwords to avoid logging sensitive data.
Inputs: input (required), waitTime, hideInput, sessionId, +1 more.
remote_session_outputB
Read recent raw output from session buffer.
Inputs: lines, sessionId.
remote_session_passwordA
Send a password to a session. Input is automatically hidden in responses.
Use when prompted for sudo password, SSH passphrase, or other secret input.
Inputs: password (required), waitTime, sessionId.
remote_session_searchC
Search through command history and output. Supports regex.
Inputs: query (required), limit, regex, sessionId, +2 more.
remote_session_signalA
Send a signal to the session (SIGINT=Ctrl+C, SIGTERM, SIGKILL, SIGHUP).
Inputs: signal (required), sessionId.
remote_session_startA
Start a remote shell session with explicit parameters. Use for fine-grained control.
For most cases, prefer the shell tool which auto-detects remote commands.
Inputs: method (required), host, port, zone, +12 more.
remote_session_statusA
Get status of all remote sessions with working directory, port forwards, and auto-reconnect status.
Inputs: no named parameters.
remote_session_switchA
Switch the active session when multiple sessions are open.
Inputs: sessionId (required).
remote_stream_disableB
Disable real-time streaming for a session.
Inputs: sessionId.
remote_stream_enableA
Enable real-time streaming for a session with error detection.
When enabled, the system monitors output in real-time for:
Error patterns (configurable)
Interactive prompts requiring input
Command completion
With autoInterrupt=true, it will automatically send Ctrl+C when errors are detected.
Inputs: sessionId, autoInterrupt, errorPatterns.
remote_stream_statusA
Get streaming status for a session (enabled, error count, pending prompts).
Inputs: sessionId.
remote_swarm_add_targetB
Add a new target to an existing swarm.
Inputs: target (required), swarmId (required), autoReconnect.
remote_swarm_createA
Create a swarm of parallel SSH sessions to multiple machines.
Swarms allow you to connect to multiple servers simultaneously and broadcast commands. Useful for managing clusters, fleets, or performing parallel operations.
Example targets for SSH: [{ "id": "web1", "host": "10.0.0.1", "username": "admin" }, { "id": "web2", "host": "10.0.0.2", "username": "admin" }]
Example targets for GCloud: [{ "id": "vm1", "instance": "my-vm-1", "zone": "us-central1-a" }, { "id": "vm2", "instance": "my-vm-2", "zone": "us-central1-a" }]
Inputs: name (required), method (required), targets (required), autoReconnect.
remote_swarm_endA
End a swarm, closing all its sessions. Use swarmId='all' to end all swarms.
Inputs: swarmId.
remote_swarm_execA
Broadcast a command to all sessions in a swarm (parallel execution).
Returns aggregated output from all targets. Use for running the same command across multiple machines.
Inputs: command (required), swarmId (required), parallel, waitTime, +1 more.
remote_swarm_inputA
Send input text to all sessions in a swarm.
Useful for responding to prompts (passwords, confirmations) across all targets.
Inputs: input (required), swarmId (required).
remote_swarm_interruptA
Send Ctrl+C (SIGINT) to all sessions in a swarm.
Inputs: swarmId (required).
remote_swarm_listA
List all active swarms with their status.
Inputs: no named parameters.
remote_swarm_remove_targetA
Remove a target from a swarm (closes its session).
Inputs: swarmId (required), targetId (required).
remote_swarm_statusA
Get detailed status of a specific swarm including all targets.
Inputs: swarmId (required).
shellA
PRIMARY TOOL - Intelligent shell command handler for remote sessions.
This tool automatically detects and handles:
Remote shell commands (ssh, gcloud compute ssh, aws ssm, az ssh, etc.) - Starts a persistent session
Regular commands when session is active - Executes in the remote session
Session control - Use special exit sequences to close the session
Smart Wait Time: Automatically adjusts wait time based on command type (longer for builds, shorter for ls).
Working Directory Tracking: Tracks cd commands and shows current directory in prompt.
Control sequences (to avoid conflict with normal commands):
~.or//end- End session and return to local shell//stopor//killor//ctrl-c- Send Ctrl+C (SIGINT) to interrupt running command
Auto-reconnect: Sessions automatically attempt to reconnect on disconnection.
Sessions auto-cleanup after 1 hour of inactivity. Output is displayed exactly as the terminal shows.
Inputs: command (required), stream, waitTime, forceNewSession.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
Loading tool schema changelog…
TDQS
Scored across 56 tools
The `shell` tool is described as the primary tool for remote commands and session control, but it overlaps heavily with `remote_session_start`, `remote_session_end`, `remote_session_signal`, and `remote_session_output`. Several session inspection tools (`remote_session_history`, `remote_session_output`, `remote_session_search`, `remote_session_errors`) also have fuzzy boundaries. An agent would struggle to decide whether to use `shell` or a dedicated `remote_session_*` tool in many situations.
Most tools follow a `remote_<resource>_<action>` pattern, but the `shell` tool breaks it by not having a `remote_` prefix. There are also minor inconsistencies in pluralization (e.g., `remote_blocks_list` vs `remote_block_get`, `remote_shares_list` vs `remote_session_*`). Overall the pattern is readable but not fully uniform.
With 56 tools, this server is heavily overweight. While the domain covers many features (sessions, files, ports, blocks, panes, sharing, swarms, streaming), the granularity is excessive. For example, there are 7 separate pane tools and 8 swarm tools, which feels bloated. A more concise set of 15-20 tools would likely cover the same functionality with less confusion.
The tool surface is exceptionally complete for a remote shell server. It covers session lifecycle, file transfer, port forwarding, command history, multi-pane management, session sharing, swarm operations, and streaming/error detection. There are no obvious missing operations; it even provides specialized input methods for prompts, passwords, and confirmations.
Maintenance
Related MCP Connectors
A persistent Linux computer for your AI: what it installs and writes survives the session.
Persistent Linux computers for AI agents: desktop, signed-in browser, vault, apps and shell.
Persistent cloud workspaces for AI agents: run commands, edit files, use git and a browser.
Remote shell and detached long-running jobs on your own machines — no SSH, open ports or VPN.
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceEnables AI assistants to maintain persistent SSH terminal sessions and transfer files to/from remote servers. Allows stateful command execution, natural language server management, and seamless file operations through SSH connections.5 npm36MIT
- AlicenseNot gradedqualityDmaintenanceEnables AI agents to have persistent, fully interactive SSH sessions into remote hosts, behaving like a local terminal.15 npm2MIT
- AlicenseAqualityBmaintenanceExposes persistent, stateful remote Bash sessions to AI agents via SSH, enabling command execution with preserved working directory and environment.772 npm1MIT
- AlicenseAqualityBmaintenanceEnables AI agents to establish and manage persistent SSH sessions, supporting smart command execution, async tasks, multi-host, sudo, and file operations through SFTP.1534 PyPIMIT