Skip to main content
Glama

moengage-mcp

A Model Context Protocol (MCP) server for the MoEngage marketing platform. Exposes campaign and email-template tools over stdio, built on FastMCP.

Unlike MoEngage's official MCP (analytics-oriented, interactive OAuth), this server uses the documented Campaign/Content API with plain API-key auth — it runs headless, and it reads campaign targeting (the full segmentation_details filter tree via search_campaigns), which the official server does not expose.

Tools

Campaigns (9)

Tool

Mutates

Purpose

search_campaigns

no

Search/filter campaigns; returns config including the full targeting filter tree (segmentation_details). Email html_content is replaced with a byte count unless include_content=true

get_campaign_meta

no

Thin identity view: status, channel, delivery type, team, tags, dates (no targeting)

get_child_executions

no

Individual runs of a recurring (periodic) campaign

get_personalized_preview

no

Render campaign content with placeholders resolved for sample attributes

get_campaign_stats

no

⚠ Disabled upstream — hidden unless MOENGAGE_ENABLE_STATS=true; re-enable when MoEngage turns the endpoint back on

create_campaign

yes

Create a campaign; auto-supplies required delivery_controls/advanced for triggered types, strips the empty-intelligent_delay_optimization validator trap, create_paused=true pauses right after creation (API campaigns land Scheduled, not draft)

update_campaign

yes

Update campaign config

change_campaign_status

yes

Activate / pause / stop a campaign

test_campaign

yes

Send a real test push/email to named recipients

Custom segments (3)

Tool

Mutates

Purpose

create_custom_segment

yes

Create a filter segment — event shortcut ("executed X ≥N times in last D days") or full filter tree. Segment user counts are dashboard-only (no API exposes them)

get_custom_segment

no

Get one segment's definition by id, or list all custom segments

archive_custom_segment

yes

Archive (deferred delete, ~30d purge) or restore a segment

Email templates (9)

Tool

Mutates

Purpose

search_templates

no

Search templates with filters and pagination

analyze_template

no

Parse template HTML into structured content nodes

compare_templates

no

Structured diff of two templates

build_email_template

no

Build + validate a template, return a structured preview (no publish); autofix=true repairs mechanical layout issues (isolation spacers, missing disclaimer/footer)

get_server_info

no

Data center + dashboard base URL

publish_template

yes

Build + validate + publish to MoEngage

update_template

yes

Update an existing template

localize_template

yes

Publish a translated market variant

patch_template_text

yes

Modify specific text nodes without a rebuild

Tools return structured previews, never raw HTML — large payloads would overflow an agent's context window.

Gating writes: the server ships all tools; restrict the mutating ones in your MCP client (e.g. Claude Code permissions.allow listing only the read tools). Read and write tools share MoEngage's campaign-API rate limits (5/min, 25/hr, 100/day) — avoid fanning out calls.

Related MCP server: Brevo MCP Server

Install & run

pip install git+https://github.com/poddubnyoleg/moengage_mcp.git
moengage-mcp            # stdio

Claude Code / Claude Desktop config:

{
  "mcpServers": {
    "moengage": {
      "type": "stdio",
      "command": "moengage-mcp"
    }
  }
}

Configuration

Environment variables (or a local .env, see .env.example):

Variable

Required

Description

MOENGAGE_API_KEY

yes

Campaign/Content API key (dashboard → Settings → APIs)

MOENGAGE_DATA_API_KEY

for segments

Data API key (dashboard → Settings → APIs → Data) — the segment tools authenticate against MoEngage's Data API family, which rejects the campaign key with a 401 APP_SECRET key mismatch. Falls back to MOENGAGE_API_KEY

MOENGAGE_WORKSPACE_ID

yes

Workspace (app) ID

MOENGAGE_DATA_CENTER

yes

Regional DC, e.g. 02 for dashboard-02.moengage.com

MOENGAGE_FOOTER_CONFIG

no

Brand links for the email footer component — inline JSON or a file path (schema in footer.py); without it the footer carries only an Unsubscribe link

MOENGAGE_ENABLE_STATS

no

Set true to register get_campaign_stats (hidden by default while the upstream endpoint is disabled)

API errors (including 401 on rotated keys) come back as structured error dicts, so a consuming agent can report them instead of failing opaquely.

Notes

  • content/email/TEMPLATE_GUIDELINES.md documents an example house style the template validator enforces (component order, CTA compliance, Jinja rules) — adapt to your brand.

  • Audience reachability counts are only returned by MoEngage for one-time scheduled campaigns, not periodic ones.

License

MIT

Available Tools

18 tools
analyze_templateA

Fetch existing template from MoEngage, parse HTML, return structured content map (NO HTML).

Both parameters are required — together they pin the exact template revision to fetch. Never omit version: without it the wrong revision may be fetched and cached, causing localize_template to patch the wrong HTML.

Provides ~8:1 compression vs raw HTML. Agent sees structured text nodes instead of HTML.

Returns:

  • template_meta: name, id, version, subject, sender, preview_text

  • content_map: ordered list of {id, context, text, localizable, jinja_expressions, link?}

  • images: list of {id, context, url, alt_text, link_url}

  • structure_summary: one-line description

  • html_bytes: size metric

The HTML is cached in-memory (15-min TTL) for subsequent localize_template / patch_template_text calls.

ParametersJSON Schema
NameRequiredDescriptionDefault
external_template_idYes
versionYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.8/5.0
Behavior5/5

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

With no annotations, the description fully covers behavioral traits: caching behavior (15-min TTL), compression ratio (~8:1), that HTML is not returned but cached, and the detailed return structure. No contradictions.

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

Conciseness4/5

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

Well-structured with bullet points for returns and a clear warning. The description is moderately concise; a bit of redundancy ('Both parameters are required') could be trimmed, but overall effective.

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

Completeness5/5

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

Given the complexity and presence of an output schema, the description is complete. It explains the tool's role among siblings, return values, and caching behavior, leaving no major gaps for an agent to misunderstand.

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

Parameters4/5

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

The input schema has 2 parameters with 0% description coverage, but the description adds substantial meaning by explaining that together they pin the exact revision and emphasizing the importance of version. This compensates well, though it could explicitly define external_template_id.

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

Purpose5/5

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

The description clearly states the tool fetches a template, parses HTML, and returns a structured content map. It uses specific verb+resource ('Fetch existing template from MoEngage, parse HTML, return structured content map') and distinguishes from sibling tools like localize_template and patch_template_text.

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

Usage Guidelines5/5

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

Explicitly states both parameters are required and warns against omitting version, explaining the consequence of fetching the wrong revision. Provides context for caching (15-min TTL) and relation to subsequent tools, offering clear when-to-use guidance.

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

build_email_templateA

Build and validate email template, returning structured preview (NO HTML).

Each component is a dict with a "type" key and component-specific parameters. Component types: header, title, text, button, spacer, divider, image, disclaimer, footer, jinja_block.

Returns a rich structured preview with:

  • structure: Ordered list of components with content previews

  • personalization: Jinja variables, user attributes, conditionals

  • summary: Auto-generated human-readable description

  • validation: Errors and warnings

  • component_count, html_bytes

HTML is built internally but NOT returned (prevents context overflow). Use debug=True to save HTML to temp file for inspection.

ParametersJSON Schema
NameRequiredDescriptionDefault
titleYes
componentsYes
debugNo

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A3.9/5.0
Behavior4/5

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

With no annotations, the description carries full burden. It discloses that HTML is built internally but not returned, and that debug=True saves to temp file. It also details component types and return structure, providing good insight into behavior. However, it does not mention any side effects or limitations like file size.

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

Conciseness4/5

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

The description is well-structured, starting with purpose, then component types, then return preview details, and debug behavior. Each section adds value. Slightly lengthy but justified given the complexity; could trim redundant phrases.

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

Completeness4/5

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

Given 3 parameters, 2 required, no annotations, and an existing output schema (not shown), the description covers the output structure extensively, including validation and expected fields. It lacks mention of error handling or prerequisites but is fairly complete for the tool's complexity.

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

Parameters4/5

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

Schema description coverage is 0%, so the description must compensate. It explains component types and the debug parameter's effect well, listing possible component types. However, it does not detail the meaning of the 'title' parameter beyond being required, and the component schema is left to arbitrary additionalProperties.

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

Purpose5/5

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

The description clearly states the tool's purpose: 'Build and validate email template, returning structured preview (NO HTML).' It uniquely distinguishes from siblings by focusing on building and validating templates, while siblings like compare_templates, localize_template, or patch_template_text have different functions.

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

Usage Guidelines2/5

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

The description does not provide explicit when-to-use or when-not-to-use guidance compared to sibling tools. It mentions the debug parameter for HTML inspection but lacks context on when to choose this tool over alternatives like analyze_template or get_personalized_preview.

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

change_campaign_statusA

Change the lifecycle state of 1-10 campaigns.

action: STOP, PAUSE, or RESUME. campaign_ids: List of 1-10 campaign IDs to update.

STOP: Only valid for ONE_TIME campaigns in SCHEDULED state. Fails if the campaign is already Active or has passed that state. PAUSE/RESUME: Valid for Email and Push campaigns with delivery types PERIODIC, EVENT_TRIGGERED, DEVICE_TRIGGERED, or LOCATION_TRIGGERED.

Only campaigns created via the API can have their status changed.

Rate limit: 5/min, 25/hr, 100/day.

Processes all IDs in a single API call. Returns per-campaign result list. Returns: {success: true, results: [{campaign_id, success: true, dashboard_url}]} on full success. {success: false, error: "All N campaign(s) failed: ", results: [{campaign_id, success: false, error}], api_response} on API failure. {success: false, error: ""} on input validation failure.

ParametersJSON Schema
NameRequiredDescriptionDefault
actionYes
campaign_idsYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.8/5.0
Behavior5/5

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

