Skip to main content
Glama
growsurf

GrowSurf MCP Server

Official

growsurf_get_campaign_analytics

Read-onlyIdempotent

Fetch GrowSurf program analytics: participants, referrals, impressions, per-channel shares, and affiliate revenue metrics. Optionally add per-period series, status counts, rates, email, or engagement data.

Instructions

Fetch analytics for your GrowSurf program: participants, referrals, impressions, per-channel shares, and affiliate revenue, commission, and payout metrics when applicable. For what impressions, unique impressions, leads, and referrals mean, or why counts differ from another analytics tool, call growsurf_troubleshoot_referral_tracking with symptom numbers_do_not_match rather than guessing. Pass interval (day, week, or month) for a per-period series. Pass comma-separated include values for previousPeriod, statusCounts, rates, email, or engagement. engagement groups unique active, sharing, repeat, and retained participants by when portal views and share actions occurred. Its coverageStartAt, state, and reason distinguish measured zeroes from partial or unavailable history. Scope the timeframe with days (default 365, max 1825) or an explicit startDate/endDate window (Unix ms). timezone and platform apply to engagement only. Targets campaignId if passed, otherwise GROWSURF_CAMPAIGN_ID.

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
daysNo
endDateNoEnd of the timeframe, Unix timestamp in ms.
includeNoComma-separated optional data: `previousPeriod`, `statusCounts`, `rates`, `email`, and `engagement`. Combine values when the question needs more than one view.
intervalNoday/week/month adds a per-period `series`; total (default) returns totals only.
platformNoClient-platform filter for engagement. Defaults to `ALL`.
timezoneNoIANA timezone for engagement interval and distinct-day calculations. Used with `include=engagement`.
startDateNoStart of the timeframe, Unix timestamp in ms. Use with endDate instead of days.
campaignIdNoTarget program (campaign) id for this call. Defaults to GROWSURF_CAMPAIGN_ID when omitted. Pass the `id` returned by growsurf_create_campaign to configure or operate a program you just created, without restarting the server.

Output Schema

