Skip to main content
Glama
GrowSurf MCP Server

GrowSurf MCP Server

Official

Get Program Design

growsurf_get_campaign_design
Read-onlyIdempotent

Fetch configured design fields for a GrowSurf program, including colors, content, widget, and participant settings, to inspect or customize its appearance.

Instructions

Fetch the configured design fields for your GrowSurf program, including GrowSurf Window content, colors, sharing sections, participant avatars under participantAvatarStyle, referred-visitor content such as the Claim Offer Popup, the website widget under widget, the participant Traffic report under trafficInsights (it starts on for new affiliate programs and hidden for referral programs, and every setting is returned with its default copy), participant sign-in copy under login, payout-destination confirmation page copy under payoutDestinationConfirmation, country-name overrides under countryLabels, and the participant Settings panel under participantSettings (its languageSectionTitle and languageSectionInstructionsText label the language picker shown when the program has more than one language). participantAvatarStyle is CHARACTERS, INITIALS, ANIMALS, or GRADIENT; missing or unknown values mean INITIALS. visualStyle is the program Style (GLOW, CLEAN, FLAT, ROUND, TINT, or GLASS) and is omitted when the program has no saved Style. The confirmation section is omitted when no confirmation fields are stored. Stored null fields are returned as null; omitted and null fields use localized defaults. Targets campaignId if you pass it, otherwise GROWSURF_CAMPAIGN_ID.

Tool call template

Replace each placeholder with a value matching the input schema. Only required parameters are included; add optional parameters as needed.

{
  "id": 1,
  "jsonrpc": "2.0",
  "method": "tools/call",
  "params": {
    "arguments": {
      "campaignId": "<campaignId>"
    },
    "name": "growsurf_get_campaign_design"
  }
}

Input Schema

NameRequiredDescriptionDefault
campaignIdYesTarget 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

