SignOps
Send push to Android, iOS and the web, and ask a trusted phone to approve a login, from your agent.
사용해야 할까요
품질 및 안전성
발견 사항 (6)
- LOWget_push에서
- LOWregister_device에서
- LOWlist_topics에서
- LOWunsubscribe_topic에서
- LOWget_template에서
- LOWlist_passkeys에서
도구 정의와 프로토콜 준수에 대한 자동 분석을 기반으로 합니다.
컨텍스트 비용
이는 서버의 도구가 모델의 컨텍스트에 로드될 때마다 소비되는 대략적인 토큰 수입니다. 수치가 높을수록 다른 작업에 사용할 수 있는 주의가 줄어듭니다.
설치
원클릭 설치
`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
}커뮤니티
증거