Frequently Asked Questions About Rachel Lee's Agentic Web Publishing Framework

21 answers covering everything from basics to advanced usage.

// Basics

What does 'One Server, Three Clients' mean in Rachel Lee's framework?

One Server, Three Clients is the architectural goal of serving humans in browsers, humans operating AI agents, and agents browsing autonomously — all from a single backend deployment. Instead of building separate experiences for each audience, you design your server to handle all three simultaneously through your existing website, MCP tools with HTTP transport, and Web MCP registration on your HTML pages.

What is the 'Mother May I' pattern in MCP Apps?

Mother May I is Rachel Lee's term for the permission-mediated pattern inside MCP Apps. Because the app runs in a sandboxed iframe with no direct network access or local storage, every server-side action or data fetch must be requested through call_server_tool, and every external link must use the host-permission link-opening API. The app cannot act independently — it must always ask the agent harness for permission first.

Do I need to rebuild my website to use this framework?

No. The framework is designed to augment existing web properties. You add an MCP server alongside your existing backend, map your site's navigation to tools, and optionally add Web MCP registration to your HTML pages. Your website continues serving human visitors normally. The MCP layer runs in parallel, exposing the same content and functionality to agent-based clients.

What is the Infinite Canvas concept in this framework?

Infinite Canvas is Rachel Lee's framing of the browser — and by extension the agent harness — as a rendering surface for anything, not just documents. CSS, JavaScript, Web Speech, Canvas, WASM, Animation, and Audio APIs are all available inside MCP Apps. This means agent experiences can include interactive graphics, audio, animations, and computation, not just text responses. The browser is a full application platform, and MCP Apps should leverage it.

Can I use this framework for a brand new website I am building from scratch?

Yes. The framework applies equally to new projects. Design your backend to serve all three client types from day one: standard HTML pages for browser users, HTTP MCP tools for agent harness users, and Web MCP registration on your pages for in-browser agents. Starting fresh lets you structure your content, navigation, and APIs with agentic access in mind from the beginning, avoiding retrofitting work later.

// How To

How do I bundle an MCP App into a single file?

Use a build tool like Vite with a single-file plugin to bundle your HTML, CSS, and JavaScript into one self-contained HTML file. Add the meta attribute ui pointing to a URL on your server to make a tool return the app. Embed images and fonts as base64 when possible. Share your existing design system by serving CSS and fonts from the same origin and configuring CSP to allow them.

Can I use my existing design system in MCP Apps?

Yes. Configure your server's Content Security Policy to allow loading fonts, CSS, and other resources from your own origin. Reference your design system's stylesheet and font files in the MCP App's HTML. For resources from third-party CDNs, add those origins to CSP explicitly. This lets MCP Apps visually match your website, creating a consistent brand experience inside agent harnesses.

How do I test Web MCP tools on my pages?

Use the MCP B browser extension as a debugging harness. It acts as an in-browser agent that can detect registered Web MCP tools on each page, show whether they are visible and callable, and let you invoke them to verify correct behavior. Also test declarative tools by inspecting form elements for tool-name and tool-description attributes, and imperative tools by checking that navigator.modelContext.registerTool calls execute without errors.

How do I avoid the starfish design anti-pattern?

Instead of presenting a blank chatbox that forces users to guess what to ask, use MCP Apps to provide visual cues, structured navigation, and guided discovery. Return rich interactive content from your tools — lists with clickable items, category browsers, search interfaces with filters. Think of the transition from CLI to GUI: your agentic interface should offer visible affordances, not just a blinking cursor.

How do I make my MCP App call the server for data?

Use call_server_tool from within the MCP App. Since the app runs in a sandboxed iframe with no direct network access, you cannot use fetch() or XMLHttpRequest to call external endpoints. Instead, call_server_tool sends a request through the agent harness to your MCP server, which processes it and returns the result. This is the 'Mother May I' pattern — the harness mediates all server communication.

// Troubleshooting

How do I handle external links inside an MCP App?

