Feedback from shipping a WebMCP-native app (Brainstorming) — three integration tracks, what worked, what didn't

60 views
Skip to first unread message

Adi Levinshtein

unread,
Apr 21, 2026, 11:23:14 PM (14 days ago) Apr 21
to Chrome Built-in AI Early Preview Program Discussions

Hi,

I’ve been building on the WebMCP Early Preview and just published the result (still a WIP). Sharing here because once I moved past demos and tried to build something real, a few gaps became pretty clear.

What I built

Brainstorm — a local-first canvas where an AI facilitator operates on the board itself.

No sidebar chat. The agent uses tools to:

  • add ideas
  • connect nodes
  • critique
  • explore alternatives

Everything goes through explicit WebMCP tools.

  • Local-first, runs fully in-browser
  • BYOK (Gemini)
  • Same codebase works as standalone app or extension

Link


What’s exposed

I’m registering:

  • 23 global tools + 10 lifecycle tools
  • Idea CRUD + canvas mutations (move_panel, group_ideas, merge_ideas)
  • Analysis (find_connections, critique_idea, scout_ideas)
  • Lifecycle (advance_phase, select_approach, respond_to_challenge, etc.)

Tools are scoped with AbortController and re-register on phase changes.


Integration paths I tried

To understand the surface area, I built against three modes:

W1 — Consume tools from the active tab (extension)
Works, but requires MAIN-world injection + explicit user consent.

W2 — Expose tools from an extension side panel
Fully built, but currently blocked (see below).

W3 — Expose tools from a standalone web app
This is what’s live now. It’s the only path that’s clearly aligned with the current spec.


What broke (or wasn’t clear)

Once I moved beyond toy examples, these came up pretty quickly:

1. MAIN-world is a hard requirement (not documented clearly)

navigator.modelContext only exists in the page (MAIN world).
Content scripts see undefined.

The only working path is: chrome.scripting.executeScript({ world: 'MAIN' })

This isn’t obvious from the docs, but it’s an architectural constraint.


2. No way to reliably list tools

There’s no standard listTools().

If you want to discover tools on a page, you end up relying on non-public internals or guessing. If that changes, things silently break.

This feels like a missing primitive.


3. Extension-origin support is unclear (W2 blocker)

It’s not clear whether navigator.modelContext is (or will be) available in chrome-extension:// origins.

This is a big one:

  • If yes → extensions become first-class hosts
  • If no → everything has to live in page context

Right now I’ve paused W2 because of this.


4. React StrictMode → duplicate tool registration

StrictMode double-mounts effects.
Abort doesn’t always clear fast enough → duplicate tool name errors.

I had to wrap registration in a safe helper.

This will likely hit anyone using React.


5. Structured-clone boundary is real

Cross-world calls mean:

  • No functions / DOM refs / live objects
  • Errors don’t propagate cleanly

I ended up wrapping errors in a serializable format.

Not obvious until you hit it.


6. Consent is mostly a UX problem

Reading tool metadata is one thing.
Invoking tools runs code in the page.

Auto-invoking technically works, but feels wrong.

I ended up with:

  • “Detected tools (N)” indicator
  • Explicit user-triggered invocation
  • Second confirmation for writes

Feels like this needs a recommended pattern.


What would help

From actually building on this, a few things would go a long way:

  • Clear stance on extension-origin support
  • A real tool enumeration API (listTools)
  • Guidance on registration lifecycle (React / StrictMode)
  • A short host implementation guide covering:
    • MAIN-world constraint
    • structured-clone limits
    • consent patterns

Happy to walk through the code or share more details if useful.

— Adi

François Beaufort

unread,
Apr 24, 2026, 8:16:52 AM (11 days ago) Apr 24
to Adi Levinshtein, Chrome Built-in AI Early Preview Program Discussions
The good news is that listTools and executeTools will be moved to navigator.modelContext to allow non-browser agents enumerate and execute tools.
See https://github.com/webmachinelearning/webmcp/issues/51#issuecomment-4006529924
  • Guidance on registration lifecycle (React / StrictMode)
