Talk to your whole platform.
Chat is an MCP host whose tools are the other plugins. It discovers every plugin's tool surface, runs one Claude turn on Bedrock, dispatches each tool call back through the owning plugin — as the signed-in user — and streams the result as typed blocks. Writes preview and wait for your yes.
Not a chatbot on one API. A host over all of them.
A typical assistant is wired to a single service. Chat's data plane is the whole platform: every plugin already speaks MCP, so the host just unions their tools and lets one model turn reach across them.
On each turn, chat calls tools/list on every configured backend and merges the results into one catalog, namespaced plugin__tool. The model picks tools; chat dispatches each tool_use back to the owning plugin over that plugin's own MCP endpoint — forwarding your identity per call. It's a faithful deputy: each plugin stays the authorization boundary, so an agent can only do what you could. There is no proto to maintain and no bespoke integration per capability — a new plugin's tools simply appear.
The host forwards your identity on every tool call. Each plugin's MCP server is the authorization boundary — an agent's reach is exactly yours.
One question, across plugins.
A turn streams over SSE as a sequence of typed blocks — the user message, the model's reasoning, each tool call updating in place from running to done, and the rendered result. A reconnecting client resumes mid-turn.
Every plugin's tools, namespaced.
Backends are configured, not hardcoded — each FASTVERK_BACKEND_<x> becomes an MCP client, and its tools appear as plugin__tool. A plugin that's down is skipped with a warning; the catalog never fails.
| plugin | example tools | namespace |
|---|---|---|
| forge | list_repos · open_mr · merge_change | forge__* |
| tbzl | query_rdeps · run_build · assess_merge | tbzl__* |
| builds | overview · cache_hit_rate | builds__* |
| depot | list_repos · log · browse | depot__* |
| mycelium | query | mycelium__* |
| agent | dispatch · list · cancel | agent__* |
Discover → converse → dispatch → render.
Four stages, up to eight tool round-trips per turn.
Discover
Union every backend's tools/list into one namespaced catalog, plus three host-local presentation tools. A backend that's unreachable is skipped, not fatal.
Converse
One Bedrock turn (Claude, us.anthropic.claude-opus-4-8, reached via IRSA — no static key) sees the catalog and chooses which tools to call.
Dispatch
Each tool_use routes back to the owning plugin over its own MCP endpoint, carrying your user context — so the call runs as you, inside that plugin's authorization.
Render
Results become typed blocks — markdown, table, list, fields. A write returns a preview flagged needs_confirmation, shown as an approval prompt instead of an action.
The model renders. It never re-types your data.
Two ideas keep the surface clean and safe: the model can choose to render, and writes can't fire without a turn boundary.
The rules of the loop
- Presentation-as-tools: ui__render_table / ui__render_fields / ui__render_list are host-local — calling one emits a typed block directly, so the model presents results instead of pasting a wall of JSON.
- Confirm-gating is by shape, not a hardcoded list: any tool result flagged needs_confirmation becomes an approval prompt with a summary and the proposed fields — the owning plugin decides what mutates.
- Never in the same turn: a write only fires after you approve and the model re-calls it with confirm:true on a later turn. It can't ask and act at once.
- Streams over SSE with a monotonic sequence — a reconnecting client resumes from the last event it saw, surviving a dropped connection mid-turn.
A deputy, not a dashboard with a text box.
The alternative wires an assistant to one API, trusts a shared service account, and hands you raw output.
Never confirm a write in the same turn you were asked. Preview the action, wait for yes.
source · github.com/fastverk/plugin-chat · tools: ui__render_table, ui__render_fields, ui__render_list
Prove it's safe to merge.
chat is one of 14 plugins in the fastverk console — hosted, or in your own cloud.