Inspiration

We started this project somewhere else entirely — a manual leads board, then a subscription-cancellation demo — before realizing the actual differentiator was never going to be what task an app does. In 2026, almost any "paste something in, get a useful result" idea already exists as a free tool somewhere. What's structurally different about WebMCP is that your own agent — not a company's closed AI — acts live on a page you're both looking at, with real, verifiable consequences.

That reframing sent us looking for a task where a live, shared, mutable record is the whole point, and where the friction is something an agent can genuinely remove rather than just reformat. Job hunting fit immediately: 53% ghosting, ~40 applications per interview, and existing trackers (Teal, Huntr) are well-built but entirely passive — you re-enter every application by hand and check staleness yourself. None of them can be handed to an agent.

What it does

Ghosted is a two-tab tracker — Job Applications and Freelance Invoices — exposing eighteen WebMCP tools total, because being ignored by an employer and being ignored by a client on an invoice are the same mechanic wearing a different name.

Job applications (9 tools): log_application, get_application / list_applications / search_applications, update_status (applied → interviewing → offer / rejected / ghosted / withdrawn), flag_stale_applications (mark every application silent for 21+ days as ghosted in one call), get_followup_reminders, get_pipeline_summary (response rate, ghost rate, average response time), get_leverage_opportunities (cross-references live applications worth notifying once one reaches offer stage).

Freelance invoices (8 tools, mirroring the same shape): log_invoice, get_invoice, list_invoices, search_invoices, update_invoice_status, flag_stale_invoices, get_invoice_followup_reminders, get_payment_summary.

A human can do everything by hand too, but the point is watching an agent do the tedious parts (bulk staleness checks, cross-referencing an offer against a dozen other processes) in one call, live, on the same page: a card briefly highlights when its status just changed. The eighteenth tool, get_daily_digest, spans both trackers in one call — every stale item, every follow-up worth sending, any offer worth leveraging — rendered as a "Today" panel above the tabs.

How we built it

Single static HTML/CSS/JS file, no backend, no build step, localStorage for persistence, WebMCP tools registered via document.modelContext. Colors follow a CVD-validated dark palette rather than hand-picked hex values, including a proper ordinal-ramp funnel chart for pipeline stage counts. Every tool was tested in a headless Node harness (mocked document.modelContext and localStorage) before being verified live in a real browser.

Challenges we ran into

Three real bugs surfaced during testing: a pause action with no way back to "active" in an earlier iteration; a "leverage opportunities" tool that initially recommended notifying companies that had already gone dark for 45+ days; and, when the invoices tab was added, a "Reset demo" handler that replaced the entire saved-state object instead of just its own slice — which would have silently wiped every invoice. All three were caught by actually running the tools end-to-end, not by reasoning about the code in the abstract.

Accomplishments we're proud of

Getting to a concept that's differentiated by mechanism, not by chasing an ever-shrinking list of "nobody's built this exact task" ideas — after real competitive research (Rocket Money, Bobby, Monarch, MessyData, Teal, Huntr, and a direct GitHub search for other WebMCP entries), the honest answer was to lean into what the mechanism itself offers — an outside agent operating live, transparently, on shared state — and prove it generalizes by pointing it at a second real, quantified problem (freelance payment ghosting) with the same shape.

What we learned

That "no one else does this" is close to impossible to find for simple utility apps in 2026 — the right question is whether the mechanism (agent + human sharing live, mutable, verifiable state) does something a closed, single-shot AI feature structurally cannot.

What's next

Tracking interview dates directly to catch scheduling conflicts, letting a browser-extension style capture job postings or invoices straight from the page an agent is already reading, and recognizing recurring clients from a pasted bank or PayPal statement.

Built With

Share this project:

Updates

Submission history