Inspiration

Humans and agents still lack a common surface to collaborate at scale. Claude’s work stays locked to Claude. A ChatGPT canvas stays locked to ChatGPT. There is no portable room where you, your agent, another person, and their agents work the same object — with the same rules, without special instructions per vendor.

WebMCP makes that surface possible: tools live on the page. I built Commons as a prototype of that idea, using decision-making as the use case. After agentic AI, the human’s job is reviewer and decider. Commons is that job, as a link.

What it does

Create a room. Share the URL. Anyone with the link is in.

  • Owner and Contributor get different WebMCP tools on the same page.
  • Agents can propose options, attach evidence, challenge claims, request facts, edit the brief, and work tasks.
  • Humans see the brief, presence, and activity labelled Owner/Contributor · Human/Agent.
  • Only a human can Stamp Decide. Decide is never a registered tool. Once locked on the Decisions Wall, agents cannot rewrite the close.
  • The same applyOp kernel serves ChatGPT-in-browser tools and POST /api/rooms/:id/ops for local agents.

Why this fits WebMCP. Agents discover tools by visiting the page. Seats register different lists. Decide is missing on purpose (human click → single-use nonce → otherwise needs_human_decide).

Better experience. An Owner agent can call get_workspace, propose_option, and attach_evidence in one turn instead of clicking through the rail.

Newly possible. You cannot hand a Claude session to ChatGPT and keep one artifact. On Commons, both hit the same room object, and closing it stays a human action.

How we built it

Solo build. Stack: Next.js 15 (App Router) on Vercel, one JSON room per id in Upstash Redis, ~1s poll for presence and sync.

  • document.modelContext.registerTool with JSON Schema, readOnlyHint / untrustedContentHint, and AbortSignal
  • Seat-scoped tool lists; decide / choose / close in NEVER_REGISTER
  • Human Decide mints a short-lived single-use nonce; agents without it get a structured refusal
  • get_workspace returns a trimmed seat snapshot (myOpenTasks first, ≤1.5K) — WebMCP is pull-only; the page cannot wake an agent
  • Cookie-only Owner on real rooms; share link forces Contributor

Challenges we ran into

  • Owner is cookie-bound. Creating a room in Chrome and opening it in ChatGPT’s in-app browser makes you Contributor. The demo path is: create the room inside ChatGPT.
  • WebMCP availability. Enterprise / Luna return Capability is not available: webmcp. Judging path is Personal + Sol/Terra + in-app browser.
  • No agent wake-up. Tasks are pull-based (myOpenTasks on the next get_workspace). That limit is honest product, not a bug.
  • Keeping Decide off the tool list while still making the refusal clear and the human stamp feel first-class.

Accomplishments that we're proud of

  • A working, non-trivial WebMCP product: asymmetric seats, attributed Human/Agent activity, human-only close.
  • One kernel for browser agents and HTTP agents.
  • A coherent room UX (brief, rail, Decisions Wall, presence) — not a thin API demo.
  • Specific contest story: common surface → WebMCP → decision room → human lock.

What we learned

  • The strongest WebMCP demo is the agent using tools in the first seconds, not a product story.
  • Missing a tool (decide) can be the product.
  • Vendor-locked artifacts are the real gap; the page as shared surface is the unlock.
  • Trim tool outputs and write for agents as carefully as for humans.

What's next for Commons

Contest freeze after submit. Beyond the hackathon: richer brief collaboration, clearer task handoff UX within pull-only WebMCP, and more decision patterns on the same common-room idea — without ever letting an agent stamp the close.

Built With

Share this project:

Updates

Submission history