> ## 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: pricing and payments

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

Plans and offers on a funnel, payment connections of a project, and the Paddle price catalog. Agents call these tools for you; this page lists what each one does and the parameters it takes.

## set\_plan

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

Create or fully replace a pricing plan. Amounts are integer cents. intro = introductory price for N days (amount 0 = free trial). originalAmount = crossed-out price. For Paddle catalog reuse, prefer list\_paddle\_prices + bind\_paddle\_price instead of manually writing providers.paddle ids.

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

## update\_plan

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

Deep-merge a patch into a plan, e.g. \{"price":\{"amount":3499}} or \{"intro":\{"amount":99,"days":7}} or \{"badge":null}. Amounts are cents. For Paddle catalog reuse, prefer list\_paddle\_prices + bind\_paddle\_price instead of manually writing providers.paddle ids.

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

## remove\_plan

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

Delete a plan (fails validation if a PlanSelector still references it).

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

## set\_offer

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

Create or replace a one-off upsell product (pricing.offers), charged one-click to the card saved at checkout when an UpsellOffer with the same offerId is accepted. Amounts are integer cents.

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

## remove\_offer

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

Delete an upsell product. Upsell blocks that sold it switch to replaceWith when given; otherwise they are left without an offer and publish is refused until one is picked (adding a new offer fills an empty upsell block automatically).

| Parameter | Type | Required | Description |
| - | - | - | - |
| `funnel` | string | yes | Funnel id (fn\_...) or slug |
| `offerId` | string | yes | |
| `replaceWith` | string | no | Another existing offer the upsell blocks switch to |
| `message` | string | no | Revision history note |

## sync\_prices

**Sync prices.** Changes the draft or settings; live funnels change only after publishing.

Synchronize provider prices for draft plans. For Paddle, first call list\_paddle\_prices and bind an active existing exact-fit price when one exists. This tool creates/reuses Funeli-managed provider prices only for plans that do not have an explicit Paddle binding.

| Parameter | Type | Required | Description |
| - | - | - | - |
| `funnel` | string | yes | Funnel id (fn\_...) or slug |

## set\_payments

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

