MCP App Store
by KeenEthics

Overview

Notifly is notification infrastructure: workflows, subscribers, topics, and delivery across the email, SMS, push, chat and in-app channels you configure. The Notifly connector gives Claude seven tools - six read-only and one write. Claude can list your workflows and open one to see its steps and channels, search subscribers and fetch one by id, list topics, and read the activity feed to check whether and how a notification was delivered. With your permission, it can also trigger a workflow so a real notification goes out. Sending is deliberately hard to do by accident. Connecting uses OAuth 2.1 with PKCE and a consent screen, and the scopes Claude receives come from your own account permissions. Three gates then stand in front of a real send: an organization-level dangerous-operations setting that is off by default and can only be turned on by a person signed in to Notifly; a two-step confirmation, where the first call returns a short-lived token bound to the exact organization, user, client, tool and arguments, so Claude must show you what will be sent before it can commit; and a live consent re-check at the moment the tool runs, so revoking a connected assistant stops the very next call rather than the next login. A caller-supplied transaction id makes retries idempotent. The six read tools work as soon as you connect. Notifications go out through the channel providers your organization has already configured, to your own subscribers, from your own templates - nothing is sent to anyone you have not already onboarded. Review or revoke a connected assistant at any time from Connected AI apps in your Notifly settings. The connector processes no payments, generates no images, video or audio, and serves no ads. Documentation for connecting an assistant is at notifly.io/docs/connecting-ai-assistants.

Tools

create_campaign

ChatGPT
Create a draft campaign in a Notifly project. ALWAYS call describe_campaign_payload first with the chosen channel/type/timing_type/segment_mode and build the payload from its full_example_payload; many required rules (especially per-channel message fields) live only in server-side validation and are not visible in this input schema. This only creates draft campaigns and uses the same web-console builder-compatible payload contract as POST /v1/projects/{projectId}/campaigns. For a new CSV draft, keep both segment.details.uploaded_filename and original_filename empty until the user uploads a file in the Notifly console. Non-empty CSV filenames and file_based condition filenames must reference existing uploaded files in this project; missing files reject creation. timing is strict by timing.type and timing.details.frequency: scheduled frequency=once requires timing.details.on + timezone_options and must not include timing.details.period; scheduled frequency=everyday/weekly and event-based timing use timing.details.period with full date-time strings such as 2026-03-06T11:42:00. Time-only values such as 00:00 or 23:59 are rejected. event-based timing requires timing.details.period and trigger variants match the web-console flow: use_advanced_options=false requires event; use_advanced_options=true requires event_name conditions. segment.mode=condition uses web-console condition units such as unit=user/device/event/campaign_exposure/file_based/session; loose aliases like type=user_property or operator=days_before are rejected. message payloads are validated by channel: push/web-push require title and body, push importance is lowercase low/normal/high, and HTML email requires subject/sender_email/sender_name/template_name while content is omitted and loaded by the API. Plain-text email requires direct content. For SMS/LMS/MMS, use channel: "text-message"; do not use channel: "sms" or channel: "lms". Put the subtype in message.type (sms, lms, or mms), set message.platform: "notifly", and include message.body plus message.sender_phone_number. LMS/MMS require message.title; MMS requires 1 to 3 message.attachments. Public fields are snake_case and converted once into web-console view_state so the draft can be opened in the edit form.

create_segment

ChatGPT
Create a saved condition-based user segment in a Notifly project.

create_user_journey

ChatGPT
Create an inactive user journey draft in a Notifly project. MANDATORY: first call describe_user_journey_payload with explicit timing_type/segment_mode, then describe_user_journey_node_payload for every selected node type/channel/delay_type. Follow the returned rules and resolve unsupported/missing fixtures before creation. This preflight is guidance, not a stateful server-enforced gate. This stores builder state and does not activate or schedule the journey. Use request-local refs and *_node_ref links; persisted node IDs are generated. Valid node.type values: message, delay, event_trigger, user_update, event_branching, segment_branching, variant_branching. For segment_branching, segments[].segment is the direct { groups, operator, additional_conditions?, condition_targeting_mode? } object, never { mode, details }. Entry timing/segment matrix: api→none, scheduled→condition|csv, event-based→condition. Message nodes must provide exactly one of message or localized_messages. localized_messages is accepted only for projects with localized message writes enabled; otherwise use message.

delete_segment

ChatGPT
Delete a saved user segment by segment_id.

describe_campaign_payload

ChatGPT
MANDATORY before create_campaign/replace_campaign: returns scenario-specific payload guidance, public snake_case field summaries, conditional rules, and a copy-and-fill full_example_payload (null for unsupported combinations, missing message examples, or unselected Kakao platform). Pass channel, type, timing_type, and segment_mode; for Kakao also pass platform selected with get_sender_info. For HTML email, select template_name with list_email_templates and omit content; the API loads the template into web-console view_state before saving. Defaults: standard, scheduled, and condition (none for api timing); explicit targeting is never changed. Omitting channel returns message summaries by channel, not a full payload. Summaries are not exhaustive validation; examples require real project sender/template/upload/event values and project eligibility checks before creation.

