Loading...
Loading...
Execute Python code in isolated rootless containers with MCP server proxying to reduce context bloat from 30K to 200 tokens
npx skill4agent add aradotso/mcp-skills mcp-server-code-execution-modeSkill by ara.so — MCP Skills collection.
run_python# macOS (Podman Desktop recommended)
brew install podman
podman machine init
podman machine start
# Linux
sudo apt install podman # or dnf/yum/pacman
podman system migrate # enable rootless
# Windows (WSL2 + Podman Desktop)
# Download from https://podman-desktop.io/# Via pip
pip install mcp-code-execution
# Via uv (recommended)
uv pip install mcp-code-execution
# From source
git clone https://github.com/elusznik/mcp-server-code-execution-mode.git
cd mcp-server-code-execution-mode
uv pip install -e .# Pre-built image (recommended)
podman pull ghcr.io/elusznik/mcp-code-execution:latest
# Or build custom image
podman build -t mcp-code-execution:custom -f Dockerfile .~/Library/Application Support/Claude/claude_desktop_config.json%APPDATA%\Claude\claude_desktop_config.json{
"mcpServers": {
"code-execution": {
"command": "uv",
"args": [
"--directory",
"/path/to/mcp-server-code-execution-mode",
"run",
"mcp-code-execution"
],
"env": {
"MCP_BRIDGE_RUNTIME": "podman",
"MCP_BRIDGE_IMAGE": "ghcr.io/elusznik/mcp-code-execution:latest",
"MCP_BRIDGE_OUTPUT_MODE": "compact"
}
}
}
}| Variable | Default | Description |
|---|---|---|
| | Container runtime ( |
| | Container image to use |
| | Execution timeout (seconds) |
| | Output format ( |
| | Container memory limit |
| | Max processes in container |
| | Server startup timeout (seconds) |
mcp_bridge_config.json{
"servers": {
"filesystem": {
"command": "npx",
"args": ["-y", "@modelcontextprotocol/server-filesystem", "/tmp"],
"env": {}
},
"github": {
"command": "uvx",
"args": ["mcp-server-github"],
"env": {
"GITHUB_PERSONAL_ACCESS_TOKEN": "${GITHUB_TOKEN}"
}
},
"postgres": {
"command": "docker",
"args": [
"run", "-i", "--rm",
"-e", "POSTGRES_CONNECTION_STRING",
"mcp/postgres"
],
"env": {
"POSTGRES_CONNECTION_STRING": "${DATABASE_URL}"
}
}
}
}./mcp_bridge_config.json~/.config/mcp-bridge/config.jsonMCP_BRIDGE_CONFIG# Simple calculation
result = 42 * 1.5
print(f"Answer: {result}")# Data analysis
import pandas as pd
import numpy as np
data = pd.DataFrame({
'x': np.random.randn(100),
'y': np.random.randn(100)
})
correlation = data['x'].corr(data['y'])
print(f"Correlation: {correlation:.3f}")from mcp import runtime
# List all available servers
servers = await runtime.discovered_servers()
for server in servers:
print(f"- {server}")from mcp import runtime
# Get all tools from a specific server
github_tools = await runtime.query_tool_docs("github")
for tool_name, schema in github_tools.items():
print(f"{tool_name}: {schema.get('description', 'No description')}")from mcp import runtime
# Search across all servers
matches = await runtime.search_tool_docs("create issue", limit=5)
for hit in matches:
print(f"{hit['server']}.{hit['tool']}: {hit.get('description', '')}")
print(f" Score: {hit.get('score', 0):.2f}")# Dynamic lookup
result = await mcp_servers["github"].call_tool(
"create_issue",
{
"owner": "elusznik",
"repo": "mcp-server-code-execution-mode",
"title": "Add feature X",
"body": "Description here"
}
)
print(result)# Attribute access
result = await mcp_github.create_issue(
owner="elusznik",
repo="mcp-server-code-execution-mode",
title="Bug report",
body="Steps to reproduce..."
)# Module import pattern
from mcp.servers.github import create_issue
issue = await create_issue(
owner="myorg",
repo="myrepo",
title="Task",
body="Details"
)from mcp import runtime
# 1. Search for calendar tools
cal_tools = await runtime.search_tool_docs("calendar events", limit=3)
calendar_server = cal_tools[0]["server"] if cal_tools else None
if calendar_server:
# 2. Get today's events
events = await mcp_servers[calendar_server].call_tool(
"list_events",
{"date": "2025-01-15"}
)
# 3. Create GitHub issues for each event
for event in events:
await mcp_github.create_issue(
owner="myorg",
repo="tasks",
title=f"Follow-up: {event['title']}",
body=f"From calendar: {event['description']}"
)
print(f"Created {len(events)} issues")from mcp import runtime
try:
result = await mcp_servers["github"].call_tool(
"get_issue",
{"owner": "invalid", "repo": "repo", "issue_number": 999}
)
except Exception as e:
print(f"Tool call failed: {e}")
# Fallback: search for alternative tools
alternatives = await runtime.search_tool_docs("get issue")
print(f"Found {len(alternatives)} alternative tools")# First call
import pandas as pd
df = pd.DataFrame({'a': [1, 2, 3], 'b': [4, 5, 6]})# Second call (same session)
# df and pandas are still available
print(df.describe())from mcp import runtime
import json
catalog = {}
# Discover all servers
servers = await runtime.discovered_servers()
for server_name in servers:
# Get all tools for this server
tools = await runtime.query_tool_docs(server_name)
catalog[server_name] = {
tool_name: {
"description": schema.get("description", ""),
"parameters": schema.get("inputSchema", {}).get("properties", {})
}
for tool_name, schema in tools.items()
}
# Save catalog
with open("/tmp/tool_catalog.json", "w") as f:
json.dump(catalog, f, indent=2)
print(f"Cataloged {len(catalog)} servers")from mcp import runtime
# Search for weather tools
weather_tools = await runtime.search_tool_docs("weather forecast", limit=1)
if weather_tools:
server = weather_tools[0]["server"]
tool = weather_tools[0]["tool"]
forecast = await mcp_servers[server].call_tool(
tool,
{"location": "San Francisco"}
)
# If rain predicted, create calendar reminder
if "rain" in forecast.lower():
cal_tools = await runtime.search_tool_docs("create event")
if cal_tools:
await mcp_servers[cal_tools[0]["server"]].call_tool(
cal_tools[0]["tool"],
{
"title": "Bring umbrella",
"date": "2025-01-16",
"time": "08:00"
}
)import asyncio
repos = ["repo1", "repo2", "repo3"]
results = []
for repo in repos:
try:
issues = await mcp_github.list_issues(
owner="myorg",
repo=repo,
state="open"
)
results.append({"repo": repo, "count": len(issues)})
except Exception as e:
results.append({"repo": repo, "error": str(e)})
for r in results:
if "error" in r:
print(f"{r['repo']}: ERROR - {r['error']}")
else:
print(f"{r['repo']}: {r['count']} open issues")import pandas as pd
import matplotlib.pyplot as plt
from io import StringIO
# Fetch data from MCP tool
csv_data = await mcp_filesystem.read_file(path="/tmp/sales.csv")
# Process
df = pd.read_csv(StringIO(csv_data))
summary = df.groupby("region")["sales"].sum().sort_values(ascending=False)
# Generate chart
fig, ax = plt.subplots()
summary.plot(kind="bar", ax=ax)
plt.title("Sales by Region")
plt.tight_layout()
plt.savefig("/tmp/sales_chart.png")
# Save results
report = f"""
Sales Analysis
==============
Total Sales: ${df['sales'].sum():,.2f}
Top Region: {summary.index[0]} (${summary.iloc[0]:,.2f})
Chart saved to /tmp/sales_chart.png
"""
await mcp_filesystem.write_file(
path="/tmp/sales_report.txt",
content=report
)
print(report)RuntimeNotFoundError: Neither podman nor docker found# Install Podman
brew install podman # macOS
sudo apt install podman # Linux
# Or install Docker
brew install docker # macOS (with Docker Desktop)Error: creating container: mkdir /run/user/1000: permission denied# Enable rootless mode
podman system migrate
# Or use Docker rootless
dockerd-rootless-setuptool.sh installTimeoutError: Container image pull exceeded 60s# Pre-pull image manually
podman pull ghcr.io/elusznik/mcp-code-execution:latest
# Or increase timeout
export MCP_BRIDGE_STARTUP_TIMEOUT=180discovered_servers()cat ~/.config/mcp-bridge/config.jsonimport json
with open("mcp_bridge_config.json") as f:
json.load(f) # Should not raisenpx -y @modelcontextprotocol/server-filesystem /tmp
# Should output JSON-RPC messagesexport MCP_BRIDGE_TIMEOUT=600 # Increase to 10 minutespodman run -it --rm ghcr.io/elusznik/mcp-code-execution:latest /bin/bash
# Test commands manuallyOOMKilledexport MCP_BRIDGE_MEMORY_LIMIT=2g # Increase to 2GB# Ensure Podman machine has volume sharing enabled
podman machine stop
podman machine set --rootful=false --volume /Users:/Users
podman machine start# Use compact mode (default)
export MCP_BRIDGE_OUTPUT_MODE=compact
# Or TOON for deterministic tokens
export MCP_BRIDGE_OUTPUT_MODE=toon{
"servers": {
"github": {
"env": {
"GITHUB_PERSONAL_ACCESS_TOKEN": "${GITHUB_TOKEN}"
}
}
}
}{
"servers": {
"filesystem": {
"args": ["-y", "@modelcontextprotocol/server-filesystem", "/safe/path"]
}
}
}podman stats $(podman ps -q --filter ancestor=ghcr.io/elusznik/mcp-code-execution)podman logs <container-id>discovered_servers()from mcp import runtime
# Cache at session start
all_tools = {}
for server in await runtime.discovered_servers():
all_tools[server] = await runtime.query_tool_docs(server)# Preferred
await mcp_github.create_issue(...)
# Slower
await mcp_servers["github"].call_tool("create_issue", ...)podman pull ghcr.io/elusznik/mcp-code-execution:latest