Reference
CLI and MCP
mb is the API from a terminal. mb mcp is the same thing served to a model. One binary, one list of capabilities — so a tool cannot exist that mb --help does not mention, and a command cannot exist that a model cannot call.
Install and sign in
cargo install --path apps/miss-blue-cli
mb loginmb login prints a short code and opens the console. You approve it there — in a browser you are already signed into — and the token is delivered to the terminal that asked. Nothing goes through a clipboard.
Your code is WDJB-MJHT
Open https://missblue.dev/device
and enter it. This code is good for 10 minutes.
Waiting…..
Signed in — everything you can reachWhen you approve, you choose what it may reach: everything you can, or any combination of workspaces and projects. Naming a workspace covers the projects inside it, including ones added later. The choice is enforced on every request the sign-in makes — a token granted one project is refused the rest of your account, whatever your role is. The token is saved to ~/.config/miss-blue/credentials.json with mode 0600, and mb logout deletes it.
mb logout removes the local copy; it does not yet revoke the sign-in server-side, so a token that leaked stays valid until it expires. Per-sign-in revocation is not built yet — ask us and we will kill it. If you are handing a machine a credential you may want back in a hurry, scope it narrowly.
On a machine with no browser — a CI runner, a server over ssh — pass --no-browser and open the printed URL somewhere else.
Or a project key
MISS_BLUE_API_KEY still works and wins over a saved login — right for CI, where a project-scoped key that outlives whoever set it up is exactly what you want.
From a terminal
mb whoami
mb send --to +15555550100 --text "Your table is confirmed for 7pm"
mb send --to +15555550100 --file receipt.png
mb threads
mb lookup +15555550100
mb problems --only failedWith one number, send uses it. With several it stops and names them rather than guessing — a reply on the wrong line is worse than a command you have to repeat.
As MCP tools
mb mcp speaks MCP over stdio. Point a client at it:
{
"mcpServers": {
"miss-blue": {
"command": "mb",
"args": ["mcp"],
"env": { "MISS_BLUE_API_KEY": "mb_live_..." }
}
}
}A failed tool call comes back as a result with isError, not a transport error, so the model can read what went wrong and try something else. The same key scoping applies: a model holding a key reaches that project and nothing else.
Every capability
The same list in both places. A CLI command and an MCP tool of the same name do the same thing.
| whoami | What this key is, and which project it holds. |
| numbers | The numbers this project holds. |
| send | Send an iMessage. |
| threads | Conversations, most recent first. |
| thread | Every message in one conversation. |
| messages | Recent messages across this project's numbers. |
| message | One message, including its delivery state and the Mac build that handled it. |
| problems | Sends that failed, or are still waiting for a Mac. |
| lookup | Whether iMessage is known to reach a handle. Answered from your own traffic, not from Apple. |
| typing | Show or hide the typing bubble in a conversation. |
| read | Tell the customer their message was seen. Only when a human has looked. |
| react | Add or remove a tapback on a message. |
| unsend | Unsend a message, inside Apple's two-minute window. |
| label | Name a number, so threads say which line they arrived on. |
| contacts | Names this project has given handles. Shared by everyone on it. |
| name | Name a handle, or rename one already named. |
| forget | Remove a name from the project's book. |
| webhooks | The endpoints this project sends events to. |
| webhook-add | Register where events should go. |
| webhook-rm | Stop sending to an endpoint. |
| deliveries | What we tried to send an endpoint, and what came back. |