runloop-mcp
runloop-mcp
An MCP server for running and testing code in disposable Runloop sandboxes. It remains focused on testing rather than vibe coding: active Devboxes last at most one hour and local files should be treated as temporary. Snapshots, blueprints and suspend/resume are available for repeatable test environments; interactive PTYs, tunnels, account secrets and MCP Hub administration are not.
Tools
Tool | Purpose |
| Reuse a compatible running sandbox, or create one, then run a command |
| Start a sandbox for a multi-step test, capped at 1 hour |
| List sandboxes while excluding shutdown entries |
| Check sandbox status |
| Preserve and restore sandbox disk state |
| Run a blocking, non-interactive command |
| Upload Base64 test input or source files |
| Export a result before the sandbox disappears |
| Inspect CPU, memory, disk, and usage |
| Destroy a sandbox and its remaining data |
| Save and discover reusable disk states |
| Build and discover reusable test images |
Prefer run_code. It searches running code-testing sandboxes first and retains
the selected sandbox after a successful run for later reuse. Use
shutdown_sandbox when reuse is no longer needed.
Installation
Requires Python 3.10+ and a Runloop API key.
pip install -e .Start
HTTP (default):
runloop-mcp --host 127.0.0.1 --port 8000stdio:
RUNLOOP_API_KEY=... runloop-mcp --transport stdioThe HTTP MCP endpoint is /mcp. Supply the API key when connecting:
http://127.0.0.1:8000/mcp?api_key=YOUR_RUNLOOP_API_KEYDo not log or share URLs containing the key. Query-key behavior remains for compatibility, but a secret-aware proxy is recommended for public deployment.
Examples
One-shot Python test:
run_code(
files={
"/home/user/test_app.py": "assert 2 + 2 == 4\nprint('passed')\n"
},
command="python3 /home/user/test_app.py",
)Multi-step test with an exported report:
sandbox = create_sandbox(files={"/home/user/package.json": "{...}"})
execute_in_sandbox(sandbox_id=sandbox["id"], command="cd /home/user && npm test")
download_artifact(sandbox_id=sandbox["id"], file_path="/home/user/report.xml")
shutdown_sandbox(sandbox_id=sandbox["id"])download_artifact returns standard Base64. Decode and save it outside Runloop
before shutdown or expiry. Package large source trees into an archive, upload
it, and extract it with execute_in_sandbox.
Reuse behavior
run_codeonly reuses running sandboxes tagged withpurpose=code-testing.It prefers a sandbox matching the requested blueprint.
Files passed to
run_codeoverwrite paths in a reused sandbox.Environment variables are creation-time settings and cannot be replaced when reusing a sandbox; put per-run values in the command when appropriate.
A newly created sandbox is destroyed if execution raises an error, but is retained after success.
Design constraints
Sandbox lifetime is restricted to 60–3600 seconds.
run_codeattempts forced cleanup of a newly created sandbox on execution failure.No background-process, PTY, or tunnel workflow is exposed.
Sandbox storage must not be treated as a source of truth.
Avoid passing credentials in ordinary environment variables or command text.
Deployment
main.py exposes MCP at /mcp and health checks at /health:
uvicorn main:app --host 0.0.0.0 --port 8000The included Dockerfile uses the same ASGI application.
License
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
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/contributory/runloop-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server