Inspiration

I talk to enough people that promises disappear into notes, calendars, and guilt. Traditional CRMs optimize deals and reporting. I wanted a quieter tool for the relationships where the real question is: what did I say I would do?

What it does

Keep is a local-first relationship desk. It stores fictional demo contacts in the browser, turns raw call notes into owner-labelled promise chips, ranks people who need attention, and creates editable follow-up drafts. Keep never sends a message. The human remains responsible for anything another person receives.

Why WebMCP

This workflow depends on live page state: which person is selected, their last interaction, unresolved promises, pipeline position, and whether a draft exists. Screen scraping makes an agent guess. A backend integration separates the agent from the interface where the human reviews the result.

Keep registers narrow tools through document.modelContext.registerTool. Those tools call the same store as the human UI, so cards, timelines, promises, suggestions, and drafts update in front of both participants. The active tool set changes with page state. With no selected card, the agent sees discovery tools. Selecting Priya adds her relevant actions. Promise and draft tools appear only when those objects exist.

Human and agent together

After a call, the human gives the agent one messy sentence. The agent logs the original words, extracts commitments, and moves the card. On Monday morning, who_needs_attention ranks relationships using cadence, overdue promises, and the Waiting on me column. The agent can draft a follow-up, but it cannot send one. mark_sent only records an action after the human confirms it already happened.

How I built it

The app uses React, TypeScript, Vite, and a small useSyncExternalStore state layer persisted to localStorage. It exposes 14 WebMCP tools with JSON Schema inputs. Read operations use readOnlyHint; promise extraction marks raw notes with untrustedContentHint. A deterministic commitment parser and draft generator keep the live demo independent of API keys or inference availability.

Archiving, dropping a promise, and recording a sent message have in-page confirmation gates. The repository includes eight unit and WebMCP contract tests plus browser acceptance coverage for desktop and mobile. OpenAI Sites hosts the public production build used for judging.

Challenges

The hardest choice was deciding what the agent must not do. Auto-sending would look powerful in a demo, but it would turn a relationship tool into an impersonation tool. Keep makes the handoff visible instead. The agent can organize, recall, and draft. The person decides what is true and what leaves the browser.

The second challenge was keeping agent calls and human actions consistent. Both paths now mutate one store and produce the same visible UI changes. Dynamic registration also required careful cleanup with AbortController as selection and object state changed.

What I learned

WebMCP is most useful when the browser is not a thin shell over an API. It lets an agent participate in a stateful visual workflow without bypassing the product or duplicating authentication and client state on a server. The best tools are narrow verbs with visible effects.

What is next

Calendar context is the next useful input, followed by optional encrypted sync. Sending integrations are not on the roadmap. Keep should become better at helping a person remember, not better at pretending to be them.

Built With

Share this project:

Updates

Submission history