Trickl for AI assistants: full docs, setup plans, and sandbox tools to test purchases end to end.
Maintain this server? Claim it
Call this server's tools from your browser. Nothing to install.
Requests go through mcptry because browsers can't call most MCP servers directly. Header values are sent to the server for that request only and are never stored or logged.
Tool list from our last check. Connect live to refresh it.
Cancels a sandbox goal via POST /goals/:goalId/cancel, as the user's server would when a customer cancels: collected chunks (and a refundable deposit) are refunded in the ledger only, and goal.cancelled is sent.
goalId from create_test_goal
This tool isn't marked read-only, so it may change something on the server or in an account you connected.
Cancels a sandbox goal via POST /goals/:goalId/cancel, as the user's server would when a customer cancels: collected chunks (and a refundable deposit) are refunded in the ledger only, and goal.cancelled is sent.
| Argument | Type | Description |
|---|---|---|
| goalId* | string | goalId from create_test_goal |
{
"type": "object",
"required": [
"goalId"
],
"properties": {
"goalId": {
"type": "string",
"description": "goalId from create_test_goal"
}
},
"additionalProperties": false
}Confirms this connector's test key works and shows its platform, scopes and mode. Run it before the other sandbox tools; if it fails, the message says what the user needs to fix.
No arguments.
{
"type": "object",
"properties": {},
"additionalProperties": false
}Creates a goal with POST /goals/create using the test key. No money moves. Returns goalId, paymentUrl (hosted checkout) and clientSecret (embedded checkout). Amounts are integer cents, USD.
| Argument | Type | Description |
|---|---|---|
| deadline | string | ISO 8601 due date, 24h to 2 years out (one-time goals only) |
| imageUrl | string | |
| metadata | object | Echoed verbatim in every webhook, e.g. { orderId } |
| cancelUrl | string | |
| frequency | string | Makes it a recurring subscription; omit for a one-time purchase |
| callbackUrl | string | Where the buyer returns after confirming; localhost is allowed in test mode |
| description* | string | What the buyer is saving for, max 500 characters |
| targetAmount* | integer | Price in cents, e.g. 2999 = $29.99 |
| depositAmount | integer | Upfront card charge in cents. One-time: ≥ 50 and < targetAmount. Subscription: = targetAmount or omit |
Returns a sandbox goal's current state via GET /goals/:goalId: status, amounts saved, buyer, deadline.
| Argument | Type | Description |
|---|---|---|
| goalId* | string | goalId from create_test_goal |
{
"type": "object",
"required": [
"goalId"
],
"properties": {
"goalId": {
"type": "string",
"description": "goalId from create_test_goal"
}
},
"additionalProperties": false
}Start here. Without an integration, explains the ways to add Trickl (own business such as a SaaS, or a multi-seller platform) and how to choose. With one, returns a step-by-step plan for the coding agent: keys, exact API calls, webhook handling, what to store, and how to prove it works with this server's sandbox tools.
| Argument | Type | Description |
|---|---|---|
| integration | string | own_*: the user's own business gets paid (SaaS, app, course, membership); own_embedded_checkout puts checkout inside their app. platform_*: many sellers on the user's platform get paid. embedded = in-page iframe, hosted = redirect to Trickl. embed_widget: paste-in pricing widget, no backend. Omit to see the choices. |
{
"type": "object",
"properties": {
"integration": {
"enum": [
"embed_widget",
"own_embedded_checkout",
"own_hosted_checkout",
"platform_embedded_checkout",
"platform_hosted_checkout"
],
"type": "string",
"description": "own_*: the user's own business gets paid (SaaS, app, course, membership); own_embedded_checkout puts checkout inside their app. platform_*: many sellers on the user's platform get paid. embedded = in-page iframe, hosted = redirect to Trickl. embed_widget: paste-in pricing widget, no backend. Omit to see the choices."
}
},
"additionalProperties": false
}Shows every webhook Trickl sent for a sandbox goal, newest first, with its payload and the receiver's result. DELIVERED = got a 2xx. FAILED = rejected, retry scheduled at nextRetryAt. EXHAUSTED = gave up. PENDING / DELIVERING = in flight; check again in a few seconds. Use lastStatusCode and lastError to debug the receiver.
| Argument | Type | Description |
|---|---|---|
| goalId* | string | goalId from create_test_goal |
{
"type": "object",
"required": [
"goalId"
],
"properties": {
"goalId": {
"type": "string",
"description": "goalId from create_test_goal"
}
},
"additionalProperties": false
}Returns one section of the Trickl docs in full (Markdown), by id from search_docs.
| Argument | Type | Description |
|---|---|---|
| id* | string | Section id, e.g. "platform-api/sandbox-test-mode" |
{
"type": "object",
"required": [
"id"
],
"properties": {
"id": {
"type": "string",
"description": "Section id, e.g. \"platform-api/sandbox-test-mode\""
}
},
"additionalProperties": false
}Registers a seller (provider) under the test key via POST /providers/register and returns providerLinkCode (needed to create goals) and webhookSecret (to verify webhooks). Idempotent on externalCreatorId. webhookUrl must be a public https URL that reaches the user's receiver, e.g. an ngrok or cloudflared tunnel to localhost. Sandbox webhooks are real signed HTTP requests.
| Argument | Type | Description |
|---|---|---|
| string | Must not belong to an existing Trickl provider. Default: a per-seller @example.com address | |
| webhookUrl* | string | https URL of the user's webhook receiver |
| websiteUrl | string | Seller site; its host is allowed for redirects and embedded checkout |
| businessName | string | Default: Sandbox Seller |
| externalCreatorId | string | The seller's id in the user's app. Default: sandbox-seller-1 |
| stripeConnectAccountId | string | Leave empty in sandbox: a placeholder is used, since sandbox goals never reach Stripe |
{
"type": "object",
"required": [
"webhookUrl"
],
"properties": {
"email": {
"type": "string",
"description": "Must not belong to an existing Trickl provider. Default: a per-seller @example.com address"
},
"webhookUrl": {
"type": "string",
"description": "https URL of the user's webhook receiver"
},
"websiteUrl": {
"type": "string",
"description": "Seller site; its host is allowed for redirects and embedded checkout"
},
"businessName": {
"type": "string",
"description": "Default: Sandbox Seller"
},
"externalCreatorId": {
"type": "string",
"description": "The seller's id in the user's app. Default: sandbox-seller-1"
},
"stripeConnectAccountId": {
"type": "string",
"description": "Leave empty in sandbox: a placeholder is used, since sandbox goals never reach Stripe"
}
},
"additionalProperties": false
}Keyword search over the Trickl partner docs (platform API, webhooks, embed widget). Returns section ids with snippets; read one with read_doc. Leave query empty for the full table of contents.
| Argument | Type | Description |
|---|---|---|
| query | string | e.g. "deadline goal", "verify signature", "REDIRECT_URL_NOT_ALLOWED" |
{
"type": "object",
"properties": {
"query": {
"type": "string",
"description": "e.g. \"deadline goal\", \"verify signature\", \"REDIRECT_URL_NOT_ALLOWED\""
}
},
"additionalProperties": false
}Moves a sandbox goal through its lifecycle instantly; each event sends the real signed webhook to the seller's webhookUrl, exactly as live would. confirm: the buyer signs up and links a bank (goal.deposit_paid if there is a deposit; for subscriptions also goal.subscription_created, plus goal.cycle_paid at once if the deposit paid the first period in full). collect: one round-up chunk, $3 by default (goal.round_up_collected); fails with ALREADY_FUNDED when the current period is already paid. complete: one-time goals finish (goal.completed); subscriptions pay the current period and start the next (goal.cycle_paid; the goal stays SAVING). payment_failed: a failed chunk (goal.payment_failed), with reversal=true for the clawback path. expire: a deadline goal fell short (goal.deadline_charge_failed). Confirm first.
| Argument | Type | Description |
|---|---|---|
| event* | string | |
| amount | integer | collect / payment_failed only: cents, default 300 |
| goalId* | string | goalId from create_test_goal |
| reason | string | payment_failed with reversal only |
| reversal | boolean | payment_failed only: true = a chunk already counted is reversed (clawback); false = a collection failed |
{
"type": "object",
"required": [
"goalId",
"event"
],
"properties": {
"event": {
"enum": [
"confirm",
"collect",
"complete",
"payment_failed",
"expire"
],
"type": "string"
},
"amount": {
"type": "integer",
"maximum": 9007199254740991,
"description": "collect / payment_failed only: cents, default 300",
"exclusiveMinimum": 0
},
"goalId": {
"type": "string",
"description": "goalId from create_test_goal"
},
"reason": {
"enum": [
"ach_return",
"dispute"
],
"type": "string",
"description": "payment_failed with reversal only"
},
"reversal": {
"type": "boolean",
"description": "payment_failed only: true = a chunk already counted is reversed (clawback); false = a collection failed"
}
},
"additionalProperties": false
}| providerLinkCode* | string | From register_test_provider |
| depositRefundable | boolean |
{
"type": "object",
"required": [
"providerLinkCode",
"targetAmount",
"description"
],
"properties": {
"deadline": {
"type": "string",
"description": "ISO 8601 due date, 24h to 2 years out (one-time goals only)"
},
"imageUrl": {
"type": "string"
},
"metadata": {
"type": "object",
"description": "Echoed verbatim in every webhook, e.g. { orderId }",
"propertyNames": {
"type": "string"
},
"additionalProperties": {}
},
"cancelUrl": {
"type": "string"
},
"frequency": {
"enum": [
"WEEKLY",
"BIWEEKLY",
"MONTHLY",
"QUARTERLY",
"YEARLY"
],
"type": "string",
"description": "Makes it a recurring subscription; omit for a one-time purchase"
},
"callbackUrl": {
"type": "string",
"description": "Where the buyer returns after confirming; localhost is allowed in test mode"
},
"description": {
"type": "string",
"description": "What the buyer is saving for, max 500 characters"
},
"targetAmount": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": 50,
"description": "Price in cents, e.g. 2999 = $29.99"
},
"depositAmount": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991,
"description": "Upfront card charge in cents. One-time: ≥ 50 and < targetAmount. Subscription: = targetAmount or omit"
},
"providerLinkCode": {
"type": "string",
"description": "From register_test_provider"
},
"depositRefundable": {
"type": "boolean"
}
},
"additionalProperties": false
}