Inspiration

Company retreat planning forces people-ops leads and executive assistants to reconcile attendee origins, travel burden, dates, budget, venue fit, activities, and stakeholder preferences. When a human edits the plan in one surface while an AI reasons in a separate chat, state drifts and recommendations become difficult to trust.

Gather makes the website itself the shared operating surface.

What it does

Gather is a mobile-first group decision room organized around Align → Explore → Decide. Stakeholders propose priorities and constraints, but only a human can accept or decline them. A compatible WebMCP agent then reads that exact live plan, explores thousands of venue × routing × activity × meal × schedule combinations, and returns three trade-off finalists plus a versioned Decision Receipt.

Every meaningful human and agent action is visibly attributed in the same workspace. Agent changes highlight the affected UI, remain reversible with one-click undo, and never bypass the human-only proposal approval and PDF download boundary.

Why WebMCP

WebMCP is essential because the agent needs structured access to the same changing decision state the human sees—not a copied prompt or brittle UI automation. Eleven narrow semantic tools expose the live, versioned decision model. This lets people and agents collaborate in one visual workspace while Gather deterministically verifies the result.

The experience is better than chat alone: people see every consequential agent effect immediately, can inspect fairness by origin, review honored constraints and metric deltas, and undo a change without translating a recommendation back into the plan.

How we built it

Gather uses Next.js 16, React 19, TypeScript, Tailwind CSS 4, Zustand, Zod, and jsPDF. Native imperative tools are registered through document.modelContext.registerTool and share the same typed Zustand/domain actions as the human UI—there is no duplicate agent implementation.

Every agent write requires the current state version. Compound operations also require an idempotency key. Registration uses an AbortController lifecycle. Stale or impossible requests return structured, non-throwing business errors without mutation. Gather verifies canonical state after every successful write, and proposal preparation is bound to an exact version and snapshot hash so stale proposals cannot be approved.

The deterministic optimizer evaluates more than 2,000 combinations, applies hard constraints, computes attendee-level travel fairness, and selects three Pareto-style finalists.

Challenges

The hardest parts were keeping compound constraint changes atomic, preventing stale writes, making fairness inspectable rather than hidden inside a score, and preserving human authority structurally while still giving an agent useful planning power.

Accomplishments and verification

The public build includes 11 native WebMCP tools, visible provenance, atomic constraint handling, one-click undo, stale-write protection, canonical verification, a Decision Receipt, and a human-only approval gate. The release passes lint, TypeScript, 90 automated tests, and a production build. It is deployed publicly with no login or API key required.

Synthetic prototype disclosure

All venues, routes, prices, scores, and availability are original synthetic demo data. Gather does not book travel, use live inventory, or connect to production Offsite systems. This is a synthetic WebMCP Challenge prototype.

Built With

Share this project:

Updates

Submission history