Quick Start¶
Install¶
The fastest way — run directly without installing (requires uv):
Or install permanently:
On first launch, Oduflow automatically:
- Creates a default
oduflow.tomlconfig with generated secrets - Initializes shared infrastructure (Docker network, PostgreSQL, team directories)
The config is created at /etc/oduflow/oduflow.toml when that directory is
writable, otherwise at ~/.oduflow/conf/oduflow.toml. Oduflow searches for the
config in this order:
ODUFLOW_TOMLenvironment variable (explicit file path)/etc/oduflow/oduflow.toml~/.oduflow/conf/oduflow.toml
Fresh configs include generated values for:
[database].password— PostgreSQL superuser password[team.1].auth_token— HTTP MCP Bearer token and OAuth client secret[team.1].ui_password— Web Dashboard password
The config file is created with mode 0600. The generated secrets are never
printed to the log — read them from the file itself:
sudo grep -E 'auth_token|ui_password' /etc/oduflow/oduflow.toml 2>/dev/null \
|| grep -E 'auth_token|ui_password' ~/.oduflow/conf/oduflow.toml
Single-user mode (stdio)¶
Stdio is the default transport — Oduflow communicates with the MCP client over stdin/stdout. The client starts and manages the Oduflow process directly. No network port is needed.
Add to your MCP client config (Claude Desktop, Windsurf, etc.):
If Oduflow is installed globally (uv tool install oduflow), you can use the shorter form:
Server mode (HTTP)¶
HTTP transport starts a persistent server with Streamable HTTP, a Web Dashboard, and a REST API. Suitable for remote and multi-user deployments.
# Start the HTTP server:
uvx oduflow --transport http
uvx oduflow -t http
# or, if installed:
oduflow --transport http
oduflow -t http
The server starts on http://0.0.0.0:8000 by default (configurable via [server] section in oduflow.toml). The MCP endpoint is at /mcp.
Authentication¶
Fresh HTTP installs already have a generated Bearer token for MCP and a separate
generated password for the Web Dashboard. Read them from oduflow.toml:
[team.1]
hostname = "localhost"
auth_token = "..." # Bearer token for MCP clients
ui_password = "..." # Web Dashboard login password
To sign in to the Web Dashboard, open http://<host>:8000/, use username
admin, and enter the ui_password value. To connect an HTTP MCP client, use
http://<host>:8000/mcp with:
MCP auth and Web Dashboard auth are independent — they use different credentials and different mechanisms (Bearer vs form/session auth).
Self-hosted OAuth (Claude.ai)¶
Some MCP clients (e.g. Claude.ai Remote MCP) require an OAuth flow instead of a static Bearer token. Oduflow can act as its own OAuth 2.1 Authorization Server — no external identity provider needed. It is enabled automatically whenever a team has an auth_token and runs on that team's own hostname in both port and traefik mode, so no separate OAuth URL is normally required:
Behind Cloudflare Tunnel, publish that same hostname and forward it to port 8000; use split DNS if LAN clients should reach it directly. The OAuth client_id is the non-secret team_<id> (e.g. team_1); each team's auth_token is the client_secret, and OAuth mints an independent expiring access token. See Authentication & Security for the full setup and how to connect from Claude.ai.
MCP client configuration¶
Point your MCP client (Cursor, Cline, Amp, etc.) to the server with the Authorization header:
{
"mcpServers": {
"oduflow": {
"type": "http",
"url": "http://your-server:8000/mcp",
"headers": {
"Authorization": "Bearer my-secret-mcp-token"
}
}
}
}
If the server is behind a reverse proxy with HTTPS (see Traefik Routing):
{
"mcpServers": {
"oduflow": {
"type": "http",
"url": "https://oduflow.example.com/mcp",
"headers": {
"Authorization": "Bearer my-secret-mcp-token"
}
}
}
}
Claude Desktop (remote server via mcp-remote)¶
Claude Desktop only launches MCP servers as local processes — it cannot call a
remote HTTP endpoint with a custom Authorization header on its own. Use the
mcp-remote bridge: Claude Desktop
starts it over stdio, and it forwards everything to Oduflow's /mcp endpoint
with the Bearer token attached. Node.js (which provides npx) must be installed.
Edit claude_desktop_config.json — Settings → Developer → Edit Config opens
it directly:
- Windows:
%APPDATA%\Claude\claude_desktop_config.json - macOS:
~/Library/Application Support/Claude/claude_desktop_config.json
Replace:
https://your.oduflow.server/mcp— your Oduflow MCP endpoint (in traefik mode, the team's own hostname; in port mode,http://<host>:8000/mcp).TOKEN— the team'sauth_tokenfromoduflow.toml. Keep theBearerprefix: the header value must readBearer <auth_token>.
Why the token lives in env
mcp-remote substitutes ${AUTH_HEADER} into the --header value at
startup. Keeping the secret in env instead of inline in args avoids
both the shell-quoting problems of a space inside an argument and leaking
the token into process listings and logs.
--transport http-only pins the bridge to Streamable HTTP, which is what
Oduflow serves; without it mcp-remote first probes for an SSE endpoint and the
connection can fail. Do not use the OAuth setup from
Authentication & Security
here — that flow is for Claude.ai custom connectors; Claude Desktop authenticates
with the static Bearer token above.
To scope the connection to a single environment, point the URL at
https://your.oduflow.server/mcp/<env> and use that environment's Secret Key as
the token instead — see
Scoped single-environment access.
After saving the file, quit Claude Desktop completely (not just close the window) and start it again. The Oduflow tools then appear in the tools menu.
Web Dashboard¶
When running in HTTP mode, a web dashboard is available at the root URL (http://your-server:8000/). Sign in as admin with the ui_password from oduflow.toml. It provides environment management, service controls, a WebSocket terminal, and more. See Web Dashboard & REST API for details.
Next steps¶
- Set up a template —
oduflow init-template(see Template Management) - Customize configuration — edit
oduflow.toml(see Configuration Reference) - Auto-start on boot —
oduflow systemd-install(see systemd setup) - Multi-team isolation — add multiple
[team.*]sections (see Multi-Team Support)