SignOps
Send push to Android, iOS and the web, and ask a trusted phone to approve a login, from your agent.
¿Debería usar esto?
Calidad y seguridad
Hallazgos (6)
- LOWen get_push
- LOWen register_device
- LOWen list_topics
- LOWen unsubscribe_topic
- LOWen get_template
- LOWen list_passkeys
Basado en el análisis automatizado de las definiciones de herramientas y el cumplimiento del protocolo.
Costo de contexto
Este es el número aproximado de tokens que se consumen cada vez que las herramientas del servidor se cargan en el contexto de un modelo. Los recuentos más altos reducen la atención disponible para otras tareas.
Instalar
Instalación con un clic
Agrega esto a tu archivo `claude_desktop_config.json`:
{
"mcpServers": {
"signops": {
"url": "https://api.signops.dev/mcp"
}
}
}Puntos de conexión remotos
https://api.signops.dev/mcpstreamable-httpQué puede hacer
Inventario de herramientas
Herramientas (23)
🟡send_push(user_id, user_ids, topic, all, title, ...)
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.
Esquema de entrada
{
"type": "object",
"properties": {
"user_id": {
"type": "string",
"description": "Your own id for one user."
},
"user_ids": {
"type": "array",
"items": {
"type": "string"
},
"description": "Up to 1,000 of your user ids."
},
"topic": {
"type": "string",
"description": "A topic name."
},
"all": {
"type": "boolean",
"description": "true to send to every device of the app."
},
"title": {
"type": "string",
"description": "The notification title."
},
"body": {
"type": "string",
"description": "The text under it."
},
"data": {
"type": "object",
"additionalProperties": {
"type": "string"
},
"description": "Key and value pairs the app reads. With no title, the push is silent."
},
"image": {
"type": "string",
"description": "An https image URL."
},
"link": {
"type": "string",
"description": "A deep link or URL opened on tap."
},
"send_at": {
"type": "string",
"description": "An ISO time with a zone, up to 30 days ahead, like 2026-10-24T18:00:00+05:30."
},
"template": {
"type": "string",
"description": "A saved template's name; title, body and the rest come from it."
},
"fields": {
"type": "object",
"description": "Values for the template's {{fields}}."
},
"fields_by_user": {
"type": "object",
"description": "With user_ids: each user's own field values, keyed by user id."
},
"marketing": {
"type": "boolean",
"description": "true applies the app's daily cap of marketing pushes per user."
},
"idempotency_key": {
"type": "string",
"description": "Optional. The same key within 24 hours replays the first answer instead of sending again."
}
},
"required": [],
"additionalProperties": false
}🟢get_push(id)
One push by id: status, devices, sent and failed, per platform.
Esquema de entrada
{
"type": "object",
"properties": {
"id": {
"type": "string",
"description": "The push id, msg_..."
}
},
"required": [
"id"
],
"additionalProperties": false
}🟢list_pushes(limit, before)
Pushes, newest first. On the Free plan only pushes still to go are listed (no delivery logs).
Esquema de entrada
{
"type": "object",
"properties": {
"limit": {
"type": "integer",
"minimum": 1,
"maximum": 100
},
"before": {
"type": "string",
"description": "The next value from the previous page."
}
},
"required": [],
"additionalProperties": false
}🔴cancel_push(id)
Cancel a push that is scheduled and has not started sending.
Esquema de entrada
{
"type": "object",
"properties": {
"id": {
"type": "string",
"description": "The push id, msg_..."
}
},
"required": [
"id"
],
"additionalProperties": false
}⚪register_device(user_id, token, platform, name)
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.
Esquema de entrada
{
"type": "object",
"properties": {
"user_id": {
"type": "string",
"description": "Your own id for the user."
},
"token": {
"type": "string",
"description": "The push token."
},
"platform": {
"type": "string",
"enum": [
"android",
"ios",
"web"
]
},
"name": {
"type": "string",
"description": "Optional label, like Rushi's iPhone."
}
},
"required": [
"user_id",
"token",
"platform"
],
"additionalProperties": false
}🟢list_devices(user_id)
The devices registered for one user id, newest first, with platform and whether each is trusted for approvals.
Esquema de entrada
{
"type": "object",
"properties": {
"user_id": {
"type": "string",
"description": "Your own id for the user."
}
},
"required": [
"user_id"
],
"additionalProperties": false
}🔴remove_device(id)
Remove one device by id; it gets no more pushes.
Esquema de entrada
{
"type": "object",
"properties": {
"id": {
"type": "string",
"description": "The device id, dev_..."
}
},
"required": [
"id"
],
"additionalProperties": false
}🟢list_topics
Topics with how many users each has.
Esquema de entrada
{
"type": "object",
"properties": {},
"required": [],
"additionalProperties": false
}🟡subscribe_topic(topic, user_id)
Add a user to a topic. The topic exists once it has a user.
Esquema de entrada
{
"type": "object",
"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."
}
},
"required": [
"topic",
"user_id"
],
"additionalProperties": false
}🔴unsubscribe_topic(topic, user_id)
Take a user off a topic.
Esquema de entrada
{
"type": "object",
"properties": {
"topic": {
"type": "string",
"description": "The topic name."
},
"user_id": {
"type": "string",
"description": "Your own id for the user."
}
},
"required": [
"topic",
"user_id"
],
"additionalProperties": false
}🟢list_templates
Saved push templates with their fields.
Esquema de entrada
{
"type": "object",
"properties": {},
"required": [],
"additionalProperties": false
}🟢get_template(name)
One template by name.
Esquema de entrada
{
"type": "object",
"properties": {
"name": {
"type": "string",
"description": "The template name, like payment_received."
}
},
"required": [
"name"
],
"additionalProperties": false
}🟡save_template(name, title, body, image, link, ...)
Create or replace a template. Put {{field}} where a value goes, or {{field|default}} for one with a fallback.
Esquema de entrada
{
"type": "object",
"properties": {
"name": {
"type": "string",
"description": "Lowercase letters, digits and underscores."
},
"title": {
"type": "string",
"description": "Title, with {{fields}}."
},
"body": {
"type": "string",
"description": "Body, with {{fields}}."
},
"image": {
"type": "string",
"description": "Optional image URL."
},
"link": {
"type": "string",
"description": "Optional link."
},
"data": {
"type": "object",
"additionalProperties": {
"type": "string"
},
"description": "Optional data, with {{fields}} in the values."
}
},
"required": [
"name"
],
"additionalProperties": false
}🔴delete_template(name)
Delete a template by name. Pushes already made from it are not changed.
Esquema de entrada
{
"type": "object",
"properties": {
"name": {
"type": "string",
"description": "The template name."
}
},
"required": [
"name"
],
"additionalProperties": false
}🟡create_approval(user_id, context)
Send an approval request to the user's trusted phone, with number matching. The user must have a phone enrolled through the SignOps SDK.
Esquema de entrada
{
"type": "object",
"properties": {
"user_id": {
"type": "string",
"description": "Your own id for the user."
},
"context": {
"type": "string",
"description": "What they are approving, up to 120 characters, like Sign in from Chrome on Windows."
}
},
"required": [
"user_id",
"context"
],
"additionalProperties": false
}🟢get_approval(id)
An approval request's status: pending, approved, denied, expired or cancelled.
Esquema de entrada
{
"type": "object",
"properties": {
"id": {
"type": "string",
"description": "The approval id, apr_..."
}
},
"required": [
"id"
],
"additionalProperties": false
}🔴cancel_approval(id)
Cancel a pending approval request.
Esquema de entrada
{
"type": "object",
"properties": {
"id": {
"type": "string",
"description": "The approval id, apr_..."
}
},
"required": [
"id"
],
"additionalProperties": false
}🟢list_passkeys(user_id)
The passkeys registered for one user id.
Esquema de entrada
{
"type": "object",
"properties": {
"user_id": {
"type": "string",
"description": "Your own id for the user."
}
},
"required": [
"user_id"
],
"additionalProperties": false
}🟢get_authenticator(user_id)
Whether a user has an authenticator app (TOTP) confirmed, when it was last used, backup codes left, and whether wrong codes have locked them.
Esquema de entrada
{
"type": "object",
"properties": {
"user_id": {
"type": "string",
"description": "Your own id for the user."
}
},
"required": [
"user_id"
],
"additionalProperties": false
}🔴remove_authenticator(user_id)
Remove a user's authenticator app and backup codes, for a lost phone. They can enrol again.
Esquema de entrada
{
"type": "object",
"properties": {
"user_id": {
"type": "string",
"description": "Your own id for the user."
}
},
"required": [
"user_id"
],
"additionalProperties": false
}🔴unlock_user(user_id)
Clear the lock that five wrong codes in 15 minutes put on a user, and their count of wrong codes.
Esquema de entrada
{
"type": "object",
"properties": {
"user_id": {
"type": "string",
"description": "Your own id for the user."
}
},
"required": [
"user_id"
],
"additionalProperties": false
}🟢export_user(user_id)
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.
Esquema de entrada
{
"type": "object",
"properties": {
"user_id": {
"type": "string",
"description": "Your own id for the user."
}
},
"required": [
"user_id"
],
"additionalProperties": false
}🟢get_consent(user_id)
The latest consent answer per purpose for one user, like marketing_push, and the history.
Esquema de entrada
{
"type": "object",
"properties": {
"user_id": {
"type": "string",
"description": "Your own id for the user."
}
},
"required": [
"user_id"
],
"additionalProperties": false
}Comunidad
Evidencia