Skip to main content
Give your local coding agent a cloud teammate. Delegate a repository review, a test investigation, or an independent change to Aether, then keep working in the same Claude Code or Codex conversation. Each delegated task runs in an Aether cloud workspace on its own branch, and its report comes back into the conversation that started it. Aether is one MCP server in your client. There is nothing to install per checkout: the project comes from the checkout’s Git origin remote.

Before you start

Cloud tasks use the project’s normal agent, model, and workspace-size defaults. They consume workspace runtime credits, including when the task is read-only.

Connect your client

1

Run setup

Setup finds Claude Code and Codex on this machine and, asking first, registers aether mcp serve as the Aether MCP server in each, replaces the connection Claude Code used before CLI 0.2.21 and removes its two hooks, and signs the bridge in once through your browser. Run it again after installing a client; steps already done are skipped.
To do the same by hand:
Each client starts aether mcp serve for each session and stops it when the session ends. The command forwards Aether’s tools to the hosted endpoint, knows which conversation it serves (Claude Code’s session registry, Codex’s thread id), and wakes that conversation when a delegated task reports back. aether mcp login stores the credential in ~/.aether/mcp-oauth/ (readable only by you), shared by every Claude Code and Codex session on the machine; a session that finds no credential opens the browser itself, which takes longer than either client allows a server to start. Codex users may add required = true to the [mcp_servers.aether] table in ~/.codex/config.toml so a turn waits for Aether instead of starting without it.

Delegate your first task

From a checkout of the connected repository, paste this into your conversation:
Your agent calls aether_spawn_task and gets a task link. The cloud agent sends its report with aether_respond_to_parent, exactly as a child of a cloud task does, so the prompt should say what to report. The task starts from pushed repository state: your local uncommitted changes and conversation transcript are not uploaded. Push a branch first if the cloud agent needs your latest code, and name it in the request. A successful first run leaves you with a task link and the cloud agent’s report in your conversation.

How results reach your conversation

The cloud task reports back through aether_wait_for_tasks, which returns each report, question, and failure framed as a message from that task.
  • Claude Code: aether mcp serve watches the conversation and sends it a message when a report arrives (it appears as a message from another Claude session), asking Claude to call aether_wait_for_tasks. /clear, /resume and reopening a closed session are followed: a report that arrived while a conversation was not showing is announced as soon as it shows again.
  • Codex: aether mcp serve watches the conversation and queues a message into the thread when a report arrives, asking Codex to call aether_wait_for_tasks.
  • When the task needs input: the report is a question. Your agent answers it with aether_respond_to_task.
  • When the task’s pull request is ready: a report says it is clean and mergeable at its current head, with no failing or pending external check runs recorded (Aether’s own checks are not counted). Readiness is a snapshot: inspect the pull request before acting, and whether to merge is your call.
  • When your client is closed: cloud work continues. Reports wait; reopen the conversation and Claude Code is woken for them, Codex after its first Aether tool call in the resumed thread. Either way aether_wait_for_tasks returns everything the conversation has not acknowledged yet.
  • Acknowledging: after reading, your agent calls aether_wait_for_tasks again with acknowledge set to the ids it received. An update stays unacknowledged, and is announced again, until it does. The acknowledging call returns at once, with anything still unread, even while other children run; only a call without acknowledge waits.
  • When a task’s run ends: every run ends with one ended update, finished or stopped, whatever the task reported along the way, so a task that stops working without reporting still wakes your conversation. A stop your own conversation made is not reported back. Your agent reads a task that ended without a report with aether_read_task_messages.
Each conversation sees only the tasks it spawned. Other tasks stay visible in the web app and the CLI.

Useful ways to split the work

Include the branch, scope, and completion criteria in the request. Configure required dependencies and secrets in the project environment. Cloud changes stay on the task’s branch: ask for a PR, review it, and decide how to bring it into your work. A report does not merge or apply anything to your local checkout.

Delegation, Teleport, or a CLI task?

Connection and permissions

The server is https://api.runaether.dev/mcp. Its credential permits delegation, including billable task creation, and excludes account settings, billing details, and direct database access. Only what your agent explicitly puts in a task or a reply is sent to Aether. The bridge sends the conversation’s id with each call and asks the server which of that conversation’s reports are unread; it does not upload prompt text, transcripts, local files, or tool output. Other MCP clients can add the hosted server directly at https://api.runaether.dev/mcp. Without the bridge, a conversation lasts as long as the client’s connection: reconnecting starts a new one, and its earlier tasks no longer report to it.

Troubleshooting

Remove an older install

Before CLI 0.2.21, Claude Code connected to the hosted server directly and needed two hooks. aether setup replaces the connection and removes the hooks; by hand, run claude mcp remove --scope user aether and delete the UserPromptSubmit and Stop entries that call aether_hook in ~/.claude/settings.json. The tool those hooks call has been removed, so a leftover hook reports an error on every prompt and at the end of every turn until it is deleted; it does not block the turn. Earlier still, Aether CLI releases installed delegation per checkout with aether setup. Those files are no longer used; delete them from each checkout:
  • .aether/delegation-*.json and .aether/delegation-setup.lock
  • Claude Code: the aether_delegation entry in .mcp.json, the aether hooks in .claude/settings.local.json, and .claude/skills/aether-delegate/
  • Codex: the aether_delegation entry in .codex/config.toml, .codex/hooks.json, and .agents/skills/aether-delegate/