describe_user_journey_node_payload

ChatGPT
MANDATORY before create_user_journey or replace_user_journey for each selected node: returns the selected public schema, Console/runner conditional rules, connections, example and prerequisite lookups. Set operation=create (default) for ref-only authoring, or operation=replace to inspect existing-node id and new-node ref forms plus _node_id/_node_ref connection alternatives. message requires channel; HTML email needs only a saved template_name from list_email_templates and no content in the request. Kakao also requires platform selected with get_sender_info and template values from list_kakao_templates. delay requires delay_type. No project IO. Explicit supported/unsupported/selection_required/fixture_required results; null example is not permission to invent one. Popup creation currently has a pending adapter dependency.

describe_user_journey_payload

ChatGPT
MANDATORY before create_user_journey or replace_user_journey: read-only, resource-free overall authoring guide with complete top-level/entry schema, graph rules and node catalog. Set operation=create (default) for request-local refs, or operation=replace for an inactive journey replacement where existing nodes keep id and new nodes use ref. Select timing_type and segment_mode explicitly; omitted values are not defaulted. Then call describe_user_journey_node_payload for every chosen node type/channel/delay type. For HTML email nodes, select template_name with list_email_templates and omit content; the API loads it into web-console view_state. This is guidance, not a stateful server-enforced gate or validation of project resources.

get_campaign

ChatGPT
Read one campaign's CONFIGURATION by campaign_id (a 6-character ID, not a name). Editable configuration fields use the snake_case create/replace contract. Returns settings only, omitting HTML email template content; it does NOT include statistics/performance numbers. For results/performance, call get_campaign_statistics separately. Use this directly when the campaign_id is known instead of calling list_campaigns first.

get_campaign_statistics

ChatGPT
Read asynchronously pre-aggregated campaign statistics. Input boundaries are UTC and statistics use UTC hourly buckets: use YYYY-MM-DD with [start, end); equal bounds select no data. Returned stats daily date labels and lastCollectedAt, when present, are KST. If lastCollectedAt is omitted, no freshness value is available. No unavailable reason is returned, so zero or empty results cannot distinguish no activity from aggregation lag.

get_campaign_user_eligibility

ChatGPT
Check whether a specific user is/was eligible for a specific campaign, with privacy-preserving evidence of why they were or were not targeted. Use this FIRST for any single-user-single-campaign question like "why was this user (not) sent this campaign?" or "is this user in the target?".

get_email_template

ChatGPT
Get one saved HTML email template with its complete content for explicit inspection. Campaign and journey creation need only the template_name from list_email_templates; the API loads the content before saving.

get_popup_template

ChatGPT
Get one latest-editor popup template with its campaign authoring snapshot for in-app-message or in-web-message. Check the returned channel matches the campaign channel, then copy campaign_message into standard message or experiment messages[].message. App/web modal_properties differ: copy them unchanged, including nested key casing; never cross-use channels or recursively camelize them. template_id alone cannot create a popup campaign. Returns the rendered content URL and derived modal properties, but not raw editor state or inline HTML.

get_product

ChatGPT
Read a Notifly product. The response includes its billing plan and projects accessible through that product.

get_project

ChatGPT
Read one Notifly project. Use list_projects or get_product first when you need to discover project IDs.

get_project_channel_summary

ChatGPT
Get project-level channel availability and recent message activity summary from precomputed project statistics.

get_segment

ChatGPT
Read one saved user segment by segment_id.

get_sender_info

ChatGPT
Get all registered sender profiles for project_id and channel before creating campaigns or user journeys. Returns public sender values, verification/platform support and exact insertion paths; never provider credentials or templates. text-message covers SMS/LMS/MMS and Kakao failover.

get_statistics_summary

ChatGPT
Aggregate asynchronously pre-aggregated campaign and user-journey statistics over KST calendar dates. Use YYYY-MM-DD with inclusive [start, end]; equal bounds select one day. KST today is not allowed. No freshness timestamp or unavailable reason is returned. Tags limit results to matching campaigns.

get_user_journey

ChatGPT
Read one user journey (multi-step scenario) by user_journey_id. Editable configuration fields use the snake_case create/replace contract; stored node IDs remain unchanged. HTML email template content is omitted. Use directly when the ID is known. Do not confuse journeys with campaigns: if the user is asking about a campaign, use the campaign tools instead.

identify_user

ChatGPT
Resolve a public user identifier into a canonical Notifly user reference.

list_campaign_user_deliveries

ChatGPT
List privacy-preserving delivery records for a campaign and Notifly user.

list_campaign_variants

ChatGPT
List the A/B-test variants (branches) of a campaign, including each variant's content and split ratio. Call this WHENEVER a campaign is an A/B test and the user asks about variant content, the split, or a per-variant comparison. Pair with get_campaign_statistics for per-variant performance.

list_campaigns

ChatGPT
List campaigns in a Notifly project to DISCOVER campaigns or resolve a campaign name to its ID. A campaign is a single-shot or triggered message, distinct from a user journey (a multi-step scenario). Use this ONLY when you do not already know the campaign_id (e.g. the user gave a name, or wants to browse). If you already have the campaign_id, call get_campaign directly — do not list first. Do not call this when the question does not actually require looking at campaign data.

