python-runner
by Drahoxx
README.md
# Python MCP Server
An MCP (Model Context Protocol) server that exposes a `run_script` tool for executing Python code via subprocess.
## Installation
```bash
uv sync
```
## Usage
### Run the server
```bash
uv run python server.py
```
### Claude Desktop / Claude Code
```bash
claude mcp add --transport stdio --scope user python-runner -- uvx --from git+https://github.com/Drahoxx/python-mcp python-mcp
```
Or for a local installation:
```bash
claude mcp add --transport stdio --scope user python-runner -- uv run --directory /path/to/python-mcp python-mcp
```
### OpenCode
Add to `~/.config/opencode/opencode.json`:
```json
{
"mcpServers": {
"python-runner": {
"command": "uvx",
"args": ["--from", "git+https://github.com/Drahoxx/python-mcp", "python-mcp"]
}
}
}
```
Or for a local installation:
```json
{
"mcpServers": {
"python-runner": {
"command": "uv",
"args": ["run", "--directory", "/path/to/python-mcp", "python-mcp"]
}
}
}
```
### Generic MCP Client
Add to your MCP client configuration:
```json
{
"mcpServers": {
"python-runner": {
"command": "uv",
"args": ["run", "--directory", "/path/to/python-mcp", "python", "server.py"]
}
}
}
```
## Tool: `run_script`
Execute Python code and return the result.
### Parameters
| Name | Type | Default | Description |
|------|------|---------|-------------|
| `code` | `str` | required | Python code to execute |
| `timeout` | `int` | `30` | Execution timeout in seconds |
### Response
Returns a JSON string with:
| Field | Type | Description |
|-------|------|-------------|
| `success` | `bool` | Whether execution succeeded (exit code 0) |
| `stdout` | `str` | Captured standard output |
| `stderr` | `str` | Captured standard error |
| `error` | `str \| null` | Error message/traceback if failed |
| `return_code` | `int` | Process exit code (-1 for timeout) |
### Examples
**Successful execution:**
```python
run_script('print("hello")')
# {"success": true, "stdout": "hello\n", "stderr": "", "error": null, "return_code": 0}
```
**Syntax error:**
```python
run_script('print(')
# {"success": false, "stdout": "", "stderr": "...", "error": "SyntaxError...", "return_code": 1}
```
**Runtime error:**
```python
run_script('1/0')
# {"success": false, "stdout": "", "stderr": "...", "error": "ZeroDivisionError...", "return_code": 1}
```
**Timeout:**
```python
run_script('import time; time.sleep(60)', timeout=2)
# {"success": false, "stdout": "", "stderr": "", "error": "Execution timed out after 2 seconds", "return_code": -1}
```
## Development
### Run tests
```bash
uv run pytest
```
### Run tests with coverage
```bash
uv run pytest --cov=server
```
TDQS
A3.9/5.0
Scored across 1 tool
Disambiguation5/5
Only one tool exists, so there is no possibility of confusion between tools. The tool's purpose is clearly defined and unambiguous.
Naming Consistency5/5
The single tool uses a consistent verb_noun naming convention (run_script), which is clear and predictable.
Tool Count4/5
The server has exactly one tool, which is slightly below the typical 3-15 range, but it directly matches the server's stated purpose of running Python code. It could potentially benefit from additional tools like environment management, but the core functionality is well-covered.
Completeness5/5
The tool covers the full lifecycle of executing a Python script, including timeout and capturing stdout/stderr/errors. For the narrow domain of running Python code, it is complete.
Maintenance
ActivityInactive
ResponsivenessNo issues