MCP-ShellJS
by erniebrodeur
Verified
# MCP-ShellJS
An MCP server that provides safe, controlled ShellJS access for LLMs like Claude.
## Overview
MCP-ShellJS bridges the Model Context Protocol (MCP) with ShellJS, enabling AI systems to execute shell commands within a secure sandbox. It provides controlled filesystem access with multiple security layers.
## Features
- **Simplified security**:
- Read-only mode by default
- Optional read-write mode via command line flag
- Optional exec permission via command line flag
- Schema-based validation with Zod
- Full ShellJS functionality (`ls`, `grep`, `sed`, `find`, etc.)
- TypeScript implementation with strong typing
- Simple API for LLM integration
## Installation
```bash
# Clone the repository
git clone https://github.com/yourusername/mcp-shelljs.git
cd mcp-shelljs
# Install dependencies
npm install
# Build the project
npm run build
```
## Usage
### Command Line
```bash
# Default mode (read-only)
node dist/index.js
# Enable read-write operations
node dist/index.js --enable-rw
# Enable exec command (careful!)
node dist/index.js --enable-exec
# Enable both
node dist/index.js --enable-rw --enable-exec
```
### TypeScript Integration
```typescript
// Import and initialize the MCP server
import { startMCPServer } from 'mcp-shelljs';
// Start the server with default configuration (read-only)
startMCPServer();
// Or with custom security configuration
startMCPServer({
enableRw: true, // Enable read-write operations
enableExec: false // Keep exec disabled
});
```
## Security Design
MCP-ShellJS implements a simple security model:
1. **Read-Only Mode** (Default): Only commands that don't modify the filesystem are available
2. **Read-Write Mode** (`--enable-rw`): Enables commands that can create, modify, or delete files
3. **Exec Mode** (`--enable-exec`): Enables the potentially dangerous `exec` command for executing arbitrary shell commands
The server runs with stdio transport only, making it suitable for integration with desktop LLM applications.
## Why Use MCP-ShellJS?
For AI developers, MCP-ShellJS enables powerful filesystem capabilities with controlled risk:
- **Efficient exploration**: Fast search with `grep` and `find` across codebases
- **Text processing**: Transform files with `sed` without loading them entirely
- **Safe automation**: Let AI help with file organization and management
- **Powerful pipelines**: Chain operations with Unix-style piping
## Resources
### Directory Resource
```
directory://{path}?include={glob}&exclude={glob}&honor_gitignore={boolean}
```
Provides directory listing with powerful filtering capabilities:
| Parameter | Description |
|-----------|-------------|
| `include` | Glob pattern(s) to include (e.g., `*.js,*.ts`) |
| `exclude` | Glob pattern(s) to exclude (e.g., `node_modules,dist`) |
| `honor_gitignore` | When `true`, filters out files matching patterns in .gitignore |
| `recursive` | When `true`, includes subdirectories recursively |
**Example:**
```
directory:///project/src?include=*.ts&exclude=*.test.ts&honor_gitignore=true
```
### File Resource
```
file://{path}?lines={boolean}&start={number}&end={number}
```
Provides file contents with options for viewing specific portions:
| Parameter | Description |
|-----------|-------------|
| `lines` | When `true`, includes line numbers in output |
| `start` | First line to include (1-based indexing) |
| `end` | Last line to include |
| `highlight` | Glob pattern to highlight matching text |
**Example:**
```
file:///project/src/index.ts?lines=true&start=10&end=50
```
## Tools
MCP-ShellJS exposes ShellJS commands as tools, grouped by security risk level:
### Read-Only Tools
| Tool | Description | Arguments |
|------|-------------|----------|
| `cat` | Output file contents | `files`: String/Array, `options`: Object with `-n` (number lines) |
| `grep` | Search files for patterns | `regex`, `files`, `options`: Object with `-v` (invert), `-l` (filenames only), `-i` (ignore case) |
| `find` | Recursively find files | `paths`: String/Array (returns file paths including base dirs) |
| `ls` | List directory contents | `paths`: String/Array, `options`: Object with `-R` (recursive), `-A` (all), `-L` (follow symlinks), `-d` (dirs only) |
| `which` | Locate a command | `command`: String (returns path to command) |
| `pwd` | Print working directory | (no arguments) |
| `test` | Test file conditions | `expression`: String (e.g., `-d path` directory exists, `-f path` file exists) |
| `head` | Show first lines | `files`: String/Array, `options`: Object with `-n <num>` (lines to show) |
| `tail` | Show last lines | `files`: String/Array, `options`: Object with `-n <num>` (lines to show) |
| `sort` | Sort lines | `files`: String/Array, `options`: Object with `-r` (reverse), `-n` (numeric) |
| `uniq` | Filter duplicated lines | `input`: String, `output`: String, `options`: Object with `-i` (ignore case), `-c` (count), `-d` (duplicates only) |
### Read-Write Tools
| Tool | Description | Arguments |
|------|-------------|----------|
| `mkdir` | Create directories | `dir`: String/Array, `options`: Object with `-p` (create intermediate dirs) |
| `touch` | Create/update files | `files`: String/Array, `options`: Object with `-c` (no create), `-a` (access time only), `-m` (mod time only) |
| `cp` | Copy files/directories | `source`: String/Array, `dest`: String, `options`: Object with `-R` (recursive), `-n` (no clobber), `-f` (force) |
| `mv` | Move files/directories | `source`: String/Array, `dest`: String, `options`: Object with `-f` (force), `-n` (no clobber) |
| `rm` | Remove files/directories | `files`: String/Array, `options`: Object with `-r/-R` (recursive), `-f` (force) |
| `sed` | Stream editor for files | `search_regex`: RegExp, `replacement`: String, `files`: String/Array, `options`: Object with `-i` (in-place) |
### Special Permission Tools
| Tool | Description | Arguments |
|------|-------------|----------|
| `exec` | Execute command | `command`: String, `options`: Object with `async`, `silent`, requires `allowExec: true` config |
## License
[GPL-3.0-or-later](LICENSE)