Skip to main content
Glama
Drahoxx

python-runner

by Drahoxx

Python MCP Server

An MCP (Model Context Protocol) server that exposes a run_script tool for executing Python code via subprocess.

Installation

uv sync

Related MCP server: Python Executor MCP Server

Usage

Run the server

uv run python server.py

Claude Desktop / Claude Code

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:

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:

{
  "mcpServers": {
    "python-runner": {
      "command": "uvx",
      "args": ["--from", "git+https://github.com/Drahoxx/python-mcp", "python-mcp"]
    }
  }
}

Or for a local installation:

{
  "mcpServers": {
    "python-runner": {
      "command": "uv",
      "args": ["run", "--directory", "/path/to/python-mcp", "python-mcp"]
    }
  }
}

Generic MCP Client

Add to your MCP client configuration:

{
  "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:

run_script('print("hello")')
# {"success": true, "stdout": "hello\n", "stderr": "", "error": null, "return_code": 0}

Syntax error:

run_script('print(')
# {"success": false, "stdout": "", "stderr": "...", "error": "SyntaxError...", "return_code": 1}

Runtime error:

run_script('1/0')
# {"success": false, "stdout": "", "stderr": "...", "error": "ZeroDivisionError...", "return_code": 1}

Timeout:

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

uv run pytest

Run tests with coverage

uv run pytest --cov=server

Available Tools

1 tool
run_scriptA

Execute Python code and return the result.

Args: code: Python code to execute timeout: Execution timeout in seconds (default: 30)

Returns: JSON string with success, stdout, stderr, error, and return_code

ParametersJSON Schema
NameRequiredDescriptionDefault
codeYes
timeoutNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.5/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full burden. It discloses the return format (success, stdout, stderr, error, return_code) and the timeout default, but does not mention side effects, security implications, sandboxing, or restrictions on the executed code. For arbitrary code execution, this is a significant gap.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is efficient, containing only a purpose statement, an Args section, and a Returns section. It is well-structured and front-loaded with the main verb phrase, with no wasted words.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a tool with two parameters and a clear return contract, the description is reasonably complete. However, it lacks usage guidelines, behavioral caveats, and examples, which are important for a code execution tool with no annotations. The return format is described, but the absence of any mention of execution environment or safety considerations makes it less complete than ideal.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

With 0% schema description coverage, the description compensates by explicitly listing parameters with concise explanations: 'Python code to execute' and 'Execution timeout in seconds (default: 30)'. This adds meaning beyond the bare property names and types.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool executes Python code and returns a result, using the specific verb 'execute' and resource 'Python code'. It is distinct and unambiguous, despite having no sibling tools to differentiate from.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides no guidance on when to use this tool versus alternatives, nor does it mention any prerequisites or context for invocation. Since there are no sibling tools, this is not critical, but the absence of any usage context means the agent must infer suitability from the purpose alone.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections. Dates show when Glama detected each change.

  1. 1 tool updatev0.1.0
    • First observedrun_script

TDQS

A3.9/5.0
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

Resources

Unclaimed servers have limited discoverability.

Looking for Admin?

If you are the server author, to access and configure the admin panel.

Related MCP Connectors

Related MCP Servers

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/Drahoxx/python-mcp'

If you have feedback or need assistance with the MCP directory API, please join our Discord server