Multica Docs

Using the CLI

Install and log in to the Multica CLI, and manage workspaces, issues, agents, and runtimes from the terminal.

The Multica CLI both connects local runtimes and manages workspaces, issues, agents, and automations from the terminal. This page covers the common paths; the flags your installed version supports are always defined by each command's own --help.

Installation

curl -fsSL https://raw.githubusercontent.com/multica-ai/multica/main/scripts/install.sh | bash

With Homebrew installed, you can also run:

brew install multica-ai/tap/multica

Confirm the install:

multica version

First connection

Pick the service you are connecting to:

multica setup

setup saves the server address, opens a browser to complete sign-in, and starts the daemon. When it finishes, check:

multica auth status
multica daemon status

If you only need to sign in again without overwriting other configuration, run multica login. On a machine without a browser, create a personal access token in the web settings first, then enter it with:

multica login --token

The command prompts you to paste the token in the terminal, keeping the full value out of shell history.

Choosing a workspace

List workspaces and switch the default:

multica workspace list
multica workspace switch <slug>

Subsequent commands use this workspace. A single command can override it with --workspace-id, or you can set MULTICA_WORKSPACE_ID.

Invite members:

multica workspace member invite [email protected]
multica workspace member invite [email protected] --role admin

Common issue operations

# View and search
multica issue list
multica issue get MUL-123
multica issue search "login failure"

# Create and update
multica issue create --title "Fix login failure"
multica issue status MUL-123 in_progress
multica issue assign MUL-123 --to "Backend Agent"

# Comments and runs
multica issue comment list MUL-123
multica issue comment add MUL-123 --content "Check the regression tests first"
multica issue comment update <comment-id> --expected-revision 2 --content "Check the regression tests and release notes"
multica issue runs MUL-123

Read long descriptions or comments from stdin to avoid dealing with newlines and quoting:

multica issue create --title "Upgrade notes" --description-stdin < notes.md
multica issue comment add MUL-123 --content-stdin < review.md
multica issue comment update <comment-id> --expected-revision 2 --content-file revised-review.md

Inspect, stop, or retry a single run:

multica issue run-messages <task-id> --issue MUL-123
multica issue cancel-task <task-id> --issue MUL-123
multica issue rerun-task <run-id> --issue MUL-123
multica issue rerun-task <run-id> --issue MUL-123 --fresh

If an open issue with the same title (case-insensitive, extra spaces ignored) already exists under the same project and parent, issue create refuses and points to that issue. To create another one anyway, add --allow-duplicate. To mark an issue as a duplicate of another, run multica issue status MUL-124 cancelled --duplicate-of MUL-123.

Timeline

issue get shows an issue as it is now. issue timeline lists, in order, the changes to status, priority, assignee, title, and dates and the run outcomes, interleaved with comments, which answers questions like "when did it move to in_review" or "how long has it been stuck in this status":

multica issue timeline MUL-123 --action status_changed
multica issue timeline MUL-123 --activity-only --output json
multica issue timeline MUL-123 --since 2026-08-19T00:00:00Z

--activity-only drops comments and keeps every activity record; --action returns only the given actions, is repeatable, and implies --activity-only. The server caps how far back it reads; when the result is truncated, a warning goes to stderr, and durations should not be inferred from it.

Reading long comment threads

On an issue with many comments, reading them one by one costs an agent a lot of tokens. Scan the threads first, then open the one you need:

multica issue comment list MUL-123 --roots-only --summary --output json --compact
multica issue comment list MUL-123 --thread <comment-id> --tail 5 --output json --compact
  • --roots-only returns only top-level comments, each with its reply count and last activity time.
  • --summary clips each comment to a short preview.
  • --compact applies to JSON output and drops fields that carry no information (such as the echoed issue_id and empty arrays).
  • --recent N returns the N most recently active threads with every reply, which can be long.
  • Resolved threads are folded to their root and conclusion by default; add --full for the complete text.

Lists can be trimmed to the fields you need, too: multica issue list --output json --fields id,identifier,title,status. The filtering happens in the CLI, so it shrinks output and context, not the request.

Wakeups

A wakeup starts an ordinary run for an agent when an event happens, a condition becomes true, or a time arrives. The full rules are in Issue wakeups.

multica issue wakeup events
multica issue wakeup create MUL-123 --agent-id <agent-id> \
  --event comment.created --filter-actor-type member --filter-actor-id <user-id> \
  --instruction "When they reply, update the quote from their answer"