TableJSON Schema
NameRequiredDescriptionDefault
emailNoSent, delivered, opened, clicked, bounced, and spam complaint metrics for program emails in the requested window.
ratesNoDerived referral rates, each a ratio from 0 to 1. Present only when `include` contains `rates`.
seriesNoPer-period totals in ascending order. Present only when `interval` is `day`, `week`, or `month`.
endDateNoEnd of the analytics timeframe, as a Unix timestamp in milliseconds.
analyticsNoAnalytics totals: `invites`, `impressions`, `uniqueImpressions`, `participants`, `referrals`, `referralCreditPendings`, `referralCreditExpireds`, per-channel share counts (`emailShares`, `twitterShares`, `copyRefLinkShares`, ...), and for affiliate programs `totalRevenue` and `totalCommissions` (in minor currency units (e.g. cents)) plus `totalCommissionCount` and `uniqueCommissionReferrals`.
startDateNoStart of the analytics timeframe, as a Unix timestamp in milliseconds.
engagementNoOpt-in participant engagement grouped by when activity occurred.
statusCountsNoStatus-count breakdowns: dashboard-aligned reward counts, and for affiliate programs `affiliateStatus`, `commissionStatus`, and `payoutStatus` (counts and amounts in minor currency units (e.g. cents)). Present only when `include` contains `statusCounts`.
previousPeriodNoTotals for the equal-length window immediately before the requested one (`analytics`, `startDate`, `endDate`). Present only when `include` contains `previousPeriod`.

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed4 schema fields changedv0.14.0
    • changedInput schema / properties / include / description
      Previous value: -"Comma-separated optional data: `previousPeriod`, `statusCounts`, `rates`, and `email`. Combine `email` with `previousPeriod` or a non-total `interval` to receive matching email metrics for those windows."New value: +"Comma-separated optional data: `previousPeriod`, `statusCounts`, `rates`, `email`, and `engagement`. Combine values when the question needs more than one view."
    • addedInput schema / properties / platform
      Added value: +{
      +  "description": "Client-platform filter for engagement. Defaults to `ALL`.",
      +  "enum": [
      +    "ALL",
      +    "WEB",
      +    "IOS",
      +    "ANDROID"
      +  ],
      +  "type": "string"
      +}
    • addedInput schema / properties / timezone
      Added value: +{
      +  "description": "IANA timezone for engagement interval and distinct-day calculations. Used with `include=engagement`.",
      +  "type": "string"
      +}
    • addedOutput schema / properties / engagement
      Added value: +{
      +  "description": "Opt-in participant engagement grouped by when activity occurred.",
      +  "properties": {
      +    "breakdowns": {
      +      "description": "Engagement grouped by platform, portal source, and share channel.",
      +      "properties": {
      +        "firstShareChannels": {
      +          "items": {
      +            "properties": {
      +              "key": {
      +                "description": "Stable first-share channel key.",
      +                "type": "string"
      +              },
      +              "sharingParticipants": {
      +                "type": "integer"
      +              }
      +            },
      +            "type": "object"
      +          },
      +          "type": "array"
      +        },
      +        "platforms": {
      +          "items": {
      +            "properties": {
      +              "activeParticipants": {
      +                "type": "integer"
      +              },
      +              "key": {
      +                "enum": [
      +                  "WEB",
      +                  "IOS",
      +                  "ANDROID"
      +                ],
      +                "type": "string"
      +              },
      +              "portalViews": {
      +                "type": "integer"
      +              },
      +              "shareActions": {
      +                "type": "integer"
      +              },
      +              "sharingParticipants": {
      +                "type": "integer"
      +              }
      +            },
      +            "type": "object"
      +          },
      +          "type": "array"
      +        },
      +        "portalViewSources": {
      +          "items": {
      +            "properties": {
      +              "activeParticipants": {
      +                "type": "integer"
      +              },
      +              "key": {
      +                "enum": [
      +                  "DEFAULT_LAUNCHER",
      +                  "SDK_OPEN",
      +                  "CSS_CLASS",
      +                  "EMBEDDABLE_ELEMENT",
      +                  "HOSTED_PORTAL",
      +                  "NATIVE_WINDOW",
      +                  "UNKNOWN"
      +                ],
      +                "type": "string"
      +              },
      +              "portalViews": {
      +                "type": "integer"
      +              }
      +            },
      +            "type": "object"
      +          },
      +          "type": "array"
      +        },
      +        "shareChannels": {
      +          "items": {
      +            "properties": {
      +              "key": {
      +                "description": "Stable share-channel key.",
      +                "type": "string"
      +              },
      +              "shareActions": {
      +                "type": "integer"
      +              },
      +              "sharingParticipants": {
      +                "type": "integer"
      +              }
      +            },
      +            "type": "object"
      +          },
      +          "type": "array"
      +        }
      +      },
      +      "type": "object"
      +    },
      +    "comparison": {
      +      "description": "Current-versus-previous engagement changes.",
      +      "properties": {
      +        "metrics": {
      +          "properties": {
      +            "activeParticipants": {
      +              "description": "Change in unique active participants.",
      +              "properties": {
      +                "delta": {
      +                  "description": "Optional current-minus-previous difference on comparison metrics.",
      +                  "type": "number"
      +                },
      +                "reason": {
      +                  "description": "Why a value is partial or unavailable, or `null` when it is available.",
      +                  "enum": [
      +                    "COVERAGE_UNAVAILABLE",
      +                    "PRE_COVERAGE",
      +                    "PARTIAL_COVERAGE",
      +                    "INSUFFICIENT_COVERAGE",
      +                    "EMPTY_DENOMINATOR",
      +                    "QUERY_LIMIT_EXCEEDED",
      +                    "PARTICIPANT_NOT_ELIGIBLE",
      +                    null
      +                  ],
      +                  "type": [
      +                    "string",
      +                    "null"
      +                  ]
      +                },
      +                "state": {
      +                  "description": "Whether the value is complete, partial, or unavailable for the requested bounds.",
      +                  "enum": [
      +                    "AVAILABLE",
      +                    "PARTIAL",
      +                    "UNAVAILABLE"
      +                  ],
      +                  "type": "string"
      +                },
      +                "value": {
      +                  "description": "Measured value, or `null` when unavailable.",
      +                  "type": [
      +                    "number",
      +                    "null"
      +                  ]
      +                }
      +              },
      +              "type": "object"
      +            },
      +            "portalViews": {
      +              "description": "Change in total signed-in portal views.",
      +              "properties": {
      +                "delta": {
      +                  "description": "Optional current-minus-previous difference on comparison metrics.",
      +                  "type": "number"
      +                },
      +                "reason": {
      +                  "description": "Why a value is partial or unavailable, or `null` when it is available.",
      +                  "enum": [
      +                    "COVERAGE_UNAVAILABLE",
      +                    "PRE_COVERAGE",
      +                    "PARTIAL_COVERAGE",
      +                    "INSUFFICIENT_COVERAGE",
      +                    "EMPTY_DENOMINATOR",
      +                    "QUERY_LIMIT_EXCEEDED",
      +                    "PARTICIPANT_NOT_ELIGIBLE",
      +                    null
      +                  ],
      +                  "type": [
      +                    "string",
      +                    "null"
      +                  ]
      +                },
      +                "state": {
      +                  "description": "Whether the value is complete, partial, or unavailable for the requested bounds.",
      +                  "enum": [
      +                    "AVAILABLE",
      +                    "PARTIAL",
      +                    "UNAVAILABLE"
      +                  ],
      +                  "type": "string"
      +                },
      +                "value": {
      +                  "description": "Measured value, or `null` when unavailable.",
      +                  "type": [
      +                    "number",
      +                    "null"
      +                  ]
      +                }
      +              },
      +              "type": "object"
      +            },
      +            "repeatActiveParticipants": {
      +              "description": "Change in repeat active participants.",
      +              "properties": {
      +                "delta": {
      +                  "description": "Optional current-minus-previous difference on comparison metrics.",
      +                  "type": "number"
      +                },
      +                "reason": {
      +                  "description": "Why a value is partial or unavailable, or `null` when it is available.",
      +                  "enum": [
      +                    "COVERAGE_UNAVAILABLE",
      +                    "PRE_COVERAGE",
      +                    "PARTIAL_COVERAGE",
      +                    "INSUFFICIENT_COVERAGE",
      +                    "EMPTY_DENOMINATOR",
      +                    "QUERY_LIMIT_EXCEEDED",
      +                    "PARTICIPANT_NOT_ELIGIBLE",
      +                    null
      +                  ],
      +                  "type": [
      +                    "string",
      +                    "null"
      +                  ]
      +                },
      +                "state": {
      +                  "description": "Whether the value is complete, partial, or unavailable for the requested bounds.",
      +                  "enum": [
      +                    "AVAILABLE",
      +                    "PARTIAL",
      +                    "UNAVAILABLE"
      +                  ],
      +                  "type": "string"
      +                },
      +                "value": {
      +                  "description": "Measured value, or `null` when unavailable.",
      +                  "type": [
      +                    "number",
      +                    "null"
      +                  ]
      +                }
      +              },
      +              "type": "object"
      +            },
      +            "repeatSharingParticipants": {
      +              "description": "Change in repeat sharing participants.",
      +              "properties": {
      +                "delta": {
      +                  "description": "Optional current-minus-previous difference on comparison metrics.",
      +                  "type": "number"
      +                },
      +                "reason": {
      +                  "description": "Why a value is partial or unavailable, or `null` when it is available.",
      +                  "enum": [
      +                    "COVERAGE_UNAVAILABLE",
      +                    "PRE_COVERAGE",
      +                    "PARTIAL_COVERAGE",
      +                    "INSUFFICIENT_COVERAGE",
      +                    "EMPTY_DENOMINATOR",
      +                    "QUERY_LIMIT_EXCEEDED",
      +                    "PARTICIPANT_NOT_ELIGIBLE",
      +                    null
      +                  ],
      +                  "type": [
      +                    "string",
      +                    "null"
      +                  ]
      +                },
      +                "state": {
      +                  "description": "Whether the value is complete, partial, or unavailable for the requested bounds.",
      +                  "enum": [
      +                    "AVAILABLE",
      +                    "PARTIAL",
      +                    "UNAVAILABLE"
      +                  ],
      +                  "type": "string"
      +                },
      +                "value": {
      +                  "description": "Measured value, or `null` when unavailable.",
      +                  "type": [
      +                    "number",
      +                    "null"
      +                  ]
      +                }
      +              },
      +              "type": "object"
      +            },
      +            "shareActions": {
      +              "description": "Change in total accepted share actions.",
      +              "properties": {
      +                "delta": {
      +                  "description": "Optional current-minus-previous difference on comparison metrics.",
      +                  "type": "number"
      +                },
      +                "reason": {
      +                  "description": "Why a value is partial or unavailable, or `null` when it is available.",
      +                  "enum": [
      +                    "COVERAGE_UNAVAILABLE",
      +                    "PRE_COVERAGE",
      +                    "PARTIAL_COVERAGE",
      +                    "INSUFFICIENT_COVERAGE",
      +                    "EMPTY_DENOMINATOR",
      +                    "QUERY_LIMIT_EXCEEDED",
      +                    "PARTICIPANT_NOT_ELIGIBLE",
      +                    null
      +                  ],
      +                  "type": [
      +                    "string",
      +                    "null"
      +                  ]
      +                },
      +                "state": {
      +                  "description": "Whether the value is complete, partial, or unavailable for the requested bounds.",
      +                  "enum": [
      +                    "AVAILABLE",
      +                    "PARTIAL",
      +                    "UNAVAILABLE"
      +                  ],
      +                  "type": "string"
      +                },
      +                "value": {
      +                  "description": "Measured value, or `null` when unavailable.",
      +                  "type": [
      +                    "number",
      +                    "null"
      +                  ]
      +                }
      +              },
      +              "type": "object"
      +            },
      +            "sharingParticipants": {
      +              "description": "Change in unique sharing participants.",
      +              "properties": {
      +                "delta": {
      +                  "description": "Optional current-minus-previous difference on comparison metrics.",
      +                  "type": "number"
      +                },
      +                "reason": {
      +                  "description": "Why a value is partial or unavailable, or `null` when it is available.",
      +                  "enum": [
      +                    "COVERAGE_UNAVAILABLE",
      +                    "PRE_COVERAGE",
      +                    "PARTIAL_COVERAGE",
      +                    "INSUFFICIENT_COVERAGE",
      +                    "EMPTY_DENOMINATOR",
      +                    "QUERY_LIMIT_EXCEEDED",
      +                    "PARTICIPANT_NOT_ELIGIBLE",
      +                    null
      +                  ],
      +                  "type": [
      +                    "string",
      +                    "null"
      +                  ]
      +                },
      +                "state": {
      +                  "description": "Whether the value is complete, partial, or unavailable for the requested bounds.",
      +                  "enum": [
      +                    "AVAILABLE",
      +                    "PARTIAL",
      +                    "UNAVAILABLE"
      +                  ],
      +                  "type": "string"
      +                },
      +                "value": {
      +                  "description": "Measured value, or `null` when unavailable.",
      +                  "type": [
      +                    "number",
      +                    "null"
      +                  ]
      +                }
      +              },
      +              "type": "object"
      +            }
      +          },
      +          "type": [
      +            "object",
      +            "null"
      +          ]
      +        },
      +        "reason": {
      +          "description": "Why a value is partial or unavailable, or `null` when it is available.",
      +          "enum": [
      +            "COVERAGE_UNAVAILABLE",
      +            "PRE_COVERAGE",
      +            "PARTIAL_COVERAGE",
      +            "INSUFFICIENT_COVERAGE",
      +            "EMPTY_DENOMINATOR",
      +            "QUERY_LIMIT_EXCEEDED",
      +            "PARTICIPANT_NOT_ELIGIBLE",
      +            null
      +          ],
      +          "type": [
      +            "string",
      +            "null"
      +          ]
      +        },
      +        "state": {
      +          "description": "Whether the value is complete, partial, or unavailable for the requested bounds.",
      +          "enum": [
      +            "AVAILABLE",
      +            "PARTIAL",
      +            "UNAVAILABLE"
      +          ],
      +          "type": "string"
      +        }
      +      },
      +      "type": "object"
      +    },
      +    "coverageStartAt": {
      +      "description": "Earliest expected complete capture time (Unix ms), or `null` until coverage begins.",
      +      "type": [
      +        "integer",
      +        "null"
      +      ]
      +    },
      +    "interval": {
      +      "description": "Bucket size used for `series`.",
      +      "enum": [
      +        "day",
      +        "week",
      +        "month"
      +      ],
      +      "type": "string"
      +    },
      +    "metricContractVersion": {
      +      "description": "Shared activation and engagement metric version.",
      +      "type": "integer"
      +    },
      +    "period": {
      +      "description": "Exact half-open current and previous activity bounds.",
      +      "properties": {
      +        "effectiveFrom": {
      +          "description": "Measured start after coverage, or `null`.",
      +          "type": [
      +            "integer",
      +            "null"
      +          ]
      +        },
      +        "from": {
      +          "description": "Inclusive requested activity start (Unix ms).",
      +          "type": "integer"
      +        },
      +        "previousFrom": {
      +          "description": "Inclusive previous-period start (Unix ms).",
      +          "type": "integer"
      +        },
      +        "previousTo": {
      +          "description": "Exclusive previous-period end (Unix ms).",
      +          "type": "integer"
      +        },
      +        "to": {
      +          "description": "Exclusive requested activity end (Unix ms).",
      +          "type": "integer"
      +        }
      +      },
      +      "type": "object"
      +    },
      +    "platform": {
      +      "description": "Requested and applied client-platform filter.",
      +      "properties": {
      +        "applied": {
      +          "enum": [
      +            "ALL",
      +            "WEB",
      +            "IOS",
      +            "ANDROID"
      +          ],
      +          "type": "string"
      +        },
      +        "requested": {
      +          "enum": [
      +            "ALL",
      +            "WEB",
      +            "IOS",
      +            "ANDROID"
      +          ],
      +          "type": "string"
      +        },
      +        "state": {
      +          "description": "Whether the value is complete, partial, or unavailable for the requested bounds.",
      +          "enum": [
      +            "AVAILABLE",
      +            "PARTIAL",
      +            "UNAVAILABLE"
      +          ],
      +          "type": "string"
      +        }
      +      },
      +      "type": "object"
      +    },
      +    "previousPeriod": {
      +      "description": "Engagement totals for the immediately previous equal activity period.",
      +      "properties": {
      +        "reason": {
      +          "description": "Why a value is partial or unavailable, or `null` when it is available.",
      +          "enum": [
      +            "COVERAGE_UNAVAILABLE",
      +            "PRE_COVERAGE",
      +            "PARTIAL_COVERAGE",
      +            "INSUFFICIENT_COVERAGE",
      +            "EMPTY_DENOMINATOR",
      +            "QUERY_LIMIT_EXCEEDED",
      +            "PARTICIPANT_NOT_ELIGIBLE",
      +            null
      +          ],
      +          "type": [
      +            "string",
      +            "null"
      +          ]
      +        },
      +        "state": {
      +          "description": "Whether the value is complete, partial, or unavailable for the requested bounds.",
      +          "enum": [
      +            "AVAILABLE",
      +            "PARTIAL",
      +            "UNAVAILABLE"
      +          ],
      +          "type": "string"
      +        },
      +        "totals": {
      +          "description": "Unique participant metrics and action totals for one activity period.",
      +          "properties": {
      +            "activeParticipants": {
      +              "description": "Eligible participants with a signed-in portal view.",
      +              "properties": {
      +                "delta": {
      +                  "description": "Optional current-minus-previous difference on comparison metrics.",
      +                  "type": "number"
      +                },
      +                "reason": {
      +                  "description": "Why a value is partial or unavailable, or `null` when it is available.",
      +                  "enum": [
      +                    "COVERAGE_UNAVAILABLE",
      +                    "PRE_COVERAGE",
      +                    "PARTIAL_COVERAGE",
      +                    "INSUFFICIENT_COVERAGE",
      +                    "EMPTY_DENOMINATOR",
      +                    "QUERY_LIMIT_EXCEEDED",
      +                    "PARTICIPANT_NOT_ELIGIBLE",
      +                    null
      +                  ],
      +                  "type": [
      +                    "string",
      +                    "null"
      +                  ]
      +                },
      +                "state": {
      +                  "description": "Whether the value is complete, partial, or unavailable for the requested bounds.",
      +                  "enum": [
      +                    "AVAILABLE",
      +                    "PARTIAL",
      +                    "UNAVAILABLE"
      +                  ],
      +                  "type": "string"
      +                },
      +                "value": {
      +                  "description": "Measured value, or `null` when unavailable.",
      +                  "type": [
      +                    "number",
      +                    "null"
      +                  ]
      +                }
      +              },
      +              "type": "object"
      +            },
      +            "portalViews": {
      +              "description": "Total accepted signed-in portal-view actions.",
      +              "properties": {
      +                "delta": {
      +                  "description": "Optional current-minus-previous difference on comparison metrics.",
      +                  "type": "number"
      +                },
      +                "reason": {
      +                  "description": "Why a value is partial or unavailable, or `null` when it is available.",
      +                  "enum": [
      +                    "COVERAGE_UNAVAILABLE",
      +                    "PRE_COVERAGE",
      +                    "PARTIAL_COVERAGE",
      +                    "INSUFFICIENT_COVERAGE",
      +                    "EMPTY_DENOMINATOR",
      +                    "QUERY_LIMIT_EXCEEDED",
      +                    "PARTICIPANT_NOT_ELIGIBLE",
      +                    null
      +                  ],
      +                  "type": [
      +                    "string",
      +                    "null"
      +                  ]
      +                },
      +                "state": {
      +                  "description": "Whether the value is complete, partial, or unavailable for the requested bounds.",
      +                  "enum": [
      +                    "AVAILABLE",
      +                    "PARTIAL",
      +                    "UNAVAILABLE"
      +                  ],
      +                  "type": "string"
      +                },
      +                "value": {
      +                  "description": "Measured value, or `null` when unavailable.",
      +                  "type": [
      +                    "number",
      +                    "null"
      +                  ]
      +                }
      +              },
      +              "type": "object"
      +            },
      +            "repeatActiveParticipants": {
      +              "description": "Eligible participants active on at least two distinct program-local days.",
      +              "properties": {
      +                "delta": {
      +                  "description": "Optional current-minus-previous difference on comparison metrics.",
      +                  "type": "number"
      +                },
      +                "reason": {
      +                  "description": "Why a value is partial or unavailable, or `null` when it is available.",
      +                  "enum": [
      +                    "COVERAGE_UNAVAILABLE",
      +                    "PRE_COVERAGE",
      +                    "PARTIAL_COVERAGE",
      +                    "INSUFFICIENT_COVERAGE",
      +                    "EMPTY_DENOMINATOR",
      +                    "QUERY_LIMIT_EXCEEDED",
      +                    "PARTICIPANT_NOT_ELIGIBLE",
      +                    null
      +                  ],
      +                  "type": [
      +                    "string",
      +                    "null"
      +                  ]
      +                },
      +                "state": {
      +                  "description": "Whether the value is complete, partial, or unavailable for the requested bounds.",
      +                  "enum": [
      +                    "AVAILABLE",
      +                    "PARTIAL",
      +                    "UNAVAILABLE"
      +                  ],
      +                  "type": "string"
      +                },
      +                "value": {
      +                  "description": "Measured value, or `null` when unavailable.",
      +                  "type": [
      +                    "number",
      +                    "null"
      +                  ]
      +                }
      +              },
      +              "type": "object"
      +            },
      +            "repeatSharingParticipants": {
      +              "description": "Eligible participants who shared on at least two distinct program-local days.",
      +              "properties": {
      +                "delta": {
      +                  "description": "Optional current-minus-previous difference on comparison metrics.",
      +                  "type": "number"
      +                },
      +                "reason": {
      +                  "description": "Why a value is partial or unavailable, or `null` when it is available.",
      +                  "enum": [
      +                    "COVERAGE_UNAVAILABLE",
      +                    "PRE_COVERAGE",
      +                    "PARTIAL_COVERAGE",
      +                    "INSUFFICIENT_COVERAGE",
      +                    "EMPTY_DENOMINATOR",
      +                    "QUERY_LIMIT_EXCEEDED",
      +                    "PARTICIPANT_NOT_ELIGIBLE",
      +                    null
      +                  ],
      +                  "type": [
      +                    "string",
      +                    "null"
      +                  ]
      +                },
      +                "state": {
      +                  "description": "Whether the value is complete, partial, or unavailable for the requested bounds.",
      +                  "enum": [
      +                    "AVAILABLE",
      +                    "PARTIAL",
      +                    "UNAVAILABLE"
      +                  ],
      +                  "type": "string"
      +                },
      +                "value": {
      +                  "description": "Measured value, or `null` when unavailable.",
      +                  "type": [
      +                    "number",
      +                    "null"
      +                  ]
      +                }
      +              },
      +              "type": "object"
      +            },
      +            "retainedActiveParticipants": {
      +              "description": "Eligible participants active in both the current and previous equal periods.",
      +              "properties": {
      +                "delta": {
      +                  "description": "Optional current-minus-previous difference on comparison metrics.",
      +                  "type": "number"
      +                },
      +                "reason": {
      +                  "description": "Why a value is partial or unavailable, or `null` when it is available.",
      +                  "enum": [
      +                    "COVERAGE_UNAVAILABLE",
      +                    "PRE_COVERAGE",
      +                    "PARTIAL_COVERAGE",
      +                    "INSUFFICIENT_COVERAGE",
      +                    "EMPTY_DENOMINATOR",
      +                    "QUERY_LIMIT_EXCEEDED",
      +                    "PARTICIPANT_NOT_ELIGIBLE",
      +                    null
      +                  ],
      +                  "type": [
      +                    "string",
      +                    "null"
      +                  ]
      +                },
      +                "state": {
      +                  "description": "Whether the value is complete, partial, or unavailable for the requested bounds.",
      +                  "enum": [
      +                    "AVAILABLE",
      +                    "PARTIAL",
      +                    "UNAVAILABLE"
      +                  ],
      +                  "type": "string"
      +                },
      +                "value": {
      +                  "description": "Measured value, or `null` when unavailable.",
      +                  "type": [
      +                    "number",
      +                    "null"
      +                  ]
      +                }
      +              },
      +              "type": "object"
      +            },
      +            "shareActions": {
      +              "description": "Total accepted referral-link share actions.",
      +              "properties": {
      +                "delta": {
      +                  "description": "Optional current-minus-previous difference on comparison metrics.",
      +                  "type": "number"
      +                },
      +                "reason": {
      +                  "description": "Why a value is partial or unavailable, or `null` when it is available.",
      +                  "enum": [
      +                    "COVERAGE_UNAVAILABLE",
      +                    "PRE_COVERAGE",
      +                    "PARTIAL_COVERAGE",
      +                    "INSUFFICIENT_COVERAGE",
      +                    "EMPTY_DENOMINATOR",
      +                    "QUERY_LIMIT_EXCEEDED",
      +                    "PARTICIPANT_NOT_ELIGIBLE",
      +                    null
      +                  ],
      +                  "type": [
      +                    "string",
      +                    "null"
      +                  ]
      +                },
      +                "state": {
      +                  "description": "Whether the value is complete, partial, or unavailable for the requested bounds.",
      +                  "enum": [
      +                    "AVAILABLE",
      +                    "PARTIAL",
      +                    "UNAVAILABLE"
      +                  ],
      +                  "type": "string"
      +                },
      +                "value": {
      +                  "description": "Measured value, or `null` when unavailable.",
      +                  "type": [
      +                    "number",
      +                    "null"
      +                  ]
      +                }
      +              },
      +              "type": "object"
      +            },
      +            "sharingParticipants": {
      +              "description": "Eligible participants with an accepted share action.",
      +              "properties": {
      +                "delta": {
      +                  "description": "Optional current-minus-previous difference on comparison metrics.",
      +                  "type": "number"
      +                },
      +                "reason": {
      +                  "description": "Why a value is partial or unavailable, or `null` when it is available.",
      +                  "enum": [
      +                    "COVERAGE_UNAVAILABLE",
      +                    "PRE_COVERAGE",
      +                    "PARTIAL_COVERAGE",
      +                    "INSUFFICIENT_COVERAGE",
      +                    "EMPTY_DENOMINATOR",
      +                    "QUERY_LIMIT_EXCEEDED",
      +                    "PARTICIPANT_NOT_ELIGIBLE",
      +                    null
      +                  ],
      +                  "type": [
      +                    "string",
      +                    "null"
      +                  ]
      +                },
      +                "state": {
      +                  "description": "Whether the value is complete, partial, or unavailable for the requested bounds.",
      +                  "enum": [
      +                    "AVAILABLE",
      +                    "PARTIAL",
      +                    "UNAVAILABLE"
      +                  ],
      +                  "type": "string"
      +                },
      +                "value": {
      +                  "description": "Measured value, or `null` when unavailable.",
      +                  "type": [
      +                    "number",
      +                    "null"
      +                  ]
      +                }
      +              },
      +              "type": "object"
      +            },
      +            "sharingRate": {
      +              "description": "Sharing participants divided by active participants.",
      +              "properties": {
      +                "delta": {
      +                  "description": "Optional current-minus-previous difference on comparison metrics.",
      +                  "type": "number"
      +                },
      +                "reason": {
      +                  "description": "Why a value is partial or unavailable, or `null` when it is available.",
      +                  "enum": [
      +                    "COVERAGE_UNAVAILABLE",
      +                    "PRE_COVERAGE",
      +                    "PARTIAL_COVERAGE",
      +                    "INSUFFICIENT_COVERAGE",
      +                    "EMPTY_DENOMINATOR",
      +                    "QUERY_LIMIT_EXCEEDED",
      +                    "PARTICIPANT_NOT_ELIGIBLE",
      +                    null
      +                  ],
      +                  "type": [
      +                    "string",
      +                    "null"
      +                  ]
      +                },
      +                "state": {
      +                  "description": "Whether the value is complete, partial, or unavailable for the requested bounds.",
      +                  "enum": [
      +                    "AVAILABLE",
      +                    "PARTIAL",
      +                    "UNAVAILABLE"
      +                  ],
      +                  "type": "string"
      +                },
      +                "value": {
      +                  "description": "Measured value, or `null` when unavailable.",
      +                  "type": [
      +                    "number",
      +                    "null"
      +                  ]
      +                }
      +              },
      +              "type": "object"
      +            }
      +          },
      +          "type": [
      +            "object",
      +            "null"
      +          ]
      +        }
      +      },
      +      "type": "object"
      +    },
      +    "programType": {
      +      "description": "Program eligibility model.",
      +      "enum": [
      +        "REFERRAL",
      +        "AFFILIATE"
      +      ],
      +      "type": "string"
      +    },
      +    "reason": {
      +      "description": "Why a value is partial or unavailable, or `null` when it is available.",
      +      "enum": [
      +        "COVERAGE_UNAVAILABLE",
      +        "PRE_COVERAGE",
      +        "PARTIAL_COVERAGE",
      +        "INSUFFICIENT_COVERAGE",
      +        "EMPTY_DENOMINATOR",
      +        "QUERY_LIMIT_EXCEEDED",
      +        "PARTICIPANT_NOT_ELIGIBLE",
      +        null
      +      ],
      +      "type": [
      +        "string",
      +        "null"
      +      ]
      +    },
      +    "series": {
      +      "description": "Continuous half-open activity intervals in ascending order.",
      +      "items": {
      +        "properties": {
      +          "activeParticipants": {
      +            "description": "Unique active participants.",
      +            "type": "integer"
      +          },
      +          "from": {
      +            "description": "Inclusive interval start (Unix ms).",
      +            "type": "integer"
      +          },
      +          "portalViews": {
      +            "description": "Total signed-in portal views.",
      +            "type": "integer"
      +          },
      +          "shareActions": {
      +            "description": "Total accepted share actions.",
      +            "type": "integer"
      +          },
      +          "sharingParticipants": {
      +            "description": "Unique sharing participants.",
      +            "type": "integer"
      +          },
      +          "to": {
      +            "description": "Exclusive interval end (Unix ms).",
      +            "type": "integer"
      +          }
      +        },
      +        "type": "object"
      +      },
      +      "type": "array"
      +    },
      +    "state": {
      +      "description": "Whether the value is complete, partial, or unavailable for the requested bounds.",
      +      "enum": [
      +        "AVAILABLE",
      +        "PARTIAL",
      +        "UNAVAILABLE"
      +      ],
      +      "type": "string"
      +    },
      +    "timezone": {
      +      "description": "IANA timezone used for interval and distinct-day calculations.",
      +      "type": "string"
      +    },
      +    "totals": {
      +      "description": "Unique participant metrics and action totals for one activity period.",
      +      "properties": {
      +        "activeParticipants": {
      +          "description": "Eligible participants with a signed-in portal view.",
      +          "properties": {
      +            "delta": {
      +              "description": "Optional current-minus-previous difference on comparison metrics.",
      +              "type": "number"
      +            },
      +            "reason": {
      +              "description": "Why a value is partial or unavailable, or `null` when it is available.",
      +              "enum": [
      +                "COVERAGE_UNAVAILABLE",
      +                "PRE_COVERAGE",
      +                "PARTIAL_COVERAGE",
      +                "INSUFFICIENT_COVERAGE",
      +                "EMPTY_DENOMINATOR",
      +                "QUERY_LIMIT_EXCEEDED",
      +                "PARTICIPANT_NOT_ELIGIBLE",
      +                null
      +              ],
      +              "type": [
      +                "string",
      +                "null"
      +              ]
      +            },
      +            "state": {
      +              "description": "Whether the value is complete, partial, or unavailable for the requested bounds.",
      +              "enum": [
      +                "AVAILABLE",
      +                "PARTIAL",
      +                "UNAVAILABLE"
      +              ],
      +              "type": "string"
      +            },
      +            "value": {
      +              "description": "Measured value, or `null` when unavailable.",
      +              "type": [
      +                "number",
      +                "null"
      +              ]
      +            }
      +          },
      +          "type": "object"
      +        },
      +        "portalViews": {
      +          "description": "Total accepted signed-in portal-view actions.",
      +          "properties": {
      +            "delta": {
      +              "description": "Optional current-minus-previous difference on comparison metrics.",
      +              "type": "number"
      +            },
      +            "reason": {
      +              "description": "Why a value is partial or unavailable, or `null` when it is available.",
      +              "enum": [
      +                "COVERAGE_UNAVAILABLE",
      +                "PRE_COVERAGE",
      +                "PARTIAL_COVERAGE",
      +                "INSUFFICIENT_COVERAGE",
      +                "EMPTY_DENOMINATOR",
      +                "QUERY_LIMIT_EXCEEDED",
      +                "PARTICIPANT_NOT_ELIGIBLE",
      +                null
      +              ],
      +              "type": [
      +                "string",
      +                "null"
      +              ]
      +            },
      +            "state": {
      +              "description": "Whether the value is complete, partial, or unavailable for the requested bounds.",
      +              "enum": [
      +                "AVAILABLE",
      +                "PARTIAL",
      +                "UNAVAILABLE"
      +              ],
      +              "type": "string"
      +            },
      +            "value": {
      +              "description": "Measured value, or `null` when unavailable.",
      +              "type": [
      +                "number",
      +                "null"
      +              ]
      +            }
      +          },
      +          "type": "object"
      +        },
      +        "repeatActiveParticipants": {
      +          "description": "Eligible participants active on at least two distinct program-local days.",
      +          "properties": {
      +            "delta": {
      +              "description": "Optional current-minus-previous difference on comparison metrics.",
      +              "type": "number"
      +            },
      +            "reason": {
      +              "description": "Why a value is partial or unavailable, or `null` when it is available.",
      +              "enum": [
      +                "COVERAGE_UNAVAILABLE",
      +                "PRE_COVERAGE",
      +                "PARTIAL_COVERAGE",
      +                "INSUFFICIENT_COVERAGE",
      +                "EMPTY_DENOMINATOR",
      +                "QUERY_LIMIT_EXCEEDED",
      +                "PARTICIPANT_NOT_ELIGIBLE",
      +                null
      +              ],
      +              "type": [
      +                "string",
      +                "null"
      +              ]
      +            },
      +            "state": {
      +              "description": "Whether the value is complete, partial, or unavailable for the requested bounds.",
      +              "enum": [
      +                "AVAILABLE",
      +                "PARTIAL",
      +                "UNAVAILABLE"
      +              ],
      +              "type": "string"
      +            },
      +            "value": {
      +              "description": "Measured value, or `null` when unavailable.",
      +              "type": [
      +                "number",
      +                "null"
      +              ]
      +            }
      +          },
      +          "type": "object"
      +        },
      +        "repeatSharingParticipants": {
      +          "description": "Eligible participants who shared on at least two distinct program-local days.",
      +          "properties": {
      +            "delta": {
      +              "description": "Optional current-minus-previous difference on comparison metrics.",
      +              "type": "number"
      +            },
      +            "reason": {
      +              "description": "Why a value is partial or unavailable, or `null` when it is available.",
      +              "enum": [
      +                "COVERAGE_UNAVAILABLE",
      +                "PRE_COVERAGE",
      +                "PARTIAL_COVERAGE",
      +                "INSUFFICIENT_COVERAGE",
      +                "EMPTY_DENOMINATOR",
      +                "QUERY_LIMIT_EXCEEDED",
      +                "PARTICIPANT_NOT_ELIGIBLE",
      +                null
      +              ],
      +              "type": [
      +                "string",
      +                "null"
      +              ]
      +            },
      +            "state": {
      +              "description": "Whether the value is complete, partial, or unavailable for the requested bounds.",
      +              "enum": [
      +                "AVAILABLE",
      +                "PARTIAL",
      +                "UNAVAILABLE"
      +              ],
      +              "type": "string"
      +            },
      +            "value": {
      +              "description": "Measured value, or `null` when unavailable.",
      +              "type": [
      +                "number",
      +                "null"
      +              ]
      +            }
      +          },
      +          "type": "object"
      +        },
      +        "retainedActiveParticipants": {
      +          "description": "Eligible participants active in both the current and previous equal periods.",
      +          "properties": {
      +            "delta": {
      +              "description": "Optional current-minus-previous difference on comparison metrics.",
      +              "type": "number"
      +            },
      +            "reason": {
      +              "description": "Why a value is partial or unavailable, or `null` when it is available.",
      +              "enum": [
      +                "COVERAGE_UNAVAILABLE",
      +                "PRE_COVERAGE",
      +                "PARTIAL_COVERAGE",
      +                "INSUFFICIENT_COVERAGE",
      +                "EMPTY_DENOMINATOR",
      +                "QUERY_LIMIT_EXCEEDED",
      +                "PARTICIPANT_NOT_ELIGIBLE",
      +                null
      +              ],
      +              "type": [
      +                "string",
      +                "null"
      +              ]
      +            },
      +            "state": {
      +              "description": "Whether the value is complete, partial, or unavailable for the requested bounds.",
      +              "enum": [
      +                "AVAILABLE",
      +                "PARTIAL",
      +                "UNAVAILABLE"
      +              ],
      +              "type": "string"
      +            },
      +            "value": {
      +              "description": "Measured value, or `null` when unavailable.",
      +              "type": [
      +                "number",
      +                "null"
      +              ]
      +            }
      +          },
      +          "type": "object"
      +        },
      +        "shareActions": {
      +          "description": "Total accepted referral-link share actions.",
      +          "properties": {
      +            "delta": {
      +              "description": "Optional current-minus-previous difference on comparison metrics.",
      +              "type": "number"
      +            },
      +            "reason": {
      +              "description": "Why a value is partial or unavailable, or `null` when it is available.",
      +              "enum": [
      +                "COVERAGE_UNAVAILABLE",
      +                "PRE_COVERAGE",
      +                "PARTIAL_COVERAGE",
      +                "INSUFFICIENT_COVERAGE",
      +                "EMPTY_DENOMINATOR",
      +                "QUERY_LIMIT_EXCEEDED",
      +                "PARTICIPANT_NOT_ELIGIBLE",
      +                null
      +              ],
      +              "type": [
      +                "string",
      +                "null"
      +              ]
      +            },
      +            "state": {
      +              "description": "Whether the value is complete, partial, or unavailable for the requested bounds.",
      +              "enum": [
      +                "AVAILABLE",
      +                "PARTIAL",
      +                "UNAVAILABLE"
      +              ],
      +              "type": "string"
      +            },
      +            "value": {
      +              "description": "Measured value, or `null` when unavailable.",
      +              "type": [
      +                "number",
      +                "null"
      +              ]
      +            }
      +          },
      +          "type": "object"
      +        },
      +        "sharingParticipants": {
      +          "description": "Eligible participants with an accepted share action.",
      +          "properties": {
      +            "delta": {
      +              "description": "Optional current-minus-previous difference on comparison metrics.",
      +              "type": "number"
      +            },
      +            "reason": {
      +              "description": "Why a value is partial or unavailable, or `null` when it is available.",
      +              "enum": [
      +                "COVERAGE_UNAVAILABLE",
      +                "PRE_COVERAGE",
      +                "PARTIAL_COVERAGE",
      +                "INSUFFICIENT_COVERAGE",
      +                "EMPTY_DENOMINATOR",
      +                "QUERY_LIMIT_EXCEEDED",
      +                "PARTICIPANT_NOT_ELIGIBLE",
      +                null
      +              ],
      +              "type": [
      +                "string",
      +                "null"
      +              ]
      +            },
      +            "state": {
      +              "description": "Whether the value is complete, partial, or unavailable for the requested bounds.",
      +              "enum": [
      +                "AVAILABLE",
      +                "PARTIAL",
      +                "UNAVAILABLE"
      +              ],
      +              "type": "string"
      +            },
      +            "value": {
      +              "description": "Measured value, or `null` when unavailable.",
      +              "type": [
      +                "number",
      +                "null"
      +              ]
      +            }
      +          },
      +          "type": "object"
      +        },
      +        "sharingRate": {
      +          "description": "Sharing participants divided by active participants.",
      +          "properties": {
      +            "delta": {
      +              "description": "Optional current-minus-previous difference on comparison metrics.",
      +              "type": "number"
      +            },
      +            "reason": {
      +              "description": "Why a value is partial or unavailable, or `null` when it is available.",
      +              "enum": [
      +                "COVERAGE_UNAVAILABLE",
      +                "PRE_COVERAGE",
      +                "PARTIAL_COVERAGE",
      +                "INSUFFICIENT_COVERAGE",
      +                "EMPTY_DENOMINATOR",
      +                "QUERY_LIMIT_EXCEEDED",
      +                "PARTICIPANT_NOT_ELIGIBLE",
      +                null
      +              ],
      +              "type": [
      +                "string",
      +                "null"
      +              ]
      +            },
      +            "state": {
      +              "description": "Whether the value is complete, partial, or unavailable for the requested bounds.",
      +              "enum": [
      +                "AVAILABLE",
      +                "PARTIAL",
      +                "UNAVAILABLE"
      +              ],
      +              "type": "string"
      +            },
      +            "value": {
      +              "description": "Measured value, or `null` when unavailable.",
      +              "type": [
      +                "number",
      +                "null"
      +              ]
      +            }
      +          },
      +          "type": "object"
      +        }
      +      },
      +      "type": "object"
      +    }
      +  },
      +  "type": "object"
      +}
  2. First observedv0.12.2

