Files
app/docs/code/agents.md
T
stroblme 4cb028de41 Chat: one phone header button, quick-prompt chips, double-click to reuse a message
The phone header carries a single speech bubble: Control on Home, the
assistant elsewhere. Chips above the input offer the user's most sent
messages per tab, then starters; a tap or a double-click on a sent or
heard message fills the input without sending.
2026-10-27 17:39:36 +01:00

88 lines
4.0 KiB
Markdown

# Agents over MCP
Fluksio exposes flow tools over MCP. An agent can inspect, edit, publish,
and run flows with the permissions of the user who authorizes it.
## Connect an agent
Set `MCP_ENABLED=true` in the engine's environment and restart it, under
`environment` in `compose.yml` for the Docker container. It defaults to off.
Configure your MCP client with an HTTP endpoint:
- Docker container: `http://localhost:8080/mcp`
- Deployment: `https://<your-domain>/mcp`
The endpoint has to be the address in `FRONTEND_HOST`, which is also the
issuer of the client's tokens.
The client registers, opens browser authorization, and receives an OAuth
token after you approve access. The issuer and browser redirects use
`FRONTEND_HOST` and `ENVIRONMENT`, so configure those for the addresses your
client and browser can reach.
Manage registered clients under **Admin → Agents**. Revoking a client
invalidates its access. MCP uses a separate signing key at
`OAUTH_PRIVATE_KEY_FILE`; rotating that key invalidates all MCP tokens.
An instance connected to a [portal](../interface/portal.md) also answers
through the portal's API address, for example
`https://portal.example.com/i/<instance-id>/mcp`. The portal forwards MCP and
OAuth requests; the instance checks the agent's token as it does locally.
Open the instance from the portal first so the browser can show its consent
page.
## Available tools
| Task | Tools |
|---|---|
| Inspect flows | `list_flows`, `get_flow`, `get_node_source`, `list_node_types`, `get_graph`, `list_shared_nodes` |
| Inspect values | `get_flow_state`, `get_message_history` |
| Inspect the instance | `list_secrets` (names only), `get_modules`, `get_health`, `get_metrics`, `list_failures`, `list_runs` (live cascades) |
| Inspect devices | `list_devices`, `get_device` |
| Edit flows | `save_flow`, `save_node_source`, `validate_flow`, `publish_flow`, `discard_draft`, `delete_flow` |
| Operate flows | `run_flow`, `trigger_node`, `start_flow`, `stop_flow`, `pause_flow`, `resume_flow`, `cancel_node` |
| Install node packages | `apply_modules` |
Tools call the same API as the browser. Drafts, validation, version checks,
and superuser restrictions apply. Secrets cannot be read back.
A useful workflow: ask the agent to inspect the flow, save a draft, and
validate it. Review the draft before asking it to publish. The agent has
a publish tool, so make your intent explicit.
## The assistant
A superuser configures an OpenAI-compatible provider under
**Settings → Assistant**, with a base URL, API key, and model. This enables
the dashboard's Assistant entry for signed-in users.
The assistant uses the same tools with your own permissions. Draft edits
appear in the editor. Each answer streams in as the model writes it and
renders as markdown with a tool trace.
Conversations are stored per user on the instance; the bin button clears
yours.
`MCP_ENABLED` is only needed for external clients, so the built-in assistant
works without it.
In both tabs, chips above the input offer quick prompts: the messages you send
most often in this browser, then a few starters. A tap puts the text in the
input to edit and send. Double-clicking, or double-tapping, one of your own
messages does the same.
## Control
A live [Wren](../reference/node-types.md#wren) or
[Assistant](../reference/node-types.md#assistant) node with its `prompt` and a
`reply` or `actions` wired adds a **Control** tab to the chat. Wren uses its
local model, the Assistant node the provider above.
Choose a conversation and type a command. It goes out on the node's prompt,
which is where a `stt` node writes what a device heard, so typed and spoken
commands are one conversation: the words heard so far, the command, each
reply, and the reported actions with their target message, value and whether
each was applied. A node whose prompt is another's `unhandled` answers in that
node's conversation. Wren's `apply`, `min_confidence` and `targets` settings
decide whether it writes to its targets. Control conversations stay in the
browser and clear on reload.