> ## Documentation Index
> Fetch the complete documentation index at: https://docs.funeli.top/llms.txt
> Use this file to discover all available pages before exploring further.

# MCP tools: steps and components

> Reference for the Funeli MCP tools for steps and components: what each tool does, its parameters and whether it changes live funnels.

Add, change and reorder steps and their components, and look up the component library. Agents call these tools for you; this page lists what each one does and the parameters it takes.

## add\_step

**Add step.** Changes the draft or settings; live funnels change only after publishing.

Insert a step. Components are created in order; omit props to use each component's example. showProgress/allowBack only affect paywall and later steps; before the first paywall, use funnel settings. Component border/elevation/appearance are optional and omitted by default.

| Parameter | Type | Required | Description |
| - | - | - | - |
| `funnel` | string | yes | Funnel id (fn\_...) or slug |
| `step` | object | yes | |
| `index` | integer | no | 0-based position; omit to append |
| `afterId` | string | no | Insert right after this id (alternative to index) |
| `message` | string | no | Revision history note |

## update\_step

**Update step.** Changes the draft or settings; live funnels change only after publishing.

Change step fields: name (a hand-set name stops following the screen text; resetName: true restores the automatic one), kind, id (references are updated), showProgress/allowBack for paywall and later steps, showLogo (false hides the funnel logo here; set the logo with the set\_settings op), next (null = end), resetNext, rules (conditional jumps), exitOffer (\{"goto":"\<offer paywall step>","on":\["checkout\_close","back"]}, shown once per session; null removes), checkoutSheet (title, showPlanCard, footer; components / belowFormComponents replace the extra components above / below the form; planCardPosition = rows before the plan card, counting components, the form as one row, then belowFormComponents; unset = just above the form), hook (HTTPS backend call with send/save mappings; null removes it), appearance (step-wide defaults for its components: palette/typography tokens, align, fontWeight, letterSpacing; padding = body inset px or \{x,y}; gap = px between components; gradient/glow/shadow/border are component-only; a component's own appearance wins; null removes), background (screen background: \{use:"hero"} picks a named theme background, extra fields override it; \{type:"gradient",color,layers,blur} / \{type:"image",color,image,fit,position,overlay} / \{type:"solid",color} sets one inline; null = theme default; legacy \{image,position,fit,scrim} still works). Before the first paywall, progress and back are funnel-level settings.

| Parameter | Type | Required | Description |
| - | - | - | - |
| `funnel` | string | yes | Funnel id (fn\_...) or slug |
| `stepId` | string | yes | |
| `patch` | object | yes | |
| `message` | string | no | Revision history note |

## remove\_step

**Remove step.** Changes what live visitors see or pay, or removes data. Agents confirm with you first.

Delete a step (fails if other steps jump to it).

| Parameter | Type | Required | Description |
| - | - | - | - |
| `funnel` | string | yes | Funnel id (fn\_...) or slug |
| `stepId` | string | yes | |
| `message` | string | no | Revision history note |

## move\_step

**Move step.** Changes the draft or settings; live funnels change only after publishing.

Reorder a step.

| Parameter | Type | Required | Description |
| - | - | - | - |
| `funnel` | string | yes | Funnel id (fn\_...) or slug |
| `stepId` | string | yes | |
| `index` | integer | no | 0-based position; omit to append |
| `afterId` | string | no | Insert right after this id (alternative to index) |
| `message` | string | no | Revision history note |

## add\_component

**Add component.** Changes the draft or settings; live funnels change only after publishing.

Add a library component to a step. Optional instance treatment: appearance (local theme-token overrides), border, elevation, redact; see get\_component\_schema for every token. Resolution: component -> step (update\_step patch.appearance) -> theme.

| Parameter | Type | Required | Description |
| - | - | - | - |
| `funnel` | string | yes | Funnel id (fn\_...) or slug |
| `stepId` | string | yes | |
| `component` | object | yes | |
| `index` | integer | no | 0-based position; omit to append |
| `afterId` | string | no | Insert right after this id (alternative to index) |
| `message` | string | no | Revision history note |

## update\_component

**Update component.** Changes the draft or settings; live funnels change only after publishing.

Change component props and/or visibility. hidden: true keeps the layer but does not render it; false shows it again. mode "merge" (default) shallow-merges into existing props (objects merge deeply, arrays replace, null deletes a key); "replace" sets props wholesale. visibleWhen: conditions on answers/computed fields (e.g. \[\{"field":"bmi","op":"gt","value":25}]); null = always show. border/elevation/appearance/redact: same tokens as add\_component (full list in get\_component\_schema); null clears.

| Parameter | Type | Required | Description |
| - | - | - | - |
| `funnel` | string | yes | Funnel id (fn\_...) or slug |
| `componentId` | string | yes | |
| `props` | object | no | |
| `mode` | "merge" \| "replace" | no | |
| `hidden` | boolean | no | |
| `visibleWhen` | object\[] \| null | no | |
| `message` | string | no | Revision history note |
| `border` | "subtle" \| "strong" \| null | no | |
| `elevation` | "sm" \| "md" \| "lg" \| null | no | |
| `appearance` | object \| null | no | |
| `redact` | object \| null | no | |

## remove\_component

**Remove component.** Changes what live visitors see or pay, or removes data. Agents confirm with you first.

Remove a component.

| Parameter | Type | Required | Description |
| - | - | - | - |
| `funnel` | string | yes | Funnel id (fn\_...) or slug |
| `componentId` | string | yes | |
| `message` | string | no | Revision history note |

## move\_component

**Move component.** Changes the draft or settings; live funnels change only after publishing.

Reorder a component within its step or move it to another step.

| Parameter | Type | Required | Description |
| - | - | - | - |
| `funnel` | string | yes | Funnel id (fn\_...) or slug |
| `componentId` | string | yes | |
| `toStepId` | string | no | |
| `index` | integer | no | 0-based position; omit to append |
| `afterId` | string | no | Insert right after this id (alternative to index) |
| `message` | string | no | Revision history note |

## list\_components

**List components.** Read-only.

The component library grouped by purpose (headlines, questions, results, social proof, actions, paywall, after purchase): every type with a one-line description. Screens can only be built from these.

| Parameter | Type | Required | Description |
| - | - | - | - |
| `group` | "headlines" \| "questions" \| "results" \| "proof" \| "flow" \| "paywall" \| "after" | no | |

## get\_component\_schema

**Get component schema.** Read-only.

JSON Schema of a component's props plus a complete valid example. Read this before adding or editing a component you have not used yet. Optional instance treatment: appearance = local overrides. Palette/typography tokens (primary, surface, text, border, radius, elevation character, typography, fontRole heading|body) override the theme for this component. Box tokens: gradient \{type:"linear"|"radial", angle, shape, position:\{x,y}, size, stops:\[\{color,at?,opacity?}] 2-8}, glow \{color?, radius px, intensity %}, shadow none|sm|md|lg, borderStyle solid|dashed|none, borderWidth px, padding (px or \{x,y}), fill (like step backgrounds: \{use:"\<theme background>"} and/or inline solid/gradient/image; wins over gradient). gap (px between the component's items), align start|center|end, fontWeight 300-900, letterSpacing em. Resolution: component -> step (update\_step patch.appearance) -> theme. Legacy border subtle|strong and elevation sm|md|lg still work; appearance wins. No component-only font families; null removes local appearance. redact \{style blur|bar|noise, revealWhen} hides text marked ||like this|| in the component's text before it reaches the page; purchased="yes" exists after a successful checkout.