NameRequiredDescriptionDefault
loginNoThe returning-participant sign-in form plus its success, resend, validation, and error text.
shareNoShare channels, invite settings, and share-button styling.
statsNoThe participant's referral-progress stats panel. Only `title` is editable.
themeNoVisual theme styling (colors, shadows, and similar).
headerNoHeader content for participants (`postText`) and non-participants (`preText`), and the progress labels beside a participant's numbers: `referralsMadeText` (up to 100 characters, shown for single-sided, double-sided, and milestone rewards) and `yourRankText` (up to 100 characters, shown for leaderboard rewards). Both labels are required.
signupNoSignup form fields, GDPR consent, and button and login text.
widgetNoThe website widget — the invite that sits in a corner of the customer's own site. It renders as a button or as a card, and its card folds back into the button when a visitor closes it. Both audience switches start off, so a program shows nothing until one is turned on.
windowNoLayout of the GrowSurf window (`navigationMode`: `TABS` or `LIST`).
payoutsNoAffiliate programs only. The Payouts section of the participant portal.
rewardsNoHeading, icon, and empty-state text of the rewards panel.
resourcesNoParticipant Resources presentation settings: visibility, title, link and copy labels, the message shown when nothing is published, the section icon, and `emptyStateGraphic` (`type`: `DEFAULT`, `IMAGE`, or `NONE`; starter `key`; `imageUrl`). Resource items use the program Resource tools.
commissionsNoAffiliate programs only. The Commissions section of the participant portal.
leaderboardNoThe leaderboard section: labels, selectors, and name masking.
visualStyleNoThe program Style. It sets corners, shadows, button shape and background on program pages and the GrowSurf Window. New referral programs start with `GLOW`, and new affiliate programs start with `CLEAN`. Omitted when the program has no saved Style; those programs keep their original look.
landingPagesNoPortal and landing pages: company info, `content`, `styles`, third-party script ids, and SEO meta tags. `content.howItWorksTitle` is the plain-text heading above the How it works steps (up to 255 characters). The Program Page shows it, and the GrowSurf window shows it while `content.howItWorks` is still the starter heading `<h5>How It Works</h5>`. Programs that never set it read back `How it works`; send `null` or blank text to show `How it works` again. `content.howItWorksSteps` replaces the full ordered step array. Each step supports `text`, an optional bold `title`, `imageUrl`, and `iconKey`; `NUMBER` shows the current step number, while keys such as `SHARE` and `REWARD` show starter icons. `isProgramPageEnabled` turns on the Program Page for a referral program. After you turn it on, you cannot turn it off. `programPage` holds the Program Page content: `hero` (including `headlineAccent`, a phrase in the headline to highlight; `headlineAccentStyle`, `SOLID` or `GRADIENT`; and `headlineAccentColor`, a six-digit hex color used by `SOLID`), `blocks`, `sectionOrder`, `sectionVisibility` (`false` hides a section), `headerLinks` (referral programs only, up to 3), `howItWorks` (referral programs only), `applicationForm.fields` (affiliate programs only, 1 to 30 fields), `requirements`, and `messages`. `howItWorks` sets the style of the How it works card. `layout` is `scrim` (photo across the top of the card, title on the photo), `titleAbove` (title above the card, no photo), `none` (title inside the card, no photo), or `imageAbove` (title above the card, photo across the top of the card). `imageUrl` is an `https` photo URL or `null`; without a photo, `scrim` and `imageAbove` show as `titleAbove`. `scrimColor` is the fade color behind the title: `brand`, `brandDeeper`, or `brandDeepest` (shades of `theme.buttons.backgroundColor` that follow later color changes), `black`, or a `#RRGGBB` hex color. `null` saves `brand`. `scrimStrength` (`30` to `100`, default `100`) sets how far up the photo the fade reaches; the fade right behind the title stays strong. A program with no card has no `howItWorks` object, and its first `howItWorks` update must include `layout`. Updates get the same checks as a dashboard save. An array replaces the stored array. Blank `messages` text reads back as the default text.
countryLabelsNoParticipant-facing country-name overrides keyed by ISO 3166-1 alpha-2 code (for example `GB`). Each label replaces the default country name wherever participants pick a country, such as payout and tax forms. Overrides merge per code on `PATCH`; `null` (or the default name) restores a code's default. Only overridden codes are returned.
referralStatusNoThe section listing who a participant invited and each invite's progress. `revealInviteEmails` lets a signed-in participant see original invitation addresses when disclosure permission was recorded. Private invites and full email masking keep addresses hidden. Other referral addresses stay masked. `revealInviteEmailText` supplies the sign-in prompt; `loadErrorMessage` is shown when the list cannot load; `followUp` supplies the invitation follow-up labels and messages. `statusTooltip` sets the tooltip text for each referral status. `sortFilter` controls the sort and filter menu: `isEnabled` shows or hides it, and the other fields set its labels and options.
referralSummaryNoReferral programs only. The participant's row of summary tiles (clicks, leads, referrals, rewards). `stats.rewardsEarned.displayMode` selects `COUNT` (approved reward count) or `AMOUNT` (total of the approved rewards’ saved recipient amounts, using `referredRewardAmount` for a friend when present and otherwise `rewardAmount`, with saved currency matching the program currency). Telehealth programs default to `AMOUNT`; other referral programs default to `COUNT`. An explicit choice overrides the default. If any approved reward lacks a valid saved amount or matching currency, the participant sees the reward count. Changing a Campaign Reward's amount affects future rewards only.
trafficInsightsNoThe Traffic report participants can open from the GrowSurf window: visits to their share link over time and where those visits came from. It starts on for new affiliate programs and hidden for referral programs. Every setting is returned, with the default copy for anything not changed. Labels cannot be blank.
affiliateSummaryNoAffiliate programs only. The affiliate's row of summary tiles (clicks, revenue, payouts).
referredExperienceNoThe banner, headline, and Claim Offer Popup shown to a visitor who arrives through a referral link. The popup is available for referral and affiliate programs.
participantSettingsNoThe participant's account settings area (logout, language picker, PayPal and Wise payout confirmation/status messages, tax details). `languageSectionTitle` (up to 100 characters) and `languageSectionInstructionsText` (up to 255 characters) are the title and help text of the language row, shown when the program has more than one language. `taxSection.instructionsText` and `taxSection.residencyLabel` show when tax forms are required; `taxSection.vatOnlyInstructionsText` and `taxSection.vatOnlyResidencyLabel` show instead when an affiliate program collects VAT numbers without requiring tax forms.
participantAvatarStyleNoHow participant avatars appear in the GrowSurf Window. New programs start with `INITIALS`. Programs with a missing or unknown stored value return `INITIALS` for backward compatibility.
payoutDestinationConfirmationNoCustomizable text for the payout-destination confirmation page opened from payout integration cards. One shared set applies to every enabled payout provider. Provider-aware text may use `{{payoutProvider}}`; omitted and `null` fields use localized defaults.

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed28 schema fields changedv0.19.27
    • changedOutput schema / properties / header / description
      Previous value: -"Header content for participants (`postText`) and non-participants (`preText`)."New value: +"Header content for participants (`postText`) and non-participants (`preText`), and the progress labels beside a participant's numbers: `referralsMadeText` (up to 100 characters, shown for single-sided, double-sided, and milestone rewards) and `yourRankText` (up to 100 characters, shown for leaderboard rewards). Both labels are required."
    • changedOutput schema / properties / landingPages / description
      Previous value: -"Portal and landing pages: company info, `content`, `styles`, third-party script ids, and SEO meta tags. `content.howItWorksSteps` replaces the full ordered step array. Each step supports `text`, `imageUrl`, and `iconKey`; `NUMBER` shows the current step number, while keys such as `SHARE` and `REWARD` show starter icons."New value: +"Portal and landing pages: company info, `content`, `styles`, third-party script ids, and SEO meta tags. `content.howItWorksTitle` is the plain-text heading above the How it works steps (up to 255 characters). The Program Page shows it, and the GrowSurf window shows it while `content.howItWorks` is still the starter heading `<h5>How It Works</h5>`. Programs that never set it read back `How it works`; send `null` or blank text to show `How it works` again. `content.howItWorksSteps` replaces the full ordered step array. Each step supports `text`, an optional bold `title`, `imageUrl`, and `iconKey`; `NUMBER` shows the current step number, while keys such as `SHARE` and `REWARD` show starter icons. `isProgramPageEnabled` turns on the Program Page for a referral program. After you turn it on, you cannot turn it off. `programPage` holds the Program Page content: `hero` (including `headlineAccent`, a phrase in the headline to highlight; `headlineAccentStyle`, `SOLID` or `GRADIENT`; and `headlineAccentColor`, a six-digit hex color used by `SOLID`), `blocks`, `sectionOrder`, `sectionVisibility` (`false` hides a section), `headerLinks` (referral programs only, up to 3), `howItWorks` (referral programs only), `applicationForm.fields` (affiliate programs only, 1 to 30 fields), `requirements`, and `messages`. `howItWorks` sets the style of the How it works card. `layout` is `scrim` (photo across the top of the card, title on the photo), `titleAbove` (title above the card, no photo), `none` (title inside the card, no photo), or `imageAbove` (title above the card, photo across the top of the card). `imageUrl` is an `https` photo URL or `null`; without a photo, `scrim` and `imageAbove` show as `titleAbove`. `scrimColor` is the fade color behind the title: `brand`, `brandDeeper`, or `brandDeepest` (shades of `theme.buttons.backgroundColor` that follow later color changes), `black`, or a `#RRGGBB` hex color. `null` saves `brand`. `scrimStrength` (`30` to `100`, default `100`) sets how far up the photo the fade reaches; the fade right behind the title stays strong. A program with no card has no `howItWorks` object, and its first `howItWorks` update must include `layout`. Updates get the same checks as a dashboard save. An array replaces the stored array. Blank `messages` text reads back as the default text."
    • changedOutput schema / properties / participantAvatarStyle / description
      Previous value: -"How participant avatars appear in the GrowSurf Window. New programs use `CHARACTERS`; missing or unknown stored values return `INITIALS`."New value: +"How participant avatars appear in the GrowSurf Window. New programs start with `INITIALS`. Programs with a missing or unknown stored value return `INITIALS` for backward compatibility."
    • changedOutput schema / properties / participantSettings / description
      Previous value: -"The participant's account settings area (logout, language picker, PayPal and Wise payout confirmation/status messages, tax details). `languageSectionTitle` and `languageSectionInstructionsText` (up to 500 characters each) are the title and help text of the language row, shown when the program has more than one language. `taxSection.instructionsText` and `taxSection.residencyLabel` show when tax forms are required; `taxSection.vatOnlyInstructionsText` and `taxSection.vatOnlyResidencyLabel` show instead when an affiliate program collects VAT numbers without requiring tax forms."New value: +"The participant's account settings area (logout, language picker, PayPal and Wise payout confirmation/status messages, tax details). `languageSectionTitle` (up to 100 characters) and `languageSectionInstructionsText` (up to 255 characters) are the title and help text of the language row, shown when the program has more than one language. `taxSection.instructionsText` and `taxSection.residencyLabel` show when tax forms are required; `taxSection.vatOnlyInstructionsText` and `taxSection.vatOnlyResidencyLabel` show instead when an affiliate program collects VAT numbers without requiring tax forms."
    • changedOutput schema / properties / referralStatus / description
      Previous value: -"The section listing who a participant invited and each invite's progress. `revealInviteEmails` lets a signed-in participant see original invitation addresses when disclosure permission was recorded. Private invites and full email masking keep addresses hidden. Other referral addresses stay masked. `revealInviteEmailText` supplies the sign-in prompt; `loadErrorMessage` is shown when the list cannot load; `followUp` supplies the invitation follow-up labels and messages."New value: +"The section listing who a participant invited and each invite's progress. `revealInviteEmails` lets a signed-in participant see original invitation addresses when disclosure permission was recorded. Private invites and full email masking keep addresses hidden. Other referral addresses stay masked. `revealInviteEmailText` supplies the sign-in prompt; `loadErrorMessage` is shown when the list cannot load; `followUp` supplies the invitation follow-up labels and messages. `statusTooltip` sets the tooltip text for each referral status. `sortFilter` controls the sort and filter menu: `isEnabled` shows or hides it, and the other fields set its labels and options."
    • changedOutput schema / properties / referralSummary / description
      Previous value: -"Referral programs only. The participant's row of summary tiles (clicks, leads, referrals, rewards)."New value: +"Referral programs only. The participant's row of summary tiles (clicks, leads, referrals, rewards). `stats.rewardsEarned.displayMode` selects `COUNT` (approved reward count) or `AMOUNT` (total of the approved rewards’ saved recipient amounts, using `referredRewardAmount` for a friend when present and otherwise `rewardAmount`, with saved currency matching the program currency). Telehealth programs default to `AMOUNT`; other referral programs default to `COUNT`. An explicit choice overrides the default. If any approved reward lacks a valid saved amount or matching currency, the participant sees the reward count. Changing a Campaign Reward's amount affects future rewards only."
    • addedOutput schema / properties / referredExperience / properties / bannerPlacement
      Added value: +{
      +  "description": "Where the welcome banner sits on the page.",
      +  "enum": [
      +    "TOP",
      +    "BOTTOM"
      +  ],
      +  "type": "string"
      +}
    • addedOutput schema / properties / referredExperience / properties / bannerText
      Added value: +{
      +  "description": "Welcome banner copy. Accepts HTML and the same dynamic-text variables as the dashboard editor.",
      +  "maxLength": 255,
      +  "type": [
      +    "string",
      +    "null"
      +  ]
      +}
    • addedOutput schema / properties / referredExperience / properties / headingPlacement
      Added value: +{
      +  "description": "Whether the inline welcome message goes before the target heading, after it, or replaces it.",
      +  "enum": [
      +    "PREPEND",
      +    "APPEND",
      +    "REPLACE"
      +  ],
      +  "type": "string"
      +}
    • addedOutput schema / properties / referredExperience / properties / headingTarget
      Added value: +{
      +  "description": "Which heading element the inline welcome message attaches to. GrowSurf uses the first match.",
      +  "enum": [
      +    "H1",
      +    "H2",
      +    "H3",
      +    "H4",
      +    "H5"
      +  ],
      +  "type": "string"
      +}
    • addedOutput schema / properties / referredExperience / properties / headingText
      Added value: +{
      +  "description": "Inline welcome message copy. Accepts HTML and the same dynamic-text variables as the dashboard editor.",
      +  "maxLength": 255,
      +  "type": [
      +    "string",
      +    "null"
      +  ]
      +}
    • addedOutput schema / properties / referredExperience / properties / isBannerClickableToSignupUrl
      Added value: +{
      +  "description": "Whether clicking the welcome banner opens the program's signup URL. It has no effect until a signup URL is configured.",
      +  "type": "boolean"
      +}
    • addedOutput schema / properties / referredExperience / properties / isBannerEnabled
      Added value: +{
      +  "description": "Whether referred visitors see the welcome banner, a sticky banner that follows them as they scroll your Share URL.",
      +  "type": "boolean"
      +}
    • addedOutput schema / properties / referredExperience / properties / isHeadingClickableToSignupUrl
      Added value: +{
      +  "description": "Whether clicking the inline welcome message opens the program's signup URL. It has no effect until a signup URL is configured.",
      +  "type": "boolean"
      +}
    • addedOutput schema / properties / referredExperience / properties / isHeadingEnabled
      Added value: +{
      +  "description": "Whether referred visitors see the inline welcome message added to the main heading on your Share URL.",
      +  "type": "boolean"
      +}
    • addedOutput schema / properties / referredExperience / properties / isHeadingStyled
      Added value: +{
      +  "description": "Whether the inline welcome message keeps its own styling. When `false` it renders as plain text.",
      +  "type": "boolean"
      +}
    • addedOutput schema / properties / referredExperience / properties / isPageTitleReplacementActive
      Added value: +{
      +  "description": "Whether referred visitors see `pageTitleReplacement` as the browser tab title. New referral programs start with `true` and new affiliate programs with `false`. Older programs without this setting read back `false`.",
      +  "type": "boolean"
      +}
    • addedOutput schema / properties / referredExperience / properties / offerPopupEmailPlaceholder
      Added value: +{
      +  "description": "Hint text inside the popup's email field. Leave it empty to reuse the email field label from your signup form.",
      +  "maxLength": 100,
      +  "type": [
      +    "string",
      +    "null"
      +  ]
      +}
    • addedOutput schema / properties / referredExperience / properties / offerPopupPromoCodeCopyLabel
      Added value: +{
      +  "description": "Text on the copy action beside the promo code, shown after the offer is claimed when an upfront-discount coupon is enabled.",
      +  "maxLength": 100,
      +  "type": [
      +    "string",
      +    "null"
      +  ]
      +}
    • addedOutput schema / properties / referredExperience / properties / offerPopupSubmitError
      Added value: +{
      +  "description": "Message shown inside the popup when the offer cannot be saved.",
      +  "maxLength": 255,
      +  "type": [
      +    "string",
      +    "null"
      +  ]
      +}
    • addedOutput schema / properties / referredExperience / properties / pageTitleReplacement
      Added value: +{
      +  "description": "Browser tab title shown to referred visitors on your Share URL, in place of the page's own title.",
      +  "maxLength": 255,
      +  "type": [
      +    "string",
      +    "null"
      +  ]
      +}
    • addedOutput schema / properties / referredExperience / properties / referrerNameFallback
      Added value: +{
      +  "description": "Name used in referred-visitor copy when the referrer has no first or last name on file.",
      +  "maxLength": 100,
      +  "type": [
      +    "string",
      +    "null"
      +  ]
      +}
    • addedOutput schema / properties / referredExperience / properties / referrerNameFormat
      Added value: +{
      +  "description": "How the referrer's name appears in referred-visitor copy: `FIRST` (`Gavin`), `FIRST_LAST_INITIAL` (`Gavin B`), or `FIRST_LAST` (`Gavin Belson`).",
      +  "enum": [
      +    "FIRST",
      +    "FIRST_LAST_INITIAL",
      +    "FIRST_LAST"
      +  ],
      +  "type": "string"
      +}
    • changedOutput schema / properties / theme / properties / referredExperienceOfferPopup / description
      Previous value: -"Paid-plan color settings for the Claim Offer Popup."New value: +"Color settings for the Claim Offer Popup."
    • changedOutput schema / properties / theme / properties / widget / description
      Previous value: -"Paid-plan color settings for the website widget."New value: +"Color settings for the website widget."
    • addedOutput schema / properties / visualStyle
      Added value: +{
      +  "description": "The program Style. It sets corners, shadows, button shape and background on program pages and the GrowSurf Window. New referral programs start with `GLOW`, and new affiliate programs start with `CLEAN`. Omitted when the program has no saved Style; those programs keep their original look.",
      +  "enum": [
      +    "GLOW",
      +    "CLEAN",
      +    "FLAT",
      +    "ROUND",
      +    "TINT",
      +    "GLASS"
      +  ],
      +  "type": "string"
      +}
    • changedOutput schema / properties / widget / properties / icon / description
      Previous value: -"An uploaded image instead of a `markKey` drawing. `CUSTOM` uses `iconImageUrl`; `NONE` shows no image. `DEFAULT` is the old GrowSurf image: a program already set to it keeps it and can read it back, but it cannot be set. Requires a paid plan."New value: +"An uploaded image instead of a `markKey` drawing. `CUSTOM` uses `iconImageUrl`; `NONE` shows no image. `DEFAULT` is the old GrowSurf image: a program already set to it keeps it and can read it back, but it cannot be set."
    • changedOutput schema / properties / widget / properties / iconImageUrl / description
      Previous value: -"The uploaded image, used when `icon` is `CUSTOM`. Requires a paid plan."New value: +"The uploaded image, used when `icon` is `CUSTOM`."
  2. Changed10 schema fields changedv0.19.23
    • changedOutput schema / description
      Previous value: -"A program's design configuration, organized by section. The sections available depend on the program type. `GET` returns configured fields; `payoutDestinationConfirmation` is omitted when no confirmation fields are stored. Stored `null` fields are returned as `null`; omitted and `null` fields use localized defaults. `PATCH` back only the sections or fields you want to change."New value: +"A program's design configuration, organized by section. The sections available depend on the program type. `GET` returns configured fields; `payoutDestinationConfirmation` is omitted when no confirmation fields are stored. Stored `null` fields are returned as `null`; omitted and `null` fields use localized defaults. `PATCH` back only the sections or fields you want to change. Summary tiles support `stats.<tile>.icon` (`type`: `DEFAULT`, `IMAGE`, or `NONE`; starter `key`; `imageUrl`). Rewards, Referral Status, Leaderboard, Resources, and affiliate Commissions/Payouts support `emptyStateGraphic` with the same fields; its starter keys are `SOFT_DISC`, `DASHED_RING`, `GHOST_ROWS`, `CARD_STACK`, `DOT_FIELD`, and `HALO`."
    • changedOutput schema / properties / landingPages / description
      Previous value: -"Portal and landing pages: company info, `content`, `styles`, third-party script ids, and SEO meta tags."New value: +"Portal and landing pages: company info, `content`, `styles`, third-party script ids, and SEO meta tags. `content.howItWorksSteps` replaces the full ordered step array. Each step supports `text`, `imageUrl`, and `iconKey`; `NUMBER` shows the current step number, while keys such as `SHARE` and `REWARD` show starter icons."
    • addedOutput schema / properties / login / properties / verificationDescription
      Added value: +{
      +  "description": "Explains that the sign-in link goes to the email address on the participant's account.",
      +  "type": "string"
      +}
    • addedOutput schema / properties / login / properties / verificationHeading
      Added value: +{
      +  "description": "Heading shown when an identified participant verifies their email without entering an address.",
      +  "type": "string"
      +}
    • addedOutput schema / properties / login / properties / verificationSuccessBody
      Added value: +{
      +  "description": "Instructions shown after an identified participant requests a sign-in link.",
      +  "type": "string"
      +}
    • addedOutput schema / properties / referredExperience / properties / offerPageDescription
      Added value: +{
      +  "description": "HTML shown beside the popup on its GrowSurf page.",
      +  "maxLength": 150000,
      +  "type": "string"
      +}
    • addedOutput schema / properties / referredExperience / properties / offerPageLinks
      Added value: +{
      +  "description": "Links shown beside the popup on its GrowSurf page.",
      +  "items": {
      +    "properties": {
      +      "text": {
      +        "description": "Link text.",
      +        "maxLength": 100,
      +        "type": "string"
      +      },
      +      "url": {
      +        "description": "Link destination. An empty string links to the Share URL.",
      +        "maxLength": 500,
      +        "type": "string"
      +      }
      +    },
      +    "type": "object"
      +  },
      +  "maxItems": 3,
      +  "type": "array"
      +}
    • addedOutput schema / properties / referredExperience / properties / offerPageSteps
      Added value: +{
      +  "description": "How it works steps shown beside the popup on its GrowSurf page.",
      +  "items": {
      +    "properties": {
      +      "iconKey": {
      +        "description": "Step icon key, such as `SIGNUP`, `APPROVED`, or `REWARD`.",
      +        "maxLength": 100,
      +        "type": "string"
      +      },
      +      "text": {
      +        "description": "Step text.",
      +        "maxLength": 255,
      +        "type": "string"
      +      }
      +    },
      +    "type": "object"
      +  },
      +  "maxItems": 5,
      +  "type": "array"
      +}
    • changedOutput schema / properties / resources / description
      Previous value: -"Participant Resources presentation settings: visibility, title, link and copy labels, the message shown when nothing is published, and the section icon. Resource items use the program Resource tools."New value: +"Participant Resources presentation settings: visibility, title, link and copy labels, the message shown when nothing is published, the section icon, and `emptyStateGraphic` (`type`: `DEFAULT`, `IMAGE`, or `NONE`; starter `key`; `imageUrl`). Resource items use the program Resource tools."
    • addedOutput schema / properties / widget / properties / clickAction
      Added value: +{
      +  "description": "What opens when someone clicks the card's button or the bubble: the GrowSurf Window on top of the page (`WINDOW`), or the Program Page in a new tab (`PROGRAM_PAGE`).",
      +  "enum": [
      +    "WINDOW",
      +    "PROGRAM_PAGE"
      +  ],
      +  "type": "string"
      +}
  3. Changed6 schema fields changedv0.19.15
    • addedInput schema / properties / campaignId / minLength
      Added value: +1
    • addedInput schema / required
      Added value: +[
      +  "campaignId"
      +]
    • changedOutput schema / properties / participantSettings / description
      Previous value: -"The participant's account settings area (logout, PayPal and Wise payout confirmation/status messages, tax details)."New value: +"The participant's account settings area (logout, language picker, PayPal and Wise payout confirmation/status messages, tax details). `languageSectionTitle` and `languageSectionInstructionsText` (up to 500 characters each) are the title and help text of the language row, shown when the program has more than one language. `taxSection.instructionsText` and `taxSection.residencyLabel` show when tax forms are required; `taxSection.vatOnlyInstructionsText` and `taxSection.vatOnlyResidencyLabel` show instead when an affiliate program collects VAT numbers without requiring tax forms."
    • changedOutput schema / properties / referralStatus / description
      Previous value: -"The section listing who a participant invited and each invite's progress."New value: +"The section listing who a participant invited and each invite's progress. `revealInviteEmails` lets a signed-in participant see original invitation addresses when disclosure permission was recorded. Private invites and full email masking keep addresses hidden. Other referral addresses stay masked. `revealInviteEmailText` supplies the sign-in prompt; `loadErrorMessage` is shown when the list cannot load; `followUp` supplies the invitation follow-up labels and messages."
    • changedOutput schema / properties / widget / properties / reveal / description
      Previous value: -"When the card appears: right away, after `revealDelaySeconds`, or once the visitor scrolls halfway down the page. The button always appears right away."New value: +"What the element waits for before it appears: the page loading (`IMMEDIATE`) or the visitor scrolling halfway down the page (`SCROLL`). `revealDelaySeconds` then counts from that moment. `DELAY` is accepted for older programs and behaves as `IMMEDIATE`."
    • changedOutput schema / properties / widget / properties / revealDelaySeconds / description
      Previous value: -"Seconds to wait before showing the card, when `reveal` is `DELAY`."New value: +"Seconds to wait after the `reveal` trigger before showing the element. `0` shows it the moment the trigger fires."
  4. 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."
  5. Changed1 schema field changedv0.19.1
    • addedOutput schema / properties / trafficInsights
      Added value: +{
      +  "description": "The Traffic report participants can open from the GrowSurf window: visits to their share link over time and where those visits came from. It starts on for new affiliate programs and hidden for referral programs. Every setting is returned, with the default copy for anything not changed. Labels cannot be blank.",
      +  "properties": {
      +    "allLinksLabel": {
      +      "description": "The share link picker option that combines all of the participant's links.",
      +      "type": "string"
      +    },
      +    "backLinkText": {
      +      "description": "The text of the link back from the report.",
      +      "type": "string"
      +    },
      +    "breakdowns": {
      +      "description": "The tables that show where visits came from: `utm`, `referrer`, `destination`, `geo`, `technology`, and `trigger`. Each has `isVisible` and `label`; some also name their levels under `levels` or their fixed rows under `values`.",
      +      "type": "object"
      +    },
      +    "breakdownsTitle": {
      +      "description": "The heading above the breakdown table.",
      +      "type": "string"
      +    },
      +    "dateRangeLabels": {
      +      "description": "The date range picker labels, keyed by `LAST_7_DAYS`, `LAST_30_DAYS`, `LAST_90_DAYS`, and `ALL_TIME`.",
      +      "type": "object"
      +    },
      +    "defaultDateRange": {
      +      "description": "The date range the report opens with.",
      +      "enum": [
      +        "LAST_7_DAYS",
      +        "LAST_30_DAYS",
      +        "LAST_90_DAYS",
      +        "ALL_TIME"
      +      ],
      +      "type": "string"
      +    },
      +    "emptyState": {
      +      "description": "The message shown before the participant's link has any visits. Can be empty.",
      +      "type": "string"
      +    },
      +    "isPublicDisplayed": {
      +      "description": "Whether participants can open the Traffic report.",
      +      "type": "boolean"
      +    },
      +    "messages": {
      +      "description": "Messages shown when the report cannot show everything: `error`, `unavailable`, `partial`, `partialFrom` (`{{date}}` is replaced with the first available date), `breakdownPartial`, and `breakdownEmpty`.",
      +      "type": "object"
      +    },
      +    "metrics": {
      +      "description": "The two visit counts at the top of the report, `visits` and `uniqueVisitors`, each with `isVisible`, `label`, and `helperText`.",
      +      "type": "object"
      +    },
      +    "notSetLabel": {
      +      "description": "The row name for visits that have no value for the chosen breakdown.",
      +      "type": "string"
      +    },
      +    "title": {
      +      "description": "The report heading.",
      +      "type": "string"
      +    },
      +    "trafficForLabel": {
      +      "description": "The label in front of the share link picker.",
      +      "type": "string"
      +    },
      +    "viewTrafficInsightsLinkText": {
      +      "description": "The text of the row or tab that opens the report.",
      +      "type": "string"
      +    },
      +    "visitsOverTimeTitle": {
      +      "description": "The heading above the visits chart.",
      +      "type": "string"
      +    }
      +  },
      +  "type": "object"
      +}
  6. Changed2 schema fields changedv0.18.1
    • addedOutput schema / properties / theme / properties / widget
      Added value: +{
      +  "description": "Paid-plan color settings for the website widget.",
      +  "properties": {
      +    "backgroundColor": {
      +      "description": "Fill color of the button, and of the card's own button.",
      +      "maxLength": 255,
      +      "type": [
      +        "string",
      +        "null"
      +      ]
      +    },
      +    "borderRadius": {
      +      "description": "Corner rounding, as a CSS length such as `12px`.",
      +      "maxLength": 255,
      +      "type": [
      +        "string",
      +        "null"
      +      ]
      +    },
      +    "color": {
      +      "description": "Text and drawing color on the button, and on the card's own button.",
      +      "maxLength": 255,
      +      "type": [
      +        "string",
      +        "null"
      +      ]
      +    }
      +  },
      +  "type": "object"
      +}
    • addedOutput schema / properties / widget
      Added value: +{
      +  "description": "The website widget — the invite that sits in a corner of the customer's own site. It renders as a button or as a card, and its card folds back into the button when a visitor closes it. Both audience switches start off, so a program shows nothing until one is turned on.",
      +  "properties": {
      +    "appearance": {
      +      "description": "`BUTTON` is a single button in the corner. `CARD` is a small card with a heading, a line of text, and a button, which a visitor can close.",
      +      "enum": [
      +        "BUTTON",
      +        "CARD"
      +      ],
      +      "type": "string"
      +    },
      +    "artImageUrl": {
      +      "description": "The picture shown at the top of the card.",
      +      "maxLength": 500,
      +      "type": [
      +        "string",
      +        "null"
      +      ]
      +    },
      +    "buttonText": {
      +      "description": "The label on the card's button, which opens the program.",
      +      "maxLength": 100,
      +      "type": [
      +        "string",
      +        "null"
      +      ]
      +    },
      +    "icon": {
      +      "description": "An uploaded image instead of a `markKey` drawing. `CUSTOM` uses `iconImageUrl`; `NONE` shows no image. `DEFAULT` is the old GrowSurf image: a program already set to it keeps it and can read it back, but it cannot be set. Requires a paid plan.",
      +      "enum": [
      +        "CUSTOM",
      +        "NONE",
      +        "DEFAULT"
      +      ],
      +      "type": "string"
      +    },
      +    "iconImageUrl": {
      +      "description": "The uploaded image, used when `icon` is `CUSTOM`. Requires a paid plan.",
      +      "maxLength": 500,
      +      "type": [
      +        "string",
      +        "null"
      +      ]
      +    },
      +    "isArtShown": {
      +      "description": "Whether the card shows a picture above its text. Ignored by the button.",
      +      "type": "boolean"
      +    },
      +    "isHiddenOnMobile": {
      +      "description": "Whether to leave phones alone. On small screens the card fills the bottom of the page.",
      +      "type": "boolean"
      +    },
      +    "isShownToNewVisitors": {
      +      "description": "Whether people who have not joined the program see the widget.",
      +      "type": "boolean"
      +    },
      +    "isShownToParticipants": {
      +      "description": "Whether people who have already joined see the widget.",
      +      "type": "boolean"
      +    },
      +    "markKey": {
      +      "description": "The small drawing on the widget. It takes the colour chosen for the widget, so it matches on any background. `null` for no drawing.",
      +      "enum": [
      +        "GIFT",
      +        "TICKET",
      +        "DISCOUNT",
      +        "CASH",
      +        "PERK",
      +        "SHARE",
      +        "LINK",
      +        "INVITE",
      +        "FRIENDS",
      +        "THANKS",
      +        null
      +      ],
      +      "type": [
      +        "string",
      +        "null"
      +      ]
      +    },
      +    "newVisitorDescription": {
      +      "description": "The line under the heading for people who have not joined. Card only.",
      +      "maxLength": 255,
      +      "type": [
      +        "string",
      +        "null"
      +      ]
      +    },
      +    "newVisitorText": {
      +      "description": "What people who have not joined read. It is the button's label, and the card's heading.",
      +      "maxLength": 100,
      +      "type": [
      +        "string",
      +        "null"
      +      ]
      +    },
      +    "offsetEdge": {
      +      "description": "How far in from the top or bottom edge, in pixels, following `placement`. Raise it to clear a chat button that already sits in that corner.",
      +      "maximum": 400,
      +      "minimum": 0,
      +      "type": "integer"
      +    },
      +    "offsetSide": {
      +      "description": "How far in from the left or right edge, in pixels, following `placement`. For a centered placement it becomes an even gap on both sides.",
      +      "maximum": 400,
      +      "minimum": 0,
      +      "type": "integer"
      +    },
      +    "pageRules": {
      +      "description": "Which pages the widget appears on. This controls the widget only — referral tracking, embedded elements, and opening the window from the site's own code keep working on every page where GrowSurf is installed.",
      +      "properties": {
      +        "mode": {
      +          "description": "`ALL` shows it everywhere. `ONLY` shows it just on the listed pages. `EXCEPT` shows it everywhere but the listed pages. With no pages listed, `ONLY` and `EXCEPT` behave as `ALL`.",
      +          "enum": [
      +            "ALL",
      +            "ONLY",
      +            "EXCEPT"
      +          ],
      +          "type": "string"
      +        },
      +        "patterns": {
      +          "description": "The pages to match. Use `*` to stand in for anything, as in `/portal/*`. A path on its own, such as `/pricing`, matches that path on every installed domain.",
      +          "items": {
      +            "maxLength": 500,
      +            "type": "string"
      +          },
      +          "maxItems": 20,
      +          "type": "array"
      +        }
      +      },
      +      "type": "object"
      +    },
      +    "participantDescription": {
      +      "description": "The line under the heading for people who have already joined. Card only.",
      +      "maxLength": 255,
      +      "type": [
      +        "string",
      +        "null"
      +      ]
      +    },
      +    "participantText": {
      +      "description": "What people who have already joined read. It is the button's label, and the card's heading.",
      +      "maxLength": 100,
      +      "type": [
      +        "string",
      +        "null"
      +      ]
      +    },
      +    "placement": {
      +      "description": "Which corner or edge of the page the widget sits against.",
      +      "enum": [
      +        "TOP_LEFT",
      +        "TOP_CENTER",
      +        "TOP_RIGHT",
      +        "BOTTOM_LEFT",
      +        "BOTTOM_CENTER",
      +        "BOTTOM_RIGHT"
      +      ],
      +      "type": "string"
      +    },
      +    "returnAfterDays": {
      +      "description": "Days before the card is offered again to someone who closed it. Until then they keep the button, so they can still open the program. `0` never offers it again.",
      +      "maximum": 365,
      +      "minimum": 0,
      +      "type": "integer"
      +    },
      +    "reveal": {
      +      "description": "When the card appears: right away, after `revealDelaySeconds`, or once the visitor scrolls halfway down the page. The button always appears right away.",
      +      "enum": [
      +        "IMMEDIATE",
      +        "DELAY",
      +        "SCROLL"
      +      ],
      +      "type": "string"
      +    },
      +    "revealDelaySeconds": {
      +      "description": "Seconds to wait before showing the card, when `reveal` is `DELAY`.",
      +      "maximum": 120,
      +      "minimum": 0,
      +      "type": "integer"
      +    }
      +  },
      +  "type": "object"
      +}
  7. Changed5 schema fields changedv0.14.0
    • addedOutput schema / properties / participantAvatarStyle
      Added value: +{
      +  "description": "How participant avatars appear in the GrowSurf Window. New programs use `CHARACTERS`; missing or unknown stored values return `INITIALS`.",
      +  "enum": [
      +    "CHARACTERS",
      +    "INITIALS",
      +    "ANIMALS",
      +    "GRADIENT"
      +  ],
      +  "type": "string"
      +}
    • changedOutput schema / properties / referredExperience / description
      Previous value: -"The banner and headline shown to a visitor who arrives through a referral link."New value: +"The banner, headline, and Claim Offer Popup shown to a visitor who arrives through a referral link. The popup is available for referral and affiliate programs."
    • addedOutput schema / properties / referredExperience / properties
      Added value: +{
      +  "isOfferPopupConfettiEnabled": {
      +    "description": "Whether to show confetti after a claim.",
      +    "type": "boolean"
      +  },
      +  "isOfferPopupEnabled": {
      +    "description": "Whether referred visitors see the Claim Offer Popup.",
      +    "type": "boolean"
      +  },
      +  "isOfferPopupOverlayDimmed": {
      +    "description": "Whether a centered popup dims the page behind it.",
      +    "type": "boolean"
      +  },
      +  "isOfferPopupReferrerImageShown": {
      +    "description": "Whether to show the referrer's profile image.",
      +    "type": "boolean"
      +  },
      +  "isOfferPopupShownOnAllPages": {
      +    "description": "Whether the popup can appear on every installed page.",
      +    "type": "boolean"
      +  },
      +  "offerPopupButtonText": {
      +    "description": "Offer-save button text.",
      +    "maxLength": 100,
      +    "type": [
      +      "string",
      +      "null"
      +    ]
      +  },
      +  "offerPopupDelaySeconds": {
      +    "description": "Delay before the popup appears.",
      +    "enum": [
      +      0,
      +      3,
      +      5,
      +      10
      +    ],
      +    "type": "integer"
      +  },
      +  "offerPopupDescription": {
      +    "description": "Text below the popup heading.",
      +    "maxLength": 255,
      +    "type": [
      +      "string",
      +      "null"
      +    ]
      +  },
      +  "offerPopupImageUrl": {
      +    "description": "Optional popup image.",
      +    "maxLength": 500,
      +    "type": [
      +      "string",
      +      "null"
      +    ]
      +  },
      +  "offerPopupPlacement": {
      +    "description": "Where the popup appears.",
      +    "enum": [
      +      "CENTER",
      +      "BOTTOM",
      +      "BOTTOM_RIGHT",
      +      "BOTTOM_LEFT",
      +      "TOP"
      +    ],
      +    "type": "string"
      +  },
      +  "offerPopupSecondaryLinkText": {
      +    "description": "Optional post-claim link text.",
      +    "maxLength": 100,
      +    "type": [
      +      "string",
      +      "null"
      +    ]
      +  },
      +  "offerPopupSecondaryLinkUrl": {
      +    "description": "Optional post-claim link destination. When saving, use `http://` or `https://`. Send `null` or an empty string to clear it.",
      +    "maxLength": 255,
      +    "type": [
      +      "string",
      +      "null"
      +    ]
      +  },
      +  "offerPopupThankYouButtonText": {
      +    "description": "Post-claim signup button text.",
      +    "maxLength": 100,
      +    "type": [
      +      "string",
      +      "null"
      +    ]
      +  },
      +  "offerPopupThankYouText": {
      +    "description": "Message shown after the offer is saved.",
      +    "maxLength": 255,
      +    "type": [
      +      "string",
      +      "null"
      +    ]
      +  },
      +  "offerPopupTitle": {
      +    "description": "Popup heading.",
      +    "maxLength": 255,
      +    "type": [
      +      "string",
      +      "null"
      +    ]
      +  }
      +}
    • addedOutput schema / properties / resources
      Added value: +{
      +  "description": "Participant Resources presentation settings: visibility, title, link and copy labels, the message shown when nothing is published, and the section icon. Resource items use the program Resource tools.",
      +  "type": "object"
      +}
    • addedOutput schema / properties / theme / properties
      Added value: +{
      +  "referredExperienceOfferPopup": {
      +    "description": "Paid-plan color settings for the Claim Offer Popup.",
      +    "properties": {
      +      "backgroundColor": {
      +        "description": "Popup background color.",
      +        "maxLength": 255,
      +        "type": [
      +          "string",
      +          "null"
      +        ]
      +      },
      +      "color": {
      +        "description": "Popup text color.",
      +        "maxLength": 255,
      +        "type": [
      +          "string",
      +          "null"
      +        ]
      +      }
      +    },
      +    "type": "object"
      +  }
      +}
  8. First observedv0.12.2

