Shell Server
<div align="center">
# Shell Server
**A lightweight MCP server that gives AI assistants access to your terminal.**
[](https://www.python.org)
[](https://modelcontextprotocol.io)
[](https://www.docker.com)
[](LICENSE)
[](https://docs.astral.sh/uv/)
---
*Run shell commands through the [Model Context Protocol](https://modelcontextprotocol.io) — connect any MCP-compatible AI client to your system's terminal.*
</div>
## Features
- **Single tool, full power** — exposes a `terminal` tool that runs any shell command
- **Stdout + stderr** — returns combined output with clear labeling
- **Timeout protection** — commands are capped at 30 seconds
- **Error reporting** — non-zero exit codes are surfaced automatically
- **Stdio transport** — works with any MCP client out of the box
## Quickstart
### With uv (recommended)
```bash
# Clone the repo
git clone https://github.com/joandiazcapell/shellserver.git
cd shellserver
# Install dependencies and run
uv sync
uv run server.py
```
### With Docker
```bash
# Build the image
docker build -t shellserver .
# Run the container
docker run --rm -i shellserver
```
Or pull directly from Docker Hub:
```bash
docker run --rm -i yourusername/shellserver:latest
```
## MCP Client Configuration
Add this to your MCP client config to connect:
### Local (uv)
```json
{
"mcpServers": {
"shell": {
"command": "uv",
"args": ["run", "server.py"],
"cwd": "/path/to/shellserver"
}
}
}
```
### Docker
```json
{
"mcpServers": {
"shell": {
"command": "docker",
"args": ["run", "--rm", "-i", "shellserver"]
}
}
}
```
## Tool Reference
### `terminal`
Run a shell command and return its output.
| Parameter | Type | Description |
|-----------|------|-------------|
| `command` | `string` | The shell command to execute |
**Returns** — stdout, stderr (if any), and exit code (if non-zero).
```
> terminal("echo hello world")
hello world
> terminal("ls nonexistent")
STDERR:
ls: nonexistent: No such file or directory
Exit code: 1
```
## Project Structure
```
shellserver/
├── server.py # MCP server implementation
├── pyproject.toml # Project metadata & dependencies
├── uv.lock # Locked dependencies
├── Dockerfile # Container build file
└── README.md
```
## Requirements
- Python 3.13+
- [uv](https://docs.astral.sh/uv/) (for local development)
- Docker (for containerized usage)
---
<div align="center">
Built with [FastMCP](https://github.com/modelcontextprotocol/python-sdk) and [uv](https://docs.astral.sh/uv/)
</div>
TDQS
Scored across 1 tool
With only one tool available, there is no possibility of confusion or overlap with other tools. The single tool 'terminal' has a clear, unambiguous purpose.
While there is no inconsistency across multiple tools (as there is only one), the name 'terminal' uses a noun format rather than the recommended verb_noun pattern (e.g., 'run_command'), making it less predictable and descriptive of the action performed.
A single tool is explicitly considered 'too few' for most server scopes. A 'Shell Server' implying general shell access would reasonably be expected to support additional capabilities like session management, environment handling, or file operations, rather than just one-shot command execution.
The tool covers basic command execution with stdout/stderr/exit code handling, but notable gaps exist for a shell server, such as interactive session management, background process control, working directory specification, or environment variable manipulation.