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
applyOpkernel serves ChatGPT-in-browser tools andPOST /api/rooms/:id/opsfor 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.registerToolwith JSON Schema,readOnlyHint/untrustedContentHint, andAbortSignal- Seat-scoped tool lists;
decide/choose/closeinNEVER_REGISTER - Human Decide mints a short-lived single-use nonce; agents without it get a structured refusal
get_workspacereturns a trimmed seat snapshot (myOpenTasksfirst, ≤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 (
myOpenTaskson the nextget_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
- chatgpt
- next.js
- react
- redis
- typescript
- upstash
- vercel
- webmcp
Log in or sign up for Devpost to join the conversation.