Shell Proxy

Created By
aliforever3 months ago
shellproxy is a clean command execution proxy for AI agents, solving the "terminal blindness" problem — garbage characters, ANSI escape codes, shell init noise, and encoding issues that make AI agents unable to read terminal output. It sits between AI agents and terminals, executing commands in a clean, controlled environment and returning structured JSON output.
Overview

shellproxy

shellproxy is a clean command execution proxy for AI agents, solving the "terminal blindness" problem — garbage characters, ANSI escape codes, shell init noise, and encoding issues that make AI agents unable to read terminal output.

It sits between AI agents and terminals, executing commands in a clean, controlled environment and returning structured JSON output.


Features

  • ANSI stripping — removes all color codes, cursor movements, and control sequences
  • Shell init bypass — runs bash --norc --noprofile, PowerShell with -NoProfile, etc.
  • Auto shell detection — prefers WSL bash on Windows, falls back to cmd; bash/sh on Unix
  • Structured JSON outputexit_code, stdout, stderr, duration_ms, shell, truncated
  • Streaming mode — line-by-line output for long-running commands
  • File output — write results to a file in addition to stdout
  • MCP server — exposes run_command and run_command_stream as MCP tools
  • Configurable — env vars, config file ~/.shellproxy.json, or CLI flags

Installation

Unix (Linux, macOS, WSL)

curl -sSL https://raw.githubusercontent.com/aliforever/shellproxy/main/install.sh | sh

Windows (PowerShell)

irm https://raw.githubusercontent.com/aliforever/shellproxy/main/install.ps1 | iex

From source

git clone https://github.com/aliforever/shellproxy
cd shellproxy
go build -o shellproxy .

Usage

Run a command (buffered)

shellproxy run "echo hello world"

Output:

{
  "exit_code": 0,
  "stdout": "hello world\n",
  "stderr": "",
  "duration_ms": 12,
  "shell": "wsl",
  "truncated": false
}

Run with plain text output

shellproxy run --output text "ls -la"

Stream output line by line

shellproxy run --stream "npm install"

Output:

[stdout] added 342 packages in 4.2s
[stdout] found 0 vulnerabilities
--- exit_code: 0 | duration: 4213ms | shell: wsl ---

Write result to file

shellproxy run --file /tmp/result.json "go build ./..."

Specify a shell explicitly

shellproxy run --shell cmd "dir"
shellproxy run --shell bash "cat /etc/os-release"
shellproxy run --shell pwsh "Get-Date"

Inject environment variables

shellproxy run --env "NODE_ENV=production" --env "PORT=8080" "node server.js"

Set a timeout

shellproxy run --timeout 30 "long-running-command"

Truncate large output

shellproxy run --truncate 4096 "cat large-file.log"

MCP Server Mode

Start shellproxy as an MCP server over stdio:

shellproxy serve

AI Client Configuration

Add shellproxy to your AI client's MCP config:

{
  "mcpServers": {
    "shellproxy": {
      "command": "shellproxy",
      "args": ["serve"],
      "env": {
        "SHELLPROXY_SHELL": "auto",
        "SHELLPROXY_TIMEOUT": "60"
      }
    }
  }
}

Available MCP Tools

ToolDescription
run_commandExecute a command and return complete JSON result
run_command_streamExecute a command and return output line-by-line

run_command parameters:

ParameterTypeRequiredDescription
commandstringShell command to execute
shellstringauto, cmd, bash, wsl, pwsh, sh
cwdstringWorking directory
timeout_secondsnumberTimeout (0 = no limit)
envobjectExtra env vars as {"KEY": "VALUE"}
truncate_bytesnumberMax output size in bytes

Configuration

shellproxy can be configured via environment variables or a JSON config file.

Config file: ~/.shellproxy.json

{
  "shell": "auto",
  "timeout_seconds": 60,
  "strip_ansi": true,
  "output_mode": "buffered",
  "output_file": "",
  "truncate_bytes": 0
}

Environment variables

VariableDefaultDescription
SHELLPROXY_SHELLautoShell to use
SHELLPROXY_TIMEOUT60Timeout in seconds
SHELLPROXY_STRIP_ANSItrueStrip ANSI codes (0/false to disable)
SHELLPROXY_OUTPUT_MODEbufferedbuffered, stream, or file
SHELLPROXY_OUTPUT_FILEFile path for file output mode
SHELLPROXY_TRUNCATE_BYTES0Truncate output at N bytes
SHELLPROXY_CONFIG~/.shellproxy.jsonOverride config file path

Global Flags

Flags:
  --shell string    Shell to use: auto, cmd, bash, wsl, pwsh, sh (default "auto")
  --timeout int     Command timeout in seconds 0 = no timeout (default 60)
  --strip-ansi      Strip ANSI escape codes from output (default true)
  -h, --help        help for shellproxy

Building from Source

# Build for current platform
make build

# Build for all platforms
make build-all

# Run tests
make test

# Run specific test suites
make test-strip      # ANSI stripping tests
make test-detect     # Shell detection tests
make test-exec       # Integration exec tests

License

MIT

Server Config

{
  "mcpServers": {
    "shellproxy": {
      "command": "shellproxy",
      "args": [
        "serve"
      ],
      "env": {
        "SHELLPROXY_SHELL": "auto",
        "SHELLPROXY_STRIP_ANSI": "true",
        "SHELLPROXY_TIMEOUT": "60"
      }
    }
  }
}
Project Info
Created At
3 months ago
Updated At
3 months ago
Author Name
aliforever
Star
-
Language
-
License
-
Category

Recommend Servers

View All
Bring your real authenticated browser session to AI coding agents. Local-first MCP server + Chrome MV3 extension. No cloud. No telemetry.
@Cubenest

peek records the user's actual logged-in browser (DOM via rrweb, console events, network metadata, optional response bodies via opt-in Deep capture) through a Chrome MV3 extension. The extension ships events through a native-messaging stdio bridge to a local MCP server (peek-mcp), which persists them to a SQLite database at ~/.peek/sessions.db. AI coding agents (Claude Code, Cursor, Cline, Windsurf) read sessions from the database via 10 MCP tools: Tool What it does list_recent_sessions List recently recorded sessions (id, origin, ts, event count). get_session_summary LLM-readable narrative summary of a session. get_session_console_errors Console errors recorded in a session. get_session_network_errors Failed/notable network requests in a session. get_user_action_before_error Last N user actions before a console error. generate_playwright_repro Generate a runnable Playwright test from a session. get_dom_snapshot Reconstruct the DOM at a given timestamp. query_dom_history Timeline of attribute/text changes for a selector. request_authorization Side-panel consent for write actions (Level 3). execute_action Dispatch a UI action (gated by permission level + destructive blocklist). Why local-first matters Every other "browser session for AI" tool ships to a vendor cloud. peek's SQLite + extension live on the user's machine — no remote endpoints, no telemetry. The privacy policy (docs/peek/PRIVACY_POLICY.md) is the source of truth. Install # 1. Add the MCP server to Claude Code claude mcp add peek -- npx -y @peekdev/mcp # 2. Install the Chrome extension from the Chrome Web Store # (link added once the CWS listing is approved)

a day ago