Skip to content
verify mcp Beta VerifyMCP is currently in beta. If you notice any issues, get in touch and we’ll put it right.

GrowSurf

NPM · @GROWSURFTEAM/GROWSURF-MCP · 2 COMPONENTS

Build and manage GrowSurf referral and affiliate programs through AI assistants.

−1 this week 87 Trust /100

Last scanned (11 hours ago)

Scores higher than 91% of npm servers

Category Marketing and SEO

Trust breakdown (7 categories)

How this component scores in each security and reliability category. Every signal is checked automatically from public evidence about the published package, including repeated runs of it in an isolated sandbox, and we only credit what we can confirm. How we score → Why this is hard to score →

Supply Chain Security98
  • No malware found by supply-chain analysis.Pass
  • No known CVEs affecting this package version or its production dependencies.Pass
  • No install/post-install scripts declared.Pass
  • 30 of 93 dependencies flagged as unhealthy. View diagnostics → Partial
Provenance & Transparency97
  • Source repository is publicly reachable at the declared URL. View diagnostics → Pass
  • Cryptographically verified build provenance (signed, bound to growsurf/growsurf-mcp). View diagnostics → Pass
  • Clear OSI-approved license (MIT).Pass
  • Actively maintained (last published 0 days ago).Pass
  • Disclosure check failed: no security disclosure policy was found in the source repository. See how to fix → Fail