No annotations provided, so description fully carries the burden. Discloses batch processing behavior, per-campaign result handling, detailed error responses for API failures and validation errors, and rate limits. The constraint 'Only campaigns created via the API can have their status changed' is an important behavioral trait.

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

Conciseness5/5

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

Description is well-organized with clear sections, bullet points, and structured examples. Every sentence adds necessary information; no redundancy or filler. The format is easy to parse quickly.

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

Completeness5/5

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

For a tool with multiple action types, state constraints, rate limits, and a returned output schema, the description covers all relevant aspects. Success and error responses are fully documented. No gaps are apparent.

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

Parameters5/5

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

Schema description coverage is 0%, but description fully compensates by explaining the action enum values with their validity contexts and specifying the campaign_ids range (1-10). This adds meaning well beyond the bare schema property definitions.

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

Purpose5/5

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

Description clearly states the verb 'Change the lifecycle state' and specifies the resource (campaigns) with a batch size constraint (1-10). Actions STOP, PAUSE, RESUME are precisely defined. Easily distinguished from siblings like create_campaign or update_campaign.

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

Usage Guidelines4/5

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

Provides detailed conditions for each action (e.g., STOP only for ONE_TIME campaigns in SCHEDULED state, PAUSE/RESUME for specific delivery types). Includes rate limits and the constraint that only API-created campaigns are eligible. Lacks explicit mention of when not to use the tool, but the guidance is comprehensive and clear.

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

compare_templatesA

Structured diff of two templates' text content (e.g. EN vs ES review).

Returns per-node comparison with match_type:

  • identical: text is the same in both

  • changed: text differs

  • only_in_a: node exists only in template A

  • only_in_b: node exists only in template B

ParametersJSON Schema
NameRequiredDescriptionDefault
template_a_idYesexternal_template_id of template A (e.g. English original).
template_b_idYesexternal_template_id of template B (e.g. Spanish translation).

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4/5.0
Behavior4/5

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

No annotations are present, so the description carries the burden. It discloses that the tool returns per-node comparison with specific match types, giving a clear behavioral model. It could mention error handling or scope (text only), but the provided info is solid.

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

Conciseness5/5

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

Two sentences with a bullet list, front-loaded with the primary purpose. Every word contributes value; no redundancy.

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

Completeness4/5

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

The presence of an output schema reduces the need to describe return values fully. The description covers the main functionality and match types. It might omit that only text content is compared, but overall it is complete for the task.

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

Parameters3/5

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

Both parameters are documented in the schema with descriptions. The description adds an example (EN vs ES) but no additional semantic detail beyond the schema. With 100% schema coverage, baseline 3 is appropriate.

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

Purpose5/5

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

The description clearly states it performs a structured diff of two templates' text content, with a concrete example (EN vs ES). The match types are enumerated, distinguishing it from siblings like analyze_template or localize_template.

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

Usage Guidelines3/5

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

The description implies usage for text comparison but does not explicitly state when to use this tool versus alternatives (e.g., analyze_template for broader analysis). No exclusions or context are provided.

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

create_campaignA

Create an Email or Push campaign in MoEngage.

Uses flat scalar params by default. Dict overrides replace auto-built sub-objects.

--- REQUIRED --- channel: EMAIL or PUSH. campaign_delivery_type: ONE_TIME, PERIODIC, EVENT_TRIGGERED, BUSINESS_EVENT_TRIGGERED, DEVICE_TRIGGERED (Push only), LOCATION_TRIGGERED (Push only), BROADCAST_LIVE_ACTIVITY (Push only). created_by: Creator email address (must contain @). campaign_name: Campaign display name.

--- EMAIL CONTENT (required for EMAIL unless campaign_content override) --- subject: Email subject line (required unless template_id provided). sender_name: Display name for sender (defaults to campaign_name). from_address: Sending email address (required). reply_to_address: Reply-to address (defaults to from_address). html_content: Raw HTML body (mutually exclusive with template_id). template_id: Saved template ID (mutually exclusive with html_content). preview_text: Email preheader text shown in inbox previews. cc_ids: CC email addresses list. bcc_ids: BCC email addresses list. custom_template_version: Template version number override. attachments: List of attachment dicts.

--- PUSH CONTENT (required for PUSH unless campaign_content override) --- platforms: Target platforms list — ANDROID, IOS, WEB (required). push_title: Notification title (required). push_message: Notification body (required). android_notification_channel: Android channel ID (default: "default"). android_default_click_action: Click action type (default: "DEEPLINKING"). android_default_click_action_value: Deep link URL for DEEPLINKING. android_image_url: Android notification image URL. android_input_gif_url: Android notification GIF URL. android_key_value_pairs: Custom key-value pairs for Android. android_buttons: Android push action buttons list. android_advanced: Android advanced options dict. android_push_content_override: Replaces auto-built Android content block entirely. android_summary: Android notification summary text. android_push_amp_plus_enabled: Enable Push Amplification Plus (default: False). android_template_type: BASIC, STYLIZED_BASIC, SIMPLE_IMAGE_CAROUSEL, IMAGE_BANNER_WITH_TEXT, TIMER, TIMER_WITH_PROGRESS_BAR, or Custom (default: "BASIC"). android_custom_template_id: Custom template ID (with Custom template_type). android_custom_template_version: Custom template version. android_timer: Timer config dict for countdown notifications. android_template_backup: Fallback template dict for custom templates. android_carousel_content: Carousel content dict. android_background_color_code: Hex color for notification background. android_app_name_color_code: Hex color for app name text. android_notification_control_color: LIGHT or DARK control color. android_include_app_name_and_time: Show app name and time. android_include_title_and_message: Show title and message. android_apply_background_color_in_text_editor: Apply bg color in text editor. android_image_scaling: FIT_INSIDE_IMAGE_CONTAINER or FILL_IMAGE_CONTAINER. android_banner_image_url: Banner image URL (IMAGE_BANNER_WITH_TEXT). android_collapsed_push_notification: Collapsed push style. ios_title: iOS title (falls back to push_title). ios_message: iOS message body (falls back to push_message). ios_default_click_action: iOS click action type. ios_default_click_action_value: iOS click action URL/value. ios_subtitle: iOS notification subtitle. ios_allow_bg_refresh: Allow background refresh for iOS push. ios_rich_media_type: IMAGE, VIDEO, AUDIO, or GIF. ios_rich_media_value: Rich media URL value. ios_image_url: iOS notification image URL. ios_input_gif_url: iOS notification GIF URL. ios_key_value_pairs: Custom key-value pairs for iOS. ios_background_color_code: Hex color for notification background. ios_apply_background_color_in_text_editor: Apply bg color in text editor. ios_template_type: BASIC, STYLIZED_BASIC, SIMPLE_IMAGE_CAROUSEL, or Custom. ios_custom_template_id: Custom template ID. ios_custom_template_version: Custom template version. ios_template_backup: Fallback template dict. ios_carousel_content: Carousel content dict. ios_send_to_all_eligible_device: Send to all eligible iOS devices (default True). ios_exclude_provisional: Exclude provisional push devices. ios_send_to_only_provisional: Send only to provisional push devices. ios_buttons: iOS push action buttons list. ios_advanced: iOS advanced options dict. ios_push_content_override: Replaces auto-built iOS content block entirely. web_redirect_url: Web push redirect URL (required for WEB platform). web_image_url: Web push notification image URL. web_auto_dismiss_notification: Auto-dismiss web notification. web_buttons: Web push action buttons list. web_advanced: Web advanced options dict. web_icon_image_type: DEFAULT or ICON_URL. web_icon_url: Custom icon URL for web push. web_push_content_override: Replaces auto-built Web content block entirely.

--- BASIC DETAILS --- content_type: PROMOTIONAL or TRANSACTIONAL (EMAIL only, default: PROMOTIONAL). subscription_category: Subscription list category (EMAIL PROMOTIONAL only). tags: Campaign tags list. team: Team name. business_event: Business event name. send_to_triggered_platform_only: Send only to triggering platform (PUSH only). broadcast_live_activity_id: Live Activity broadcast ID (PUSH iOS only). geofences: Geofence config dict (PUSH LOCATION_TRIGGERED only).

--- SCHEDULING --- scheduling_delivery_type: AT_FIXED_TIME, ASAP, SEND_IN_BTS, or SEND_IN_USER_TIMEZONE. start_time: ISO 8601 start datetime. end_time: ISO 8601 expiry datetime. periodic_details: Periodic scheduling config dict (PERIODIC campaigns). bts_details: Best-time-to-send config dict (SEND_IN_BTS). user_timezone_details: User timezone config dict (SEND_IN_USER_TIMEZONE).

--- CONNECTOR (EMAIL only, defaults to AMAZON_SES/default) --- connector_type: Email service provider (default: "AMAZON_SES"). connector_name: Connector config name (default: "default").

--- SEGMENTATION SHORTCUTS (defaults to all users) --- is_all_user_campaign: Target all users (default: True). custom_segment_id: Target a specific segment (sets is_all_user_campaign=False).

--- UTM --- utm_source: UTM source parameter. utm_medium: UTM medium parameter. utm_campaign: UTM campaign parameter. utm_term: UTM term parameter. utm_content: UTM content parameter. utm_custom: UTM custom parameter.

--- DICT OVERRIDES (replace auto-built sub-objects when provided) --- basic_details: Full basic_details dict. Flat scalars merged as defaults. campaign_content: Full campaign_content dict. Replaces all content flat params. scheduling_details: Full scheduling_details dict. Flat scheduling scalars merged. segmentation_details: Full segmentation_details dict. connector: Full connector dict. trigger_condition: Trigger config (required for EVENT_TRIGGERED). delivery_controls: Delivery controls dict. conversion_goal_details: Conversion goal config dict. control_group_details: Control group config dict. utm_params: Full UTM params dict. Replaces utm_* flat params. advanced: Advanced push options dict (PUSH only). campaign_audience_limit: Audience limit config (EMAIL only). locales: Locale configuration for A/B testing. variation_details: Variation metadata for A/B testing.

