SignOps
Send push to Android, iOS and the web, and ask a trusted phone to approve a login, from your agent.
我該用這個嗎
品質與安全性
發現項目(6)
- LOW在 get_push 中
- LOW在 register_device 中
- LOW在 list_topics 中
- LOW在 unsubscribe_topic 中
- LOW在 get_template 中
- LOW在 list_passkeys 中
根據工具定義與協定合規性的自動化分析。
上下文成本
這是每次將伺服器的工具載入模型上下文時所消耗的約略 token 數量。數量越高,可用於其他工作的注意力就越少。
安裝
一鍵安裝
將以下內容加入你的 `claude_desktop_config.json` 檔案:
{
"mcpServers": {
"signops": {
"url": "https://api.signops.dev/mcp"
}
}
}遠端端點
https://api.signops.dev/mcpstreamable-http它能做什麼
工具清單
工具(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.
輸入結構描述
{
"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.
輸入結構描述
{
"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).
輸入結構描述
{
"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.
輸入結構描述
{
"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.
輸入結構描述
{
"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.
輸入結構描述
{
"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.
輸入結構描述
{
"type": "object",
"properties": {
"id": {
"type": "string",
"description": "The device id, dev_..."
}
},
"required": [
"id"
],
"additionalProperties": false
}🟢list_topics
Topics with how many users each has.
輸入結構描述
{
"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.
輸入結構描述
{
"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.
輸入結構描述
{
"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.
輸入結構描述
{
"type": "object",
"properties": {},
"required": [],
"additionalProperties": false
}🟢get_template(name)
One template by name.
輸入結構描述
{
"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.
輸入結構描述
{
"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.
輸入結構描述
{
"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.
輸入結構描述
{
"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.
輸入結構描述
{
"type": "object",
"properties": {
"id": {
"type": "string",
"description": "The approval id, apr_..."
}
},
"required": [
"id"
],
"additionalProperties": false
}🔴cancel_approval(id)
Cancel a pending approval request.
輸入結構描述
{
"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.
輸入結構描述
{
"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.
輸入結構描述
{
"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.
輸入結構描述
{
"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.
輸入結構描述
{
"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.
輸入結構描述
{
"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.
輸入結構描述
{
"type": "object",
"properties": {
"user_id": {
"type": "string",
"description": "Your own id for the user."
}
},
"required": [
"user_id"
],
"additionalProperties": false
}社群
證據