You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
First-class web surface (production): ship a browser host for the plugin's MCP Apps inside the artifact, openable from the installed CLI (<plugin> web); /web in dev for parity #564
A plugin built with agent-bundle can ship an MCP server, hooks, skills, a routed CLI, and MCP Apps — but the only ways to look at one of those Apps in a browser are:
the developer Workbench (agent-bundle dev, checkout only), and
cargo-hauler is the concrete case (ScriptedAlchemy/cargo-hauler#83): hauler dashboard exists, but the README has to tell users it does not work from the npm package or an installed host pack — the exact places a user would type it. The same shape recurs for any plugin whose MCP App is also a reasonable web page: a build dashboard, an eval viewer, a notice inbox. Authors want to ship "MCP + CLI + agent plugins, and a web page that opens in a browser pane when you need it", with one component library and one data path (the App already renders from the tool result).
Scope: production first. This is not a dev-server nicety: the web page has to work from the shipped plugin — the npm package, an installed Claude/Codex/Cursor host pack, or a checked-out artifact/ — with no framework on the machine, exactly like the MCP server and CLI already do. Dev parity (/web on the Workbench) is the secondary requirement.
Proposal: a first-class web surface
Artifact-resident browser host. Emit into the root (Emit one composite plugin artifact; use targets to select the host projections inside it #555 layout) a dependency-free, bundleable host — web/index.html + web/host.mjs (Node built-ins only, like agent-bundle/launch-env) — that spawns the plugin's own packed mcp/<server>.mjs over stdio, serves the App resource(s) on 127.0.0.1:<port> with the same sandbox/consent/token rules as serve-app, and speaks the MCP Apps ui/* bridge. No Effect, no Workbench, no framework at runtime; every module satisfies AB6005.
A generated web command on the routed CLI.<plugin> web [<server>/<app>] [--port N] [--open] [--tool T --input JSON] — the framework owns the argv, the ready signal (url in the JSON result), teardown on the route signal, and the "which App" default (the only App, else required). Plugins stop hand-writing what cargo-hauler wrote 180 lines for.
Config/convention.web: { apps: ['<server>/<app>'], open?: 'browser' | 'never' } (or src/web/ for an authored landing page listing the plugin's Apps) selects what the surface exposes; omit it and nothing is emitted. Capability tables record web per host as "browser, host-independent".
Dev parity.agent-bundle dev serves the same host at /web/<server>/<app> so the URL a plugin documents is the URL the Workbench shows; serve-app becomes a thin wrapper over the same host.
Diagnostics/docs. A named diagnostic when web names an App no tool advertises; en + zh pages for the surface, the command, and the /web path; one minor changeset if the artifact layout gains web/.
Acceptance
examples/mcp-app gains web.apps; after agent-bundle build, node artifact/bin/<plugin>.mjs web --no-open prints a 127.0.0.1 URL whose page renders the App (not the fallback) populated from the opening tool call, from an installed host pack with no node_modules and no framework on the machine.
Problem
A plugin built with agent-bundle can ship an MCP server, hooks, skills, a routed CLI, and MCP Apps — but the only ways to look at one of those Apps in a browser are:
agent-bundle dev, checkout only), andagent-bundle serve-app/serveApp(Serve a built MCP App standalone in a browser (agent-bundle serve-app/ runtime helper) so plugins can offer "open the dashboard" commands #514, feat(cli): serve a built MCP App standalone — agent-bundle serve-app and serveApp in agent-bundle/api (#514) #537), which needs the framework installed next to the project and the builtartifact/on disk — a checkout capability. Let a plugin CLI route serve its own MCP App without bundling the framework #558 sanctions spawning it from a routed CLI, and its option (b) names the gap: nothing that ships inside the artifact can host an App, because the host stack is the Workbench's Effect-based bridge.cargo-hauler is the concrete case (ScriptedAlchemy/cargo-hauler#83):
hauler dashboardexists, but the README has to tell users it does not work from the npm package or an installed host pack — the exact places a user would type it. The same shape recurs for any plugin whose MCP App is also a reasonable web page: a build dashboard, an eval viewer, a notice inbox. Authors want to ship "MCP + CLI + agent plugins, and a web page that opens in a browser pane when you need it", with one component library and one data path (the App already renders from the tool result).Scope: production first. This is not a dev-server nicety: the web page has to work from the shipped plugin — the npm package, an installed Claude/Codex/Cursor host pack, or a checked-out
artifact/— with no framework on the machine, exactly like the MCP server and CLI already do. Dev parity (/webon the Workbench) is the secondary requirement.Proposal: a first-class
websurfaceweb/index.html+web/host.mjs(Node built-ins only, likeagent-bundle/launch-env) — that spawns the plugin's own packedmcp/<server>.mjsover stdio, serves the App resource(s) on127.0.0.1:<port>with the same sandbox/consent/token rules asserve-app, and speaks the MCP Appsui/*bridge. No Effect, no Workbench, no framework at runtime; every module satisfiesAB6005.webcommand on the routed CLI.<plugin> web [<server>/<app>] [--port N] [--open] [--tool T --input JSON]— the framework owns the argv, the ready signal (urlin the JSON result), teardown on the routesignal, and the "which App" default (the only App, else required). Plugins stop hand-writing what cargo-hauler wrote 180 lines for.web: { apps: ['<server>/<app>'], open?: 'browser' | 'never' }(orsrc/web/for an authored landing page listing the plugin's Apps) selects what the surface exposes; omit it and nothing is emitted. Capability tables recordwebper host as "browser, host-independent".agent-bundle devserves the same host at/web/<server>/<app>so the URL a plugin documents is the URL the Workbench shows;serve-appbecomes a thin wrapper over the same host.webnames an App no tool advertises; en + zh pages for the surface, the command, and the/webpath; oneminorchangeset if the artifact layout gainsweb/.Acceptance
examples/mcp-appgainsweb.apps; afteragent-bundle build,node artifact/bin/<plugin>.mjs web --no-openprints a127.0.0.1URL whose page renders the App (not the fallback) populated from the opening tool call, from an installed host pack with nonode_modulesand no framework on the machine.agent-bundle devserves/web/<server>/<app>with the same page.doctorreports the surface.docs/entry-conventions.md, changeset.Relationship to existing issues
agent-bundle serve-app/ runtime helper) so plugins can offer "open the dashboard" commands #514 / feat(cli): serve a built MCP App standalone — agent-bundle serve-app and serveApp in agent-bundle/api (#514) #537: the host stack to reuse;serve-appstays as the checkout-time form.