Rate limit: 5 campaigns/min, 25/hr, 100/day.

Returns: {success: true, campaign_id, dashboard_url} on success. {success: false, error} on validation error. {success: false, error, status_code, api_response} on API error.

ParametersJSON Schema
NameRequiredDescriptionDefault
channelYes
campaign_delivery_typeYes
created_byYes
campaign_nameNo
subjectNo
sender_nameNo
from_addressNo
reply_to_addressNo
html_contentNo
template_idNo
preview_textNo
cc_idsNo
bcc_idsNo
custom_template_versionNo
attachmentsNo
platformsNo
push_titleNo
push_messageNo
android_notification_channelNo
android_default_click_actionNo
android_default_click_action_valueNo
android_image_urlNo
android_input_gif_urlNo
android_key_value_pairsNo
android_buttonsNo
android_advancedNo
android_push_content_overrideNo
android_summaryNo
android_push_amp_plus_enabledNo
android_template_typeNo
android_custom_template_idNo
android_custom_template_versionNo
android_timerNo
android_template_backupNo
android_carousel_contentNo
android_background_color_codeNo
android_app_name_color_codeNo
android_notification_control_colorNo
android_include_app_name_and_timeNo
android_include_title_and_messageNo
android_apply_background_color_in_text_editorNo
android_image_scalingNo
android_banner_image_urlNo
android_collapsed_push_notificationNo
ios_titleNo
ios_messageNo
ios_default_click_actionNo
ios_default_click_action_valueNo
ios_subtitleNo
ios_allow_bg_refreshNo
ios_rich_media_typeNo
ios_rich_media_valueNo
ios_image_urlNo
ios_input_gif_urlNo
ios_key_value_pairsNo
ios_background_color_codeNo
ios_apply_background_color_in_text_editorNo
ios_template_typeNo
ios_custom_template_idNo
ios_custom_template_versionNo
ios_template_backupNo
ios_carousel_contentNo
ios_send_to_all_eligible_deviceNo
ios_exclude_provisionalNo
ios_send_to_only_provisionalNo
ios_buttonsNo
ios_advancedNo
ios_push_content_overrideNo
web_redirect_urlNo
web_image_urlNo
web_auto_dismiss_notificationNo
web_buttonsNo
web_advancedNo
web_icon_image_typeNo
web_icon_urlNo
web_push_content_overrideNo
content_typeNo
subscription_categoryNo
tagsNo
teamNo
business_eventNo
send_to_triggered_platform_onlyNo
broadcast_live_activity_idNo
geofencesNo
scheduling_delivery_typeNo
start_timeNo
end_timeNo
periodic_detailsNo
bts_detailsNo
user_timezone_detailsNo
connector_typeNo
connector_nameNo
is_all_user_campaignNo
custom_segment_idNo
utm_sourceNo
utm_mediumNo
utm_campaignNo
utm_termNo
utm_contentNo
utm_customNo
basic_detailsNo
campaign_contentNo
scheduling_detailsNo
segmentation_detailsNo
connectorNo
trigger_conditionNo
delivery_controlsNo
conversion_goal_detailsNo
control_group_detailsNo
utm_paramsNo
advancedNo
campaign_audience_limitNo
localesNo
variation_detailsNo

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.8/5.0
Behavior5/5

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

With no annotations provided, the description fully discloses behavioral traits: rate limits (5/min, 25/hr, 100/day), return values (success/error responses), and the effect of dict overrides on auto-built sub-objects. No contradictions.

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

Conciseness5/5

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

The description is well-structured with clear sections (REQUIRED, EMAIL CONTENT, PUSH CONTENT, etc.) and front-loaded with the core purpose. Despite its length, every sentence serves a purpose due to the tool's complexity.

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

Completeness5/5

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

Given the tool's high complexity (114 parameters, no schema descriptions, no annotations), the description is remarkably complete. It covers all essential aspects: required parameters, channel-specific content, scheduling, segmentation, UTM, dict overrides, rate limits, and return values.

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

Parameters5/5

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

Schema description coverage is 0%, but the description compensates thoroughly by explaining each parameter's purpose, required/optional status, defaults, constraints (e.g., mutual exclusivity), and grouping them logically. This adds critical meaning beyond the schema's names and types.

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

Purpose5/5

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

The description explicitly states 'Create an Email or Push campaign in MoEngage', clearly identifying the verb and resource. It distinguishes from sibling tools like update_campaign and search_campaigns by focusing on creation.

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

Usage Guidelines4/5

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

The description provides clear context on when to use this tool (creating campaigns) and extensive parameter-level guidance for different channels and delivery types. However, it does not explicitly contrast with siblings or state when not to use it.

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

get_campaign_metaA

Get detailed campaign metadata including reachability_details for scheduled campaigns.

Accepts the same filters as search_campaigns. Returns the full campaign object from MoEngage — no field curation. reachability_details (count + last_updated_time) is only populated for scheduled campaigns (one-time, business event-triggered, and event-triggered delivery types). Absent for periodic, active, or other non-scheduled campaigns. Reachability is calculated once daily and cached for 24 hours.

Supported channels: EMAIL, PUSH, SMS, WHATSAPP, FACEBOOK, GOOGLE ADS, CONNECTORS Supported delivery_type: ONE_TIME, PERIODIC, EVENT_TRIGGERED, BUSINESS_TRIGGERED Supported status: SCHEDULED, ACTIVE, PAUSED, SENT, STOPPED, RETIRED, ARCHIVED

created_date_from and created_date_to must both be provided together (ISO 8601 dates). include_child_campaigns: Include child campaigns (flow nodes and periodic children). When true, use flow_id, flow_name, or parent_campaign_id in the response to identify parent-child relationships. Periodic parent campaigns include total_child_campaigns.

When campaign_id is provided and no campaign is found: {success: false, error: "Campaign not found", campaign_id: ""}

Rate limit: 5/min, 25/hr, 100/day.

Pagination: page (1-indexed) + limit (max 15). has_more is heuristic (count == limit) — may false-positive on exact multiples of limit.

Additional fields in response: campaign_team, platform array, among others.

Field name differences vs search_campaigns: campaign_status vs status, campaign_name vs basic_details.name, parent_campaign_id vs parent_id.

Returns: {success: true, campaigns: [full_campaign_object], page, limit, has_more} Each campaign may include: total_child_campaigns (periodic parents), parent_campaign_id (child campaigns), reachability_details (scheduled only). {success: false, error: "Campaign not found", campaign_id} if id lookup finds nothing. {success: false, error, status_code, api_response} on API error.

ParametersJSON Schema
NameRequiredDescriptionDefault
campaign_idNo
channelsNo
delivery_typeNo
statusNo
created_byNo
created_date_fromNo
created_date_toNo
nameNo
tagsNo
pageNo
limitNo
include_child_campaignsNo

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.6/5.0
Behavior5/5

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

No annotations are provided, so the description carries the full burden. It thoroughly discloses behavioral traits: reachability_details only for scheduled campaigns, daily calculation with 24h cache, supported channels and statuses, error response format, rate limits (5/min, 25/hr, 100/day), pagination behavior (has_more heuristic), and field name differences versus search_campaigns. This is highly transparent.

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

Conciseness4/5

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

The description is well-structured with sections for different aspects (overview, filters, reachability, supported values, errors, rate limits, pagination, field differences). It is front-loaded with the main purpose. However, it is fairly long and contains some redundancy (e.g., listing channels twice), but overall it is efficiently organized.

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

Completeness5/5

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

Given the tool's complexity (12 parameters, no annotations, but an output schema exists), the description is remarkably complete. It covers return structure, error cases, rate limits, pagination, edge cases like reachability conditions, field name differences, and prerequisites for date parameters. Only minor gaps in parameter explanations exist, but overall it provides a comprehensive context.

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

Parameters4/5

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

The input schema has 12 parameters with 0% description coverage in the schema. The description compensates by explaining many parameters: created_date_from/to must be provided together, include_child_campaigns behavior, page/limit pagination, campaign_id error handling, and supported values for channels, delivery_type, and status. However, some parameters like created_by and tags are not explained.

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

Purpose5/5

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

The description clearly states the tool gets detailed campaign metadata including reachability_details, and specifies it accepts the same filters as search_campaigns. It explicitly names the resource (campaign metadata) and the verb (get), distinguishing it from sibling tools like search_campaigns or get_campaign_stats.

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

Usage Guidelines4/5

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

The description provides good context on when to use this tool (for detailed metadata, including reachability_details for scheduled campaigns) but does not explicitly state when not to use it or offer direct comparisons to siblings. The implied use case is clear, but it lacks explicit exclusions.

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

get_campaign_statsA

⚠ UNAVAILABLE: The Campaign Stats API has been disabled on MoEngage's side. This tool is currently non-functional. Do not use until further notice.

Get performance statistics for campaigns from MoEngage.

Both start_date and end_date are required — the MoEngage stats API has no lifetime summary mode. Max date range is 30 days.

start_date: Start of the stats window in YYYY-MM-DD format (required). end_date: End of the stats window in YYYY-MM-DD format (required). Must be within 30 days of start_date. attribution_type: Conversion attribution model (required). One of: VIEW_THROUGH, CLICK_THROUGH, IN_SESSION, TOTAL_CONVERSIONS, CLICK_CONVERSIONS. metric_type: Counting mode (required) — TOTAL or UNIQUE. campaign_ids: Optional list of campaign IDs to filter (max 10 per call). Omit to get stats for all campaigns in the date range. offset: Pagination offset (0-indexed). Default 0. limit: Results per page, max 10. Default 10.

Per-campaign stats include:

  • performance_stats: sent, delivered, opened, clicked, ctr, open_rate, etc.

  • delivery_funnel: reachable_users_in_segment, after_fc, after_dup, etc.

  • conversion_goal_stats: conversions, cvr, uplift, revenue, ARPU per goal

  • failure_breakdown: categorized delivery failures