TDQS

C2.9/5.0
Behavior3/5

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

Annotations already establish readOnly, idempotent, non-destructive, and closed-world, so the safety profile is covered. The description does add real behavior beyond that: stored nulls come back as null, omitted and null fields use localized defaults, unknown avatar styles fall back to INITIALS, and trafficInsights starts enabled for affiliate programs but hidden for referral programs. These are useful state disclosures, but for a simple read they mostly explain return values that the output schema already carries.

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

Conciseness2/5

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

The body is one very long run-on sentence enumerating response sections, which makes it hard to scan and brackets the most important information about targeting at the very end. Much of the enumeration duplicates the output schema, so several clauses do not earn their place.

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

Completeness3/5

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

For a one-parameter read with full schema coverage and an output schema, the definition covers calling it correctly and the campaignId fallback. It is over-weighted toward explaining return values that the output schema already provides and under-weighted on selecting this tool over its near-siblings, which is the remaining meaningful gap.

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

Parameters3/5

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

Schema coverage is 100% and the single parameter is fully documented, so the baseline is 3. The trailing sentence 'Targets campaignId if you pass it, otherwise GROWSURF_CAMPAIGN_ID' largely restates the schema's own default note and adds no format or constraint detail; the enum-style value lists describe response fields, not this parameter.

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 opening clause gives a specific verb and resource: 'Fetch the configured design fields for your GrowSurf program,' which is clearly a read of design configuration. That implicitly separates it from growsurf_get_campaign_options and growsurf_get_campaign, though no sibling is ever named. Clear purpose, no explicit differentiation.

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

Usage Guidelines2/5

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

There is no guidance on when to reach for this versus growsurf_get_campaign, growsurf_get_campaign_options, or growsurf_program_design_advisor, and no mention of pairing it with growsurf_update_campaign_design. The only conditional statement concerns campaignId resolution, which is parameter behavior rather than usage guidance.

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