Skip to main content
Glama
growsurf

GrowSurf MCP Server

Official

Get Program Analytics

growsurf_get_campaign_analytics
Read-onlyIdempotent

Retrieve GrowSurf campaign analytics for participants, referrals, impressions, channel shares, and affiliate revenue, with optional interval series, date windows, and engagement breakdowns.

Instructions

Fetch analytics for your GrowSurf program: participants, referrals, impressions, per-channel shares, and affiliate revenue, commission, and payout metrics when applicable. 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. Explicit dates must both be positive Unix timestamps in milliseconds, with endDate >= startDate and a maximum span of 1825 days. 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, positive Unix timestamp in milliseconds. Supply `startDate` too; `endDate` must be >= `startDate` and at most 1825 days later.
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, positive Unix timestamp in milliseconds. Supply `endDate` too; the window must span at most 1825 days.
campaignIdNoTarget program (campaign) id for this call. Defaults to GROWSURF_CAMPAIGN_ID when omitted. Program IDs also identify newly created programs 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. Changed1 schema field changedv0.19.9
    • changedInput schema / properties / campaignId / description
      Previous value: -"Target 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."New value: +"Target program (campaign) id for this call. Defaults to GROWSURF_CAMPAIGN_ID when omitted. Program IDs also identify newly created programs without restarting the server."
  2. Changed5 schema fields changedv0.19.8
    • addedInput schema / allOf
      Added value: +[
      +  {
      +    "if": {
      +      "required": [
      +        "startDate"
      +      ]
      +    },
      +    "then": {
      +      "required": [
      +        "endDate"
      +      ]
      +    }
      +  },
      +  {
      +    "if": {
      +      "required": [
      +        "endDate"
      +      ]
      +    },
      +    "then": {
      +      "required": [
      +        "startDate"
      +      ]
      +    }
      +  }
      +]
    • changedInput schema / properties / endDate / description
      Previous value: -"End of the timeframe, Unix timestamp in ms."New value: +"End of the timeframe, positive Unix timestamp in milliseconds. Supply `startDate` too; `endDate` must be >= `startDate` and at most 1825 days later."
    • addedInput schema / properties / endDate / minimum
      Added value: +1
    • changedInput schema / properties / startDate / description
      Previous value: -"Start of the timeframe, Unix timestamp in ms. Use with endDate instead of days."New value: +"Start of the timeframe, positive Unix timestamp in milliseconds. Supply `endDate` too; the window must span at most 1825 days."
    • addedInput schema / properties / startDate / minimum
      Added value: +1
  3. 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"
      +}
  4. First observedv0.12.2

TDQS

A3.9/5.0
Behavior4/5

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

Annotations already cover the safety profile (readOnly, idempotent, non-destructive, closed-world), so the bar is lower. The description adds real behavioral context beyond them: default window of 365 days with a 1825-day cap, default `interval=total`, engagement-only applicability of `timezone`/`platform`, and the `coverageStartAt`/`state`/`reason` semantics that separate measured zeroes from partial history. It does not mention auth or rate limits, but its contributions are substantive.

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

Conciseness4/5

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

Front-loaded with purpose and metrics, then moves efficiently through interval, include, timeframe, and targeting. It is dense and somewhat long, with minor overlap against schema text (Unix-ms date constraints restated), but nearly every sentence carries actionable information.

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

Completeness5/5

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

With an output schema present, return values need not be re-explained, yet the description helpfully clarifies conditional outputs (`series`, engagement sub-fields, previousPeriod) and default resolution for `campaignId` via GROWSURF_CAMPAIGN_ID. For an 8-parameter read tool with rich annotations and an output schema, nothing needed to invoke it correctly is missing.

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

Parameters4/5

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

Schema description coverage is already 88%, so baseline is 3. The description goes beyond it by explaining what `include` values yield (e.g. `engagement` groups unique active/sharing/repeat/retained participants by portal-view and share timing), clarifying that `timezone`/`platform` apply to engagement only, and noting the default `days=365` that the schema omits. This meaningfully supplements the parameter docs.

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

Purpose4/5

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

The description states a specific verb (Fetch) and resource (analytics for your GrowSurf program) and enumerates the metrics returned (participants, referrals, impressions, per-channel shares, affiliate revenue/commission/payout). This is clearly distinguishable from sibling analytics tools like get_campaign_activation_analytics or get_participant_analytics by scope, though it never names those siblings explicitly.

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

Usage Guidelines3/5

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

The description explains how to shape the request (pass `interval` for a series, `include` values for extra views, `days` vs explicit date window) but gives no guidance on when to choose this tool over sibling analytics tools. Usage is implied rather than stated with conditions or exclusions.

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