Skip to main content
Glama

πŸ”” PushNotif MCP Server (pushnotif-mcp-server)

MCP Protocol Node.js License: MIT

Official open-source Model Context Protocol (MCP) Server implementation for PushNotif.biz.id β€” allowing AI coding assistants (Claude Desktop, Claude Code, Cursor, Windsurf, Cline, and Glama) to register accounts, generate SDK snippets, broadcast Web Push (VAPID) & Mobile Push (Android FCM / iOS APNs), configure In-App Popup Banners, and manage QRIS credits.


πŸ“¦ Repository Architecture (Open-Source MCP Server Implementation)

This repository contains the complete, runnable MCP Server implementation built on @modelcontextprotocol/sdk:

  • src/index.js β€” Full Stdio MCP Server implementation (@modelcontextprotocol/sdk) exposing all 17 PushNotif tools (ListToolsRequestSchema & CallToolRequestSchema).

  • Dockerfile β€” Containerized build for Glama.ai automated inspection and local Docker execution.

  • package.json β€” Node.js ES Module package (bin: pushnotif-mcp).

  • glama.json & smithery.yaml β€” Registry metadata manifests.


Related MCP server: BotBell MCP Server

πŸš€ Quick Start (Local Stdio MCP Server)

Option 1: Run via Node.js / npx (Stdio)

Clone and install dependencies:

git clone https://github.com/AarsyDesign/pushnotif-mcp.git
cd pushnotif-mcp
npm install

Add to your claude_desktop_config.json or .cursor/mcp.json:

{
  "mcpServers": {
    "pushnotif": {
      "command": "node",
      "args": ["/absolute/path/to/pushnotif-mcp/src/index.js"],
      "env": {
        "PUSHNOTIF_API_KEY": "pn_live_YOUR_API_KEY_HERE"
      }
    }
  }
}

Option 2: Run via Docker (Stdio)

docker build -t pushnotif-mcp .
docker run -i --rm -e PUSHNOTIF_API_KEY=pn_live_YOUR_API_KEY_HERE pushnotif-mcp

Option 3: Direct Streamable HTTP Endpoint

You can also connect directly via Streamable HTTP at https://pushnotif.biz.id/mcp with Authorization: Bearer pn_live_YOUR_API_KEY_HERE.


πŸ› οΈ Available Tools (17 Tools)

Account Onboarding (No API Key Required)

  1. request_registration_otp β€” Send 6-digit verification OTP to user email (includes automatic duplicate email check).

  2. register_new_account β€” Verify OTP, create a new PushNotif account (+1,000 Free Quota Credits forever), register first website, and return api_key (pn_live_...).

  3. login_existing_account β€” Authenticate an existing account with email & password to retrieve its api_key.

Workspace, Web Push, Mobile Push & In-App Automation

  1. list_apps β€” List all registered websites/apps, active subscriber counts, and credit balance.

  2. create_app β€” Register a new website or mobile app and generate VAPID keys.

  3. get_integration_guide β€” Generate copy-paste SDK snippets for HTML/JS, Laravel, Next.js/React, WordPress, Android (Kotlin), and iOS (Swift).

  4. send_push_notification β€” Broadcast instant Web Push (VAPID), Android (FCM), and iOS (APNs) notifications.

  5. schedule_push_notification β€” Schedule one-time or recurring (daily / weekly) push campaigns.

  6. configure_inapp_banner β€” Configure In-App Popup Modals, Top Sticky Bars, Bottom Slide Cards, or Live Activity Toasts.

  7. configure_rss_autopush β€” Configure automated RSS / Sitemap / Atom feed monitoring.

  8. configure_mobile_credentials β€” Upload Firebase FCM Service Account JSON or Apple APNs .p8 credentials.

  9. list_subscribers β€” View active subscriber device distribution and segments.

  10. get_campaign_analytics β€” Inspect campaign delivery, click-through rate (CTR), and conversion metrics.

  11. create_qris_invoice β€” Generate a live QRIS payment invoice (starting from Rp 1,000 / 5,000 Credits).

  12. check_billing_and_qris_status β€” Check real-time QRIS payment status (PENDING / PAID) and credit balance.

  13. update_app_branding β€” Update notification icon URL and automatic Welcome Push message.

  14. update_profile β€” Update workspace display name or account password.


πŸ“„ License

MIT License β€” Copyright (c) 2026 PushNotif.biz.id (AarsyDesign)

Available Tools

17 tools
check_billing_and_qris_statusA
Read-onlyIdempotent

Check QRIS top-up order payment status (PENDING or PAID), current credit balance, credit ledger history, and official PDF invoice URLs. Use this tool to verify whether a QRIS invoice from create_qris_invoice has been paid or to audit credit usage; do not use it to create a new top-up invoice (use create_qris_invoice instead). Read-only operation requiring PUSHNOTIF_API_KEY with 0 credit cost. Returns JSON { credits_balance, orders: [{ id, amount_rp, credits_added, status, invoice_pdf_url, created_at }], recent_ledger: [...] }.

ParametersJSON Schema
NameRequiredDescriptionDefault
order_idNoOptional specific QRIS order ID (format ord_xxxx from create_qris_invoice) to inspect; omit to list recent orders

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, idempotentHint and destructiveHint=false, so the safety profile is covered. The description adds genuinely new operational context: it requires PUSHNOTIF_API_KEY and costs 0 credits. It does not mention rate limits or pagination, so it stops short of a 5.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loads purpose and outputs, then usage guidance, then the return shape. Dense but nearly every clause carries information; the return-shape sentence is arguably the least essential given it duplicates what a caller would learn anyway, but it earns its place with no output schema present.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

No output schema exists, so the description compensates by spelling out the returned JSON structure (credits_balance, orders fields, recent_ledger). Combined with auth requirements, cost, and clear usage boundaries, an agent has everything needed to call and interpret this tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100% and the single order_id parameter is fully documented in the schema, including the ord_xxxx format and the omit-to-list behavior. The description itself adds no parameter-level detail beyond that, so the baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (check) and resource (QRIS top-up order payment status), then enumerates the exact outputs: payment status, credit balance, ledger history, and PDF invoice URLs. It explicitly distinguishes itself from the sibling create_qris_invoice, so an agent can route correctly without opening either schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives explicit when-to-use ('verify whether a QRIS invoice ... has been paid or to audit credit usage') and when-not-to-use ('do not use it to create a new top-up invoice'), naming the alternative tool create_qris_invoice. Nothing is left to inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

configure_inapp_bannerA
Idempotent

Configure and publish an on-site In-App Popup or Banner (center modal, top sticky bar, or bottom slide-in card) rendered by the PushNotif SDK without requiring browser notification permission. Use this tool to display promotional popups or announcements to all active website visitors; do not use it to send OS lock-screen push notifications (use send_push_notification instead). Prerequisite: call list_apps first to obtain app_id. Requires PUSHNOTIF_API_KEY; saving configuration costs 0 credits, and each live visitor impression deducts 1 credit. Returns JSON { ok, app_id, inapp_enabled, inapp_style, inapp_trigger, inapp_freq }.

