Files
app/docs/code/agents.md
T
stroblme dea25ec08d One image for the whole app: engine, API and dashboard on one port
The backend image now builds the SPA and serves it on the API's own origin
(fluksio/spa.py), so an instance is a single container with no proxy, DNS,
port 80 or .env: `docker compose up -d` with the new compose.yml runs it on
localhost:8080. It starts on fluksio serve (persisted secret key, first
admin printed once) and brings its own Redis when REDIS_HOST is unset.

Slimmer: python:3.13-slim, no dev group, uv once, fastapi without the cloud
CLI. Optional features are per-feature extras (mqtt, influx, email, sentry,
ml, server for all) picked with the EXTRAS build argument; numpy moved to
`ml`. ffmpeg left the image for imageio-ffmpeg via the Modules screen.

The operator stack runs the same image with app. and api. routed to it; the
nginx frontend service, the LAN nginx proxy and DOMAIN in the backend are
gone, and the MCP issuer is FRONTEND_HOST.
2026-10-16 11:40:02 +02:00

3.4 KiB

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 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)
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 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.