wasmer-sandbox-mcp
Provides tools for interacting with the Wasmer platform, including running Python code and commands inside isolated Wasmer sandboxes, managing sandbox files, installing Wasmer registry packages, and querying deployment and observability information from Wasmer Edge.
Click on "Install Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@wasmer-sandbox-mcpRun Python in the sandbox to compute the first 15 Fibonacci numbers and print them."
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
wasmer-sandbox-mcp
A Wasmer DX exercise, shaped as a working product: one Python package that ships two MCP
servers — an Edge-deployed Postgres/observability server and a host-local wasmer_sdk
sandbox companion — built specifically to push on Wasmer's newest surface and write down
every place it pushed back.
The primary deliverable is FEEDBACK.md — 40 issue-ready entries, each
with versions, a reproducer, verbatim output, and a proposed fix. The code exists to
generate that ledger honestly; read the ledger first.
Live app: https://wasmer-sandbox-mcp.wasmer.app/mcp
Why two servers
wasmer_sdk is a native host-only library. There is no wasix_wasm32 wheel for it and no
remote backend, so the sandbox SDK cannot run on Wasmer Edge — the platform its own
vendor ships (see FEEDBACK.md F-004). Nothing in the announcement says
this. So the split is not a design flourish: it is the finding, made executable. The Edge
server gets everything WASIX can carry; the sandbox server stays on the host, and the two
attach to the same MCP client at the same time.
Related MCP server: Node.js Sandbox MCP Server
Architecture
wasmer_mcp/server_edge.py builds an mcp 2.x MCPServer over streamable HTTP, stateless,
with JSON responses, bound explicitly to 0.0.0.0 on $PORT → $FASTMCP_PORT → 8000.
main.py is the anybuild entrypoint and also exposes a module-level ASGI app.
wasmer_mcp/db.py holds a small pg8000 layer over Edge Postgres — DSN assembled from the
five injected DB_* variables, TLS on, keyset pagination on the primary key.
wasmer_mcp/models.py is the boundary: every argument is parsed by pydantic before it
reaches SQL, so an invalid area is refused by the schema and never touches the database.
wasmer_mcp/sandbox.py owns a two-slot warm sandbox pool keyed by network policy
(network is a create-time parameter, so one slot cannot serve both), with a host-side
deadline around every run. wasmer_mcp/server_local.py serves those over stdio.
app.yaml carries the Postgres capability, the fr-roub1 region pin, and two cron jobs.
Tool surface
Edge server — wasmer-edge-echo, streamable HTTP at /mcp, needs the deployment.
Tool | When to use |
| Check the deployed instance: database reachability and latency, region, versions, uptime. |
| Save a note that outlives the conversation; returns its id. |
| Fetch one note back by the id |
| Browse notes newest-first, optionally narrowed by tag or text; paginate with |
| Report friction hit while using Wasmer, from inside a session, so it lands in the database. |
| Read those friction reports back, newest first. |
Local companion — wasmer-sandbox, stdio, needs wasmer_sdk on the host.
Tool | When to use |
| Execute Python inside an isolated Wasmer sandbox and get |
| Run any command available in the sandbox, with arguments. |
| Put a text file into the sandbox before running code against it. |
| Read a file the sandbox produced. |
| See what is in a sandbox directory, with kind and size. |
| Install a Wasmer registry package into the sandbox and list the commands it adds. |
| Check whether the slots are warm before a latency-sensitive call. |
| Throw away accumulated guest state and start clean. |
Sandbox state persists between calls by design — a file written by one tool is visible
to the next, and reset_sandbox is the escape hatch.
Both servers answer with the same grammar: success returns the payload object directly,
failure returns {"error": {"code", "message", "hint"}} where hint names the next action.
Quickstart
Local development
uv sync --extra local --extra dev
uv run --extra local wasmer-mcp-local # sandbox server over stdio
uv run python main.py # Edge server locally on 0.0.0.0:8000
uv run pytest -q # 42 offline tests, ~0.6 s, no networkWire it into Claude Code
.mcp.json is committed and works from a fresh clone:
{
"mcpServers": {
"wasmer-sandbox": {
"type": "stdio",
"command": "uv",
"args": ["run", "--extra", "local", "wasmer-mcp-local"]
},
"wasmer-edge-echo": {
"type": "http",
"url": "https://wasmer-sandbox-mcp.wasmer.app/mcp"
}
}
}The first sandbox call after a cold cache costs ~26 s; the server pre-warms in the
background and returns a warming error with a retry hint rather than blocking.
Deploy
WASMER_BIN=/path/to/wasmer-7.x/bin/wasmer scripts/deploy.shTwo things that script encodes, both learned the hard way:
The
wasmerCLI must be 7.x. anybuild 0.28.3 drives a 6.1.0 CLI throughwasmer run --volume, which it rejects, and 6.1.0's package upload dies on a bare HTTP 500 from the registry. 7.4.0 works first try (F-019, F-020).It builds from a staging copy of git-tracked files only. anybuild's Python provider copies the whole project directory into the image and ignores
.gitignore— 213 MB from a 100 KB project (F-021). Staging what git tracks also makes this path match push-to-deploy, which by definition sees only tracked files.
anybuild installs to ~/.anybuild/bin/anybuild (curl -fsSL https://anybuild.run/install | sh);
override with ANYBUILD_BIN.
Live checks and the feedback exporter
WASMER_LIVE=1 uv run pytest -q tests/test_live.py # one Edge round-trip, one sandbox run
uv run python scripts/export_feedback.py # feedback rows as ledger-shaped blocksThe live checks are skipped by default — a live-by-default suite is unrunnable offline. The
exporter writes to stdout and deliberately does not edit FEEDBACK.md: table rows are lower
fidelity than curated entries, and a human decides what gets promoted.
Push-to-deploy — USER ACTION
The repository is prepared so that a single push deploys, but the last mile requires an authenticated browser session and a GitHub app authorization. Do these in order:
Create the GitHub repository (your choice of name and visibility) and add it as
origin.Push
main.Open the Wasmer dashboard and select the
wasmer-sandbox-mcpapp.Open the app's Git settings and choose GitHub as the repository provider.
Authorize Wasmer for the repository or organization if prompted.
Select the repository, then select branch
mainas the production branch.Push a trivial commit and confirm a deployment starts on its own.
Before that link exists, a push does nothing — keep using scripts/deploy.sh. Once it
exists, app.yaml in the repository extends the app's configuration on every deployment,
so the region pin, the Postgres capability, and both cron jobs travel with the push.
GitHub Actions (optional, currently untested)
.github/workflows/deploy.yml is the alternative path: wasmerio/setup-wasmer@v3.1 pinned
to CLI 7.4.0, anybuild installed inline, then scripts/deploy.sh with WASMER_TOKEN from
repository secrets. It has never run — there is no repository yet — and it is included
for the comparison between the two paths, which is one of the things this exercise is for.
Do not enable both paths. A dashboard Git link and this workflow on the same branch deploy the same commit twice. Pick one; if you pick the dashboard, delete the workflow.
To use it: add WASMER_TOKEN as a repository secret, and disconnect the dashboard Git link.
Wasmer feature coverage
What this project actually exercised, and what it found. Ids are FEEDBACK.md entries.
Feature | Exercised how | Status | Ledger |
Edge: Python + uvicorn on WASIX | flat project, anybuild-built, | works, with workarounds | F-009, F-018, F-021 |
Edge: streamable-HTTP MCP |
| works | — |
Edge Postgres |
| works, after a driver swap | F-013, F-022, F-025, F-026 |
Edge cron: |
| works | F-027 |
Edge cron: |
| works with workaround | F-035, F-036, F-037, F-010, F-028 |
anybuild |
| works, with workarounds | F-019, F-021, F-024, F-025 |
| forced upgrade after three separate 6.1.0 failures | works on 7.4 only | F-017, F-019, F-020, F-012 |
SDK: sandbox create + run | two-slot warm pool; | works | F-031 |
SDK: timeouts | host-side deadline around every run, because the SDK's own | works, with workaround | F-029, F-030 |
SDK: filesystem | write / read / list, with guest paths normalised into the addressable root | works, with workaround | F-033, F-006 |
SDK: |
| partly broken | F-034 |
SDK: networking | create-time | works | F-032 |
Sandboxed SQL via | not attempted (stretch, cut) | not done | F-008 |
Edge email ( | not attempted — paid plan | not done | F-011 |
GitHub push-to-deploy | repository prepared; dashboard link is the user action above | pending | F-003, F-040 |
GitHub Actions deploy | workflow committed | untested | F-039 |
Repository map
Path | What |
| anybuild entrypoint and module-level ASGI app |
|
|
| the prune CLI, kept as the local runner and as the |
| Edge app configuration and the generated build definition |
| staged deploy; |
| 42 offline tests plus two live checks behind |
| the deliverable |
No secret is committed. DB_* are injected by the platform; WASMER_TOKEN lives only in
repository secrets or your shell.
Available Tools
8 toolsget_sandbox_infoA
Report whether the sandboxes are warm, and what they are running.
Use it when a call came back warming, when one was unexpectedly slow, or before a
long task. There are two sandboxes, one per network policy (off and host), warmed
independently; warm: false means the first call for that policy pays the ~26 s
download-and-compile cost.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the burden, and it delivers: it explains the two sandboxes are warmed per network policy, warmed independently, and that `warm: false` means the first call pays a ~26s download-and-compile cost. This goes beyond a generic status report and explains a key behavioral implication.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is three sentences with no filler. The purpose is front-loaded, followed by concrete usage triggers and then the important warm/cold cost detail. Every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-parameter status tool, the description is complete: it states what is reported, when to call it, and what a `false` result implies. An output schema exists, so return-value details do not need to be repeated in the description.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters and the schema is empty, so there is nothing parameter-specific to explain. The baseline of 4 applies because the description instead adds useful context about what the report means.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description begins with a specific verb and resource: 'Report whether the sandboxes are warm, and what they are running.' This clearly identifies it as a status/diagnostic tool and distinguishes it from the mutating and file-operation sibling tools like reset_sandbox and write_sandbox_file.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives explicit triggers: use it after a `warming` response, after unexpected slowness, or before a long task. It does not name alternatives or exclusion cases, but no direct alternative exists among the siblings, so the guidance is clear and actionable.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
install_sandbox_packageA
Install a Wasmer registry package into the sandbox and report the commands it adds.
Use it to get a tool the sandbox does not already have — the guest starts with only
Python. package is a registry name like wasmer/edgejs or wasmer/edgejs@0.2.0.
The returned commands are exactly the names run_command can then call. The install
persists for the life of the sandbox, so it survives later calls until reset_sandbox.
| Name | Required | Description | Default |
|---|---|---|---|
| network | No | ||
| package | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the behavioral burden and does well: it discloses that installation persists for the sandbox lifespan and survives until reset_sandbox, and that the returned commands are exactly what run_command can call. It does not mention network behavior or failure modes, but the key side effect is clear.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact and front-loaded: the action and outcome come first, followed by when to use it, package format, and persistence. Every sentence adds actionable information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The output schema exists and the description covers the return semantics and persistence, so the agent knows what to expect. The main gap is the undocumented `network` parameter, which could affect whether an install can reach a registry.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The `package` parameter is meaningfully documented with registry-name examples and a version format. However, the `network` boolean is left unexplained in both the schema and the description, so with 0% schema coverage the description only partially compensates.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('Install'), a resource ('Wasmer registry package into the sandbox'), and an outcome ('report the commands it adds'). It also clarifies the tool fills a missing capability, which distinguishes it from run_python and run_command.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit use condition: use it when the sandbox does not already have the tool, since the guest starts with only Python. It also connects the returned commands to run_command, but it does not explicitly list exclusions or alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_sandbox_dirA
List the contents of a directory inside the sandbox.
Use it to find out what is actually there before reading or running something —
especially after install_sandbox_package, or when a read_sandbox_file came back
not_found. Returns each entry's name, kind and size.
| Name | Required | Description | Default |
|---|---|---|---|
| path | No | / | |
| network | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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 that the tool lists directory contents and returns name/kind/size, which is useful. However, it does not explain behavior for missing paths, permission issues, or the effect of the network parameter — though this is a simple read operation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three concise sentences: purpose, when to use, and return structure. It is front-loaded and every sentence earns its place with no fluff.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description is adequate for a basic directory-listing tool and the output schema covers return values. The significant gap is the network parameter, which is neither described in the schema nor in the description.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate for parameter meaning. It does not explain 'path' beyond the obvious default, and 'network' is completely unaddressed — an agent cannot tell from the description what network=true changes.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The first sentence names a specific verb and resource: 'List the contents of a directory inside the sandbox.' The return shape ('name', 'kind', 'size') and the contrast with read_sandbox_file make it easy to distinguish from sibling file operations.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives clear when-to-use guidance: use it to see what is actually there before reading or running something, especially after install_sandbox_package or after a read_sandbox_file not_found. It does not explicitly state when not to use it or name alternative tools, so it falls just short of 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
read_sandbox_fileA
Read a text file from inside the sandbox.
Use it to collect a file that sandboxed code produced, or to check what an earlier
write_sandbox_file left behind. Long files come back capped as head + tail with the
elision marked, and truncated: true says so. network selects which sandbox, and a
file written to one is not visible in the other.
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes | ||
| network | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Since no annotations are provided, the description carries the full burden. It discloses important behaviors: long files are capped as head + tail with truncation indicated via `truncated: true`, and the `network` flag selects a sandbox whose files are invisible to the other. This is substantive, though it does not describe error behavior for missing files.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact and front-loaded with the primary action, then follows with usage context, truncation behavior, and the sandbox-selection caveat. Every sentence contributes information and nothing is redundant.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description covers the core usage scenario, truncation result shape, and network isolation. The output schema likely covers return fields, so the only notable gap is path handling and missing-file behavior, which are minor for a read tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema has no descriptions and the description adds meaning for the `network` parameter, explaining that it selects which sandbox and that writes to one are not visible in the other. The `path` parameter is left entirely to inference; its format and sandbox-relative semantics are not explained.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: "Read a text file from inside the sandbox." It also names the sibling it is not by referencing `write_sandbox_file`, so an agent can distinguish this read tool from its write counterpart.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly tells when to use the tool: to collect a file produced by sandboxed code or to inspect what `write_sandbox_file` left behind. It does not explicitly state when not to use it or name alternatives like `list_sandbox_dir` or `run_command`, but the context is clear enough to route usage.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
reset_sandboxA
Throw away the sandbox's accumulated state and start a fresh one.
Use it when earlier files, installed packages or environment changes are getting in the
way, or when a sandbox is behaving oddly. Pass network as "off" or "host" to
reset just that one; omit it to reset both. The replacement warms in the background, so
the next call may answer warming — that is expected.
| Name | Required | Description | Default |
|---|---|---|---|
| network | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden. It discloses the destructive nature ('throw away accumulated state'), the selective network reset behavior, and the asynchronous warm-up that may cause the next call to answer 'warming'. This is excellent behavioral disclosure.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences deliver the core action, usage triggers, parameter guidance, and an async caveat. It is front-loaded with the essential behavior and contains no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given no annotations and no output schema, the description provides everything needed to call the tool correctly: what it does, when to use it, how the parameter behaves, and expected asynchronous behavior. The mention of 'warming' covers an important operational expectation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema only defines network as string/null with a default. The description adds crucial meaning: pass 'off' or 'host' to reset that one, or omit to reset both. This fully explains the parameter's semantics beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action: throw away accumulated state and start fresh. It names the resource (sandbox) and distinguishes this tool from siblings like run_command or file operations by focusing on state reset.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives concrete conditions for use: earlier files, installed packages, or environment changes getting in the way, or when the sandbox behaves oddly. It does not explicitly mention when not to use it or name alternatives, but the context is clear enough.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
run_commandA
Run any command available inside the Wasmer sandbox, with arguments.
Use it for non-Python work in the sandbox — a shell utility, or a binary that
install_sandbox_package added. command is the command name, and args its
arguments as a list (not a shell string: there is no shell splitting, quoting or
piping). Returns the same result shape as run_python.
The sandbox is long-lived, so this command sees files and packages left by earlier
calls, and its own side effects persist until reset_sandbox.
| Name | Required | Description | Default |
|---|---|---|---|
| cwd | No | ||
| env | No | ||
| args | No | ||
| command | Yes | ||
| network | No | ||
| timeout_s | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full behavioral disclosure burden and does so exceptionally. It reveals that the sandbox is long-lived, that prior files and packages are visible, that side effects persist until reset_sandbox, and critically that args is a list and shell splitting/quoting/piping do not occur.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is efficient and front-loaded. Each sentence contributes: purpose, usage context, parameter clarification, return-shape reference, and long-lived side-effect behavior. There is no filler or repetition.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a command-execution tool with no annotations and zero schema descriptions, the description covers the essential context: what it runs, when to use it, how args behaves, return shape, and sandbox persistence. It is slightly incomplete on cwd, env, network, and timeout_s semantics, but those are comparatively self-explanatory and the output schema covers return details.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate. It does add important meaning for command and especially args — 'not a shell string: there is no shell splitting, quoting or piping' — but cwd, env, network, and timeout_s are left undocumented in both the schema and description. The coverage is partial: 2 of 6 parameters receive substantive explanation.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: 'Run any command available inside the Wasmer sandbox, with arguments.' It then clarifies scope by positioning the tool for non-Python work and explicitly contrasting it with run_python, making it easy for an agent to distinguish from siblings like run_python and reset_sandbox.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly states when to use the tool: 'Use it for non-Python work in the sandbox — a shell utility, or a binary that install_sandbox_package added.' This gives a clear selection rule and names the related sibling install_sandbox_package, and the mention of run_python's result shape reinforces the alternative.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
run_pythonA
Run Python code inside an isolated Wasmer sandbox and get back its output.
Use it to execute code you do not want touching this machine: untrusted snippets,
experiments, quick calculations, anything with side effects you would rather contain.
code is passed to python -c, so print what you want to see. Set network=true only
when the code must reach the internet — that routes to a second sandbox with the host's
network and its own separate state. Returns exit_code, stdout, stderr, reason
and duration_ms; a non-zero exit_code is a normal result, not an error.
The sandbox is long-lived: files written and packages installed by earlier calls are
still there, and anything this code writes stays for the next one. Call
reset_sandbox when you want a clean slate.
| Name | Required | Description | Default |
|---|---|---|---|
| code | Yes | ||
| stdin | No | ||
| network | No | ||
| timeout_s | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does it thoroughly. It discloses the long-lived sandbox, persistence of files and packages, the separate network sandbox state, the return schema, and the important fact that a non-zero exit_code is a normal result rather than an error.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is organized into focused paragraphs: purpose, usage context, network behavior, output semantics, and persistence. Every sentence adds operational value and the most important scoping statement is front-loaded. Despite its length, no content is redundant.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description is highly complete for a stateful sandbox tool: it explains execution, safety, network mode, return values, persistence, and reset path. The main gap is the absence of any guidance on stdin and timeout_s behavior, which are the two underspecified parameters in an otherwise excellent descrption.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, so the description must compensate. It adds real meaning for code (passed to python -c) and network (routes to a separate sandbox with host network), but it does not explain stdin or timeout_s. Those parameters are still largely inferable from their names, defaults, and types, but the description could have been even clearer.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb (execute), resource (Python code in an isolated Wasmer sandbox) and outcome (get back its output). It also differentiates from siblings by naming Python-specific execution and describing safety isolation, so an agent can distinguish it from run_command or sandbox file operations.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly says when to use the tool: for untrusted snippets, experiments, quick calculations, and anything with side effects you want contained. It gives conditional guidance for network=true and mentions reset_sandbox for a clean slate, but it does not explicitly contrast with siblings like run_command or list_sandbox_dir, so no exclusions are stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
write_sandbox_fileA
Write a text file inside the sandbox, creating parent directories as needed.
Use it to put a script, a fixture or input data where sandboxed code can read it —
run_python and run_command in the same sandbox see the same filesystem. Use an
absolute path such as /tmp/input.json. The network flag selects which sandbox,
and the two do not share a filesystem: write and read with the same value. Overwrites
an existing file without asking. Returns the path and the number of bytes written.
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes | ||
| content | Yes | ||
| network | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full behavioral burden and does so well. It discloses that files are overwritten without asking, parent directories are created, the network flag selects a specific sandbox, sandboxes do not share filesystems, and the call returns the path and byte count.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is efficiently composed, with no filler. It front-loads the core purpose, then covers key usage details, behavioral caveats, and return information in a compact sequence.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's moderate complexity and the presence of an output schema, the description is complete. It covers purpose, parameters, sandbox isolation semantics, overwrite behavior, and return value, leaving little ambiguity for an agent.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate. It explains path should be absolute, provides an example, and clarifies the network flag's role in sandbox selection. Content is implied as the text to write but is not explicitly labeled, which prevents a perfect score.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool writes a text file inside the sandbox, creating parent directories as needed. It names specific use cases (script, fixture, input data) and distinguishes itself from sibling read/list tools by focusing on writing.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives clear context for when to use the tool: to place files where sandboxed code can read them, with the same filesystem visible to run_python and run_command. It also explains the network flag selects which sandbox, but it does not explicitly name alternatives or state when not to use this tool.
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.
8 tool updates
v0.1.0- First observed
get_sandbox_info - First observed
install_sandbox_package - First observed
list_sandbox_dir - First observed
read_sandbox_file - First observed
reset_sandbox - First observed
run_command - First observed
run_python - First observed
write_sandbox_file
TDQS
Most tools are sharply distinguished (file read/write/list, package install, reset, info). The only potential confusion is run_python vs run_command, since run_command could also invoke Python, but the descriptions draw a clear boundary by directing run_command to non-Python work.
All eight tools follow a consistent snake_case verb_noun pattern (run_, get_, write_, read_, list_, install_, reset_). The run_ versus sandbox_ prefixes correspond to a meaningful semantic split between execution and sandbox management, so there is no real inconsistency.
Eight tools is well within the ideal 3-15 range and maps cleanly to the server's purpose: two executors, three filesystem operations, package installation, state inspection, and reset. Each tool earns its place with no redundant entries.
The domain — isolated code execution with persistent sandbox state — is well covered: execute, read/write/list files, install packages, inspect, and reset. The only minor gap is the lack of a dedicated file removal tool, but agents can work around it via run_command('rm', ...) or reset_sandbox.
Maintenance
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
Build Apps and run code in 30 languages — sandboxed, with persistent sessions for agent loops.
Execute code in 8 languages (Python, JS, TS, Go, Java, C++, C, Bash) in gVisor sandboxes.
Managed database, auth, file storage, email, analytics, and deployment for coding agents.
Deploy full-stack apps (Postgres, Redis, S3, workers, backups) from Claude or curl. 59 MCP tools.
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceThe sessionless code interpreter. Securely run AI-generated code in stateful sandboxes that run forever.123228MIT
- FlicenseNot gradedqualityDmaintenanceEnables running arbitrary JavaScript code in isolated Docker containers with on-the-fly npm dependency installation, supporting both ephemeral one-shot executions and persistent sandbox environments.134157-

MCP Run Pythonofficial
AlicenseNot gradedqualityFmaintenanceEnables secure execution of Python code in a sandboxed WebAssembly environment using Pyodide and Deno. Automatically handles package management and captures complete execution results including stdout, stderr, and return values.194MIT
HOPX MCP Serverofficial
FlicenseNot gradedqualityCmaintenanceEnables AI assistants to execute Python, JavaScript, Bash, and Go code in blazing-fast (~0.1ms startup), isolated cloud containers with secure, ephemeral environments that auto-destroy after use.155-
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/francisco-perez-sorrosal/wasmer-sandbox-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server