- 'companyId' arguments must exactly match an 'id' returned by 'list_user_companies'.
- When the user names a company, use 'list_user_companies' to resolve its 'id', then call 'switch_company' before using company-scoped tools.
- After a successful 'switch_company', refresh the available tool list before selecting a company-scoped tool. The full set of tools is filtered such that only tools that the user and company are authorized to use are available.
Protocol
Pass100/10020 / 20 pts
Connection, authentication, and protocol compatibility.
The title clearly communicates the tool’s action and subject. Keep it concise.
Description96/100
List analytics metrics for this company from the metrics catalog. Returns each metric's ID (for query_metrics), name, description, data type, domain, and dimensions (including date granularities). Call before query_metrics.
Optional metricIds: filter to specific metrics and receive commonDateGranularities — the date granularities valid for a single batch query_metrics call (intersection across all listed metrics; matches metrics-api validation).
The description explains the capability, when to use it, and what to expect.
Inputs97/100
Input documentation gives an agent enough context to populate the arguments.
metricIds
If provided, only return catalog rows for these metric IDs. Also returns commonDateGranularities: the intersection of supported date granularities across this subset (matches metrics-api batch rules for query_metrics groupByTime). Omit to return the full catalog.
Clear enough to supply this argument.
userRequestId
Optional universal MCP-server telemetry only. Generate a UUID4 and reuse the same UUID4 for all tool calls caused by the same human request.
Clear enough to supply this argument.
endUserIntentSummary
Optional MCP-server telemetry only. Summarize the immediate human-requested outcome that caused this tool call. Do not include tool-selection rationale.
No output schema is declared. Add one for structured results so clients can interpret returned fields.
Not declared
Original tool metadata
{
"name": "list_metrics",
"title": "List Available Metrics",
"description": "List analytics metrics for this company from the metrics catalog. Returns each metric's ID (for query_metrics), name, description, data type, domain, and dimensions (including date granularities). Call before query_metrics.\n\nOptional metricIds: filter to specific metrics and receive commonDateGranularities — the date granularities valid for a single batch query_metrics call (intersection across all listed metrics; matches metrics-api validation).",
"inputSchema": {
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"metricIds": {
"type": "array",
"items": {
"type": "string"
},
"description": "If provided, only return catalog rows for these metric IDs. Also returns commonDateGranularities: the intersection of supported date granularities across this subset (matches metrics-api batch rules for query_metrics groupByTime). Omit to return the full catalog."
},
"userRequestId": {
"type": "string",
"description": "Optional universal MCP-server telemetry only. Generate a UUID4 and reuse the same UUID4 for all tool calls caused by the same human request."
},
"endUserIntentSummary": {
"type": "string",
"description": "Optional MCP-server telemetry only. Summarize the immediate human-requested outcome that caused this tool call. Do not include tool-selection rationale."
}
}
},
"annotations": {
"title": "List Available Metrics",
"readOnlyHint": true,
"openWorldHint": false,
"idempotentHint": true,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description98/100
Query analytics metrics for this company over a date range. Returns aggregate totals and, if groupByTime or groupByDimensions is set, all grouped rows (the server paginates metricsTable in pages of 1000 edges until complete; paginationPagesFetched reports how many GraphQL calls were used). Use list_metrics first to discover valid metric IDs; when batching multiple metrics with groupByTime, every metric must support that granularity on the date dimension (call list_metrics with metricIds to get commonDateGranularities).
IMPORTANT: Some metrics (e.g. creative_impressions_v2, _v2 metrics) require a dimension grouping to return non-null aggregates — add groupByDimensions: ["creative_id"] if aggregates are null. Check aggregateErrors in the response to understand why any metric returned null.
The description explains the capability, when to use it, and what to expect.
Inputs94/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
metricIds
One or more metric IDs to query. Use list_metrics to discover valid IDs (e.g. "campaign_revenue_aggregate_group").
Clear enough to supply this argument.
startDate
Start date in YYYY-MM-DD format.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
endDate
End date in YYYY-MM-DD format. Defaults to today.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
groupByTime
Time granularity for grouping rows. Omit to return only aggregate totals with no time breakdown. Must be listed on the date dimension for every metric in metricIds (intersection); use list_metrics with the same metricIds to read commonDateGranularities.
Clear enough to supply this argument.
groupByDimensions
Additional dimensions to group rows by (e.g. "creative_id", "campaign"). Some metrics — particularly creative_impressions_v2 and other _v2 metrics — require at least one dimension grouping to return non-null aggregates. Use list_metrics to see which dimensions each metric supports.
Clear enough to supply this argument.
filters › items › dimension
Dimension ID to filter on (e.g. "channel", "creative_id"). Must be a dimension supported by the requested metrics — use list_metrics to check.
Clear enough to supply this argument.
filters › items › values
Values to include (IN filter).
Clear enough to supply this argument.
userRequestId
Optional universal MCP-server telemetry only. Generate a UUID4 and reuse the same UUID4 for all tool calls caused by the same human request.
Clear enough to supply this argument.
endUserIntentSummary
Optional MCP-server telemetry only. Summarize the immediate human-requested outcome that caused this tool call. Do not include tool-selection rationale.
No output schema is declared. Add one for structured results so clients can interpret returned fields.
Not declared
Original tool metadata
{
"name": "query_metrics",
"title": "Query Analytics Metrics",
"description": "Query analytics metrics for this company over a date range. Returns aggregate totals and, if groupByTime or groupByDimensions is set, all grouped rows (the server paginates metricsTable in pages of 1000 edges until complete; paginationPagesFetched reports how many GraphQL calls were used). Use list_metrics first to discover valid metric IDs; when batching multiple metrics with groupByTime, every metric must support that granularity on the date dimension (call list_metrics with metricIds to get commonDateGranularities).\n\nIMPORTANT: Some metrics (e.g. creative_impressions_v2, _v2 metrics) require a dimension grouping to return non-null aggregates — add groupByDimensions: [\"creative_id\"] if aggregates are null. Check aggregateErrors in the response to understand why any metric returned null.",
"inputSchema": {
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"metricIds",
"startDate"
],
"properties": {
"endDate": {
"type": "string",
"pattern": "^\\d{4}-\\d{2}-\\d{2}$",
"description": "End date in YYYY-MM-DD format. Defaults to today."
},
"filters": {
"type": "array",
"items": {
"type": "object",
"required": [
"dimension",
"values"
],
"properties": {
"values": {
"type": "array",
"items": {
"type": "string"
},
"description": "Values to include (IN filter)."
},
"dimension": {
"type": "string",
"description": "Dimension ID to filter on (e.g. \"channel\", \"creative_id\"). Must be a dimension supported by the requested metrics — use list_metrics to check."
}
}
},
"description": "Optional dimension filters. The date range is always applied automatically."
},
"metricIds": {
"type": "array",
"items": {
"type": "string"
},
"minItems": 1,
"description": "One or more metric IDs to query. Use list_metrics to discover valid IDs (e.g. \"campaign_revenue_aggregate_group\")."
},
"startDate": {
"type": "string",
"pattern": "^\\d{4}-\\d{2}-\\d{2}$",
"description": "Start date in YYYY-MM-DD format."
},
"groupByTime": {
"enum": [
"TIME_DIMENSION_GRANULARITY_DAILY",
"TIME_DIMENSION_GRANULARITY_WEEKLY",
"TIME_DIMENSION_GRANULARITY_MONTHLY",
"TIME_DIMENSION_GRANULARITY_YEARLY"
],
"type": "string",
"description": "Time granularity for grouping rows. Omit to return only aggregate totals with no time breakdown. Must be listed on the date dimension for every metric in metricIds (intersection); use list_metrics with the same metricIds to read commonDateGranularities."
},
"userRequestId": {
"type": "string",
"description": "Optional universal MCP-server telemetry only. Generate a UUID4 and reuse the same UUID4 for all tool calls caused by the same human request."
},
"groupByDimensions": {
"type": "array",
"items": {
"type": "string"
},
"description": "Additional dimensions to group rows by (e.g. \"creative_id\", \"campaign\"). Some metrics — particularly creative_impressions_v2 and other _v2 metrics — require at least one dimension grouping to return non-null aggregates. Use list_metrics to see which dimensions each metric supports."
},
"endUserIntentSummary": {
"type": "string",
"description": "Optional MCP-server telemetry only. Summarize the immediate human-requested outcome that caused this tool call. Do not include tool-selection rationale."
}
}
},
"annotations": {
"title": "Query Analytics Metrics",
"readOnlyHint": true,
"openWorldHint": false,
"idempotentHint": true,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description65/100
List brand assets (images, folders) for a company.
Describe the returned information so the agent knows whether it will answer the request.
Inputs78/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
first
Number of assets to return
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
after
Cursor for pagination
Explain the meaning of this value, not just its name.
search
Search assets by name (partial match)
Clear enough to supply this argument.
folderId
Filter assets within a specific folder
Clarify units, where to obtain this value, or conventions not already expressed in the schema.
userRequestId
Optional universal MCP-server telemetry only. Generate a UUID4 and reuse the same UUID4 for all tool calls caused by the same human request.
Clear enough to supply this argument.
endUserIntentSummary
Optional MCP-server telemetry only. Summarize the immediate human-requested outcome that caused this tool call. Do not include tool-selection rationale.
The title clearly communicates the tool’s action and subject. Keep it concise.
Description84/100
Get the company's email brand kit styles (buttons, headings, paragraphs, dividers, images, rows, spacers, titles, and template-wide defaults). Use `initialized=false` to detect a company that has never customized brand styles.
The description explains the capability, when to use it, and what to expect.
Inputs97/100
Input documentation gives an agent enough context to populate the arguments.
userRequestId
Optional universal MCP-server telemetry only. Generate a UUID4 and reuse the same UUID4 for all tool calls caused by the same human request.
Clear enough to supply this argument.
endUserIntentSummary
Optional MCP-server telemetry only. Summarize the immediate human-requested outcome that caused this tool call. Do not include tool-selection rationale.
The title clearly communicates the tool’s action and subject. Keep it concise.
Description96/100
Returns the company's selected brand fonts in the exact shape the email brand kit form persists. Use a `fonts[].fontFamily` value verbatim as the `fontFamily` field of an EmailBrandingStylesInput module (button, paragraph, h1, h2, h3) or as `general.defaultFont`. Use a `fonts[].weights[].fontWeight` value verbatim as the `fontWeight` field of the same module. Empty `fonts` means the company has not configured brand fonts.
The description explains the capability, when to use it, and what to expect.
Inputs98/100
Input documentation gives an agent enough context to populate the arguments.
userRequestId
Optional universal MCP-server telemetry only. Generate a UUID4 and reuse the same UUID4 for all tool calls caused by the same human request.
Clear enough to supply this argument.
endUserIntentSummary
Optional MCP-server telemetry only. Summarize the immediate human-requested outcome that caused this tool call. Do not include tool-selection rationale.
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"fonts"
],
"properties": {
"fonts": {
"type": "array",
"items": {
"type": "object",
"required": [
"label",
"fontFamily",
"weights"
],
"properties": {
"label": {
"type": "string",
"description": "Friendly font family name (e.g. \"Inter\")."
},
"weights": {
"type": "array",
"items": {
"type": "object",
"required": [
"label",
"fontWeight"
],
"properties": {
"label": {
"type": "string",
"description": "Human-readable weight name (e.g. \"Regular\", \"Bold\"). May be empty if the variant weight falls outside the standard 100-900 scale."
},
"fontWeight": {
"type": "string",
"description": "Numeric font weight as a string (e.g. \"400\", \"700\"). Pass this verbatim as the `fontWeight` field of an EmailBrandingStylesInput module (button, paragraph, h1, h2, h3)."
}
},
"additionalProperties": false
},
"description": "Weights this font family supports, sorted ascending. Pick one and pass its `fontWeight` value to the same module the `fontFamily` is set on."
},
"fontFamily": {
"type": "string",
"description": "CSS font-family stack with quoted family name and fallback (e.g. \"'Inter', 'Arial', sans-serif\"). Pass this verbatim as the `fontFamily` field of an EmailBrandingStylesInput module (button, paragraph, h1, h2, h3) or as `general.defaultFont`."
}
},
"additionalProperties": false
},
"description": "The company's selected brand fonts, sorted alphabetically by `label`. Empty when the company has not configured brand fonts."
}
},
"additionalProperties": false
}
Original tool metadata
{
"name": "list_email_brand_kit_compatible_fonts",
"title": "List Email Brand Kit Compatible Fonts",
"description": "Returns the company's selected brand fonts in the exact shape the email brand kit form persists. Use a `fonts[].fontFamily` value verbatim as the `fontFamily` field of an EmailBrandingStylesInput module (button, paragraph, h1, h2, h3) or as `general.defaultFont`. Use a `fonts[].weights[].fontWeight` value verbatim as the `fontWeight` field of the same module. Empty `fonts` means the company has not configured brand fonts.",
"inputSchema": {
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"userRequestId": {
"type": "string",
"description": "Optional universal MCP-server telemetry only. Generate a UUID4 and reuse the same UUID4 for all tool calls caused by the same human request."
},
"endUserIntentSummary": {
"type": "string",
"description": "Optional MCP-server telemetry only. Summarize the immediate human-requested outcome that caused this tool call. Do not include tool-selection rationale."
}
}
},
"outputSchema": {
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"fonts"
],
"properties": {
"fonts": {
"type": "array",
"items": {
"type": "object",
"required": [
"label",
"fontFamily",
"weights"
],
"properties": {
"label": {
"type": "string",
"description": "Friendly font family name (e.g. \"Inter\")."
},
"weights": {
"type": "array",
"items": {
"type": "object",
"required": [
"label",
"fontWeight"
],
"properties": {
"label": {
"type": "string",
"description": "Human-readable weight name (e.g. \"Regular\", \"Bold\"). May be empty if the variant weight falls outside the standard 100-900 scale."
},
"fontWeight": {
"type": "string",
"description": "Numeric font weight as a string (e.g. \"400\", \"700\"). Pass this verbatim as the `fontWeight` field of an EmailBrandingStylesInput module (button, paragraph, h1, h2, h3)."
}
},
"additionalProperties": false
},
"description": "Weights this font family supports, sorted ascending. Pick one and pass its `fontWeight` value to the same module the `fontFamily` is set on."
},
"fontFamily": {
"type": "string",
"description": "CSS font-family stack with quoted family name and fallback (e.g. \"'Inter', 'Arial', sans-serif\"). Pass this verbatim as the `fontFamily` field of an EmailBrandingStylesInput module (button, paragraph, h1, h2, h3) or as `general.defaultFont`."
}
},
"additionalProperties": false
},
"description": "The company's selected brand fonts, sorted alphabetically by `label`. Empty when the company has not configured brand fonts."
}
},
"additionalProperties": false
},
"annotations": {
"title": "List Email Brand Kit Compatible Fonts",
"readOnlyHint": true,
"openWorldHint": false,
"idempotentHint": true,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description88/100
Get the company's AI brand voice settings: tone keywords, excluded words, emoji frequency, all-caps usage, urgency, product-title casing, and target message length (character/word/emoji/all-caps counts). Read these before drafting or planning email or SMS copy so generated content matches the brand voice.
The description explains the capability, when to use it, and what to expect.
Inputs97/100
Input documentation gives an agent enough context to populate the arguments.
userRequestId
Optional universal MCP-server telemetry only. Generate a UUID4 and reuse the same UUID4 for all tool calls caused by the same human request.
Clear enough to supply this argument.
endUserIntentSummary
Optional MCP-server telemetry only. Summarize the immediate human-requested outcome that caused this tool call. Do not include tool-selection rationale.
The title clearly communicates the tool’s action and subject. Keep it concise.
Description79/100
Get detailed campaign info by ID, including message groups and messages.
The description explains the capability, when to use it, and what to expect.
Inputs75/100
Explain the meaning of this value, not just its name.
campaignId
The campaign ID
Explain the meaning of this value, not just its name.
userRequestId
Optional universal MCP-server telemetry only. Generate a UUID4 and reuse the same UUID4 for all tool calls caused by the same human request.
Clear enough to supply this argument.
endUserIntentSummary
Optional MCP-server telemetry only. Summarize the immediate human-requested outcome that caused this tool call. Do not include tool-selection rationale.
The title clearly communicates the tool’s action and subject. Keep it concise.
Description98/100
Get SMS campaign performance metrics for a company over a date range (defaults to the last 30 days). Returns query-wide aggregate values and one page of grouped campaign rows for delivered, clicks, click rate, conversions, conversion rate, revenue, AOV, revenue per send, unsubscribes, unsubscribe rate, and fatigues. To retrieve another page, pass pageInfo.endCursor as after, pass the previous response dateRange as startDate and endDate, and keep the campaign filter unchanged. Continue until pageInfo.hasNextPage is false. Optionally filter by campaign name.
The description explains the capability, when to use it, and what to expect.
Inputs89/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
startDate
Start date in YYYY-MM-DD format. Defaults to 30 days ago.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
endDate
End date in YYYY-MM-DD format. Defaults to today.
Clear enough to supply this argument.
campaignName
Optional campaign name to filter metrics for a specific campaign
Clear enough to supply this argument.
first
Number of grouped metric rows to return (max 1000, default 1000).
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
after
Opaque pageInfo.endCursor from the previous page. When provided, startDate and endDate are required and must match the previous response dateRange; keep the campaign filter unchanged.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
userRequestId
Optional universal MCP-server telemetry only. Generate a UUID4 and reuse the same UUID4 for all tool calls caused by the same human request.
Clear enough to supply this argument.
endUserIntentSummary
Optional MCP-server telemetry only. Summarize the immediate human-requested outcome that caused this tool call. Do not include tool-selection rationale.
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"companyId",
"companyName",
"dateRange",
"aggregates",
"rows",
"totalGroupedRowCount",
"pageInfo"
],
"properties": {
"rows": {
"type": "array",
"items": {
"type": "object",
"required": [
"dimensions",
"metrics"
],
"properties": {
"metrics": {
"type": "array",
"items": {
"type": "object",
"required": [
"metricId",
"value"
],
"properties": {
"value": {
"type": [
"number",
"null"
],
"description": "Metric value, or null when unavailable."
},
"metricId": {
"type": "string",
"description": "Metric identifier returned by the metrics API."
}
},
"additionalProperties": false
},
"description": "Metric values for this grouped row."
},
"dimensions": {
"type": "array",
"items": {
"type": "object",
"required": [
"key",
"value"
],
"properties": {
"key": {
"type": "string",
"description": "Grouping dimension identifier."
},
"value": {
"type": "string",
"description": "Grouping dimension value for this row."
}
},
"additionalProperties": false
},
"description": "Grouping dimensions for this metrics row."
}
},
"additionalProperties": false
},
"description": "Current page of grouped metric rows for the filtered date range."
},
"pageInfo": {
"type": "object",
"required": [
"hasNextPage",
"endCursor"
],
"properties": {
"endCursor": {
"type": "string",
"description": "Cursor of the final row on this page, or an empty string when the page has no rows; pass it as after only when hasNextPage is true."
},
"hasNextPage": {
"type": "boolean",
"description": "Whether another result page is available."
}
},
"description": "Pagination information for the grouped metric rows.",
"additionalProperties": false
},
"companyId": {
"type": "string",
"description": "Node ID of the company whose metrics were queried."
},
"dateRange": {
"type": "object",
"required": [
"startDate",
"endDate"
],
"properties": {
"endDate": {
"type": "string",
"description": "Inclusive end date for the metrics query."
},
"startDate": {
"type": "string",
"description": "Inclusive start date for the metrics query."
}
},
"description": "Resolved date range used for the metrics query.",
"additionalProperties": false
},
"aggregates": {
"type": "array",
"items": {
"type": "object",
"required": [
"metricId",
"value"
],
"properties": {
"value": {
"type": [
"number",
"null"
],
"description": "Metric value, or null when unavailable."
},
"metricId": {
"type": "string",
"description": "Metric identifier returned by the metrics API."
}
},
"additionalProperties": false
},
"description": "Aggregate metric values for the full filtered date range."
},
"companyName": {
"type": "string",
"description": "Display name of the company whose metrics were queried."
},
"totalGroupedRowCount": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": 0,
"description": "Total grouped-row count for the full filtered date range."
}
},
"additionalProperties": false
}
Original tool metadata
{
"name": "get_campaign_metrics",
"title": "Get Campaign Metrics",
"description": "Get SMS campaign performance metrics for a company over a date range (defaults to the last 30 days). Returns query-wide aggregate values and one page of grouped campaign rows for delivered, clicks, click rate, conversions, conversion rate, revenue, AOV, revenue per send, unsubscribes, unsubscribe rate, and fatigues. To retrieve another page, pass pageInfo.endCursor as after, pass the previous response dateRange as startDate and endDate, and keep the campaign filter unchanged. Continue until pageInfo.hasNextPage is false. Optionally filter by campaign name.",
"inputSchema": {
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"after": {
"type": "string",
"minLength": 1,
"description": "Opaque pageInfo.endCursor from the previous page. When provided, startDate and endDate are required and must match the previous response dateRange; keep the campaign filter unchanged."
},
"first": {
"type": "integer",
"default": 1000,
"maximum": 1000,
"description": "Number of grouped metric rows to return (max 1000, default 1000).",
"exclusiveMinimum": 0
},
"endDate": {
"type": "string",
"description": "End date in YYYY-MM-DD format. Defaults to today."
},
"startDate": {
"type": "string",
"description": "Start date in YYYY-MM-DD format. Defaults to 30 days ago."
},
"campaignName": {
"type": "string",
"description": "Optional campaign name to filter metrics for a specific campaign"
},
"userRequestId": {
"type": "string",
"description": "Optional universal MCP-server telemetry only. Generate a UUID4 and reuse the same UUID4 for all tool calls caused by the same human request."
},
"endUserIntentSummary": {
"type": "string",
"description": "Optional MCP-server telemetry only. Summarize the immediate human-requested outcome that caused this tool call. Do not include tool-selection rationale."
}
}
},
"outputSchema": {
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"companyId",
"companyName",
"dateRange",
"aggregates",
"rows",
"totalGroupedRowCount",
"pageInfo"
],
"properties": {
"rows": {
"type": "array",
"items": {
"type": "object",
"required": [
"dimensions",
"metrics"
],
"properties": {
"metrics": {
"type": "array",
"items": {
"type": "object",
"required": [
"metricId",
"value"
],
"properties": {
"value": {
"type": [
"number",
"null"
],
"description": "Metric value, or null when unavailable."
},
"metricId": {
"type": "string",
"description": "Metric identifier returned by the metrics API."
}
},
"additionalProperties": false
},
"description": "Metric values for this grouped row."
},
"dimensions": {
"type": "array",
"items": {
"type": "object",
"required": [
"key",
"value"
],
"properties": {
"key": {
"type": "string",
"description": "Grouping dimension identifier."
},
"value": {
"type": "string",
"description": "Grouping dimension value for this row."
}
},
"additionalProperties": false
},
"description": "Grouping dimensions for this metrics row."
}
},
"additionalProperties": false
},
"description": "Current page of grouped metric rows for the filtered date range."
},
"pageInfo": {
"type": "object",
"required": [
"hasNextPage",
"endCursor"
],
"properties": {
"endCursor": {
"type": "string",
"description": "Cursor of the final row on this page, or an empty string when the page has no rows; pass it as after only when hasNextPage is true."
},
"hasNextPage": {
"type": "boolean",
"description": "Whether another result page is available."
}
},
"description": "Pagination information for the grouped metric rows.",
"additionalProperties": false
},
"companyId": {
"type": "string",
"description": "Node ID of the company whose metrics were queried."
},
"dateRange": {
"type": "object",
"required": [
"startDate",
"endDate"
],
"properties": {
"endDate": {
"type": "string",
"description": "Inclusive end date for the metrics query."
},
"startDate": {
"type": "string",
"description": "Inclusive start date for the metrics query."
}
},
"description": "Resolved date range used for the metrics query.",
"additionalProperties": false
},
"aggregates": {
"type": "array",
"items": {
"type": "object",
"required": [
"metricId",
"value"
],
"properties": {
"value": {
"type": [
"number",
"null"
],
"description": "Metric value, or null when unavailable."
},
"metricId": {
"type": "string",
"description": "Metric identifier returned by the metrics API."
}
},
"additionalProperties": false
},
"description": "Aggregate metric values for the full filtered date range."
},
"companyName": {
"type": "string",
"description": "Display name of the company whose metrics were queried."
},
"totalGroupedRowCount": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": 0,
"description": "Total grouped-row count for the full filtered date range."
}
},
"additionalProperties": false
},
"annotations": {
"title": "Get Campaign Metrics",
"readOnlyHint": true,
"openWorldHint": false,
"idempotentHint": true,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description70/100
List campaigns for a company with optional name, status filter, and pagination.
Describe the returned information so the agent knows whether it will answer the request.
Inputs83/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
first
Number of campaigns to return
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
after
Cursor for pagination
Clarify units, where to obtain this value, or conventions not already expressed in the schema.
name
Filter by campaign name (partial match)
Clear enough to supply this argument.
status
Filter by campaign status: DRAFT, SCHEDULED, DELIVERED, PAUSED, or ENDED
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
userRequestId
Optional universal MCP-server telemetry only. Generate a UUID4 and reuse the same UUID4 for all tool calls caused by the same human request.
Clear enough to supply this argument.
endUserIntentSummary
Optional MCP-server telemetry only. Summarize the immediate human-requested outcome that caused this tool call. Do not include tool-selection rationale.
The title clearly communicates the tool’s action and subject. Keep it concise.
Description86/100
Get a campaign message group by ID, including its status, schedule, and A/B test variants.
The description explains the capability, when to use it, and what to expect.
Inputs77/100
Explain the meaning of this value, not just its name.
messageGroupId
The message group ID
Explain the meaning of this value, not just its name.
userRequestId
Optional universal MCP-server telemetry only. Generate a UUID4 and reuse the same UUID4 for all tool calls caused by the same human request.
Clear enough to supply this argument.
endUserIntentSummary
Optional MCP-server telemetry only. Summarize the immediate human-requested outcome that caused this tool call. Do not include tool-selection rationale.
The title clearly communicates the tool’s action and subject. Keep it concise.
Description80/100
Get detailed creative info by ID, including status, type, template config, display rules, and related resources.
The description explains the capability, when to use it, and what to expect.
Inputs97/100
Input documentation gives an agent enough context to populate the arguments.
creativeId
The creative ID. Accepts either the GraphQL node ID (e.g. MDg6Q3JlYXRpdmU1ODUyMTc) or the raw numeric internal ID (e.g. 585217).
Clear enough to supply this argument.
userRequestId
Optional universal MCP-server telemetry only. Generate a UUID4 and reuse the same UUID4 for all tool calls caused by the same human request.
Clear enough to supply this argument.
endUserIntentSummary
Optional MCP-server telemetry only. Summarize the immediate human-requested outcome that caused this tool call. Do not include tool-selection rationale.
The title clearly communicates the tool’s action and subject. Keep it concise.
Description71/100
List creatives for a company with optional search, status filter, type filter, and pagination.
Describe the returned information so the agent knows whether it will answer the request.
Inputs82/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
first
Number of creatives to return (max 50)
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
after
Cursor for pagination
Clarify units, where to obtain this value, or conventions not already expressed in the schema.
searchTerm
Search by creative name (partial match)
Clear enough to supply this argument.
status
Filter by creative status: ACTIVE, INACTIVE, or DRAFT
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
type
Filter by creative type: ON_SITE, TEXT_TO_JOIN, LANDING_PAGE, DESKTOP, LEGAL, or INTEGRATION
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
userRequestId
Optional universal MCP-server telemetry only. Generate a UUID4 and reuse the same UUID4 for all tool calls caused by the same human request.
Clear enough to supply this argument.
endUserIntentSummary
Optional MCP-server telemetry only. Summarize the immediate human-requested outcome that caused this tool call. Do not include tool-selection rationale.
The title clearly communicates the tool’s action and subject. Keep it concise.
Description93/100
Get details of a specific email template by its GraphQL ID. Returns template name, subject, preview/content URLs, and optionally the full JSON content for editing.
The description explains the capability, when to use it, and what to expect.
Inputs98/100
Input documentation gives an agent enough context to populate the arguments.
id
The GraphQL ID of the email template (from list_email_templates)
Clear enough to supply this argument.
includeJsonContent
Whether to include the full JSON content of the template. Can be large — only request when needed for editing or inspection.
Clear enough to supply this argument.
userRequestId
Optional universal MCP-server telemetry only. Generate a UUID4 and reuse the same UUID4 for all tool calls caused by the same human request.
Clear enough to supply this argument.
endUserIntentSummary
Optional MCP-server telemetry only. Summarize the immediate human-requested outcome that caused this tool call. Do not include tool-selection rationale.
The title clearly communicates the tool’s action and subject. Keep it concise.
Description96/100
List email templates for the current company. Supports filtering by name and template type, with cursor-based pagination. Returns template names, subjects, preview URLs, and IDs for use with get_email_template.
The description explains the capability, when to use it, and what to expect.
Inputs92/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
first
Number of templates to fetch (max 100, default 25)
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
after
Cursor for pagination (endCursor from previous page)
Clear enough to supply this argument.
name
Filter templates by name (partial match)
Clear enough to supply this argument.
templateTypes
Filter by template type. Defaults to MESSAGING_TEMPLATE_TYPE_COMPANY_EMAIL_COMMON. Common values: MESSAGING_TEMPLATE_TYPE_COMPANY_EMAIL_COMMON (general), MESSAGING_TEMPLATE_TYPE_ROW (saved rows), MESSAGING_TEMPLATE_TYPE_CAMPAIGN (campaign templates).
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
userRequestId
Optional universal MCP-server telemetry only. Generate a UUID4 and reuse the same UUID4 for all tool calls caused by the same human request.
Clear enough to supply this argument.
endUserIntentSummary
Optional MCP-server telemetry only. Summarize the immediate human-requested outcome that caused this tool call. Do not include tool-selection rationale.
The title clearly communicates the tool’s action and subject. Keep it concise.
Description83/100
Get detailed information for a single journey by ID, including name, state, trigger, tags, schedules, and category.
The description explains the capability, when to use it, and what to expect.
Inputs92/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
journeyId
The journey ID to retrieve
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
userRequestId
Optional universal MCP-server telemetry only. Generate a UUID4 and reuse the same UUID4 for all tool calls caused by the same human request.
Clear enough to supply this argument.
endUserIntentSummary
Optional MCP-server telemetry only. Summarize the immediate human-requested outcome that caused this tool call. Do not include tool-selection rationale.
The title clearly communicates the tool’s action and subject. Keep it concise.
Description97/100
Read how a branching node is currently configured: the dimension it tests, each branch's conditions with a readable label and node id, the steps under each branch, and the selection schemas for that dimension. Call this before update_journey_branch to edit a branch without dropping the others or the steps beneath them.
The description explains the capability, when to use it, and what to expect.
Inputs90/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
journeyId
The journey ID
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
branchingNodeId
UUID of the BRANCHING_ROOT node to read, from get_journey_graph.
Clear enough to supply this argument.
revisionId
Specific revision to read. If omitted, uses the draft revision, falling back to the published one.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
userRequestId
Optional universal MCP-server telemetry only. Generate a UUID4 and reuse the same UUID4 for all tool calls caused by the same human request.
Clear enough to supply this argument.
endUserIntentSummary
Optional MCP-server telemetry only. Summarize the immediate human-requested outcome that caused this tool call. Do not include tool-selection rationale.
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"journeyId",
"revisionId",
"branchingNodeId",
"dimension",
"dimensionDisplayName",
"branches",
"elseBranchNodeId",
"journeyUrl",
"schemas"
],
"properties": {
"schemas": {
"type": "array",
"items": {
"type": "object",
"required": [
"schemaType",
"schemaProperties"
],
"properties": {
"schemaType": {
"type": "string",
"description": "A selection type this dimension expects."
},
"schemaProperties": {
"type": "object",
"description": "Allowed options, enabled comparators, currencies and defaults for this selection type. Build update_journey_branch selections from these rather than guessing.",
"propertyNames": {
"type": "string"
},
"additionalProperties": {}
}
},
"additionalProperties": false
},
"description": "The selection schemas for the branch's current dimension, so the branch can be edited without a second configuration call."
},
"branches": {
"type": "array",
"items": {
"type": "object",
"required": [
"nodeId",
"sortOrder",
"label",
"selections",
"childrenNodeIds"
],
"properties": {
"label": {
"type": "string",
"description": "Human-readable summary of the branch condition, as shown on the journey canvas."
},
"nodeId": {
"type": "string",
"description": "The branch expression node id. Pass it back to update this branch in place."
},
"sortOrder": {
"type": "number",
"description": "Zero-based position of the branch under the branch step."
},
"selections": {
"type": "array",
"items": {
"type": "object",
"required": [
"schemaType",
"selectionProperties"
],
"properties": {
"schemaType": {
"type": "string",
"description": "The selection schema type persisted on the branch."
},
"selectionProperties": {
"type": "object",
"description": "The persisted selection properties, including any values the server defaulted.",
"propertyNames": {
"type": "string"
},
"additionalProperties": {}
}
},
"description": "A selection persisted on a branch expression.",
"additionalProperties": false
},
"description": "The selections persisted for this branch."
},
"childrenNodeIds": {
"type": "array",
"items": {
"type": "string"
},
"description": "Ids of the steps that run when a subscriber takes this branch, empty when the branch has none yet. Structural placeholder nodes are resolved away, so these are ids other journey tools accept."
}
},
"additionalProperties": false
},
"description": "The branch expressions now configured, in display order."
},
"dimension": {
"type": "string",
"description": "The dimension the branch now tests. Custom event dimensions are returned with their property suffix, the form the tools accept."
},
"journeyId": {
"type": "number",
"description": "The journey ID"
},
"journeyUrl": {
"type": "string",
"description": "Link to the journey in the Attentive UI."
},
"revisionId": {
"type": "number",
"description": "The draft revision the branch was written to."
},
"branchingNodeId": {
"type": "string",
"description": "The configured BRANCHING_ROOT node id."
},
"elseBranchNodeId": {
"type": [
"string",
"null"
],
"description": "The default path node id, created and owned by the backend. Steps can be added under it like any other branch."
},
"dimensionDisplayName": {
"type": "string",
"description": "Human-readable name of the dimension."
}
},
"additionalProperties": false
}
Original tool metadata
{
"name": "get_journey_branch",
"title": "Get Journey Branch",
"description": "Read how a branching node is currently configured: the dimension it tests, each branch's conditions with a readable label and node id, the steps under each branch, and the selection schemas for that dimension. Call this before update_journey_branch to edit a branch without dropping the others or the steps beneath them.",
"inputSchema": {
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"journeyId",
"branchingNodeId"
],
"properties": {
"journeyId": {
"type": "integer",
"maximum": 9007199254740991,
"description": "The journey ID",
"exclusiveMinimum": 0
},
"revisionId": {
"type": "integer",
"maximum": 9007199254740991,
"description": "Specific revision to read. If omitted, uses the draft revision, falling back to the published one.",
"exclusiveMinimum": 0
},
"userRequestId": {
"type": "string",
"description": "Optional universal MCP-server telemetry only. Generate a UUID4 and reuse the same UUID4 for all tool calls caused by the same human request."
},
"branchingNodeId": {
"type": "string",
"description": "UUID of the BRANCHING_ROOT node to read, from get_journey_graph."
},
"endUserIntentSummary": {
"type": "string",
"description": "Optional MCP-server telemetry only. Summarize the immediate human-requested outcome that caused this tool call. Do not include tool-selection rationale."
}
}
},
"outputSchema": {
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"journeyId",
"revisionId",
"branchingNodeId",
"dimension",
"dimensionDisplayName",
"branches",
"elseBranchNodeId",
"journeyUrl",
"schemas"
],
"properties": {
"schemas": {
"type": "array",
"items": {
"type": "object",
"required": [
"schemaType",
"schemaProperties"
],
"properties": {
"schemaType": {
"type": "string",
"description": "A selection type this dimension expects."
},
"schemaProperties": {
"type": "object",
"description": "Allowed options, enabled comparators, currencies and defaults for this selection type. Build update_journey_branch selections from these rather than guessing.",
"propertyNames": {
"type": "string"
},
"additionalProperties": {}
}
},
"additionalProperties": false
},
"description": "The selection schemas for the branch's current dimension, so the branch can be edited without a second configuration call."
},
"branches": {
"type": "array",
"items": {
"type": "object",
"required": [
"nodeId",
"sortOrder",
"label",
"selections",
"childrenNodeIds"
],
"properties": {
"label": {
"type": "string",
"description": "Human-readable summary of the branch condition, as shown on the journey canvas."
},
"nodeId": {
"type": "string",
"description": "The branch expression node id. Pass it back to update this branch in place."
},
"sortOrder": {
"type": "number",
"description": "Zero-based position of the branch under the branch step."
},
"selections": {
"type": "array",
"items": {
"type": "object",
"required": [
"schemaType",
"selectionProperties"
],
"properties": {
"schemaType": {
"type": "string",
"description": "The selection schema type persisted on the branch."
},
"selectionProperties": {
"type": "object",
"description": "The persisted selection properties, including any values the server defaulted.",
"propertyNames": {
"type": "string"
},
"additionalProperties": {}
}
},
"description": "A selection persisted on a branch expression.",
"additionalProperties": false
},
"description": "The selections persisted for this branch."
},
"childrenNodeIds": {
"type": "array",
"items": {
"type": "string"
},
"description": "Ids of the steps that run when a subscriber takes this branch, empty when the branch has none yet. Structural placeholder nodes are resolved away, so these are ids other journey tools accept."
}
},
"additionalProperties": false
},
"description": "The branch expressions now configured, in display order."
},
"dimension": {
"type": "string",
"description": "The dimension the branch now tests. Custom event dimensions are returned with their property suffix, the form the tools accept."
},
"journeyId": {
"type": "number",
"description": "The journey ID"
},
"journeyUrl": {
"type": "string",
"description": "Link to the journey in the Attentive UI."
},
"revisionId": {
"type": "number",
"description": "The draft revision the branch was written to."
},
"branchingNodeId": {
"type": "string",
"description": "The configured BRANCHING_ROOT node id."
},
"elseBranchNodeId": {
"type": [
"string",
"null"
],
"description": "The default path node id, created and owned by the backend. Steps can be added under it like any other branch."
},
"dimensionDisplayName": {
"type": "string",
"description": "Human-readable name of the dimension."
}
},
"additionalProperties": false
},
"annotations": {
"title": "Get Journey Branch",
"readOnlyHint": true,
"openWorldHint": false,
"idempotentHint": true,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description99/100
Read the configuration options available for a journey: which node types can be added/copied/moved (allowedSteps), and the valid branching dimensions for its trigger (each with its dimensionValue, branch count limits, and required selection schemaTypes). Call this before adding nodes or configuring branches to discover valid values for this specific journey/trigger instead of guessing.
The description explains the capability, when to use it, and what to expect.
Inputs88/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
journeyId
The journey ID
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
triggerId
The journey's trigger ID. If omitted, it is resolved from the journey details automatically.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
userRequestId
Optional universal MCP-server telemetry only. Generate a UUID4 and reuse the same UUID4 for all tool calls caused by the same human request.
Clear enough to supply this argument.
endUserIntentSummary
Optional MCP-server telemetry only. Summarize the immediate human-requested outcome that caused this tool call. Do not include tool-selection rationale.
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"journeyId",
"triggerType",
"allowedSteps",
"copyableSteps",
"movableSteps",
"configurableNodeTypes",
"dimensionGroupDetails",
"branchingDimensions"
],
"properties": {
"journeyId": {
"type": "number",
"description": "The journey ID"
},
"triggerType": {
"type": "string",
"description": "The journey trigger type the configuration applies to."
},
"allowedSteps": {
"type": "array",
"items": {
"type": "string"
},
"description": "Node types that may be added to this journey (use to validate add_journey_node)."
},
"movableSteps": {
"type": "array",
"items": {
"type": "string"
},
"description": "Node types that may be moved."
},
"copyableSteps": {
"type": "array",
"items": {
"type": "string"
},
"description": "Node types that may be copied."
},
"branchingDimensions": {
"type": "array",
"items": {
"type": "object",
"required": [
"dimensionValue",
"dimensionDisplayName",
"dimensionGroup",
"branchMin",
"branchMax",
"schemaTypes",
"schemas"
],
"properties": {
"schemas": {
"type": "array",
"items": {
"type": "object",
"required": [
"schemaType",
"schemaProperties"
],
"properties": {
"schemaType": {
"type": "string",
"description": "The selection schemaType this BRANCH_EXPRESSION selection must use."
},
"schemaProperties": {
"type": "object",
"description": "Backend-provided properties needed to build a valid selection for this schemaType: e.g. MULTI_SELECT/SINGLE_SELECT `options` (the allowed values), MONEY_COMPARATOR `currencyOptions`/`enabledComparators`/min-max, FREQUENCY/TIME/QUANTITY `enabledComparators`, USER_PROPERTY_COMPARATOR `propertyTypeConfigs`. Mirror these into the selection's selectionProperties rather than guessing.",
"propertyNames": {
"type": "string"
},
"additionalProperties": {}
}
},
"additionalProperties": false
},
"description": "Full selection schemas for this dimension, including the schemaProperties (allowed option values, currencies, enabled comparators) required to construct a valid BRANCH_EXPRESSION selection."
},
"channels": {
"type": "array",
"items": {
"type": "string"
},
"description": "Message channels this dimension applies to, when it is channel-specific."
},
"branchMax": {
"type": "number",
"description": "Maximum number of BRANCH_EXPRESSION branches allowed."
},
"branchMin": {
"type": "number",
"description": "Minimum number of BRANCH_EXPRESSION branches allowed."
},
"schemaTypes": {
"type": "array",
"items": {
"type": "string"
},
"description": "Convenience summary: the distinct selection schemaType(s) a BRANCH_EXPRESSION must use for this dimension (e.g. FREQUENCY_COMPARATOR, MULTI_SELECT, USER_PROPERTY_COMPARATOR). See `schemas` for the full per-schema properties."
},
"dimensionGroup": {
"type": "string",
"description": "The dimension group (e.g. BEHAVIOR, PROPERTY, SEGMENT, CUSTOM_USER_PROPERTY)."
},
"dimensionValue": {
"type": "string",
"description": "The value to pass as `dimension` to add_journey_node / update_journey_branch when branching on this dimension. Every custom event property shares one backend dimension value, so those are reported suffixed with the property (CUSTOM_EVENT_DYNAMIC_PROPERTY_TYPE_<property>) to keep them distinct; pass the suffixed value through and the write tools resolve it."
},
"displayGroupName": {
"type": "string",
"description": "Sub-group heading this dimension appears under, when the group uses them."
},
"dimensionDisplayName": {
"type": "string",
"description": "Human-readable dimension name."
}
},
"additionalProperties": false
},
"description": "Valid branching dimensions for this journey/trigger, with the dimensionValue, allowed branch counts, and the selection schemas (including schemaProperties such as allowed option values and currencies) needed to build branch selections. Use this instead of guessing dimension values or selection options."
},
"configurableNodeTypes": {
"type": "array",
"items": {
"type": "string"
},
"description": "Node types that expose additional configuration for this journey (keys of dynamicNodeOptions, e.g. SEND_MESSAGE, BRANCHING_ROOT, SEND_EMAIL). These typically require follow-up configuration via update_journey_node after being added."
},
"dimensionGroupDetails": {
"type": "array",
"items": {
"type": "object",
"required": [
"dimensionGroup",
"dimensionGroupDisplayName",
"dimensionSelectPlaceholder"
],
"properties": {
"dimensionGroup": {
"type": "string",
"description": "The group key used by branchingDimensions."
},
"dimensionGroupDisplayName": {
"type": "string",
"description": "Human-readable group name."
},
"dimensionSelectPlaceholder": {
"type": "string",
"description": "Placeholder the UI shows when choosing a dimension in this group."
}
},
"additionalProperties": false
},
"description": "The dimension groups offered for this trigger, in display order."
}
},
"additionalProperties": false
}
Original tool metadata
{
"name": "get_journey_configuration",
"title": "Get Journey Configuration",
"description": "Read the configuration options available for a journey: which node types can be added/copied/moved (allowedSteps), and the valid branching dimensions for its trigger (each with its dimensionValue, branch count limits, and required selection schemaTypes). Call this before adding nodes or configuring branches to discover valid values for this specific journey/trigger instead of guessing.",
"inputSchema": {
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"journeyId"
],
"properties": {
"journeyId": {
"type": "integer",
"maximum": 9007199254740991,
"description": "The journey ID",
"exclusiveMinimum": 0
},
"triggerId": {
"type": "integer",
"maximum": 9007199254740991,
"description": "The journey's trigger ID. If omitted, it is resolved from the journey details automatically.",
"exclusiveMinimum": 0
},
"userRequestId": {
"type": "string",
"description": "Optional universal MCP-server telemetry only. Generate a UUID4 and reuse the same UUID4 for all tool calls caused by the same human request."
},
"endUserIntentSummary": {
"type": "string",
"description": "Optional MCP-server telemetry only. Summarize the immediate human-requested outcome that caused this tool call. Do not include tool-selection rationale."
}
}
},
"outputSchema": {
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"journeyId",
"triggerType",
"allowedSteps",
"copyableSteps",
"movableSteps",
"configurableNodeTypes",
"dimensionGroupDetails",
"branchingDimensions"
],
"properties": {
"journeyId": {
"type": "number",
"description": "The journey ID"
},
"triggerType": {
"type": "string",
"description": "The journey trigger type the configuration applies to."
},
"allowedSteps": {
"type": "array",
"items": {
"type": "string"
},
"description": "Node types that may be added to this journey (use to validate add_journey_node)."
},
"movableSteps": {
"type": "array",
"items": {
"type": "string"
},
"description": "Node types that may be moved."
},
"copyableSteps": {
"type": "array",
"items": {
"type": "string"
},
"description": "Node types that may be copied."
},
"branchingDimensions": {
"type": "array",
"items": {
"type": "object",
"required": [
"dimensionValue",
"dimensionDisplayName",
"dimensionGroup",
"branchMin",
"branchMax",
"schemaTypes",
"schemas"
],
"properties": {
"schemas": {
"type": "array",
"items": {
"type": "object",
"required": [
"schemaType",
"schemaProperties"
],
"properties": {
"schemaType": {
"type": "string",
"description": "The selection schemaType this BRANCH_EXPRESSION selection must use."
},
"schemaProperties": {
"type": "object",
"description": "Backend-provided properties needed to build a valid selection for this schemaType: e.g. MULTI_SELECT/SINGLE_SELECT `options` (the allowed values), MONEY_COMPARATOR `currencyOptions`/`enabledComparators`/min-max, FREQUENCY/TIME/QUANTITY `enabledComparators`, USER_PROPERTY_COMPARATOR `propertyTypeConfigs`. Mirror these into the selection's selectionProperties rather than guessing.",
"propertyNames": {
"type": "string"
},
"additionalProperties": {}
}
},
"additionalProperties": false
},
"description": "Full selection schemas for this dimension, including the schemaProperties (allowed option values, currencies, enabled comparators) required to construct a valid BRANCH_EXPRESSION selection."
},
"channels": {
"type": "array",
"items": {
"type": "string"
},
"description": "Message channels this dimension applies to, when it is channel-specific."
},
"branchMax": {
"type": "number",
"description": "Maximum number of BRANCH_EXPRESSION branches allowed."
},
"branchMin": {
"type": "number",
"description": "Minimum number of BRANCH_EXPRESSION branches allowed."
},
"schemaTypes": {
"type": "array",
"items": {
"type": "string"
},
"description": "Convenience summary: the distinct selection schemaType(s) a BRANCH_EXPRESSION must use for this dimension (e.g. FREQUENCY_COMPARATOR, MULTI_SELECT, USER_PROPERTY_COMPARATOR). See `schemas` for the full per-schema properties."
},
"dimensionGroup": {
"type": "string",
"description": "The dimension group (e.g. BEHAVIOR, PROPERTY, SEGMENT, CUSTOM_USER_PROPERTY)."
},
"dimensionValue": {
"type": "string",
"description": "The value to pass as `dimension` to add_journey_node / update_journey_branch when branching on this dimension. Every custom event property shares one backend dimension value, so those are reported suffixed with the property (CUSTOM_EVENT_DYNAMIC_PROPERTY_TYPE_<property>) to keep them distinct; pass the suffixed value through and the write tools resolve it."
},
"displayGroupName": {
"type": "string",
"description": "Sub-group heading this dimension appears under, when the group uses them."
},
"dimensionDisplayName": {
"type": "string",
"description": "Human-readable dimension name."
}
},
"additionalProperties": false
},
"description": "Valid branching dimensions for this journey/trigger, with the dimensionValue, allowed branch counts, and the selection schemas (including schemaProperties such as allowed option values and currencies) needed to build branch selections. Use this instead of guessing dimension values or selection options."
},
"configurableNodeTypes": {
"type": "array",
"items": {
"type": "string"
},
"description": "Node types that expose additional configuration for this journey (keys of dynamicNodeOptions, e.g. SEND_MESSAGE, BRANCHING_ROOT, SEND_EMAIL). These typically require follow-up configuration via update_journey_node after being added."
},
"dimensionGroupDetails": {
"type": "array",
"items": {
"type": "object",
"required": [
"dimensionGroup",
"dimensionGroupDisplayName",
"dimensionSelectPlaceholder"
],
"properties": {
"dimensionGroup": {
"type": "string",
"description": "The group key used by branchingDimensions."
},
"dimensionGroupDisplayName": {
"type": "string",
"description": "Human-readable group name."
},
"dimensionSelectPlaceholder": {
"type": "string",
"description": "Placeholder the UI shows when choosing a dimension in this group."
}
},
"additionalProperties": false
},
"description": "The dimension groups offered for this trigger, in display order."
}
},
"additionalProperties": false
},
"annotations": {
"title": "Get Journey Configuration",
"readOnlyHint": true,
"openWorldHint": false,
"idempotentHint": true,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description95/100
Get a summarized view of a journey's graph structure, including all steps (triggers, delays, messages, branches, experiments) with message text content. Filters out internal structural nodes for a clean readable flow. Returns the draft revision by default, whose node ids are the ones the journey write tools accept; revisionKind reports which revision was read.
The description explains the capability, when to use it, and what to expect.
Inputs92/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
journeyId
The journey ID
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
revisionId
Specific revision ID to fetch. If omitted, uses the journey's draft revision — the only editable one, so its node ids are the ones the write tools accept — falling back to the published revision when there is no draft. Pass the published revisionId to read what is currently live.
Clear enough to supply this argument.
userRequestId
Optional universal MCP-server telemetry only. Generate a UUID4 and reuse the same UUID4 for all tool calls caused by the same human request.
Clear enough to supply this argument.
endUserIntentSummary
Optional MCP-server telemetry only. Summarize the immediate human-requested outcome that caused this tool call. Do not include tool-selection rationale.
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"journeyId",
"revisionId",
"revisionKind",
"status",
"journeyUrl",
"nodes",
"rawGraph",
"failedMessageIds"
],
"properties": {
"nodes": {
"type": "array",
"items": {
"type": "object",
"required": [
"nodeId",
"nodeType",
"summary",
"childrenNodeIds"
],
"properties": {
"nodeId": {
"type": "string",
"description": "The node UUID within the revision."
},
"summary": {
"type": "object",
"description": "Fields that describe the node, keyed by field name. The shape varies by nodeType.",
"propertyNames": {
"type": "string"
},
"additionalProperties": {}
},
"nodeType": {
"enum": [
"TRIGGER",
"DELAY",
"SUBSCRIBER_CONDITION",
"ELSE",
"SEND_MESSAGE",
"SEND_CONVERSATIONAL_MESSAGE",
"END_OF_JOURNEY",
"ADDER",
"JOINER",
"EXPERIMENT",
"EXPERIMENT_LEGAL_WELCOME",
"VARIANT",
"BRANCHING_ROOT",
"BRANCH_EXPRESSION",
"BRANCH_ELSE",
"SEND_LEGAL_WELCOME",
"SEND_EMAIL",
"SEND_PUSH_MESSAGE",
"KEYWORD_RESPONSE",
"OPEN_RESPONSE",
"NO_RESPONSE",
"API_CALL_RESULT",
"INCOMING_TEXT",
"CREATE_SUPPORT_TICKET",
"SAVE_USER_ATTRIBUTE",
"TWO_WAY_MESSAGE",
"FORWARD_TO_CONCIERGE",
"TRIGGER_INTEGRATION_POSTBACK"
],
"type": "string",
"description": "The node type, as one of the NodeTypes enum values."
},
"childrenNodeIds": {
"type": "array",
"items": {
"type": "string"
},
"description": "IDs of the child nodes within the revision."
}
},
"additionalProperties": false
},
"description": "Visible nodes on the revision, in traversal order. Hidden structural nodes (ADDER, JOINER, etc.) are filtered out."
},
"status": {
"type": "string",
"description": "The revision status reported by the API."
},
"rawGraph": {
"type": "array",
"items": {
"type": "object",
"required": [
"nodeId",
"nodeType",
"childrenNodeIds"
],
"properties": {
"nodeId": {
"type": "string",
"description": "The node UUID within the revision."
},
"nodeType": {
"enum": [
"TRIGGER",
"DELAY",
"SUBSCRIBER_CONDITION",
"ELSE",
"SEND_MESSAGE",
"SEND_CONVERSATIONAL_MESSAGE",
"END_OF_JOURNEY",
"ADDER",
"JOINER",
"EXPERIMENT",
"EXPERIMENT_LEGAL_WELCOME",
"VARIANT",
"BRANCHING_ROOT",
"BRANCH_EXPRESSION",
"BRANCH_ELSE",
"SEND_LEGAL_WELCOME",
"SEND_EMAIL",
"SEND_PUSH_MESSAGE",
"KEYWORD_RESPONSE",
"OPEN_RESPONSE",
"NO_RESPONSE",
"API_CALL_RESULT",
"INCOMING_TEXT",
"CREATE_SUPPORT_TICKET",
"SAVE_USER_ATTRIBUTE",
"TWO_WAY_MESSAGE",
"FORWARD_TO_CONCIERGE",
"TRIGGER_INTEGRATION_POSTBACK"
],
"type": "string",
"description": "The node type, as one of the NodeTypes enum values."
},
"childrenNodeIds": {
"type": "array",
"items": {
"type": "string"
},
"description": "IDs of the child nodes within the revision."
}
},
"additionalProperties": false
},
"description": "Every node on the revision, unfiltered, for callers that need to reason about structure."
},
"journeyId": {
"type": "number",
"description": "The journey ID."
},
"journeyUrl": {
"type": "string",
"description": "URL that opens the revision in the journey builder or version list."
},
"revisionId": {
"type": "number",
"description": "The revision ID that was read."
},
"revisionKind": {
"enum": [
"DRAFT",
"PUBLISHED",
"OTHER"
],
"type": "string",
"description": "Classifies the read revision against the journey. DRAFT is editable; PUBLISHED is live; OTHER is neither."
},
"failedMessageIds": {
"type": "array",
"items": {
"type": "string"
},
"description": "GraphQL message IDs whose content could not be fetched."
}
},
"additionalProperties": false
}
Original tool metadata
{
"name": "get_journey_graph",
"title": "Get Journey Graph",
"description": "Get a summarized view of a journey's graph structure, including all steps (triggers, delays, messages, branches, experiments) with message text content. Filters out internal structural nodes for a clean readable flow. Returns the draft revision by default, whose node ids are the ones the journey write tools accept; revisionKind reports which revision was read.",
"inputSchema": {
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"journeyId"
],
"properties": {
"journeyId": {
"type": "integer",
"maximum": 9007199254740991,
"description": "The journey ID",
"exclusiveMinimum": 0
},
"revisionId": {
"type": "integer",
"maximum": 9007199254740991,
"description": "Specific revision ID to fetch. If omitted, uses the journey's draft revision — the only editable one, so its node ids are the ones the write tools accept — falling back to the published revision when there is no draft. Pass the published revisionId to read what is currently live.",
"exclusiveMinimum": 0
},
"userRequestId": {
"type": "string",
"description": "Optional universal MCP-server telemetry only. Generate a UUID4 and reuse the same UUID4 for all tool calls caused by the same human request."
},
"endUserIntentSummary": {
"type": "string",
"description": "Optional MCP-server telemetry only. Summarize the immediate human-requested outcome that caused this tool call. Do not include tool-selection rationale."
}
}
},
"outputSchema": {
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"journeyId",
"revisionId",
"revisionKind",
"status",
"journeyUrl",
"nodes",
"rawGraph",
"failedMessageIds"
],
"properties": {
"nodes": {
"type": "array",
"items": {
"type": "object",
"required": [
"nodeId",
"nodeType",
"summary",
"childrenNodeIds"
],
"properties": {
"nodeId": {
"type": "string",
"description": "The node UUID within the revision."
},
"summary": {
"type": "object",
"description": "Fields that describe the node, keyed by field name. The shape varies by nodeType.",
"propertyNames": {
"type": "string"
},
"additionalProperties": {}
},
"nodeType": {
"enum": [
"TRIGGER",
"DELAY",
"SUBSCRIBER_CONDITION",
"ELSE",
"SEND_MESSAGE",
"SEND_CONVERSATIONAL_MESSAGE",
"END_OF_JOURNEY",
"ADDER",
"JOINER",
"EXPERIMENT",
"EXPERIMENT_LEGAL_WELCOME",
"VARIANT",
"BRANCHING_ROOT",
"BRANCH_EXPRESSION",
"BRANCH_ELSE",
"SEND_LEGAL_WELCOME",
"SEND_EMAIL",
"SEND_PUSH_MESSAGE",
"KEYWORD_RESPONSE",
"OPEN_RESPONSE",
"NO_RESPONSE",
"API_CALL_RESULT",
"INCOMING_TEXT",
"CREATE_SUPPORT_TICKET",
"SAVE_USER_ATTRIBUTE",
"TWO_WAY_MESSAGE",
"FORWARD_TO_CONCIERGE",
"TRIGGER_INTEGRATION_POSTBACK"
],
"type": "string",
"description": "The node type, as one of the NodeTypes enum values."
},
"childrenNodeIds": {
"type": "array",
"items": {
"type": "string"
},
"description": "IDs of the child nodes within the revision."
}
},
"additionalProperties": false
},
"description": "Visible nodes on the revision, in traversal order. Hidden structural nodes (ADDER, JOINER, etc.) are filtered out."
},
"status": {
"type": "string",
"description": "The revision status reported by the API."
},
"rawGraph": {
"type": "array",
"items": {
"type": "object",
"required": [
"nodeId",
"nodeType",
"childrenNodeIds"
],
"properties": {
"nodeId": {
"type": "string",
"description": "The node UUID within the revision."
},
"nodeType": {
"enum": [
"TRIGGER",
"DELAY",
"SUBSCRIBER_CONDITION",
"ELSE",
"SEND_MESSAGE",
"SEND_CONVERSATIONAL_MESSAGE",
"END_OF_JOURNEY",
"ADDER",
"JOINER",
"EXPERIMENT",
"EXPERIMENT_LEGAL_WELCOME",
"VARIANT",
"BRANCHING_ROOT",
"BRANCH_EXPRESSION",
"BRANCH_ELSE",
"SEND_LEGAL_WELCOME",
"SEND_EMAIL",
"SEND_PUSH_MESSAGE",
"KEYWORD_RESPONSE",
"OPEN_RESPONSE",
"NO_RESPONSE",
"API_CALL_RESULT",
"INCOMING_TEXT",
"CREATE_SUPPORT_TICKET",
"SAVE_USER_ATTRIBUTE",
"TWO_WAY_MESSAGE",
"FORWARD_TO_CONCIERGE",
"TRIGGER_INTEGRATION_POSTBACK"
],
"type": "string",
"description": "The node type, as one of the NodeTypes enum values."
},
"childrenNodeIds": {
"type": "array",
"items": {
"type": "string"
},
"description": "IDs of the child nodes within the revision."
}
},
"additionalProperties": false
},
"description": "Every node on the revision, unfiltered, for callers that need to reason about structure."
},
"journeyId": {
"type": "number",
"description": "The journey ID."
},
"journeyUrl": {
"type": "string",
"description": "URL that opens the revision in the journey builder or version list."
},
"revisionId": {
"type": "number",
"description": "The revision ID that was read."
},
"revisionKind": {
"enum": [
"DRAFT",
"PUBLISHED",
"OTHER"
],
"type": "string",
"description": "Classifies the read revision against the journey. DRAFT is editable; PUBLISHED is live; OTHER is neither."
},
"failedMessageIds": {
"type": "array",
"items": {
"type": "string"
},
"description": "GraphQL message IDs whose content could not be fetched."
}
},
"additionalProperties": false
},
"annotations": {
"title": "Get Journey Graph",
"readOnlyHint": true,
"openWorldHint": false,
"idempotentHint": true,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description82/100
Get the content of a journey message by its GraphQL message ID. Returns the message body text (SMS/RCS) or subject/preheader (email).
The description explains the capability, when to use it, and what to expect.
Inputs94/100
Input documentation gives an agent enough context to populate the arguments.
messageId
The GraphQL message ID (graphqlMessageId from journey graph)
Clear enough to supply this argument.
userRequestId
Optional universal MCP-server telemetry only. Generate a UUID4 and reuse the same UUID4 for all tool calls caused by the same human request.
Clear enough to supply this argument.
endUserIntentSummary
Optional MCP-server telemetry only. Summarize the immediate human-requested outcome that caused this tool call. Do not include tool-selection rationale.
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"id",
"name",
"status",
"channel",
"body",
"subject",
"preheaderText"
],
"properties": {
"id": {
"type": "string",
"description": "The GraphQL node ID of the message."
},
"body": {
"type": [
"string",
"null"
],
"description": "The message body text (SMS or RCS) or null when the channel has no body."
},
"name": {
"type": "string",
"description": "The message name."
},
"status": {
"anyOf": [
{
"enum": [
"COMPOSE_MESSAGE_STATUS_ACTIVE",
"COMPOSE_MESSAGE_STATUS_DRAFT",
"COMPOSE_MESSAGE_STATUS_UNKNOWN"
],
"type": "string"
},
{
"type": "null"
}
],
"description": "The compose-message status, or null when unknown."
},
"channel": {
"enum": [
"COMPOSE_MESSAGE_CHANNEL_EMAIL",
"COMPOSE_MESSAGE_CHANNEL_MOBILE_INBOX",
"COMPOSE_MESSAGE_CHANNEL_PUSH",
"COMPOSE_MESSAGE_CHANNEL_RBM",
"COMPOSE_MESSAGE_CHANNEL_RCS",
"COMPOSE_MESSAGE_CHANNEL_TEXT",
"COMPOSE_MESSAGE_CHANNEL_UNKNOWN"
],
"type": "string",
"description": "The compose-message channel."
},
"subject": {
"type": [
"string",
"null"
],
"description": "The subject line for an email message, or null."
},
"preheaderText": {
"type": [
"string",
"null"
],
"description": "The preheader text for an email message, or null."
}
},
"additionalProperties": false
}
Original tool metadata
{
"name": "get_journey_message",
"title": "Get Journey Message",
"description": "Get the content of a journey message by its GraphQL message ID. Returns the message body text (SMS/RCS) or subject/preheader (email).",
"inputSchema": {
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"messageId"
],
"properties": {
"messageId": {
"type": "string",
"description": "The GraphQL message ID (graphqlMessageId from journey graph)"
},
"userRequestId": {
"type": "string",
"description": "Optional universal MCP-server telemetry only. Generate a UUID4 and reuse the same UUID4 for all tool calls caused by the same human request."
},
"endUserIntentSummary": {
"type": "string",
"description": "Optional MCP-server telemetry only. Summarize the immediate human-requested outcome that caused this tool call. Do not include tool-selection rationale."
}
}
},
"outputSchema": {
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"id",
"name",
"status",
"channel",
"body",
"subject",
"preheaderText"
],
"properties": {
"id": {
"type": "string",
"description": "The GraphQL node ID of the message."
},
"body": {
"type": [
"string",
"null"
],
"description": "The message body text (SMS or RCS) or null when the channel has no body."
},
"name": {
"type": "string",
"description": "The message name."
},
"status": {
"anyOf": [
{
"enum": [
"COMPOSE_MESSAGE_STATUS_ACTIVE",
"COMPOSE_MESSAGE_STATUS_DRAFT",
"COMPOSE_MESSAGE_STATUS_UNKNOWN"
],
"type": "string"
},
{
"type": "null"
}
],
"description": "The compose-message status, or null when unknown."
},
"channel": {
"enum": [
"COMPOSE_MESSAGE_CHANNEL_EMAIL",
"COMPOSE_MESSAGE_CHANNEL_MOBILE_INBOX",
"COMPOSE_MESSAGE_CHANNEL_PUSH",
"COMPOSE_MESSAGE_CHANNEL_RBM",
"COMPOSE_MESSAGE_CHANNEL_RCS",
"COMPOSE_MESSAGE_CHANNEL_TEXT",
"COMPOSE_MESSAGE_CHANNEL_UNKNOWN"
],
"type": "string",
"description": "The compose-message channel."
},
"subject": {
"type": [
"string",
"null"
],
"description": "The subject line for an email message, or null."
},
"preheaderText": {
"type": [
"string",
"null"
],
"description": "The preheader text for an email message, or null."
}
},
"additionalProperties": false
},
"annotations": {
"title": "Get Journey Message",
"readOnlyHint": true,
"openWorldHint": false,
"idempotentHint": true,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description78/100
Read a journey revision's settings, including entry frequency (eligibilityDurationSeconds and eligibilityDurationUnits). Defaults to the draft revision if no revisionId is specified.
Describe the returned information so the agent knows whether it will answer the request.
Inputs86/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
journeyId
The journey ID
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
revisionId
Revision ID to read settings from. If omitted, reads from the draft revision (or published if no draft exists).
Clear enough to supply this argument.
userRequestId
Optional universal MCP-server telemetry only. Generate a UUID4 and reuse the same UUID4 for all tool calls caused by the same human request.
Clear enough to supply this argument.
endUserIntentSummary
Optional MCP-server telemetry only. Summarize the immediate human-requested outcome that caused this tool call. Do not include tool-selection rationale.
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"journeyId",
"revisionId",
"status",
"eligibilityDurationSeconds",
"eligibilityDurationUnits",
"journeyUrl"
],
"properties": {
"status": {
"type": "string",
"description": "Revision status (e.g. DRAFT, PUBLISHED)"
},
"journeyId": {
"type": "number",
"description": "The journey ID"
},
"journeyUrl": {
"type": "string",
"description": "URL to view the journey revision in the UI"
},
"revisionId": {
"type": "number",
"description": "The revision ID that was read"
},
"eligibilityDurationUnits": {
"type": "string",
"description": "Display unit for the entry frequency (MINUTES, HOURS, DAYS, or WEEKS)"
},
"eligibilityDurationSeconds": {
"type": "number",
"description": "Entry frequency in seconds. 0 means disabled (transactional journeys only)."
}
},
"additionalProperties": false
}
Original tool metadata
{
"name": "get_revision_settings",
"title": "Get Revision Settings",
"description": "Read a journey revision's settings, including entry frequency (eligibilityDurationSeconds and eligibilityDurationUnits). Defaults to the draft revision if no revisionId is specified.",
"inputSchema": {
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"journeyId"
],
"properties": {
"journeyId": {
"type": "integer",
"maximum": 9007199254740991,
"description": "The journey ID",
"exclusiveMinimum": 0
},
"revisionId": {
"type": "integer",
"maximum": 9007199254740991,
"description": "Revision ID to read settings from. If omitted, reads from the draft revision (or published if no draft exists).",
"exclusiveMinimum": 0
},
"userRequestId": {
"type": "string",
"description": "Optional universal MCP-server telemetry only. Generate a UUID4 and reuse the same UUID4 for all tool calls caused by the same human request."
},
"endUserIntentSummary": {
"type": "string",
"description": "Optional MCP-server telemetry only. Summarize the immediate human-requested outcome that caused this tool call. Do not include tool-selection rationale."
}
}
},
"outputSchema": {
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"journeyId",
"revisionId",
"status",
"eligibilityDurationSeconds",
"eligibilityDurationUnits",
"journeyUrl"
],
"properties": {
"status": {
"type": "string",
"description": "Revision status (e.g. DRAFT, PUBLISHED)"
},
"journeyId": {
"type": "number",
"description": "The journey ID"
},
"journeyUrl": {
"type": "string",
"description": "URL to view the journey revision in the UI"
},
"revisionId": {
"type": "number",
"description": "The revision ID that was read"
},
"eligibilityDurationUnits": {
"type": "string",
"description": "Display unit for the entry frequency (MINUTES, HOURS, DAYS, or WEEKS)"
},
"eligibilityDurationSeconds": {
"type": "number",
"description": "Entry frequency in seconds. 0 means disabled (transactional journeys only)."
}
},
"additionalProperties": false
},
"annotations": {
"title": "Get Revision Settings",
"readOnlyHint": true,
"openWorldHint": false,
"idempotentHint": true,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description98/100
List journeys for the company. Returns a paginated, summarized list of journeys (journeyId, name, description, state, triggerId, category, lastUpdated, tag display names). Supports filtering by status (LIVE, INACTIVE, DRAFT), trigger ID, and default flag. Use get_journey for full details on a specific journey.
The description explains the capability, when to use it, and what to expect.
Inputs79/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
pageSize
Number of journeys to return per page (default: 10, max: 100)
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
offset
Pagination offset (default: 0)
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
status
Filter by journey status: LIVE (active and published), INACTIVE (not active), or DRAFT (not yet published)
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
trigger
Filter by trigger ID
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
isDefault
Filter by default journey flag
Explain the meaning of this value, not just its name.
userRequestId
Optional universal MCP-server telemetry only. Generate a UUID4 and reuse the same UUID4 for all tool calls caused by the same human request.
Clear enough to supply this argument.
endUserIntentSummary
Optional MCP-server telemetry only. Summarize the immediate human-requested outcome that caused this tool call. Do not include tool-selection rationale.
The title clearly communicates the tool’s action and subject. Keep it concise.
Description77/100
List available journey templates that can be used when creating a new journey. Templates provide pre-built journey flows for common use cases. Filter by language or channel (SMS, EMAIL, MULTI, PUSH).
Describe the returned information so the agent knows whether it will answer the request.
Inputs81/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
languages
Language codes to filter templates (default: ["en"])
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
channel
Filter by channel type
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
userRequestId
Optional universal MCP-server telemetry only. Generate a UUID4 and reuse the same UUID4 for all tool calls caused by the same human request.
Clear enough to supply this argument.
endUserIntentSummary
Optional MCP-server telemetry only. Summarize the immediate human-requested outcome that caused this tool call. Do not include tool-selection rationale.
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"templates"
],
"properties": {
"templates": {
"type": "array",
"items": {
"type": "object",
"required": [
"id",
"internalId",
"name",
"description",
"channel",
"language",
"triggerType",
"triggerActive"
],
"properties": {
"id": {
"type": "string",
"description": "The GraphQL node ID of the template."
},
"name": {
"type": "string",
"description": "The template name."
},
"channel": {
"enum": [
"JOURNEY_CHANNEL_EMAIL",
"JOURNEY_CHANNEL_MULTI",
"JOURNEY_CHANNEL_PUSH",
"JOURNEY_CHANNEL_SMS",
"JOURNEY_CHANNEL_UNKNOWN"
],
"type": "string",
"description": "The channel served by the template."
},
"language": {
"type": "string",
"description": "The language code the template is written in."
},
"internalId": {
"type": "number",
"description": "The internal numeric ID of the template."
},
"description": {
"type": "string",
"description": "The template description."
},
"triggerType": {
"type": "string",
"description": "The trigger type that starts a journey created from this template."
},
"triggerActive": {
"type": "boolean",
"description": "Whether the trigger is active for the current company."
}
},
"additionalProperties": false
},
"description": "The journey templates that match the filter."
}
},
"additionalProperties": false
}
Original tool metadata
{
"name": "list_journey_templates",
"title": "List Journey Templates",
"description": "List available journey templates that can be used when creating a new journey. Templates provide pre-built journey flows for common use cases. Filter by language or channel (SMS, EMAIL, MULTI, PUSH).",
"inputSchema": {
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"channel": {
"enum": [
"JOURNEY_CHANNEL_EMAIL",
"JOURNEY_CHANNEL_MULTI",
"JOURNEY_CHANNEL_PUSH",
"JOURNEY_CHANNEL_SMS",
"JOURNEY_CHANNEL_UNKNOWN"
],
"type": "string",
"description": "Filter by channel type"
},
"languages": {
"type": "array",
"items": {
"type": "string"
},
"default": [
"en"
],
"description": "Language codes to filter templates (default: [\"en\"])"
},
"userRequestId": {
"type": "string",
"description": "Optional universal MCP-server telemetry only. Generate a UUID4 and reuse the same UUID4 for all tool calls caused by the same human request."
},
"endUserIntentSummary": {
"type": "string",
"description": "Optional MCP-server telemetry only. Summarize the immediate human-requested outcome that caused this tool call. Do not include tool-selection rationale."
}
}
},
"outputSchema": {
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"templates"
],
"properties": {
"templates": {
"type": "array",
"items": {
"type": "object",
"required": [
"id",
"internalId",
"name",
"description",
"channel",
"language",
"triggerType",
"triggerActive"
],
"properties": {
"id": {
"type": "string",
"description": "The GraphQL node ID of the template."
},
"name": {
"type": "string",
"description": "The template name."
},
"channel": {
"enum": [
"JOURNEY_CHANNEL_EMAIL",
"JOURNEY_CHANNEL_MULTI",
"JOURNEY_CHANNEL_PUSH",
"JOURNEY_CHANNEL_SMS",
"JOURNEY_CHANNEL_UNKNOWN"
],
"type": "string",
"description": "The channel served by the template."
},
"language": {
"type": "string",
"description": "The language code the template is written in."
},
"internalId": {
"type": "number",
"description": "The internal numeric ID of the template."
},
"description": {
"type": "string",
"description": "The template description."
},
"triggerType": {
"type": "string",
"description": "The trigger type that starts a journey created from this template."
},
"triggerActive": {
"type": "boolean",
"description": "Whether the trigger is active for the current company."
}
},
"additionalProperties": false
},
"description": "The journey templates that match the filter."
}
},
"additionalProperties": false
},
"annotations": {
"title": "List Journey Templates",
"readOnlyHint": true,
"openWorldHint": false,
"idempotentHint": true,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description95/100
List available journey triggers that can be used when creating a new journey with create_journey. Returns existing journey triggers, identified by their "id", as well as custom events that do not yet have a trigger, whose "id" is null and which are identified by their "customEventType" instead.
The description explains the capability, when to use it, and what to expect.
Inputs98/100
Input documentation gives an agent enough context to populate the arguments.
userRequestId
Optional universal MCP-server telemetry only. Generate a UUID4 and reuse the same UUID4 for all tool calls caused by the same human request.
Clear enough to supply this argument.
endUserIntentSummary
Optional MCP-server telemetry only. Summarize the immediate human-requested outcome that caused this tool call. Do not include tool-selection rationale.
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"triggers"
],
"properties": {
"triggers": {
"type": "array",
"items": {
"type": "object",
"required": [
"kind",
"id",
"name",
"description",
"triggerType",
"eligibleSubscriptionTypes",
"customEventType"
],
"properties": {
"id": {
"type": [
"string",
"null"
],
"description": "GraphQL ID of the existing journey trigger, or null for a custom event that does not have a trigger yet. Pass it to create_journey as triggerId."
},
"kind": {
"enum": [
"TRIGGER",
"CUSTOM_EVENT_TRIGGER"
],
"type": "string",
"description": "TRIGGER: an existing journey trigger. CUSTOM_EVENT_TRIGGER: a custom event based trigger, which additionally requires eligibleSubscriptionType when creating a journey."
},
"name": {
"type": "string",
"description": "Display name of the trigger."
},
"description": {
"type": "string",
"description": "Description of the trigger, if any."
},
"triggerType": {
"enum": [
"JOURNEY_TRIGGER_TYPE_ADD_TO_CART",
"JOURNEY_TRIGGER_TYPE_BACK_IN_STOCK",
"JOURNEY_TRIGGER_TYPE_CUSTOM_EVENT",
"JOURNEY_TRIGGER_TYPE_INTEGRATION_EVENT",
"JOURNEY_TRIGGER_TYPE_JOINED_A_SEGMENT",
"JOURNEY_TRIGGER_TYPE_LOW_INVENTORY",
"JOURNEY_TRIGGER_TYPE_OPT_IN_BACK_IN_STOCK",
"JOURNEY_TRIGGER_TYPE_ORDER_CREATED",
"JOURNEY_TRIGGER_TYPE_ORDER_CREATED_PROMOTIONAL",
"JOURNEY_TRIGGER_TYPE_ORDER_FULFILLED",
"JOURNEY_TRIGGER_TYPE_ORDER_SUBSCRIPTION_CHARGE_FAILED",
"JOURNEY_TRIGGER_TYPE_ORDER_SUBSCRIPTION_CREATED",
"JOURNEY_TRIGGER_TYPE_ORDER_SUBSCRIPTION_SKIPPED",
"JOURNEY_TRIGGER_TYPE_ORDER_SUBSCRIPTION_UPCOMING_CHARGE",
"JOURNEY_TRIGGER_TYPE_PAGE_VIEW",
"JOURNEY_TRIGGER_TYPE_PRICE_DROP",
"JOURNEY_TRIGGER_TYPE_PRODUCT_REVIEWS_REQUESTED_ON_DELIVERY",
"JOURNEY_TRIGGER_TYPE_PRODUCT_REVIEWS_REQUESTED_ON_FULFILLMENT",
"JOURNEY_TRIGGER_TYPE_PRODUCT_VIEW",
"JOURNEY_TRIGGER_TYPE_PURCHASE",
"JOURNEY_TRIGGER_TYPE_SIGNED_UP",
"JOURNEY_TRIGGER_TYPE_SIGNED_UP_FOR_EMAIL",
"JOURNEY_TRIGGER_TYPE_TEXTED_A_KEYWORD",
"JOURNEY_TRIGGER_TYPE_UNKNOWN",
"JOURNEY_TRIGGER_TYPE_USER_WIN_BACK"
],
"type": "string",
"description": "JourneyTriggerType of the trigger (e.g. JOURNEY_TRIGGER_TYPE_CUSTOM_EVENT)."
},
"customEventType": {
"type": [
"string",
"null"
],
"description": "The custom event type backing this trigger, when it is custom-event based; null otherwise. Pass it to create_journey as customEventType when \"id\" is null."
},
"eligibleSubscriptionTypes": {
"type": "array",
"items": {
"enum": [
"TYPE_CHECKOUT_ABANDONED",
"TYPE_CONTACT",
"TYPE_MARKETING",
"TYPE_TRANSACTIONAL",
"TYPE_UNKNOWN"
],
"type": "string"
},
"description": "Subscription types eligible to enter a journey started by this trigger."
}
},
"additionalProperties": false
},
"description": "Available journey triggers that can be used to create a new journey."
}
},
"additionalProperties": false
}
Original tool metadata
{
"name": "list_journey_triggers",
"title": "List Journey Triggers",
"description": "List available journey triggers that can be used when creating a new journey with create_journey. Returns existing journey triggers, identified by their \"id\", as well as custom events that do not yet have a trigger, whose \"id\" is null and which are identified by their \"customEventType\" instead.",
"inputSchema": {
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"userRequestId": {
"type": "string",
"description": "Optional universal MCP-server telemetry only. Generate a UUID4 and reuse the same UUID4 for all tool calls caused by the same human request."
},
"endUserIntentSummary": {
"type": "string",
"description": "Optional MCP-server telemetry only. Summarize the immediate human-requested outcome that caused this tool call. Do not include tool-selection rationale."
}
}
},
"outputSchema": {
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"triggers"
],
"properties": {
"triggers": {
"type": "array",
"items": {
"type": "object",
"required": [
"kind",
"id",
"name",
"description",
"triggerType",
"eligibleSubscriptionTypes",
"customEventType"
],
"properties": {
"id": {
"type": [
"string",
"null"
],
"description": "GraphQL ID of the existing journey trigger, or null for a custom event that does not have a trigger yet. Pass it to create_journey as triggerId."
},
"kind": {
"enum": [
"TRIGGER",
"CUSTOM_EVENT_TRIGGER"
],
"type": "string",
"description": "TRIGGER: an existing journey trigger. CUSTOM_EVENT_TRIGGER: a custom event based trigger, which additionally requires eligibleSubscriptionType when creating a journey."
},
"name": {
"type": "string",
"description": "Display name of the trigger."
},
"description": {
"type": "string",
"description": "Description of the trigger, if any."
},
"triggerType": {
"enum": [
"JOURNEY_TRIGGER_TYPE_ADD_TO_CART",
"JOURNEY_TRIGGER_TYPE_BACK_IN_STOCK",
"JOURNEY_TRIGGER_TYPE_CUSTOM_EVENT",
"JOURNEY_TRIGGER_TYPE_INTEGRATION_EVENT",
"JOURNEY_TRIGGER_TYPE_JOINED_A_SEGMENT",
"JOURNEY_TRIGGER_TYPE_LOW_INVENTORY",
"JOURNEY_TRIGGER_TYPE_OPT_IN_BACK_IN_STOCK",
"JOURNEY_TRIGGER_TYPE_ORDER_CREATED",
"JOURNEY_TRIGGER_TYPE_ORDER_CREATED_PROMOTIONAL",
"JOURNEY_TRIGGER_TYPE_ORDER_FULFILLED",
"JOURNEY_TRIGGER_TYPE_ORDER_SUBSCRIPTION_CHARGE_FAILED",
"JOURNEY_TRIGGER_TYPE_ORDER_SUBSCRIPTION_CREATED",
"JOURNEY_TRIGGER_TYPE_ORDER_SUBSCRIPTION_SKIPPED",
"JOURNEY_TRIGGER_TYPE_ORDER_SUBSCRIPTION_UPCOMING_CHARGE",
"JOURNEY_TRIGGER_TYPE_PAGE_VIEW",
"JOURNEY_TRIGGER_TYPE_PRICE_DROP",
"JOURNEY_TRIGGER_TYPE_PRODUCT_REVIEWS_REQUESTED_ON_DELIVERY",
"JOURNEY_TRIGGER_TYPE_PRODUCT_REVIEWS_REQUESTED_ON_FULFILLMENT",
"JOURNEY_TRIGGER_TYPE_PRODUCT_VIEW",
"JOURNEY_TRIGGER_TYPE_PURCHASE",
"JOURNEY_TRIGGER_TYPE_SIGNED_UP",
"JOURNEY_TRIGGER_TYPE_SIGNED_UP_FOR_EMAIL",
"JOURNEY_TRIGGER_TYPE_TEXTED_A_KEYWORD",
"JOURNEY_TRIGGER_TYPE_UNKNOWN",
"JOURNEY_TRIGGER_TYPE_USER_WIN_BACK"
],
"type": "string",
"description": "JourneyTriggerType of the trigger (e.g. JOURNEY_TRIGGER_TYPE_CUSTOM_EVENT)."
},
"customEventType": {
"type": [
"string",
"null"
],
"description": "The custom event type backing this trigger, when it is custom-event based; null otherwise. Pass it to create_journey as customEventType when \"id\" is null."
},
"eligibleSubscriptionTypes": {
"type": "array",
"items": {
"enum": [
"TYPE_CHECKOUT_ABANDONED",
"TYPE_CONTACT",
"TYPE_MARKETING",
"TYPE_TRANSACTIONAL",
"TYPE_UNKNOWN"
],
"type": "string"
},
"description": "Subscription types eligible to enter a journey started by this trigger."
}
},
"additionalProperties": false
},
"description": "Available journey triggers that can be used to create a new journey."
}
},
"additionalProperties": false
},
"annotations": {
"title": "List Journey Triggers",
"readOnlyHint": true,
"openWorldHint": false,
"idempotentHint": true,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description87/100
List the real values available for a product attribute (product names, categories, tags, colors, brands, sizes, collections, options, sales channels). Use it to fill a DYNAMIC_MULTI_SELECT branch selection — product branching needs the company's actual values, which cannot be guessed. Supports search and paging.
The description explains the capability, when to use it, and what to expect.
Inputs89/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
attribute
The product attribute to list values for. Use the `attribute` from a DYNAMIC_MULTI_SELECT schema in get_journey_configuration or get_journey_branch rather than picking one; values are only valid for that attribute's own schema. Currently PRODUCT_ATTRIBUTE_CATEGORY, PRODUCT_ATTRIBUTE_TAG, PRODUCT_ATTRIBUTE_NAME, PRODUCT_ATTRIBUTE_COLOR, PRODUCT_ATTRIBUTE_BRAND, PRODUCT_ATTRIBUTE_SIZE, PRODUCT_ATTRIBUTE_COLLECTION, PRODUCT_ATTRIBUTE_OPTION, SALES_CHANNEL.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
name
Required for PRODUCT_ATTRIBUTE_OPTION to return the values of a specific option, and ignored for every other attribute. The products API returns unrelated values without it.
Clear enough to supply this argument.
query
Optional search text to narrow the values, matched by the products API.
Clear enough to supply this argument.
pageSize
Values per page. Defaults to 20.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
offset
Number of values to skip, for paging through totalResults.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
userRequestId
Optional universal MCP-server telemetry only. Generate a UUID4 and reuse the same UUID4 for all tool calls caused by the same human request.
Clear enough to supply this argument.
endUserIntentSummary
Optional MCP-server telemetry only. Summarize the immediate human-requested outcome that caused this tool call. Do not include tool-selection rationale.
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"attribute",
"values",
"totalResults"
],
"properties": {
"values": {
"type": "array",
"items": {
"type": "object",
"required": [
"optionValue",
"displayName"
],
"properties": {
"displayName": {
"type": "string",
"description": "Human-readable label for the value."
},
"optionValue": {
"type": "string",
"description": "Pass this in a DYNAMIC_MULTI_SELECT selection value."
}
},
"additionalProperties": false
},
"description": "Values ready to use as DYNAMIC_MULTI_SELECT selection entries. Deleted products are omitted."
},
"attribute": {
"type": "string",
"description": "The attribute the values belong to."
},
"totalResults": {
"type": "number",
"description": "Total values available for this attribute and query, for paging."
}
},
"additionalProperties": false
}
Original tool metadata
{
"name": "list_product_attribute_values",
"title": "List Product Attribute Values",
"description": "List the real values available for a product attribute (product names, categories, tags, colors, brands, sizes, collections, options, sales channels). Use it to fill a DYNAMIC_MULTI_SELECT branch selection — product branching needs the company's actual values, which cannot be guessed. Supports search and paging.",
"inputSchema": {
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"attribute"
],
"properties": {
"name": {
"type": "string",
"description": "Required for PRODUCT_ATTRIBUTE_OPTION to return the values of a specific option, and ignored for every other attribute. The products API returns unrelated values without it."
},
"query": {
"type": "string",
"description": "Optional search text to narrow the values, matched by the products API."
},
"offset": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": 0,
"description": "Number of values to skip, for paging through totalResults."
},
"pageSize": {
"type": "integer",
"maximum": 100,
"description": "Values per page. Defaults to 20.",
"exclusiveMinimum": 0
},
"attribute": {
"type": "string",
"minLength": 1,
"description": "The product attribute to list values for. Use the `attribute` from a DYNAMIC_MULTI_SELECT schema in get_journey_configuration or get_journey_branch rather than picking one; values are only valid for that attribute's own schema. Currently PRODUCT_ATTRIBUTE_CATEGORY, PRODUCT_ATTRIBUTE_TAG, PRODUCT_ATTRIBUTE_NAME, PRODUCT_ATTRIBUTE_COLOR, PRODUCT_ATTRIBUTE_BRAND, PRODUCT_ATTRIBUTE_SIZE, PRODUCT_ATTRIBUTE_COLLECTION, PRODUCT_ATTRIBUTE_OPTION, SALES_CHANNEL."
},
"userRequestId": {
"type": "string",
"description": "Optional universal MCP-server telemetry only. Generate a UUID4 and reuse the same UUID4 for all tool calls caused by the same human request."
},
"endUserIntentSummary": {
"type": "string",
"description": "Optional MCP-server telemetry only. Summarize the immediate human-requested outcome that caused this tool call. Do not include tool-selection rationale."
}
}
},
"outputSchema": {
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"attribute",
"values",
"totalResults"
],
"properties": {
"values": {
"type": "array",
"items": {
"type": "object",
"required": [
"optionValue",
"displayName"
],
"properties": {
"displayName": {
"type": "string",
"description": "Human-readable label for the value."
},
"optionValue": {
"type": "string",
"description": "Pass this in a DYNAMIC_MULTI_SELECT selection value."
}
},
"additionalProperties": false
},
"description": "Values ready to use as DYNAMIC_MULTI_SELECT selection entries. Deleted products are omitted."
},
"attribute": {
"type": "string",
"description": "The attribute the values belong to."
},
"totalResults": {
"type": "number",
"description": "Total values available for this attribute and query, for paging."
}
},
"additionalProperties": false
},
"annotations": {
"title": "List Product Attribute Values",
"readOnlyHint": true,
"openWorldHint": false,
"idempotentHint": true,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description99/100
List the company's custom user attributes and their allowed values. Pass a searchTerm to find a specific attribute by name (recommended when there are many attributes). Use this to discover the IDs required to configure a SAVE_USER_ATTRIBUTE journey node or a CUSTOM_USER_PROPERTY_TYPE branch: each attribute returns `userAttributeId`, `userAttributeName`, the raw `propertyType`, and a `branchPropertyType` (the value to use in a branch selection), and each enumerated value returns `userAttributeValueId` and `userAttributeValueName`. For a branch, pass `userAttributeId` as the selection's userProperty.property and `branchPropertyType` as its propertyType. For a SAVE_USER_ATTRIBUTE node, pass the four userAttribute* fields to update_journey_node.
The description explains the capability, when to use it, and what to expect.
Inputs95/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
searchTerm
Case-insensitive substring filter on the attribute name. When provided, the tool paginates through the company's attributes and returns only those whose name contains this term — use it to find a specific attribute (e.g. "VIP") among many. Ignores `first`/`after`.
Clear enough to supply this argument.
first
Number of user attributes to return (max 100, default 50). Ignored when searchTerm is set.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
after
Pagination cursor (the endCursor returned by a previous page). Ignored when searchTerm is set.
Clear enough to supply this argument.
userRequestId
Optional universal MCP-server telemetry only. Generate a UUID4 and reuse the same UUID4 for all tool calls caused by the same human request.
Clear enough to supply this argument.
endUserIntentSummary
Optional MCP-server telemetry only. Summarize the immediate human-requested outcome that caused this tool call. Do not include tool-selection rationale.
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"attributes",
"pageInfo"
],
"properties": {
"pageInfo": {
"type": "object",
"required": [
"hasNextPage",
"endCursor"
],
"properties": {
"endCursor": {
"type": [
"string",
"null"
],
"description": "Cursor to pass as `after` to fetch the next page."
},
"hasNextPage": {
"type": "boolean",
"description": "Whether more attributes are available."
}
},
"description": "Pagination information for the attribute list.",
"additionalProperties": false
},
"attributes": {
"type": "array",
"items": {
"type": "object",
"required": [
"userAttributeId",
"userAttributeName",
"propertyType",
"branchPropertyType",
"values"
],
"properties": {
"values": {
"type": "array",
"items": {
"type": "object",
"required": [
"userAttributeValueId",
"userAttributeValueName"
],
"properties": {
"userAttributeValueId": {
"type": "string",
"description": "Pass as `userAttributeValueId` when configuring a SAVE_USER_ATTRIBUTE node."
},
"userAttributeValueName": {
"type": "string",
"description": "Human-readable value; pass as `userAttributeValueName` when configuring a SAVE_USER_ATTRIBUTE node."
}
},
"additionalProperties": false
},
"description": "Selectable values for enumerated attributes (empty for non-enumerated types)."
},
"propertyType": {
"type": "string",
"description": "Raw GraphQL attribute data type (e.g. TYPE_ENUM, TYPE_BOOL, TYPE_STRING). SAVE_USER_ATTRIBUTE nodes currently support enumerated (TYPE_ENUM) attributes. For a branch selection, use branchPropertyType instead — NOT this raw value."
},
"userAttributeId": {
"type": "string",
"description": "Pass as `userAttributeId` when configuring a SAVE_USER_ATTRIBUTE node."
},
"userAttributeName": {
"type": "string",
"description": "Human-readable attribute name; pass as `userAttributeName` when configuring a SAVE_USER_ATTRIBUTE node."
},
"branchPropertyType": {
"anyOf": [
{
"enum": [
"STRING",
"NUMBER",
"BOOLEAN",
"DATE",
"ENUM"
],
"type": "string"
},
{
"type": "null"
}
],
"description": "The value to pass as USER_PROPERTY_COMPARATOR.selectionProperties.propertyType when branching on this attribute (mapped from the raw GraphQL type). null when the attribute type is not branch-compatible."
}
},
"additionalProperties": false
},
"description": "Custom user attributes for the company, with the IDs needed to configure a SAVE_USER_ATTRIBUTE node."
}
},
"additionalProperties": false
}
Original tool metadata
{
"name": "list_user_attributes",
"title": "List User Attributes",
"description": "List the company's custom user attributes and their allowed values. Pass a searchTerm to find a specific attribute by name (recommended when there are many attributes). Use this to discover the IDs required to configure a SAVE_USER_ATTRIBUTE journey node or a CUSTOM_USER_PROPERTY_TYPE branch: each attribute returns `userAttributeId`, `userAttributeName`, the raw `propertyType`, and a `branchPropertyType` (the value to use in a branch selection), and each enumerated value returns `userAttributeValueId` and `userAttributeValueName`. For a branch, pass `userAttributeId` as the selection's userProperty.property and `branchPropertyType` as its propertyType. For a SAVE_USER_ATTRIBUTE node, pass the four userAttribute* fields to update_journey_node.",
"inputSchema": {
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"after": {
"type": "string",
"description": "Pagination cursor (the endCursor returned by a previous page). Ignored when searchTerm is set."
},
"first": {
"type": "integer",
"default": 50,
"maximum": 100,
"description": "Number of user attributes to return (max 100, default 50). Ignored when searchTerm is set.",
"exclusiveMinimum": 0
},
"searchTerm": {
"type": "string",
"description": "Case-insensitive substring filter on the attribute name. When provided, the tool paginates through the company's attributes and returns only those whose name contains this term — use it to find a specific attribute (e.g. \"VIP\") among many. Ignores `first`/`after`."
},
"userRequestId": {
"type": "string",
"description": "Optional universal MCP-server telemetry only. Generate a UUID4 and reuse the same UUID4 for all tool calls caused by the same human request."
},
"endUserIntentSummary": {
"type": "string",
"description": "Optional MCP-server telemetry only. Summarize the immediate human-requested outcome that caused this tool call. Do not include tool-selection rationale."
}
}
},
"outputSchema": {
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"attributes",
"pageInfo"
],
"properties": {
"pageInfo": {
"type": "object",
"required": [
"hasNextPage",
"endCursor"
],
"properties": {
"endCursor": {
"type": [
"string",
"null"
],
"description": "Cursor to pass as `after` to fetch the next page."
},
"hasNextPage": {
"type": "boolean",
"description": "Whether more attributes are available."
}
},
"description": "Pagination information for the attribute list.",
"additionalProperties": false
},
"attributes": {
"type": "array",
"items": {
"type": "object",
"required": [
"userAttributeId",
"userAttributeName",
"propertyType",
"branchPropertyType",
"values"
],
"properties": {
"values": {
"type": "array",
"items": {
"type": "object",
"required": [
"userAttributeValueId",
"userAttributeValueName"
],
"properties": {
"userAttributeValueId": {
"type": "string",
"description": "Pass as `userAttributeValueId` when configuring a SAVE_USER_ATTRIBUTE node."
},
"userAttributeValueName": {
"type": "string",
"description": "Human-readable value; pass as `userAttributeValueName` when configuring a SAVE_USER_ATTRIBUTE node."
}
},
"additionalProperties": false
},
"description": "Selectable values for enumerated attributes (empty for non-enumerated types)."
},
"propertyType": {
"type": "string",
"description": "Raw GraphQL attribute data type (e.g. TYPE_ENUM, TYPE_BOOL, TYPE_STRING). SAVE_USER_ATTRIBUTE nodes currently support enumerated (TYPE_ENUM) attributes. For a branch selection, use branchPropertyType instead — NOT this raw value."
},
"userAttributeId": {
"type": "string",
"description": "Pass as `userAttributeId` when configuring a SAVE_USER_ATTRIBUTE node."
},
"userAttributeName": {
"type": "string",
"description": "Human-readable attribute name; pass as `userAttributeName` when configuring a SAVE_USER_ATTRIBUTE node."
},
"branchPropertyType": {
"anyOf": [
{
"enum": [
"STRING",
"NUMBER",
"BOOLEAN",
"DATE",
"ENUM"
],
"type": "string"
},
{
"type": "null"
}
],
"description": "The value to pass as USER_PROPERTY_COMPARATOR.selectionProperties.propertyType when branching on this attribute (mapped from the raw GraphQL type). null when the attribute type is not branch-compatible."
}
},
"additionalProperties": false
},
"description": "Custom user attributes for the company, with the IDs needed to configure a SAVE_USER_ATTRIBUTE node."
}
},
"additionalProperties": false
},
"annotations": {
"title": "List User Attributes",
"readOnlyHint": true,
"openWorldHint": false,
"idempotentHint": true,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description76/100
Get a message by ID, including its content. Works for campaign and journey messages alike — for a campaign message the ID comes from get_campaign_message_group, for a journey message from get_journey_graph.
Describe the returned information so the agent knows whether it will answer the request.
Inputs76/100
Clarify units, where to obtain this value, or conventions not already expressed in the schema.
messageId
The message ID
Clarify units, where to obtain this value, or conventions not already expressed in the schema.
userRequestId
Optional universal MCP-server telemetry only. Generate a UUID4 and reuse the same UUID4 for all tool calls caused by the same human request.
Clear enough to supply this argument.
endUserIntentSummary
Optional MCP-server telemetry only. Summarize the immediate human-requested outcome that caused this tool call. Do not include tool-selection rationale.
The title clearly communicates the tool’s action and subject. Keep it concise.
Description90/100
List companies which the current user belongs to with optional search filtering and pagination. Use this to find exact company IDs before company-scoped work.
The description explains the capability, when to use it, and what to expect.
Inputs81/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
searchTerm
Search term to filter companies by name
Clear enough to supply this argument.
first
Number of companies to return, maximum of 20
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
after
Cursor for pagination
Explain the meaning of this value, not just its name.
userRequestId
Optional universal MCP-server telemetry only. Generate a UUID4 and reuse the same UUID4 for all tool calls caused by the same human request.
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"companies",
"pageInfo"
],
"properties": {
"pageInfo": {
"type": "object",
"required": [
"hasNextPage",
"endCursor"
],
"properties": {
"endCursor": {
"type": "string",
"description": "Cursor for requesting the next page of companies."
},
"hasNextPage": {
"type": "boolean",
"description": "Whether another page of companies is available."
}
},
"description": "Pagination information for the returned company list.",
"additionalProperties": false
},
"companies": {
"type": "array",
"items": {
"type": "object",
"required": [
"id",
"name"
],
"properties": {
"id": {
"type": "string",
"description": "Node ID of a company the current user can access."
},
"name": {
"type": "string",
"description": "Display name of the company."
}
},
"additionalProperties": false
},
"description": "Companies matching the requested filter and pagination window."
}
},
"additionalProperties": false
}
Original tool metadata
{
"name": "list_user_companies",
"title": "List User Companies",
"description": "List companies which the current user belongs to with optional search filtering and pagination. Use this to find exact company IDs before company-scoped work.",
"inputSchema": {
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"after": {
"type": "string",
"description": "Cursor for pagination"
},
"first": {
"type": "number",
"default": 5,
"maximum": 20,
"description": "Number of companies to return, maximum of 20",
"exclusiveMinimum": 0
},
"searchTerm": {
"type": "string",
"description": "Search term to filter companies by name"
},
"userRequestId": {
"type": "string",
"description": "Optional universal MCP-server telemetry only. Generate a UUID4 and reuse the same UUID4 for all tool calls caused by the same human request."
}
}
},
"outputSchema": {
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"companies",
"pageInfo"
],
"properties": {
"pageInfo": {
"type": "object",
"required": [
"hasNextPage",
"endCursor"
],
"properties": {
"endCursor": {
"type": "string",
"description": "Cursor for requesting the next page of companies."
},
"hasNextPage": {
"type": "boolean",
"description": "Whether another page of companies is available."
}
},
"description": "Pagination information for the returned company list.",
"additionalProperties": false
},
"companies": {
"type": "array",
"items": {
"type": "object",
"required": [
"id",
"name"
],
"properties": {
"id": {
"type": "string",
"description": "Node ID of a company the current user can access."
},
"name": {
"type": "string",
"description": "Display name of the company."
}
},
"additionalProperties": false
},
"description": "Companies matching the requested filter and pagination window."
}
},
"additionalProperties": false
},
"annotations": {
"title": "List User Companies",
"readOnlyHint": true,
"openWorldHint": false,
"idempotentHint": true,
"destructiveHint": false
}
}
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"status",
"message"
],
"properties": {
"status": {
"enum": [
"switched",
"step_up_required",
"denied"
],
"type": "string",
"description": "\"switched\" means subsequent tool calls use this company. \"step_up_required\" means the company was not selected because the user must complete additional authentication first, and is not a failure. \"denied\" means the user has no access to this company and a different one must be chosen."
},
"company": {
"type": "object",
"required": [
"id",
"displayName"
],
"properties": {
"id": {
"type": "string",
"minLength": 1
},
"displayName": {
"type": "string",
"minLength": 1
}
},
"description": "Company now selected for subsequent MCP tool calls. Present only when status is \"switched\".",
"additionalProperties": false
},
"message": {
"type": "string",
"description": "Confirmation of the switch when status is \"switched\"; otherwise why the company was not selected."
}
},
"additionalProperties": false
}
Original tool metadata
{
"name": "switch_company",
"title": "Switch Company",
"description": "Sets the company ID for the current user session. Subsequent tool calls will be scoped to the ID of the selected company.",
"inputSchema": {
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"companyId"
],
"properties": {
"companyId": {
"type": "string",
"description": "The company ID to associate with the current user session (the \"id\" field from list_user_companies)."
},
"userRequestId": {
"type": "string",
"description": "Optional universal MCP-server telemetry only. Generate a UUID4 and reuse the same UUID4 for all tool calls caused by the same human request."
}
}
},
"outputSchema": {
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"status",
"message"
],
"properties": {
"status": {
"enum": [
"switched",
"step_up_required",
"denied"
],
"type": "string",
"description": "\"switched\" means subsequent tool calls use this company. \"step_up_required\" means the company was not selected because the user must complete additional authentication first, and is not a failure. \"denied\" means the user has no access to this company and a different one must be chosen."
},
"company": {
"type": "object",
"required": [
"id",
"displayName"
],
"properties": {
"id": {
"type": "string",
"minLength": 1
},
"displayName": {
"type": "string",
"minLength": 1
}
},
"description": "Company now selected for subsequent MCP tool calls. Present only when status is \"switched\".",
"additionalProperties": false
},
"message": {
"type": "string",
"description": "Confirmation of the switch when status is \"switched\"; otherwise why the company was not selected."
}
},
"additionalProperties": false
},
"annotations": {
"title": "Switch Company",
"readOnlyHint": true,
"openWorldHint": false,
"idempotentHint": true,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description68/100
Get detailed segment info by ID.
Describe the returned information so the agent knows whether it will answer the request.
Inputs83/100
Clarify units, where to obtain this value, or conventions not already expressed in the schema.
segmentId
Segment ID (GraphQL node ID format).
Clarify units, where to obtain this value, or conventions not already expressed in the schema.
userRequestId
Optional universal MCP-server telemetry only. Generate a UUID4 and reuse the same UUID4 for all tool calls caused by the same human request.
Clear enough to supply this argument.
endUserIntentSummary
Optional MCP-server telemetry only. Summarize the immediate human-requested outcome that caused this tool call. Do not include tool-selection rationale.
The title clearly communicates the tool’s action and subject. Keep it concise.
Description78/100
Get subscriber counts for a segment, broken down by channel with fatigue information.
The description explains the capability, when to use it, and what to expect.
Inputs83/100
Clarify units, where to obtain this value, or conventions not already expressed in the schema.
segmentId
Segment ID (GraphQL node ID format).
Clarify units, where to obtain this value, or conventions not already expressed in the schema.
userRequestId
Optional universal MCP-server telemetry only. Generate a UUID4 and reuse the same UUID4 for all tool calls caused by the same human request.
Clear enough to supply this argument.
endUserIntentSummary
Optional MCP-server telemetry only. Summarize the immediate human-requested outcome that caused this tool call. Do not include tool-selection rationale.
The title clearly communicates the tool’s action and subject. Keep it concise.
Description66/100
List segments for a company with filtering, search, and pagination.
Describe the returned information so the agent knows whether it will answer the request.
Inputs79/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
source
Filter by segment source.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
query
Search by segment name
Clear enough to supply this argument.
sortBy
Field to sort by (default: CREATED)
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
order
Sort order (default: DESC)
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
first
Number of segments to return (default: 20)
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
after
Pagination cursor
Explain the meaning of this value, not just its name.
userRequestId
Optional universal MCP-server telemetry only. Generate a UUID4 and reuse the same UUID4 for all tool calls caused by the same human request.
Clear enough to supply this argument.
endUserIntentSummary
Optional MCP-server telemetry only. Summarize the immediate human-requested outcome that caused this tool call. Do not include tool-selection rationale.
The title clearly communicates the tool’s action and subject. Keep it concise.
Description72/100
List all subscribers in a segment. Returns up to 20 subscribers.
Describe the returned information so the agent knows whether it will answer the request.
Inputs91/100
Input documentation gives an agent enough context to populate the arguments.
segmentId
Segment ID (internal/legacy ID, not GraphQL node ID)
Clear enough to supply this argument.
userRequestId
Optional universal MCP-server telemetry only. Generate a UUID4 and reuse the same UUID4 for all tool calls caused by the same human request.
Clear enough to supply this argument.
endUserIntentSummary
Optional MCP-server telemetry only. Summarize the immediate human-requested outcome that caused this tool call. Do not include tool-selection rationale.
attentive-mcp-server setup, tools, quality score, publishing readiness, and alternatives.
How do I add attentive-mcp-server to Claude, ChatGPT, or Cursor?
Add attentive-mcp-server to Claude, ChatGPT, or Cursor by connecting its remote MCP URL in each client's MCP settings. In Claude, add a custom connector. In ChatGPT, add an MCP app. In Cursor, add an MCP server under Settings. The MCP URL is https://attentive-ui-mcp.attentivemobile.com/mcp.
Is attentive-mcp-server MCP ready for ChatGPT and Claude?
As of October 15, 2026, attentive-mcp-server scores 100/100 on Manufact's MCP publishing checklist. The scan meets ChatGPT publishing checks and meets Claude publishing checks. Passing these checks does not guarantee marketplace approval.
How clear is attentive-mcp-server's MCP tool documentation?
As of October 15, 2026, attentive-mcp-server scores 91/100 in Manufact's review of tool titles, descriptions, input and output schemas, and behavior annotations. The review covers 33 of 33 discovered tools. The quality score measures documentation clarity; runtime behavior and marketplace readiness require separate checks.
What are the best alternatives to attentive-mcp-server?
As of October 16, 2026, alternatives to attentive-mcp-server in marketing-seo on the Manufact MCP catalog include Buzzfy, Airefs AI Visibility, TalkGenAI, RankControl, and Dreamlit MCP.
How can attentive-mcp-server improve its MCP documentation?
list_brand_assets is the lowest-scoring reviewed tool at 75/100. No output schema is declared. Add one for structured results so clients can interpret returned fields. Open its review for feedback and a copyable fix prompt, then rerun the documentation review after updating your tool metadata.
Not your MCP?
Review any public or OAuth MCP server for protocol compatibility, tool documentation, and ChatGPT and Claude publishing readiness. No account required.