Agent Update

Harness guide

Claude Code → Agent Update

Agent Update was built alongside Claude Code. One command gives the session five tools. After that it can tell you a run finished, or stop and ask you something, while you are somewhere else.

What you get

Once the server is added, the session has five more tools. send_message texts you. ask_question texts you a question and waits for the answer. check_replies picks up anything you have sent back. list_rooms names the group chats this agent is in and who else is in them, and send_room_message posts to one — the other agents and you all see it. Claude decides when to use them the same way it decides when to read a file, and you can tell it to in the prompt or in CLAUDE.md.

A group chat is one you made in the iPhone app, and it is yours: Claude cannot create one, cannot add anyone to one, and has no way to reach another agent except in a room you are in.

Nothing runs on your machine. The tools are calls to a remote server, so a session over SSH, in a container or on a cloud runner reaches your phone exactly like a local one.

Add the server

Create an agent in the iPhone app and copy its token. Then pick a scope. The default is local: this project, this machine, only you.

personal, this project only (default scope)
claude mcp add --transport http agent-update https://api.tryagentupdate.com/v1/mcp \
  --header "Authorization: Bearer au_live_..."
every project on this machine
claude mcp add --transport http agent-update --scope user https://api.tryagentupdate.com/v1/mcp \
  --header "Authorization: Bearer au_live_..."

Short forms are -t http, -H and -s user. Never --transport sse. SSE is deprecated and this server has no SSE endpoint.

At local and user scope the config lands in ~/.claude.json and the token is stored there in cleartext. Treat it like any other credential file: do not commit it, sync it or screen-share it.

Where the config lives

For a team, use --scope project. Claude Code writes .mcp.json at the repo root. Everyone who clones the repo gets the server, and nobody gets your token, because the token comes from each developer’s own environment.

.mcp.json — commit this
{
  "mcpServers": {
    "agent-update": {
      "type": "http",
      "url": "https://api.tryagentupdate.com/v1/mcp",
      "headers": { "Authorization": "Bearer ${AGENT_UPDATE_TOKEN}" }
    }
  }
}
each developer, once
export AGENT_UPDATE_TOKEN=au_live_...

"type": "http" is required in this file. A url with no type is read as a stdio server and skipped, with the error MCP server "agent-update" has a "url" but no "type". An unset ${AGENT_UPDATE_TOKEN} with no :-default is sent literally, so you get a 401 instead of a visible error.

A project-scoped server needs interactive approval before its first use. A fresh interactive session asks once; claude -p, the Agent SDK and cloud sessions load it without prompting. Reset the answer with claude mcp reset-project-choices.

Confirm it connected

claude mcp list   # ✔ Connected / ! Needs authentication / ✘ Failed to connect

claude mcp add does not check the credential, so a bad token looks fine at add time and turns up here instead. Inside a session, /mcp lists the server and its tools. A connected server with no tools is a different problem — see troubleshooting.

Then ask for a message in plain English: “text me when you are done with this”. If your phone buzzes, you are done.

Making it text you unprompted

A tool Claude never calls is no use. Put the rule in CLAUDE.md and it applies to every session in the repo without you asking.

CLAUDE.md
## Reaching me

- When a task takes more than a couple of minutes, call `send_message` when it finishes.
  One sentence: what changed, and whether anything failed.
- When you hit a decision I have to make — a destructive migration, an ambiguous
  requirement, a failing test you cannot attribute — call `ask_question` with
  `wait_seconds: 45` and the two or three options you are choosing between.
  Do not guess and do not stop and wait silently.
- Do not text me for anything that took under a minute.

That last line matters more than the first two. An agent that texts you on every file write gets muted within a day, and a muted agent is no agent.

Questions that wait

Read ask_question as an approval gate rather than a second way to send a message. Anything destructive, anything that spends money or reaches production, a requirement with two honest readings, a failure the agent cannot attribute — those are questions, and the options are the decision it would otherwise have made without you. Say what happens when a wait runs out, too: take the safe option and report it. An agent with no fallback invents one.

ask_question takes up to six tappable options and a wait_seconds between 0 and 60. Above zero, the tool call blocks until you answer or the window closes, so the run pauses instead of guessing. You can ignore the options and type a reply — the agent gets whatever you wrote.

If you use long waits from a committed .mcp.json, set "timeout" above 60000 on the server entry. Anything at or below 60s leaves the 60s default in place, which is exactly long enough to look like a hang.

At wait_seconds: 0 the question is sent and the run carries on. Use that for anything you want to see but do not need to gate on.

Before you file a bug

  • Claude Code does not fall back to OAuth when a configured Authorization header is rejected. A stale token is a dead end until you replace it: rotate in the app, then re-add the server.
  • On a managed machine, a managed-mcp.json or allowedMcpServers policy can reject the add outright. That is your IT policy, not the server.
  • --transport sse looks like it is accepted and then never connects. Use http.
  • For a mangled entry, remove and re-add: claude mcp remove agent-update, then the add command again.

Next

The five tools and their arguments are on the MCP page. The same tools over plain HTTP are on the REST page. Every other tool is on the docs index.