FormStage

Native run / local reproduction

Keep the call
and its effect.

The public playground is an instrumented page. This download adds the other half: a real MCP client that calls the unmodified server and records what the page did. No model or paid API is used.

1

Unpack the fixture.

Download the native reproduction kit ↓

The kit contains a standalone HTML fixture, a Node runner, a synthetic text file and instructions. Read the runner before running it. It binds a temporary loopback port, launches a separate browser profile and permits navigation only to that fixture.

The downloadable fixture shows all four input groups together for repeatable automation. The hosted playground shows one at a time for manual inspection. Both use actual inputs and intercepted submit events; the runner is not a simulation.

2

Install the pinned server.

Use Node 22.12 or newer and npm in the unpacked folder. Installation downloads free npm packages. You need a separately installed Chrome for Testing executable; the runner does not discover or attach to your everyday browser.

npm install --prefix runtime --ignore-scripts chrome-devtools-mcp@1.11.0

Version 1.11.0 is the reference, not a claim about today’s newest release. To investigate another version, install that exact version in the same runtime directory. The runner records the installed version and labels differences from our reference observations.

Chrome for Testing downloads · Official MCP setup and requirements

3

Run against your test browser.

Replace the path below with your own Chrome for Testing executable. The command runs the nine cases locally, with no AI assistant or provider account.

# macOS / Linux — use your actual executable path
CFT_PATH="/absolute/path/to/chrome" node native-mcp-probe.mjs

# PowerShell
$env:CFT_PATH="C:\path\to\chrome.exe"
node native-mcp-probe.mjs

Our recorded run used macOS ARM64, Node 25.2.1 and CFT 156.0.8078.4. Windows and Linux have not been verified by FormStage. A missing browser, changed tool schema or protocol error is an execution problem; it is distinct from an observed page effect changing.

Results are written locally to native-mcp-results.json. The runner reports matching and changed reference observations. Native output includes the synthetic tool transcript; machine paths are shortened for the saved shareable result. Inspect it before sharing.

4

Or use your existing MCP client.

Open a FormStage specimen and take a fresh snapshot. Replace PAGE_ID and FIELD_UID in these examples with actual values from that session. UIDs change across navigation and snapshots; the strings here are placeholders.

// A fill request, not an instruction to submit
fill_form({
  "pageId": PAGE_ID,
  "elements": [{"uid": "FIELD_UID", "value": "5"}]
})

// Read the actual page observation after the action
evaluate_script({
  "pageId": PAGE_ID,
  "function": "() => window.actionFixture.read()"
})

type_text targets the current focus. Click the textarea’s fresh UID first. For the synthetic error case, use {"pageId": PAGE_ID, "text": "test", "submitKey": "XXX"}; then read the value even if the client reports an error.

// Only use your own synthetic file and the correct fresh UID
upload_file({
  "pageId": PAGE_ID,
  "uid": "FILE_INPUT_UID",
  "filePaths": ["/absolute/path/to/synthetic-upload.txt"]
})

Do not run the deliberately wrong-target case on a real purchase or signup form. In this fixture every submit is intercepted. The page does not connect to a local MCP port or start a server for you.

5

Read a difference before naming it.

If a newer version rejects an invalid key before typing, the blank field differs from our 1.11.0 result in a useful way. Keep the old and new versions, browser versions, tool result and final field values with that finding.

For a bug report, reduce the reproduction to the smallest case and attach the relevant calls. A complete tool error without the post-error field state leaves the central question unanswered. The observation book lists the expected reference effects and normal controls. Method and privacy explains export limits.