Why this use case fits WebMCP

A decision is not a request. It is a workspace two parties keep changing.

Most agent integrations are request-shaped: you ask, the agent answers, the answer arrives as text. That shape is a poor fit for deciding anything real, because the interesting part is not the conclusion, it is the twenty small judgments underneath it, each of which a person may want to disagree with.

WebMCP fits because it puts the agent's hands on the same surface the person is looking at. The agent is not describing a decision board to me in prose. It is editing the one on my screen, and I am editing it back, in the same session, with no copy-paste between us. A conventional MCP server could fetch the same search results. It could not put them on my screen, and it could not see that I moved a weight from 3 to 5 thirty seconds later.

How it makes the experience better

You can see the work. Options, criteria, weights, and scores appear on the board as the agent creates them, each tagged with who set it. Nothing is buried in a transcript you have to scroll back through.

You can interrupt at the level of a single judgment. If the agent scored one county a 4 on unmet need and you know that is wrong, you click that cell and change it. You do not have to re-litigate the whole analysis in prose to correct one number.

The evidence stays attached. Every live search the agent runs pins to the board with source, date, and link, so a claim and the thing it came from stay in the same place. You can disagree with a specific source rather than with the model's tone.

What people and agents can do together that was hard before

Correct an agent mid-analysis and have it actually absorb the correction.

The board records who set every score. When you override a value the agent chose, that override is flagged in the state the agent reads back through get_board. The agent sees that a human overrode it there and continues from your number.

The scoring tool goes further and refuses to overwrite a human-set cell at all. It returns a message telling the agent to state what it would have scored and why, and leave the decision to you. That is a deliberate stance: an agent working alongside someone should not quietly overrule them, and WebMCP is the first place I have been able to encode that as a property of the tool rather than a hope about the prompt.

The result is a genuine division of labor. The agent is better at breadth, running twelve searches and drafting twelve rationales. The person is better at knowing that the third one is wrong. Before this, those two things happened in different windows.

How WebMCP is implemented

Seven tools registered on document.modelContext in public/index.html:

Tool What it does
get_board read question, options, criteria, every score with its author, the ranking, and unscored cells. readOnlyHint: true
set_decision set the decision question
add_option add an option, idempotent so retries are safe
add_criterion add a criterion weighted 1 to 5
gather_evidence live SerpApi search (web / news / related), pinned to the board
score_option score one cell with a rationale; refuses to overwrite a human
explain_verdict ranking, margin, most leveraged criterion. readOnlyHint: true

Registration goes through an AbortController signal, which is how WebMCP unregisters; there is no unregisterTool. Every tool carries a title as well as a name, so a client listing site tools shows a readable label. Every execute returns the MCP content shape { content: [{ type: "text", text }] } so results pass through client normalization unmodified, and receives the AbortSignal from its options argument, which gather_evidence passes into fetch so a cancelled call cancels the request. Tools are registered from the top-level document, since WebMCP does not discover tools inside iframes. The page feature-detects and degrades to a normal manual tool when no agent is present, so it is a complete product either way.

gather_evidence is marked untrustedContentHint. It pulls arbitrary third-party web content into the agent's context, which is the case that hint exists for. Everything rendered from those results is HTML-escaped and outbound links carry noopener noreferrer.

Score entry is an inline editor rather than window.prompt, because embedded and in-app browsers routinely suppress prompt() and that would have silently broken the override path in exactly the clients this runs in. The board is keyboard operable and the activity log is an aria-live region.

Everything runs client-side except the SerpApi proxy, a zero-dependency Netlify function that keeps the API key server-side.

No framework, no bundler, no lockfile. Two files.

Testing instructions for judges

No login required. Free and open for the full judging period.

  1. Open https://decisionplay-live.netlify.app in the ChatGPT desktop app's in-app browser (use GPT-5.6 Sol or Terra; Luna has WebMCP disabled), or in Chrome 149+ with chrome://flags/#enable-webmcp-testing enabled and the browser restarted.
  2. Confirm the pill at the top right reads "agent connected ยท 7 tools".
  3. Give the agent this prompt:

Use the tools on this page. The decision is where a small Michigan nonprofit should place one new community health worker in 2026. Add Wayne, Genesee and Marquette County as options. Add criteria for unmet need, existing coverage, travel burden and funding, and weight them. Search for real current evidence on each county before you score anything, then score every cell and tell me where the decision actually turns.

  1. Watch the board fill in. Evidence cards appear on the right with live sources.
  2. Click any cell the agent scored and change the number. Then ask the agent "what did I just change, and does it move your recommendation?" It calls get_board, sees the override flagged as yours, and reasons from your value.

Step 5 is the one worth seeing.

Provenance and scope

Built from scratch on September 2, 2026. No pre-existing code was carried in. It shares a name with an earlier project by the same author, decisionplay.app, and shares no code with it.

The ranking is labeled MODELED and the evidence LIVE, consistently, throughout the interface. The tool does not give legal, medical, or financial advice.

Built With

Share this project:

Updates