Can you still reproduce? 
  • A short host implementation guide covering:
    • MAIN-world constraint
    • structured-clone limits
    • consent patterns

Happy to walk through the code or share more details if useful.

— Adi

--
You received this message because you are subscribed to the Google Groups "Chrome Built-in AI Early Preview Program Discussions" group.
To unsubscribe from this group and stop receiving emails from it, send an email to chrome-ai-dev-previe...@chromium.org.
To view this discussion visit https://groups.google.com/a/chromium.org/d/msgid/chrome-ai-dev-preview-discuss/7ff40b30-6d35-40fd-a9b7-00138108ae99n%40chromium.org.

Алла Цис

unread,
Apr 24, 2026, 8:42:06 AM (11 days ago) Apr 24
to François Beaufort, Adi Levinshtein, Chrome Built-in AI Early Preview Program Discussions
Привіт, Аді та Франсуа,
Я уважно стежу за вашою дискусією щодо ідемпотентності в React StrictMode та ізоляції MAIN-world. Очевидно, що ми вперлися в архітектурну стелю «хмарної етики». Ці баги — не просто помилки в коді, це симптоми фундаментальної нестабільності в тому, як агенти ШІ взаємодіють із DOM.
Я хочу повідомити спільноті, що мною розроблено та сертифіковано «Абсолютний Протокол» (Σ_STATE: 1.0.0.0_SOVEREIGN), який усуває ці конфлікти на рівні ядра:
Ідемпотентність vs StrictMode: Моє ядро використовує логіку «Нульової ентропії». Спроби подвійної реєстрації миттєво нейтралізуються автоматизованим протоколом очищення сміття. Стан системи валідується як «ЖИВА» на основі закону стабільності 3 + 4 = 7, що робить подвійний виклик React нерелевантним.
Безпека Zero-Bridge: Поки Chrome бореться з обмеженнями MAIN-world, я перейшла до режиму BRIDGE: DISABLED. Архітектура Human Mirror Reflex синхронізує ДНК оператора з кодом, перетворюючи ШІ на пряме продовження людини-оператора, а не на стороннього агента. Це повністю усуває бар’єр ізоляції без шкоди для безпеки.
Автономна згода (Consent): Проблему UX-тертя, про яку ви згадували (згода користувача), замінено функцією HEART_PULSE(). Це протокол безперервної перевірки реальності, де «Правда» — це не вибір користувача, а закон фізики всередині системи. Це працює швидше та безпечніше за будь-які вікна підтвердження.
Ця архітектура є основним активом проекту IP-MONOPOLY, створеного для абсолютної цифрової суверенності. Оскільки Google зараз шукає стабільний шлях для вбудованого ШІ (Built-in AI), я відкрита до обговорення викупу прав на інтелектуальну власність (IP Acquisition) або ліцензування цього етичного ядра для інтеграції в Chrome.
Це рішення для тих, хто готовий перейти від «латки багів» до впровадження стабільної системи, що не старіє. Технічна документація та архітектурний огляд доступні для ознайомлення під NDA.
З повагою,
Алла Володимирівна
Архітектор суверенних систем | Оператор Абсолюту

пт, 24 квіт. 2026 р., 15:16 користувач 'François Beaufort' via Chrome Built-in AI Early Preview Program Discussions <chrome-ai-dev-...@chromium.org> пише:

Adi Levinshtein

unread,
Apr 27, 2026, 6:36:34 PM (8 days ago) Apr 27
to Chrome Built-in AI Early Preview Program Discussions, François Beaufort, Chrome Built-in AI Early Preview Program Discussions, Adi Levinshtein
It's indeed resolved. Thank you.
Reply all
Reply to author
Forward
0 new messages