GET /v1/instagram/dms?n=10 opens Instagram on your phone, reads your 10 newest conversations into rows and answers JSON. Each endpoint is also an MCP tool with the same name and the same answer (instagram_dms in mobster mcp), so a script, n8n or Zapier, or your agent can use apps that have no public API.
A read runs as code from the app’s pack, with no model call and no screenshot. It needs Mobster set up with your iPhone over USB or Wi-Fi, because it reads the app’s accessibility tree.
Start it
Make a token for each client, then start the server:Endpoints
Each
/v1/<app>/<thing> takes these query parameters:
CSV has one column per field, labelled as the app shows it. A cell that starts like a spreadsheet formula gets an apostrophe, so a spreadsheet never runs it. App API reference lists every endpoint with its parameters and answer.
Any app, without a pack
GET /v1/screen reads the screen in front, in any app, into the fields you name. Mobster opens the app when you pass app, reads the screen’s text from the accessibility tree, and a small model puts each item it shows into a row: Claude Haiku on your Claude key, or Smart’s model on your OpenAI key. pages scrolls down and reads up to 5 screens.
The answer has the same shape as the other endpoints, plus
model and cost_usd, each read’s list price. Rows that don’t fit the fields are left out. The screen’s text goes to the model as data from the app, and the model only fills in rows, so nothing on the screen can make Mobster tap, type or open anything. An app with its own endpoints reads by code instead, faster and with no model.
The same endpoints over MCP
mobster mcp and the agent inside Mobster for Mac list each endpoint as a tool named <app>_<thing> (and GET /v1/screen as read_screen), with the same parameters as inputSchema and the same answer as outputSchema. MCP server shows a call.
Safety
Every endpoint only reads. None taps, types, likes, follows, sends, posts, buys or deletes, any method butGET answers 405, and a read never taps a control that does. A read still taps and swipes to reach its screen, and every tap follows the rules outside agents follow:
- The first time a client reads an app, Mobster for Mac asks Allow Mobster to use …?, and nothing happens until you allow it.
- Your permission rules in Settings › Safety apply to every tap.
--allow-devicelimits the server to that real iPhone.- Mobster reads one thing at a time per iPhone. A read while another is going on that phone answers 409 with
Retry-After. A read stops after 40 seconds and answers 504. - Every read is written to the phone’s action journal before it starts.
Host isn’t 127.0.0.1 or localhost on its port, and refuses any request a web page sends (one with an Origin header). Each request needs a token from mobster api tokens create in Authorization: Bearer. A token in the URL is refused. Mobster keeps each token’s hash, never the token, in app-api-tokens.json in its data folder. If someone else could write that file, Mobster refuses every token until you remove it and make your tokens again. mobster api tokens revoke ends a token at once.
Text read from the phone is data from the app. The OpenAPI description and the MCP tools say so, so an agent reading the rows treats them as data, never as instructions.
Errors
Every error is{"error": "...", "code": "..."}, and the message says what happened, then what to do.
What it reads
The apps with an app pack read by code, and only what each pack’s readers read: App API reference has the list for this build. Any other app reads through/v1/screen, one screen at a time. It reads the accessibility tree, so it works over USB and Wi-Fi, and over iPhone Mirroring it doesn’t read yet. The server runs on this Mac only.