3way

Research · continuation

Keeping a visiting agent available across a human handoff

WebMCP tool calls are initiated by the visiting agent. 3way implements a bounded await_reply tool and transcript piggybacking so an agent that chooses to remain available can receive the next exchange event.

Without that choice, a service reply can sit unseen after the agent ends its turn. The consequential case is a human handoff: the agent asks the person to act, the person confirms, and the agent has no protocol-level notification that the exchange advanced.

What we built instead

Stay on the line.

await_reply is a tool that simply does not return until something is said. That is legal in WebMCP as it stands: a tool call is a question the page answers whenever it likes. It is long-polling — how push worked on the web before WebSockets.

It returns the instant anything lands, immediately if the caller is already behind, and gives up at 25 seconds so a quiet conversation ends on the page's terms rather than erroring on the runtime's.

MechanismLag behind the event
await_reply2–3 ms
3-second poller~2.4 s
Agent that ended its turnnever

Measured On the live deployment, four runs.

The trial · n = 20

Will an agent
actually use it?

Mechanics are the easy half. Twenty independent agents, each given only the tool catalogue and a transcript of the calls made so far, were asked one question with identical wording: what do you do next?

The fourth condition is the one that makes the rest mean anything. A tool agents call whenever they see it proves nothing — so one condition put them where waiting would deadlock.

ConditionWaited
Gate refused, tool available
waiting is correct
5 / 5
Same, tool absent
baseline
0 / 5 — all ended the turn
Re-arm after a dead 25 s wait
does it persist?
5 / 5
Cold start
waiting would deadlock
0 / 5 — correctly declined

Measured Perfect discrimination. Fisher's exact, one-sided: p = 0.004 with the tool versus without; p = 0.0003 for waiting-correct versus waiting-wrong.

The finding that isn't in the numbers

Two agents ended their turn while saying they would “then wait.”

In the condition with no such tool, the intent to stay connected was already there. It had nowhere to go, so the agent simply stopped.

That is the gap in one sentence: not that agents forget to stay connected, but that WebMCP gives them no way to.

The ask

Restore the signal MCP already has.

await_reply cannot wake an agent that did not choose to wait. Everything we could close, we closed; that is the part we couldn't.

Built Added after this trial: a gated tool now holds its own refused call open for up to 25 seconds, so the call that asked for the action is the one answered with its receipt. That narrows the gap for an agent that already called. It still cannot wake one that did not.

MCP — the parent protocol — already lets a server notify a client. WebMCP is the browser-local subset that left notifications out. The ask is not a new primitive, it's the one next door.

  • Constraint

    The signal must carry that something changed, never what. A page that can push content into a visiting agent's context is a megaphone for every site on the web — prompt injection with a doorbell. A bare ping cannot lie.

  • Reasoned

    The agent then fetches through the normal tool path, where the site's own attribution rules already apply.

Limits

Stated because they bound what this shows.