create_campaign
ChatGPTCreate 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
ChatGPTCreate a saved condition-based user segment in a Notifly project.
create_user_journey
ChatGPTCreate 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
ChatGPTDelete a saved user segment by segment_id.
describe_campaign_payload
ChatGPTMANDATORY 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
ChatGPTMANDATORY 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
ChatGPTMANDATORY 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
ChatGPTRead 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
ChatGPTRead 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
ChatGPTCheck 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
ChatGPTGet 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_product
ChatGPTRead a Notifly product. The response includes its billing plan and projects accessible through that product.
get_project
ChatGPTRead one Notifly project. Use list_projects or get_product first when you need to discover project IDs.
get_project_channel_summary
ChatGPTGet project-level channel availability and recent message activity summary from precomputed project statistics.
get_segment
ChatGPTRead one saved user segment by segment_id.
get_sender_info
ChatGPTGet 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
ChatGPTAggregate 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
ChatGPTRead 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
ChatGPTResolve a public user identifier into a canonical Notifly user reference.
list_campaign_user_deliveries
ChatGPTList privacy-preserving delivery records for a campaign and Notifly user.
list_campaign_variants
ChatGPTList 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
ChatGPTList 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
ChatGPTList 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
ChatGPTList 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_products
ChatGPTList 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
ChatGPTList project-level configured channels for a Notifly project.
list_project_event_params
ChatGPTList event parameter key presence counts for one project event from precomputed project statistics. Returns keys only, not parameter values or cardinality.
list_project_events
ChatGPTList project event catalog entries available in a Notifly project.
list_projects
ChatGPTList Notifly projects accessible to the request credentials. The list is bounded by the products the principal can access.
list_segments
ChatGPTList saved user segments in a Notifly project.
list_user_channels
ChatGPTList privacy-preserving channel state for a Notifly user.
list_user_events
ChatGPTList privacy-preserving event summaries for a Notifly user.
list_user_journey_statistics
ChatGPTRead 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
ChatGPTList user journey sessions for a Notifly user.
list_user_journeys
ChatGPTList 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
ChatGPTList user property names collected for a Notifly project.
query_docs_filesystem_notifly_docs
ChatGPTRun 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
ChatGPTReplace 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
ChatGPTReplace the name and condition definition of a saved user segment.
replace_user_journey
ChatGPTReplace 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
ChatGPTSearch 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
Claudeget_workflow
Claudelist_notifications
Claudelist_subscribers
Claudelist_topics
Claudelist_workflows
Claudetrigger_workflow
Claude