Show the fix once. Approve every change.
One Good Row is a WebMCP proof of concept for a common operations problem: a person edits and saves one messy record, an agent reads the exact before-and-after diffs, and the site turns that evidence into a visible bulk proposal. Nothing is applied until the person reviews the cell-level diff and approves the exact visible version; the apply call must then match both the current proposal ID and that approved version.
The demo uses a 16-row synthetic vendor master. It is deliberately small enough to understand in one glance while still showing the control pattern needed for higher-stakes workflows: narrow tools, temporary permissions, explicit exceptions, version-bound approval, an activity trail, and full undo.
Built for the 2026 OpenAI WebMCP Challenge.
Live demo: one-good-row.smartjon7.chatgpt.site
A chat-only assistant cannot reliably see which record the human corrected, which rows are locked, which proposal version is on screen, or whether approval is still valid. One Good Row exposes that live application state through imperative WebMCP tools registered on the top-level page.
The available tool surface changes with human intent:
- Reset begins with a messy
V-1042and no saved demonstration. The human edits and saves that six-field correction. - The agent begins with read-only inspection and can read the saved diffs.
- The human can temporarily enable proposal staging.
- The agent can stage deterministic rules and manage row exceptions, but cannot change the dataset.
- The site exposes the apply tool only after the human approves the exact visible proposal version. Apply requires both the current proposal ID and that approved version.
- Applying revokes staging and blocks another batch until the current batch is undone or the demo is reset. The site exposes a full undo tool during that state.
This makes permission a visible part of the interface instead of a hidden promise in a prompt.
| Tool | Availability | Effect |
|---|---|---|
inspect_dataset |
Always | Reads the current synthetic rows and quality profile. |
read_demonstration_diffs |
Always | Reads the saved edits for V-1042; it returns no diffs before the human saves the demonstration. |
inspect_proposal |
Always | Reads the current proposal, version, exact changes, confidence counts, exceptions, and approval state. |
stage_transformation |
Only while the human enables staging | Creates or replaces a reversible proposal using supported deterministic operations; it never edits dataset values. |
set_proposal_exceptions |
Only while the human enables staging | Adds, removes, or replaces row-level exceptions; every revision increments the version and clears approval. |
apply_approved_proposal |
Only after approval of the current exact proposal | Requires its exact proposal_id and proposal_version, rejects stale identity or state, and preserves the complete pre-apply dataset snapshot. |
undo_last_apply |
Only after an apply | Restores the complete pre-apply snapshot. |
Tool inputs use narrow JSON Schemas, unknown fields are rejected, dataset text is marked as untrusted content, and tool registration is removed with AbortController when the corresponding permission or state ends.
Requirements:
- Node.js 22.13.0 or newer
- npm
npm ci
npm run devOpen the local URL printed by the development server. First review the six corrected fields for messy row V-1042 and click Save as the demonstration. In a browser without WebMCP, the interface displays Preview mode and the Preview the agent flow button exercises the same deterministic state-transition functions used by the site tools.
To use the actual tools, deploy the site over HTTPS and open it in a WebMCP-enabled browser. The official WebMCP documentation describes current ChatGPT browser support and testing requirements.
Suggested agent prompt:
Read my demonstration and the dataset. Stage a conservative transformation plan that follows the exact diffs, keep uncertain rows excluded, and show me the proposal before asking for approval.
npm test
npm run typecheck
npm run lint
npm run buildThe detailed release and browser test matrix is in docs/WEBMCP_TEST_PLAN.md.
app/page.tsxrenders the shared human-agent workspace and every permission, proposal, approval, apply, and undo state.hooks/use-webmcp.tsregisters the seven imperative site tools and dynamically narrows the tool surface as state changes.lib/one-good-row.tscontains the typed synthetic dataset, demonstration capture, deterministic transformations, proposal identity and versioning, exceptions, apply, and undo logic.tests/verifies the core transformation and control invariants.
The app is built with React, TypeScript, Tailwind CSS, shadcn components, Vinext, and the OpenAI Sites starter. It does not require an AI API key or an application database.
One Good Row demonstrates a reusable interaction pattern: read intent from visible human edits, stage a reversible plan, surface uncertainty, bind execution to reviewed state, and preserve recovery.
It is not a production data-cleaning system. All records and .example email addresses are synthetic. State is held in the browser and resets on refresh. The rule set is intentionally limited to six deterministic formatting operations, and any row with a medium- or low-confidence proposed change is automatically held for review. There is no authentication, multi-user concurrency, durable storage, file upload, external system integration, or claim that one example is sufficient for arbitrary semantic transformations. A production version would need those controls, plus organization-specific validation and audit retention.
- OpenAI WebMCP Challenge
- Challenge page on Devpost
- Official challenge rules
- OpenAI WebMCP documentation
This project is available under the MIT License.