Pagination: offset (0-indexed) + limit (max 10). Uses total_pages from the API (accurate, unlike heuristic in search/meta).

Rate limit for this endpoint: 100 requests/minute (separate from the 5/min limit on campaign create/update operations).

Returns: {success: true, response_id, total_campaigns, current_page, total_pages, data: {campaign_id: [{platforms: {...}}]}} {success: false, error: str} on validation error (e.g. >10 campaign_ids). {success: false, error, status_code, api_response} on API error.

ParametersJSON Schema
NameRequiredDescriptionDefault
start_dateYes
end_dateYes
attribution_typeYes
metric_typeYes
campaign_idsNo
offsetNo
limitNo

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.7/5.0
Behavior5/5

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

With no annotations provided, the description fully discloses behavioral traits: the tool is currently non-functional, details rate limits (100/min), pagination behavior, error responses, and the structure of returned data. This is comprehensive.

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

Conciseness4/5

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

The description is lengthy but well-structured: starts with a critical warning, then explains parameters, output fields, pagination, rate limits, and return format. Every sentence adds value, though it could be slightly more concise.

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

Completeness5/5

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

Given no output schema is provided, the description includes detailed output structure, error handling, and rate limits. It covers all aspects: purpose, parameters, constraints, behavior, and cancellation status, making it completely adequate for the tool's complexity.

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

Parameters5/5

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

Schema description coverage is 0%, but the description thoroughly explains all seven parameters, including formats, constraints (e.g., max 10 campaign IDs, date range limits), and required fields. It adds full meaning beyond the schema.

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

Purpose5/5

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

The description clearly states it retrieves campaign performance statistics from MoEngage, using specific verbs and resources. It distinguishes itself from sibling tools like create_campaign or update_campaign by focusing on stats retrieval and also notes the current unavailability.

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

Usage Guidelines4/5

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

The description explicitly states that both start_date and end_date are required and the max date range is 30 days. It also provides guidance on pagination and rate limits. However, it does not contrast with alternative tools for similar purposes.

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

get_child_executionsA

Get child executions for a periodic or business-event-triggered campaign.

Returns a curated list of executions with sent_time, status, and campaign_id per execution, plus total_instances (total count across all pages). Sort: most recent sent_time first.

Note: this endpoint only works for PERIODIC and BUSINESS_EVENT_TRIGGERED parent campaigns. Calling it on a ONE_TIME campaign returns no results.

parent_campaign_id: The ID of the parent periodic or business-event-triggered campaign. Any version ID is accepted — automatically resolved to the latest version. page: Page number, starting at 1 (default: 1) limit: Results per page, max 15 (default: 15)

Supported channels: Email and Push only.

Rate limit: not explicitly documented.

Pagination: page (1-indexed) + limit (max 15). has_more uses total_instances when available; None when total_instances is missing (unknown).

Returns: {success: true, executions: [{campaign_id, dashboard_url, sent_time, status}], total_instances: N, page, limit, has_more, parent_campaign_id, parent_dashboard_url} Status values are mixed-case: Sent, Sending, Scheduled, Failed. {success: false, error, status_code, api_response} on API error.

ParametersJSON Schema
NameRequiredDescriptionDefault
parent_campaign_idYes
pageNo
limitNo

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.9/5.0
Behavior5/5

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

No annotations exist, so the description carries full burden. It fully discloses return structure (fields, status values), sorting, pagination behavior, error format, and includes a note about undocumented rate limit. This exceeds typical transparency expectations.

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

Conciseness4/5

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

Well-structured with bullet points and clear sections, front-loading the primary purpose. Slightly verbose with items like 'Rate limit: not explicitly documented' which could be omitted, but overall efficient and organized.

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

Completeness5/5

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

Given the output schema exists, the description still adds value by detailing field meanings (e.g., status values are mixed-case), pagination mechanics, and error handling. No gaps remain for a tool with 3 parameters and no annotations.

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

Parameters5/5

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

Parameter explanations add significant meaning beyond the bare schema. For parent_campaign_id, it explains version ID resolution. For page and limit, it provides defaults, maximums, and behavior. This compensates for the 0% schema description coverage.

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

Purpose5/5

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

Clearly states the tool's purpose: 'Get child executions for a periodic or business-event-triggered campaign.' The verb 'Get' and the specific resource 'child executions' are well-defined, and the conditions (periodic or business-event-triggered) distinguish it from siblings that do not have this specialization.

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

Usage Guidelines5/5

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

Explicitly guides when to use: 'only works for PERIODIC and BUSINESS_EVENT_TRIGGERED parent campaigns. Calling it on a ONE_TIME campaign returns no results.' Also notes supported channels (Email and Push only). This provides clear context and exclusion, though no alternatives among siblings are mentioned.

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

get_personalized_previewA

Get a personalized preview with all {{UserAttribute[...]}} and {{EventAttribute[...]}} placeholders resolved.

channel: EMAIL, PUSH, or SMS. personalization_details: Dict with user_attributes, event_attributes, and/or event_name. event_name (str) is required when event_attributes are provided (event-triggered personalization). Example (user attrs): {"user_attributes": {"First Name": "Alice"}} Example (event attrs): {"event_name": "App Opened", "event_attributes": {"App_Version": "1.0"}} payload: Dict of content fields with placeholder strings to render. Example: {"subject": "Hello {{UserAttribute['First Name']}}", "body": "..."} All Jinja-style personalization expressions supported by MoEngage are passed through:

  • Content blocks: {{ContentBlock['block_name']}}

  • Product sets: {% if ProductSet.set_name %}...{% endif %}

  • Content API references: {{Content['api_name'].field}} custom_template_data: Use an existing template instead of inline payload. Requires both template_id and version. Example: {"template_id": "tmpl-abc", "version": "v1.0"} user_details: Optional identifier to resolve personalization against an actual MoEngage user profile. Requires both fields: {"identifier": "ID", "identifier_value": "USER_12345"}.

Provide either payload OR custom_template_data — not both, not neither.

Rate limit: 10,000/min.

Returns: {success: true, personalized_content: {payload: {...}}} on success. {success: false, error, status_code, api_response} on API error. {success: false, error: str} on validation failure (missing fields, invalid args).

ParametersJSON Schema
NameRequiredDescriptionDefault
channelYes
personalization_detailsYes
payloadNo
custom_template_dataNo
user_detailsNo

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.4/5.0
Behavior4/5

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

The description discloses behavioral traits: returns different response shapes for success, API error, and validation failure. It explains the resolution of placeholders and lists supported expressions. No annotations are provided, so the description carries the full burden, which it handles well. Missing details on permissions or idempotency.

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

Conciseness3/5

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

The description is lengthy but well-structured with bullet points and examples. It front-loads the main purpose, but some details (e.g., supported expressions) could be more concise. It earns its length by providing essential examples, but could be tightened.

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

Completeness5/5

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

Given no annotations and no schema descriptions, the description is complete. It covers all parameters, constraints (payload vs custom_template_data), error handling, rate limit, and return format. The output schema is not provided but the description explains the return structure adequately.

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

Parameters5/5

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

Schema description coverage is 0%, so the description must fully compensate. It provides detailed explanations for each parameter with examples: personalization_details structure, payload format, custom_template_data usage, and user_details. It adds significant meaning beyond the raw schema.

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

Purpose5/5

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

The description clearly states the tool's purpose: to get a personalized preview with placeholders resolved. It lists the channels and explains the core functionality, distinguishing it from sibling tools like analyze_template or build_email_template that deal with template creation or analysis.

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

Usage Guidelines4/5

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

The description gives explicit usage constraints: 'Provide either payload OR custom_template_data — not both, not neither.' It also states the rate limit. However, it does not explicitly compare to sibling tools or say when to use this tool instead of others, though the purpose is clear.

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

get_server_infoA

Return MCP server metadata including data_center and dashboard base URL.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4/5.0
Behavior3/5

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

No annotations are provided, so the description must disclose behavior. It describes a read operation returning metadata, but does not mention that it is safe, idempotent, or has no side effects. The description is minimal but not misleading.

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

Conciseness5/5

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

The description is a single sentence, front-loaded with the verb and result. Every word adds value, and there is no unnecessary information. It is appropriately sized for the tool's simplicity.

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

Completeness4/5

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

For a tool with no parameters and an existing output schema, the description adequately explains what it does. It mentions specific return fields (data_center, dashboard URL). No additional context seems necessary for basic usage.

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

Parameters4/5

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

The tool has no parameters, and schema coverage is 100%. The description does not need to add parameter info, and the baseline for zero-parameter tools is 4. No additional semantic value is required.

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

Purpose5/5

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

The description clearly states the tool returns MCP server metadata, specifying 'data_center' and 'dashboard base URL'. It uses a specific verb and resource, and none of the sibling tools appear to provide server info, so it stands out.

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

Usage Guidelines3/5

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

The description does not explicitly guide when or when not to use this tool vs alternatives. However, given the tool's simplicity and unique purpose, usage context is implicit. No exclusions or conditions are mentioned.

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

localize_templateA

Create a localized version of an existing template for a target market.

translations format: [{"id": "node_id", "translated_text": ""}, ...]

translated_text is the INNER content of the HTML element only — do not include the outer tag. The outer tag and all CSS attributes are preserved automatically. Inline HTML is supported: , , , may be used freely.

Jinja expression rules:

  • Preserve {{...}} structure exactly: variable names, filters, attribute keys

  • You MAY adapt the string VALUE inside |default('value') to sound natural

  • Do NOT modify {%...%} control flow expressions

image_overrides: Optional list of image URL/alt swaps. Each entry: {"id": "img_0", "url": "...", "alt_text": "...", "link_url": "..."}. IDs come from analyze_template's images list.

rtl: Set to True for right-to-left locales (Arabic, Hebrew, Farsi, etc.).

source_version: Integer revision number from search_templates. Pass this to ensure the correct HTML version is fetched on cache miss.