Schema Quality & AI Usability73
  • 100% of prompts and resources have a non-trivial description (not blank, and not just the item's name).Pass
  • AI-judged instruction clarity (good).Pass
  • Context-footprint check failed: tool/resource definitions use about 17450 tokens (~260/item across 67 items; 66 tools + 1 resources), over budget; trim descriptions and params. See how to fix → Fail
  • Usage-examples check failed: none of the tools include examples. See how to fix → Fail
Stability & Change Management62
  • Stability check failed: the tool surface changed between 0.19.8 and 0.19.28: 1 tool removals, 46 breaking changes, 4 additions. See how to fix → Fail
Tool Coverage83
  • 100% of tools have a non-trivial description (not blank, and not just the tool's name).Pass
  • 42% of tool parameters carry a description.Partial
  • Structured output schemas are declared (100% of tools); any adoption earns full credit.Pass
Tool Safety97
  • No prompt-injection markers were found in the server instructions, tool names or descriptions we captured.Pass
  • 8 of 9 tool(s) whose name or description implies an irreversible operation declare an MCP destructiveHint annotation; "growsurf_agent_program_creation_eval" implies "eval" and declares readOnlyHint instead, contradicting what its own name says it does. See how to fix → Partial
  • An AI judge read all 68 captured unit(s) of tool text and found none that tries to manipulate the model reading it.Pass
Capabilities100
  • Implements a supported MCP spec version (2025-11-25); the latest is 2026-07-28.Pass
What we tested

Checks we ran (16)

  • Malware scan
  • Known CVEs
  • Install scripts
  • Dependency health
  • Source repository
  • Provenance
  • License
  • Maintenance
  • Security disclosure
  • Schema quality
  • Stability
  • Tool coverage
  • Injection markers
  • Destructive annotations
  • Judged manipulation
  • MCP protocol

Does not apply to this package (2)

  • Endpoint SecurityScored on hosted endpoints only. A package has no live endpoint of its own for us to probe.
  • Transport & ReachabilityScored on hosted endpoints only. A package has no live endpoint of its own for us to probe.

The score does not measure everything. What the score does not measure →

Changelog

Every change we have recorded for this component, newest first. Security-relevant changes are always shown. ▲ marks a change for the better, ▼ a change for the worse; unmarked changes are neutral.

  • 4 Nov 26 +15
    • Stability: fail → unverified ▼ security
    • Tool safety: pass → unverified ▼ security
    • Malware scan: unverified → pass ▲ security
    • Capabilities: pass → unverified ▼ functional
    • Tool coverage: 100 → unverified ▼ functional
    • Schema quality: 100 → unverified ▼ functional
    • Package version: 0.19.27 → 0.19.28 functional
  • 3 Nov 26 −16
    • Malware scan: pass → unverified ▼ security
    • Known CVEs: pass → unverified ▼ security
    • Schema quality: 15925 → 17691 ▼ functional
    • Dependency health: 0.86 → unverified ▼ functional
    • Package version: 0.19.24 → 0.19.27 functional
    • Package version: 0.19.24 → 0.19.26 functional
    • Package version: 0.19.24 → 0.19.25 functional
  • 25 Oct 26 +15
    • Malware scan: unverified → pass ▲ security
    • Security disclosure: unverified → fail ▼ functional
  • 24 Oct 26 −15
    • Malware scan: pass → unverified ▼ security
    • Security disclosure: fail → unverified ▼ functional
    • Package version: 0.19.23 → 0.19.24 functional
  • 22 Oct 26 +15
    • Malware scan: unverified → pass ▲ security
  • 21 Oct 26 0
    • Package version: 0.19.22 → 0.19.23 functional
  • 20 Oct 26 −15
    • Known CVEs: pass → unverified ▼ security
    • Malware scan: pass → unverified ▼ security
    • Dependency health: 0.85 → unverified ▼ functional
    • Package version: 0.19.19 → 0.19.22 functional
    • Package version: 0.19.19 → 0.19.21 functional
    • Package version: 0.19.19 → 0.19.20 functional
  • 19 Oct 26 +15
    • Stability: fail → unverified ▼ security
    • Tool safety: pass → unverified ▼ security
    • Malware scan: unverified → pass ▲ security
    • Capabilities: pass → unverified ▼ functional
    • Tool coverage: 100 → unverified ▼ functional
    • Schema quality: 100 → unverified ▼ functional
    • Package version: 0.19.16 → 0.19.19 functional
    • Package version: 0.19.16 → 0.19.18 functional
    • Package version: 0.19.16 → 0.19.17 functional
Diagnostics

Diagnostic detail from the automated scan of this channel: what the scanner observed at each step, so you can see exactly where a check passed or failed. It is informational only and never changes the trust score.

Captured 5 Nov 2026 · Analysed npm/@growsurfteam/growsurf-mcp@0.19.28

Provenance Verified

A signed build attestation was found and verified, binding this exact artifact to the source repository it claims to come from.

Result Verified
Ecosystem npm
Reason Verified
Discovered via Registry attestation endpoint
Source repo growsurf/growsurf-mcp
Certificate issuer https://token.actions.githubusercontent.com
Certificate SAN https://github.com/growsurf/growsurf-mcp/.github/workflows/publish.yml@refs/heads/main
Rekor log index 3687566879
Predicate type SLSA build provenance https://slsa.dev/provenance/v1
Subject digest sha512:4a5036535eaf9fe9229e904259b983cd9ac1cab50eb9b445e39768bf5e61ee9f3414c957521e6d260b599ce1fbef7a1c02ff019de861ae8a76e4809af

Background: How many MCP packages publish verified provenance →

Dependencies 93 packages
Packages resolved 93
Stale 30
Tree resolution Complete

Background: SBOMs and build attestations, explained →

MCP tools · 66 exposed · ~16,792 tokens

The tools this component advertises to a client, with an estimated token cost for each. Expand a tool to see its parameters and schema. The per-tool counts are indicative and are not scored directly; the schema's total context footprint is one signal in Schema Quality & AI Usability. A tool's description is untrusted text the model reads on every call, which is what makes this list a security surface and not just an inventory: how tool poisoning works →

Tool Tokens
growsurf_list_campaigns ~48

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`.

Input schema present but exposes no named parameters.

NameTypeReqDescription
campaignsarray–Programs available to the API key's bound team.

No examples provided.

growsurf_list_integrations ~185

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`.

NameTypeReqDescription
campaignIdstringyesTarget program (campaign) id for this call. Defaults to GROWSURF_CAMPAIGN_ID when omitted. Program IDs also identify newly created programs without restarting the server.
NameTypeReqDescription
integrationsarray–Every integration this program can connect, in the order the GrowSurf dashboard lists them.

No examples provided.

growsurf_list_participants ~231

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.

NameTypeReqDescription
campaignIdstringyesTarget program (campaign) id for this call. Defaults to GROWSURF_CAMPAIGN_ID when omitted. Program IDs also identify newly created programs without restarting the server.
limitinteger––
metadataobject–Exact-match filter on participant metadata, up to 3 keys, for example `{ "customerId": "12345" }`. Values compare as strings.
nextIdstring–Participant ID returned as `nextId` from the previous page.
NameTypeReqDescription
limitinteger–Maximum number of participants requested for this page.
nextIdstring|null–Participant id to pass as `nextId` for the next page, or `null` when there are no more results.
participantsarray–Participants returned for this page.
rewardEvidenceobject–What this response establishes about rewards. Combine with other reads; unknown here does not override evidence elsewhere.

No examples provided.

growsurf_list_program_resources ~93

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.

NameTypeReqDescription
campaignIdstringyesTarget program (campaign) id for this call. Defaults to GROWSURF_CAMPAIGN_ID when omitted. Program IDs also identify newly created programs without restarting the server.
NameTypeReqDescription
resourcesarray–The program's resources in participant display order, including drafts.

No examples provided.

growsurf_mobile_sdk_guide ~217

Get Markdown implementation guidance for native iOS/Android SDK 0.10.2 or React Native SDK 0.3.0, 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.

NameTypeReqDescription
attributionProviderstring––
campaignIdstring––
includeInstallSnippetsboolean––
mobilePublicKeystring––
participantStatestring––
platformstring–`both` renders the native iOS and Android SDKs. `react_native` renders the React Native SDK for bare React Native apps and Expo development builds.
serverVerifiedQualifyingActionboolean––
NameTypeReqDescription
markdownstring–The generated guidance as a markdown document.

No examples provided.

growsurf_participant_auth_hash ~93

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.

NameTypeReqDescription
affiliateJoinboolean––
emailstringyes–
participantAuthSecretstringyes–
NameTypeReqDescription
hashstring–The computed hash. Pass it to the GrowSurf client as the participant's `hash` value.

No examples provided.

growsurf_prepare_program_resource_file ~290

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`.

NameTypeReqDescription
campaignIdstringyesTarget program (campaign) id for this call. Defaults to GROWSURF_CAMPAIGN_ID when omitted. Program IDs also identify newly created programs without restarting the server.
fileBase64stringyesCanonical padded base64 file bytes only. Do not include a data-URL prefix or whitespace.
fileNamestringyesA safe base name with an allowed extension: jpg/jpeg/png/gif/webp/pdf/csv/zip/doc/docx/xls/xlsx/ppt/pptx.
mimeTypestringyesThe supported MIME type matching fileName's extension.
NameTypeReqDescription
uploadResultobject–The minimal signed upload confirmation. Pass it unchanged to create/update.
uploadTicketstring–The one-time GrowSurf ticket. Pass it unchanged to create/update.

No examples provided.

growsurf_program_design_advisor ~664

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.

NameTypeReqDescription
audiencestring–Who refers whom.
businessModelstring–One line on what the business sells and how. Also set `salesMotion` when the buying process is known.
companyNamestring–Used in the heading and proposed program name; omit it when unknown.
currencyISOstring–ISO 4217 code. Non-USD advice omits the dollar reward bands. No exchange rate or equivalent-currency benchmark is available.
detailstring–Use summary for a first design or configuration draft, including a reward structure recommendation. Use full only for requested detailed benchmark tables or specific figures absent from the summary,…
goalstring–What a successful referral means for the business. `paid_conversions` and `leads` imply a qualifying action; `signups`, `subscribers`, and `waitlist` count the signup unless a separate `qualifyingAct…
includeRulesboolean–Append guidance on applying the recommendations. Off by default.
industrystring–Closest industry segment: `financial_services_fintech` (banking, lending, investing, insurance, payments, crypto), `saas_ai` (software sold to businesses, developer tools, AI products), `media_newsle…
programTypestring––
qualifyingActionstring–The action a referred friend must complete, in the customer's words.
rewardBudgetPerReferralnumber–The customer's spending limit per successful referral, in major currency units. A budget does not select an incentive amount or commission rate. Budget comparisons omit the mixed-currency reward amou…
salesMotionstring–Use `sales_led` for demos, sales calls, negotiated pricing, or signed contracts; use `self_service` when customers buy directly. This selects the reward structure. Omit when unknown.
NameTypeReqDescription
benchmarkFactsarray–Complete benchmark statements with metric units, median, Q1, Q3, sample, and source. Quote each statement intact. Empty when no suitable figures are available.
configurationPlanarray–Proposed calls using the listed tools' argument shapes. Preserve each tool and arguments object when presenting the plan; replace <new-program-id> with the creation response's id before execution.
decisionsobject–Use one qualifying action throughout the draft. Unresolved choices require a customer decision before configuration.
markdownstring–The requested summary or full advice, including the same configuration calls and their conditions.

No examples provided.

growsurf_record_sale ~445

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.

NameTypeReqDescription
amountCashNetinteger––
amountPaidinteger––
campaignIdstringyesTarget program (campaign) id for this call. Defaults to GROWSURF_CAMPAIGN_ID when omitted. Program IDs also identify newly created programs without restarting the server.
chargeIdstring––
currencystringyes–
customerIdstring––
descriptionstring––
externalIdstring––
grossAmountintegeryes–
invoiceIdstring––
invoiceSubtotalExcludingTaxinteger––
invoiceTotalinteger––
invoiceTotalExcludingTaxinteger––
netAmountinteger––
orderIdstring––
paidAtinteger––
participantEmailstring––
participantIdstring––
paymentIdstring––
paymentIntentIdstring––
paymentProviderstring–Connected provider for this payment. Requires `transactionId` and `testMode`. Supply matching `grossAmount` and `currency`; other payment IDs and tax or net-amount overrides are not accepted. GrowSur…
subscriptionIdstring––
taxAmountinteger––
testModeboolean–Required with `paymentProvider`: `true` for test or `false` for live. Otherwise omit.
totalTaxAmountinteger––
totalTaxAmountsarray––
totalTaxesarray––
transactionIdstring––
NameTypeReqDescription
commissionsCreatedinteger–Commissions created by this duplicate request.
duplicateboolean–`true` when the sale matched an existing transaction.
duplicateFieldsarray–Identifier fields that matched an existing transaction.
firstSaleboolean–Whether this was the referred customer's first recorded sale.
matchingCommissionIdsarray–Commission ids that matched the submitted identifiers.
messagestring–Human-readable result message.
successboolean–`true` when the sale was recorded; `false` when it matched an existing transaction.

No examples provided.

growsurf_refund_transaction ~569

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`.

NameTypeReqDescription
amendmentTypestring––
amountinteger––
amountRefundedinteger––
campaignIdstringyesTarget program (campaign) id for this call. Defaults to GROWSURF_CAMPAIGN_ID when omitted. Program IDs also identify newly created programs without restarting the server.
chargeIdstring––
currencystring––
descriptionstring––
externalIdstring––
invoiceIdstring––
orderIdstring––
participantEmailstring––
participantIdstring––
paymentIdstring––
paymentIntentIdstring––
paymentProviderstring–Connected provider for the original payment. Requires its `transactionId` and `testMode`. This amends GrowSurf records without sending a refund through the provider.
refundAmountinteger–Positive amount for this individual refund, no greater than the sale amount, in the sale currency's minor unit. Send it with `refundId` on each original refund to support cancellations and out-of-ord…
refundHistoryCompleteboolean–Set true only after reconciling and recording every original refundId and refundAmount, including refunds later canceled. This confirmation resolves previously incomplete history. Omit during ordinar…
refundIdstring–Stable per-refund identifier. Required when canceling a refund or changing the refunded total after a cancellation. Reuse the original refund's identifier for its cancellation. An amendment without e…
refundStatusstring––
testModeboolean–Original payment mode: `true` for test or `false` for live. Requires `paymentProvider`.
transactionIdstring––
NameTypeReqDescription
adjustedinteger–Commissions partially adjusted.
amendmentTypestring–Amendment type that was processed.
deletedinteger–Pending commissions deleted by the amendment.
matchedinteger–Commissions found for the provided identifiers.
matchingCommissionIdsarray–Commission ids that matched the submitted identifiers.
messagestring–Human-readable result message.
notFoundboolean–Present and `true` when no commission matched the provided identifiers.
reversedinteger–Commissions reversed (set to zero amount).
successboolean–`true` when the amendment was processed; `false` when no matching transaction was found.

No examples provided.

growsurf_remove_campaign_custom_domain ~118

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`.

NameTypeReqDescription
campaignIdstringyesTarget program (campaign) id for this call. Defaults to GROWSURF_CAMPAIGN_ID when omitted. Program IDs also identify newly created programs without restarting the server.
NameTypeReqDescription
domainstring–The custom domain that was removed.
successboolean–Whether the custom domain was removed.

No examples provided.

growsurf_request_participant_payout_destination_confirmation ~205

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.

NameTypeReqDescription
campaignIdstringyesTarget program (campaign) id for this call. Defaults to GROWSURF_CAMPAIGN_ID when omitted. Program IDs also identify newly created programs without restarting the server.
participantEmailstring––
participantIdstring––
providerstringyesThe payout provider the participant should confirm a destination for: `PAYPAL`, `VENMO`, or `WISECOM`. Venmo recipients must be in the United States.
NameTypeReqDescription
expiresAtinteger|null–When the confirmation link expires, as a Unix timestamp in milliseconds.
providerstring–The payout provider identifier the participant was asked to confirm. Values are open-ended; current examples include `PAYPAL`, `VENMO`, and `WISECOM`.
providerDisplayNamestring–The customer-facing provider name (e.g. "PayPal", "Wise").
statusstring–Confirms the message was requested (`CONFIRMATION_REQUESTED`).

No examples provided.

growsurf_request_team_verification ~84

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`.

Input schema present but exposes no named parameters.

NameTypeReqDescription
namestring–The team's display name.
verificationRequestedAtinteger|null–When verification was last requested, as a Unix timestamp in milliseconds.
verificationStatusstring–Team verification state. `VERIFIED` is required before a program can send participant emails.

No examples provided.

growsurf_resend_team_owner_verification_email ~99

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`.

Input schema present but exposes no named parameters.

NameTypeReqDescription
statusstring–Status of the verification email request.
successboolean–Whether the verification email request was accepted.

No examples provided.

growsurf_set_campaign_custom_domain ~290

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`.

NameTypeReqDescription
campaignIdstringyesTarget program (campaign) id for this call. Defaults to GROWSURF_CAMPAIGN_ID when omitted. Program IDs also identify newly created programs without restarting the server.
domainstringyesThe hostname to serve the program's landing pages from, with or without `https://`, such as `refer.example.com`.

Structured output declared, but exposes no named fields.

No examples provided.

growsurf_test_campaign_webhook ~157

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.

NameTypeReqDescription
campaignIdstringyesTarget program (campaign) id for this call. Defaults to GROWSURF_CAMPAIGN_ID when omitted. Program IDs also identify newly created programs without restarting the server.
eventstring––
webhookIdstringyes–
NameTypeReqDescription
payloadobject–The mock event payload that was sent.
responseobject–Response returned by the webhook endpoint during the test.
successboolean–Whether the test webhook request completed.

No examples provided.

growsurf_trigger_referral ~149

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.

NameTypeReqDescription
campaignIdstringyesTarget program (campaign) id for this call. Defaults to GROWSURF_CAMPAIGN_ID when omitted. Program IDs also identify newly created programs without restarting the server.
delayInDaysinteger––
participantEmailstring––
participantIdstring––
NameTypeReqDescription
messagestring–Human-readable result message. Present when credit was not awarded immediately.
successboolean–Whether referral credit was awarded, scheduled, or cancelled.

No examples provided.

growsurf_troubleshoot_referral_tracking ~299

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.

NameTypeReqDescription
campaignIdstring–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.
descriptionstring–The problem in the customer's words, when `symptom` is unknown.
participantEmailstring–Affected participant email, when the id is unknown.
participantIdstring–Affected participant id, echoed into participant-level checks.
symptomstring–The symptom to diagnose. Known keys: `participant_emails_not_sending`, `reward_not_issued`, `referral_not_credited`, `participants_not_added`, `universal_code_not_detected`, `platform_specific_instal…
NameTypeReqDescription
markdownstring–The generated guidance as a markdown document.

No examples provided.

growsurf_update_campaign ~246

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.

NameTypeReqDescription
campaignIdstringyesTarget program (campaign) id for this call. Defaults to GROWSURF_CAMPAIGN_ID when omitted. Program IDs also identify newly created programs without restarting the server.
companyLogoImageUrlstring|null––
companyNamestring|null––
namestring––
statusstring–Lifecycle transition. IN_PROGRESS publishes/resumes the program; COMPLETE ends it. These are the only accepted targets — DRAFT/PENDING/CANCELLED are rejected by the API.

Structured output declared, but exposes no named fields.

No examples provided.

growsurf_update_campaign_design ~443

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`.

NameTypeReqDescription
campaignIdstringyesTarget program (campaign) id for this call. Defaults to GROWSURF_CAMPAIGN_ID when omitted. Program IDs also identify newly created programs without restarting the server.
fieldsobjectyes–

Structured output declared, but exposes no named fields.

No examples provided.

growsurf_update_campaign_emails ~248

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`.

NameTypeReqDescription
campaignIdstringyesTarget program (campaign) id for this call. Defaults to GROWSURF_CAMPAIGN_ID when omitted. Program IDs also identify newly created programs without restarting the server.
fieldsobjectyes–

Structured output declared, but exposes no named fields.

No examples provided.

growsurf_update_campaign_installation ~272

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`.

NameTypeReqDescription
campaignIdstringyesTarget program (campaign) id for this call. Defaults to GROWSURF_CAMPAIGN_ID when omitted. Program IDs also identify newly created programs without restarting the server.
fieldsobjectyesInstallation fields to patch. Common keys include `shareUrl`, `allowedUrls`, `signupEvent`, `referralTrigger`, `signup`, `offerPageRedirectSeconds`, and `instructionSelections`. Arrays replace wholes…
replaceExistingShareUrlboolean–Set this to `true` only after the customer confirms they want a different landing page. Without it, a patch that would replace a Share URL that is already set is refused.

Structured output declared, but exposes no named fields.

No examples provided.

growsurf_update_campaign_options ~273

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`.

NameTypeReqDescription
campaignIdstringyesTarget program (campaign) id for this call. Defaults to GROWSURF_CAMPAIGN_ID when omitted. Program IDs also identify newly created programs without restarting the server.
fieldsobjectyes–

Structured output declared, but exposes no named fields.

No examples provided.

growsurf_update_campaign_reward ~766

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.

NameTypeReqDescription
campaignIdstringyesTarget program (campaign) id for this call. Defaults to GROWSURF_CAMPAIGN_ID when omitted. Program IDs also identify newly created programs without restarting the server.
campaignRewardIdstringyes–
commissionStructureobject–Affiliate commission structure (AFFILIATE rewards only). Provide a positive `amount` (+ optional `amountISO`) for a FIXED commission, or `percent` for a PERCENT commission. CLICK and LEAD commissions…
conversionsRequiredinteger––
couponCodestring|null––
descriptionstring––
eventstring–The referral event that earns this Campaign Reward. Use `LEAD` for a referred signup or `CONVERSION` for a qualifying action. A `LEAD` reward requires a later custom conversion trigger. Referral rewa…
imageIconKeystring|null–The starter icon shown for the reward, or `null` when `imageUrl` is your own image. Participant pages draw this icon in your program's accent color. Also set `imageUrl` to the icon's image so the iOS…
imageUrlstring|null––
isUnlimitedboolean––
isVisibleboolean––
limitinteger––
limitDurationstring––
metadataobject–Custom key/value metadata. Sending it replaces the stored object. Each value must be a string, number, or boolean of up to 500 characters. Each key must have 1 to 40 characters once camelCased, and t…
nextMilestonePrefixstring|null––
nextMilestoneSuffixstring|null––
numberOfWinnersinteger––
orderinteger––
referralCouponCodestring|null––
referralDescriptionstring|null––
referredRewardUpfrontboolean––
referredValueobject|null–Tax valuation for the referred friend's side of a double-sided reward. `taxCharacter` is the reason the recipient earns the reward. For configurable non-commission rewards, `null` inherits the progra…
titlestring––
valueobject|null–Tax valuation for the reward (the referrer's side of a double-sided reward). `fairMarketValueUSD` is the manual fair-market value in USD (major units). `taxCharacter` is the reason the recipient earn…

Structured output declared, but exposes no named fields.

No examples provided.

growsurf_update_campaign_webhook ~241

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.

NameTypeReqDescription
campaignIdstringyesTarget program (campaign) id for this call. Defaults to GROWSURF_CAMPAIGN_ID when omitted. Program IDs also identify newly created programs without restarting the server.
eventsarray–Replacement event list. Events must be ones the program type offers; an event this webhook already has on is also accepted.
isEnabledboolean––
payloadUrlstring––
secretstring–Write-only.
webhookIdstringyes–

Structured output declared, but exposes no named fields.

No examples provided.

growsurf_update_participant ~551

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`.

NameTypeReqDescription
affiliateStatusstring–Affiliate programs only. Sets the affiliate status. `APPROVED` also enrolls a participant who is not yet an affiliate. `SUSPENDED` and `BANNED` are rejected for non-affiliates.
campaignIdstringyesTarget program (campaign) id for this call. Defaults to GROWSURF_CAMPAIGN_ID when omitted. Program IDs also identify newly created programs without restarting the server.
emailstring–Change the participant's email address.
firstNamestring––
languagestring|null–The language of the participant's portal and program emails. Must be one of the program's languages (`languages` in `growsurf_get_campaign_options`); any other code returns a `400`. Send `null` or th…
lastNamestring––
metadataobject––
notesstring–Freeform internal notes (internal only, never exposed to participants).
participantEmailstring––
participantIdstring––
referralStatusstring––
referredBystring––
unsubscribedboolean––
vanityKeysarray––

Structured output declared, but exposes no named fields.

No examples provided.

growsurf_update_program_resource ~253

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`.

NameTypeReqDescription
campaignIdstringyesTarget program (campaign) id for this call. Defaults to GROWSURF_CAMPAIGN_ID when omitted. Program IDs also identify newly created programs without restarting the server.
categorystring|null––
descriptionstring|null––
isPublishedboolean––
positioninteger––
resourceIdstringyes–
textstring–Used with `TEXT`.
titlestring––
typestring––
uploadResultobject–The unmodified result returned by the secure upload flow for a replacement `FILE`.
uploadTicketstring–The one-time upload ticket for a replacement `FILE`.
urlstring–Used with `LINK`.

Structured output declared, but exposes no named fields.

No examples provided.

growsurf_update_team ~72

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`.

NameTypeReqDescription
namestringyesThe team's display name.
NameTypeReqDescription
namestring–The team's display name.
verificationRequestedAtinteger|null–When verification was last requested, as a Unix timestamp in milliseconds.
verificationStatusstring–Team verification state. `VERIFIED` is required before a program can send participant emails.

No examples provided.

growsurf_verify_campaign_custom_domain ~207

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`.

NameTypeReqDescription
campaignIdstringyesTarget program (campaign) id for this call. Defaults to GROWSURF_CAMPAIGN_ID when omitted. Program IDs also identify newly created programs without restarting the server.

Structured output declared, but exposes no named fields.

No examples provided.

growsurf_webhook_normalize ~81

Validate/normalize a GrowSurf webhook payload and generate a best-effort idempotency key for dedupe.

NameTypeReqDescription
payloadobject|array|string|number|boolean|nullyesJSON value to validate. A valid webhook envelope is an object with `event`, `createdAt`, and `data`. Other JSON values return `ok: false`.
NameTypeReqDescription
envelopeobject–The normalized webhook envelope. Present only when `ok` is `true`.
errorstring–Why the payload failed validation. Present only when `ok` is `false`.
idempotencyKeystring–A deterministic key for ignoring duplicate deliveries. Present only when `ok` is `true`.
okboolean–Whether the payload is a valid GrowSurf webhook envelope.

No examples provided.

Install

How do I install the GrowSurf MCP server?

GrowSurf runs locally as an npm package, launched with npx -y @growsurfteam/growsurf-mcp. Ready-made configuration for Claude, Cursor, VS Code, Codex and 5 more is on this page, copied from each client's own documentation.

npm · @growsurfteam/growsurf-mcp

# add to Claude Code
claude mcp add com-growsurf-growsurf -- npx -y @growsurfteam/growsurf-mcp
Common questions

What is the GrowSurf MCP server?

GrowSurf is an MCP server listed in the public MCP registry as com.growsurf/growsurf. Build and manage GrowSurf referral and affiliate programs through AI assistants. This page covers its npm package (@growsurfteam/growsurf-mcp).

Is the GrowSurf MCP server safe to use?

GrowSurf scores 87 out of 100 on VerifyMCP. We found no known CVEs affecting it as of 5 November 2026. It declares no install or post-install scripts. Its build provenance is signed and verified. That is a record of what we were able to check automatically, not an endorsement. The category breakdown on this page shows every signal behind the number, including the ones we could not confirm.

What tools does the GrowSurf MCP server expose?

GrowSurf exposes 66 tools: growsurf_integration_guide, growsurf_agent_program_creation_eval, growsurf_program_design_advisor, growsurf_troubleshoot_referral_tracking, growsurf_mobile_sdk_guide, and 61 more. Their descriptions and schemas cost roughly 16,792 tokens of context every time the server is loaded.

Is the GrowSurf MCP server still maintained?

GrowSurf is still listed as active in the MCP registry. We last reached this channel on 5 November 2026. Those dates come from our own scans of the registry and the channel itself, not from anything the publisher announced.

What licence is the GrowSurf MCP server under?

GrowSurf declares the MIT licence, which is OSI-approved. That covers the source only, and says nothing about the cost of any service it calls.

What did VerifyMCP test on the GrowSurf MCP server?

VerifyMCP ran 16 checks on GrowSurf, covering Malware scan, Known CVEs, Install scripts, Dependency health and 12 more. Endpoint Security and Transport & Reachability do not apply to an npm package, so they were not tested. The score does not measure everything, and the scoring documentation lists what it leaves out.