moengage-mcp
This MCP server integrates with the MoEngage marketing platform, enabling headless management of campaigns and email templates via API-key authentication.
Campaign Management
Search & Retrieve: Search campaigns with filters (channel, status, delivery type, tags, date range) including full targeting/segmentation details. Retrieve campaign metadata (status, channel, reachability counts) and individual executions of recurring campaigns.
Personalized Previews: Render campaign content with
{{UserAttribute[...]}}and{{EventAttribute[...]}}placeholders resolved for sample data.Create & Update: Create Email or Push campaigns with extensive options (scheduling, segmentation, UTM, A/B testing, etc.) and patch existing campaigns with status-aware validation.
Lifecycle Management: Stop, pause, or resume 1–10 campaigns in a single call.
Testing: Send real test emails or push notifications to specific recipients.
Stats: (Currently disabled upstream) Performance statistics including delivery funnel and conversion goals.
Email Template Management
Search & Analyze: Search templates by name, ID, source, type, or creator. Parse a template's HTML into a structured content map (text nodes, images, Jinja expressions) without exposing raw HTML.
Compare: Structured diff of two templates' text content (e.g., original vs. translated).
Build & Publish: Compose and validate templates from components, then publish to MoEngage.
Update & Localize: Update existing templates, create translated/localized market variants (with RTL and image override support), or patch specific text nodes without a full rebuild.
Server Utilities
Retrieve server metadata including configured data center and dashboard base URL.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@moengage-mcpsearch for email campaigns targeting users who logged in this week"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
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 |
| no | Search/filter campaigns; returns config including the full targeting filter tree ( |
| no | Thin identity view: status, channel, delivery type, team, tags, dates (no targeting) |
| no | Individual runs of a recurring (periodic) campaign |
| no | Render campaign content with placeholders resolved for sample attributes |
| no | ⚠ Disabled upstream — hidden unless |
| yes | Create a campaign; auto-supplies required |
| yes | Update campaign config |
| yes | Activate / pause / stop a campaign |
| yes | Send a real test push/email to named recipients |
Custom segments (3)
Tool | Mutates | Purpose |
| 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) |
| no | Get one segment's definition by id, or list all custom segments |
| yes | Archive (deferred delete, ~30d purge) or restore a segment |
Email templates (9)
Tool | Mutates | Purpose |
| no | Search templates with filters and pagination |
| no | Parse template HTML into structured content nodes |
| no | Structured diff of two templates |
| no | Build + validate a template, return a structured preview (no publish); |
| no | Data center + dashboard base URL |
| yes | Build + validate + publish to MoEngage |
| yes | Update an existing template |
| yes | Publish a translated market variant |
| 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 # stdioClaude Code / Claude Desktop config:
{
"mcpServers": {
"moengage": {
"type": "stdio",
"command": "moengage-mcp"
}
}
}Configuration
Environment variables (or a local .env, see .env.example):
Variable | Required | Description |
| yes | Campaign/Content API key (dashboard → Settings → APIs) |
| 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 |
| yes | Workspace (app) ID |
| yes | Regional DC, e.g. |
| no | Brand links for the email footer component — inline JSON or a file path (schema in |
| no | Set |
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.mddocuments 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 toolsanalyze_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.
| Name | Required | Description | Default |
|---|---|---|---|
| external_template_id | Yes | ||
| version | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| title | Yes | ||
| components | Yes | ||
| debug | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| action | Yes | ||
| campaign_ids | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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
| Name | Required | Description | Default |
|---|---|---|---|
| template_a_id | Yes | external_template_id of template A (e.g. English original). | |
| template_b_id | Yes | external_template_id of template B (e.g. Spanish translation). |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| channel | Yes | ||
| campaign_delivery_type | Yes | ||
| created_by | Yes | ||
| campaign_name | No | ||
| subject | No | ||
| sender_name | No | ||
| from_address | No | ||
| reply_to_address | No | ||
| html_content | No | ||
| template_id | No | ||
| preview_text | No | ||
| cc_ids | No | ||
| bcc_ids | No | ||
| custom_template_version | No | ||
| attachments | No | ||
| platforms | No | ||
| push_title | No | ||
| push_message | No | ||
| android_notification_channel | No | ||
| android_default_click_action | No | ||
| android_default_click_action_value | No | ||
| android_image_url | No | ||
| android_input_gif_url | No | ||
| android_key_value_pairs | No | ||
| android_buttons | No | ||
| android_advanced | No | ||
| android_push_content_override | No | ||
| android_summary | No | ||
| android_push_amp_plus_enabled | No | ||
| android_template_type | No | ||
| android_custom_template_id | No | ||
| android_custom_template_version | No | ||
| android_timer | No | ||
| android_template_backup | No | ||
| android_carousel_content | No | ||
| android_background_color_code | No | ||
| android_app_name_color_code | No | ||
| android_notification_control_color | No | ||
| android_include_app_name_and_time | No | ||
| android_include_title_and_message | No | ||
| android_apply_background_color_in_text_editor | No | ||
| android_image_scaling | No | ||
| android_banner_image_url | No | ||
| android_collapsed_push_notification | No | ||
| ios_title | No | ||
| ios_message | No | ||
| ios_default_click_action | No | ||
| ios_default_click_action_value | No | ||
| ios_subtitle | No | ||
| ios_allow_bg_refresh | No | ||
| ios_rich_media_type | No | ||
| ios_rich_media_value | No | ||
| ios_image_url | No | ||
| ios_input_gif_url | No | ||
| ios_key_value_pairs | No | ||
| ios_background_color_code | No | ||
| ios_apply_background_color_in_text_editor | No | ||
| ios_template_type | No | ||
| ios_custom_template_id | No | ||
| ios_custom_template_version | No | ||
| ios_template_backup | No | ||
| ios_carousel_content | No | ||
| ios_send_to_all_eligible_device | No | ||
| ios_exclude_provisional | No | ||
| ios_send_to_only_provisional | No | ||
| ios_buttons | No | ||
| ios_advanced | No | ||
| ios_push_content_override | No | ||
| web_redirect_url | No | ||
| web_image_url | No | ||
| web_auto_dismiss_notification | No | ||
| web_buttons | No | ||
| web_advanced | No | ||
| web_icon_image_type | No | ||
| web_icon_url | No | ||
| web_push_content_override | No | ||
| content_type | No | ||
| subscription_category | No | ||
| tags | No | ||
| team | No | ||
| business_event | No | ||
| send_to_triggered_platform_only | No | ||
| broadcast_live_activity_id | No | ||
| geofences | No | ||
| scheduling_delivery_type | No | ||
| start_time | No | ||
| end_time | No | ||
| periodic_details | No | ||
| bts_details | No | ||
| user_timezone_details | No | ||
| connector_type | No | ||
| connector_name | No | ||
| is_all_user_campaign | No | ||
| custom_segment_id | No | ||
| utm_source | No | ||
| utm_medium | No | ||
| utm_campaign | No | ||
| utm_term | No | ||
| utm_content | No | ||
| utm_custom | No | ||
| basic_details | No | ||
| campaign_content | No | ||
| scheduling_details | No | ||
| segmentation_details | No | ||
| connector | No | ||
| trigger_condition | No | ||
| delivery_controls | No | ||
| conversion_goal_details | No | ||
| control_group_details | No | ||
| utm_params | No | ||
| advanced | No | ||
| campaign_audience_limit | No | ||
| locales | No | ||
| variation_details | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| campaign_id | No | ||
| channels | No | ||
| delivery_type | No | ||
| status | No | ||
| created_by | No | ||
| created_date_from | No | ||
| created_date_to | No | ||
| name | No | ||
| tags | No | ||
| page | No | ||
| limit | No | ||
| include_child_campaigns | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| start_date | Yes | ||
| end_date | Yes | ||
| attribution_type | Yes | ||
| metric_type | Yes | ||
| campaign_ids | No | ||
| offset | No | ||
| limit | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| parent_campaign_id | Yes | ||
| page | No | ||
| limit | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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).
| Name | Required | Description | Default |
|---|---|---|---|
| channel | Yes | ||
| personalization_details | Yes | ||
| payload | No | ||
| custom_template_data | No | ||
| user_details | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| source_external_template_id | Yes | ||
| translations | Yes | ||
| target_locale | Yes | ||
| target_template_id | Yes | ||
| target_template_name | Yes | ||
| target_template_version | Yes | ||
| subject | Yes | ||
| sender_name | Yes | ||
| created_by | Yes | ||
| preview_text | No | ||
| publish | No | ||
| force | No | ||
| image_overrides | No | ||
| rtl | No | ||
| source_version | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| external_template_id | Yes | ||
| patches | Yes | ||
| new_version | Yes | ||
| updated_by | Yes | ||
| subject | No | ||
| publish | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| title | Yes | ||
| components | Yes | ||
| template_id | Yes | ||
| template_name | Yes | ||
| template_version | Yes | ||
| subject | Yes | ||
| sender_name | Yes | ||
| created_by | Yes | ||
| preview_text | No | ||
| force | No | ||
| debug | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| channels | No | ||
| delivery_type | No | ||
| status | No | ||
| created_by | No | ||
| created_date_from | No | ||
| created_date_to | No | ||
| campaign_id | No | ||
| name | No | ||
| tags | No | ||
| page | No | ||
| limit | No | ||
| include_child_campaigns | No | ||
| include_archive_campaigns | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| template_name | No | ||
| template_id | No | ||
| external_template_id | No | ||
| page | No | ||
| entries | No | ||
| template_source | No | ||
| template_type | No | ||
| version | No | ||
| created_by | No | ||
| updated_by | No | ||
| sort_by | No | ||
| sort_order | No | ||
| include_html | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| channel | Yes | ||
| campaign_name | Yes | ||
| user_attributes | Yes | ||
| subject | No | ||
| sender_name | No | ||
| from_address | No | ||
| reply_to_address | No | ||
| connector_type | No | ||
| connector_name | No | ||
| email_content_type | No | ||
| html_content | No | ||
| template_id | No | ||
| subscription_category | No | ||
| preview_text | No | ||
| utm_params | No | ||
| cc_ids | No | ||
| bcc_ids | No | ||
| custom_template_version | No | ||
| attachments | No | ||
| platforms | No | ||
| push_title | No | ||
| push_message | No | ||
| android_notification_channel | No | ||
| android_default_click_action | No | ||
| android_default_click_action_value | No | ||
| android_image_url | No | ||
| android_input_gif_url | No | ||
| android_key_value_pairs | No | ||
| android_buttons | No | ||
| android_advanced | No | ||
| android_push_content_override | No | ||
| android_summary | No | ||
| android_push_amp_plus_enabled | No | ||
| android_template_type | No | ||
| android_custom_template_id | No | ||
| android_custom_template_version | No | ||
| android_timer | No | ||
| android_template_backup | No | ||
| android_carousel_content | No | ||
| android_background_color_code | No | ||
| android_app_name_color_code | No | ||
| android_notification_control_color | No | ||
| android_include_app_name_and_time | No | ||
| android_include_title_and_message | No | ||
| android_apply_background_color_in_text_editor | No | ||
| android_image_scaling | No | ||
| android_banner_image_url | No | ||
| android_collapsed_push_notification | No | ||
| ios_title | No | ||
| ios_message | No | ||
| ios_default_click_action | No | ||
| ios_default_click_action_value | No | ||
| ios_subtitle | No | ||
| ios_allow_bg_refresh | No | ||
| ios_rich_media_type | No | ||
| ios_rich_media_value | No | ||
| ios_image_url | No | ||
| ios_input_gif_url | No | ||
| ios_key_value_pairs | No | ||
| ios_background_color_code | No | ||
| ios_apply_background_color_in_text_editor | No | ||
| ios_template_type | No | ||
| ios_custom_template_id | No | ||
| ios_custom_template_version | No | ||
| ios_template_backup | No | ||
| ios_carousel_content | No | ||
| ios_send_to_all_eligible_device | No | ||
| ios_exclude_provisional | No | ||
| ios_send_to_only_provisional | No | ||
| ios_buttons | No | ||
| ios_advanced | No | ||
| ios_push_content_override | No | ||
| web_redirect_url | No | ||
| web_image_url | No | ||
| web_auto_dismiss_notification | No | ||
| web_buttons | No | ||
| web_advanced | No | ||
| web_icon_image_type | No | ||
| web_icon_url | No | ||
| web_push_content_override | No | ||
| tags | No | ||
| team | No | ||
| business_event | No | ||
| send_to_triggered_platform_only | No | ||
| broadcast_live_activity_id | No | ||
| geofences | No | ||
| locales | No | ||
| variation_details | No | ||
| personalization_details | No | ||
| identifier_type | No | ||
| locale_name | No | ||
| variation | No | ||
| campaign_content_override | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| campaign_id | Yes | ||
| updated_by | Yes | ||
| channel | Yes | ||
| campaign_status | No | ||
| campaign_delivery_type | No | ||
| subject | No | ||
| sender_name | No | ||
| from_address | No | ||
| reply_to_address | No | ||
| html_content | No | ||
| template_id | No | ||
| preview_text | No | ||
| cc_ids | No | ||
| bcc_ids | No | ||
| custom_template_version | No | ||
| attachments | No | ||
| platforms | No | ||
| push_title | No | ||
| push_message | No | ||
| android_notification_channel | No | ||
| android_default_click_action | No | ||
| android_default_click_action_value | No | ||
| android_image_url | No | ||
| android_input_gif_url | No | ||
| android_key_value_pairs | No | ||
| android_buttons | No | ||
| android_advanced | No | ||
| android_push_content_override | No | ||
| android_summary | No | ||
| android_push_amp_plus_enabled | No | ||
| android_template_type | No | ||
| android_custom_template_id | No | ||
| android_custom_template_version | No | ||
| android_timer | No | ||
| android_template_backup | No | ||
| android_carousel_content | No | ||
| android_background_color_code | No | ||
| android_app_name_color_code | No | ||
| android_notification_control_color | No | ||
| android_include_app_name_and_time | No | ||
| android_include_title_and_message | No | ||
| android_apply_background_color_in_text_editor | No | ||
| android_image_scaling | No | ||
| android_banner_image_url | No | ||
| android_collapsed_push_notification | No | ||
| ios_title | No | ||
| ios_message | No | ||
| ios_default_click_action | No | ||
| ios_default_click_action_value | No | ||
| ios_subtitle | No | ||
| ios_allow_bg_refresh | No | ||
| ios_rich_media_type | No | ||
| ios_rich_media_value | No | ||
| ios_image_url | No | ||
| ios_input_gif_url | No | ||
| ios_key_value_pairs | No | ||
| ios_background_color_code | No | ||
| ios_apply_background_color_in_text_editor | No | ||
| ios_template_type | No | ||
| ios_custom_template_id | No | ||
| ios_custom_template_version | No | ||
| ios_template_backup | No | ||
| ios_carousel_content | No | ||
| ios_send_to_all_eligible_device | No | ||
| ios_exclude_provisional | No | ||
| ios_send_to_only_provisional | No | ||
| ios_buttons | No | ||
| ios_advanced | No | ||
| ios_push_content_override | No | ||
| web_redirect_url | No | ||
| web_image_url | No | ||
| web_auto_dismiss_notification | No | ||
| web_buttons | No | ||
| web_advanced | No | ||
| web_icon_image_type | No | ||
| web_icon_url | No | ||
| web_push_content_override | No | ||
| campaign_name | No | ||
| content_type | No | ||
| subscription_category | No | ||
| tags | No | ||
| team | No | ||
| business_event | No | ||
| send_to_triggered_platform_only | No | ||
| broadcast_live_activity_id | No | ||
| geofences | No | ||
| scheduling_delivery_type | No | ||
| start_time | No | ||
| end_time | No | ||
| periodic_details | No | ||
| bts_details | No | ||
| user_timezone_details | No | ||
| connector_type | No | ||
| connector_name | No | ||
| is_all_user_campaign | No | ||
| custom_segment_id | No | ||
| utm_source | No | ||
| utm_medium | No | ||
| utm_campaign | No | ||
| utm_term | No | ||
| utm_content | No | ||
| utm_custom | No | ||
| basic_details | No | ||
| campaign_content | No | ||
| scheduling_details | No | ||
| segmentation_details | No | ||
| connector | No | ||
| trigger_condition | No | ||
| delivery_controls | No | ||
| conversion_goal_details | No | ||
| control_group_details | No | ||
| utm_params | No | ||
| advanced | No | ||
| locales | No | ||
| variation_details | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| title | Yes | ||
| components | Yes | ||
| external_template_id | Yes | ||
| template_name | Yes | ||
| template_version | Yes | ||
| subject | Yes | ||
| sender_name | Yes | ||
| updated_by | Yes | ||
| preview_text | No | ||
| force | No | ||
| debug | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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.
18 tool updates
v0.1.0- First observed
analyze_template - First observed
build_email_template - First observed
change_campaign_status - First observed
compare_templates - First observed
create_campaign - First observed
get_campaign_meta - First observed
get_campaign_stats - First observed
get_child_executions - First observed
get_personalized_preview - First observed
get_server_info - First observed
localize_template - First observed
patch_template_text - First observed
publish_template - First observed
search_campaigns - First observed
search_templates - First observed
test_campaign - First observed
update_campaign - First observed
update_template
TDQS
Scored across 18 tools
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.
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.
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.
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
Related MCP Connectors
Marketing intelligence MCP server providing campaign performance data and analytics tools.
MCP server for Appcircle mobile CI/CD platform.
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceMCP server for Rule.io marketing automation platform. Enables managing subscribers, tags, campaigns, custom fields, and automations through the MCP interface.MIT
- AlicenseBqualityBmaintenanceMCP server for Brevo email marketing platform enabling campaign management, analytics, and automation through natural language.15227 npmMIT
- FlicenseNot gradedqualityDmaintenanceThis 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.-
- AlicenseNot gradedqualityFmaintenanceMCP server for managing cold email campaigns, leads, email accounts, sequences, analytics, webhooks, and client sub-accounts via the Smartlead API.22 npm7MIT