If publish=True and any localizable nodes have no translation, publishing is blocked. Set force=True to publish anyway.

ParametersJSON Schema
NameRequiredDescriptionDefault
source_external_template_idYes
translationsYes
target_localeYes
target_template_idYes
target_template_nameYes
target_template_versionYes
subjectYes
sender_nameYes
created_byYes
preview_textNo
publishNo
forceNo
image_overridesNo
rtlNo
source_versionNo

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.1/5.0
Behavior4/5

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

With no annotations provided, the description effectively discloses key behaviors: translations must include node IDs and inner HTML only, Jinja rules, image override format, RTL support, source versioning, and the publish/force logic. It does not describe where the localized template is saved or permissions needed.

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

Conciseness4/5

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

The description is well-structured with bullet points for different sections (translations, Jinja, image_overrides, etc.). It is front-loaded with the main purpose. While slightly lengthy, every sentence provides value, making it effective.

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

Completeness4/5

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

Given the complexity (15 params, 9 required) and no annotations, the description covers translations, image overrides, RTL, source version, and publishing behavior. Minor gaps exist for some required parameters and the exact storage destination. The presence of an output schema partially compensates for return details.

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

Parameters3/5

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

Schema coverage is 0%, so the description carries the full burden. It adds meaning for translations, image_overrides, rtl, source_version, publish, and force (6 of 15 params). However, required parameters like source_external_template_id, target_template_id, target_template_name, target_template_version, subject, sender_name, created_by, and preview_text are not explained beyond their schema names.

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

Purpose5/5

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

The description clearly states the tool's purpose: 'Create a localized version of an existing template for a target market.' It uses a specific verb ('localize') and resource ('template'), differentiating it from sibling tools like analyze_template or build_email_template.

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

Usage Guidelines4/5

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

The description provides detailed usage context, including formatting rules for translations, Jinja, and image_overrides, as well as conditions for publish and force. However, it does not explicitly state when NOT to use this tool or compare it to alternatives like patch_template_text or update_template.

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

patch_template_textA

Modify specific text nodes in an existing template without full rebuild.

Useful for small copy edits (e.g. fix a typo, update a date) without reconstructing the entire component list.

patches format: [{"id": "node_id", "new_text": "replacement text"}, ...]

Set publish=True to update the template in MoEngage immediately.

ParametersJSON Schema
NameRequiredDescriptionDefault
external_template_idYes
patchesYes
new_versionYes
updated_byYes
subjectNo
publishNo

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A3.8/5.0
Behavior3/5

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

With no annotations provided, the description carries the full burden of behavioral disclosure. It describes the patches format and the publish parameter, but does not cover auth requirements, error handling, or consequences of operations (e.g., overwriting text). The description is moderately transparent but lacks depth.

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

Conciseness5/5

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

The description is concise, front-loaded with the main action, and uses clear bullet-like structure for the patches format. Every sentence adds value without redundancy.

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

Completeness3/5

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

The tool has 6 parameters and an output schema (not shown). The description covers the core use case and patches format but omits details on required parameters (external_template_id, new_version, updated_by) and potential errors. While the output schema may compensate for return value info, the description alone is not fully complete.

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

Parameters2/5

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

Schema description coverage is 0%, yet the description only explains the 'patches' format and the 'publish' parameter. It does not clarify 'external_template_id', 'new_version', 'updated_by', or 'subject', leaving significant gaps for a 6-parameter tool.

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

Purpose5/5

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

The description clearly states the tool modifies specific text nodes in an existing template without full rebuild, which is a specific verb and resource. It distinguishes itself from the sibling tool 'update_template' by emphasizing targeted edits over a full rebuild.

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

Usage Guidelines4/5

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

The description provides context for when to use this tool ('small copy edits') and contrasts with full rebuild, but does not explicitly name alternative tools (like 'update_template') or state when not to use it.

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

publish_templateA

Validate, build, and publish an email template to MoEngage.

Runs TemplateValidator before publishing (unless force=True). Returns success status, external_template_id, and structured preview on success. HTML is never exposed to agent context.

Use force=True to bypass validation. Use debug=True to save HTML to temp file for inspection.

ParametersJSON Schema
NameRequiredDescriptionDefault
titleYes
componentsYes
template_idYes
template_nameYes
template_versionYes
subjectYes
sender_nameYes
created_byYes
preview_textNo
forceNo
debugNo

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.2/5.0
Behavior5/5

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

With no annotations provided, the description carries full burden. It discloses that TemplateValidator runs by default, that HTML is never exposed to agent context, and specifies the return values (success status, external_template_id, structured preview). No contradictions.

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

Conciseness5/5

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

The description is very concise with three short paragraphs. Each sentence adds value: main purpose, behavior details, and parameter guidance. No wasted words.

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

Completeness3/5

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

Given 11 parameters and 8 required, the description lacks parameter explanations. It covers behavioral aspects and return values (aided by output schema), but is incomplete for understanding all inputs. Adequate but with clear gaps.

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

Parameters2/5

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

Schema description coverage is 0%, so description must compensate. It only explains force and debug parameters, ignoring 9 others including required ones like title, components, template_id. This leaves agents without understanding of many parameters.

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

Purpose5/5

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

The description clearly states the action: 'Validate, build, and publish an email template to MoEngage.' It identifies the specific resource and verb, and distinguishes from sibling tools like analyze_template or build_email_template by including validation and publishing.

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

Usage Guidelines4/5

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

The description provides guidance on when to use force=True to bypass validation and debug=True to save HTML. It implies the tool is for publishing, but does not explicitly contrast with alternatives like build_email_template. However, the context is clear enough.

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

search_campaignsA

Search MoEngage campaigns with optional filters and pagination.

All filters combine with AND logic — all provided filters must match. Zero results is not an error: returns {success: true, campaigns: [], has_more: false}.

channels: List of channels to filter by (e.g. ["EMAIL", "PUSH", "SMS"]) delivery_type: List of delivery types (ONE_TIME, PERIODIC, EVENT_TRIGGERED, BUSINESS_EVENT_TRIGGERED, DEVICE_TRIGGERED, LOCATION_TRIGGERED, BROADCAST_LIVE_ACTIVITY) status: List of statuses (ACTIVE, SCHEDULED, PAUSED, SENT, STOPPED, ARCHIVED) created_by: List of creator email addresses created_date_from: ISO date string for range start (required with created_date_to) created_date_to: ISO date string for range end (required with created_date_from) campaign_id: Filter by specific campaign ID (regular filter, not a direct lookup) name: Substring match on campaign name (case-insensitive) tags: List of tags to filter by page: Page number, starting at 1 (default: 1) limit: Results per page, 1–15 (default: 10) include_child_campaigns: Include child campaign executions in results (default: false) include_archive_campaigns: Include archived campaigns in results (default: false)

Date range: created_date_from and created_date_to must both be provided together.

Rate limit: 5/min, 25/hr, 100/day.

Pagination: page (1-indexed) + limit (max 15). has_more is heuristic (count == limit) — may false-positive on exact multiples of limit.

Note: Returns full raw campaign objects from the API — no field curation. Additional fields beyond the basics include: flow_id, flow_name, parent_id, basic_details.name, basic_details.tags, scheduling_details, among others.

Field name differences vs get_campaign_meta: status vs campaign_status, basic_details.name vs campaign_name, parent_id vs parent_campaign_id.

Returns: {success: true, campaigns: [full_campaign_object], page, limit, has_more} {success: false, error, status_code, api_response} on API error.

ParametersJSON Schema
NameRequiredDescriptionDefault
channelsNo
delivery_typeNo
statusNo
created_byNo
created_date_fromNo
created_date_toNo
campaign_idNo
nameNo
tagsNo
pageNo
limitNo
include_child_campaignsNo
include_archive_campaignsNo

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.9/5.0
Behavior5/5

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

No annotations provided, so the description carries full burden. It discloses zero results handling, pagination heuristic (has_more may false-positive), rate limits (5/min, 25/hr, 100/day), and that it returns full raw objects without curation. Also mentions error response format.

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

Conciseness4/5

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

The description is well-structured: a one-line summary, then a bullet list of parameters, followed by notes on date range, rate limit, pagination, and field differences. It is slightly long but every sentence adds value, so it earns a 4.

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

Completeness5/5

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

Given 13 parameters (0 required), no output schema shown but the description includes return format and error response. It covers inputs, behavior, errors, rate limits, pagination, and cross-references to sibling tool. Very complete.

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

Parameters5/5

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

Schema description coverage is 0%, but the description lists each parameter with valid values (e.g., delivery_type enums, statuses), behavior (name substring match, case-insensitive), and constraints (date range must be together). This adds significant meaning beyond the bare schema.

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

Purpose5/5

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

The description starts with 'Search MoEngage campaigns with optional filters and pagination,' clearly stating the verb (search), resource (campaigns), and scope. It distinguishes itself from siblings like get_campaign_meta and search_templates by focusing on search with multiple filters.

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

Usage Guidelines5/5

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

Provides explicit guidance: all filters combine with AND logic, zero results not an error, date range requires both fields, pagination details, rate limits, and field name differences vs get_campaign_meta. It tells the agent exactly how to use it and what to expect.

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

search_templatesA

Search templates in MoEngage API with advanced filtering and pagination.

Set include_html=False (default) for listing/counting to avoid context overflow. Only use include_html=True when inspecting the actual HTML of a specific template.

Filters:

  • template_name: Partial match on template name

  • template_id: Exact match on custom template identifier

  • external_template_id: Exact match on MoEngage UUID

  • template_source: ["API"] for programmatic, ["MOENGAGE"] for dashboard-created

  • template_type: ["CUSTOM"] for user-created, ["PRE_BUILT"] for MoEngage templates

  • version: Exact version string

  • created_by / updated_by: Filter by email addresses

Sorting: sort_by ("template_name", "last_modified_date"), sort_order ("ASCENDING", "DESCENDING")

Pagination: page (1-indexed), entries (default 10, max 15). Response includes has_more.

