Send push to Android, iOS and the web, and ask a trusted phone to approve a login, from your agent.
Maintain this server? Claim it
Call this server's tools from your browser. Nothing to install.
Bearer and your SignOps secret key. Use a test key (sk_test_) while building.
Requests go through mcptry because browsers can't call most MCP servers directly. Header values are sent to the server for that request only and are never stored or logged.
Tool list from our last check. Connect live to refresh it.
Cancel a pending approval request.
The approval id, apr_...
The server marks this tool as destructive. Running it may delete or overwrite data on the server or in any account you connected with your headers.
Cancel a pending approval request.
| Argument | Type | Description |
|---|---|---|
| id* | string | The approval id, apr_... |
{
"type": "object",
"required": [
"id"
],
"properties": {
"id": {
"type": "string",
"description": "The approval id, apr_..."
}
},
"additionalProperties": false
}Cancel a push that is scheduled and has not started sending.
| Argument | Type | Description |
|---|---|---|
| id* | string | The push id, msg_... |
{
"type": "object",
"required": [
"id"
],
"properties": {
"id": {
"type": "string",
"description": "The push id, msg_..."
}
},
"additionalProperties": false
}Send an approval request to the user's trusted phone, with number matching. The user must have a phone enrolled through the SignOps SDK.
| Argument | Type | Description |
|---|---|---|
| context* | string | What they are approving, up to 120 characters, like Sign in from Chrome on Windows. |
| user_id* | string | Your own id for the user. |
{
"type": "object",
"required": [
"user_id",
"context"
],
"properties": {
"context": {
"type": "string",
"description": "What they are approving, up to 120 characters, like Sign in from Chrome on Windows."
},
"user_id": {
"type": "string",
"description": "Your own id for the user."
}
},
"additionalProperties": false
}Delete a template by name. Pushes already made from it are not changed.
| Argument | Type | Description |
|---|---|---|
| name* | string | The template name. |
{
"type": "object",
"required": [
"name"
],
"properties": {
"name": {
"type": "string",
"description": "The template name."
}
},
"additionalProperties": false
}Everything SignOps holds on one user id as JSON: devices (tokens shortened), topics, passkeys, authenticator status, approvals of the last 90 days, consent history and pushes sent to them.
| Argument | Type | Description |
|---|---|---|
| user_id* | string | Your own id for the user. |
{
"type": "object",
"required": [
"user_id"
],
"properties": {
"user_id": {
"type": "string",
"description": "Your own id for the user."
}
},
"additionalProperties": false
}An approval request's status: pending, approved, denied, expired or cancelled.
| Argument | Type | Description |
|---|---|---|
| id* | string | The approval id, apr_... |
{
"type": "object",
"required": [
"id"
],
"properties": {
"id": {
"type": "string",
"description": "The approval id, apr_..."
}
},
"additionalProperties": false
}Whether a user has an authenticator app (TOTP) confirmed, when it was last used, backup codes left, and whether wrong codes have locked them.
| Argument | Type | Description |
|---|---|---|
| user_id* | string | Your own id for the user. |
{
"type": "object",
"required": [
"user_id"
],
"properties": {
"user_id": {
"type": "string",
"description": "Your own id for the user."
}
},
"additionalProperties": false
}The latest consent answer per purpose for one user, like marketing_push, and the history.
| Argument | Type | Description |
|---|---|---|
| user_id* | string | Your own id for the user. |
{
"type": "object",
"required": [
"user_id"
],
"properties": {
"user_id": {
"type": "string",
"description": "Your own id for the user."
}
},
"additionalProperties": false
}One push by id: status, devices, sent and failed, per platform.
| Argument | Type | Description |
|---|---|---|
| id* | string | The push id, msg_... |
{
"type": "object",
"required": [
"id"
],
"properties": {
"id": {
"type": "string",
"description": "The push id, msg_..."
}
},
"additionalProperties": false
}One template by name.
| Argument | Type | Description |
|---|---|---|
| name* | string | The template name, like payment_received. |
{
"type": "object",
"required": [
"name"
],
"properties": {
"name": {
"type": "string",
"description": "The template name, like payment_received."
}
},
"additionalProperties": false
}The devices registered for one user id, newest first, with platform and whether each is trusted for approvals.
| Argument | Type | Description |
|---|---|---|
| user_id* | string | Your own id for the user. |
{
"type": "object",
"required": [
"user_id"
],
"properties": {
"user_id": {
"type": "string",
"description": "Your own id for the user."
}
},
"additionalProperties": false
}The passkeys registered for one user id.
| Argument | Type | Description |
|---|---|---|
| user_id* | string | Your own id for the user. |
{
"type": "object",
"required": [
"user_id"
],
"properties": {
"user_id": {
"type": "string",
"description": "Your own id for the user."
}
},
"additionalProperties": false
}Pushes, newest first. On the Free plan only pushes still to go are listed (no delivery logs).
| Argument | Type | Description |
|---|---|---|
| limit | integer | |
| before | string | The next value from the previous page. |
{
"type": "object",
"required": [],
"properties": {
"limit": {
"type": "integer",
"maximum": 100,
"minimum": 1
},
"before": {
"type": "string",
"description": "The next value from the previous page."
}
},
"additionalProperties": false
}Saved push templates with their fields.
No arguments.
{
"type": "object",
"required": [],
"properties": {},
"additionalProperties": false
}Topics with how many users each has.
No arguments.
{
"type": "object",
"required": [],
"properties": {},
"additionalProperties": false
}Store a device's push token under your user id. Android and iOS tokens come from the Firebase or Apple SDK; for web, token is the PushSubscription as JSON.
| Argument | Type | Description |
|---|---|---|
| name | string | Optional label, like Rushi's iPhone. |
| token* | string | The push token. |
| user_id* | string | Your own id for the user. |
| platform* | string |
{
"type": "object",
"required": [
"user_id",
"token",
"platform"
],
"properties": {
"name": {
"type": "string",
"description": "Optional label, like Rushi's iPhone."
},
"token": {
"type": "string",
"description": "The push token."
},
"user_id": {
"type": "string",
"description": "Your own id for the user."
},
"platform": {
"enum": [
"android",
"ios",
"web"
],
"type": "string"
}
},
"additionalProperties": false
}Remove a user's authenticator app and backup codes, for a lost phone. They can enrol again.
| Argument | Type | Description |
|---|---|---|
| user_id* | string | Your own id for the user. |
{
"type": "object",
"required": [
"user_id"
],
"properties": {
"user_id": {
"type": "string",
"description": "Your own id for the user."
}
},
"additionalProperties": false
}Remove one device by id; it gets no more pushes.
| Argument | Type | Description |
|---|---|---|
| id* | string | The device id, dev_... |
{
"type": "object",
"required": [
"id"
],
"properties": {
"id": {
"type": "string",
"description": "The device id, dev_..."
}
},
"additionalProperties": false
}Create or replace a template. Put {{field}} where a value goes, or {{field|default}} for one with a fallback.
| Argument | Type | Description |
|---|---|---|
| body | string | Body, with {{fields}}. |
| data | object | Optional data, with {{fields}} in the values. |
| link | string | Optional link. |
| name* | string | Lowercase letters, digits and underscores. |
| image | string | Optional image URL. |
| title | string | Title, with {{fields}}. |
{
"type": "object",
"required": [
"name"
],
"properties": {
"body": {
"type": "string",
"description": "Body, with {{fields}}."
},
"data": {
"type": "object",
"description": "Optional data, with {{fields}} in the values.",
"additionalProperties": {
"type": "string"
}
},
"link": {
"type": "string",
"description": "Optional link."
},
"name": {
"type": "string",
"description": "Lowercase letters, digits and underscores."
},
"image": {
"type": "string",
"description": "Optional image URL."
},
"title": {
"type": "string",
"description": "Title, with {{fields}}."
}
},
"additionalProperties": false
}Send a push notification to one user (user_id), a list (user_ids, up to 1,000), a topic, or everyone (all: true). Give exactly one target. A push to one user, sent now, answers with its result at once; others answer with status sending or scheduled. With a test key (sk_test_) only test devices receive it.
| Argument | Type | Description |
|---|---|---|
| all | boolean | true to send to every device of the app. |
| body | string | The text under it. |
| data | object | Key and value pairs the app reads. With no title, the push is silent. |
| link | string | A deep link or URL opened on tap. |
| image | string | An https image URL. |
| title | string | The notification title. |
| topic | string | A topic name. |
| fields | object | Values for the template's {{fields}}. |
| send_at | string | An ISO time with a zone, up to 30 days ahead, like 2026-10-24T18:00:00+05:30. |
| user_id | string |
Add a user to a topic. The topic exists once it has a user.
| Argument | Type | Description |
|---|---|---|
| topic* | string | Up to 64 letters, digits, dashes, dots or underscores. |
| user_id* | string | Your own id for the user. |
{
"type": "object",
"required": [
"topic",
"user_id"
],
"properties": {
"topic": {
"type": "string",
"description": "Up to 64 letters, digits, dashes, dots or underscores."
},
"user_id": {
"type": "string",
"description": "Your own id for the user."
}
},
"additionalProperties": false
}Clear the lock that five wrong codes in 15 minutes put on a user, and their count of wrong codes.
| Argument | Type | Description |
|---|---|---|
| user_id* | string | Your own id for the user. |
{
"type": "object",
"required": [
"user_id"
],
"properties": {
"user_id": {
"type": "string",
"description": "Your own id for the user."
}
},
"additionalProperties": false
}Take a user off a topic.
| Argument | Type | Description |
|---|---|---|
| topic* | string | The topic name. |
| user_id* | string | Your own id for the user. |
{
"type": "object",
"required": [
"topic",
"user_id"
],
"properties": {
"topic": {
"type": "string",
"description": "The topic name."
},
"user_id": {
"type": "string",
"description": "Your own id for the user."
}
},
"additionalProperties": false
}| Your own id for one user. |
| template | string | A saved template's name; title, body and the rest come from it. |
| user_ids | array | Up to 1,000 of your user ids. |
| marketing | boolean | true applies the app's daily cap of marketing pushes per user. |
| fields_by_user | object | With user_ids: each user's own field values, keyed by user id. |
| idempotency_key | string | Optional. The same key within 24 hours replays the first answer instead of sending again. |
{
"type": "object",
"required": [],
"properties": {
"all": {
"type": "boolean",
"description": "true to send to every device of the app."
},
"body": {
"type": "string",
"description": "The text under it."
},
"data": {
"type": "object",
"description": "Key and value pairs the app reads. With no title, the push is silent.",
"additionalProperties": {
"type": "string"
}
},
"link": {
"type": "string",
"description": "A deep link or URL opened on tap."
},
"image": {
"type": "string",
"description": "An https image URL."
},
"title": {
"type": "string",
"description": "The notification title."
},
"topic": {
"type": "string",
"description": "A topic name."
},
"fields": {
"type": "object",
"description": "Values for the template's {{fields}}."
},
"send_at": {
"type": "string",
"description": "An ISO time with a zone, up to 30 days ahead, like 2026-10-24T18:00:00+05:30."
},
"user_id": {
"type": "string",
"description": "Your own id for one user."
},
"template": {
"type": "string",
"description": "A saved template's name; title, body and the rest come from it."
},
"user_ids": {
"type": "array",
"items": {
"type": "string"
},
"description": "Up to 1,000 of your user ids."
},
"marketing": {
"type": "boolean",
"description": "true applies the app's daily cap of marketing pushes per user."
},
"fields_by_user": {
"type": "object",
"description": "With user_ids: each user's own field values, keyed by user id."
},
"idempotency_key": {
"type": "string",
"description": "Optional. The same key within 24 hours replays the first answer instead of sending again."
}
},
"additionalProperties": false
}