Choose which payment connection this funnel checks out with (a connection id from get\_account\_settings's paymentConnections, or "mock"; omit/null inherits the account default), Paddle checkout presentation (checkoutMode: overlay, inline, express; Stripe/mock unaffected), the step shown after a successful payment (successStepId; null = step after the paywall), and Paddle metadata templates (customData: \{user\_id: "\{\{runtime\_id}}"}; \{} clears mappings). runtime\_id is a server-owned UUID per funnel session; existing external identifiers can use raw answer fields; missing values block checkout. Reserved Funeli metadata cannot be overwritten.

| Parameter | Type | Required | Description |
| - | - | - | - |
| `funnel` | string | yes | Funnel id (fn\_...) or slug |
| `connectionId` | string \| null | no | |
| `checkoutMode` | "overlay" \| "inline" \| "express" | no | |
| `successStepId` | string \| null | no | |
| `customData` | object | no | |
| `message` | string | no | Revision history note |

## get\_account\_settings

**Get account settings.** Read-only.

Read payment settings and providers, ad connections, analytics connections (provider, enabled, non-secret config) and projects. Never includes credentials: connect or rotate them in the admin UI, not through an agent.

| Parameter | Type | Required | Description |
| - | - | - | - |
| `accountId` | string | no | |

## update\_account\_payments

**Update account payments.** Changes what live visitors see or pay, or removes data. Agents confirm with you first.

Set a project's default payment connection (default: the current project): its funnels inherit it unless one picks its own with set\_payments. Pass one of that project's connections (paymentConnections with its projectId in get\_account\_settings), or "mock" to clear it. Connecting a provider (credentials) is done in the admin UI only.

| Parameter | Type | Required | Description |
| - | - | - | - |
| `accountId` | string | no | |
| `projectId` | string | no | |
| `connectionId` | string | yes | |

## rename\_payment\_connection

**Rename payment connection.** Changes the draft or settings; live funnels change only after publishing.

Rename a payment connection (credentials and id unchanged; edit credentials in Workspace). Reruns and returns the three credential checks.

| Parameter | Type | Required | Description |
| - | - | - | - |
| `accountId` | string | no | |
| `connectionId` | string | yes | |
| `label` | string | yes | |

## copy\_payment\_connection

**Copy payment connection.** Changes the draft or settings; live funnels change only after publishing.

Copy a Paddle connection of projectId (default current) into toProjectId; secrets stay server-side, the copy gets its own webhook destination.

| Parameter | Type | Required | Description |
| - | - | - | - |
| `projectId` | string | no | |
| `connectionId` | string | yes | |
| `toProjectId` | string | yes | |

## test\_payment\_connection

**Test payment connection.** Changes the draft or settings; live funnels change only after publishing.

Test a saved Paddle connection with read-only Paddle APIs: checks for API key, active client token and webhook secret/destination, plus status and lastError; never credentials. Missing read permissions are not\_checked; delivery is not tested.

| Parameter | Type | Required | Description |
| - | - | - | - |
| `accountId` | string | no | |
| `connectionId` | string | yes | |

## remove\_payment\_connection

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

Disconnect an existing saved payment connection without exposing its credentials. The API refuses removal while the Workspace default or a funnel still points at it.

| Parameter | Type | Required | Description |
| - | - | - | - |
| `accountId` | string | no | Workspace/account id; omit for the connected workspace |
| `connectionId` | string | yes | |

## list\_paddle\_prices

**List paddle prices.** Read-only.

List reusable prices that already exist in a connected Paddle account. Use this before creating provider prices for a Paddle funnel. Prefer an active exact-fit existing price and bind it to the Funeli plan (recurring price) or upsell offer (one-off price: offerImportable); only create a new provider price when no suitable existing price is available or the user explicitly asks for a new catalog item.

| Parameter | Type | Required | Description |
| - | - | - | - |
| `connectionId` | string | yes | Connected Paddle payment connection id (pconn\_...) |
| `status` | "active" \| "archived" \| "all" | no | active is the normal import workflow; archived/all are for diagnosis only |

## bind\_paddle\_price

**Bind paddle price.** Changes the draft or settings; live funnels change only after publishing.

Assign an existing Paddle price to a Funeli plan or upsell offer (pass exactly one of planId / offerId). A plan takes a recurring price: Funeli imports its amount, currency, billing interval and supported trial terms. An offer takes a one-off price without a trial: Funeli imports its amount and currency, and the one-click upsell charges exactly that price. Funeli stores the Paddle product/price ids and reuses that price at checkout and on every upsell charge. Pass priceId=null to clear the explicit binding and return the item to Funeli-managed price creation/reuse.

| Parameter | Type | Required | Description |
| - | - | - | - |
| `funnel` | string | yes | Funnel id (fn\_...) or slug |
| `planId` | string | no | Funeli pricing plan id (recurring Paddle price) |
| `offerId` | string | no | Funeli upsell offer id (one-off Paddle price) |
| `priceId` | string \| null | yes | Existing Paddle price id, or null to clear the binding |

## get\_paddle\_price\_status

**Get paddle price status.** Read-only.

Show where each plan and upsell offer of a funnel stands in its Paddle account, without calling Paddle: linked (a plan carries a matching Paddle price, picked from the catalog or created by Funeli), out\_of\_sync (the plan was edited after linking; checkout and publish fail until it is relinked or a new price is created), managed (Funeli already created a price for these exact terms) or missing (nothing in Paddle yet; it is created on publish or first checkout). Also returns the provider and connection the funnel really checks out with.

| Parameter | Type | Required | Description |
| - | - | - | - |
| `funnel` | string | yes | Funnel id (fn\_...) or slug |

## create\_paddle\_prices

**Create paddle prices.** Changes the draft or settings; live funnels change only after publishing.

Give plans and upsell offers a Paddle price now instead of at publish. For each plan or offer that is not linked (or is out\_of\_sync) Funeli links, in order: the price it already created for the same terms, an active catalog price with exactly the same terms (plans: amount, currency, period and intro; offers: a one-off price with the same amount and currency), or a new price. Links are written to the draft in one revision; paywall copy is untouched. Omit items to cover every plan and offer that needs a price. Call get\_paddle\_price\_status first and tell the user which prices will be created in their Paddle account.

| Parameter | Type | Required | Description |
| - | - | - | - |
| `funnel` | string | yes | Funnel id (fn\_...) or slug |
| `items` | object\[] | no | Plans/offers to cover; omit for all that need a price |


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