Returns dict with success, templates, total, page, entries, has_more.

ParametersJSON Schema
NameRequiredDescriptionDefault
template_nameNo
template_idNo
external_template_idNo
pageNo
entriesNo
template_sourceNo
template_typeNo
versionNo
created_byNo
updated_byNo
sort_byNo
sort_orderNo
include_htmlNo

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.4/5.0
Behavior3/5

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

No annotations provided, so description must carry the burden. It explains the return structure (dict with success, templates, total, etc.) and pagination behavior. Does not mention authentication, rate limits, or potential side effects (but as a read operation, this is acceptable).

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

Conciseness5/5

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

Well-organized into sections (filters, sorting, pagination) with no wasted words. Every sentence provides essential information.

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

Completeness5/5

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

Covers all 13 parameters, return structure, and usage nuance (include_html). Output schema exists but description still explains return fields. Comprehensive for a search tool.

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

Parameters5/5

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

Schema description coverage is 0%, so description compensates by thoroughly explaining each filter parameter, including match types, sorting, and pagination. Adds significant meaning beyond the raw schema.

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

Purpose5/5

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

Clearly states 'Search templates in MoEngage API with advanced filtering and pagination.' The verb 'Search' and resource 'templates' are specific, and no sibling tool duplicates this functionality (e.g., search_campaigns is separate).

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

Usage Guidelines4/5

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

Provides explicit guidance on when to set include_html=True vs False to avoid context overflow. However, it does not discuss when to prefer search_templates over sibling tools like analyze_template or compare_templates.

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

test_campaignA

Send a test Email or Push campaign to specific recipients.

channel: EMAIL or PUSH. campaign_name: Name for the test campaign. user_attributes: List of dicts identifying recipients. Each dict has one key-value pair. EMAIL examples: [{"email_id": "alice@example.com"}, {"email_id": "bob@example.com"}] PUSH examples: [{"customer_id": "uid-123"}, {"push_token": "tok-abc"}] Maximum 10 recipients for EMAIL test campaigns.

Required for EMAIL: from_address, and either html_content or template_id. subject is required unless template_id is provided. Required for PUSH: platforms (list of ANDROID/IOS/WEB), push_title, push_message.

Only campaigns created via the MoEngage API can be tested (dashboard-created campaigns will be rejected by MoEngage with an appropriate error).

--- EMAIL PARAMS --- subject: Email subject line (required unless template_id is provided). sender_name: Display name for the sender (defaults to campaign_name). from_address: Sending email address (required). reply_to_address: Reply-to address (defaults to from_address). connector_type: Email connector type (defaults to "AMAZON_SES"). connector_name: Connector config name (defaults to "default"). email_content_type: PROMOTIONAL or TRANSACTIONAL (default: PROMOTIONAL). html_content: Raw HTML body (mutually exclusive with template_id). template_id: Saved template ID (mutually exclusive with html_content). subscription_category: Required for PROMOTIONAL emails. preview_text: Preheader text shown in inbox previews. utm_params: UTM tracking parameters dict (injected at payload top level). cc_ids: CC email addresses list. bcc_ids: BCC email addresses list. custom_template_version: Template version number override. attachments: List of attachment dicts.

--- PUSH PARAMS --- platforms: Target platforms — list of ANDROID, IOS, WEB (required). push_title: Notification title (required). push_message: Notification body (required). android_notification_channel: Android channel ID (default: "default"). android_default_click_action: Android click action (default: "DEEPLINKING"). android_default_click_action_value: Deep link URL for DEEPLINKING. android_image_url: Android notification image URL. android_input_gif_url: Android notification GIF URL. android_key_value_pairs: Custom key-value pairs for Android. android_buttons: Android push action buttons list. android_advanced: Android advanced options dict. android_push_content_override: Replaces auto-built Android content block entirely. Flat android_* params are ignored when this is provided. android_summary: Android notification summary text. android_push_amp_plus_enabled: Enable Push Amplification Plus for Android (default: False). android_template_type: Android template type — BASIC, STYLIZED_BASIC, SIMPLE_IMAGE_CAROUSEL, IMAGE_BANNER_WITH_TEXT, TIMER, TIMER_WITH_PROGRESS_BAR, or Custom (default: "BASIC"). android_custom_template_id: Custom template ID (used with Custom template_type). android_custom_template_version: Custom template version. android_timer: Timer configuration dict for countdown notifications. android_template_backup: Fallback template dict for custom templates. android_carousel_content: Carousel content dict for carousel notifications. android_background_color_code: Hex color for notification background (STYLIZED_BASIC, SIMPLE_IMAGE_CAROUSEL, IMAGE_BANNER_WITH_TEXT). android_app_name_color_code: Hex color for app name text (STYLIZED_BASIC, SIMPLE_IMAGE_CAROUSEL, IMAGE_BANNER_WITH_TEXT). android_notification_control_color: LIGHT or DARK control color (STYLIZED_BASIC, SIMPLE_IMAGE_CAROUSEL, IMAGE_BANNER_WITH_TEXT). android_include_app_name_and_time: Show app name and time (IMAGE_BANNER_WITH_TEXT). android_include_title_and_message: Show title and message (IMAGE_BANNER_WITH_TEXT). android_apply_background_color_in_text_editor: Apply background color in text editor (STYLIZED_BASIC, SIMPLE_IMAGE_CAROUSEL, IMAGE_BANNER_WITH_TEXT). android_image_scaling: FIT_INSIDE_IMAGE_CONTAINER or FILL_IMAGE_CONTAINER (SIMPLE_IMAGE_CAROUSEL, IMAGE_BANNER_WITH_TEXT). android_banner_image_url: Banner image URL (required for IMAGE_BANNER_WITH_TEXT). android_collapsed_push_notification: Collapsed push style e.g. "SAME_AS_TEMPLATE_BACKUP" (IMAGE_BANNER_WITH_TEXT). ios_title: iOS title (falls back to push_title if not set). ios_message: iOS message body (falls back to push_message if not set). ios_default_click_action: iOS click action type. ios_default_click_action_value: iOS click action URL/value. ios_subtitle: iOS notification subtitle. ios_allow_bg_refresh: Allow background refresh for iOS push. ios_rich_media_type: iOS rich media type — IMAGE, VIDEO, AUDIO, GIF. ios_rich_media_value: iOS rich media URL value. ios_image_url: iOS notification image URL. ios_input_gif_url: iOS notification GIF URL. ios_key_value_pairs: Custom key-value pairs for iOS push. ios_background_color_code: Hex color for notification background (STYLIZED_BASIC, SIMPLE_IMAGE_CAROUSEL). ios_apply_background_color_in_text_editor: Apply background color in text editor (STYLIZED_BASIC, SIMPLE_IMAGE_CAROUSEL). ios_template_type: iOS template type — BASIC, STYLIZED_BASIC, SIMPLE_IMAGE_CAROUSEL, or Custom (default: "BASIC"). ios_custom_template_id: Custom template ID (used with Custom template_type). ios_custom_template_version: Custom template version. ios_template_backup: Fallback template dict for custom templates. ios_carousel_content: Carousel content dict for carousel notifications. ios_send_to_all_eligible_device: Send to all eligible iOS devices (default True). ios_exclude_provisional: Exclude provisional push devices (mutually exclusive with ios_send_to_only_provisional). ios_send_to_only_provisional: Send only to provisional push devices (mutually exclusive with ios_exclude_provisional). ios_buttons: iOS push action buttons list. ios_advanced: iOS advanced options dict. ios_push_content_override: Replaces auto-built iOS content block entirely. Flat ios_* content params are ignored when this is provided. web_redirect_url: Web push redirect URL (required by MoEngage for WEB platform). web_image_url: Web push notification image URL. web_auto_dismiss_notification: Auto-dismiss web push notification after display. web_buttons: Web push action buttons list. web_advanced: Web advanced options dict. web_icon_image_type: DEFAULT or ICON_URL — web notification icon source. web_icon_url: Custom icon URL for web push (used when icon_image_type is ICON_URL). web_push_content_override: Replaces auto-built Web content block entirely. Flat web_* params are ignored when this is provided.

--- SHARED PARAMS --- tags: Campaign tags list (injected into basic_details). team: Team name (injected into basic_details). business_event: Business event name (injected into basic_details). send_to_triggered_platform_only: Send only to the platform that triggered the event (PUSH only). broadcast_live_activity_id: Live Activity broadcast ID (PUSH iOS only). geofences: Geofence configuration dict (PUSH LOCATION_TRIGGERED only). locales: List of locale codes for multi-locale content. For locale-keyed content structure, use campaign_content_override instead. variation_details: Variation metadata dict for A/B test content. personalization_details: Flat dict of attribute overrides for test rendering. Format: {"UserAttribute[First Name]": "Alice", "EventAttribute[App_Version]": "2.0"} identifier_type: Override auto-detected MoEngage identifier type (e.g. "PUSH_ID", "MOE_GAID", "ADVERTISING_IDENTIFIER", "CUSTOM_SEGMENT"). When set, bypasses key-based auto-detection from user_attributes keys entirely. locale_name: Locale name to inject into test_campaign_meta (e.g. "en", "ar"). variation: Variation name to inject into test_campaign_meta (e.g. "A", "B"). campaign_content_override: Replaces the entire auto-built campaign_content section. Highest-precedence override — all channel-specific content params are ignored.

Rate limit: 5/min, 25/hr, 100/day.

Returns: {success: true, recipients_requested, total_success_count, total_failed_count, batches: [{platforms, locale, variation, success_count, failed_count, succeeded: [[...]], failed}], note?: str} on success. When recipients_requested > total_success_count + total_failed_count, a note explains that MoEngage silently skipped recipients without eligible devices for the targeted platform(s). {success: false, error, status_code, api_response} on API error. {success: false, error: ""} on input validation failure.