| Parameter | Type | Required | Description |
| - | - | - | - |
| `type` | "Heading" \| "Badge" \| "Text" \| "Image" \| "Hero" \| "Spacer" \| "InfoCard" \| "FeatureList" \| "Video" \| "Lottie" \| "ImageCarousel" \| "ProjectionChart" \| "MetricScale" \| "ProfileSummary" \| "LockedPreview" \| "StatHighlight" \| "StatsRow" \| "UserCounter" \| "Marquee" \| "Testimonial" \| "ReviewSummary" \| "BeforeAfter" \| "RatingBadge" \| "ScratchReveal" \| "ActivityFeed" \| "SingleSelect" \| "MultiSelect" \| "NumberInput" \| "TextInput" \| "EmailInput" \| "FileUpload" \| "ConsentCheckbox" \| "DatePicker" \| "Slider" \| "RatingScale" \| "SwipeCards" \| "SignaturePledge" \| "Button" \| "Loader" \| "Popup" \| "Timeline" \| "PlanSelector" \| "CountdownTimer" \| "TrustBadges" \| "Guarantee" \| "FAQ" \| "LegalText" \| "UpsellOffer" \| "StoreButtons" \| "MediaInfoRow" \| "AnalyticsMilestone" | yes | |

## list\_lottie\_animations