TDQS

A5/5.0
Behavior5/5

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

Annotations already establish read-only, idempotent, non-destructive behavior. The description adds substantial behavioral context beyond that: the default timeframe of 365 days and max of 1825, the campaignId fallback to GROWSURF_CAMPAIGN_ID, that timezone/platform apply only to engagement, and that engagement's coverageStartAt/state/reason distinguish measured zeroes from partial or unavailable history. No contradiction with annotations.

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

Conciseness5/5

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

Every sentence earns its place: purpose first, then the troubleshooting pointer, then parameter and scoping guidance. The description is dense but not padded, with no redundant restatement of the schema.

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

Completeness5/5

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

Given 8 parameters, 2 enums, and an output schema, the description covers defaults, exclusions, engagement semantics, timeframe scoping, and the target fallback. With an output schema present, omitting return-value details is fine. There is no missing guidance an agent needs to call this tool correctly.

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

Parameters5/5

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

Schema coverage is 88%, but the description adds meaning the schema lacks: interval day/week/month yields a per-period 'series', include is comma-separated and names the exact options, engagement is defined as grouping unique active/sharing/repeat/retained participants by portal views and share actions, and engagement's coverage fields carry semantics. It also clarifies days vs startDate/endDate usage and timezone/platform scope.

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

Purpose5/5

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

The first sentence names a specific verb and resource ('Fetch analytics for your GrowSurf program') and enumerates the concrete metrics: participants, referrals, impressions, per-channel shares, and affiliate revenue/commission/payout. This is enough to distinguish it from other analytics siblings like growsurf_get_campaign_activation_analytics and growsurf_get_participant_analytics, even without comparing schemas.

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

Usage Guidelines5/5

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

Explicitly routes the agent to a sibling for metric definitions or count reconciliation: 'call growsurf_troubleshoot_referral_tracking with symptom numbers_do_not_match rather than guessing.' It also gives concrete usage conditions for interval, include, engagement, and timeframe parameters, so an agent knows exactly how to shape the request.

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

Deploy Server

Other Tools