ParametersJSON Schema
NameRequiredDescriptionDefault
channelYes
campaign_nameYes
user_attributesYes
subjectNo
sender_nameNo
from_addressNo
reply_to_addressNo
connector_typeNo
connector_nameNo
email_content_typeNo
html_contentNo
template_idNo
subscription_categoryNo
preview_textNo
utm_paramsNo
cc_idsNo
bcc_idsNo
custom_template_versionNo
attachmentsNo
platformsNo
push_titleNo
push_messageNo
android_notification_channelNo
android_default_click_actionNo
android_default_click_action_valueNo
android_image_urlNo
android_input_gif_urlNo
android_key_value_pairsNo
android_buttonsNo
android_advancedNo
android_push_content_overrideNo
android_summaryNo
android_push_amp_plus_enabledNo
android_template_typeNo
android_custom_template_idNo
android_custom_template_versionNo
android_timerNo
android_template_backupNo
android_carousel_contentNo
android_background_color_codeNo
android_app_name_color_codeNo
android_notification_control_colorNo
android_include_app_name_and_timeNo
android_include_title_and_messageNo
android_apply_background_color_in_text_editorNo
android_image_scalingNo
android_banner_image_urlNo
android_collapsed_push_notificationNo
ios_titleNo
ios_messageNo
ios_default_click_actionNo
ios_default_click_action_valueNo
ios_subtitleNo
ios_allow_bg_refreshNo
ios_rich_media_typeNo
ios_rich_media_valueNo
ios_image_urlNo
ios_input_gif_urlNo
ios_key_value_pairsNo
ios_background_color_codeNo
ios_apply_background_color_in_text_editorNo
ios_template_typeNo
ios_custom_template_idNo
ios_custom_template_versionNo
ios_template_backupNo
ios_carousel_contentNo
ios_send_to_all_eligible_deviceNo
ios_exclude_provisionalNo
ios_send_to_only_provisionalNo
ios_buttonsNo
ios_advancedNo
ios_push_content_overrideNo
web_redirect_urlNo
web_image_urlNo
web_auto_dismiss_notificationNo
web_buttonsNo
web_advancedNo
web_icon_image_typeNo
web_icon_urlNo
web_push_content_overrideNo
tagsNo
teamNo
business_eventNo
send_to_triggered_platform_onlyNo
broadcast_live_activity_idNo
geofencesNo
localesNo
variation_detailsNo
personalization_detailsNo
identifier_typeNo
locale_nameNo
variationNo
campaign_content_overrideNo

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.4/5.0
Behavior4/5

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

With no annotations, the description covers many behavioral aspects: rate limits, that MoEngage silently skips recipients without eligible devices, the return shape (success/failure with details), and validation failures. It explains parameter overrides (e.g., campaign_content_override replaces all auto-built content). However, it does not explicitly mention that sending test campaigns results in actual messages being sent (destructive in terms of external effect) or authentication needs.

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

Conciseness3/5

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

The description is very long (100+ lines) due to the high parameter count. It is structured with section headers and bullet-like lists, which aids readability. However, some information is repeated (e.g., default values mentioned both in parameter lists and inline notes), and the length could be reduced by relying more on schema descriptions if they were present.

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

Completeness5/5

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

Given the high complexity (93 parameters, no schema descriptions, no annotations), the description is remarkably complete. It covers all parameters with their semantics, mutual exclusions, overrides, return values (success, error, notes), rate limits, platform-specific behaviors, and even edge cases like MoEngage silently skipping recipients. The output schema is fully described.

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

Parameters5/5

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

Schema description coverage is 0%, so the description must fully compensate. It does so by explaining each parameter group (EMAIL, PUSH, SHARED) in detail, including required vs optional, defaults, mutual exclusivity (e.g., html_content and template_id), and behavioral effects (e.g., identifier_type bypasses auto-detection). It also provides examples for user_attributes and notes overrides.

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

Purpose5/5

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

The description clearly states the tool's purpose: 'Send a test Email or Push campaign to specific recipients.' It identifies the verb 'send' and resource 'test campaign', distinguishing it from sibling tools like create_campaign. The specificity of 'test' differentiates it from regular campaign creation or update.

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

Usage Guidelines4/5

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

The description provides extensive usage context, including channel-specific requirements (EMAIL vs PUSH), prerequisites (only API-created campaigns can be tested), rate limits (5/min, 25/hr, 100/day), and examples for user_attributes. However, it does not explicitly state when not to use this tool versus alternatives like create_campaign, though it implies it's for testing only.

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

update_campaignA

Update an existing campaign using PATCH semantics — only provided fields are sent.

All flat params are optional. Only sub-objects where at least one param is set are included in the PATCH payload. Dict overrides replace auto-built sub-objects.

PATCH semantics: When providing a dict override like campaign_content, include ALL fields you want to keep — the API replaces the entire sub-object, not deep merge.

Status restrictions (validated locally before API call):

  • STOPPED / ARCHIVED: All updates rejected.

  • ACTIVE: trigger_condition, segmentation_details, conversion_goal_details, scheduling_details.delivery_type, scheduling_details.start_time blocked.

  • SCHEDULED: scheduling_details.delivery_type blocked.

--- REQUIRED --- campaign_id: Campaign to update. updated_by: Updater email address (must contain @). channel: EMAIL or PUSH.

--- STATUS CONTEXT --- campaign_status: Current status — drives restriction validation. campaign_delivery_type: e.g. EVENT_TRIGGERED — drives cache_warning.

--- EMAIL CONTENT (sends campaign_content when any email param set) --- subject: Email subject line. sender_name: Display name for sender. from_address: Sending email address. reply_to_address: Reply-to address. html_content: Raw HTML body (mutually exclusive with template_id). template_id: Saved template ID (mutually exclusive with html_content). preview_text: Email preheader text. cc_ids: CC email addresses list. bcc_ids: BCC email addresses list. custom_template_version: Template version number override. attachments: List of attachment dicts.

--- PUSH CONTENT (sends campaign_content when any push param set) --- platforms: Target platforms list — ANDROID, IOS, WEB (required for push content). push_title: Notification title (required for push content). push_message: Notification body (required for push content). android_notification_channel: Android channel ID (default: "default"). android_default_click_action: Click action type (default: "DEEPLINKING"). android_default_click_action_value: Deep link URL. android_image_url: Android notification image URL. android_input_gif_url: Android notification GIF URL. android_key_value_pairs: Custom key-value pairs. android_buttons: Android push action buttons list. android_advanced: Android advanced options dict. android_push_content_override: Replaces auto-built Android content block. android_summary: Android notification summary text. android_push_amp_plus_enabled: Enable Push Amplification Plus. android_template_type: BASIC, STYLIZED_BASIC, SIMPLE_IMAGE_CAROUSEL, IMAGE_BANNER_WITH_TEXT, TIMER, TIMER_WITH_PROGRESS_BAR, or Custom. android_custom_template_id: Custom template ID. android_custom_template_version: Custom template version. android_timer: Timer config dict. android_template_backup: Fallback template dict. android_carousel_content: Carousel content dict. android_background_color_code: Hex color for notification background. android_app_name_color_code: Hex color for app name text. android_notification_control_color: LIGHT or DARK. android_include_app_name_and_time: Show app name and time. android_include_title_and_message: Show title and message. android_apply_background_color_in_text_editor: Apply bg color in editor. android_image_scaling: FIT_INSIDE_IMAGE_CONTAINER or FILL_IMAGE_CONTAINER. android_banner_image_url: Banner image URL. android_collapsed_push_notification: Collapsed push style. ios_title: iOS title (falls back to push_title). ios_message: iOS message (falls back to push_message). ios_default_click_action: iOS click action type. ios_default_click_action_value: iOS click action URL. ios_subtitle: iOS notification subtitle. ios_allow_bg_refresh: Allow background refresh. ios_rich_media_type: IMAGE, VIDEO, AUDIO, or GIF. ios_rich_media_value: Rich media URL value. ios_image_url: iOS notification image URL. ios_input_gif_url: iOS notification GIF URL. ios_key_value_pairs: Custom key-value pairs for iOS. ios_background_color_code: Hex color for notification background. ios_apply_background_color_in_text_editor: Apply bg color in editor. ios_template_type: BASIC, STYLIZED_BASIC, SIMPLE_IMAGE_CAROUSEL, or Custom. ios_custom_template_id: Custom template ID. ios_custom_template_version: Custom template version. ios_template_backup: Fallback template dict. ios_carousel_content: Carousel content dict. ios_send_to_all_eligible_device: Send to all eligible iOS devices. ios_exclude_provisional: Exclude provisional push devices. ios_send_to_only_provisional: Send only to provisional. ios_buttons: iOS push action buttons list. ios_advanced: iOS advanced options dict. ios_push_content_override: Replaces auto-built iOS content block. web_redirect_url: Web push redirect URL. web_image_url: Web push notification image URL. web_auto_dismiss_notification: Auto-dismiss web notification. web_buttons: Web push action buttons list. web_advanced: Web advanced options dict. web_icon_image_type: DEFAULT or ICON_URL. web_icon_url: Custom icon URL for web push. web_push_content_override: Replaces auto-built Web content block.

--- BASIC DETAILS (sends basic_details when any param set) --- campaign_name: New campaign name. content_type: PROMOTIONAL or TRANSACTIONAL (EMAIL only). subscription_category: Subscription category (EMAIL PROMOTIONAL only). tags: Campaign tags list (replaces existing tags). team: Team name. business_event: Business event name. send_to_triggered_platform_only: Send only to triggering platform (PUSH). broadcast_live_activity_id: Live Activity broadcast ID (PUSH iOS). geofences: Geofence config dict (PUSH LOCATION_TRIGGERED).

--- SCHEDULING (sends scheduling_details when any param set) --- scheduling_delivery_type: AT_FIXED_TIME, ASAP, SEND_IN_BTS, SEND_IN_USER_TIMEZONE. start_time: ISO 8601 start datetime. Blocked for ACTIVE campaigns. end_time: ISO 8601 expiry datetime. periodic_details: Periodic scheduling config dict. bts_details: Best-time-to-send config dict. user_timezone_details: User timezone config dict.

