GrowSurf MCP Server
OfficialGrowSurf MCP Server exposes GrowSurf referral and affiliate program operations plus guided, read-only advice and code-generation tools through MCP.
Generate integration plans, browser/JavaScript snippets, mobile SDK guidance, REST API library examples, embeddable element HTML, participant auto-auth config, program-design advice, troubleshooting guidance, and program-creation checks.
Create, update, clone, and configure GrowSurf programs (campaigns), including design, emails, options, installation, custom domains, Program Resources, and campaign rewards.
List, get, add, update, email, and bulk-delete participants; read participant analytics, activity logs, and payout-destination status; request payout-destination confirmation.
Manage webhooks, test deliveries, list integrations, and get dashboard connect links.
Read campaign analytics, activation cohorts, engagement metrics, email metrics, rates, status counts, and participant analytics.
Trigger or cancel referral credit; record affiliate sales and refunds/chargebacks; create mobile participant tokens.
Manage the bound team, request/resend team verification, create GrowSurf accounts, compute participant auth hashes, and normalize webhook payloads with idempotency keys.
Supports full and optional compact tool surfaces, with hosted OAuth or local stdio/API-key setup.
Provides native Android SDK implementation guidance for integrating GrowSurf referral tracking, including attribution, shareUrl sharing, trackShare, and the native GrowSurf Window.
Provides native iOS SDK implementation guidance for integrating GrowSurf referral tracking, including attribution, shareUrl sharing, trackShare, and the native GrowSurf Window.
Supports connecting Mailchimp to GrowSurf for syncing signups and contacts, with integration status and a dashboard connect link.
Supports connecting PayPal to GrowSurf for payouts and payment processing, with integration status and a dashboard connect link.
Supports connecting Resend to GrowSurf for email delivery, with integration status and a dashboard connect link.
Supports connecting Stripe to GrowSurf for payment processing and referral-related payment data, with integration status and a dashboard connect link.
Supports connecting Wise to GrowSurf for affiliate payouts, with integration status and a dashboard connect link.
Supports connecting Zapier to GrowSurf for workflow automation, with integration status and a dashboard connect link.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@GrowSurf MCP Server Create a referral program for my fitness app with a 20% discount reward."
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
GrowSurf MCP Server
The official GrowSurf command-line interface (CLI) and open-source Model Context Protocol (MCP) server for implementing GrowSurf referral and affiliate programs with guided steps and safe REST API wrappers.
Connect it to an AI agent and, in plain language, the agent can create a referral or affiliate program, configure rewards, install tracking, add and manage participants, and read analytics, all backed by the GrowSurf REST API.
MCP is optional. Any action-capable agent that can send HTTPS requests can start with GrowSurf's client-neutral REST workflow at https://growsurf.com/agent-start.md.
Learn more about GrowSurf at https://growsurf.com
Start with direct REST at https://growsurf.com/agent-start.md
Read the OpenAPI contract at https://growsurf.com/openapi.json
Read the Arazzo workflow at https://growsurf.com/arazzo.yaml
Learn about optional MCP setup at https://docs.growsurf.com/build-with-ai#connect-the-mcp-server
Who is this for
This MCP server is for:
Developers using MCP-compatible tools (Claude Code, Codex, Cursor, Copilot, and other MCP clients)
Teams that want guided, AI-assisted GrowSurf integrations
This MCP server is NOT for:
Browser-only users who want a local stdio install. ChatGPT web and Claude.ai use the hosted remote connector at
https://mcp.growsurf.com. Claude Desktop can use either the local stdio server or the hosted connector. See the full client list and setup at https://docs.growsurf.com/build-with-ai#connect-the-mcp-server.
Related MCP server: agentfuse-mcp
What you get
Guided Integration:
Universal Code install
Native iOS/Android and React Native SDK implementation guidance
Native GrowSurf Window guidance
Signup flow
Qualifying action flow
Affiliate sale / transaction tracking
Webhooks
Agent Recipes:
MCP prompts for creating referral programs, creating affiliate programs, advising on program design, troubleshooting referral tracking, embedding the widget, listing and fetching programs and participants, configuring rewards, wiring webhooks, and reading analytics
Prompts use details from your conversation and ask only for missing information needed for the next step. No form inputs are needed. Existing prompt names and direct arguments remain supported.
Installable Agent Skill bundle at
skills/growsurf-agent-toolkitSteering to review starter Design, Emails, Options, Installation, rewards, and GrowSurf Window content before patching
One-shot program-creation eval prompts and acceptance checks for starter content and configuration review
Happy‑Path REST API Wrappers:
Read and rename the bound team, request team verification, and resend the team owner's verification email
List and get campaigns
Get campaign analytics (totals, time series, email metrics, participant engagement activity, and activation cohorts)
Create, update, and clone programs (campaigns)
List, create, update, and delete campaign rewards
List, create, update, and delete Program Resources, including a safe one-time FILE preparation flow
Get/update Design, Emails, Options, and Installation config
Capture temporary GrowSurf preview screenshots so the user can see a draft program
List, create, update, delete, and test program webhooks
List the program's integrations and get a dashboard link to connect one
List, get, add, and bulk delete participants
Update a participant, email a participant, and get a participant's analytics and activity logs
Get a participant's payout-destination status and ask them to confirm a payout destination
Trigger referral credit (for referral programs), with optional delayed award (1-90 days)
Cancel a pending delayed referral trigger (for referral programs)
Record affiliate sales/transactions and their refunds or chargebacks (for affiliate programs)
Create mobile participant tokens for signed-in native app users
Official API Library Snippets:
TypeScript
Python
PHP
Ruby
Java
Helpers:
Compute participant auto-auth HMAC hash
Normalize webhook payloads
Generate best‑effort idempotency keys for webhook deduplication
Choosing a tool
Use program and participant tools to read or change records. Guidance tools return advice or code for you to apply:
Task | Tool |
Choose a program design and reward structure |
|
Plan a web integration |
|
Get browser JavaScript examples |
|
Get one embeddable element's HTML |
|
Generate page-level participant auto authentication code |
|
Get backend REST API library examples |
|
Integrate a native iOS, Android, or React Native app |
|
Diagnose a program problem |
|
Generate checks for an agent's program-creation workflow |
|
Published tool names and fields use campaign for a program, including campaignId. These identifiers remain supported. Display titles use program terminology; Campaign Reward remains the name for a reward configuration.
To delete one participant, pass one ID or email in participants to growsurf_bulk_delete_participants. The same permanent-deletion warnings apply. A separate single-participant tool is not needed. Program deletion and explicit reward fulfillment are outside this MCP tool set; completing a program is not deletion, and configuring a reward is not proof that it was delivered.
Optional compact connection
The default connection lists all 66 tools. Add --compact to select 32 tools for program setup, installation, participant management, referral tracking, rewards, and analytics. Your credential permissions can reduce the visible set further.
npx -y @growsurfteam/growsurf-mcp --compactIn a stdio client configuration, append "--compact" to the package's args array. Server integrations can call createGrowSurfMcpServer({ toolSurface: "compact" }). Omit the option to keep the full catalog.
Compact combines related guidance and settings tools:
Tool | Selection | Arguments |
|
| Put the selected guide's existing arguments under |
|
| Put |
| The same | Put |
For example, read a program's installation settings:
{
"name": "growsurf_get_program_settings",
"arguments": { "section": "installation", "input": { "campaignId": "YOUR_PROGRAM_ID" } }
}Program recommendations and troubleshooting keep their own tools. Participant reads, updates, deletion, referral actions, and sale or refund actions remain separate. Compact prompts, resources, guidance, and proposed configuration calls use the compact tool names and arguments.
Use the full connection for team administration, program cloning, participant resources, custom domains, webhook creation/updates/deletion/tests, participant emails, payout destinations, and webhook normalization. Remove --compact and reconnect. These operations remain available with their existing contracts on the full connection; compact rejects calls to tools outside its catalog. The tool-selection table above describes the full connection.
Requirements
Node.js 22+
A GrowSurf account for hosted OAuth. Sign up at https://app.growsurf.com.
A GrowSurf API key for local stdio setup or manual API-key remote setup. Create one in the GrowSurf dashboard after you sign up. A scoped key works as long as it has access to the tools and programs you want the agent to use.
A campaign (program) ID for campaign-scoped tools. Set
GROWSURF_CAMPAIGN_IDas the default, pass acampaignIdargument to target a specific program, or callgrowsurf_list_campaignsto find available programs. For a newly created program, pass theidreturned bygrowsurf_create_campaignto the other tools.Static guidance/snippet tools can run without credentials
Team-level tools do not need a campaign ID.
Every listed tool publishes standard MCP read-only, destructive, idempotent, and open-world safety hints. Scoped business actions stay available; API-key rotation is intentionally not an MCP tool. Rotate keys in GrowSurf Settings or through a direct REST/SDK client.
Official CLI
The npm package installs the growsurf-mcp command. Run it without a global install:
npx -y @growsurfteam/growsurf-mcpThe CLI starts GrowSurf's local stdio MCP server. Set GROWSURF_API_KEY for API-backed actions and GROWSURF_CAMPAIGN_ID for a default program. Public developer resources and static integration guidance work without credentials.
Inspect the installed command without starting the stdio server:
npx -y @growsurfteam/growsurf-mcp --help
npx -y @growsurfteam/growsurf-mcp --versionSupported MCP Hosts
For an MCP-compatible host, use GrowSurf's hosted OAuth endpoint at https://mcp.growsurf.com when the host supports remote Streamable HTTP with OAuth. Use the local npx server when the host needs a stdio process or manual API-key setup. No GrowSurf account yet? Sign up at https://app.growsurf.com and create an API key in the dashboard, or connect to https://mcp.growsurf.com and sign in with OAuth.
The GrowSurf MCP server works with any MCP-compatible host. The examples below cover a few config-based and CLI hosts. For the complete, current list of supported clients (including ChatGPT web, Claude.ai, Claude Desktop, GitHub Copilot, Gemini CLI, Devin Desktop, and Cline) with step-by-step setup, see https://docs.growsurf.com/build-with-ai#connect-the-mcp-server.
Cursor
Claude Code (CLI-based)
Antigravity
Codex (CLI-based)
Cursor
Open or create Cursor's global MCP configuration at
~/.cursor/mcp.json.Add a server named
growsurfwith the hosted OAuth endpoint:
{
"mcpServers": {
"growsurf": {
"type": "http",
"url": "https://mcp.growsurf.com"
}
}
}For local stdio instead, use:
{
"mcpServers": {
"growsurf": {
"command": "npx",
"args": ["-y", "@growsurfteam/growsurf-mcp"],
"env": {
"GROWSURF_API_KEY": "YOUR_API_KEY",
"GROWSURF_CAMPAIGN_ID": "YOUR_CAMPAIGN_ID"
}
}
}
}Claude Code (CLI-based)
Open your terminal and connect Claude Code to the hosted OAuth endpoint:
claude mcp add --transport http --scope user growsurf https://mcp.growsurf.com
claude mcp login growsurfFor local stdio instead, install the server directly into Claude Code:
claude mcp add growsurf \
-e GROWSURF_API_KEY=your_api_key \
-e GROWSURF_CAMPAIGN_ID=your_campaign_id \
-- npx -y @growsurfteam/growsurf-mcpAntigravity
Open Antigravity.
Click the … menu in the panel to the right and select MCP Servers.
Click Manage MCP Servers > View raw config.
Recommended: in the
mcp_config.jsonfile, add the hosted OAuth endpoint:
{
"mcpServers": {
"growsurf": {
"serverUrl": "https://mcp.growsurf.com"
}
}
}Save the config, open Settings > Customizations, and select Authenticate for GrowSurf.
For local stdio instead, use:
{
"mcpServers": {
"growsurf": {
"command": "npx",
"args": ["-y", "@growsurfteam/growsurf-mcp"],
"env": {
"GROWSURF_API_KEY": "YOUR_API_KEY",
"GROWSURF_CAMPAIGN_ID": "YOUR_CAMPAIGN_ID"
}
}
}
}Codex
Recommended: connect Codex to the hosted OAuth endpoint:
codex mcp add growsurf --url https://mcp.growsurf.com
codex mcp login growsurfOr create or edit ~/.codex/config.toml:
[mcp_servers.growsurf]
url = "https://mcp.growsurf.com"For local stdio instead, add the following:
[mcp_servers.growsurf]
command = "npx"
args = ["-y", "@growsurfteam/growsurf-mcp"]
[mcp_servers.growsurf.env]
GROWSURF_API_KEY = "YOUR_API_KEY"
GROWSURF_CAMPAIGN_ID = "YOUR_CAMPAIGN_ID"Or configure local stdio from the CLI:
codex mcp add growsurf \
--env GROWSURF_API_KEY=YOUR_API_KEY \
--env GROWSURF_CAMPAIGN_ID=YOUR_CAMPAIGN_ID \
-- npx -y @growsurfteam/growsurf-mcpConfiguration
Set the following environment variables when running the MCP server:
GROWSURF_API_KEY(optional for startup; required for API-calling tools. Use a key with the scopes and program access those tools need)GROWSURF_CAMPAIGN_ID(optional; the default program for campaign-scoped tools. A tool'scampaignIdargument overrides it, so a single server can operate on any of your programs)GROWSURF_API_BASE_URL(optional; defaults tohttps://api.growsurf.com/v2. Useful for local or hosted MCP gateways that should call a different GrowSurf API origin)GROWSURF_UPLOAD_ALLOWED_ORIGINS(required only for FILE Resource uploads; a comma-separated private allowlist of exact HTTPS origins accepted from GrowSurf upload tickets. Wildcards and URL paths are rejected)
The hash helper requires an explicit participantAuthSecret argument and never uses GROWSURF_PARTICIPANT_AUTH_SECRET. Use a test secret for MCP examples; authenticate users and sign with production secrets on your backend.
For webhooks, configure a signing secret and verify GrowSurf-Signature on your backend. GROWSURF_WEBHOOK_TOKEN is no longer used; keep secrets out of webhook URLs.
Run with npx
After publishing this package, customers can run:
npx @growsurfteam/growsurf-mcpFor local development in this repo:
npm install
npm run build
node dist/cli.jsMCP tools
Every tool declares an MCP output schema and returns structuredContent, so hosts know each tool's result shape. REST tools return the API response (plus a JSON text block for older clients); the guidance and snippet tools return their markdown document under markdown.
Program, reward-configuration, options, and participant reads also include a rewardEvidence object in structuredContent. It records what this response establishes about approval policy and automatic fulfillment marking. Delivery remains unknown without the relevant fulfillment records. This assessment applies to this response only; combine it with other evidence. The API fields and original JSON text remain unchanged.
Guided Integration
growsurf_integration_guideStep-by-step guidance for implementing a GrowSurf referral or affiliate program.growsurf_mobile_sdk_guideNative iOS/Android or React Native SDK guidance for attribution,shareUrl,trackShare, and the native GrowSurf Window. Setplatformtoreact_nativefor the React Native SDK.growsurf_api_library_snippetsOfficial REST API library snippets for TypeScript, Python, PHP, Ruby, and Java.growsurf_list_integrationsList every integration the program can connect, each withconnected,enabled,autoDisabled, and the dashboardconnectUrl. Check this before acting on an integration.growsurf_get_integration_connect_linkGet a dashboard link that opens a specific integration's connect panel (Stripe, PayPal, Tango Card, Mailchimp, and many more). Hand it to the user when they want to connect one. The program is checked first, and the result reports whether the integration is already connected. Connecting happens in the dashboard, not through the API.
Program design and troubleshooting
growsurf_program_design_advisorReturns a short first draft by default. Setdetail: "full"for the complete report, including reward, sharing, and integration figures.benchmarkFactscarries complete statements with each ratio's unit, median, quartiles, sample, and source. Quote these statements together so a referral ratio cannot be mistaken for the percentage of people who refer.Recommend a qualifying action, reward structure, fulfillment path, safeguards, share channels, and integrations. The result includes
markdown, aconfigurationPlanwith exact tool arguments, anddecisionswith the qualifying action and unresolved customer choices. Call it before proposing rewards. Preserve the returned call shapes; the advisor and program-creation tools use differentgoalenums. Replace each<new-program-id>with theidreturned by program creation. Drafts leave reward amounts and commission terms open until the customer chooses them; a budget is a limit, not an incentive. SetsalesMotiontosales_ledfor demos or negotiated contracts, orself_servicefor direct purchases. When the host supplies insights, advice includes aggregate figures; without insights it uses documentation. Non-USD advice and budget comparisons omit dollar reward bands because the data mixes dollar currencies.growsurf_troubleshoot_referral_trackingSymptom-first diagnosis: referrals not credited, participant emails not sending, rewards not issued, participants not added, Universal Code not detected, integrations not syncing, Zapier errors, fraud flags, dashboard numbers that look wrong, and more. Returns the checks to run in order (with the read tool and field for each), the likely causes most common first, fixes, and doc links. Pass asymptomkey, or adescriptionthat names the symptom.
Client & UI Snippets
growsurf_client_snippetsJavaScript SDK, GrowSurf Window, and embeddable examples. Includes a reminder to use a frontend design workflow when placing or styling embeddable UI.growsurf_embeddable_element_snippetHTML snippet for a specific GrowSurf embeddable element.growsurf_grsf_config_snippet<head>snippet for configuringwindow.grsfConfigand participant auto-auth.
Team
growsurf_get_teamFetch the team bound to the API key or OAuth connection, including its GrowSurf verification state.growsurf_update_teamUpdate the bound team's display name.growsurf_request_team_verificationAsk GrowSurf to verify the bound team, which is required before a program can email participants.growsurf_resend_team_owner_verification_emailResend the verification email to the bound team's owner without revealing their email address.
API & Tracking
growsurf_get_campaignFetch campaign configuration.growsurf_list_campaignsList programs available to the credential. Use this to find acampaignIdbefore calling campaign-scoped tools.growsurf_get_campaign_analyticsFetch program analytics, with optional per-periodseries, comparison, status, rate, email metrics viainclude=email, and participant activity-period engagement viainclude=engagement.growsurf_get_campaign_activation_analyticsFetch eligible-participant activation cohorts with a fixed 7- or 30-day observation window. Referral programs group byenrolledAsAdvocateAt; affiliate programs group byapprovedAsAffiliateAt. ReadcoverageStartAt,state, andreasonbefore interpreting zeroes or nulls.growsurf_create_campaignCreate a new program (campaign) with type-appropriate starter content and optional inline rewards (only needsGROWSURF_API_KEY, notGROWSURF_CAMPAIGN_ID). Review the seeded Design, Emails, Options, Installation, rewards, and GrowSurf Window content before patching.growsurf_agent_program_creation_evalGenerate one-shot program-creation eval prompts and acceptance checks for starter content, conservative rewards, configuration review, frontend install proof, and clean public copy.growsurf_update_campaignUpdate the program's identity and lifecycle: name, company branding, and status (only the fields you send are changed).growsurf_clone_campaignClone the program into a newDRAFTprogram (integrations and credentials are not copied).growsurf_list_campaign_rewardsList the program's configured rewards.growsurf_create_campaign_rewardCreate a campaign reward.growsurf_update_campaign_rewardUpdate a campaign reward by its reward key.growsurf_delete_campaign_rewardDelete a campaign reward by its reward key.growsurf_list_program_resources/growsurf_create_program_resource/growsurf_update_program_resource/growsurf_delete_program_resourceManage ordered participant resources. LINK uses HTTPS and TEXT uses plain text.growsurf_prepare_program_resource_fileRequest a one-time ticket and upload an allowed file up to 10 MB to the exact host-allowlisted destination selected by GrowSurf. Pass the returned ticket and signed result unchanged to create/update. The tool accepts no upload URL or credential and never retries an upload.growsurf_get_campaign_design/growsurf_update_campaign_designRead or patch design configuration, including the Program Editor Design tab and payout-destination confirmation page copy.growsurf_get_campaign_emails/growsurf_update_campaign_emailsRead or patch the Program Editor Emails tab config.growsurf_get_campaign_options/growsurf_update_campaign_optionsRead or patch the Program Editor Options tab config, including the program'slanguages.growsurf_get_campaign_installation/growsurf_update_campaign_installationRead or patch the Program Editor Installation tab config.growsurf_get_campaign_custom_domain/growsurf_set_campaign_custom_domain/growsurf_verify_campaign_custom_domain/growsurf_remove_campaign_custom_domainServe the program's landing pages from your own domain. Set a hostname such asrefer.example.com, add theCNAMErecord from the returneddnsRecordat your DNS provider, then verify to run a live DNS check. Setting a different domain replaces the current one, and the old domain stops loading right away. Removing the domain sends landing pages back to their GrowSurf URL.growsurf_capture_referral_flow_screenshotsCapture temporary GrowSurf preview screenshots for the current program, after a draft is saved or when the user asks to see it. This returns the controlled referrer Window and referred-friend experience; use browser automation instead to prove the user's installed site.growsurf_list_campaign_webhooksList the program's webhooks (secrets are never returned).growsurf_create_campaign_webhookAdd a webhook to the program (with events and a write-only signing secret).growsurf_update_campaign_webhookUpdate a webhook by id (primaryfor the program's primary webhook).growsurf_delete_campaign_webhookRemove a webhook by id.growsurf_test_campaign_webhookSend a live test event to a webhook using its stored URL and secret.growsurf_add_participantAdd a participant (or referred participant) during signup.growsurf_list_participantsList participants in the current program, paginated bynextId. Passmetadata(up to 3 keys) to return only participants whose metadata matches exactly, such as looking someone up by your own customer ID. Use this to find a participant ID before calling participant-scoped tools.growsurf_get_participantFetch one participant by GrowSurf participant ID or email address.growsurf_update_participantUpdate a participant by ID or email (including internalnotesand the participant'slanguage).growsurf_bulk_delete_participants— Check each row outcome.analyticsErasure.status: "pending"means analytics erasure is still pending; do not repeat successful rows. Permanently delete up to 200 participants (by ID and/or email, mixed lists allowed) in one request, with per-rowDELETED/NOT_FOUND/DUPLICATE/ERRORresults. Irreversible. Successful rows lose participant access immediately; related record cleanup completes automatically, subject to required financial record retention.growsurf_email_participantEmail a participant using a configured template or a free-form subject/body.growsurf_get_participant_analyticsFetch one participant's engagement, rank, share, affiliate revenue, commission, payout, optional email metrics, and covered first milestones. Useinclude=activationfor milestones such asfirstPortalViewedAtandfirstShareChannel; addseriesfor coveredportalViewsandshareActions. An unavailable null is unknown, not proof that the action never happened.growsurf_get_participant_activity_logsList a participant's activity logs (offset/limit paginated).growsurf_trigger_referralTrigger referral (for referral programs only). Optionally passdelayInDays(1-90) to hold the credit for N days before awarding it (e.g. to cover a refund window).growsurf_cancel_delayed_referralCancel a pending delayed referral trigger before the delay elapses (e.g. on refund/cancellation).growsurf_get_participant_payout_destinationGet a participant's payout-destination status across every provider enabled for the program (PayPal, Venmo, or Wise): per-provider status, confirmed payout email, legal recipient type, and repair reason.growsurf_request_participant_payout_destination_confirmationAsk a participant to confirm their payout destination for a provider — sends them a one-time confirmation link (only the participant can confirm).growsurf_record_saleRecord affiliate sales or transactions (for affiliate programs only).growsurf_refund_transactionRecord an amendment (refund, partial refund, or chargeback) against a recorded transaction; reverses or adjusts the referrer's commission (for affiliate programs only). The inverse ofgrowsurf_record_sale.growsurf_create_mobile_participant_tokenCreate or fetch a participant, then create a participant-scoped mobile SDK token for a signed-in mobile user.
Helpers
growsurf_participant_auth_hashGenerate participant auto-auth HMAC hashes (to authenticate participants automatically).growsurf_webhook_normalizeNormalize webhook payloads and generate idempotency keys (to deduplicate webhook deliveries).
Webhooks
GrowSurf webhooks notify your server when important referral or affiliate events occur, such as when new objects like participants, referrals, rewards, or transactions are created. Here are common use-cases:
Fulfill rewards automatically
Maintain internal points or credit systems
Sync participant and referral data into your database
Duplicate Delivery Handling
Webhook handlers should be idempotent because the same event can arrive more than once. Store an idempotency key before changing anything in your system.
Webhook Security & Idempotency
GrowSurf signs webhook deliveries when the webhook has a secret configured: each delivery includes a GrowSurf-Signature HMAC header computed with that secret (the secret is write-only and never returned). To securely use webhooks, we recommend the following:
Set a
secreton the webhook and verify theGrowSurf-Signatureheader on receiptValidate the payload shape and expected event type
Deduplicate webhook events using an idempotency key, because the same event can arrive more than once
The GrowSurf MCP server provides a helper tool (growsurf_webhook_normalize) that normalizes webhook payloads and generates a best-effort idempotency key to simplify safe webhook processing.
Development and Testing
npm run dev
npm testAdditional Resources
Read developer docs at the following:
JavaScript SDK reference: https://docs.growsurf.com/developer-tools/javascript-sdk/api-reference
REST API reference: https://docs.growsurf.com/developer-tools/rest-api/api-reference
REST API libraries: https://docs.growsurf.com/developer-tools/rest-api/api-libraries
Native mobile guide: https://docs.growsurf.com/getting-started-for-mobile
Android SDK: https://docs.growsurf.com/developer-tools/android-sdk
React Native SDK: https://docs.growsurf.com/developer-tools/react-native-sdk
Getting Started with GrowSurf: https://docs.growsurf.com/getting-started
The GrowSurf MCP server helps GrowSurf customers implement referral programs and affiliate programs quickly.
Available Tools
66 toolsgrowsurf_add_participantAdd ParticipantAInspect
Add or fetch a participant by email. If the email already exists, the existing participant is returned unchanged. One exception: if that participant claimed an offer in the Claim Offer Popup and the signup is not complete yet, this call completes the signup with the original referrer and saves any non-blank firstName, lastName, and metadata you send. This is trusted direct enrollment and bypasses the public application review flow for affiliates. For affiliate programs, set isAffiliate to true to enroll a new participant as approved or false to create a non-affiliate. If you omit it, a valid referredBy creates a referred non-affiliate; without a valid referrer, the new participant is enrolled as approved. A valid referredBy can be combined with isAffiliate: true. Targets campaignId if you pass it, otherwise GROWSURF_CAMPAIGN_ID.
Inputs: email (required), campaignId (required), language, lastName, +9 more. Returns: The created participant, or the existing participant when the email already exi…
growsurf_agent_program_creation_evalGenerate Program Creation ChecksARead-onlyIdempotentInspect
Generate Markdown prompts and acceptance checks for evaluating an agent's program-creation workflow: starter content, rewards, configuration, and frontend installation. Does not create a program or run the checks. Use growsurf_program_design_advisor to choose a program design, or growsurf_integration_guide to plan its web integration.
Inputs: programType, includeOneShotPrompts. Returns: Program-creation eval prompts and acceptance checks, as a markdown document.
growsurf_api_library_snippetsGenerate REST API Library SnippetsARead-onlyIdempotentInspect
Generate Markdown code examples for the official backend REST API libraries in TypeScript, Python, PHP, Ruby, and Java. Select language and workflow; both default to all. Covers setup, program lookup, participant creation, referral credit, sales, and mobile participant tokens. Returns code without executing API calls. Use growsurf_client_snippets for browser JavaScript or growsurf_mobile_sdk_guide for native or React Native app setup.
Inputs: email, language, workflow, campaignId, +2 more. Returns: REST API integration snippets for the official libraries, as a markdown documen…
growsurf_bulk_delete_participantsBulk Delete ParticipantsADestructiveIdempotentInspect
Bulk delete participants from your GrowSurf program in one request. DESTRUCTIVE: deletion is permanent and cannot be undone. Successful rows lose participant access immediately; related record cleanup completes automatically, subject to required financial record retention. Each entry in participants is a GrowSurf participant ID or an email address (mixed lists are allowed), up to 200 entries per request — chunk larger lists across multiple calls. Returns a summary (total, deletedCount, notFoundCount, duplicateCount, errorCount) plus per-row results in request order, each with status DELETED, NOT_FOUND, DUPLICATE (resolves to the same participant as an earlier entry), or ERROR — both 200 and 202 responses can include NOT_FOUND or ERROR rows, and the summary reports these outcomes. A 202 response includes analyticsErasure when analytics erasure is pending. DELETED means participant access was removed; reports can retain the participant until cleanup completes. Do not repeat successful rows to finish cleanup. Targets campaignId if you pass it, otherwise GROWSURF_CAMPAIGN_ID.
Inputs: campaignId (required), participants (required). Returns: Bulk delete outcome. A `202` response includes `analyticsErasure` when analytic…
growsurf_cancel_delayed_referralCancel Delayed ReferralADestructiveIdempotentInspect
Cancel a pending delayed referral trigger for a participant before the delay elapses (e.g. on refund/cancellation). Returns { success, message }. Targets campaignId if you pass it, otherwise GROWSURF_CAMPAIGN_ID.
Inputs: campaignId (required), participantId, participantEmail. Returns: message, success
growsurf_capture_referral_flow_screenshotsCapture Referral Flow ScreenshotsAInspect
Capture temporary GrowSurf preview screenshots after a draft program is saved. Returns short-lived URLs for the controlled referrer Window and referred-friend experience, with an expiresAt timestamp in UTC. The screenshots reflect the saved program at capture time and do not verify installation on the customer's site. A failed inline image alone does not establish that the URL expired. This tool does not accept arbitrary URLs, HTML, JavaScript, or external screenshot targets. Targets campaignId if supplied, otherwise GROWSURF_CAMPAIGN_ID.
Inputs: campaignId (required). Returns: Private, temporary screenshots of the program's referral flow. The URLs are sig…
growsurf_client_snippetsGenerate Browser JavaScript SnippetsARead-onlyIdempotentInspect
Generate Markdown browser JavaScript and CSS examples for referral tracking, embeddable elements, and the GrowSurf Window, with placement guidance. Does not install code or change a program. Use growsurf_embeddable_element_snippet for one HTML element, growsurf_grsf_config_snippet for window.grsfConfig, or growsurf_api_library_snippets for backend REST code.
Inputs: programType, singlePageApp, referralTrigger, includeUnreadBadge, +4 more. Returns: JavaScript SDK, GrowSurf window, and embeddable examples, as a markdown documen…
growsurf_clone_campaignClone ProgramAInspect
Clone your GrowSurf program (campaign) into a new DRAFT program. Integrations and credentials are not copied; active rewards are cloned. Targets campaignId if you pass it, otherwise GROWSURF_CAMPAIGN_ID.
Inputs: campaignId (required). Returns: The newly cloned program. Same shape as the `growsurf_get_campaign` result.
growsurf_create_campaignCreate ProgramAInspect
Create a new GrowSurf program (campaign) with type-appropriate starter content and optional inline rewards. Starter content includes Design, Emails, Options, Installation, and GrowSurf Window defaults. Only type is required. The program starts in DRAFT status and is owned by the credential's bound team. currencyISO defaults to USD and is immutable after creation. goal sets the sharing settings at creation and cannot be set later. Incentives require the customer's chosen amount or commission rate. Without rewards, GrowSurf's starter rewards are switched off and award nothing. Editor-tab configuration is not accepted here. Does not require GROWSURF_CAMPAIGN_ID. The response includes the new program id.
Inputs: type (required), goal, name, rewards, +3 more. Returns: The created program. Same shape as the `growsurf_get_campaign` result.
growsurf_create_campaign_rewardCreate Campaign RewardBInspect
Create a new campaign reward (reward config) on your GrowSurf program. type must be compatible with the program type (affiliate programs support only AFFILIATE rewards; referral programs support the other types). Targets campaignId if you pass it, otherwise GROWSURF_CAMPAIGN_ID.
Inputs: type (required), campaignId (required), event, limit, +20 more. Returns: The created campaign reward. Same shape as the items in the `growsurf_list_camp…
growsurf_create_campaign_webhookCreate WebhookAInspect
Add a webhook to your GrowSurf program. payloadUrl is required. events is the list of events this webhook is subscribed to. Omit it to subscribe the webhook to every event its program type offers, or send [] for none. An event the program type does not offer returns 400. A program can have up to 5 webhooks, counting the primary webhook, so you can create up to 4. Creating another returns 400. secret is write-only — GrowSurf uses it to sign deliveries (the GrowSurf-Signature HMAC header) and never returns it. A program can have only one saved Bask Health webhook across all bask.ninja hosts and paths, including disabled webhooks. A second Bask Health webhook returns 400. A concurrent change to webhook settings can return 409; reload the webhooks before retrying. Targets campaignId if you pass it, otherwise GROWSURF_CAMPAIGN_ID.
Inputs: campaignId (required), payloadUrl (required), events, secret, +1 more. Returns: The created webhook. Same shape as the items in the `growsurf_list_campaign_web…
growsurf_create_mobile_participant_tokenCreate Mobile Participant TokenBInspect
Create or fetch a participant, then create a participant-scoped mobile SDK token via GrowSurf REST. Participant creation is trusted direct enrollment and bypasses the public application review flow for affiliates. Targets campaignId if you pass it, otherwise GROWSURF_CAMPAIGN_ID.
Inputs: email (required), campaignId (required), language, lastName, +9 more. Returns: isNew, expiresIn, participant, participantToken
growsurf_create_program_resourceCreate Program ResourceAInspect
Create a FILE, LINK, or TEXT resource for participants. LINK requires an HTTPS url. TEXT requires plain text. A FILE up to 10 MB requires a one-time uploadTicket and the unmodified uploadResult from GrowSurf's secure upload flow. New resources default to draft unless isPublished is set. API reference: https://growsurf.com/openapi.json. Targets campaignId if supplied, otherwise GROWSURF_CAMPAIGN_ID.
Inputs: type (required), title (required), campaignId (required), url, +6 more. Returns: The created resource. Same shape as the items in the `growsurf_list_program_res…
growsurf_delete_campaign_rewardDelete Campaign RewardADestructiveIdempotentInspect
Delete a campaign reward (reward config) from your GrowSurf program. The reward is deactivated, removed from the program's reward set, and any connected upfront-discount coupons are cleaned up. campaignRewardId is the reward key. Returns { id, success }. Targets campaignId if you pass it, otherwise GROWSURF_CAMPAIGN_ID.
Inputs: campaignId (required), campaignRewardId (required). Returns: id, success
growsurf_delete_campaign_webhookDelete WebhookADestructiveIdempotentInspect
Remove a webhook from your GrowSurf program by id. Returns { id, success }. Targets campaignId if you pass it, otherwise GROWSURF_CAMPAIGN_ID.
Inputs: webhookId (required), campaignId (required). Returns: id, success
growsurf_delete_program_resourceDelete Program ResourceADestructiveIdempotentInspect
Delete a participant resource from your GrowSurf program. This does not remove its reusable Media Center asset. Targets campaignId if you pass it, otherwise GROWSURF_CAMPAIGN_ID.
Inputs: campaignId (required), resourceId (required). Returns: id, success
growsurf_email_participantEmail ParticipantADestructiveInspect
Send an email to a participant (by GrowSurf participant ID or email). Provide EITHER emailType to trigger one of the program's configured email templates, OR subject + body for a free-form email (optionally preheader). For programs with settings.design.layoutMode set to INLINE, body must include {{emailFooter}}; {{emailHeader}} is optional. Free-form emails are sent with the same compliance handling (company name, postal address, and an unsubscribe link are added automatically, and unsubscribed participants are suppressed). Sending requires the team to be verified by GrowSurf and a verified custom email domain on the program (set up in Program Editor > 3. Emails > Email Settings). Returns 400 until one is verified. The email is accepted for delivery. Targets campaignId if you pass it, otherwise GROWSURF_CAMPAIGN_ID.
Inputs: campaignId (required), body, subject, emailType, +3 more. Returns: status, success
growsurf_embeddable_element_snippetGenerate Embeddable Element HTMLARead-onlyIdempotentInspect
Generate one embeddable element's HTML as Markdown. Choose element; optionally include participant authentication attributes. Does not install the element or change a program. Use growsurf_client_snippets for a broader browser integration or growsurf_grsf_config_snippet for page-level participant auto authentication.
Inputs: element (required), participant, withAuthAttributes. Returns: The snippet for one embeddable GrowSurf element, as a markdown document.
growsurf_get_campaignGet ProgramARead-onlyIdempotentInspect
Fetch your GrowSurf campaign (program) details via REST. Embedded reward settings do not establish that an individual reward was earned, approved, or delivered. Earned reward records belong to the individual participant. Targets campaignId if supplied, otherwise GROWSURF_CAMPAIGN_ID.
Inputs: campaignId (required). Returns: A GrowSurf program (campaign).
growsurf_get_campaign_activation_analyticsGet Activation AnalyticsARead-onlyIdempotentInspect
Fetch strict activation for eligible participants in one enrollment cohort. Referral programs group by enrolledAsAdvocateAt; affiliate programs group by approvedAsAffiliateAt. The ordered stages are ELIGIBLE, PORTAL_VIEWED, SHARE_ACTION, UNIQUE_REFERRAL_VISIT, LEAD, and CREDITED_REFERRAL. Each participant gets the selected 7- or 30-day observation window. Omit both cohort bounds for the latest fully matured cohort. Read coverageStartAt, state, and reason before interpreting a null or zero; unavailable history does not mean an action never happened. Targets campaignId if passed, otherwise GROWSURF_CAMPAIGN_ID.
Inputs: campaignId (required), cohortTo, timezone, cohortFrom, +2 more. Returns: Activation grouped by eligibility cohort, with a fixed observation window per p…
growsurf_get_campaign_analyticsGet Program AnalyticsARead-onlyIdempotentInspect
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.
Inputs: campaignId (required), days, endDate, include, +4 more. Returns: email, rates, series, endDate, +5 more
growsurf_get_campaign_custom_domainGet Program Custom DomainARead-onlyIdempotentInspect
Fetch the custom domain that serves your GrowSurf program's landing pages, such as https://refer.example.com. Returns domain (null when none is set), isVerified, verifiedAt, and dnsRecord, the CNAME record to add at the DNS provider. This read does not check DNS; use growsurf_verify_campaign_custom_domain for a live check. Targets campaignId if supplied, otherwise GROWSURF_CAMPAIGN_ID.
Inputs: campaignId (required). Returns: The custom domain that serves the program's landing pages.
growsurf_get_campaign_designGet Program DesignCRead-onlyIdempotentInspect
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.
Inputs: campaignId (required). Returns: A program's design configuration, organized by section. The sections available…
growsurf_get_campaign_emailsGet Program EmailsARead-onlyIdempotentInspect
Fetch the Emails tab configuration for your GrowSurf program, including participant and admin email templates, settings, and read-only fields. settings.sender.fromEmail is read-only and can be changed in the dashboard after domain verification. When updating, omit unchanged sender fields; fromName and replyToEmail cannot be cleared with null. Targets campaignId if supplied, otherwise GROWSURF_CAMPAIGN_ID.
Inputs: campaignId (required). Returns: A program's email configuration. Each template property is an object with `subj…
growsurf_get_campaign_installationGet Program InstallationARead-onlyIdempotentInspect
Fetch the Installation tab configuration for your GrowSurf program (embed/installation and tracking setup). Returns the full object with every field and its current value — the same shape you send back on update. Targets campaignId if you pass it, otherwise GROWSURF_CAMPAIGN_ID.
Inputs: campaignId (required). Returns: A program's installation configuration. `referralTrigger` is only present for r…
growsurf_get_campaign_optionsGet Program OptionsARead-onlyIdempotentInspect
Fetch the Options tab configuration for your GrowSurf program (referral triggers, anti-fraud lists and toggles, affiliate enrollment and application review, notifications, the program's languages under languages, and other behavior options). Returns the full object with every field and its current value, the same shape you send back on update. autoFulfillRewards: false permits manual fulfillment and does not prove that any reward went undelivered. Targets campaignId if you pass it, otherwise GROWSURF_CAMPAIGN_ID.
Inputs: campaignId (required). Returns: A program's options. Some fields are program-type specific. `GET` returns the f…
growsurf_get_integration_connect_linkGet Integration Connect LinkARead-onlyIdempotentInspect
Return a dashboard link to an integration's connect panel in the GrowSurf Program Editor (Options > Integrations). Connecting Stripe, PayPal, Wise, or another account requires the user to complete the dashboard flow; the API cannot connect an account on their behalf. integration accepts supported keys, including camelCase keys such as constantContact and helpScout. The result reports whether the integration is connected, enabled, or autoDisabled. If the program check cannot run, programVerified is false and the result still includes a production dashboard link. Tango Card, Tremendous, Bask Health, CareValidate, MD Integrations, Lithos, and Telegra apply only to referral programs. Wise applies only to affiliate programs. Targets campaignId if supplied, otherwise GROWSURF_CAMPAIGN_ID.
Inputs: integration (required), campaignId. Returns: url, note, label, enabled, +7 more
growsurf_get_participantGet ParticipantARead-onlyIdempotentInspect
Fetch a single participant by GrowSurf participant ID or email address. referralStatus describes credit to their referrer; referralCount counts referrals this participant generated, so zero is consistent with CREDIT_AWARDED. In rewards, approved records approval; status, isFulfilled, and fulfilledAt record fulfillment marking, not confirmation of delivery. Targets campaignId if you pass it, otherwise GROWSURF_CAMPAIGN_ID.
Inputs: campaignId (required), participantId, participantEmail. Returns: A program participant.
growsurf_get_participant_activity_logsGet Participant Activity LogsARead-onlyIdempotentInspect
List a participant's activity logs (by GrowSurf participant ID or email), most recent first, offset/limit paginated. limit is 1-100 (default 20); offset skips logs. The response offset is the cursor for the next page (null when there are no more). Targets campaignId if you pass it, otherwise GROWSURF_CAMPAIGN_ID.
Inputs: campaignId (required), limit, offset, participantId, +1 more. Returns: limit, offset, activityLogs
growsurf_get_participant_analyticsGet Participant AnalyticsARead-onlyIdempotentInspect
Fetch analytics for one participant by GrowSurf participant ID or email. The base response includes all-time engagement, rank, share, and applicable affiliate revenue, commission, and payout metrics. Add activation to include for the program-specific eligibility anchor and covered first milestones, including firstPortalViewedAt and firstShareChannel. A null milestone with a partial or unavailable state is unknown, not proof that the action never happened. Request both activation and series for covered portalViews and shareActions buckets. Filter optional series and email data with days (up to 1825) or both startDate and endDate as positive Unix timestamps in milliseconds. endDate must be at or after startDate, and the range can span at most 1825 days. These date parameters do not filter the base response or activation milestones. Targets campaignId if passed, otherwise GROWSURF_CAMPAIGN_ID.
Inputs: campaignId (required), days, endDate, include, +4 more. Returns: email, ranks, series, endDate, +4 more
growsurf_get_participant_payout_destinationGet Payout DestinationARead-onlyIdempotentInspect
Get a participant's payout-destination status (by GrowSurf participant ID or email) across every payout provider enabled for the program (PayPal, Venmo, or Wise). For each provider it reports the current status, the confirmed payout email, the legal recipient type, and — when a delivery bounced or a recipient was invalidated — the repair reason. activeProvider is the provider that currently gets paid, or null until the participant confirms one. Targets campaignId if you pass it, otherwise GROWSURF_CAMPAIGN_ID.
Inputs: campaignId (required), participantId, participantEmail. Returns: A participant's payout-destination status across every enabled payout provider.
growsurf_get_teamGet TeamARead-onlyIdempotentInspect
Fetch the team bound to the API key or OAuth connection. verificationStatus is VERIFIED once GrowSurf has verified the team, which is required before a program can email participants. Personal profiles and internal identifiers are not returned. Requires GROWSURF_API_KEY; does not require GROWSURF_CAMPAIGN_ID.
Inputs: no named parameters. Returns: The team bound to the API key or OAuth connection.
growsurf_grsf_config_snippetGenerate Participant Auto Authentication CodeBRead-onlyIdempotentInspect
Generate the HTML code for GrowSurf Participant Auto Authentication using window.grsfConfig. The generated code belongs in <head>, before the GrowSurf Universal Code.
Inputs: hash, email, campaignId, affiliateJoin, +3 more. Returns: The `window.grsfConfig` head snippet, as a markdown document.
growsurf_integration_guidePlan Program IntegrationARead-onlyIdempotentInspect
Plan a web integration for a referral or affiliate program. Returns Markdown steps for installing the Universal Code, identifying participants, tracking referrals or sales, and verifying webhooks. Does not inspect or change a program. Use growsurf_client_snippets for browser JavaScript examples, growsurf_api_library_snippets for backend code, or growsurf_mobile_sdk_guide for native or React Native apps.
Inputs: programType, singlePageApp, referralTrigger, webhookSecurity, +1 more. Returns: A guided, happy-path GrowSurf integration plan, as a markdown document.
growsurf_list_campaign_rewardsList Campaign RewardsARead-onlyIdempotentInspect
List your GrowSurf program's configured Campaign Rewards, including switched-off rewards and rewards whose group is not selected. Deleted rewards are excluded. A reward can be earned only when it also appears in the campaign response's embedded rewards array. These settings do not establish that a participant earned or received a reward; earned reward records belong to the individual participant. Targets campaignId if supplied, otherwise GROWSURF_CAMPAIGN_ID.
Inputs: campaignId (required). Returns: rewards, rewardEvidence
growsurf_list_campaignsList ProgramsARead-onlyIdempotentInspect
List the GrowSurf programs available to the bound team, including their IDs for program selection. Deleted programs are not returned. Does not require GROWSURF_CAMPAIGN_ID.
Inputs: no named parameters. Returns: campaigns
growsurf_list_campaign_webhooksList WebhooksARead-onlyIdempotentInspect
List your GrowSurf program's webhooks (secrets are never returned). Targets campaignId if you pass it, otherwise GROWSURF_CAMPAIGN_ID.
Inputs: campaignId (required). Returns: webhooks
growsurf_list_integrationsList IntegrationsARead-onlyIdempotentInspect
List the integrations available to your GrowSurf program, including Stripe, PayPal, Wise, Mailchimp, Slack, Zapier, and Webhooks. Each entry includes connected (credentials stored), enabled (working), autoDisabled (delivery stopped after repeated failures until the user reconnects), and connectUrl (dashboard connection link). Integrations that do not apply to the program type are omitted, such as Wise on a referral program. Read-only. Account connection takes place in the GrowSurf dashboard and is not available through the API. Targets campaignId if supplied, otherwise GROWSURF_CAMPAIGN_ID.
Inputs: campaignId (required). Returns: integrations
growsurf_list_participantsList ParticipantsARead-onlyIdempotentInspect
List participants in your GrowSurf program, newest page first. limit is 1-100 (default 10). Pass response nextId into the next call to continue paging. Pass metadata to return only participants whose stored metadata matches every given key and value exactly, for example { "customerId": "12345" } to look someone up by your own customer ID; filtered results are ordered by participant ID. Results include participant IDs. Targets campaignId if you pass it, otherwise GROWSURF_CAMPAIGN_ID.
Inputs: campaignId (required), limit, nextId, metadata. Returns: limit, nextId, participants, rewardEvidence
growsurf_list_program_resourcesList Program ResourcesARead-onlyIdempotentInspect
List the participant resources configured for your GrowSurf program, including drafts. Results stay in display order. Targets campaignId if you pass it, otherwise GROWSURF_CAMPAIGN_ID.
Inputs: campaignId (required). Returns: resources
growsurf_mobile_sdk_guideGet Mobile SDK GuideARead-onlyIdempotentInspect
Get Markdown implementation guidance for native iOS/Android SDK 0.10.3 or React Native SDK 0.3.1, including attribution, shareUrl sharing, trackShare, and the native GrowSurf Window. Choose platform and participantState to tailor the guide; includeInstallSnippets controls installation examples. Does not install an SDK or create a participant token. Use growsurf_client_snippets for browser JavaScript or growsurf_api_library_snippets for backend token-creation code.
Inputs: platform, campaignId, mobilePublicKey, participantState, +3 more. Returns: Native iOS/Android or React Native SDK guidance, as a markdown document.
growsurf_participant_auth_hashCompute Participant Auth HashARead-onlyIdempotentInspect
Compute a SHA-256 HMAC using the caller-supplied participantAuthSecret. Server environment secrets are never used. Use a test secret during implementation; keep production signing in your backend. affiliateJoin requires permission for this signed-in user to join the affiliate program directly.
Inputs: email (required), participantAuthSecret (required), affiliateJoin. Returns: The participant authentication hash for the given email.
growsurf_prepare_program_resource_filePrepare Program Resource FileAInspect
Prepare a local file for a FILE Program Resource. Accepts a safe file name, matching supported MIME type, and padded base64 bytes, up to 10 MB. GrowSurf requests a one-time ticket and uploads only to the secure HTTPS destination selected by GrowSurf. Returns the original uploadTicket and uploadResult required for file resource creation or replacement. Altered upload results are not valid. The tool does not accept upload URLs or credentials and never retries an ambiguous upload. Requires GROWSURF_UPLOAD_ALLOWED_ORIGINS on the server; without it, only LINK and TEXT resources are available. Targets campaignId if supplied, otherwise GROWSURF_CAMPAIGN_ID.
Inputs: fileName (required), mimeType (required), campaignId (required), fileBase64 (required). Returns: One-time signed confirmation for a FILE resource create or replacement.
growsurf_program_design_advisorRecommend Program DesignARead-onlyIdempotentInspect
Generate program designs, benchmarks, typical rewards, and metric definitions, including participant-to-referral and lead-to-referral ratios. Read-only. Returns a short draft, complete benchmarkFacts, a proposed configurationPlan, and unresolved decisions. Incentive amounts and qualifying actions remain unresolved unless supplied by the customer. detail: summary returns a configuration draft and reward structure; detail: full adds detailed benchmark tables. Hosted figures describe GrowSurf's high-performing programs; without a bundle, guidance is documentation-based. programType: AFFILIATE selects affiliate advice. industry: other covers local services, pets, hospitality, and agencies. All inputs are optional.
Inputs: goal, detail, audience, industry, +8 more. Returns: Program-design advice and proposed tool calls. The plan is read-only until its…
growsurf_record_saleRecord SaleAIdempotentInspect
Record a sale/transaction for an affiliate program. Use webhooks to know when commissions are added. Requires at least one transaction identifier (externalId, transactionId, orderId, paymentId, invoiceId, paymentIntentId, or chargeId) so repeated calls are de-duplicated instead of double-paying the referrer; reuse the same one when refunding. Targets campaignId if you pass it, otherwise GROWSURF_CAMPAIGN_ID.
Inputs: currency (required), campaignId (required), grossAmount (required), paidAt, +24 more. Returns: Result of recording a sale. A new sale returns `success: true` with `firstSale`…
growsurf_refund_transactionRecord Affiliate Refund or ChargebackADestructiveIdempotentInspect
Record a refund, partial refund, or chargeback for a previously recorded affiliate transaction in GrowSurf and reverse or adjust the referrer's commission. This records the amendment without sending a refund through the payment provider. Requires the same transaction identifier as the original sale. Omitted amountRefunded means a full refund. Already-paid commissions are not clawed back and are recorded for tax only. Targets campaignId if supplied, otherwise GROWSURF_CAMPAIGN_ID.
Inputs: campaignId (required), amount, orderId, chargeId, +17 more. Returns: deleted, matched, message, success, +5 more
growsurf_remove_campaign_custom_domainRemove Program Custom DomainADestructiveIdempotentInspect
Remove the custom domain from your GrowSurf program. Its landing pages stop loading on that domain and go back to their GrowSurf URL. Returns { domain, success }. Returns 404 when no custom domain is set. Targets campaignId if supplied, otherwise GROWSURF_CAMPAIGN_ID.
Inputs: campaignId (required). Returns: domain, success
growsurf_request_participant_payout_destination_confirmationRequest Payout Destination ConfirmationADestructiveInspect
Ask a participant to confirm their payout destination for a provider (by GrowSurf participant ID or email). Sends them a one-time confirmation link for the chosen provider; only the participant can open the link and confirm — this just triggers the message, and the provider must be enabled for the program. Returns { status, provider, providerDisplayName, expiresAt }. Targets campaignId if you pass it, otherwise GROWSURF_CAMPAIGN_ID.
Inputs: provider (required), campaignId (required), participantId, participantEmail. Returns: Confirmation that a payout-destination confirmation message was requested for t…
growsurf_request_team_verificationRequest Team VerificationAIdempotentInspect
Ask GrowSurf to verify the team bound to the API key or OAuth connection. Verification is required before a program can email participants. Calling this again while a request is pending does not create a duplicate. Returns the team with its updated verificationStatus. Requires GROWSURF_API_KEY; does not require GROWSURF_CAMPAIGN_ID.
Inputs: no named parameters. Returns: The team bound to the API key or OAuth connection.
growsurf_resend_team_owner_verification_emailResend Team Owner Verification EmailADestructiveInspect
Resend the email-verification message to the bound team's owner. The response never reveals the owner's email address. A 200 with status: SENT is returned only when an email was sent. Returns 400 if the email is already verified and 429 if one was sent too recently. Requires GROWSURF_API_KEY; does not require GROWSURF_CAMPAIGN_ID.
Inputs: no named parameters. Returns: status, success
growsurf_set_campaign_custom_domainSet Program Custom DomainADestructiveIdempotentInspect
Set or replace the custom domain for your GrowSurf program's landing pages. Pass a hostname such as refer.example.com in domain; https:// is added if you leave it out. Paths, ports, queries, and http:// return 400. Replacing a domain removes the old one right away, and its pages stop loading there, so confirm with the customer before replacing a domain that is already set. Sending the current domain again changes nothing. A domain used by another program returns 409, and 403 means the account cannot use custom domains yet: a higher plan is needed, or for an affiliate program, a payment method on file. A new domain starts unverified: add the CNAME record from the returned dnsRecord at the DNS provider (dnsRecord.name pointing to dnsRecord.value), then call growsurf_verify_campaign_custom_domain. Targets campaignId if supplied, otherwise GROWSURF_CAMPAIGN_ID.
Inputs: domain (required), campaignId (required). Returns: The custom domain after the change. Same shape as the `growsurf_get_campaign_cu…
growsurf_test_campaign_webhookSend Test WebhookADestructiveInspect
Send a live test event to a webhook on your GrowSurf program using its stored URL and secret. Optionally pass event to choose which event type to simulate; when omitted, the webhook's first enabled event is used (returns 400 if the webhook has no enabled events). Returns the mock payload and the receiving endpoint's response. Targets campaignId if you pass it, otherwise GROWSURF_CAMPAIGN_ID.
Inputs: webhookId (required), campaignId (required), event. Returns: payload, success, response
growsurf_trigger_referralTrigger ReferralADestructiveInspect
Trigger referral credit for a referred participant (use when your trigger is Sign up + Qualifying Action). Optionally pass delayInDays (1-90) to hold the credit for N days before awarding it (e.g. to cover a refund window). Targets campaignId if you pass it, otherwise GROWSURF_CAMPAIGN_ID.
Inputs: campaignId (required), delayInDays, participantId, participantEmail. Returns: message, success
growsurf_troubleshoot_referral_trackingTroubleshoot Referral TrackingARead-onlyIdempotentInspect
Diagnose referral tracking and program problems. Accepts a symptom or description without requiring a program or participant ID. Covers referrals not credited, participant emails not sending, rewards not issued, participants not added, Universal Code not detected, integrations or CRMs not syncing, Zapier errors, fraud flags, and analytics discrepancies. Returns ordered diagnostic checks, likely causes, fixes, and documentation links. It does not read program or participant records. Unknown symptom keys return the available symptoms. A description matches only when it contains a symptom label or alias verbatim; otherwise the symptom list is returned.
Inputs: symptom, campaignId, description, participantId, +1 more. Returns: Ordered diagnostic checks, likely causes, fixes, and doc references for one sym…
growsurf_update_campaignUpdate ProgramADestructiveIdempotentInspect
Update your GrowSurf program's (campaign's) identity and lifecycle: name, companyName, companyLogoImageUrl, and status (set IN_PROGRESS to publish/resume the program, COMPLETE to end it). Only the fields you send are changed. type, urlId, and currencyISO are immutable (currency is chosen once at program creation), so this tool does not accept them. Editor-tab config (design, emails, options, installation) is edited with the dedicated config sub-resource tools, not here. Targets campaignId if you pass it, otherwise GROWSURF_CAMPAIGN_ID.
Inputs: campaignId (required), name, status, companyName, +1 more. Returns: The updated program. Same shape as the `growsurf_get_campaign` result.
growsurf_update_campaign_designUpdate Program DesignADestructiveIdempotentInspect
Update the design configuration for your GrowSurf program, including participant avatars under participantAvatarStyle, referred-visitor content such as the Claim Offer Popup and the side content of its GrowSurf page (referredExperience.offerPageDescription HTML, up to 5 offerPageSteps of { text, iconKey }, and up to 3 offerPageLinks of { text, url } where an empty url links to the Share URL), the website widget under widget (button or card, placement, timing, and visible pages), the participant Traffic report under trafficInsights, participant sign-in copy under login, payout-destination confirmation page copy under payoutDestinationConfirmation, and the participant Settings panel under participantSettings, such as the language picker's languageSectionTitle (up to 100 characters) and languageSectionInstructionsText (up to 255 characters). trafficInsights.isPublicDisplayed controls visibility; its labels cannot be blank. participantAvatarStyle accepts CHARACTERS, INITIALS, ANIMALS, or GRADIENT. visualStyle accepts GLOW, CLEAN, FLAT, ROUND, TINT, or GLASS; it sets corners, shadows, button shape and background on program pages and the GrowSurf Window. Changing it also fills theme.buttons.borderRadius and the theme.globalBoxShadow fields unless the same request sets them. Text fields use the same character limits as the dashboard Program Editor. Text the Program Editor requires, such as Window labels, button text, and status names, cannot be set to null, empty, or only spaces. Only supplied fields change; omitted fields retain their existing content and arrays replace wholesale. Targets campaignId if supplied, otherwise GROWSURF_CAMPAIGN_ID.
Inputs: fields (required), campaignId (required). Returns: The full updated design configuration. Same shape as the `growsurf_get_campaign…
growsurf_update_campaign_emailsUpdate Program EmailsADestructiveIdempotentInspect
Update writable Emails tab fields for your GrowSurf program under fields, in their existing nested shape. settings.sender.fromEmail is read-only; sender address changes require domain verification in the dashboard. settings.sender.fromName and settings.sender.replyToEmail accept non-empty strings, not null. Omit either field to keep its current value, including an unset value returned by a read. The invite and transactional email isEnabled toggles are read-only. An email subject cannot be empty. Email bodies require their template links and footer tokens. When settings.design.layoutMode is INLINE, each body must include {{emailFooter}}; {{emailHeader}} is optional. layoutMode is read-only. Omitted fields retain their existing content; arrays replace wholesale. Targets campaignId if supplied, otherwise GROWSURF_CAMPAIGN_ID.
Inputs: fields (required), campaignId (required). Returns: The full updated email configuration. Same shape as the `growsurf_get_campaign_…
growsurf_update_campaign_installationUpdate Program InstallationADestructiveIdempotentInspect
Update the Installation tab configuration for your GrowSurf program under fields. Only supplied fields change; omitted fields retain their existing values and arrays replace wholesale. allowedUrls includes permitted browser origins such as http://localhost:3000. An origin missing from both shareUrl and allowedUrls can return 403. Referral links already shared point at the current shareUrl. Replacing an existing Share URL requires the customer's explicit approval and replaceExistingShareUrl: true; otherwise the patch is refused. Targets campaignId if supplied, otherwise GROWSURF_CAMPAIGN_ID.
Inputs: fields (required), campaignId (required), replaceExistingShareUrl. Returns: The full updated installation configuration. Same shape as the `growsurf_get_ca…
growsurf_update_campaign_optionsUpdate Program OptionsADestructiveIdempotentInspect
Update the Options tab configuration for your GrowSurf program under fields, in its existing nested shape. Only supplied fields change; omitted fields retain their existing values and arrays replace wholesale. languages.additionalLanguages takes the full list of extra languages; send [] to turn them off. The base language is dropped from that list and duplicates collapse. languages.showFlags shows or hides the flag next to each language name. languages.flagCountries picks the flag for a language that offers more than one, such as { "en": "GB" }; null restores the default flag. Turning on languages.additionalLanguages returns 403 if your account does not include additional languages. While any are on, every languages change, including turning them off, returns the same 403. Translations are managed in the GrowSurf dashboard, not through this tool. notificationEmails.recipients needs at least one valid email address. Targets campaignId if supplied, otherwise GROWSURF_CAMPAIGN_ID.
Inputs: fields (required), campaignId (required). Returns: The full updated options. Same shape as the `growsurf_get_campaign_options` res…
growsurf_update_campaign_rewardUpdate Campaign RewardADestructiveIdempotentInspect
Update an existing campaign reward (reward config) on your GrowSurf program. campaignRewardId is the reward key (e.g. crew_...). The reward type is immutable. Targets campaignId if you pass it, otherwise GROWSURF_CAMPAIGN_ID.
Inputs: campaignId (required), campaignRewardId (required), event, limit, +20 more. Returns: The updated campaign reward. Same shape as the items in the `growsurf_list_camp…
growsurf_update_campaign_webhookUpdate WebhookADestructiveIdempotentInspect
Update a webhook on your GrowSurf program by id (webhookId is primary for the program's primary webhook). Only the fields you send are changed. secret is write-only and never returned. A program can have only one saved Bask Health webhook across all bask.ninja hosts and paths, including disabled webhooks. An update that leaves more than one Bask Health webhook returns 400. A concurrent change to webhook settings can return 409; reload the webhooks before retrying. Targets campaignId if you pass it, otherwise GROWSURF_CAMPAIGN_ID.
Inputs: webhookId (required), campaignId (required), events, secret, +2 more. Returns: The updated webhook. Same shape as the items in the `growsurf_list_campaign_web…
growsurf_update_participantUpdate ParticipantADestructiveIdempotentInspect
Update a participant by GrowSurf participant ID or email. Only the fields you send are changed; read-only fields such as counters, isAffiliate, origin, and fraud state are rejected with a 400. In affiliate programs, affiliateStatus accepts APPROVED, SUSPENDED, or BANNED; APPROVED enrolls the participant, while SUSPENDED and BANNED require an existing affiliate. Affiliate enrollment cannot be removed through REST. notes is freeform internal notes (never shown to participants). Targets campaignId if you pass it, otherwise GROWSURF_CAMPAIGN_ID.
Inputs: campaignId (required), email, notes, language, +10 more. Returns: The updated participant. Same shape as the `growsurf_get_participant` result.
growsurf_update_program_resourceUpdate Program ResourceADestructiveIdempotentInspect
Update at least one participant resource field, or move it to a zero-based position. Only supplied fields change. A replacement FILE requires a one-time uploadTicket and the unmodified uploadResult from GrowSurf's secure upload flow. API reference: https://growsurf.com/openapi.json. Targets campaignId if supplied, otherwise GROWSURF_CAMPAIGN_ID.
Inputs: campaignId (required), resourceId (required), url, text, +8 more. Returns: The updated resource. Same shape as the items in the `growsurf_list_program_res…
growsurf_update_teamUpdate TeamADestructiveIdempotentInspect
Update the display name of the team bound to the API key or OAuth connection. Personal profiles, billing, and team ownership are not editable here. Requires GROWSURF_API_KEY; does not require GROWSURF_CAMPAIGN_ID.
Inputs: name (required). Returns: The team bound to the API key or OAuth connection.
growsurf_verify_campaign_custom_domainVerify Program Custom DomainAIdempotentInspect
Check the program's custom domain DNS now and return the result in isVerified. Call it after the CNAME record from dnsRecord is in place. If the record is wrong or has not propagated yet, isVerified stays false; try again later. The first time the check passes, GrowSurf sets up the domain's SSL certificate, and pages can take a few minutes to load over https:// after that. More than one CNAME record on the hostname returns 400. Returns 404 when no custom domain is set. A domain that is already verified is returned as is, without a new check. Targets campaignId if supplied, otherwise GROWSURF_CAMPAIGN_ID.
Inputs: campaignId (required). Returns: The custom domain after the live DNS check. Same shape as the `growsurf_get_cam…
growsurf_webhook_normalizeNormalize Webhook PayloadARead-onlyIdempotentInspect
Validate/normalize a GrowSurf webhook payload and generate a best-effort idempotency key for dedupe.
Inputs: payload (required). Returns: Webhook payload validation result. `ok: true` includes the normalized envelope…
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
Loading tool schema changelog…
TDQS
Scored across 66 tools
Most tools target distinct resources and actions, but the large surface includes several tools that can blur together: client_snippets, embeddable_element_snippet, grsf_config_snippet, integration_guide, mobile_sdk_guide, and api_library_snippets all produce integration guidance, and get_campaign_analytics, get_participant_analytics, and get_campaign_activation_analytics are easy to misselect. Descriptions are detailed and often cross-reference each other, which helps, but 66 tools create many near-neighbors.
Core CRUD tools use a clean growsurf_verb_noun pattern (get_campaign, create_campaign_reward, update_campaign_webhook), but many tools break it with noun-heavy names such as growsurf_integration_guide, growsurf_program_design_advisor, growsurf_agent_program_creation_eval, growsurf_client_snippets, and growsurf_webhook_normalize. The growsurf_ prefix is uniform, so the set remains readable despite mixed conventions.
66 tools is far more than typical for a well-scoped MCP surface, and several documentation/snippet/advisor tools could likely be consolidated into fewer tools with parameters. The domain is broad, but the count is heavy enough to increase selection cost and misselection risk.
The surface is largely comprehensive: campaigns, rewards, webhooks, program resources, config tabs, custom domains, participants, analytics, team, and integrations all have read/write coverage, and there is a file-upload helper for resources. Minor gaps exist, such as no dedicated single-participant delete (only bulk delete) and no campaign deletion, but these are workable.
Maintenance
Related MCP Connectors
Build, launch and manage referral, affiliate and loyalty programs with RefRef from your AI agent.
For businesses that pay affiliates: set up and run your affiliate program from your AI assistant.
Marketing data and actions for AI agents: GA4, Search Console, ads, social, SEO and WordPress.
Manage SalesCloser AI sales agents, leads, campaigns and calls from your AI assistant.
Related MCP Servers
- AlicenseAqualityCmaintenanceEnables users to manage affiliate marketing directly within Claude by connecting to the Affilync platform. Affiliates can search campaigns and track earnings, while brands can create campaigns, monitor performance, and manage affiliate applications through natural language.201MIT
- AlicenseAqualityDmaintenanceEnables AI agents to access affiliate marketing capabilities through AgentFuse's API, allowing them to browse affiliate programs, generate tracked links, and record conversions without writing HTTP code.749 npmMIT
- AlicenseAqualityDmaintenanceEnables AI agents to automate sales outreach, research leads, and manage campaigns directly in OutreachPilot via natural language commands.31MIT
- AlicenseNot gradedqualityDmaintenanceEnables AI agents to manage GoHighLevel workspaces through natural language, with 508 tools across 18 domains for complete CRM, marketing, and workflow automation.Apache 2.0