- flow/devices.py: DeviceDef in FLOWS_DIR/_devices/<id>.json, committed under
the flow store's write lock, 409 on a stale version; nonces in DEVICES_FILE
outside git; in-memory presence announced as device_status
- api/routes/devices.py: CRUD, pairing with an optional {name, board,
firmware}, a pending list adopted without a code from the LAN only, unpair;
/panels/pair, /panels/pair/{code} and GET /panels/{id} kept as aliases,
PUT /panels/ gone
- _device_may replaces _panel_may, JWT claims unchanged
- panels.json moves into devices once at startup, then .migrated
- MCP list_devices, get_device; search category device
- Devices tab (list, detail with presence, pairing, ordered dashboards,
touch, I/O), PanelsDialog removed, serialised optimistic saves
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
78 lines
3.5 KiB
Markdown
78 lines
3.5 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
|
|
`DOMAIN`, `ENVIRONMENT`, and `FRONTEND_HOST`, 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 it, at `https://hub.fluksio.com/i/<instance-id>/mcp` (the portal's
|
|
own `hub.` host for a custom one). The portal forwards the endpoint and its
|
|
OAuth, and the instance checks the agent's token as it does locally. The
|
|
consent page opens in the instance as the portal serves it, so open the
|
|
instance from the portal first if this browser has not recently.
|
|
|
|
## 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.
|
|
|
|
## Control
|
|
|
|
A live [Wren node](../reference/node-types.md#wren) with both `prompt` and
|
|
`actions` wired adds a **Control** tab to the chat. It uses the node's local
|
|
model and needs no assistant provider.
|
|
|
|
Choose a node, type a command, and inspect the reported actions: target
|
|
message, value, confidence, and whether each action was applied.
|
|
The node's `apply` and `min_confidence` settings decide whether it writes
|
|
to devices. Control conversations stay in the browser and clear on reload.
|