Remote Shell Mcp — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited Remote Shell Mcp (Agent Skill) and scored it 100/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 0 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 0 flagged
Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
Remote Shell MCP is a local MCP server that exposes agent-safe remote workspace tools over SSH.
The MVP focuses on a small remote code workspace surface:
profile_listprofile_getprofile_createprofile_updateprofile_deleteprofile_set_defaultworkspace_infosession_createsession_infosession_set_cwdsession_closelist_dirread_filewrite_fileedit_fileapply_patchsearchshellgit_statusgit_diff_statgit_changed_filesreview_changesThe server is intended to run locally. It connects to remote hosts over SSH/SFTP and restricts all file operations and command working directories to configured remote roots.
Create a config file from remote-shell.config.example.json, then point the server at it:
$env:REMOTE_SHELL_CONFIG = "C:\path\to\remote-shell.config.json"
npm run devAfter building:
{
"mcpServers": {
"remote-shell": {
"command": "node",
"args": ["C:\\path\\to\\remote-shell-mcp\\dist\\index.js"],
"env": {
"REMOTE_SHELL_CONFIG": "C:\\path\\to\\remote-shell.config.json"
}
}
}
}Run the local MCP smoke test first:
npm run build
npm run test:mcpThen install the server into Codex's global config:
powershell -ExecutionPolicy Bypass -File .\scripts\install-codex-config.ps1The script backs up %USERPROFILE%\.codex\config.toml and writes:
[mcp_servers.remote_shell]
command = 'C:\Program Files\nodejs\node.exe'
args = ['C:\Users\jeefy\Documents\RemoteShell\dist\index.js']
startup_timeout_sec = 30
[mcp_servers.remote_shell.env]
REMOTE_SHELL_CONFIG = 'C:\Users\jeefy\Documents\RemoteShell\remote-shell.config.json'Restart Codex, or start a new Codex thread, after changing MCP config.
defaultRoot.roots.expectedHash to avoid overwriting changed files.cwd must stay under an allowed root.Use sessions when a task has a working directory that should persist across multiple commands:
{ "cwd": "/root/project" }Then pass the returned sessionId to shell, git_status, git_diff_stat, git_changed_files, or review_changes.
shell supports three output modes:
json: default structured output with stdout/stderr fields.terminal: terminal-like plain text for easier reading.compact: line counts plus head/tail summaries for long output.Sessions store cwd and env only. They do not keep an interactive process alive; each command still runs as a separate SSH exec channel over the reused SSH connection.
For large working tree changes, prefer Git-specific tools over raw git status output:
git_status: parsed branch, ahead/behind, changed files, and counts.git_diff_stat: git diff --stat plus name-status lines.git_changed_files: changed files only.review_changes: compact status + diff stat + review hints.Within one running MCP server process, SSH connections are reused per profile. Each shell call opens a new exec channel over the existing SSH connection instead of creating a new SSH connection.
read_file uses a small in-memory cache when fileCache.enabled is true:
fileCache.maxFileBytes are cached.fileCache.ttlMs.write_file, edit_file, and apply_patch update or invalidate affected entries.shell clears the profile file cache because shell commands may modify arbitrary files.See docs/mvp-design.md for the MVP boundaries and extension points.
Profiles are stored in the JSON config file pointed to by REMOTE_SHELL_CONFIG.
Profile tools persist changes atomically:
profile_create fails with ERR_PROFILE_EXISTS when the name already exists.profile_update fails with ERR_PROFILE_NOT_FOUND when the name does not exist.profile_delete fails with ERR_PROFILE_NOT_FOUND when the name does not exist.profile_delete fails with ERR_DEFAULT_PROFILE_DELETE when deleting the default profile without newDefaultProfile.profile_delete fails with ERR_PROFILE_LAST_DELETE when deleting the only remaining profile.Secret fields such as password and passphrase are not returned by profile_list or profile_get.
apply_patch accepts Codex-style patches:
*** Begin Patch
*** Add File: hello.txt
+hello
+world
*** Update File: app.txt
@@
context
-old
+new
*** Delete File: old.txt
*** End PatchThe MVP supports Add File, Update File, and Delete File.
Update File hunks must match exactly once.Add File fails if the target already exists.Delete File fails if the target does not exist.expectedHashes can be provided for update/delete conflict checks.~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.