Standard href attributes and window.open calls do not work inside MCP Apps because they run in sandboxed iframes. Instead, use the host-permission pattern: call the agent harness's link-opening API (e.g., appref current open_link) to request that the harness open the URL. This is part of the 'Mother May I' constraint — the app must ask the host for permission to navigate externally.

Why are my fonts and images not loading in my MCP App?

MCP Apps run inside iframes with a default Content Security Policy that blocks external resources silently. If your fonts, images, or stylesheets come from external domains, you must explicitly configure your server's CSP to allow those origins. Resources from your own server's origin work if CSP is configured correctly. For maximum reliability, embed assets as base64 directly in the single-file bundle.

What happens if navigator.modelContext is not available in the browser?

If navigator.modelContext is undefined, the browser does not support Web MCP (it is not an agent-enabled browser). Always check if (navigator.modelContext) before calling registerTool to degrade gracefully. Non-agent browsers simply skip the registration, and your site continues working normally for human users. This guard ensures your site serves all three client types without breaking any of them.

What if my agent harness does not support MCP Resources yet?

Most agent harness UIs currently have poor support for MCP Resources, despite Resources being the correct vehicle for bulk content priming. As a workaround, you can expose summarized or chunked content through tools, but avoid injecting large corpora one tool call at a time — this wastes context window. Monitor harness updates and migrate to proper Resource usage as support improves.

// Comparisons

What is the difference between Web MCP and regular MCP?

Web MCP is a browser-side mechanism that makes each HTML page a mini MCP tools server for in-browser agents, using either declarative attributes on forms or the imperative navigator.modelContext.registerTool API. Regular MCP is a server-side protocol (HTTP or stdio transport) for exposing tools to agent harnesses like Claude Desktop. Web MCP is inspired by MCP but is not spec-compliant with it — they may continue to diverge. Build for the abstraction, not the assumption of convergence.

How does the Agentic Web Publishing Framework compare to just adding an API to my site?

Adding an API exposes data endpoints, but Rachel Lee's framework goes beyond data. It delivers interactive MCP Apps rendered inside agent harnesses, registers Web MCP tools for in-browser agents, and serves all three client types from one deployment. An API alone does not provide visual navigation, guided discovery, or the ability for in-browser agents to interact with your pages without screenshot-based DOM traversal.

Can autonomous agents interact with my site without MCP?

Autonomous agents can use screenshot-based DOM traversal to navigate your site, but this approach is slow, expensive in tokens, and unreliable. Web MCP lets in-browser agents call your page's functions directly through registered tools, bypassing visual inference entirely. This reduces token cost, increases reliability, and gives agents structured access to your site's capabilities instead of forcing them to guess from pixels.

// Advanced

What is visibility: app and when do I need it?

visibility: app is a tool metadata setting that tells the agent harness a tool's response is meant for the MCP App to consume internally, not for the model to narrate as text to the user. Use it for navigation tools called by the app itself (like pagination or filtering). Without it, the model may attempt to read the JSON response aloud, creating a confusing experience instead of letting the app handle the data silently.

Should I expose every internal function as an MCP tool?

No. Keep your tool count focused by mapping tools to the same conceptual surface area as your site's navigation — list, search, filter, view detail, paginate. Exposing every internal function creates noise for the agent, making it harder to select the right tool. Write clear descriptions for each tool since the agent reads these to decide when to call them. Only expose what a user would naturally ask for.

How do I choose between returning JSON, Markdown, or an MCP App from a tool?

Match the return type to what the user needs to do with the content. Return structured JSON for lists, metadata, and data that the model will process or filter. Return Markdown for text-rich content like transcripts, articles, or documentation. Return an MCP App for anything interactive, visual, or navigational — browsing an archive, viewing a dashboard, or exploring a rich media experience.

Is Web MCP the same spec as MCP?

No. Web MCP is inspired by MCP but is not spec-compliant with it. Web MCP operates browser-side with declarative form attributes and the imperative navigator.modelContext API, while MCP operates server-side with HTTP or stdio transport. The two may continue to diverge. Build your implementation around the functional abstraction — exposing tools to agents — rather than assuming the specs will converge.