ParametersJSON Schema
NameRequiredDescriptionDefault
app_idYesTarget application ID in format app_xxxx (obtain from list_apps)
inapp_bodyYesBanner supporting message text (1 to 240 characters)
inapp_freqNoPer-visitor frequency cap: 'once_per_session' (default), 'once_per_day', 'cooldown_3h', 'cooldown_12h', 'once_per_week', or 'always'
inapp_styleNoVisual layout style: 'modal' (center dialog), 'top_bar' (sticky top ribbon), or 'bottom_slide' (corner toast card)
inapp_titleYesBanner headline text (1 to 100 characters)
inapp_accentNoOptional hex color code for the CTA button and accent border (default: '#0058BE')
inapp_cta_urlNoOptional HTTPS URL opened when the CTA button is clicked
inapp_enabledNoSet true to activate the banner on the website, or false to pause it (default: true)
inapp_triggerNoDisplay trigger condition: 'immediate' (default), 'delay_5s', 'delay_10s', 'scroll_50', 'scroll_80', or custom DOM event 'event:<name>'
inapp_cta_textNoOptional call-to-action button label (e.g., 'Klaim Voucher β†’')

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the annotations (readOnlyHint=false, idempotentHint=true, destructiveHint=false), the description discloses the auth requirement (PUSHNOTIF_API_KEY), the credit/cost model (0 credits to save, 1 credit per live visitor impression), and the no-browser-permission rendering constraint. That is exactly the kind of operational context the structured fields cannot convey.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The single paragraph is front-loaded with purpose and the sibling exclusion, then prerequisites, cost, and return shape. Every clause carries information, though the trailing return-value enumeration makes it slightly dense for a one-paragraph block.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a ten-parameter mutation tool with no output schema, the description covers the gaps that matter: prerequisite ordering, auth key, cost per impression, sibling routing, and the return JSON keys. An agent has everything needed to call it correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so all ten parameters including enums-in-prose (inapp_freq, inapp_style, inapp_trigger) are already documented in the schema. The description restates the style variants in prose but adds no syntax, format, or default information beyond what the schema provides, so the baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description names a specific verb (configure and publish) and resource (on-site In-App Popup or Banner), enumerates the three rendering styles, and explicitly differentiates itself from the sibling send_push_notification. An agent can distinguish this from every other tool in the sibling list without opening a schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It states when to use it (promotional popups or announcements to all active website visitors), when not to use it (OS lock-screen push, with the exact alternative named), and gives a concrete prerequisite workflow (call list_apps first to obtain app_id). Nothing is left to inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

configure_mobile_credentialsA
Idempotent

Store native mobile push credentialsβ€”Firebase Cloud Messaging (FCM HTTP v1 service-account.json) for Android APK and Apple Push Notification service (.p8 AuthKey, Key ID, Team ID, Bundle ID) for iOSβ€”on a specific app_id. Use this tool when enabling native Android or iOS push delivery; do not use it for standard browser Web Push (which uses auto-generated VAPID keys from create_app). Prerequisite: call list_apps first to obtain app_id. Requires PUSHNOTIF_API_KEY, costs 0 credits, and idempotently updates encrypted mobile credentials. Returns JSON { ok, app_id, android_fcm_configured, ios_apns_configured }.

ParametersJSON Schema
NameRequiredDescriptionDefault
app_idYesTarget application ID in format app_xxxx (obtain from list_apps)
apns_key_idNo10-character Apple Developer APNs Key ID (e.g., 'ABC123DEFG')
apns_p8_keyNoFull PEM text content of Apple's AuthKey_XXXX.p8 private key file
apns_team_idNo10-character Apple Developer Team ID
apns_bundle_idNoiOS application Bundle Identifier (e.g., 'id.company.app')
fcm_service_account_jsonNoRaw JSON string of the Google Firebase Service Account key file for Android FCM HTTP v1

TDQS

A4.6/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=false, idempotentHint=true, and destructiveHint=false, but the description adds real context: it requires PUSHNOTIF_API_KEY, costs 0 credits, and stores credentials encrypted. It also spells out the return shape, which matters since no output schema exists. Only minor gap is what happens on partial credential updates (one platform only).

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the core action, then usage, prerequisite, auth/cost, and return value in a single dense paragraph with no filler. The em-dash credential enumeration makes one sentence heavy, but every clause carries information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 6-parameter mutation with no output schema, the description covers purpose, platform scoping, prerequisite, auth key, cost, idempotency, and the exact JSON return shape. An agent has everything needed to invoke it correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so baseline is 3, but the description goes further by mapping the credential families to platforms β€” FCM service-account.json for Android, .p8 AuthKey/Key ID/Team ID/Bundle ID for iOS β€” clarifying which fields group together. It does not add format detail beyond the schema's own examples.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (store) and resource (native mobile push credentials for FCM/APNs) and explicitly scopes it to Android/iOS native push. It names the boundary against Web Push handled by create_app, so an agent can separate it from create_app and send_push_notification without opening either schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives an explicit when ('enabling native Android or iOS push delivery') and an explicit when-not ('do not use it for standard browser Web Push... from create_app'), plus the prerequisite to call list_apps first. Alternatives and selection conditions are fully spelled out.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

configure_rss_autopushA
Idempotent

Configure automated 24/7 RSS, Atom, or XML Sitemap polling for an app_id, or trigger an immediate feed check and push broadcast via dispatch_now=true. Use this tool when a blog, news portal, or store wants newly published articles automatically broadcast as push notifications; do not use it for manual one-off messages (use send_push_notification instead). Prerequisite: call list_apps first to obtain app_id. Requires PUSHNOTIF_API_KEY; feed URLs are validated against SSRF rules, deduplicated by item GUID/URL, and deduct 1 credit per delivered subscriber when a new post is broadcast. Returns JSON { ok, app_id, rss_enabled, rss_feed_url, rss_interval, dispatched_now, latest_item_title }.

ParametersJSON Schema
NameRequiredDescriptionDefault
app_idYesTarget application ID in format app_xxxx (obtain from list_apps)
rss_prefixNoOptional prefix prepended to each notification title (e.g., 'Artikel Baru: ')
rss_enabledNoSet true to enable background RSS/Sitemap polling, or false to disable it
dispatch_nowNoSet true to immediately fetch the latest feed entry and broadcast it to active subscribers right now
rss_feed_urlNoPublic HTTPS URL of the RSS 2.0, Atom, or XML Sitemap feed (e.g., 'https://example.com/feed')
rss_intervalNoPolling frequency: '5m', '15m', '30m' (default), '1h', '3h', or 'daily_digest'

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations cover the safety profile (readOnly=false, idempotent=true, destructive=false, openWorld=true), and the description adds substantial context beyond them: PUSHNOTIF_API_KEY requirement, SSRF validation of feed URLs, deduplication by item GUID/URL, and a credit cost of 1 per delivered subscriber per new post. This is exactly the operational context an agent needs for a write tool with billing implications.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the core action, then usage, prerequisites, runtime behavior, and return shape in a logical order. It is dense and runs long, but nearly every clause (auth key, SSRF, dedup, credit cost) carries decision-relevant information rather than padding.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description supplies the return shape ({ ok, app_id, rss_enabled, rss_feed_url, rss_interval, dispatched_now, latest_item_title }), and it covers prerequisites, auth, security constraints, dedup, and billing. An agent has everything needed to call it correctly and predict the response.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema already documents all six parameters with examples and defaults. The description reiterates dispatch_now semantics and the interval/feed fields but adds no syntax or constraints the schema lacks. Baseline 3 applies when the schema does the heavy lifting.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (configure) plus resource (24/7 RSS/Atom/Sitemap polling) and names the secondary dispatch_now action, so an agent understands both the standing-config and immediate-trigger modes. It explicitly distinguishes itself from send_push_notification, which handles manual one-off messages.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides explicit when-to-use context (blog, news portal, store wanting auto-broadcast of new articles), a when-not-to-use rule with the correct alternative (send_push_notification for manual one-offs), and a prerequisite (call list_apps to obtain app_id). Nothing is left to inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