list_email_templates

ChatGPT
List saved HTML email template names and last modification times for one Notifly project, newest first. Returns no HTML content. Follow next_cursor for more results; use get_email_template to read one template.

list_kakao_templates

ChatGPT
List Kakao Alimtalk or Brand Message templates for one project-owned sender. First choose platform and sender_channel_id with get_sender_info. Returns references, creation-compatible type, status and parameter names. Direct Brand Message also returns inline_template: copy it unchanged to message.template (journey: nodes[].message.template) and supply template_parameters from parameter_names. No sender keys or raw provider payloads. Follow next_cursor even on an empty page. Popup templates are separate.

list_popup_templates

ChatGPT
List saved latest-editor popup template metadata for one Notifly project and popup channel. Returns metadata only; it does not expose editor state, rendered HTML, message content, content URLs, or legacy S3-only templates.

list_products

ChatGPT
List Notifly products accessible to the request credentials. Each entry includes the projects accessible through that product. Use this when you need to discover product or project IDs before calling other tools.

list_project_channels

ChatGPT
List project-level configured channels for a Notifly project.

list_project_event_params

ChatGPT
List event parameter key presence counts for one project event from precomputed project statistics. Returns keys only, not parameter values or cardinality.

list_project_events

ChatGPT
List project event catalog entries available in a Notifly project.

list_projects

ChatGPT
List Notifly projects accessible to the request credentials. The list is bounded by the products the principal can access.

list_segments

ChatGPT
List saved user segments in a Notifly project.

list_user_channels

ChatGPT
List privacy-preserving channel state for a Notifly user.

list_user_events

ChatGPT
List privacy-preserving event summaries for a Notifly user.

list_user_journey_statistics

ChatGPT
Read one user journey's asynchronously pre-aggregated UTC hourly buckets. Use YYYY-MM-DD_HH with [from, to); equal bounds select no buckets. In returned rows, collected_from and collected_to are UTC hour keys, and updated_at is a UTC ISO timestamp; use them as freshness references. Empty statistics has no row-level freshness value. No unavailable reason is returned, so zero or empty results cannot distinguish no activity from aggregation lag.

list_user_journey_user_sessions

ChatGPT
List user journey sessions for a Notifly user.

list_user_journeys

ChatGPT
List user journeys (multi-step automated scenarios) in a project to DISCOVER journeys or resolve a journey name to its ID. A user journey is distinct from a campaign (a single-shot/triggered message) — only use the journey tools when the subject is a user journey / 시나리오 / 저니. Use ONLY when you do not already know the user_journey_id; if you have it, call get_user_journey directly.

list_user_properties

ChatGPT
List user property names collected for a Notifly project.

query_docs_filesystem_notifly_docs

ChatGPT
Run a read-only shell-like query against the Notifly Docs virtual filesystem rooted at /. Use this when you need exact documentation content or a full page after search_notifly_docs. Supported commands include rg, grep, find, tree, ls, cat, head, tail, stat, wc, sort, uniq, cut, sed, awk, and jq. The filesystem is stateless and command output may be truncated by the upstream docs MCP server.

replace_campaign

ChatGPT
Replace an existing draft campaign in a Notifly project using PUT-style full replacement semantics. ALWAYS call get_campaign first, copy only fields accepted by this tool, keep the returned snake_case names for timing, segment, and message, and preserve fields that are not changing. For CSV targeting, uploaded_filename is the transformed S3 object filename and original_filename is the user-uploaded filename; preserve or replace both together and never guess or change only one. MCP cannot upload a new CSV, so use the Notifly console when the target file must change. The campaign_id path/tool field is the resource identity; do not include id, status, created_at, or updated_at in the payload. Only draft campaigns can be replaced; non-draft campaigns return CONFLICT.

replace_segment

ChatGPT
Replace the name and condition definition of a saved user segment.

replace_user_journey

ChatGPT
Replace an inactive user journey draft as a full graph. MANDATORY: first call describe_user_journey_payload(operation="replace") and describe_user_journey_node_payload(operation="replace") for every selected node type/channel/delay_type, then get_user_journey. Copy editable fields from get_user_journey using its snake_case create/replace names; omit response metadata. Existing nodes must use their persisted id; newly added nodes must use a request-local ref. Each graph connection must use exactly one of the matching _node_id or _node_ref fields. Refs are resolved during the request and are not persisted as node IDs. This operation is non-activating and preserves the existing REST replacement semantics.

search_notifly_docs

ChatGPT
Search Notifly Docs for product documentation, guides, API references, and code examples. Use this first when you need to find relevant Notifly documentation pages. If the user needs a full page or exact source text, use query_docs_filesystem_notifly_docs after search.

get_subscriber

Claude

get_workflow

Claude

list_notifications

Claude

list_subscribers

Claude

list_topics

Claude

list_workflows

Claude

trigger_workflow

Claude

Capabilities

Writes

Example Prompts

Click any prompt to copy it.

Similar Apps