Profiles are an experimental feature. The profiles, integrations,
vars, and prompts commands are hidden by default — run
machine0 config set USE_EXPERIMENTAL_FEATURES=true to enable them.
A profile is a named group of integrations, prompts, and env variables. Integrations connect your machine0 account to external services and store the resulting credentials encrypted — and because they live inside profiles, the same integration can be connected several times with different accounts (e.g. github as your work account in one profile and your personal account in another). Creating a VM with machine0 new --profile <name> injects the profile’s credentials and env variables into it: gh is authenticated (~/.config/gh/hosts.yml + the git credential helper), codex is logged in (~/.codex/auth.json), and the profile’s MCP endpoint is preconfigured for both Claude Code (~/.claude.json) and Codex (~/.codex/config.toml).
Each entity has its own command group: profiles manages the profile itself, integrations (alias int) its integrations, vars its env variables, and prompts its prompt library.
New accounts start with a profile named default, so you can connect integrations and set variables without creating one first. You always have at least one profile — profiles rm refuses to remove your last remaining profile.
The profile MCP endpoint
Each profile aggregates its MCP integrations behind one endpoint:
The endpoint speaks stateless Streamable HTTP (JSON responses, no sessions, no SSE) and serves the combined tools of every MCP integration in the profile — system integrations hold provider credentials and are not part of the aggregation. It also serves the profile’s own prompts over the native MCP prompts/list / prompts/get, merged ahead of any prompts the upstream servers expose (on a name collision, the profile’s prompt wins). Two ways to authenticate:
OAuth (interactive clients) — MCP clients supporting RFC 9728 discover the OAuth flow automatically. Claude Desktop, claude.ai connectors, and Claude Code handle this out of the box — just add the URL and approve the browser consent:
API key (programmatic) — pass your machine0 API key in the x-api-key header:
Profiles are an organizational boundary, not a security boundary: any of your API keys — and any MCP OAuth grant on your account — can call any of your profiles’ endpoints.
profiles ls
List your profiles with the number of VMs using each one and its description.
profiles new
Create a profile. Aliased as profiles create and profiles add. Pass --description to describe the profile (it shows in profiles ls and profiles get).
Profile names follow the same rules as machine names (letters, digits, and dashes; max 63 characters) and are unique per account. Accounts are limited to 50 profiles, and a starter default profile counts toward that limit like any other (remove it once you have another profile if you need the slot back).
profiles duplicate
Copy a profile — its description, env variables (secret markers included), prompts, and integrations — into a new profile. Aliased as profiles copy.
Copied integrations arrive disconnected: credentials are never copied, so reconnect any that need them in the new profile with integrations connect. (Custom MCP integrations that don’t require credentials keep working without a reconnect.) Without a target name the copy is named <profile>-copy, then <profile>-copy-2, -copy-3, … if taken; an explicit target name must be free. Copies count toward the 50-profile account limit.
profiles update
Update a profile’s settings. Pass an empty string to clear the description.
profiles deploy
Deploy a profile onto a running VM — wipes the previously injected profile’s credentials and env variables off the machine and injects this profile’s instead. If the VM was created with an env set, the env set’s variables still take precedence over the profile’s, same as at creation. Deployment happens server-side over SSH; integration secrets never pass through your terminal. Works on both Ubuntu and NixOS machines (NixOS needs a current image version; older images apply credentials but shells won’t see env vars until the image updates).
New env vars and credentials apply to new sessions — running shells and agent processes (claude, codex) keep the old state until restarted.
profiles get
Show a profile’s details — its description and MCP connection string, its integrations (built-in and custom) with their connection status and when each was last checked, its prompts (with the start of each body), and its environment variables.
For a single integration’s details see integrations get; for a prompt’s body see prompts get; for the variables alone see vars ls.
profiles rm
Remove a profile. This deletes its integrations and their stored credentials (a connected machine0-cli key is revoked), removes its prompts, and its MCP endpoint stops working. Your last remaining profile cannot be removed — create another profile first.