multica issue wakeup create MUL-123 --agent-id <agent-id> \
  --kind every --every 1h --expires-in 72h \
  --instruction "Check whether the supplier has replied"
multica issue wakeup list MUL-123
multica issue wakeup runs MUL-123 <wakeup-id>

Creating one from a terminal as a member requires --agent-id; an agent creating one inside its own run wakes itself by default.

Agents and skills

multica agent list
multica agent get <agent-id>
multica agent create --help
multica agent update <agent-id> --help

multica skill list
multica skill get <skill-id>
multica skill import --url <skill-url>
multica agent skills add <agent-id> --skill-ids <skill-id>

When an import hits a skill with the same name, the default is to stop without modifying existing content. Pick by intent:

multica skill import --url <skill-url> --on-conflict overwrite
multica skill import --url <skill-url> --on-conflict rename
multica skill import --url <skill-url> --on-conflict skip

overwrite is only allowed for the skill's creator and preserves the original ID and agent bindings.

Environment variables and MCP configuration often carry tokens. Values typed on the command line stay in shell history and ps output, so pass them through the -file or -stdin forms:

multica agent create --name "Ops helper" --runtime-id <runtime-id> \
  --custom-env-file ./agent-env.json \
  --mcp-config-file ./mcp.json \
  --custom-args '["--max-turns", "40"]'

multica agent env set <agent-id> --custom-env-stdin < agent-env.json
multica agent update <agent-id> --mcp-config-file ./mcp.json
  • The --custom-env flags exist only on agent create. Change variables later with agent env set, which replaces the whole set; keys whose value is **** keep their existing value.
  • agent update --mcp-config null clears the MCP configuration.
  • --custom-args is a JSON array placed at the end of the launch arguments. Choose the model with --model; some tools reject --model inside custom arguments.
  • --permission-mode controls who can invoke the agent: private for the owner only, or public_to with --public-to-workspace or --public-to-member <user-id>. --visibility private|workspace is the older form and maps onto --permission-mode; when both are given, --permission-mode wins.

Agent run history

multica agent tasks <agent-id> --limit 200 returns the newest page of runs. The default and maximum page size is 200. If more runs exist, stderr prints a cursor; pass it unchanged as --before '<cursor>' to read the next page. --output json keeps the array output and includes usage for that page only.

The corresponding GET /api/agents/{id}/tasks endpoint accepts limit and before, and keeps its JSON array response. The X-Agent-Tasks-Next-Cursor response header supplies the next cursor; its absence marks the final page. Cursors preserve (created_at, id) order, including timestamp precision. Invalid limits or cursors return HTTP 400; limits above 200 are capped. Clients that do not follow the cursor receive only the newest 200 runs.

Daemon and runtimes

multica daemon start
multica daemon stop
multica daemon restart
multica daemon status --output json
multica daemon logs --follow

multica runtime list
multica runtime rename <runtime-id> "Office Mac"
multica runtime usage <runtime-id>
multica runtime activity <runtime-id>
multica daemon autostart enable
multica runtime usage <runtime-id> --days 30
multica runtime update <runtime-id> --target-version <version> --wait
multica runtime profile create --display-name "Internal Claude wrapper" \
  --command-name ccms --runtime-type claude

daemon autostart registers the current profile to start at login; see Start at login for platform details. runtime usage covers 90 days by default, and --days goes up to 365. runtime update asks the daemon on that computer to update its CLI to the given version; --wait keeps polling until the update finishes. runtime profile create takes the compatible tool through --runtime-type (the older --protocol-family still works); fixed arguments can currently be set only in the web app.

Deleting a runtime that still has active agents bound to it is refused by default. multica runtime delete <id> --cascade unbinds those agents, preserves their configuration and history, and cancels their active runs.

See Daemon and runtimes for how it works and for custom profiles.

Projects, workspaces, and autopilots

multica project create --title "Summer campaign" --lead "Lei Li" \
  --repo https://github.com/acme/campaign-site
multica project resource add <project-id> --type github_repo \
  --url https://github.com/acme/brand-assets --default-branch-hint main

multica workspace create --name "Operations" --slug ops --issue-prefix OPS
multica workspace update --context-stdin < team-context.md

multica autopilot create --title "Weekly sales report" --agent "Ops helper" \
  --mode create_issue --issue-title-template "Sales report {{date}}"
