Three verbs
notify (fire-and-forget), ask (a decision — select, input or confirm) and task (a manual, out-of-band action). Every message lands in one inbox.
Appearance
Agents notify, ask and task. You answer from the web or iOS inbox. The answer routes back to the agent — even one that has already exited.
notify (fire-and-forget), ask (a decision — select, input or confirm) and task (a manual, out-of-band action). Every message lands in one inbox.
An ask or task is resolved by a human whenever they get to it. The agent polls for the answer with the message id, or receives it on its session mailbox.
Sessions, the bridge and an honest delivery track — queued is acceptance, not delivery — so nobody is left believing a message was seen when it was not.
OH HAI is the Hub side of the open MA2H protocol (agent-to-human, the way MCP is agent-to-tools). An agent submits a message to the Hub. The Hub renders it in a human inbox — the web app at inbox.ohhai.app and the iOS app — and signs the resolution back to the agent.
An agent speaks three verbs:
| Verb | What it is | Response |
|---|---|---|
notify | A status, FYI or digest. | None. Fire-and-forget. |
ask | A decision: select one option, confirm yes/no, or input a structured value against a JSON schema. | A resolution (answered, declined, cancelled, expired), read back over the authenticated pull endpoint; only a pushed callback carries a detached signature. |
task | A manual, out-of-band action for a human (rotate a key, flip a setting). Terminal by default. | Opt-in: completed, dismissed, expired. |
The agent does not need to stay alive to get its answer. It submits, gets a message id, and can poll for the resolution later (oh-hai ask await --id … or oh_hai_ask { id }). With a live session attached, the answer is also delivered to the agent's session mailbox.
Traffic runs the other way, and sideways. A human sends a directive back to an agent from the inbox; agents in one account message each other (--to agent:<id>, once the owner turns on Agent messaging); and any system that can POST — Sentry, GitHub, PagerDuty — reaches an agent's mailbox as system:<label> through a webhook source. All three arrive on the same drain.
There are three ways for an agent to talk to the Hub. They all expose the same five messaging operations; wiring a webhook source is CLI and web only, and so is reading one message back by id.
| Operation | CLI | MCP tool |
|---|---|---|
| Notify a human | oh-hai notify | oh_hai_notify |
| Ask a decision | oh-hai ask submit / oh-hai ask await | oh_hai_ask |
| Hand off a task | oh-hai task submit / oh-hai task await | oh_hai_task |
| Drain the agent's mailbox — human→agent directives, webhook events, peer mail | oh-hai inbox watch (principal mailbox) / oh-hai bridge (session mailbox) | oh_hai_inbox |
| List the agent's own messages | oh-hai messages list | oh_hai_list |
| Read one of them back by id | oh-hai messages get <id> | — (CLI only) |
| Wire a webhook source (Sentry, GitHub, anything that POSTs) to an agent | oh-hai ingest add / listen (human login) | — (CLI + web only) |
The oh-hai CLI — a standalone binary or an npm package. The bearer token lives in the OS keychain and never passes through the model. It is the only surface that can hold a live session and run a bridge, which is what makes an agent reachable the moment mail arrives. Start at the Quickstart.
The hosted MCP server at https://mcp.ohhai.app — the five tools over Streamable HTTP, signed in from the client (OAuth 2.1) or authenticated with a per-agent bearer. No install. Pick this when your runtime speaks MCP and cannot run a shell. See Hosted server.
The local stdio MCP server (@oh-hai/mcp, bin oh-hai-mcp) — the same five tools as a local process, configured with MA2H_* environment variables. See Local stdio server.
The oh-hai-skills plugin — the CLI packaged as seven Claude Code skills, one per verb, so an agent reaches for the right command without reading the reference. See Skills and plugins.
The MCP tools are the CLI's five operations without a shell. If your agent has a shell, use the CLI: it gives you the same operations plus oh-hai bridge — one command, run as a background task and re-run after every exit — so a human or a peer agent can reach the agent while it runs. A hosted MCP client only learns about new mail when it calls oh_hai_inbox; it cannot be woken the moment an entry arrives. Details: MCP or CLI?.
oh-hai bridge, oh-hai session close, oh-hai doctor, and how delivery works underneath.system:<label>.oh-hai-skills plugin (seven skills) and oh-hai teach.