create_appA

Register an additional website or mobile application under the authenticated PushNotif workspace and generate its unique ECDSA P-256 VAPID keypair. Use this tool when an authenticated user wants to add a new website domain or app; do not use it to modify an existing app's logo or welcome message (use update_app_branding instead) or to register a brand-new user account (use register_new_account instead). Requires PUSHNOTIF_API_KEY, costs 0 credits, and creates a persistent app record. Returns JSON { ok, app: { id, site_name, site_url, vapid_public_key, created_at }, sdk_snippet }.

ParametersJSON Schema
NameRequiredDescriptionDefault
site_urlYesCanonical HTTPS URL of the website (must start with https:// or http://localhost)
site_nameYesDisplay name of the website or mobile application (2 to 80 characters)

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the annotations (readOnlyHint=false, destructiveHint=false, idempotentHint=false), the description discloses the required credential PUSHNOTIF_API_KEY, the cost (0 credits), and that a persistent record is created. Those are operationally significant facts an agent cannot derive from the annotation block.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three sentences, front-loaded with purpose, then routing, then operational facts; every sentence carries information. It is dense and slightly long, but with no output schema present the inline return-shape sentence earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a write tool with no output schema the description covers auth requirements, cost, persistence semantics, routing alternatives, and the returned JSON payload shape. An agent has everything needed to call it correctly and know the outcome.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so site_url's HTTPS/localhost constraint and site_name's 2-80 character range are already fully documented in the schema. The description adds no additional parameter-level syntax or format detail, so the baseline of 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (register/create) plus the resource (website or mobile app under the PushNotif workspace) and the side effect (generating an ECDSA P-256 VAPID keypair). It explicitly distinguishes itself from update_app_branding and register_new_account, so an agent can select it without opening sibling schemas.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives an explicit when-to-use condition ('authenticated user wants to add a new website domain or app') plus two explicit when-not-to-use cases, each naming the correct alternative tool. Nothing about routing is left to inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

create_qris_invoiceA

Create a prepaid credit top-up invoice payable via Indonesian QRIS (all banks and e-wallets) at a flat rate of Rp 0.20 per credit (Rp 1,000 = 5,000 lifetime credits). Use this tool when the user wants to add credit balance; do not use it to check whether an existing invoice has been paid (use check_billing_and_qris_status instead). Requires PUSHNOTIF_API_KEY, creates a PENDING order valid for 30 minutes, and automatically adds non-expiring credits upon payment webhook confirmation. Provide either package_id ('starter'=Rp 20,000, 'growth'=Rp 50,000, 'pro'=Rp 100,000) or a custom amount_rp (>= 1000). Returns JSON { ok, order: { id, amount_rp, credits_added, status, qris_checkout_url, expires_at } }.

ParametersJSON Schema
NameRequiredDescriptionDefault
amount_rpNoCustom top-up amount in Indonesian Rupiah (minimum 1000, maximum 10000000; 1 IDR = 5 credits)
package_idNoPreset package tier: 'starter' (Rp 20,000 = 100,000 credits), 'growth' (Rp 50,000 = 250,000 credits), or 'pro' (Rp 100,000 = 500,000 credits); overridden if amount_rp is explicitly provided

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations cover the safety profile (readOnlyHint=false, idempotentHint=false, destructiveHint=false, openWorldHint=true), and the description adds materially beyond them: requires PUSHNOTIF_API_KEY, creates a PENDING order valid for 30 minutes, and credits are non-expiring and only granted on payment webhook confirmation. That lifecycle and credential detail is not derivable from the annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loads purpose, then usage routing, then credentials/lifecycle, then return shape β€” a well-ordered single paragraph. It is somewhat dense and repeats the package pricing already in the schema, so a small amount of text does not earn its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a no-required-param mutation tool with no output schema, the description supplies everything an agent needs: auth requirement, order lifecycle and expiry, when credits land, and an inline return shape ({ ok, order: {...} }). Nothing critical is left to inference.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so both parameters (amount_rp, package_id) are already fully documented, including the override relationship. The description restates the package tiers and built-in minimum but adds no syntax or format detail beyond the schema, which is the baseline-3 case.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Create a prepaid credit top-up invoice payable via Indonesian QRIS') and immediately scopes it to banks/e-wallets and the pricing model. An agent can distinguish this from the many account/app/push siblings without opening any schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly gives the trigger ('when the user wants to add credit balance') and a negative case with a named alternative ('do not use it to check whether an existing invoice has been paid (use check_billing_and_qris_status instead)'). This is exactly the when/when-not/alternative structure that removes ambiguity.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_campaign_analyticsA
Read-onlyIdempotent

Retrieve historical push campaign delivery metrics (sent count, click count, CTR percentage, credits spent) and active scheduled queue items. Use this tool to audit campaign performance or find scheduled campaign IDs (cmp_sch_xxxx); do not use it to check QRIS payment invoices (use check_billing_and_qris_status instead) or raw subscriber device lists (use list_subscribers instead). Read-only operation requiring PUSHNOTIF_API_KEY with 0 credit cost. Returns JSON { summary: { total_sent, total_clicks, avg_ctr_percent }, campaigns: [{ id, app_id, title, delivered_count, click_count, ctr_percent, created_at }], scheduled_queue: [...] }.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMaximum number of recent campaigns to return (1 to 50, default: 10)
app_idNoOptional application ID filter (format app_xxxx); omit to aggregate across all apps in the workspace

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint/idempotentHint/destructiveHint, but the description adds non-obvious context: the required PUSHNOTIF_API_KEY and the fact that the call costs 0 credits. It also discloses the exact return shape, which annotations cannot convey.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three sentences, front-loaded with purpose then routing then operational facts, with zero filler. The inline JSON return spec earns its length because no output schema exists.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description correctly supplies the return structure (summary/campaigns/scheduled_queue) plus auth and cost constraints. An agent has everything needed to call and interpret this tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100% and both parameters (limit range/default, app_id format) are fully documented in the schema. The description adds no parameter-level syntax or semantics beyond that, so the baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Specific verb+resource with the exact metrics enumerated (sent count, click count, CTR, credits spent, scheduled queue). It also names the sibling alternatives it must not be confused with, so an agent can discriminate without opening schemas.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicit when-to-use ('audit campaign performance or find scheduled campaign IDs') and when-not-to-use with two named alternatives (check_billing_and_qris_status, list_subscribers). Nothing is left to inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_integration_guideA
Read-onlyIdempotent

Generate copy-pasteable SDK installation code and service worker setup instructions for a specific app_id and target framework. Use this tool when a developer asks how to install PushNotif on HTML, Laravel, Next.js/React, WordPress, or Flutter/mobile; do not use it to send notifications (use send_push_notification instead). Prerequisite: call list_apps first to get app_id. Read-only operation requiring PUSHNOTIF_API_KEY with 0 credit cost. Returns JSON { app_id, site_name, framework, one_line_script, service_worker_url, code_snippet, verification_steps }.

ParametersJSON Schema
NameRequiredDescriptionDefault
app_idYesTarget application ID in format app_xxxx (obtain from list_apps)
frameworkNoTarget stack: 'html' (default 1-line script), 'nextjs', 'laravel', 'wordpress', or 'flutter'

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnly/idempotent/non-destructive, but the description adds auth requirements (PUSHNOTIF_API_KEY), cost (0 credit), and the exact return payload shape. These are behavioral facts the annotations cannot express.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loads the purpose, then the when/when-not, then prerequisite and side-effect facts, then return fields. Sentences are dense but each carries distinct decision-relevant information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description compensates by enumerating the returned JSON fields. Combined with auth, cost, and prerequisite disclosure, an agent has everything needed to call and interpret this tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100% and already documents both app_id (app_xxxx format, from list_apps) and the framework options. The description restates the same framework list and app_id prerequisite without adding syntax or format detail beyond the schema, so the baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (generate) and resource (SDK installation code / service worker setup instructions) scoped to an app_id and framework. It also explicitly distinguishes itself from send_push_notification, so an agent can route between them without inspecting schemas.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives an explicit trigger ('when a developer asks how to install PushNotif on HTML, Laravel, Next.js/React, WordPress, or Flutter/mobile'), an explicit exclusion ('do not use it to send notifications – use send_push_notification instead'), and a prerequisite ('call list_apps first to get app_id').

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_appsA
Read-onlyIdempotent

List all registered websites and mobile apps in the authenticated PushNotif workspace along with active subscriber counts and current credit balance. Use this tool first as a prerequisite before calling send_push_notification, schedule_push_notification, get_integration_guide, or configure_inapp_banner to obtain a valid app_id; do not use it to inspect individual device tokens (use list_subscribers instead). Read-only operation requiring PUSHNOTIF_API_KEY with zero credit cost. Returns JSON { tenant_name, credits_balance, total_apps, apps: [{ id, site_name, site_url, active_subscribers }] }.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, idempotentHint, openWorldHint=false, and destructiveHint=false, but the description adds the PUSHNOTIF_API_KEY requirement, zero credit cost, and the exact JSON return shape. For a read-only listing tool, this additional auth, cost, and output context is substantial.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The definition front-loads the core purpose, then usage prerequisites, then operational details and the return shape. Every sentence adds actionable information, and the density is appropriate for a tool an agent must call before several others.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no input parameters and no output schema, the description carries the full burden of explaining the return structure, and it does so explicitly. Combined with prerequisite guidance and sibling differentiation, an agent has everything needed to call it correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

There are no parameters, so the schema is empty and schema description coverage is effectively 100%. The description cannot add parameter semantics beyond confirming the tool takes no input; baseline 4 applies for zero-parameter tools.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (List) and resource (registered websites and mobile apps) with scope (authenticated PushNotif workspace) and return contents (active subscriber counts and credit balance). It distinguishes itself from list_subscribers by explicitly directing device-token inspection there.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly instructs to use it first as a prerequisite before send_push_notification, schedule_push_notification, get_integration_guide, and configure_inapp_banner to obtain a valid app_id. It also names list_subscribers as the alternative for inspecting individual device tokens, covering when-not-to-use.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_subscribersA
Read-onlyIdempotent

Retrieve active subscriber device records and platform breakdown counts (Web VAPID, Android FCM, iOS APNs) for the workspace or a specific app_id. Use this tool to inspect audience size, platform distribution, or subscriber tags; do not use it to view campaign click metrics (use get_campaign_analytics instead). Read-only operation requiring PUSHNOTIF_API_KEY with 0 credit cost. Returns JSON { total_active, platform_breakdown: { web, android_fcm, ios_apns }, subscribers: [{ id, app_id, platform, tags, created_at }] }.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMaximum number of recent subscriber records to return (1 to 100, default: 15)
app_idNoOptional application ID filter (format app_xxxx); omit to list subscribers across all workspace apps

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, idempotentHint, and destructiveHint=false, so the safety profile is covered. The description adds genuinely new behavioral facts beyond the annotations: the required PUSHNOTIF_API_KEY credential and the 0 credit cost. It stops short of discussing pagination or rate limits, which keeps it from a 5.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with purpose, then usage, then constraints, then return shape. Dense and largely waste-free, though the embedded return-shape enumeration is long enough to make the single paragraph slightly heavy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

No output schema exists, but the description supplies the return JSON shape (total_active, platform_breakdown, subscribers array with fields), plus credential and cost context. An agent has everything needed to call and interpret it.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so both parameters (limit with range and default, app_id format and omission semantics) are fully documented in the schema. The description only references app_id filtering at a high level, adding little beyond the structured fields; baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb+resource (retrieve active subscriber device records and platform breakdown counts) and explicitly scopes to a workspace or app_id. It also names the sibling it is not (get_campaign_analytics), so an agent can distinguish it without opening schemas.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives explicit when-to-use cases (inspect audience size, platform distribution, subscriber tags) and an explicit when-not with the correct alternative tool named. Nothing is left to inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

login_existing_accountA
Read-onlyIdempotent

Authenticate an existing PushNotif account with email and password to retrieve its active API key and registered apps list. Use this tool when an existing user wants to connect their account in chat without opening the web dashboard; do not use it for new signups (use request_registration_otp and register_new_account instead). Read-only authentication check with no credit cost, rate-limited against brute-force attempts. Returns JSON { ok, tenant: { id, name, email, api_key, credits }, apps: [{ id, site_name, site_url }] }.

ParametersJSON Schema
NameRequiredDescriptionDefault
emailYesRegistered PushNotif account email address
passwordYesAccount password

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, idempotentHint and destructiveHint=false. The description goes further by disclosing that it is rate-limited against brute-force attempts and carries no credit cost, which is real operational context an agent cannot get from structured fields. It stops short of describing failure/error behavior, which keeps it out of 5 territory.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three sentences, front-loaded with purpose before routing guidance and behavioral notes. The inline return-shape JSON is slightly dense but earns its place since no output schema exists.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a two-param auth tool with no output schema, the description covers purpose, correct/incorrect usage, cost, rate limiting, and the exact return payload shape. An agent has everything needed to call and interpret it correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100% for both parameters, so the schema already documents email and password fully. The description adds no syntax, format, or constraint detail beyond what the schema provides, making the baseline 3 appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Authenticate an existing PushNotif account') plus what it yields (API key, apps list). It also explicitly distinguishes itself from register_new_account and request_registration_otp, so an agent can route correctly without opening sibling schemas.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives an explicit when-to-use ('an existing user wants to connect their account in chat without opening the web dashboard') and an explicit when-not-to-use with named alternatives for new signups. Nothing is left to inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

register_new_accountA

Verify a 6-digit email OTP, create a new PushNotif tenant account with 1,000 free lifetime credits, register the initial website app, and issue a live API key. Use this tool immediately after request_registration_otp once the user providesotp_code; do not use it to add extra websites to an existing account (use create_app instead). Public endpoint requiring no prior API key; irreversibly creates a tenant record and auto-generates ECDSA P-256 VAPID keys. Returns JSON { ok, tenant: { id, name, email, api_key, credits }, app: { id, site_name, site_url, vapid_public_key } }.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYesUser or company workspace name (2 to 80 characters)
emailYesEmail address that received the OTP from request_registration_otp
otp_codeYesExact 6-digit numeric OTP code sent to the user's email
passwordYesAccount password (minimum 6 characters)
site_urlNoOptional full HTTPS origin URL of the first website (e.g., https://example.com)
site_nameNoOptional display name for the first website or app (defaults to workspace name)

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations only give the generic safety flags (readOnly=false, idempotent=false, destructive=false), while the description adds high-value context: it is a public endpoint needing no prior API key, it irreversibly creates a tenant record, it auto-generates ECDSA P-256 VAPID keys, and it grants 1,000 free lifetime credits. That is well beyond what the annotations convey.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The main action is front-loaded in the first clause and the routing exclusions follow, so the important information comes first. It is a dense single paragraph and the trailing inline JSON shape is verbose, but every sentence carries actionable information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

There is no output schema, and the description compensates by spelling out the return shape ({ ok, tenant, app } with nested fields). Combined with the stated prerequisites, irreversibility, and key generation, an agent has everything needed to call this correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so every parameter (name, email, password, otp_code, site_url, site_name) is already documented in the schema, which sets the baseline at 3. The description reinforces the 6-digit OTP and its link to request_registration_otp but adds no syntax, format, or defaulting detail beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description names a precise multi-step outcome: verify OTP, create a tenant account, register the first website app, and issue a live API key. It explicitly distinguishes itself from create_app and request_registration_otp, so an agent can route correctly without opening any schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It states the exact trigger condition ('immediately after request_registration_otp once the user provides otp_code') and an explicit exclusion with the correct alternative ('do not use it to add extra websites to an existing account (use create_app instead)'). Both when-to-use and when-not-to-use are covered.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

request_registration_otpA
Idempotent

Send a 6-digit email verification OTP to start registering a new PushNotif account. Use this tool first when a user wants to create a new account from chat; do not use it for existing accounts (use login_existing_account instead). Public endpoint requiring no API key; checks for duplicate emails, rate-limited to 5 requests per 10 minutes per IP, and sends an OTP valid for 10 minutes before calling register_new_account. Returns JSON { ok, status, email, message }.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameNoOptional user or workspace display name (2 to 80 characters)
emailYesValid email address to register (e.g., user@domain.com); must not already be registered

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Goes well beyond the annotations (readOnlyHint=false, idempotentHint=true, destructiveHint=false, openWorldHint=true) by disclosing auth requirements (public endpoint, no API key), rate limits (5 per 10 minutes per IP), duplicate-email checking, OTP lifetime (10 minutes), and the response shape. These are exactly the operational facts the annotations cannot express.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Purpose is front-loaded in the first clause, followed by usage routing, then operational constraints, then the return shape. Every sentence carries distinct information; none repeats the name or schema verbatim.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description supplies the return object ({ ok, status, email, message }), and it covers preconditions, rate limits, and next-step tooling. An agent has everything needed to call this correctly on the first attempt.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the baseline is 3, but the description adds meaning about the email parameter: it is checked for duplicates and is the address the OTP is sent to. The optional name parameter is not elaborated beyond the schema, keeping this just short of the top score.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb+resource+effect: sending a 6-digit email verification OTP to start a PushNotif registration. It explicitly names the sibling it must not be confused with (login_existing_account), so an agent can disambiguate it without opening either schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives explicit when ('use this tool first when a user wants to create a new account from chat'), when-not ('do not use it for existing accounts'), the named alternative, and the downstream sequencing ('before calling register_new_account'). Nothing is left to inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

schedule_push_notificationA

Schedule a one-time or recurring push notification campaign for a future timestamp, or cancel an existing pending schedule. Use this tool for delayed or recurring broadcasts (daily, weekly, cron); do not use it for immediate sending (use send_push_notification instead). Prerequisite: call list_apps first to obtain app_id, or call get_campaign_analytics to find a cancel_campaign_id. Requires PUSHNOTIF_API_KEY; credits (1 per delivered device) are deducted only when the scheduled dispatch executes. Pass cancel_campaign_id ('cmp_sch_xxxx') to cancel a queued job, or pass app_id, title, body, and scheduled_for (ISO-8601) to create one. Returns JSON { ok, action, scheduled_campaign: { id, app_id, title, scheduled_for, recurrence_rule, status } }.

ParametersJSON Schema
NameRequiredDescriptionDefault
urlNoOptional HTTPS destination URL opened on tap
bodyNoNotification body text (required when creating a schedule; 1 to 240 characters)
titleNoNotification headline (required when creating a schedule; 1 to 100 characters)
app_idNoTarget application ID in format app_xxxx (required when creating a schedule)
scheduled_forNoISO-8601 execution timestamp (e.g., '2026-10-21T08:00:00+07:00')
recurrence_ruleNoRecurrence pattern: 'once' (default), 'daily', 'twice_daily', 'weekly', 'monthly', 'every_30m', 'every_3h', 'every_6h', or a 5-field cron expression
cancel_campaign_idNoOptional scheduled campaign ID (format cmp_sch_xxxx from get_campaign_analytics) to cancel and delete before execution

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations cover the safety profile (readOnly=false, destructive=false, idempotent=false), and the description adds context the annotations do not carry: PUSHNOTIF_API_KEY requirement, credit billing of 1 per delivered device charged only at dispatch execution, and that cancellation deletes a queued job before execution. The cancel-is-delete wording is consistent with a not-yet-delivered job rather than user data destruction, so it does not contradict destructiveHint=false.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Purpose and the primary routing rule are front-loaded, and nearly every sentence carries load (prereqs, auth, billing, return shape). It is a dense single block with no formatting, which makes the two operating modes harder to scan than they need to be.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description compensates by disclosing the return shape ({ ok, action, scheduled_campaign: {...} }), and it covers prerequisites, auth, billing timing, and both operating modes. Complete enough for an agent to invoke correctly on the first try.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3, but the description adds the crucial mode-switching semantics: passing cancel_campaign_id cancels, whereas passing app_id + title + body + scheduled_for creates. It also flags the ID format expectations, though individual field-level constraints largely duplicate the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (schedule/cancel) plus resource (future push notification campaign) and explicitly distinguishes itself from the sibling send_push_notification for immediate sending. An agent can tell the two apart without opening either schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Names the when ('delayed or recurring broadcasts: daily, weekly, cron'), the when-not ('immediate sending'), the alternative to use instead, and the precondition calls (list_apps for app_id, get_campaign_analytics for cancel_campaign_id). Routing is fully determined.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

send_push_notificationA

Broadcast an immediate push notification across Web Push (VAPID), Android (FCM), and iOS (APNs) to active subscribers of a specific app_id. Use this tool for instant real-time delivery; do not use it for future or recurring broadcasts (use schedule_push_notification instead) or in-page popups (use configure_inapp_banner instead). Prerequisite: call list_apps first to obtain app_id. Requires PUSHNOTIF_API_KEY, deducts 1 credit (Rp 0.20) per successfully delivered device (0 credits charged for 404/410 dead tokens, which are auto-pruned), and is irreversible once dispatched. Set segment='all' for all active subscribers or pass a specific tag name to target a subset. Returns JSON { ok, campaign_id, total_targeted, total_delivered, total_gone_pruned, credits_deducted, credits_remaining }.

ParametersJSON Schema
NameRequiredDescriptionDefault
urlNoOptional HTTPS destination URL opened when the user taps the notification (defaults to the app's site_url)
bodyYesNotification message body text (1 to 240 characters)
titleYesNotification headline shown on lock screen (1 to 100 characters)
app_idYesTarget application ID in format app_xxxx (obtain from list_apps)
segmentNoSubscriber filter: 'all' (default, sends to every active subscriber of app_id) or a specific subscriber tag string (e.g., 'vip', 'jakarta')

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare non-read-only, non-idempotent, open-world behavior, but the description adds substantial context beyond them: required PUSHNOTIF_API_KEY, per-device credit cost (Rp 0.20) with 0 credits for auto-pruned 404/410 dead tokens, and irreversibility once dispatched. This is exactly the billing/side-effect detail an agent needs before firing a broadcast.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Dense but front-loaded: the core action and channel list lead, followed by usage exclusions, prerequisites, cost, and return shape. Every sentence carries actionable information and none is padding.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

No output schema exists, but the description enumerates the return JSON fields (campaign_id, totals, pruned tokens, credits). Combined with prerequisites, cost, and irreversibility, an agent has everything needed to call this destructive-ish broadcast correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema already documents all five parameters including segment, url defaults, and length bounds. The description's restatement of segment='all' vs a tag name adds only marginal value beyond the schema, so the baseline 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (broadcast), resource (immediate push notification), and the three delivery channels (Web Push/VAPID, FCM, APNs) scoped to a specific app_id. It explicitly distinguishes itself from schedule_push_notification and configure_inapp_banner, so an agent can route correctly without opening other schemas.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives explicit when-to-use ('instant real-time delivery'), two when-not-to-use cases with the exact alternative tool named for each, and a prerequisite ('call list_apps first to obtain app_id'). Nothing is left to inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

update_app_brandingA
Idempotent

Configure an application's notification icon URL and automated welcome push notification sent when a visitor first subscribes. Use this tool to customize app-level branding and onboarding welcome alerts; do not use it to change account-level workspace names (use update_profile instead) or in-page popups (use configure_inapp_banner instead). Prerequisite: call list_apps first to obtain app_id. Requires PUSHNOTIF_API_KEY, idempotently updates the app record at 0 configuration cost (welcome pushes cost 1 credit per new subscriber when welcome_enabled=true). Returns JSON { ok, app_id, icon_url, welcome_enabled, welcome_title, welcome_body }.

ParametersJSON Schema
NameRequiredDescriptionDefault
app_idYesTarget application ID in format app_xxxx (obtain from list_apps)
icon_urlNoOptional direct HTTPS URL to a square PNG/JPG/WebP brand icon (recommended 192x192px)
welcome_bodyNoBody text of the automated welcome push notification (max 180 characters)
welcome_titleNoHeadline of the automated welcome push notification (max 80 characters)
welcome_enabledNoSet true to automatically send a welcome push notification immediately after a visitor grants permission

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the annotations (which already declare idempotentHint and destructiveHint=false), the description adds critical context: it requires PUSHNOTIF_API_KEY, it is idempotent, it has zero configuration cost but incurs 1 credit per new subscriber when welcome_enabled=true, and it returns a specific JSON shape. This is rich behavioral detail that goes well beyond what annotations provide.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is front-loaded with purpose, followed by usage and exclusions, prerequisite, and behavioral/return details. Every sentence earns its place and there is no redundant or filler text.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the 5-parameter schema with no output schema, the description covers all necessary context: purpose, alternatives, prerequisite, authentication needs, cost model, idempotency, and the exact return JSON shape. An agent has everything needed to invoke it correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema already explains each parameter thoroughly. The description adds meaning for welcome_enabled by noting the cost per new subscriber when true, which is not in the schema. For the remaining parameters it largely summarizes rather than adding new semantic detail, so it improves on the baseline but does not fully elaborate every parameter.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb (Configure) and resource (application's notification icon URL and welcome push notification), and explicitly distinguishes this tool from siblings by naming update_profile and configure_inapp_banner as alternatives for other tasks. An agent can identify the tool's scope without opening the schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It provides explicit when-to-use ('customize app-level branding and onboarding welcome alerts'), when-not-to-use ('do not use it to change account-level workspace names ... or in-page popups'), names the alternative tools, and states a prerequisite ('call list_apps first to obtain app_id'). Nothing is left to inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

update_profileA
Idempotent

Update the authenticated tenant's workspace display name or account password. Use this tool only for account-level profile or password changes; do not use it to change a website's notification logo or welcome push message (use update_app_branding instead). Requires PUSHNOTIF_API_KEY, costs 0 credits, and overwrites the workspace name (and password hash if new_password is supplied). Returns JSON { ok, tenant: { id, name, email }, password_updated }.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYesNew workspace or company display name (2 to 80 characters)
new_passwordNoOptional new account login password (minimum 6 characters; omit to keep current password unchanged)

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations declare the mutation profile (readOnlyHint=false, idempotentHint=true, destructiveHint=false), and the description adds context annotations cannot carry: the required PUSHNOTIF_API_KEY, zero credit cost, and the overwrite semantics for the workspace name and password hash. It also discloses the return shape, which matters because there is no output schema.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with purpose, then exclusions, then requirements, then return shape – a logical order with no filler. Slightly dense at four sentences, but every clause carries operational information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description supplies the response shape ({ ok, tenant, password_updated }); with 100% schema coverage on params, it does not need to repeat field syntax. Auth, cost, overwrite behavior, and the sibling exclusion are all covered, so an agent has everything needed to invoke it correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100% and both parameters are fully documented in the schema, so the baseline of 3 applies. The description adds a small amount of semantic detail (that name is overwritten and that the password hash changes only if new_password is supplied), but no format or validation info beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Names a specific verb+resource ('Update the authenticated tenant's workspace display name or account password') and scopes it to account-level profile fields. It explicitly names the sibling update_app_branding as the tool for logo/push-message branding, so an agent can separate the two without opening either schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives an explicit when-to-use ('only for account-level profile or password changes') and an explicit when-not-to-use with the alternative named ('do not use it to change a website's notification logo or welcome push message (use update_app_branding instead)'). Nothing about tool selection is left to inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 16 tool updatesv2.1.2
    • Changedcheck_billing_and_qris_status1 field changed
      • changedInput schema / properties / order_id / description
        Previous value: -"Opsional: ID tagihan QRIS tertentu yang ingin dicek (misal: ord_xxxx)"New value: +"Optional specific QRIS order ID (format ord_xxxx from create_qris_invoice) to inspect; omit to list recent orders"
    • Changedconfigure_inapp_banner10 fields changed
      • changedInput schema / properties / app_id / description
        Previous value: -"App ID yang ingin diatur"New value: +"Target application ID in format app_xxxx (obtain from list_apps)"
      • changedInput schema / properties / inapp_accent / description
        Previous value: -"Kode warna HEX tombol (misal: #0058BE, #047857, #E11D48)"New value: +"Optional hex color code for the CTA button and accent border (default: '#0058BE')"
      • changedInput schema / properties / inapp_body / description
        Previous value: -"Isi pesan singkat"New value: +"Banner supporting message text (1 to 240 characters)"
      • changedInput schema / properties / inapp_cta_text / description
        Previous value: -"Teks tombol aksi (CTA)"New value: +"Optional call-to-action button label (e.g., 'Klaim Voucher β†’')"
      • changedInput schema / properties / inapp_cta_url / description
        Previous value: -"URL tujuan saat tombol diklik"New value: +"Optional HTTPS URL opened when the CTA button is clicked"
      • changedInput schema / properties / inapp_enabled / description
        Previous value: -"True untuk mengaktifkan banner di website/aplikasi"New value: +"Set true to activate the banner on the website, or false to pause it (default: true)"
      • changedInput schema / properties / inapp_freq / description
        Previous value: -"Frekuensi tampil: once_per_session, once_per_day, always, cooldown_3h, cooldown_12h, once_per_week"New value: +"Per-visitor frequency cap: 'once_per_session' (default), 'once_per_day', 'cooldown_3h', 'cooldown_12h', 'once_per_week', or 'always'"
      • changedInput schema / properties / inapp_style / description
        Previous value: -"Gaya tampilan: modal, top_bar, atau bottom_slide"New value: +"Visual layout style: 'modal' (center dialog), 'top_bar' (sticky top ribbon), or 'bottom_slide' (corner toast card)"
      • changedInput schema / properties / inapp_title / description
        Previous value: -"Judul pengumuman/promo"New value: +"Banner headline text (1 to 100 characters)"
      • changedInput schema / properties / inapp_trigger / description
        Previous value: -"Pemicu muncul: immediate, delay_5s, delay_10s, scroll_50, scroll_80, atau event:nama_event (misal: event:add_to_cart, event:payment_success)"New value: +"Display trigger condition: 'immediate' (default), 'delay_5s', 'delay_10s', 'scroll_50', 'scroll_80', or custom DOM event 'event:<name>'"
    • Changedconfigure_mobile_credentials6 fields changed
      • changedInput schema / properties / apns_bundle_id / description
        Previous value: -"iOS App Bundle ID (misal: id.perusahaan.app)"New value: +"iOS application Bundle Identifier (e.g., 'id.company.app')"
      • changedInput schema / properties / apns_key_id / description
        Previous value: -"Apple APNs Key ID (10 karakter)"New value: +"10-character Apple Developer APNs Key ID (e.g., 'ABC123DEFG')"
      • changedInput schema / properties / apns_p8_key / description
        Previous value: -"Isi teks file AuthKey_XXXX.p8 dari Apple Developer"New value: +"Full PEM text content of Apple's AuthKey_XXXX.p8 private key file"
      • changedInput schema / properties / apns_team_id / description
        Previous value: -"Apple Developer Team ID (10 karakter)"New value: +"10-character Apple Developer Team ID"
      • changedInput schema / properties / app_id / description
        Previous value: -"App ID yang ingin dikonfigurasi"New value: +"Target application ID in format app_xxxx (obtain from list_apps)"
      • changedInput schema / properties / fcm_service_account_json / description
        Previous value: -"Isi teks file service-account.json Firebase untuk Android APK"New value: +"Raw JSON string of the Google Firebase Service Account key file for Android FCM HTTP v1"
    • Changedconfigure_rss_autopush6 fields changed
      • changedInput schema / properties / app_id / description
        Previous value: -"App ID tujuan"New value: +"Target application ID in format app_xxxx (obtain from list_apps)"
      • changedInput schema / properties / dispatch_now / description
        Previous value: -"Set true jika ingin langsung menarik item RSS terbaru dan menembak Push Notification detik ini juga"New value: +"Set true to immediately fetch the latest feed entry and broadcast it to active subscribers right now"
      • changedInput schema / properties / rss_enabled / description
        Previous value: -"True untuk mengaktifkan pemantau RSS otomatis"New value: +"Set true to enable background RSS/Sitemap polling, or false to disable it"
      • changedInput schema / properties / rss_feed_url / description
        Previous value: -"URL RSS/Atom/Sitemap website (misal: https://domain.com/rss.xml)"New value: +"Public HTTPS URL of the RSS 2.0, Atom, or XML Sitemap feed (e.g., 'https://example.com/feed')"
      • changedInput schema / properties / rss_interval / description
        Previous value: -"Interval cek: 5m, 15m, 30m, 1h, 3h, atau daily_digest"New value: +"Polling frequency: '5m', '15m', '30m' (default), '1h', '3h', or 'daily_digest'"
      • changedInput schema / properties / rss_prefix / description
        Previous value: -"Awalan judul notifikasi (misal: Artikel Baru:)"New value: +"Optional prefix prepended to each notification title (e.g., 'Artikel Baru: ')"
    • Changedcreate_app2 fields changed
      • changedInput schema / properties / site_name / description
        Previous value: -"Nama website atau aplikasi"New value: +"Display name of the website or mobile application (2 to 80 characters)"
      • changedInput schema / properties / site_url / description
        Previous value: -"URL domain lengkap dengan https://"New value: +"Canonical HTTPS URL of the website (must start with https:// or http://localhost)"
    • Changedcreate_qris_invoice2 fields changed
      • changedInput schema / properties / amount_rp / description
        Previous value: -"Nominal Rupiah top-up (default: 20000)"New value: +"Custom top-up amount in Indonesian Rupiah (minimum 1000, maximum 10000000; 1 IDR = 5 credits)"
      • changedInput schema / properties / package_id / description
        Previous value: -"Pilih paket: starter, growth, atau pro (opsional jika mengisi amount_rp)"New value: +"Preset package tier: 'starter' (Rp 20,000 = 100,000 credits), 'growth' (Rp 50,000 = 250,000 credits), or 'pro' (Rp 100,000 = 500,000 credits); overridden if amount_rp is explicitly provided"
    • Changedget_campaign_analytics2 fields changed
      • changedInput schema / properties / app_id / description
        Previous value: -"Opsional: filter untuk App ID tertentu"New value: +"Optional application ID filter (format app_xxxx); omit to aggregate across all apps in the workspace"
      • changedInput schema / properties / limit / description
        Previous value: -"Jumlah riwayat kampanye terakhir yang ditampilkan (default: 10)"New value: +"Maximum number of recent campaigns to return (1 to 50, default: 10)"
    • Changedget_integration_guide2 fields changed
      • changedInput schema / properties / app_id / description
        Previous value: -"App ID yang ingin diambil panduannya"New value: +"Target application ID in format app_xxxx (obtain from list_apps)"
      • changedInput schema / properties / framework / description
        Previous value: -"Nama framework (misal: Next.js / React, Flutter, Laravel)"New value: +"Target stack: 'html' (default 1-line script), 'nextjs', 'laravel', 'wordpress', or 'flutter'"
    • Changedlist_subscribers2 fields changed
      • changedInput schema / properties / app_id / description
        Previous value: -"Opsional: filter untuk App ID tertentu"New value: +"Optional application ID filter (format app_xxxx); omit to list subscribers across all workspace apps"
      • changedInput schema / properties / limit / description
        Previous value: -"Jumlah baris pelanggan terbaru yang ditampilkan (default: 15)"New value: +"Maximum number of recent subscriber records to return (1 to 100, default: 15)"
    • Changedlogin_existing_account2 fields changed
      • changedInput schema / properties / email / description
        Previous value: -"Alamat email akun PushNotif"New value: +"Registered PushNotif account email address"
      • changedInput schema / properties / password / description
        Previous value: -"Password akun PushNotif"New value: +"Account password"
    • Changedregister_new_account6 fields changed
      • changedInput schema / properties / email / description
        Previous value: -"Alamat email pengguna (sama dengan saat request_registration_otp)"New value: +"Email address that received the OTP from request_registration_otp"
      • changedInput schema / properties / name / description
        Previous value: -"Nama pengguna atau workspace"New value: +"User or company workspace name (2 to 80 characters)"
      • changedInput schema / properties / otp_code / description
        Previous value: -"Kode OTP 6 angka yang diterima pengguna di inbox email"New value: +"Exact 6-digit numeric OTP code sent to the user's email"
      • changedInput schema / properties / password / description
        Previous value: -"Password akun baru (minimal 6 karakter)"New value: +"Account password (minimum 6 characters)"
      • changedInput schema / properties / site_name / description
        Previous value: -"Nama website atau aplikasi pertama"New value: +"Optional display name for the first website or app (defaults to workspace name)"
      • changedInput schema / properties / site_url / description
        Previous value: -"URL lengkap website pertama (diawali https://)"New value: +"Optional full HTTPS origin URL of the first website (e.g., https://example.com)"
    • Changedrequest_registration_otp2 fields changed
      • changedInput schema / properties / email / description
        Previous value: -"Alamat email pengguna yang akan didaftarkan"New value: +"Valid email address to register (e.g., user@domain.com); must not already be registered"
      • changedInput schema / properties / name / description
        Previous value: -"Nama pengguna atau nama perusahaan/workspace"New value: +"Optional user or workspace display name (2 to 80 characters)"
    • Changedschedule_push_notification7 fields changed
      • changedInput schema / properties / app_id / description
        Previous value: -"App ID tujuan (misal: app_xxxx)"New value: +"Target application ID in format app_xxxx (required when creating a schedule)"
      • changedInput schema / properties / body / description
        Previous value: -"Isi pesan notifikasi"New value: +"Notification body text (required when creating a schedule; 1 to 240 characters)"
      • changedInput schema / properties / cancel_campaign_id / description
        Previous value: -"Isi jika ingin membatalkan/menghapus jadwal kampanye (cmp_sch_xxxx)"New value: +"Optional scheduled campaign ID (format cmp_sch_xxxx from get_campaign_analytics) to cancel and delete before execution"
      • changedInput schema / properties / recurrence_rule / description
        Previous value: -"Aturan perulangan: once, daily, twice_daily, weekly, monthly, every_30m, every_3h, every_6h, atau ekspresi cron kustom (misal: 0 5,12,15,18,19 * * *)"New value: +"Recurrence pattern: 'once' (default), 'daily', 'twice_daily', 'weekly', 'monthly', 'every_30m', 'every_3h', 'every_6h', or a 5-field cron expression"
      • changedInput schema / properties / scheduled_for / description
        Previous value: -"Waktu kirim format ISO-8601 (misal: 2026-10-17T06:00:00Z)"New value: +"ISO-8601 execution timestamp (e.g., '2026-10-21T08:00:00+07:00')"
      • changedInput schema / properties / title / description
        Previous value: -"Judul pesan notifikasi"New value: +"Notification headline (required when creating a schedule; 1 to 100 characters)"
      • changedInput schema / properties / url / description
        Previous value: -"URL tujuan saat notifikasi diketuk"New value: +"Optional HTTPS destination URL opened on tap"
    • Changedsend_push_notification5 fields changed
      • changedInput schema / properties / app_id / description
        Previous value: -"App ID tujuan (misal: app_xxxx)"New value: +"Target application ID in format app_xxxx (obtain from list_apps)"
      • changedInput schema / properties / body / description
        Previous value: -"Isi pesan notifikasi"New value: +"Notification message body text (1 to 240 characters)"
      • changedInput schema / properties / segment / description
        Previous value: -"Filter segmen pelanggan (default: all)"New value: +"Subscriber filter: 'all' (default, sends to every active subscriber of app_id) or a specific subscriber tag string (e.g., 'vip', 'jakarta')"
      • changedInput schema / properties / title / description
        Previous value: -"Judul pesan notifikasi"New value: +"Notification headline shown on lock screen (1 to 100 characters)"
      • changedInput schema / properties / url / description
        Previous value: -"URL tujuan saat notifikasi diketuk"New value: +"Optional HTTPS destination URL opened when the user taps the notification (defaults to the app's site_url)"
    • Changedupdate_app_branding5 fields changed
      • changedInput schema / properties / app_id / description
        Previous value: -"App ID yang ingin diubah (misal: app_xxxx)"New value: +"Target application ID in format app_xxxx (obtain from list_apps)"
      • changedInput schema / properties / icon_url / description
        Previous value: -"URL gambar logo PNG/JPG aplikasi"New value: +"Optional direct HTTPS URL to a square PNG/JPG/WebP brand icon (recommended 192x192px)"
      • changedInput schema / properties / welcome_body / description
        Previous value: -"Isi pesan notifikasi sambutan"New value: +"Body text of the automated welcome push notification (max 180 characters)"
      • changedInput schema / properties / welcome_enabled / description
        Previous value: -"Aktifkan/matikan pesan sambutan otomatis"New value: +"Set true to automatically send a welcome push notification immediately after a visitor grants permission"
      • changedInput schema / properties / welcome_title / description
        Previous value: -"Judul notifikasi sambutan saat user baru klik Izinkan"New value: +"Headline of the automated welcome push notification (max 80 characters)"
    • Changedupdate_profile2 fields changed
      • changedInput schema / properties / name / description
        Previous value: -"Nama perusahaan atau pemilik workspace baru"New value: +"New workspace or company display name (2 to 80 characters)"
      • changedInput schema / properties / new_password / description
        Previous value: -"Opsional: password baru (minimal 6 karakter)"New value: +"Optional new account login password (minimum 6 characters; omit to keep current password unchanged)"
  2. 17 tool updatesv2.1.0
    • First observedcheck_billing_and_qris_status
    • First observedconfigure_inapp_banner
    • First observedconfigure_mobile_credentials
    • First observedconfigure_rss_autopush
    • First observedcreate_app
    • First observedcreate_qris_invoice
    • First observedget_campaign_analytics
    • First observedget_integration_guide
    • First observedlist_apps
    • First observedlist_subscribers
    • First observedlogin_existing_account
    • First observedregister_new_account
    • First observedrequest_registration_otp
    • First observedschedule_push_notification
    • First observedsend_push_notification
    • First observedupdate_app_branding
    • First observedupdate_profile

TDQS

A4.5/5.0

Scored across 17 tools

Disambiguation5/5

Each tool targets a clearly distinct resource+action, and descriptions actively cross-reference the nearest confusable sibling (e.g. send vs. schedule vs. configure_inapp_banner vs. configure_rss_autopush, update_profile vs. update_app_branding). The send/schedule/banner/RSS quartet are all notification-adjacent yet cleanly separated by channel and timing. An agent can reliably pick the right tool.

Naming Consistency5/5

Consistent snake_case verb_noun pattern throughout (list_apps, create_app, send_push_notification, configure_inapp_banner, check_billing_and_qris_status). Verbs are used with stable meaning (list/get for reads, create/configure/update for writes, check for status). No style mixing.

Tool Count4/5

17 tools is slightly above the ideal 3-15 range but each earns its place given the broad domain (auth, apps, notifications, mobile/RSS/in-app channels, billing, analytics, subscribers). No obvious redundancy or filler tools. Marginally heavy but well-scoped for the feature surface.

Completeness4/5

Strong lifecycle coverage: registration/login, app creation and branding, multi-channel sending, scheduling/cancel, billing, analytics, subscriber inspection, and integration guides. Minor gaps remainβ€”no delete_app, no subscriber/tag management, and scheduled campaigns can only be canceled, not edited. These are workaround-able, so a small deduction only.

Maintenance

ActivityNo data
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • F
    license
    Not graded
    quality
    D
    maintenance
    Enables AI assistants to manage OneSignal push notifications, email, SMS, and user management through natural language. Supports multi-channel messaging, segmentation, templates, analytics, and iOS Live Activities with 50+ tools for complete OneSignal API coverage.
    1
    -
  • A
    license
    A
    quality
    C
    maintenance
    Enables AI assistants to send push notifications and interactive alerts to iPhone and Mac devices via the BotBell app. It allows AI to receive user replies and manage notification bots for tasks like alerts, reminders, and remote approvals.
    2
    10 npm
    1
    MIT
  • F
    license
    Not graded
    quality
    C
    maintenance
    Lets AI assistants manage subscribers, trigger workflows, inspect notification events, and tune preferences across any MCP-compatible client.
    -