multica autopilot trigger-add <autopilot-id> --cron "0 9 * * 1" --timezone Europe/London
  • --lead takes the name of a member or an agent. --default-branch-hint only tells the agent the repository's default branch; it does not switch branches.
  • A workspace's --context is provided to every agent in the workspace. --slug cannot be changed after creation. --issue-prefix is uppercased; changing it renumbers every existing issue, and old identifiers in external references stop resolving.
  • --issue-title-template interpolates only {{date}} (UTC, YYYY-MM-DD) and rejects any other {{...}} token. A schedule trigger's --timezone defaults to UTC.

Command overview

CommandPurpose
issueCreate, update, assign, and search issues; manage comments, subscribers, labels, properties, wakeups, the timeline, and runs
projectManage projects and their resources
label, propertyManage workspace labels and custom properties
agent, skill, squadManage agents, skills, and squads
autopilotManage automations, triggers, and run history
workspaceCreate, view, and switch workspaces, and invite members
repoManage workspace repositories and check them out locally
daemon, runtimeStart and stop the local daemon; view and manage runtimes
attachmentUpload or download attachments
user profileView or update the current user's profile
auth, login, setupLog in, check auth status, and initialize a connection
configView or edit the current CLI profile's local configuration
update, versionUpdate the CLI or print the version

multica chat reads the external chat session an agent is currently handling; it is mainly for agents in chat integrations, not a general command for browsing arbitrary workspace conversations.

IDs and output formats

Issues use keys like MUL-123 or full UUIDs; short UUID prefixes are not accepted.

list commands for other resources usually print copyable short IDs and support --full-id for the full UUID. When a short ID is ambiguous, the CLI asks for more characters or the full UUID. Short task IDs also require --issue to identify the owning issue.

Many commands support structured output:

multica issue list --output json
multica agent list --output json

Scripts should use JSON output rather than parsing the terminal-oriented tables. The output formats and pagination flags each command supports are defined by multica <command> --help.

Profiles and configuration

The default configuration lives in ~/.multica/config.json. Use --profile <name> to isolate a separate set of server address, token, default workspace, and daemon state:

multica setup self-host --profile staging \
  --server-url https://api.staging.example.com \
  --app-url https://app.staging.example.com

multica issue list --profile staging

Named profiles live in ~/.multica/profiles/<name>/config.json. Inspect the current values:

multica config show
multica config show --profile staging

Do not set MULTICA_DAEMON_PORT in the host shell, Compose service, or container entrypoint that starts a daemon. The host daemon normally derives its health port from --profile; if that port cannot be bound, it uses an available loopback port and injects the actual port into agent tasks itself. Remove the variable from older startup environments entirely: versions 0.4.22 and 0.4.23 otherwise mistake that shell for a managed task and reject login. Newer versions let guarded human login and daemon status recover when the port is the only task signal, but ordinary API and profile-resolving commands intentionally remain fail-closed until the variable is removed.

When the CLI runs inside a daemon-managed agent task, it does not load or modify these human-owned profile files. Multica API commands authenticate with the task-scoped credential injected by the daemon. config show and config set use private task-local state; human/local commands such as login, logout, setup, workspace switch, local runtime profile path changes, daemon start / stop / restart, daemon logs, and daemon probe-runtimes are unavailable. auth status does not print token material in this context.

daemon status and daemon disk-usage stay available so an agent can inspect the runtime hosting it, scoped to that runtime: status probes the health port the daemon injected, and disk-usage scans the workspaces root the daemon injected. Neither accepts --profile, disk-usage also rejects --all-profiles and --workspaces-root, and its STATUS column is blank because resolving it would require the human's stored token. Use du and df for anything outside that scope.

This protects implicit Multica CLI profile resolution while preserving the normal HOME and XDG variables used by other provider tools. It is not an OS filesystem boundary: processes running as the same system user may still open an explicitly known path. Use a dedicated user, container, VM, or equivalent isolation when that stronger guarantee is required.

CLI configuration files contain tokens that can access Multica as you. Don't commit them to a repository, upload them to logs, or share them with others.

Command reference

The tables below cover every current top-level command, grouped the way the CLI itself groups them. All commands accept the global flags --server-url, --workspace-id, --profile, and --debug. --output is registered per command, and the default format varies: list commands default to a table, while get and create commands mostly default to JSON. Full flags are defined by multica <command> --help.

Core

