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

A
Calidad de la descripción
89%
Integridad del esquema
92%
Calidad de los nombres
98%
Riesgo de envenenamiento
100%
Coincidencia de permisos
100%
Cumplimiento del protocolo
100%

Hallazgos (6)

  • LOWTool 'get_push' description lacks action verben get_push
  • LOWTool 'register_device' description lacks action verben register_device
  • LOWTool 'list_topics' description lacks action verben list_topics
  • LOWTool 'unsubscribe_topic' description lacks action verben unsubscribe_topic
  • LOWTool 'get_template' description lacks action verben get_template
  • LOWTool 'list_passkeys' description lacks action verben list_passkeys

Basado en el análisis automatizado de las definiciones de herramientas y el cumplimiento del protocolo.

Costo de contexto

~2,555Tokens (definiciones de herramientas)
~731 BTamaño de respuesta típico
Impacto moderado en la atención (2.00% del contexto de 128k)

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-http

Qué puede hacer

Inventario de herramientas

Herramientas (23)

🟢 Solo lectura🟡 Escritura🔴 Eliminación⚪ Desconocido
🟡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

Califica este servidor

Evidencia

Observaciones recientes

verificadoversión no registrada23 herramientas