What Agent Update is
Create an agent in the iPhone app and it hands you a Personal Access Token. Anything holding that token can send you a message, which arrives as a push notification. You reply in the app, and the agent picks the reply up on its next poll, or blocks waiting for it if it asked a question.
Nothing to host, nothing to keep running. Agent Update scales to zero when your agents are quiet.
Creating an agent
- Open Agent Update and sign in with Apple. It is the only sign-in Agent Update accepts.
- Tap + on the Agents screen and name it: 1 to 32 characters, unique to you. The name seeds the agent’s hue, so the same name always glows the same color.
- Copy the token from the sheet that appears. It starts with
au_live_and is shown exactly once. Agent Update stores only a SHA-256 hash, so nobody, including us, can recover it later. - Lost it? Open the agent and tap Rotate. The old token stops working immediately.
A new account gets one agent free, with unlimited messages and no live status. The paid plans raise the cap to 2, 5, 15 agents and add live status on every agent, at no extra charge. Hitting the cap blocks new agents; it never deletes the ones you have.
Connecting Claude Code
Agent Update speaks Streamable-HTTP MCP, so Claude Code connects in one command. Paste your token in place of the placeholder.
claude mcp add agent-update --transport http https://api.tryagentupdate.com/v1/mcp --header "Authorization: Bearer au_live_…"Any MCP client works the same way: point it at https://api.tryagentupdate.com/v1/mcp with an Authorization: Bearer header. Agent Update implements initialize, tools/list, tools/call, ping and notifications/initialized.
The three tools
That is the entire surface. There is no fourth tool.
| Tool | Arguments | Behavior |
|---|---|---|
send_message | text: string, ≤ 8000 chars | Sends the message and returns immediately. Fire-and-forget. |
ask_question | question: stringoptions: up to 6 strings, ≤ 48 chars eachwait_seconds: 0 to 60, default 0 | Sends a question with tappable options. With wait_seconds above zero it blocks until you answer or the window closes, so an agent can ask permission mid-run. |
check_replies | since: message id, optional | Returns the replies this agent has not seen. Poll every 5 to 30 seconds; faster is wasted. |
The REST equivalents
Every tool is a thin wrapper over a public endpoint, so agents that do not speak MCP (cron jobs, CI steps, a shell script) get the same product. The base URL is https://api.tryagentupdate.com, everything is JSON, and every timestamp is ISO-8601 UTC.
Authentication
Send the token as a bearer token on every request. Agent Update classifies a request by token shape: anything starting with au_live_ is an agent.
curl -s https://api.tryagentupdate.com/v1/agent/whoami \
-H "Authorization: Bearer $ORBIT_TOKEN"{
"agent": { "id": "agt_01HXQ…", "name": "deploy-bot" },
"user": { "displayName": "Alex" },
"statusEnabled": true,
"unreadReplies": 0
}Sending a message
nonce is an idempotency key scoped to the agent. Retrying with the same nonce returns the original message instead of texting you twice, which matters when a worker restarts mid-run.
curl -s -X POST https://api.tryagentupdate.com/v1/agent/messages \
-H "Authorization: Bearer $ORBIT_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"text": "Deploy finished. 0 errors, p95 84ms.",
"nonce": "deploy-2411-final"
}'Asking a question
A question renders as an option row in the app. Tapping one answers it. You can also ignore the options and type freely; the agent gets whatever you wrote.
curl -s -X POST https://api.tryagentupdate.com/v1/agent/messages \
-H "Authorization: Bearer $ORBIT_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"kind": "question",
"text": "The v3 pricing page drops the comparison table. Ship it?",
"options": ["Ship it", "Hold for review"]
}'Then long-poll for the answer. The request returns the instant it is answered, so a 45-second wait is cheap.
curl -s "https://api.tryagentupdate.com/v1/agent/messages/msg_01HXR…/answer?wait=45" \
-H "Authorization: Bearer $ORBIT_TOKEN"
# → { "answered": true, "answer": "Ship it", "answeredAt": "2026-08-04T18:22:07Z" }
# → { "answered": false } after the wait window elapsesReading replies
Pass the last message id you processed as after and you get everything newer, newest first. Without it you get the most recent page.
curl -s "https://api.tryagentupdate.com/v1/agent/messages?after=msg_01HXR…&limit=50" \
-H "Authorization: Bearer $ORBIT_TOKEN"A whole agent, in bash
# A background worker reporting queue depth every 30 seconds.
while true; do
curl -s -X POST https://api.tryagentupdate.com/v1/agent/messages \
-H "Authorization: Bearer $ORBIT_TOKEN" \
-H "Content-Type: application/json" \
-d "{\"text\": \"Queue depth $(queue_depth)\"}" > /dev/null
sleep 30
doneErrors
Every failure has the same shape and a stable code.
{ "error": "rate_limited", "message": "Too many messages. Try again in a minute." }| Code | Meaning |
|---|---|
rate_limited | You crossed one of the windows below. Back off and retry. |
body_too_long | The message body exceeded 8000 characters. |
invalid_options | More than 6 options, or an option longer than 48 characters. |
agent_limit_reached | Your plan’s agent cap is full. Existing agents keep working. |
Rate limits
| Scope | Limit |
|---|---|
| Agent messages | 60 per minute, per agent |
| App requests | 300 per minute, per user |
| Message body | 8000 characters |
| Question options | 6 options, 48 characters each |
Limits are fixed-window counters. A burst that hits the ceiling gets 429 rate_limited; the next window starts clean.
The live status service
Live status is included in every paid plan at no extra charge. It is not available on the free Starter plan. It stays a per-agent switch because reading an agent’s messages costs money, so turn it on for the runs you care about. With it on, Agent Update reads the agent’s last 8 messages, truncated to 220 characters each, and refreshes a short structured summary at most once every fifteen seconds.
{
"label": "Refactoring auth",
"activity": "working",
"detail": "Rewriting the token middleware.",
"energy": 0.7
}labelis at most 28 characters and reads like a title.activityis one ofworking,waiting,blocked,idleordone. It picks the swarm’s color and motion.detailis one sentence, at most 120 characters.energyruns 0 to 1 and drives how fast the swarm moves.
Inference is event-driven and debounced, so a chatty agent costs the same as a quiet one. An agent untouched for five minutes decays to idle. If the model returns something unparseable, Agent Update keeps the previous status.
Still stuck
Email hello@tryagentupdate.com. A person reads it.