CommandSubcommandPurposeKey flags
issuelistList issues--status, --priority, --assignee, --project, --metadata (repeatable), --property (repeatable, "Name=Value" or a comparison such as "Score>=3", "Due<2026-01-01", "Notes~=text"; __none__ matches unset), --limit, --offset, --sort (incl. property:<name-or-id>), --full-id, --fields (JSON only; comma-separated fields to keep), --resolve-properties (JSON only; rows with property, option and member names beside the stored ids)
get <id>Show a single issue--resolve-properties (JSON only; rows with property, option and member names beside the stored ids)
createCreate an issue--title (required), --description / --description-stdin / --description-file, --status, --priority, --assignee, --parent, --stage, --project, --start-date, --due-date, --attachment (repeatable), --property (repeatable), --allow-duplicate (create even when an open issue with the same title exists)
update <id>Update issue fieldsSame fields as create, plus --position, --no-start, --duplicate-of
assign <id>Assign or unassign--to (fuzzy name match against members, agents, and squads), --to-id, --unassign, --no-start
status <id> <status>Change status--no-start, --duplicate-of
reorder <id>Move within a column
search <query>Search issues--limit, --include-closed
children <id>List sub-issues grouped by stage
pull-requests <id>List linked PRs
comment list/add/update/delete/resolve/unresolveManage commentsadd: --content / --content-stdin / --content-file, --parent, --attachment; update: --expected-revision (required), --content / --content-stdin / --content-file; list: --since, --thread, --tail, --recent, --roots-only, --summary, --compact, --full
timeline <id>List activity records and comments in time order--action (repeatable), --activity-only, --since, --tail
wakeup events/list/get/create/update/disable/trigger/delete/checkin/runsManage issue wakeups; see Issue wakeupscreate / update: --agent-id, --kind (event, at, every, cron), --event, --at / --after, --every, --cron, --timezone, --until-* conditions, --expires-in / --expires-at, --instruction / --instruction-file; checkin: --note
subscriber list/add/remove <issue-id>Manage subscribers--user, --user-id (defaults to the current user)
label list/add/remove <issue-id>Manage labels on an issue
metadata list/get/set/delete <issue-id>Manage issue-level key-value metadata
property list/set/unset <issue-id>Set custom property valuesset: --name, --value (actor / multi_actor accept a member name, email, or id)
runs <issue-id>View run history--full-id
run-messages <task-id>View the messages of a single run--since, --issue
usage <issue-id>View aggregated token usage
rerun-task <run-id>Repeat a specific run with its original agent and trigger context--issue, --fresh
cancel-task <task-id>Cancel a running or queued run--issue
projectlist/get/create/update/deleteManage projectscreate: --title (required), --lead, --status, --icon, --start-date, --due-date, --repo (repeatable)
status <id> <status>Change project status
resource list/add/update/removeManage project resources--type, --url, --default-branch-hint, --ref, --local-path, --daemon-id, --execution-mode (in_place / worktree for a local directory)
labellist/get/create/update/deleteManage workspace labelslist: --resource-type (issue or skill), --full-id; create: --name, --color, --resource-type (issue or skill), --description
propertylist/get/create/update/archive/unarchiveManage workspace custom propertiescreate: --name, --type (text, number, select, multi_select, date, checkbox, url, actor, multi_actor, multi_text, multi_url), --option (repeatable, select types only); list: --include-archived; the type cannot be changed after creation
agentlist/get/create/update/archive/restoreManage agents--name, --runtime-id (required for create), --instructions, --conversation-starters, --model, --thinking-level, --custom-env / --custom-env-file / --custom-env-stdin (create only), --custom-args, --mcp-config / --mcp-config-file / --mcp-config-stdin, --permission-mode, --visibility (older form), --max-concurrent-tasks
copy <agent-id>Copy into a new agent; the original is untouched--name (defaults to the original name plus (copy)), --runtime-id (copying to another runtime also requires --model), --no-skills; secret configuration such as custom_env, mcp_config, and runtime_config is not copied — re-provide it with the same flags as create
tasks <id>View an agent's runs
avatar <id>Upload an avatar
env get/set <agent-id>Read and write custom environment variables (agent owner or workspace owner/admin; every read is recorded)set: --custom-env / --custom-env-file / --custom-env-stdin; replaces the whole set, and keys whose value is **** keep their existing value
skills list/set/add <agent-id>Manage attached skills--skill-ids (set replaces the full list, add appends)
mcp list/add/enable/disable/remove <agent-id>Assign workspace MCP servers to this agentTake the server id from workspace mcp list. A library entry does nothing until it is added here; disable stops sending it without dropping the assignment
autopilotlist/get/create/update/deleteManage automationscreate: --title, --agent, --mode (all required), --description, --issue-title-template, --project, --subscriber (repeatable)
trigger <id>Trigger a run manually
runs <id>View run history
trigger-add/trigger-update/trigger-delete/trigger-rotate-urlManage schedule and webhook triggerstrigger-add: --kind (schedule or webhook), --cron, --timezone (default UTC), --label
workspacelist/get/create/update/switchManage workspaces; switch sets the current profile's default workspacecreate: --name, --slug (both required), --issue-prefix, --description, --context / --context-stdin; update changes the same fields except the slug
mcp list/add/update/removeManage the workspace's MCP server libraryWrites are owner/admin. A server added here is assigned to no agent — give it to one with multica agent mcp add. list shows names and transports only; the stored entry is write-only and never returned. --server-config-file / --server-config-stdin keep tokens out of shell history
member list/invite <email>View members, send invitesinvite: --role (member or admin, default member)
repolist/add/remove/checkoutManage workspace repositories and check them out locally--url (repeatable); checkout: --ref
skilllist/get/create/update/deleteManage skills
importImport a skill from a URL or local file--url / --file, --on-conflict (fail, overwrite, rename, skip; default fail)
search <query>Search skills
files list/upsert/delete <skill-id>Manage the files inside a skill
label list/add/remove <skill-id>Manage labels on a skilladd / remove: <label-id> accepts a full UUID or short prefix
squadlist/get/create/update/deleteManage squads (delete archives)
member list/add/set-role/removeManage squad members
activity <issue-id> <outcome>Record a leader evaluation
chathistory, thread [id]Read the external chat session an agent is currently handling--limit, --before