**List lottie animations.** Read-only.

The built-in library of MIT-licensed Lottie animations with stable URLs for Lottie.src. Commercial use is allowed and no visible attribution is required.

| Parameter | Type | Required | Description |
| - | - | - | - |
| `category` | "feedback" \| "communication" \| "commerce" \| "productivity" \| "technology" \| "lifestyle" | no | |
| `query` | string | no | Search name, id and keywords, e.g. success, payment, gift or loading |

## list\_activity\_feed\_photos

**List activity feed photos.** Read-only.

List built-in ActivityFeed portraits with ready-to-use absolute API URLs for avatar props. Omit set to return all 40. For ActivityFeed automatic rotation, use items\[].photoSet = women, men or mixed instead of copying URLs.

| Parameter | Type | Required | Description |
| - | - | - | - |
| `set` | "women" \| "men" | no | Filter to one built-in portrait category; omit for all photos |

## set\_computed

**Set computed.** Changes the draft or settings; live funnels change only after publishing.

Create or replace a computed field: a value derived from answers with a JSON expression (no code). Usable in \{\{placeholders}}, \{\{date:\<field>}}, rules and visibleWhen. Operators: add, sub, mul, div, min, max, abs, neg, round, unit (convert an answer using \<field>\_unit to kg/lb/g/st/cm/m/in/ft), bmi (weight, height), years\_since, if. bands turn the number into a label. Example: \{"field":"bmi","expr":\{"op":"bmi","weight":"weight","height":"height"},"round":1}.

| Parameter | Type | Required | Description |
| - | - | - | - |
| `funnel` | string | yes | Funnel id (fn\_...) or slug |
| `computed` | object | yes | |
| `index` | integer | no | |
| `message` | string | no | Revision history note |

## remove\_computed

**Remove computed.** Changes what live visitors see or pay, or removes data. Agents confirm with you first.

Delete a computed field.

| Parameter | Type | Required | Description |
| - | - | - | - |
| `funnel` | string | yes | Funnel id (fn\_...) or slug |
| `field` | string | yes | |
| `message` | string | no | Revision history note |

## set\_web\_redirect

**Set web redirect.** Changes the draft or settings; live funnels change only after publishing.

Configure Web Handoff after any verified payment. webRedirect.panel sets the success-screen panel (visibility, text, button visuals, position/layout, local appearance); panel.visible=false hides only the panel, keeping delivery and auto-navigation; nested patches keep omitted settings; panel:null restores defaults. handoff=true issues a server context token; identityParam (default web\_id) names the canonical UUID query key; redeem returns passFields answers (photos/private fields go there, not in query) and acquisition (UTM/click IDs, also as \{\{utm\_source}}…). delivery configures a purchase-gated server HTTP endpoint (JSON/header templates, owned-photo encoding, receiver idempotency); with delivery.enabled=true and handoff=false the server verifies the purchase, delivers before navigation and adds only the canonical UUID. No secrets in definitions; billing webhooks need no Paddle metadata. Query-template redirects still work; App Handoff can coexist.

| Parameter | Type | Required | Description |
| - | - | - | - |
| `funnel` | string | yes | Funnel id (fn\_...) or slug |
| `webRedirect` | object | yes | |
| `message` | string | no | Revision history note |


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.