It asks, you answer, nothing happens without you. One MCP server, and Claude Code, Cursor or Windsurf can put a question on your phone before it deploys, deletes or spends — then wait for your thumb.
Your agent runs on a laptop or a server, and you are somewhere else. The phone is where you are, and a push is the one thing that reaches you there.
No session to attach to. The agent makes a tool call; a cron job or a CI step makes an HTTP request. Both end up as the same question on the same phone.
Every question is its own push with its own buttons. Approval for one deploy is approval for that deploy, and the next question asks again.
The answer comes from your thumb, or from your fingerprint when you ask for one. The agent gets a result it can act on, and you get a record of which way it went.
Free on Android and iPhone. Sign in with a link sent to your email.
In the app: Apps → + → New token. You get an lpt_… string, shown once. Revoke or regenerate it any time.
Paste the config below into Claude Code, Cursor or Windsurf. Nothing to install: npx fetches it. Node 18 and up.
// .mcp.json (Claude Code) · .cursor/mcp.json (Cursor) {"mcpServers": {"lauther": { "command": "npx", "args": ["-y", "lauther-mcp"], "env": {"LAUTHER_TOKEN": "lpt_…"} }}}
Before anything irreversible — deploying, deleting data, spending money, force-pushing, emailing real people, touching production — call ask_approval and wait. Proceed only on APPROVED.
The server describes each tool to the model in plain language, so the agent knows when to reach for it and what each result means.
Asks a question and waits for Approve or Deny. Inputs: question, details, require_biometric, timeout_seconds (5–900, default 120).
APPROVED after 34s. Confirmed by biometric. You may proceed… DENIED after 9s. Do not proceed. Do not retry the same question… NO ANSWER after 120s. Silence is not consent…
One-way: the migration finished, the build broke. Inputs: title, message, priority (lowest to urgent), url. Only urgent crosses your quiet hours.
The result says what happened, including the case of an account with no device registered, so the agent is not handed a cheerful success for a notification nobody received.
Three outcomes, each with its own instruction to the model. Telling them apart is the point.
Set require_biometric and the app asks for a fingerprint or face before an approval counts. The result then reads Confirmed by biometric: a record that a person gave the yes, which a log line cannot offer. Denying needs no fingerprint, because refusing should always be cheap. A phone with no screen lock can deny and cannot approve.
APPROVED after 34s. Confirmed by biometric. You may proceed… Free for everything personal. Install on one platform and your account follows you to the other. See pricing →
Calling from a script instead of an agent? The same questions are one HTTP request: the approve endpoint. JavaScript users can reach for the client package.