--- CONNECTOR --- connector_type: Email service provider. connector_name: Connector config name.

--- SEGMENTATION SHORTCUTS --- is_all_user_campaign: Target all users. custom_segment_id: Target a specific segment.

--- UTM --- utm_source, utm_medium, utm_campaign, utm_term, utm_content, utm_custom.

--- DICT OVERRIDES --- basic_details: Full basic_details dict. campaign_content: Full campaign_content dict. scheduling_details: Full scheduling_details dict. segmentation_details: Full segmentation_details dict. Blocked for ACTIVE. connector: Full connector dict. trigger_condition: Full trigger_condition dict. Blocked for ACTIVE. delivery_controls: Full delivery_controls dict. conversion_goal_details: Full conversion_goal_details dict. Blocked for ACTIVE. control_group_details: Full control_group_details dict. utm_params: Full UTM params dict. advanced: Full advanced dict (PUSH only). locales: Locale configuration for A/B testing. variation_details: Variation metadata for A/B testing.

Rate limit: 5/min, 25/hr, 100/day.

Returns: {success: true, campaign_id, dashboard_url} on success. (+ cache_warning if EVENT_TRIGGERED with content changes) {success: false, error, campaign_id} on status restriction. {success: false, error, status_code, api_response} on API error.

ParametersJSON Schema
NameRequiredDescriptionDefault
campaign_idYes
updated_byYes
channelYes
campaign_statusNo
campaign_delivery_typeNo
subjectNo
sender_nameNo
from_addressNo
reply_to_addressNo
html_contentNo
template_idNo
preview_textNo
cc_idsNo
bcc_idsNo
custom_template_versionNo
attachmentsNo
platformsNo
push_titleNo
push_messageNo
android_notification_channelNo
android_default_click_actionNo
android_default_click_action_valueNo
android_image_urlNo
android_input_gif_urlNo
android_key_value_pairsNo
android_buttonsNo
android_advancedNo
android_push_content_overrideNo
android_summaryNo
android_push_amp_plus_enabledNo
android_template_typeNo
android_custom_template_idNo
android_custom_template_versionNo
android_timerNo
android_template_backupNo
android_carousel_contentNo
android_background_color_codeNo
android_app_name_color_codeNo
android_notification_control_colorNo
android_include_app_name_and_timeNo
android_include_title_and_messageNo
android_apply_background_color_in_text_editorNo
android_image_scalingNo
android_banner_image_urlNo
android_collapsed_push_notificationNo
ios_titleNo
ios_messageNo
ios_default_click_actionNo
ios_default_click_action_valueNo
ios_subtitleNo
ios_allow_bg_refreshNo
ios_rich_media_typeNo
ios_rich_media_valueNo
ios_image_urlNo
ios_input_gif_urlNo
ios_key_value_pairsNo
ios_background_color_codeNo
ios_apply_background_color_in_text_editorNo
ios_template_typeNo
ios_custom_template_idNo
ios_custom_template_versionNo
ios_template_backupNo
ios_carousel_contentNo
ios_send_to_all_eligible_deviceNo
ios_exclude_provisionalNo
ios_send_to_only_provisionalNo
ios_buttonsNo
ios_advancedNo
ios_push_content_overrideNo
web_redirect_urlNo
web_image_urlNo
web_auto_dismiss_notificationNo
web_buttonsNo
web_advancedNo
web_icon_image_typeNo
web_icon_urlNo
web_push_content_overrideNo
campaign_nameNo
content_typeNo
subscription_categoryNo
tagsNo
teamNo
business_eventNo
send_to_triggered_platform_onlyNo
broadcast_live_activity_idNo
geofencesNo
scheduling_delivery_typeNo
start_timeNo
end_timeNo
periodic_detailsNo
bts_detailsNo
user_timezone_detailsNo
connector_typeNo
connector_nameNo
is_all_user_campaignNo
custom_segment_idNo
utm_sourceNo
utm_mediumNo
utm_campaignNo
utm_termNo
utm_contentNo
utm_customNo
basic_detailsNo
campaign_contentNo
scheduling_detailsNo
segmentation_detailsNo
connectorNo
trigger_conditionNo
delivery_controlsNo
conversion_goal_detailsNo
control_group_detailsNo
utm_paramsNo
advancedNo
localesNo
variation_detailsNo

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.8/5.0
Behavior5/5

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

No annotations provided, so description fully discloses behavior: PATCH semantics, status-based restrictions (STOPPED/ARCHIVED rejected, ACTIVE/SCHEDULED blocked fields), sub-object replacement with dict overrides, and response structure including cache_warning. Very transparent.

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

Conciseness5/5

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

Well-structured with clear sections and headers, front-loaded with key PATCH semantics and status restrictions. Every sentence adds value given the complexity; no wasted text.

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

Completeness5/5

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

Covers all aspects: input parameters with semantics, PATCH behavior, status restrictions, rate limits, and multiple response formats. Output schema exists but description also clarifies context and error cases. Very complete for a complex tool.

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

Parameters5/5

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

With 0% schema description coverage, the description provides extensive semantic meaning for all 115 parameters, grouping them logically, explaining defaults, mutual exclusivity (e.g., html_content vs template_id), and conditions (e.g., platforms required for push). Far exceeds baseline.

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

Purpose5/5

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

The description begins with 'Update an existing campaign using PATCH semantics', clearly stating the verb and resource. It distinguishes from sibling tools like create_campaign and change_campaign_status by emphasizing incremental update.

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

Usage Guidelines4/5

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

Provides clear guidance on when updates are allowed via status restrictions and rate limits. However, lacks explicit comparison to sibling tools like change_campaign_status or create_campaign, which would help an agent choose between them.

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

update_templateA

Validate, build, and update an existing email template in MoEngage.

Runs TemplateValidator before updating (unless force=True). Returns success status, external_template_id, and structured preview on success. HTML is never exposed to agent context.

Requires external_template_id from MoEngage (obtain via search_templates). Use force=True to bypass validation. Use debug=True to save HTML to temp file for inspection.

ParametersJSON Schema
NameRequiredDescriptionDefault
titleYes
componentsYes
external_template_idYes
template_nameYes
template_versionYes
subjectYes
sender_nameYes
updated_byYes
preview_textNo
forceNo
debugNo

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.1/5.0
Behavior5/5

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

Without annotations, the description fully discloses behavioral traits: runs TemplateValidator unless force=True, returns success status and preview, and explicitly states HTML is never exposed to agent context.

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

Conciseness4/5

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

The description is well-structured with a clear opening sentence and bullet-style details. It is moderately concise, though some sentences could be tighter.

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

Completeness3/5

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

Given 11 parameters (8 required) and no schema descriptions, the description covers key behavioral aspects but lacks detail on parameter semantics. Output schema exists but is not summarized.

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

Parameters2/5

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

Schema description coverage is 0%. The description only explains external_template_id, force, and debug. Other required parameters like title, components, template_name, etc. are not described, leaving significant gaps.

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

Purpose5/5

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

The description clearly states the tool validates, builds, and updates an existing email template in MoEngage. It uses specific verbs and resource, distinguishing it from siblings like search_templates or create_campaign.

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

Usage Guidelines4/5

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

The description explains the prerequisite (obtain external_template_id via search_templates) and provides guidance for optional flags (force=True, debug=True). It implicitly differentiates from alternatives but does not explicitly state 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.

Tool Schema Changelog

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

  1. 18 tool updatesv0.1.0
    • First observedanalyze_template
    • First observedbuild_email_template
    • First observedchange_campaign_status
    • First observedcompare_templates
    • First observedcreate_campaign
    • First observedget_campaign_meta
    • First observedget_campaign_stats
    • First observedget_child_executions
    • First observedget_personalized_preview
    • First observedget_server_info
    • First observedlocalize_template
    • First observedpatch_template_text
    • First observedpublish_template
    • First observedsearch_campaigns
    • First observedsearch_templates
    • First observedtest_campaign
    • First observedupdate_campaign
    • First observedupdate_template

TDQS

A4.4/5.0

Scored across 18 tools

Disambiguation5/5

Every tool targets a distinct operation: template analysis, building, localization, patching, publishing, updating; campaign creation, status changes, searching, metadata retrieval, statistics, child executions, testing; plus personalization previews and server info. No two tools have overlapping purposes.

Naming Consistency5/5

All tools follow a consistent verb_noun pattern in snake_case (e.g., analyze_template, create_campaign, search_templates). The naming is predictable and uniform across the entire tool surface.

Tool Count5/5

With 18 tools covering templates, campaigns, testing, personalization, and metadata, the count is well-scoped for a marketing automation MCP server. Each tool serves a clear purpose without redundancy or unnecessary complexity.

Completeness4/5

Core CRUD and lifecycle operations are covered for both templates and campaigns. However, there is no delete/archive tool for campaigns or templates, which is a minor gap. The missing deletion operations could cause agent failures in cleanup scenarios.

Maintenance

ActivitySlowing
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    D
    maintenance
    MCP server for Rule.io marketing automation platform. Enables managing subscribers, tags, campaigns, custom fields, and automations through the MCP interface.
    MIT
  • A
    license
    B
    quality
    B
    maintenance
    MCP server for Brevo email marketing platform enabling campaign management, analytics, and automation through natural language.
    15
    227 npm
    MIT
  • F
    license
    Not graded
    quality
    D
    maintenance
    This MCP server provides a modern web interface and a set of tools for interacting with the Facebook Marketing API, enabling campaign management, ad set operations, and insights retrieval. It supports multiple connection modes including STDIO, SSE, and HTTP.
    -
  • A
    license
    Not graded
    quality
    F
    maintenance
    MCP server for managing cold email campaigns, leads, email accounts, sequences, analytics, webhooks, and client sub-accounts via the Smartlead API.
    22 npm
    7
    MIT