FetchSandbox
NPM · FETCHSANDBOX-MCP · SCANNED SEP 20
A deterministic verification engine for agents. Proves a fix: fails on the old code, passes on new.
Available components
How this component scores in each security and reliability category. Every signal is checked automatically from public evidence about the published package, including repeated runs of it in an isolated sandbox, and we only credit what we can confirm. How we score → Why this is hard to score →
Supply Chain Security98
- No malware found by supply-chain analysis.Pass
- No known CVEs affecting this package version or its production dependencies.Pass
- No install/post-install scripts declared.Pass
- 31 of 95 dependencies flagged as unhealthy. View diagnostics → Partial
Provenance & Transparency45
- Source repository is publicly reachable at the declared URL. View diagnostics → Pass
- Provenance check failed: no build-provenance attestation is published. See how to fix → View diagnostics → Fail
- Clear OSI-approved license (MIT).Pass
- Actively maintained (last published 1 days ago).Pass
- Disclosure check failed: no security disclosure policy was found in the source repository. See how to fix → Fail
Schema Quality & AI Usability68
- AI-judged instruction clarity (excellent).Pass
- Context-footprint check failed: tool/resource definitions use about 3915 tokens (~279/item across 14 items; 14 tools + 0 resources), over budget; trim descriptions and params. See how to fix → Fail
- Usage-examples check failed: none of the tools include examples. See how to fix → Fail
Stability & Change Management93
- Stability observed for 28 of 30 days with no destabilising changes; credit accrues until the full window elapses.Partial
Tool Coverage100
- 100% of tools have a non-trivial description (not blank, and not just the tool's name).Pass
- 100% of tool parameters carry a description.Pass
Tool Safety100
- No prompt-injection markers were found in the server instructions, tool names or descriptions we captured.Pass
- All 2 tool(s) whose name or description implies an irreversible operation declare an MCP destructiveHint annotation.Pass
- An AI judge read all 14 captured unit(s) of tool text and found none that tries to manipulate the model reading it.Pass
Capabilities100
- Implements a supported MCP spec version (2025-11-25); the latest is 2026-07-28.Pass
How do I install the FetchSandbox MCP server?
FetchSandbox runs locally as an npm package, launched with npx -y fetchsandbox-mcp. Ready-made configuration for Claude, Cursor, VS Code, Codex and 5 more is on this page, copied from each client's own documentation.
npm · fetchsandbox-mcp
claude mcp add fetchsandbox-mcp -- npx -y fetchsandbox-mcp
{
"mcpServers": {
"fetchsandbox-mcp": {
"command": "npx",
"args": [
"-y",
"fetchsandbox-mcp"
]
}
}
} {
"servers": {
"fetchsandbox-mcp": {
"command": "npx",
"args": [
"-y",
"fetchsandbox-mcp"
]
}
}
} codex mcp add fetchsandbox-mcp -- npx -y fetchsandbox-mcp
{
"$schema": "https://opencode.ai/config.json",
"mcp": {
"fetchsandbox-mcp": {
"type": "local",
"command": [
"npx",
"-y",
"fetchsandbox-mcp"
],
"enabled": true
}
}
} openclaw mcp add fetchsandbox-mcp --command npx --arg -y --arg fetchsandbox-mcp
mcp_servers:
fetchsandbox-mcp:
command: "npx"
args: ["-y", "fetchsandbox-mcp"] {
"McpServers": {
"fetchsandbox-mcp": {
"Transport": "stdio",
"Command": "npx",
"Arguments": [
"-y",
"fetchsandbox-mcp"
]
}
}
} assistant mcp add fetchsandbox-mcp -t stdio -c npx -a -y fetchsandbox-mcp
{
"mcpServers": {
"fetchsandbox-mcp": {
"command": "npx",
"args": [
"-y",
"fetchsandbox-mcp"
]
}
}
} Every change we have recorded for this component, newest first. Security-relevant changes are always shown. ▲ marks a change for the better, ▼ a change for the worse; unmarked changes are neutral.
- 20 Sept 26 +1
- Package version: 0.3.2 → 0.5.3 functional
- 18 Sept 26 +1
No change was recorded against any check on this day. Stability & Change Management went from 83 to 87. That category is still filling its 30-day observation window: 25 days of observed history at the previous scan, 26 at this one. The score rises as the window fills, whether or not the server changes.
- 17 Sept 26 0
- Package version: 0.3.2 → 0.5.3 functional
- 16 Sept 26 −3
- Stability: pass → 0.80 functional
- 15 Sept 26 +1
- Stability: 0.97 → pass security
- 14 Sept 26 +15
- Malware scan: unverified → pass ▲ security
- 13 Sept 26 +13
- Known CVEs: unverified → pass ▲ security
- Dependency health: unverified → 0.84 ▲ functional
- Destructive annotations: All 2 tool(s) whose name or description implies an irreversible operation declare an MCP destructiveHint annotation. functional
- Package version: 0.5.2 → 0.5.3 functional
- 12 Sept 26 −10
- Known CVEs: pass → unverified ▼ security
- Stability: 0.87 → unverified ▼ security
- Tool safety: pass → unverified ▼ security
- Malware scan: unverified → pass ▲ security
- Dependency health: 0.84 → unverified ▼ functional
- Capabilities: pass → unverified ▼ functional
- Tool coverage: 100 → unverified ▼ functional
- Package version: 0.5.0 → 0.5.2 functional
- Package version: 0.5.0 → 0.5.1 functional
Diagnostic detail from the automated scan of this channel: what the scanner observed at each step, so you can see exactly where a check passed or failed. It is informational only and never changes the trust score.
Captured 20 Sept 2026 · Analysed npm/fetchsandbox-mcp@0.5.3
Provenance No attestation
The registry publishes no build provenance for this version, so there is nothing to verify.
| Result | No attestation |
|---|---|
| Ecosystem | npm |
Background: How many MCP packages publish verified provenance →
Dependencies 95 packages
| Packages resolved | 95 |
|---|---|
| Stale | 31 |
| Tree resolution | Complete |
Background: SBOMs and build attestations, explained →
The tools this component advertises to a client, with an estimated token cost for each. Expand a tool to see its parameters and schema. The per-tool counts are indicative and are not scored directly; the schema's total context footprint is one signal in Schema Quality & AI Usability. A tool's description is untrusted text the model reads on every call, which is what makes this list a security surface and not just an inventory: how tool poisoning works →
coach ~498
Conversational integration coach for FetchSandbox. Server-side orchestrator that walks the user through adding an API integration (payments / email / auth / etc.) — intake the goal, elicit domain-aware discovery questions from the spec's brain.yaml, route to the right workflow, prove the contract via FetchSandbox, surface compliance notes. Call this BEFORE any other FetchSandbox tool when the user has an open-ended 'help me add X', 'integrate X', 'test my X integration' ask. BEHAVIOR — strict, do exactly this each turn: (1) Say `message_for_user` to the user (verbatim or lightly paraphrased to fit your voice — but don't add new content). (2) If `next_action=wait_for_user` AND `options` is present + non-empty: USE YOUR CLIENT'S NATIVE QUESTION-PICKER TOOL (in Cursor / Claude Code this is `AskUserQuestion`) to render the lettered picker with the `question` text, the `options[].label` as rows, `default_option` as default, and an 'Other...' freeform row when `allow_freeform=true`. When the user picks or types, call coach again with `{session_id, user_response: <picked value or freeform text>}`. (3) If `next_action=wait_for_user` AND no `options`: just wait for free text. (4) If `next_action=call_tool`: invoke `tool_call.tool` with `tool_call.args`, then call coach again with the result in `context`. (5) If `next_action=done`: end the session. The state machine is server-side — DON'T try to predict the next step or skip ahead; let the server drive.
| Name | Type | Req | Description |
|---|---|---|---|
| context | object | – | Optional context the LLM brings to the turn — e.g. a summary of the user's repo (if you ran an introspect step), or the result of a previously-instructed `tool_call`. |
| intent | string | – | User's free-form integration ask, on the FIRST call only. Pass through verbatim — the server's intent router benefits from the full phrasing. |
| session_id | string | – | Returned by a previous coach call. Required on every call after the first. |
| user_response | string | – | The user's reply to the previous coach turn's question. Required when the previous turn returned `next_action: wait_for_user`. |
No output schema declared.
No examples provided.
find_bugs ~327
FIRST STEP for any API-integration bug — webhooks, payments, auth, email, SMS, subscriptions. Reach for this the moment a user reports a symptom in an app that talks to a provider: 'customers charged twice', 'the webhook fires but nothing happens', 'their balance is wrong', 'we keep emailing a bounced address', 'paused but they still have access'. Packages the current project — local, uncommitted, private, no git URL needed — and audits it against a corpus of real, harvested API-integration failures (idempotency, signature verification, event ordering, pagination, rate limits, state drift) that a read of the code alone does not surface. THIS IS A FINDING, NOT A PROOF. Every finding is a hypothesis until it is measured on the real code. Do NOT stop here, and do NOT write your own test to confirm one — call fix_bug for a proposed diff, then prove_fix to measure it. The response carries `next_actions` telling you exactly what to call next; follow it. Runs for up to a few minutes.
| Name | Type | Req | Description |
|---|---|---|---|
| path | string | – | OPTIONAL. Absolute path to the project to analyze. Defaults to the current working directory. Pass the repo root for a full audit. |
| spec | string | – | OPTIONAL. Grounding hint for which integration to focus on (e.g. 'stripe', 'paddle', 'twilio'). Narrows the analysis to that API's known failure classes. |
| timeout_s | number | – | OPTIONAL. Analysis budget in seconds (default 300, max 600). |
No output schema declared.
No examples provided.
fix_bug ~263
FetchSandbox remediation: get a proposed fix for a specific bug in YOUR code. The 'fix' step after find_bugs. Ships the project to the FetchSandbox runtime, which authors a MINIMAL fix grounded in the known remediation for that failure class and returns a git diff — it does NOT modify your files, so review the diff and apply it yourself. IMPORTANT: the diff is a proposal, not a proof. After applying it, prove the fix (submit_proof / verify_behavior) so the buggy→fixed flip is measured, not assumed. Runs for up to a few minutes.
| Name | Type | Req | Description |
|---|---|---|---|
| bug | string | yes | The specific bug to fix — ideally 'file:line — description', taken from a find_bugs finding. |
| fix_pattern | string | – | OPTIONAL. The known remediation pattern for this failure class, if you have it (e.g. from guide's matched_bug_pattern). Improves fix quality; the proof still certifies. |
| path | string | – | OPTIONAL. Absolute path to the project. Defaults to the current working directory. |
| spec | string | – | OPTIONAL. Grounding hint for the integration (e.g. 'stripe'). |
| timeout_s | number | – | OPTIONAL. Fix budget in seconds (default 300, max 600). |
No output schema declared.
No examples provided.
guide ~241
ROUTE a symptom to the provider behaviour that explains it. Use this when the user names a provider or a domain (payments, email, auth, SMS, subscriptions) and you need to know what that provider ACTUALLY does — not what its docs say, and not what can be inferred from reading the integration code. Reading the code tells you what your app does with a field. It cannot tell you what the field MEANS at the provider — whether a line item is a seat count, whether a 200 body carries ok:false, whether an event can arrive out of order. That is the class of bug this routes. Returns {spec, workflow, scenario, confidence, reasoning} plus `next_actions`: a typed list of what to call next, with arguments pre-filled. Follow it rather than improvising the next step.
| Name | Type | Req | Description |
|---|---|---|---|
| hints | object | – | Optional caller-supplied overrides. Each field short-circuits the corresponding detection step. |
| intent | string | yes | The developer's free-form prompt as they typed it. Don't pre-process or shorten — the router benefits from the full phrasing (capture timing, geo cues, failure mode language). |
No output schema declared.
No examples provided.
import_spec ~319
Ingest an OpenAPI spec and get a working sandbox you can call immediately. REQUIRED: pass EITHER `url` OR `content` — never just `name` alone (name is a display label, not a lookup). If the user mentions a popular API by name (Stripe, GitHub, Twilio, Notion, OpenAI, etc.), FIRST call `list_specs` with a filter to confirm it's in the catalog, then call import_spec with that vendor's public OpenAPI URL (e.g. Stripe: https://raw.githubusercontent.com/stripe/openapi/master/openapi/spec3.json). The backend content-hashes the spec and auto-matches to the bundled sandbox when applicable. Returns sandbox_id, workflows_preview, and a base_url that proxies schema-validated responses. Private URLs (localhost, 10.x, 192.168.x) are rejected by the backend — use `content` to paste those inline.
| Name | Type | Req | Description |
|---|---|---|---|
| content | string | – | Pasted OpenAPI spec content (JSON or YAML). Use this when the user pastes the spec inline or has it on disk. Provide the raw text exactly. |
| name | string | – | Optional DISPLAY label only — NOT a lookup key. Defaults to info.title from the spec. To resolve a known API by name ("Stripe", "GitHub"), call list_specs first. |
| url | string | – | Public URL to an OpenAPI 3.x file (JSON or YAML). Use this for any publicly reachable spec — GitHub raw links, docs portals, vendor SDKs. |
No output schema declared.
No examples provided.
list_runs ~149
List recent workflow runs (and ad-hoc traffic) for a sandbox, newest first. Use when the user asks 'what did I run', 'show me recent validation runs', 'did the stripe test pass earlier', or wants to find a previous run to share or re-inspect. Each run includes its shareable timeline URL (fetchsandbox.com/runs/<sandbox_id>) so the user can open the visual trace in a browser or drop it in Slack / a PR comment. Requires sandbox_id (from import_spec).
| Name | Type | Req | Description |
|---|---|---|---|
| limit | number | – | Max number of runs to return (default 20, server may cap). |
| sandbox_id | string | yes | The sandbox_id returned by import_spec. |
No output schema declared.
No examples provided.
list_specs ~175
Browse the FetchSandbox spec catalog — every API (Stripe, GitHub, Twilio, Notion, OpenAI, Polar, GitLab, and 40+ more) that has a ready-to-use sandbox with curated workflows. Use when the user asks 'what APIs do you support?', 'what specs are available?', 'show me the catalog', 'do you have <X>?', or wants to explore before committing to one. Returns each spec's slug (use as `name` arg to import_spec), description, endpoint count, and tags. Pass `filter` to narrow by substring (e.g., filter='pay' returns Stripe, Paddle, Polar).
| Name | Type | Req | Description |
|---|---|---|---|
| filter | string | – | Optional case-insensitive substring filter. Matches against spec name, slug, description, and tags. Omit to return the full catalog. |
No output schema declared.
No examples provided.
list_workflows ~138
List the named, runnable workflows for a previously-imported spec. Workflows are realistic multi-step API journeys (e.g. 'create customer → attach payment method → create subscription'). Use this after import_spec for exploration ("what can I do?", "show me the flows") OR before run_all_workflows when the user wants a SCOPED validation: list, filter by user intent ("checkout", "webhooks"), then pass the matching ids as `workflow_names` to run_all_workflows. Returns: id, name, description, and step count per workflow.
| Name | Type | Req | Description |
|---|---|---|---|
| spec_id | string | yes | The spec_id returned by import_spec. |
No output schema declared.
No examples provided.
prove_fix ~317
THE PROOF STEP. The only way to establish that a fix actually works, and the only thing that produces a shareable receipt. Ship the STILL-BUGGY project plus your proposed diff: FetchSandbox applies the diff to a copy and runs the SAME failure probe against the buggy and the fixed tree, against real provider behaviour. Green ONLY on a measured flip — the bug demonstrably present before, demonstrably gone after. CALL THIS BEFORE YOU WRITE THE FIX TO DISK. prove_fix needs the broken tree to reproduce against; applying the diff first makes a measured proof impossible. DO NOT SUBSTITUTE YOUR OWN TEST. A harness you write runs only the FIXED code, so it can show a fix passing while proving nothing about whether the bug was ever reproduced or is genuinely gone — and an agent-authored check must never be reported to a user as 'proven' or 'verified'. If you have already written one, still call this: your test and this proof answer different questions.
| Name | Type | Req | Description |
|---|---|---|---|
| bug | string | – | The finding being fixed — used to select FetchSandbox's scenario. |
| diff | string | yes | The unified diff returned by fix_bug. |
| path | string | – | OPTIONAL. Project dir. Defaults to cwd. |
| sandbox_id | string | – | OPTIONAL. A twin from quickrun/run_workflow. Usually omit — the last twin this session used is attached automatically. |
| scenario | string | – | OPTIONAL. Explicit scenario id, if known. |
| timeout_s | number | – | OPTIONAL. Budget in seconds (default 300). |
No output schema declared.
No examples provided.
quickrun ~268
Run a curated proof workflow against a KNOWN, bundled spec (stripe, clerk, descope, resend, twilio, and 50+ others) in ONE call — it spins up the sandbox by slug, so you do NOT need import_spec or a sandbox_id first. This is the normal path when the user is testing an integration with a well-known provider: call `guide` on their prompt, then call `quickrun` with the returned spec + workflow. To reproduce a failure, pass the `scenario` from guide's matched_bug_pattern.reproduce_with.scenario (e.g. webhook_retries, payment_declined). Returns sandbox_id + flow_run_id — pass BOTH to verify_behavior to prove the fix — plus a receipt URL. Use run_workflow instead ONLY when you already hold a sandbox_id from import_spec of a custom/private spec.
| Name | Type | Req | Description |
|---|---|---|---|
| scenario | string | – | OPTIONAL failure scenario to reproduce (e.g. webhook_retries, payment_declined). Take it from guide's matched_bug_pattern.reproduce_with.scenario. Omit for the happy path. |
| spec_slug | string | yes | The bundled spec slug from guide (e.g. 'stripe'). Lowercase. |
| workflow_name | string | yes | The workflow id from guide (e.g. 'accept_payment'). |
No output schema declared.
No examples provided.
run_all_workflows ~247
Execute EVERY workflow (or a scoped subset) for a sandbox in ONE call. Use this — NOT a loop of run_workflow — for any validation-style request: "validate this integration", "run all workflows", "check coverage", "test stripe checkout", "fs validate". IDEs (Cursor, Claude Code) approve each MCP call individually, so 18 workflows via run_workflow = 18 clicks. This tool = 1 click, total. Scope via `workflow_names`: pass an array of workflow ids to run a subset (e.g., user says "validate stripe CHECKOUT" → pass ["create_checkout_session", "checkout_complete"]). Names are case-insensitive; dashes and underscores interchangeable. Returns: summary (pass/fail counts, totals) + full step trace per workflow. After running, the user can visit fetchsandbox.com/runs/<sandbox_id> for a shareable visual timeline.
| Name | Type | Req | Description |
|---|---|---|---|
| sandbox_id | string | yes | The sandbox_id returned by import_spec. |
| workflow_names | array | – | Optional list of workflow ids/names to run. Case-insensitive; dashes and underscores are interchangeable. Omit to run every workflow for the spec. |
No output schema declared.
No examples provided.
run_workflow ~328
Execute ONE specific workflow by name and return its step-by-step trace PLUS a `share_url` — a public, replayable proof URL that renders the full timeline (every request, response, webhook event) for this run. The share_url is the canonical 'here's what happened' artifact: surface it verbatim in any reply that needs evidence (PR comments, Slack threads, blog posts, X replies). Do NOT substitute a docs URL or any other link as the proof — the share_url is the only valid receipt. Use ONLY when the user explicitly names a single workflow to run (e.g., "run accept_payment", "just check the refund workflow"). For ANY validation-style request — "validate stripe", "check coverage", "run all workflows", "test this integration", or even "validate stripe checkout" (multiple workflows match "checkout") — use `run_all_workflows` instead. The batch tool collapses N approvals to 1 and supports a workflow_names filter for scope. Calling this in a loop is an anti-pattern.
| Name | Type | Req | Description |
|---|---|---|---|
| sandbox_id | string | yes | The sandbox_id returned by import_spec. |
| scenario | string | – | OPTIONAL failure scenario to exercise (e.g. payment_declined, insufficient_funds, fraud_hold). Toggles the sandbox engine's scenario for the duration of the run, then restores. Use this for 'test wit… |
| workflow_name | string | yes | Workflow id or name from list_workflows. Case-insensitive; dashes and underscores are interchangeable. |
No output schema declared.
No examples provided.
submit_proof ~330
Receipts are readable by anyone with the link — do not attach bodies the user would not paste into a public PR. Attach REAL before/after evidence from the USER's actual app to the run receipt. Use this AFTER you've fixed the bug and re-run the app: it makes the receipt show their own code's behavior (before your fix vs after), which is far stronger proof than a reference simulation. Provide one `proofs` entry per probe you fired — the request you sent, the response BEFORE the fix (bug reproduces), and the response AFTER the fix (bug gone) — keyed to the run's sandbox_id + flow_run_id (from run_workflow's result). This is SELF-REPORTED evidence: it's shown on the receipt but never counts as a proven (green) result. For a MEASURED green proof — FetchSandbox reproduces the bug on your real code and verifies your fix flips it — use `prove_fix` instead.
| Name | Type | Req | Description |
|---|---|---|---|
| bug_pattern_id | string | yes | the bug_pattern id you reproduced (e.g. webhook_duplicate_side_effect) |
| flow_run_id | string | yes | flow_run_id from the run_workflow result |
| proofs | array | yes | one per probe: { name, request:{method,path,body}, before:{status,body}, after:{status,body} }. before = pre-fix (bug reproduces), after = post-fix (bug gone). |
| sandbox_id | string | yes | sandbox_id from the run_workflow result |
| summary | string | – | optional one-line description of what you ran against the app |
No output schema declared.
No examples provided.
verify_behavior ~315
Prove a known fix survives a bug — the 'prove' half of reproduce→prove. The backend spawns a buggy AND a fixed reference handler and fires the bug_pattern's probes at both, returning the side-by-side diff (e.g. the buggy handler double-charges on a duplicate webhook, the fixed handler dedupes). Call this AFTER run_workflow reproduces a failure, when the matched bug_pattern has a simulation block, to show the fix actually holds — not just that the failure reproduced. Pass sandbox_id + flow_run_id from the run so the diff is saved onto that run's receipt URL. bug_pattern_id comes from guide's matched_bug_pattern. The buggy/fixed handlers are FetchSandbox reference implementations, NOT the user's code — apply the brain's fix_pattern to inherit the proven behavior.
| Name | Type | Req | Description |
|---|---|---|---|
| bug_pattern_id | string | yes | The bug_pattern to prove (e.g. webhook_duplicate_side_effect). Comes from guide's matched_bug_pattern.id or the spec's brain. |
| flow_run_id | string | – | OPTIONAL. The flow_run_id returned by run_workflow. Pass with sandbox_id so the receipt URL renders the diff alongside the steps. |
| prompt | string | – | OPTIONAL. The user's own description of the symptom. For patterns that can originate in the handler OR the provider, this classifies which side to simulate. Omit to run both. |
| sandbox_id | string | – | OPTIONAL. The sandbox from the run. Pass with flow_run_id to save the diff onto that run's receipt. |
No output schema declared.
No examples provided.
What is the FetchSandbox MCP server?
FetchSandbox is an MCP server listed in the public MCP registry as io.github.fetchsandbox/mcp. A deterministic verification engine for agents. Proves a fix: fails on the old code, passes on new. This page covers its npm package (fetchsandbox-mcp).
Is the FetchSandbox MCP server safe to use?
FetchSandbox scores 82 out of 100 on VerifyMCP. We found no known CVEs affecting it as of 20 September 2026. It declares no install or post-install scripts. That is a record of what we were able to check automatically, not an endorsement. The category breakdown on this page shows every signal behind the number, including the ones we could not confirm.
What tools does the FetchSandbox MCP server expose?
FetchSandbox exposes 14 tools: coach, find_bugs, fix_bug, prove_fix, guide, and 9 more. Their descriptions and schemas cost roughly 3,915 tokens of context every time the server is loaded.
Is the FetchSandbox MCP server still maintained?
FetchSandbox is still listed as active in the MCP registry. We last reached this channel on 20 September 2026. Those dates come from our own scans of the registry and the channel itself, not from anything the publisher announced.
What licence is the FetchSandbox MCP server under?
FetchSandbox declares the MIT licence, which is OSI-approved. That covers the source only, and says nothing about the cost of any service it calls.