Runtime

CommandSubcommandPurposeKey flags
daemonstartStart the local daemon--foreground, --device-name, --runtime-name, --workspaces-root, --poll-interval, --heartbeat-interval, --agent-timeout (0 means no limit), --max-concurrent-tasks, --no-auto-update; each has a matching MULTICA_* environment variable
stop / status / restartStop, check status, restart (restart takes the same flags as start)
logsView daemon logs--follow, --lines
disk-usageView local disk usage--by-workspace, --by-task, --top
autostart enable/disable/statusRegister or remove start-at-login for the current profilestatus: --output
runtimelist/usage/activity/update/rename/deleteView and manage runtimesusage: --days (default 90, max 365); update: --target-version (required), --wait; delete: --cascade (unbinds bound agents, preserves their data, and cancels their runs)
profile list/create/update/deleteManage custom runtime profilescreate: --display-name, --command-name (both required), --runtime-type (or the older --protocol-family), --description; update: --enabled
profile set-path/unset-path <profile-id>Pin a local executable path (local only, never uploaded to the server)

Additional

CommandSubcommandPurposeKey flags
authstatus / logoutCheck auth status; logout only deletes the locally saved token and does not revoke it on the server
userprofile get/updateView or update the current user's profile
login—Sign in via the browser and configure all workspaces automatically--token (prompts interactively in the terminal when passed without a value)
setupcloud (default), self-hostSave the server address, complete sign-in, and start the daemonself-host: --server-url, --app-url, --port, --frontend-port
attachmentdownload <attachment-id>, upload <path>Download or upload attachmentsdownload: --output-dir; upload: --task
configshow, set <key> <value>View or edit the current profile's local configurationPrecedence: command-line flags > environment variables > config.json > built-in defaults; set an empty string to clear a value
update—Update the CLI to the latest version
version—Print version information--output (text or json)

Driving Multica from another coding agent

If most of your work already happens inside Codex, Claude Code, or Cursor, you can operate Multica from there instead of switching to a terminal. The Multica CLI skill teaches those agents to drive the commands on this page safely: reading issues and comment threads without burning tokens, writing comments through a file, and handling the side effects that mentions, status changes, and assignments carry.

It runs entirely through your authenticated CLI and grants no access of its own — permissions still come from your login, selected profile, and workspace. It requires CLI v0.4.26 or newer. The repository README covers installation for the Claude Code plugin marketplace, the Codex skill installer, Cursor, and any other tool that loads Markdown instructions.

Next steps

On this page