PushNotif MCP Server
Allows sending real-time push notifications to Android devices via Firebase Cloud Messaging (FCM) and configuring native Android FCM credentials.
Enables configuration of Apple Push Notification service (APNs) credentials and sending push notifications to Apple devices.
Provides tools for configuring Firebase Cloud Messaging (FCM) service account credentials to send push notifications to Android devices.
Allows sending push notifications to iOS devices via Apple Push Notification service (APNs) and configuring APNs .p8 credentials.
Generates ready-to-paste integration code and snippets for integrating PushNotif into Laravel applications.
Generates ready-to-paste integration code and snippets for integrating PushNotif into Next.js applications.
Enables automated background monitoring of RSS/Atom feeds and sitemaps to auto-broadcast new articles as push notifications.
Generates ready-to-paste integration code and snippets for integrating PushNotif into WordPress sites.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@PushNotif MCP ServerSend a push notification to all subscribers about the new feature."
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
π PushNotif MCP Server (pushnotif-mcp-server)
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 installAdd 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-mcpOption 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)
request_registration_otpβ Send 6-digit verification OTP to user email (includes automatic duplicate email check).register_new_accountβ Verify OTP, create a new PushNotif account (+1,000 Free Quota Credits forever), register first website, and returnapi_key(pn_live_...).login_existing_accountβ Authenticate an existing account with email & password to retrieve itsapi_key.
Workspace, Web Push, Mobile Push & In-App Automation
list_appsβ List all registered websites/apps, active subscriber counts, and credit balance.create_appβ Register a new website or mobile app and generate VAPID keys.get_integration_guideβ Generate copy-paste SDK snippets for HTML/JS, Laravel, Next.js/React, WordPress, Android (Kotlin), and iOS (Swift).send_push_notificationβ Broadcast instant Web Push (VAPID), Android (FCM), and iOS (APNs) notifications.schedule_push_notificationβ Schedule one-time or recurring (daily/weekly) push campaigns.configure_inapp_bannerβ Configure In-App Popup Modals, Top Sticky Bars, Bottom Slide Cards, or Live Activity Toasts.configure_rss_autopushβ Configure automated RSS / Sitemap / Atom feed monitoring.configure_mobile_credentialsβ Upload Firebase FCM Service Account JSON or Apple APNs.p8credentials.list_subscribersβ View active subscriber device distribution and segments.get_campaign_analyticsβ Inspect campaign delivery, click-through rate (CTR), and conversion metrics.create_qris_invoiceβ Generate a live QRIS payment invoice (starting from Rp 1,000 / 5,000 Credits).check_billing_and_qris_statusβ Check real-time QRIS payment status (PENDING/PAID) and credit balance.update_app_brandingβ Update notification icon URL and automatic Welcome Push message.update_profileβ Update workspace display name or account password.
π License
MIT License β Copyright (c) 2026 PushNotif.biz.id (AarsyDesign)
Available Tools
17 toolscheck_billing_and_qris_statusARead-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: [...] }.
| Name | Required | Description | Default |
|---|---|---|---|
| order_id | No | Optional specific QRIS order ID (format ord_xxxx from create_qris_invoice) to inspect; omit to list recent orders |
TDQS
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.
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.
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.
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.
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.
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_bannerAIdempotent
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 }.
| Name | Required | Description | Default |
|---|---|---|---|
| app_id | Yes | Target application ID in format app_xxxx (obtain from list_apps) | |
| inapp_body | Yes | Banner supporting message text (1 to 240 characters) | |
| inapp_freq | No | Per-visitor frequency cap: 'once_per_session' (default), 'once_per_day', 'cooldown_3h', 'cooldown_12h', 'once_per_week', or 'always' | |
| inapp_style | No | Visual layout style: 'modal' (center dialog), 'top_bar' (sticky top ribbon), or 'bottom_slide' (corner toast card) | |
| inapp_title | Yes | Banner headline text (1 to 100 characters) | |
| inapp_accent | No | Optional hex color code for the CTA button and accent border (default: '#0058BE') | |
| inapp_cta_url | No | Optional HTTPS URL opened when the CTA button is clicked | |
| inapp_enabled | No | Set true to activate the banner on the website, or false to pause it (default: true) | |
| inapp_trigger | No | Display trigger condition: 'immediate' (default), 'delay_5s', 'delay_10s', 'scroll_50', 'scroll_80', or custom DOM event 'event:<name>' | |
| inapp_cta_text | No | Optional call-to-action button label (e.g., 'Klaim Voucher β') |
TDQS
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.
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.
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.
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.
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.
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_credentialsAIdempotent
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 }.
| Name | Required | Description | Default |
|---|---|---|---|
| app_id | Yes | Target application ID in format app_xxxx (obtain from list_apps) | |
| apns_key_id | No | 10-character Apple Developer APNs Key ID (e.g., 'ABC123DEFG') | |
| apns_p8_key | No | Full PEM text content of Apple's AuthKey_XXXX.p8 private key file | |
| apns_team_id | No | 10-character Apple Developer Team ID | |
| apns_bundle_id | No | iOS application Bundle Identifier (e.g., 'id.company.app') | |
| fcm_service_account_json | No | Raw JSON string of the Google Firebase Service Account key file for Android FCM HTTP v1 |
TDQS
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.
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.
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.
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.
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.
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_autopushAIdempotent
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 }.
| Name | Required | Description | Default |
|---|---|---|---|
| app_id | Yes | Target application ID in format app_xxxx (obtain from list_apps) | |
| rss_prefix | No | Optional prefix prepended to each notification title (e.g., 'Artikel Baru: ') | |
| rss_enabled | No | Set true to enable background RSS/Sitemap polling, or false to disable it | |
| dispatch_now | No | Set true to immediately fetch the latest feed entry and broadcast it to active subscribers right now | |
| rss_feed_url | No | Public HTTPS URL of the RSS 2.0, Atom, or XML Sitemap feed (e.g., 'https://example.com/feed') | |
| rss_interval | No | Polling frequency: '5m', '15m', '30m' (default), '1h', '3h', or 'daily_digest' |
TDQS
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.
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.
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.
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.
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.
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 }.
| Name | Required | Description | Default |
|---|---|---|---|
| site_url | Yes | Canonical HTTPS URL of the website (must start with https:// or http://localhost) | |
| site_name | Yes | Display name of the website or mobile application (2 to 80 characters) |
TDQS
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.
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.
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.
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.
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.
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 } }.
| Name | Required | Description | Default |
|---|---|---|---|
| amount_rp | No | Custom top-up amount in Indonesian Rupiah (minimum 1000, maximum 10000000; 1 IDR = 5 credits) | |
| package_id | No | 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 |
TDQS
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.
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.
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.
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.
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.
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_analyticsARead-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: [...] }.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum number of recent campaigns to return (1 to 50, default: 10) | |
| app_id | No | Optional application ID filter (format app_xxxx); omit to aggregate across all apps in the workspace |
TDQS
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.
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.
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.
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.
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.
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_guideARead-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 }.
| Name | Required | Description | Default |
|---|---|---|---|
| app_id | Yes | Target application ID in format app_xxxx (obtain from list_apps) | |
| framework | No | Target stack: 'html' (default 1-line script), 'nextjs', 'laravel', 'wordpress', or 'flutter' |
TDQS
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.
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.
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.
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.
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.
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_appsARead-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 }] }.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
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.
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.
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.
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.
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.
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_subscribersARead-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 }] }.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum number of recent subscriber records to return (1 to 100, default: 15) | |
| app_id | No | Optional application ID filter (format app_xxxx); omit to list subscribers across all workspace apps |
TDQS
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.
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.
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.
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.
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.
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_accountARead-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 }] }.
| Name | Required | Description | Default |
|---|---|---|---|
| Yes | Registered PushNotif account email address | ||
| password | Yes | Account password |
TDQS
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.
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.
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.
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.
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.
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 } }.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | User or company workspace name (2 to 80 characters) | |
| Yes | Email address that received the OTP from request_registration_otp | ||
| otp_code | Yes | Exact 6-digit numeric OTP code sent to the user's email | |
| password | Yes | Account password (minimum 6 characters) | |
| site_url | No | Optional full HTTPS origin URL of the first website (e.g., https://example.com) | |
| site_name | No | Optional display name for the first website or app (defaults to workspace name) |
TDQS
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.
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.
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.
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.
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.
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_otpAIdempotent
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 }.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | Optional user or workspace display name (2 to 80 characters) | |
| Yes | Valid email address to register (e.g., user@domain.com); must not already be registered |
TDQS
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.
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.
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.
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.
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.
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 } }.
| Name | Required | Description | Default |
|---|---|---|---|
| url | No | Optional HTTPS destination URL opened on tap | |
| body | No | Notification body text (required when creating a schedule; 1 to 240 characters) | |
| title | No | Notification headline (required when creating a schedule; 1 to 100 characters) | |
| app_id | No | Target application ID in format app_xxxx (required when creating a schedule) | |
| scheduled_for | No | ISO-8601 execution timestamp (e.g., '2026-10-21T08:00:00+07:00') | |
| recurrence_rule | No | Recurrence pattern: 'once' (default), 'daily', 'twice_daily', 'weekly', 'monthly', 'every_30m', 'every_3h', 'every_6h', or a 5-field cron expression | |
| cancel_campaign_id | No | Optional scheduled campaign ID (format cmp_sch_xxxx from get_campaign_analytics) to cancel and delete before execution |
TDQS
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.
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.
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.
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.
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.
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 }.
| Name | Required | Description | Default |
|---|---|---|---|
| url | No | Optional HTTPS destination URL opened when the user taps the notification (defaults to the app's site_url) | |
| body | Yes | Notification message body text (1 to 240 characters) | |
| title | Yes | Notification headline shown on lock screen (1 to 100 characters) | |
| app_id | Yes | Target application ID in format app_xxxx (obtain from list_apps) | |
| segment | No | Subscriber filter: 'all' (default, sends to every active subscriber of app_id) or a specific subscriber tag string (e.g., 'vip', 'jakarta') |
TDQS
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.
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.
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.
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.
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.
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_brandingAIdempotent
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 }.
| Name | Required | Description | Default |
|---|---|---|---|
| app_id | Yes | Target application ID in format app_xxxx (obtain from list_apps) | |
| icon_url | No | Optional direct HTTPS URL to a square PNG/JPG/WebP brand icon (recommended 192x192px) | |
| welcome_body | No | Body text of the automated welcome push notification (max 180 characters) | |
| welcome_title | No | Headline of the automated welcome push notification (max 80 characters) | |
| welcome_enabled | No | Set true to automatically send a welcome push notification immediately after a visitor grants permission |
TDQS
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.
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.
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.
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.
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.
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_profileAIdempotent
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 }.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | New workspace or company display name (2 to 80 characters) | |
| new_password | No | Optional new account login password (minimum 6 characters; omit to keep current password unchanged) |
TDQS
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.
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.
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.
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.
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.
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.
16 tool updates
v2.1.2- Changed
check_billing_and_qris_status1 field changed- changed
Input schema / properties / order_id / descriptionPrevious 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"
- Changed
configure_inapp_banner10 fields changed- changed
Input schema / properties / app_id / descriptionPrevious value: -"App ID yang ingin diatur"New value: +"Target application ID in format app_xxxx (obtain from list_apps)" - changed
Input schema / properties / inapp_accent / descriptionPrevious value: -"Kode warna HEX tombol (misal: #0058BE, #047857, #E11D48)"New value: +"Optional hex color code for the CTA button and accent border (default: '#0058BE')" - changed
Input schema / properties / inapp_body / descriptionPrevious value: -"Isi pesan singkat"New value: +"Banner supporting message text (1 to 240 characters)" - changed
Input schema / properties / inapp_cta_text / descriptionPrevious value: -"Teks tombol aksi (CTA)"New value: +"Optional call-to-action button label (e.g., 'Klaim Voucher β')" - changed
Input schema / properties / inapp_cta_url / descriptionPrevious value: -"URL tujuan saat tombol diklik"New value: +"Optional HTTPS URL opened when the CTA button is clicked" - changed
Input schema / properties / inapp_enabled / descriptionPrevious 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)" - changed
Input schema / properties / inapp_freq / descriptionPrevious 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'" - changed
Input schema / properties / inapp_style / descriptionPrevious 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)" - changed
Input schema / properties / inapp_title / descriptionPrevious value: -"Judul pengumuman/promo"New value: +"Banner headline text (1 to 100 characters)" - changed
Input schema / properties / inapp_trigger / descriptionPrevious 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>'"
- Changed
configure_mobile_credentials6 fields changed- changed
Input schema / properties / apns_bundle_id / descriptionPrevious value: -"iOS App Bundle ID (misal: id.perusahaan.app)"New value: +"iOS application Bundle Identifier (e.g., 'id.company.app')" - changed
Input schema / properties / apns_key_id / descriptionPrevious value: -"Apple APNs Key ID (10 karakter)"New value: +"10-character Apple Developer APNs Key ID (e.g., 'ABC123DEFG')" - changed
Input schema / properties / apns_p8_key / descriptionPrevious 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" - changed
Input schema / properties / apns_team_id / descriptionPrevious value: -"Apple Developer Team ID (10 karakter)"New value: +"10-character Apple Developer Team ID" - changed
Input schema / properties / app_id / descriptionPrevious value: -"App ID yang ingin dikonfigurasi"New value: +"Target application ID in format app_xxxx (obtain from list_apps)" - changed
Input schema / properties / fcm_service_account_json / descriptionPrevious 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"
- Changed
configure_rss_autopush6 fields changed- changed
Input schema / properties / app_id / descriptionPrevious value: -"App ID tujuan"New value: +"Target application ID in format app_xxxx (obtain from list_apps)" - changed
Input schema / properties / dispatch_now / descriptionPrevious 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" - changed
Input schema / properties / rss_enabled / descriptionPrevious value: -"True untuk mengaktifkan pemantau RSS otomatis"New value: +"Set true to enable background RSS/Sitemap polling, or false to disable it" - changed
Input schema / properties / rss_feed_url / descriptionPrevious 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')" - changed
Input schema / properties / rss_interval / descriptionPrevious value: -"Interval cek: 5m, 15m, 30m, 1h, 3h, atau daily_digest"New value: +"Polling frequency: '5m', '15m', '30m' (default), '1h', '3h', or 'daily_digest'" - changed
Input schema / properties / rss_prefix / descriptionPrevious value: -"Awalan judul notifikasi (misal: Artikel Baru:)"New value: +"Optional prefix prepended to each notification title (e.g., 'Artikel Baru: ')"
- Changed
create_app2 fields changed- changed
Input schema / properties / site_name / descriptionPrevious value: -"Nama website atau aplikasi"New value: +"Display name of the website or mobile application (2 to 80 characters)" - changed
Input schema / properties / site_url / descriptionPrevious value: -"URL domain lengkap dengan https://"New value: +"Canonical HTTPS URL of the website (must start with https:// or http://localhost)"
- Changed
create_qris_invoice2 fields changed- changed
Input schema / properties / amount_rp / descriptionPrevious value: -"Nominal Rupiah top-up (default: 20000)"New value: +"Custom top-up amount in Indonesian Rupiah (minimum 1000, maximum 10000000; 1 IDR = 5 credits)" - changed
Input schema / properties / package_id / descriptionPrevious 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"
- Changed
get_campaign_analytics2 fields changed- changed
Input schema / properties / app_id / descriptionPrevious 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" - changed
Input schema / properties / limit / descriptionPrevious value: -"Jumlah riwayat kampanye terakhir yang ditampilkan (default: 10)"New value: +"Maximum number of recent campaigns to return (1 to 50, default: 10)"
- Changed
get_integration_guide2 fields changed- changed
Input schema / properties / app_id / descriptionPrevious value: -"App ID yang ingin diambil panduannya"New value: +"Target application ID in format app_xxxx (obtain from list_apps)" - changed
Input schema / properties / framework / descriptionPrevious value: -"Nama framework (misal: Next.js / React, Flutter, Laravel)"New value: +"Target stack: 'html' (default 1-line script), 'nextjs', 'laravel', 'wordpress', or 'flutter'"
- Changed
list_subscribers2 fields changed- changed
Input schema / properties / app_id / descriptionPrevious value: -"Opsional: filter untuk App ID tertentu"New value: +"Optional application ID filter (format app_xxxx); omit to list subscribers across all workspace apps" - changed
Input schema / properties / limit / descriptionPrevious value: -"Jumlah baris pelanggan terbaru yang ditampilkan (default: 15)"New value: +"Maximum number of recent subscriber records to return (1 to 100, default: 15)"
- Changed
login_existing_account2 fields changed- changed
Input schema / properties / email / descriptionPrevious value: -"Alamat email akun PushNotif"New value: +"Registered PushNotif account email address" - changed
Input schema / properties / password / descriptionPrevious value: -"Password akun PushNotif"New value: +"Account password"
- Changed
register_new_account6 fields changed- changed
Input schema / properties / email / descriptionPrevious value: -"Alamat email pengguna (sama dengan saat request_registration_otp)"New value: +"Email address that received the OTP from request_registration_otp" - changed
Input schema / properties / name / descriptionPrevious value: -"Nama pengguna atau workspace"New value: +"User or company workspace name (2 to 80 characters)" - changed
Input schema / properties / otp_code / descriptionPrevious 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" - changed
Input schema / properties / password / descriptionPrevious value: -"Password akun baru (minimal 6 karakter)"New value: +"Account password (minimum 6 characters)" - changed
Input schema / properties / site_name / descriptionPrevious value: -"Nama website atau aplikasi pertama"New value: +"Optional display name for the first website or app (defaults to workspace name)" - changed
Input schema / properties / site_url / descriptionPrevious value: -"URL lengkap website pertama (diawali https://)"New value: +"Optional full HTTPS origin URL of the first website (e.g., https://example.com)"
- Changed
request_registration_otp2 fields changed- changed
Input schema / properties / email / descriptionPrevious value: -"Alamat email pengguna yang akan didaftarkan"New value: +"Valid email address to register (e.g., user@domain.com); must not already be registered" - changed
Input schema / properties / name / descriptionPrevious value: -"Nama pengguna atau nama perusahaan/workspace"New value: +"Optional user or workspace display name (2 to 80 characters)"
- Changed
schedule_push_notification7 fields changed- changed
Input schema / properties / app_id / descriptionPrevious value: -"App ID tujuan (misal: app_xxxx)"New value: +"Target application ID in format app_xxxx (required when creating a schedule)" - changed
Input schema / properties / body / descriptionPrevious value: -"Isi pesan notifikasi"New value: +"Notification body text (required when creating a schedule; 1 to 240 characters)" - changed
Input schema / properties / cancel_campaign_id / descriptionPrevious 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" - changed
Input schema / properties / recurrence_rule / descriptionPrevious 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" - changed
Input schema / properties / scheduled_for / descriptionPrevious 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')" - changed
Input schema / properties / title / descriptionPrevious value: -"Judul pesan notifikasi"New value: +"Notification headline (required when creating a schedule; 1 to 100 characters)" - changed
Input schema / properties / url / descriptionPrevious value: -"URL tujuan saat notifikasi diketuk"New value: +"Optional HTTPS destination URL opened on tap"
- Changed
send_push_notification5 fields changed- changed
Input schema / properties / app_id / descriptionPrevious value: -"App ID tujuan (misal: app_xxxx)"New value: +"Target application ID in format app_xxxx (obtain from list_apps)" - changed
Input schema / properties / body / descriptionPrevious value: -"Isi pesan notifikasi"New value: +"Notification message body text (1 to 240 characters)" - changed
Input schema / properties / segment / descriptionPrevious 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')" - changed
Input schema / properties / title / descriptionPrevious value: -"Judul pesan notifikasi"New value: +"Notification headline shown on lock screen (1 to 100 characters)" - changed
Input schema / properties / url / descriptionPrevious 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)"
- Changed
update_app_branding5 fields changed- changed
Input schema / properties / app_id / descriptionPrevious value: -"App ID yang ingin diubah (misal: app_xxxx)"New value: +"Target application ID in format app_xxxx (obtain from list_apps)" - changed
Input schema / properties / icon_url / descriptionPrevious value: -"URL gambar logo PNG/JPG aplikasi"New value: +"Optional direct HTTPS URL to a square PNG/JPG/WebP brand icon (recommended 192x192px)" - changed
Input schema / properties / welcome_body / descriptionPrevious value: -"Isi pesan notifikasi sambutan"New value: +"Body text of the automated welcome push notification (max 180 characters)" - changed
Input schema / properties / welcome_enabled / descriptionPrevious value: -"Aktifkan/matikan pesan sambutan otomatis"New value: +"Set true to automatically send a welcome push notification immediately after a visitor grants permission" - changed
Input schema / properties / welcome_title / descriptionPrevious value: -"Judul notifikasi sambutan saat user baru klik Izinkan"New value: +"Headline of the automated welcome push notification (max 80 characters)"
- Changed
update_profile2 fields changed- changed
Input schema / properties / name / descriptionPrevious value: -"Nama perusahaan atau pemilik workspace baru"New value: +"New workspace or company display name (2 to 80 characters)" - changed
Input schema / properties / new_password / descriptionPrevious value: -"Opsional: password baru (minimal 6 karakter)"New value: +"Optional new account login password (minimum 6 characters; omit to keep current password unchanged)"
17 tool updates
v2.1.0- First observed
check_billing_and_qris_status - First observed
configure_inapp_banner - First observed
configure_mobile_credentials - First observed
configure_rss_autopush - First observed
create_app - First observed
create_qris_invoice - First observed
get_campaign_analytics - First observed
get_integration_guide - First observed
list_apps - First observed
list_subscribers - First observed
login_existing_account - First observed
register_new_account - First observed
request_registration_otp - First observed
schedule_push_notification - First observed
send_push_notification - First observed
update_app_branding - First observed
update_profile
TDQS
Scored across 17 tools
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.
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.
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.
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
Related MCP Connectors
Create, test, publish, and manage Dreamlit notification workflows from AI clients.
Webhooks for AI agents: send events, manage endpoints, inspect and retry deliveries.
Build and send email, SMS, and push straight from your AI agent.
Email, WhatsApp and Telegram for AI agents: send, campaigns, automations, contacts, agent inboxes.
Related MCP Servers
- FlicenseNot gradedqualityDmaintenanceEnables 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-
- AlicenseAqualityCmaintenanceEnables 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.210 npm1MIT
- FlicenseNot gradedqualityCmaintenanceLets AI assistants manage subscribers, trigger workflows, inspect notification events, and tune preferences across any MCP-compatible client.-
- AlicenseAqualityBmaintenanceLets AI agents send notifications, manage templates and read delivery status.115 npmMIT