Skip to main content
Glama
francisco-perez-sorrosal

wasmer-sandbox-mcp

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_PORT8000. 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 serverwasmer-edge-echo, streamable HTTP at /mcp, needs the deployment.

Tool

When to use

get_server_info

Check the deployed instance: database reachability and latency, region, versions, uptime.

store_echo

Save a note that outlives the conversation; returns its id.

get_echo

Fetch one note back by the id store_echo or list_echoes returned.

list_echoes

Browse notes newest-first, optionally narrowed by tag or text; paginate with next_cursor.

record_feedback

Report friction hit while using Wasmer, from inside a session, so it lands in the database.

list_feedback

Read those friction reports back, newest first.

Local companionwasmer-sandbox, stdio, needs wasmer_sdk on the host.

Tool

When to use

run_python

Execute Python inside an isolated Wasmer sandbox and get stdout/stderr/exit_code.

run_command

Run any command available in the sandbox, with arguments.

write_sandbox_file

Put a text file into the sandbox before running code against it.

read_sandbox_file

Read a file the sandbox produced.

list_sandbox_dir

See what is in a sandbox directory, with kind and size.

install_sandbox_package

Install a Wasmer registry package into the sandbox and list the commands it adds.

get_sandbox_info

Check whether the slots are warm before a latency-sensitive call.

reset_sandbox

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 network

Wire 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.sh

Two things that script encodes, both learned the hard way:

  • The wasmer CLI must be 7.x. anybuild 0.28.3 drives a 6.1.0 CLI through wasmer 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 blocks

The 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:

  1. Create the GitHub repository (your choice of name and visibility) and add it as origin.

  2. Push main.

  3. Open the Wasmer dashboard and select the wasmer-sandbox-mcp app.

  4. Open the app's Git settings and choose GitHub as the repository provider.

  5. Authorize Wasmer for the repository or organization if prompted.

  6. Select the repository, then select branch main as the production branch.

  7. 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, mcp 2.x server bound to 0.0.0.0

works, with workarounds

F-009, F-018, F-021

Edge: streamable-HTTP MCP

initialize, tools/list, tools/call over HTTPS, stateless JSON

works

Edge Postgres

pg8000 + TLS, five injected DB_* vars, fr-roub1 pin, keyset pagination

works, after a driver swap

F-013, F-022, F-025, F-026

Edge cron: fetch action

prune-echoesPOST /jobs/prune?days=7 every 15 min, verified live

works

F-027

Edge cron: execute action

prune-echoes-exec runs python /app/jobs.py prune --days 7 every 15 min, verified live (SUCCESS, exit 0) — after an exit-code probe showed the job gets the app image and secrets but neither the app's working directory nor its PYTHONPATH

works with workaround

F-035, F-036, F-037, F-010, F-028

anybuild

Anybuild generated and committed; build driven from a tracked-files staging copy

works, with workarounds

F-019, F-021, F-024, F-025

wasmer CLI 6.1 → 7.4

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; print(1+1)2\n; warm call 31 ms, cold create ~26 s

works

F-031

SDK: timeouts

host-side deadline around every run, because the SDK's own timeout= never fires

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: install_package

wasmer/edgejs@0.2.0 installs and advertises 107 commands; node/npm/edge cannot spawn

partly broken

F-034

SDK: networking

create-time NetworkPolicy, one warm slot per policy

works

F-032

Sandboxed SQL via wasmer/pglite

not attempted (stretch, cut)

not done

F-008

Edge email (enable_email + sendmail)

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

main.py

anybuild entrypoint and module-level ASGI app

wasmer_mcp/

server_edge.py, server_local.py, db.py, models.py, sandbox.py

jobs.py

the prune CLI, kept as the local runner and as the execute-job reproducer

app.yaml, Anybuild

Edge app configuration and the generated build definition

scripts/deploy.sh

staged deploy; scripts/export_feedback.py — database rows → ledger blocks

tests/

42 offline tests plus two live checks behind WASMER_LIVE=1

FEEDBACK.md

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 tools
get_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.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.5/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
networkNo
packageYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.2/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
pathNo/
networkNo

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

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

Conciseness5/5

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.

Completeness3/5

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.

Parameters2/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
pathYes
networkNo

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.2/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
networkNo

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.8/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters5/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
cwdNo
envNo
argsNo
commandYes
networkNo
timeout_sNo

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.6/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
codeYes
stdinNo
networkNo
timeout_sNo

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.6/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
pathYes
contentYes
networkNo

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.7/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.

  1. 8 tool updatesv0.1.0
    • First observedget_sandbox_info
    • First observedinstall_sandbox_package
    • First observedlist_sandbox_dir
    • First observedread_sandbox_file
    • First observedreset_sandbox
    • First observedrun_command
    • First observedrun_python
    • First observedwrite_sandbox_file

TDQS

A4.3/5.0
Disambiguation4/5

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.

Naming Consistency5/5

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.

Tool Count5/5

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.

Completeness4/5

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

ActivityMaintained
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

  • A
    license
    Not graded
    quality
    D
    maintenance
    The sessionless code interpreter. Securely run AI-generated code in stateful sandboxes that run forever.
    123
    228
    MIT
  • F
    license
    Not graded
    quality
    D
    maintenance
    Enables 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.
    134
    157
    -
  • A
    license
    Not graded
    quality
    F
    maintenance
    Enables 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.
    194
    MIT
  • F
    license
    Not graded
    quality
    C
    maintenance
    Enables 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

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