ggcheckout-mcp 0.3.0 → 0.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +197 -0
- package/README.md +186 -47
- package/dist/adapters/inbound/tools/billing.tools.d.ts +1 -1
- package/dist/adapters/inbound/tools/billing.tools.d.ts.map +1 -1
- package/dist/adapters/inbound/tools/billing.tools.js +32 -6
- package/dist/adapters/inbound/tools/billing.tools.js.map +1 -1
- package/dist/adapters/inbound/tools/checkout.tools.d.ts.map +1 -1
- package/dist/adapters/inbound/tools/checkout.tools.js +7 -2
- package/dist/adapters/inbound/tools/checkout.tools.js.map +1 -1
- package/dist/adapters/inbound/tools/funnel.tools.d.ts.map +1 -1
- package/dist/adapters/inbound/tools/funnel.tools.js +89 -51
- package/dist/adapters/inbound/tools/funnel.tools.js.map +1 -1
- package/dist/adapters/inbound/tools/gateway.tools.d.ts.map +1 -1
- package/dist/adapters/inbound/tools/gateway.tools.js +11 -3
- package/dist/adapters/inbound/tools/gateway.tools.js.map +1 -1
- package/dist/adapters/inbound/tools/members-area.tools.d.ts.map +1 -1
- package/dist/adapters/inbound/tools/members-area.tools.js +263 -31
- package/dist/adapters/inbound/tools/members-area.tools.js.map +1 -1
- package/dist/adapters/inbound/tools/payment.tools.d.ts.map +1 -1
- package/dist/adapters/inbound/tools/payment.tools.js +9 -3
- package/dist/adapters/inbound/tools/payment.tools.js.map +1 -1
- package/dist/adapters/inbound/tools/product.tools.d.ts.map +1 -1
- package/dist/adapters/inbound/tools/product.tools.js +115 -29
- package/dist/adapters/inbound/tools/product.tools.js.map +1 -1
- package/dist/adapters/inbound/tools/rewards.tools.d.ts.map +1 -1
- package/dist/adapters/inbound/tools/rewards.tools.js +6 -2
- package/dist/adapters/inbound/tools/rewards.tools.js.map +1 -1
- package/dist/adapters/inbound/tools/store.tools.d.ts.map +1 -1
- package/dist/adapters/inbound/tools/store.tools.js +302 -25
- package/dist/adapters/inbound/tools/store.tools.js.map +1 -1
- package/dist/adapters/inbound/tools/telegram.tools.d.ts.map +1 -1
- package/dist/adapters/inbound/tools/telegram.tools.js +8 -1
- package/dist/adapters/inbound/tools/telegram.tools.js.map +1 -1
- package/dist/adapters/inbound/tools/webhook.tools.d.ts.map +1 -1
- package/dist/adapters/inbound/tools/webhook.tools.js +17 -8
- package/dist/adapters/inbound/tools/webhook.tools.js.map +1 -1
- package/dist/adapters/inbound/tools/whatsapp.tools.d.ts.map +1 -1
- package/dist/adapters/inbound/tools/whatsapp.tools.js +3 -1
- package/dist/adapters/inbound/tools/whatsapp.tools.js.map +1 -1
- package/dist/adapters/outbound/billing.api.d.ts +25 -8
- package/dist/adapters/outbound/billing.api.d.ts.map +1 -1
- package/dist/adapters/outbound/billing.api.js +86 -3
- package/dist/adapters/outbound/billing.api.js.map +1 -1
- package/dist/adapters/outbound/funnel.api.d.ts +3 -1
- package/dist/adapters/outbound/funnel.api.d.ts.map +1 -1
- package/dist/adapters/outbound/funnel.api.js +25 -9
- package/dist/adapters/outbound/funnel.api.js.map +1 -1
- package/dist/adapters/outbound/http-client.d.ts +12 -0
- package/dist/adapters/outbound/http-client.d.ts.map +1 -1
- package/dist/adapters/outbound/http-client.js +63 -12
- package/dist/adapters/outbound/http-client.js.map +1 -1
- package/dist/adapters/outbound/members-area.api.d.ts +55 -2
- package/dist/adapters/outbound/members-area.api.d.ts.map +1 -1
- package/dist/adapters/outbound/members-area.api.js +89 -1
- package/dist/adapters/outbound/members-area.api.js.map +1 -1
- package/dist/adapters/outbound/payment.api.d.ts +6 -0
- package/dist/adapters/outbound/payment.api.d.ts.map +1 -1
- package/dist/adapters/outbound/payment.api.js +17 -3
- package/dist/adapters/outbound/payment.api.js.map +1 -1
- package/dist/adapters/outbound/product.api.d.ts +39 -7
- package/dist/adapters/outbound/product.api.d.ts.map +1 -1
- package/dist/adapters/outbound/product.api.js +53 -11
- package/dist/adapters/outbound/product.api.js.map +1 -1
- package/dist/adapters/outbound/product.api.test.js +14 -1
- package/dist/adapters/outbound/product.api.test.js.map +1 -1
- package/dist/adapters/outbound/rewards.api.d.ts +5 -1
- package/dist/adapters/outbound/rewards.api.d.ts.map +1 -1
- package/dist/adapters/outbound/rewards.api.js +5 -1
- package/dist/adapters/outbound/rewards.api.js.map +1 -1
- package/dist/adapters/outbound/signed-upload.d.ts +10 -0
- package/dist/adapters/outbound/signed-upload.d.ts.map +1 -0
- package/dist/adapters/outbound/signed-upload.js +29 -0
- package/dist/adapters/outbound/signed-upload.js.map +1 -0
- package/dist/adapters/outbound/store.api.d.ts +37 -1
- package/dist/adapters/outbound/store.api.d.ts.map +1 -1
- package/dist/adapters/outbound/store.api.js +88 -7
- package/dist/adapters/outbound/store.api.js.map +1 -1
- package/dist/adapters/outbound/store.api.test.js +62 -0
- package/dist/adapters/outbound/store.api.test.js.map +1 -1
- package/dist/adapters/outbound/telegram.api.d.ts +5 -0
- package/dist/adapters/outbound/telegram.api.d.ts.map +1 -1
- package/dist/adapters/outbound/telegram.api.js +7 -2
- package/dist/adapters/outbound/telegram.api.js.map +1 -1
- package/dist/adapters/outbound/whatsapp.api.d.ts +5 -0
- package/dist/adapters/outbound/whatsapp.api.d.ts.map +1 -1
- package/dist/adapters/outbound/whatsapp.api.js +20 -3
- package/dist/adapters/outbound/whatsapp.api.js.map +1 -1
- package/dist/core/ports/billing.port.d.ts +8 -8
- package/dist/core/ports/billing.port.d.ts.map +1 -1
- package/dist/core/ports/funnel.port.d.ts +4 -1
- package/dist/core/ports/funnel.port.d.ts.map +1 -1
- package/dist/core/ports/members-area.port.d.ts +42 -1
- package/dist/core/ports/members-area.port.d.ts.map +1 -1
- package/dist/core/ports/product.port.d.ts +22 -7
- package/dist/core/ports/product.port.d.ts.map +1 -1
- package/dist/core/ports/rewards.port.d.ts +0 -1
- package/dist/core/ports/rewards.port.d.ts.map +1 -1
- package/dist/core/ports/store.port.d.ts +36 -1
- package/dist/core/ports/store.port.d.ts.map +1 -1
- package/dist/core/services/billing.service.d.ts +14 -7
- package/dist/core/services/billing.service.d.ts.map +1 -1
- package/dist/core/services/billing.service.js +42 -2
- package/dist/core/services/billing.service.js.map +1 -1
- package/dist/core/services/checkout.service.d.ts.map +1 -1
- package/dist/core/services/checkout.service.js +30 -14
- package/dist/core/services/checkout.service.js.map +1 -1
- package/dist/core/services/checkout.service.test.js +26 -10
- package/dist/core/services/checkout.service.test.js.map +1 -1
- package/dist/core/services/funnel.service.d.ts +8 -1
- package/dist/core/services/funnel.service.d.ts.map +1 -1
- package/dist/core/services/funnel.service.js +21 -1
- package/dist/core/services/funnel.service.js.map +1 -1
- package/dist/core/services/funnel.service.test.d.ts +2 -0
- package/dist/core/services/funnel.service.test.d.ts.map +1 -0
- package/dist/core/services/funnel.service.test.js +82 -0
- package/dist/core/services/funnel.service.test.js.map +1 -0
- package/dist/core/services/members-area.service.d.ts +48 -2
- package/dist/core/services/members-area.service.d.ts.map +1 -1
- package/dist/core/services/members-area.service.js +35 -1
- package/dist/core/services/members-area.service.js.map +1 -1
- package/dist/core/services/product.service.d.ts +95 -6
- package/dist/core/services/product.service.d.ts.map +1 -1
- package/dist/core/services/product.service.js +280 -13
- package/dist/core/services/product.service.js.map +1 -1
- package/dist/core/services/product.service.test.js +80 -0
- package/dist/core/services/product.service.test.js.map +1 -1
- package/dist/core/services/rewards.service.d.ts +0 -1
- package/dist/core/services/rewards.service.d.ts.map +1 -1
- package/dist/core/services/rewards.service.js +0 -1
- package/dist/core/services/rewards.service.js.map +1 -1
- package/dist/core/services/store.service.d.ts +46 -1
- package/dist/core/services/store.service.d.ts.map +1 -1
- package/dist/core/services/store.service.js +115 -0
- package/dist/core/services/store.service.js.map +1 -1
- package/dist/core/services/store.service.test.d.ts +2 -0
- package/dist/core/services/store.service.test.d.ts.map +1 -0
- package/dist/core/services/store.service.test.js +62 -0
- package/dist/core/services/store.service.test.js.map +1 -0
- package/dist/core/types/billing.d.ts +60 -0
- package/dist/core/types/billing.d.ts.map +1 -1
- package/dist/core/types/checkout.d.ts +8 -8
- package/dist/core/types/checkout.d.ts.map +1 -1
- package/dist/core/types/funnel.d.ts +57 -10
- package/dist/core/types/funnel.d.ts.map +1 -1
- package/dist/core/types/members-area.d.ts +69 -0
- package/dist/core/types/members-area.d.ts.map +1 -1
- package/dist/core/types/payment.d.ts +10 -1
- package/dist/core/types/payment.d.ts.map +1 -1
- package/dist/core/types/product.d.ts +92 -11
- package/dist/core/types/product.d.ts.map +1 -1
- package/dist/core/types/rewards.d.ts +4 -0
- package/dist/core/types/rewards.d.ts.map +1 -1
- package/dist/core/types/store.d.ts +82 -0
- package/dist/core/types/store.d.ts.map +1 -1
- package/dist/core/types/telegram.d.ts +3 -1
- package/dist/core/types/telegram.d.ts.map +1 -1
- package/dist/core/types/telegram.js +1 -1
- package/dist/core/types/telegram.js.map +1 -1
- package/dist/index.js +5 -3
- package/dist/index.js.map +1 -1
- package/dist/shared/errors.d.ts +10 -0
- package/dist/shared/errors.d.ts.map +1 -1
- package/dist/shared/errors.js +13 -0
- package/dist/shared/errors.js.map +1 -1
- package/dist/shared/external-offer-snippet.d.ts +25 -0
- package/dist/shared/external-offer-snippet.d.ts.map +1 -0
- package/dist/shared/external-offer-snippet.js +114 -0
- package/dist/shared/external-offer-snippet.js.map +1 -0
- package/dist/shared/local-file.d.ts +32 -0
- package/dist/shared/local-file.d.ts.map +1 -0
- package/dist/shared/local-file.js +92 -0
- package/dist/shared/local-file.js.map +1 -0
- package/dist/shared/merge.d.ts +6 -0
- package/dist/shared/merge.d.ts.map +1 -0
- package/dist/shared/merge.js +22 -0
- package/dist/shared/merge.js.map +1 -0
- package/dist/shared/sanitizer.d.ts +7 -0
- package/dist/shared/sanitizer.d.ts.map +1 -1
- package/dist/shared/sanitizer.js +28 -0
- package/dist/shared/sanitizer.js.map +1 -1
- package/dist/shared/sanitizer.test.js +20 -1
- package/dist/shared/sanitizer.test.js.map +1 -1
- package/dist/shared/webhook-fixtures.d.ts +33 -4
- package/dist/shared/webhook-fixtures.d.ts.map +1 -1
- package/dist/shared/webhook-fixtures.js +63 -21
- package/dist/shared/webhook-fixtures.js.map +1 -1
- package/package.json +4 -4
package/CHANGELOG.md
CHANGED
|
@@ -5,6 +5,203 @@ which is unpinned — a new version reaches every existing installation on its n
|
|
|
5
5
|
Read this file before upgrading, and pin a version if a breaking change is not convenient
|
|
6
6
|
right now.
|
|
7
7
|
|
|
8
|
+
## 0.4.0
|
|
9
|
+
|
|
10
|
+
Checked end to end against a QA account on the Postgres (v2) data path, and product edits
|
|
11
|
+
also against production.
|
|
12
|
+
|
|
13
|
+
### Release requirement — do not publish before the API has these changes
|
|
14
|
+
|
|
15
|
+
Two tools depend on an open pull request of the API. Published before it, the install (unpinned)
|
|
16
|
+
reaches everyone, and they write a model the API does not read yet:
|
|
17
|
+
|
|
18
|
+
- `set_offer_product_page` and `get_offer_snippets` need the per-product seller page model of
|
|
19
|
+
ggCheckout/saas-checkout#1681 (`productOverrides[product].displayMode` + `externalFlow.pageUrl`).
|
|
20
|
+
Against an API without it, the write is saved but the buyer never reaches the seller's page.
|
|
21
|
+
|
|
22
|
+
`update_module`, `update_section`, `update_lesson`, `delete_module`, `delete_section` and
|
|
23
|
+
`delete_lesson` need the `PATCH`/`DELETE` routes under `/api/members-area/{areaId}/modules/…` of
|
|
24
|
+
ggCheckout/saas-checkout#1685, merged on 2026-10-13. Against an API without them they answer
|
|
25
|
+
"this API has no such route yet", not as a missing item.
|
|
26
|
+
|
|
27
|
+
### Breaking
|
|
28
|
+
|
|
29
|
+
Every item here changes what an existing call sends or gets back. A 0.x minor bump is a
|
|
30
|
+
breaking release, and with the unpinned install it reaches everyone on the next start.
|
|
31
|
+
|
|
32
|
+
- **`list_rewards` is gone; use `calculate_rewards`.** The route it called was removed along
|
|
33
|
+
with the stored counter it served. `calculate_rewards` answers the same fields, derived from
|
|
34
|
+
paid sales, and carries the milestone list — there is no reward catalogue endpoint.
|
|
35
|
+
`currentRevenue` and `milestones` are in reais, not cents.
|
|
36
|
+
- **`upload_deliverable` takes `fileSize` and no longer takes `fileUrl`**, and attaching is now
|
|
37
|
+
two calls: `upload_deliverable` mints an upload URL, you PUT the bytes to it, and
|
|
38
|
+
**`attach_deliverable`** confirms the upload and links it. See "Routes that had moved".
|
|
39
|
+
- **`reorder_upsells` takes `upsellIds`** (all the ids, in order) instead of `upsells` (whole
|
|
40
|
+
objects). Both reorder tools now return the resulting positions.
|
|
41
|
+
- **`add_credit` answers a new shape** — `{ creditId, amountCents, pixCode, pixQrBase64,
|
|
42
|
+
expiresAt, via }` — and **`amountCents` must be whole cents from 325 to 25000** (R$ 3,25 to
|
|
43
|
+
R$ 250,00). Anything else used to reach the API; it is now refused before the call.
|
|
44
|
+
- **`create_webhook` / `update_webhook` accept only the 15 real event names**, and
|
|
45
|
+
**`test_webhook` simulates only `pix.paid`, `card.paid`, `pix.expired`, `card.expired`**. The
|
|
46
|
+
old suggestions (`payment.created`, `payment.paid`, `payment.refunded`…) are refused.
|
|
47
|
+
- **`insert_token` takes `type` and `target` from `pushinpay`, `utmify`, `emailprovider`,
|
|
48
|
+
`mercadopago`.** Any other value was always refused by the API.
|
|
49
|
+
- **Lower caps:** `get_payments_paginated` `pageSize` 1000 → 100 (the API already reduced it
|
|
50
|
+
silently); `list_credits` `limit` 1000 → 200, the lowest cap of the two statements it reads.
|
|
51
|
+
- **`update_funnel` no longer takes `settings.pixels` or `settings.webhookUrl`.** Nothing
|
|
52
|
+
read them: the quiz page resolves `settings.pixelTokenIds` (ids from `list_tokens`) and
|
|
53
|
+
webhooks are `settings.webhookIds` (ids from `list_webhooks`). A call that still sends
|
|
54
|
+
them is refused by validation instead of being silently ignored.
|
|
55
|
+
- **`list_products` hides deleted products.** `delete_product` is a soft delete and the API
|
|
56
|
+
keeps listing the row with `deleted: true`.
|
|
57
|
+
- `list_store_products` no longer accepts `sortBy: "createdAt"` (the API ignored it), and
|
|
58
|
+
`validate_coupon` takes `orderValue` as integer cents.
|
|
59
|
+
- **`update_checkout` merges the `checkout` object instead of replacing it.** Send only the keys
|
|
60
|
+
to change. An array still replaces the stored one, and a key can no longer be removed by leaving
|
|
61
|
+
it out; set it to `null` instead. The stored `checkout.paymentMethods` is not part of the merge:
|
|
62
|
+
the read does not return every stored value of the methods, so re-sending it could rewrite them
|
|
63
|
+
with less than what is stored. Payment methods change only when the call sends them.
|
|
64
|
+
- **`upload_deliverable` requires `fileType`.**
|
|
65
|
+
- **Empty lists are refused** where the API would do nothing with them: `events` in
|
|
66
|
+
`create_webhook` / `update_webhook` and `order` in `reorder_downsells` need at least one item.
|
|
67
|
+
- **Lesson `content` follows the API's shape** (`create_lesson`, `update_lesson`). Quiz questions
|
|
68
|
+
are `{ id, question, type, options: string[], correctAnswer, explanation, points }`; the old
|
|
69
|
+
`{ text, options: [{ id, text, isCorrect }] }` was stored as sent and no student could be graded
|
|
70
|
+
on it. `textMarkdown`, `videoId`, `videoDuration`, `videoThumbnail`, `videoQualities`,
|
|
71
|
+
`estimatedReadTime`, `fileSize` and `fileType` are gone: the API dropped them with a 200. URLs
|
|
72
|
+
must be absolute, at most 50 questions, `minScore` a whole number from 0 to 100.
|
|
73
|
+
- **Cascading deletes need `confirm: true`** (`delete_module`, `delete_section`, `delete_lesson`).
|
|
74
|
+
|
|
75
|
+
### Routes that had moved
|
|
76
|
+
|
|
77
|
+
A sweep of every endpoint this client calls against the current API found four with no route
|
|
78
|
+
behind them any more, plus a set of tools whose behaviour had drifted. Each item below was
|
|
79
|
+
confirmed in the API source, and the fixes were exercised against a live account.
|
|
80
|
+
|
|
81
|
+
- **`list_rewards` → `calculate_rewards`** (see Breaking).
|
|
82
|
+
- **`add_credit` works on both billing generations.** The legacy route refuses a migrated
|
|
83
|
+
seller with 409 pointing at the top-up route; the call now follows that refusal, and only
|
|
84
|
+
that one. Takes an optional `idempotencyKey`, which only the new billing reads. A timeout or
|
|
85
|
+
a 502 may still have opened the PIX, so that error now says to look in `list_credits` before
|
|
86
|
+
retrying instead of inviting a second charge.
|
|
87
|
+
- **`list_credits` returns the statement for either generation.** It reads the legacy credits
|
|
88
|
+
and the credit ledger, and answers `{ credits, total, ledger: { entries, nextBefore } }`. One
|
|
89
|
+
side is empty depending on the account, which is the true answer and not an error — before
|
|
90
|
+
this, a migrated seller got an empty list with no indication the data lived elsewhere. If one
|
|
91
|
+
side fails, the other still answers and `creditsError` / `ledgerError` says what failed.
|
|
92
|
+
- **`upload_deliverable` / `delete_deliverable` now call routes that exist.** The paths they
|
|
93
|
+
used (`/api/products/{id}/deliverable/…`) are not part of the API. Attaching a file is now
|
|
94
|
+
two steps: `upload_deliverable` mints an upload URL, you PUT the bytes to it (only
|
|
95
|
+
`Content-Type`, no `Authorization`), then **`attach_deliverable`** confirms the upload and
|
|
96
|
+
links it to the product, keeping any link the product already has. `delete_deliverable`
|
|
97
|
+
unlinks the file and, given `filePath`, deletes the bytes too; it refuses when the file is
|
|
98
|
+
the only deliverable, and a failed byte deletion comes back as `fileDeleteError` beside the
|
|
99
|
+
completed unlink.
|
|
100
|
+
- **`telegram_media_upload` calls `/presign`.** The old path was renamed. It returns
|
|
101
|
+
`{ uploadUrl, filePath, proxyUrl }`; `proxyUrl` is the URL to store in the flow node, because
|
|
102
|
+
the route does not return a public URL. The previously advertised `publicUrl` was always
|
|
103
|
+
undefined.
|
|
104
|
+
- **`reorder_upsells` calls `.../upsells/reorder`.** It used to send whole objects to a route
|
|
105
|
+
that replaces the legacy upsell array instead of reordering, and that route does not exist
|
|
106
|
+
for a product on the new storage, where the call failed as an opaque 502.
|
|
107
|
+
- **`update_product` writes the way each storage expects.** It used to re-send the whole
|
|
108
|
+
stored product. That is still what the old storage needs — its write puts a default into
|
|
109
|
+
every key the body omits (`url: ''`, `deliverableFile: null`, `membersAreaEnabled: false`…),
|
|
110
|
+
so a partial body would wipe the product with a 200 — and its read carries the file and the
|
|
111
|
+
stock lines, so it still goes back whole (minus the live `stockQuantity`). On the new storage
|
|
112
|
+
the read carries neither, so the re-send dropped them and the save was refused; there the
|
|
113
|
+
call now sends the edit plus the one field that satisfies the API's deliverable check (the
|
|
114
|
+
check reads the request body, not the stored product). When the only deliverable is a file or
|
|
115
|
+
stock lines — neither readable there — the edit is refused here with an explanation instead
|
|
116
|
+
of a bare 400. `attach_deliverable` and `delete_deliverable` go through the same write.
|
|
117
|
+
- **`create_webhook` / `update_webhook` validate `events`.** The API stores event names without
|
|
118
|
+
checking them and dispatch matches exactly, so a wrong name is accepted and never fires. The
|
|
119
|
+
names this tool used to suggest (`payment.created`, `payment.paid`, `payment.refunded`) are
|
|
120
|
+
not seller webhook events at all. The real vocabulary is now enforced here, and `test_webhook`
|
|
121
|
+
simulates only the payment-shaped events.
|
|
122
|
+
- **`insert_token` accepts only the four types the API takes**, in `type` and in `target`,
|
|
123
|
+
which the route checks against the same list. `stripe` and `efibank` were advertised and
|
|
124
|
+
always refused.
|
|
125
|
+
- **`list_payments` answers an empty list for a seller with no sales.** The route reports that
|
|
126
|
+
state as 404, which surfaced as an error.
|
|
127
|
+
- **`get_payments_paginated`**: the cursor in the answer is `nextCursor`; `totalCapped: true`
|
|
128
|
+
means the count stopped at its cap and `total` is a floor; a text search may come back with
|
|
129
|
+
`coverageCapped`.
|
|
130
|
+
- **423 is not a thing, 503 is not "the backend is down".** 503 means the rate limiter is
|
|
131
|
+
failing closed and nothing was changed, so it is reported as retryable. 502 means the service
|
|
132
|
+
behind the API did not answer, and a write may or may not have landed, so it says to check
|
|
133
|
+
before repeating one. The wait is read from `Retry-After` or the body's `retry_after`. A
|
|
134
|
+
refusal that carries a `code` now shows it instead of just a status number.
|
|
135
|
+
|
|
136
|
+
### Tools that an API key cannot use
|
|
137
|
+
|
|
138
|
+
`create_whatsapp_session` answers 403 for an API key by design: the route classes it as
|
|
139
|
+
sensitive. It now says so and what to do instead, rather than surfacing a bare "Forbidden".
|
|
140
|
+
|
|
141
|
+
### Packaging
|
|
142
|
+
|
|
143
|
+
- Compiled tests no longer ship in the published package (560 files down to 428).
|
|
144
|
+
- `dotenv` is loaded quietly: version 17 announces itself on stdout, which is the MCP protocol
|
|
145
|
+
channel over stdio, and a strict client reads that line as a malformed frame.
|
|
146
|
+
|
|
147
|
+
### Added
|
|
148
|
+
|
|
149
|
+
- **Offers on the seller's page:** `set_offer_product_page` puts one product of an upsell or
|
|
150
|
+
downsell on the seller's own page (or back on the GG page), mixed with GG pages in the same
|
|
151
|
+
funnel; `get_offer_snippets` returns, read only, the HTML to paste for each product on the
|
|
152
|
+
seller's page. `update_checkout` now merges the `checkout` object, so setting one key keeps the
|
|
153
|
+
rest of the page setup.
|
|
154
|
+
- **Members-area files:** `upload_members_area_file` uploads an image, a lesson video or a file
|
|
155
|
+
(PDF, document, audio) from the machine running the server and returns the URL to use. It reads
|
|
156
|
+
only from the folder set in `GGCHECKOUT_UPLOAD_ROOT` and refuses every upload while that is unset.
|
|
157
|
+
`create_pdf_lessons` creates a batch of PDF lessons; `list_lesson_attachments`,
|
|
158
|
+
`add_lesson_attachment` and `delete_lesson_attachment` manage a lesson's complementary files.
|
|
159
|
+
- **Editing and deleting the course structure:** `update_module`, `update_section`, `update_lesson`,
|
|
160
|
+
`delete_module`, `delete_section`, `delete_lesson` — until now only the dashboard could, through
|
|
161
|
+
server actions an API key cannot call. **They need the API release with the `PATCH`/`DELETE`
|
|
162
|
+
routes under `/api/members-area/{areaId}/modules/…`**; an older deployment answers 404/405.
|
|
163
|
+
- `create_module` and `create_section` take `dripSettings`; `create_section` and `create_lesson`
|
|
164
|
+
take `showTitleOverlay`, `showImageOnly` and `order`, and `create_lesson` a `thumbnailUrl`.
|
|
165
|
+
- `list_stores`, the only way to get the `storeId` every store tool takes. It also returns
|
|
166
|
+
DELETED stores — the listing it comes from never filtered them and the API does not mark
|
|
167
|
+
them — and such a storeId answers 404 in every other store tool, so the description now
|
|
168
|
+
warns to confirm an unfamiliar one with `get_store`.
|
|
169
|
+
- Store management: `create_store`, `get_store`, `update_store`, `delete_store`, store
|
|
170
|
+
categories (`list_store_categories`, `create_store_category`, `update_store_category`,
|
|
171
|
+
`delete_store_category`) and review moderation (`list_store_reviews`,
|
|
172
|
+
`create_store_review`, `update_store_review`, `delete_store_review`). **These need the
|
|
173
|
+
`/api/stores/{storeId}` routes**, available from the GG Checkout release that ships them;
|
|
174
|
+
against an older deployment they answer 404/405.
|
|
175
|
+
- Store builder: `get_store_layout`, `update_store_layout`, `publish_store_layout`,
|
|
176
|
+
`list_store_layout_history`, `restore_store_layout_version`, `get_store_theme`. A store with
|
|
177
|
+
no layout yet — which is every newly created one — has nothing to copy the block shapes
|
|
178
|
+
from, and the route validates them strictly, so the first-save error now spells out an
|
|
179
|
+
accepted `theme` and block shape.
|
|
180
|
+
- `list_funnel_checkouts`: the checkouts and gateways a funnel `pix` component can use.
|
|
181
|
+
- `update_product` takes `stockEnabled`, `unlimitedStock` and `stockQuantity`;
|
|
182
|
+
`create_upsell` / `create_downsell` take an optional `order`.
|
|
183
|
+
|
|
184
|
+
### Fixed
|
|
185
|
+
|
|
186
|
+
- **`update_checkout` sends only the checkout's identity and what changed.** The checkout API
|
|
187
|
+
keeps every key absent from the body as stored, so the tool no longer echoes the whole
|
|
188
|
+
document it read back (`paymentMethods`, the `checkout` object, `orderBumps`, `url`,
|
|
189
|
+
`fields`, `sellerName`, `currency`, `published`, `createBy`). Echoing it could overwrite
|
|
190
|
+
stored values the read does not carry (re-sent order bumps lost their per-bump original
|
|
191
|
+
price and button text); `paymentMethods`, `checkout` and `orderBumps` only travel when the
|
|
192
|
+
caller changes them.
|
|
193
|
+
- `update_product` with only some fields was refused (400 "Você precisa fornecer um link
|
|
194
|
+
(url)…"): the API validates the body as a whole product. The stored product is now
|
|
195
|
+
re-sent with the edit on top.
|
|
196
|
+
- `create_upsell` / `create_downsell` were refused on v2 accounts (422 "missing field
|
|
197
|
+
sortOrder") and, where accepted, stored an offer with no product to sell. They now write
|
|
198
|
+
`order` and `upsellProductIds` / `downsellProductIds` the way the dashboard does.
|
|
199
|
+
- `update_funnel` with part of `design` or `settings` erased the rest of it. Both are now
|
|
200
|
+
merged into the stored funnel. Steps keep every field the editor stores (`loadingScreen`,
|
|
201
|
+
`allowBack`, `stickyButton`…), and the `level` and `social_proof` components are accepted.
|
|
202
|
+
- `list_upsells` returned the API envelope instead of the list.
|
|
203
|
+
- Store and funnel ids and coupon codes are URL-encoded; store read limits match the API.
|
|
204
|
+
|
|
8
205
|
## 0.3.0
|
|
9
206
|
|
|
10
207
|
### Breaking
|
package/README.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# GG Checkout MCP Server
|
|
2
2
|
|
|
3
|
-
> Complete Model Context Protocol server for managing the GG Checkout platform via AI agents —
|
|
3
|
+
> Complete Model Context Protocol server for managing the GG Checkout platform via AI agents — 189 tools across 19 domains.
|
|
4
4
|
|
|
5
5
|
## Overview
|
|
6
6
|
|
|
@@ -77,11 +77,22 @@ export GGCHECKOUT_API_KEY="ggck_live_your_key_here"
|
|
|
77
77
|
export GGCHECKOUT_API_URL="https://your-staging.example.com"
|
|
78
78
|
```
|
|
79
79
|
|
|
80
|
+
### Upload folder
|
|
81
|
+
|
|
82
|
+
`upload_members_area_file` reads files from the machine running this server, and only from the
|
|
83
|
+
folder named here. Without it the tool refuses every upload: what an agent reads (a page, a PDF) can
|
|
84
|
+
carry instructions, so the server never reads an arbitrary path. A file that is itself a symbolic
|
|
85
|
+
link is refused, and a path that leads outside the folder through a link is too.
|
|
86
|
+
|
|
87
|
+
```bash
|
|
88
|
+
export GGCHECKOUT_UPLOAD_ROOT="/home/me/course-import"
|
|
89
|
+
```
|
|
90
|
+
|
|
80
91
|
---
|
|
81
92
|
|
|
82
|
-
## Available Tools (
|
|
93
|
+
## Available Tools (189)
|
|
83
94
|
|
|
84
|
-
### Products (
|
|
95
|
+
### Products (18 tools)
|
|
85
96
|
|
|
86
97
|
#### `list_products`
|
|
87
98
|
|
|
@@ -114,23 +125,43 @@ Create a new product/delivery.
|
|
|
114
125
|
|
|
115
126
|
#### `update_product`
|
|
116
127
|
|
|
117
|
-
Update an existing product. Only provide fields you want to change.
|
|
128
|
+
Update an existing product. Only provide fields you want to change; everything else is kept.
|
|
118
129
|
|
|
119
130
|
**Parameters:** `productId` + any fields from create_product (all optional)
|
|
120
131
|
|
|
132
|
+
On accounts whose product read does not carry the file or the stock lines, an edit of a product
|
|
133
|
+
that delivers only one of those is refused with an explanation: the API checks the request body
|
|
134
|
+
for a deliverable, and those two cannot be read back to be sent along. Pass `url` with the
|
|
135
|
+
change, or make it in the dashboard.
|
|
136
|
+
|
|
121
137
|
**Example prompt:** "Update product abc123 price to R$79.90"
|
|
122
138
|
|
|
123
139
|
#### `delete_product`
|
|
124
140
|
|
|
125
141
|
**Example prompt:** "Delete product abc123"
|
|
126
142
|
|
|
127
|
-
#### `upload_deliverable`
|
|
143
|
+
#### `upload_deliverable` / `attach_deliverable` / `delete_deliverable`
|
|
144
|
+
|
|
145
|
+
Attaching a file takes two tool calls and one upload you perform yourself — the bytes never pass
|
|
146
|
+
through this server:
|
|
128
147
|
|
|
129
|
-
|
|
148
|
+
1. `upload_deliverable` (`productId`, `fileName`, `fileType`, `fileSize`) returns
|
|
149
|
+
`{ uploadUrl, filePath }`.
|
|
150
|
+
2. `PUT` the raw bytes to `uploadUrl` with **only** `Content-Type: <fileType>` set. Do not send
|
|
151
|
+
an `Authorization` header — the signature is already in the URL and an extra header breaks it.
|
|
152
|
+
The URL is valid for one hour; the file may be up to 250MB.
|
|
153
|
+
3. `attach_deliverable` (`productId`, `filePath`, `fileName`, `fileType`, `fileSize`) confirms the
|
|
154
|
+
upload landed and links it to the product.
|
|
130
155
|
|
|
131
|
-
|
|
156
|
+
`attach_deliverable` keeps any link (`url`) the product already has; when both exist, the file
|
|
157
|
+
is what the buyer receives.
|
|
132
158
|
|
|
133
|
-
|
|
159
|
+
`delete_deliverable` unlinks the file; pass `filePath` to delete the stored bytes as well. It is
|
|
160
|
+
refused when the file is the product's only deliverable, since the API will not save a product
|
|
161
|
+
with nothing to deliver: give it a `url` first. If the unlink works and the byte deletion does
|
|
162
|
+
not, the answer carries `fileDeleteError` and the product stays unlinked.
|
|
163
|
+
|
|
164
|
+
**Example prompt:** "Attach ebook.pdf (2MB, application/pdf) to product abc123"
|
|
134
165
|
|
|
135
166
|
#### `list_upsells` / `create_upsell` / `delete_upsell` / `reorder_upsells`
|
|
136
167
|
|
|
@@ -147,6 +178,27 @@ Manage downsells for a product.
|
|
|
147
178
|
|
|
148
179
|
**Example prompt:** "Add a downsell to product abc123 with a 50% discount headline"
|
|
149
180
|
|
|
181
|
+
#### `get_offer_snippets` / `set_offer_product_page` (offers on the seller's page)
|
|
182
|
+
|
|
183
|
+
The post-purchase funnel is one ordered sequence of products, and each product opens either on the
|
|
184
|
+
GG offer page or on the seller's own page ("Minha página"). Both can be mixed in the same funnel: the
|
|
185
|
+
funnel order decides where the buyer goes after accepting or declining, and each product opens on its
|
|
186
|
+
own kind of page.
|
|
187
|
+
|
|
188
|
+
- `set_offer_product_page` puts ONE product of an upsell or downsell on the seller's page (the page
|
|
189
|
+
where its buttons are pasted, the two texts and the button color), or back on the GG page with
|
|
190
|
+
`page: null` (the stored page is kept, so moving it back loses nothing).
|
|
191
|
+
- `get_offer_snippets` is read only: every product of the offer in funnel order, and for each one on
|
|
192
|
+
the seller's page the HTML to paste there (the same as "Copiar HTML" in the dashboard) and the page
|
|
193
|
+
it goes on. An agent with access to the seller's landing page can paste each snippet where the
|
|
194
|
+
buttons should appear, keeping the `<script>` tag.
|
|
195
|
+
|
|
196
|
+
Each snippet works only for its own product, when the funnel order reaches it. Pages must be https;
|
|
197
|
+
plain http only works for localhost against a development server.
|
|
198
|
+
|
|
199
|
+
**Example prompt:** "Put the second product of upsell u1 of product abc123 on https://seller.com/oferta
|
|
200
|
+
with a green button saying 'Quero!', then give me the HTML to paste on that page"
|
|
201
|
+
|
|
150
202
|
#### `manage_tags`
|
|
151
203
|
|
|
152
204
|
Set tags on a product. Tags have a name and a hex color.
|
|
@@ -191,10 +243,9 @@ instead of silently vanishing from the page.
|
|
|
191
243
|
|
|
192
244
|
#### `update_checkout`
|
|
193
245
|
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
write are the one thing this cannot preserve.
|
|
246
|
+
Only provide the fields you want to change. The API keeps every field missing from
|
|
247
|
+
the body as stored, so the tool sends the checkout's identity (title, owner, product,
|
|
248
|
+
price) plus your changes and nothing else from the stored document.
|
|
198
249
|
|
|
199
250
|
**Example prompt:** "Update checkout abc123 price to R$79.90 and unpublish it"
|
|
200
251
|
|
|
@@ -244,11 +295,30 @@ Manage physical order fulfillment.
|
|
|
244
295
|
|
|
245
296
|
**Example prompts:**
|
|
246
297
|
- "Show me all my webhooks"
|
|
247
|
-
- "Create a webhook for
|
|
248
|
-
- "Update webhook abc123 to also listen for
|
|
298
|
+
- "Create a webhook for pix.paid events at https://myapp.com/webhook"
|
|
299
|
+
- "Update webhook abc123 to also listen for card.paid"
|
|
249
300
|
- "Delete webhook abc123"
|
|
250
|
-
- "Send a test
|
|
251
|
-
- "Test my webhook abc123 with
|
|
301
|
+
- "Send a test pix.paid event to webhook abc123"
|
|
302
|
+
- "Test my webhook abc123 with an expired event overriding the payment ID to pay_xyz"
|
|
303
|
+
|
|
304
|
+
#### Event names
|
|
305
|
+
|
|
306
|
+
The API stores the event names you register **without checking them**, and delivery matches
|
|
307
|
+
them exactly — so a name outside this list is accepted, saved, and never fires, with no error
|
|
308
|
+
anywhere. These are the names that exist:
|
|
309
|
+
|
|
310
|
+
| Family | Events |
|
|
311
|
+
|---|---|
|
|
312
|
+
| PIX | `pix.paid`, `pix.generated`, `pix.expired`, `pix.failed` |
|
|
313
|
+
| Card | `card.paid`, `card.generated`, `card.expired`, `card.failed`, `card.pending` |
|
|
314
|
+
| Subscription | `subscription.canceled`, `subscription.past_due`, `subscription.renewed` |
|
|
315
|
+
| Quiz funnel | `quiz.completed`, `quiz.lead_captured` |
|
|
316
|
+
| Cart | `checkout.abandoned` |
|
|
317
|
+
|
|
318
|
+
There is **no refund or chargeback event**: nothing dispatches one. `pix.failed` and
|
|
319
|
+
`card.pending` can be registered but have no emitter today. Names of the form
|
|
320
|
+
`payment.*` are the platform's internal vocabulary between services, not seller webhooks —
|
|
321
|
+
registering one gets you silence.
|
|
252
322
|
|
|
253
323
|
#### Webhook Event Payloads
|
|
254
324
|
|
|
@@ -258,35 +328,35 @@ All events share the same top-level shape. Key fields:
|
|
|
258
328
|
|---|---|---|
|
|
259
329
|
| `event` | string | Event type (see below) |
|
|
260
330
|
| `payment.id` | string | Payment identifier |
|
|
261
|
-
| `payment.status` | string | `pending`, `paid`, `
|
|
262
|
-
| `payment.method` | string | `pix`, `
|
|
331
|
+
| `payment.status` | string | `pending`, `paid`, `expired` |
|
|
332
|
+
| `payment.method` | string | `pix`, `credit_card` |
|
|
263
333
|
| `payment.amount` | number | Amount in **cents** (e.g. `9900` = R$99,00) |
|
|
264
334
|
| `payment.customer.name` | string | Buyer name |
|
|
265
335
|
| `payment.customer.email` | string | Buyer email |
|
|
266
336
|
| `payment.customer.document` | string | CPF |
|
|
267
337
|
| `payment.customer.phone` | string | Phone (E.164, e.g. `5511999999999`) |
|
|
268
338
|
| `payment.createdAt` | string | ISO 8601 |
|
|
269
|
-
| `payment.paidAt` | string \| undefined | Present on `
|
|
270
|
-
| `payment.
|
|
271
|
-
| `payment.expiredAt` | string \| undefined | Present on `payment.expired` |
|
|
339
|
+
| `payment.paidAt` | string \| undefined | Present on `pix.paid` and `card.paid` |
|
|
340
|
+
| `payment.expiredAt` | string \| undefined | Present on `pix.expired` and `card.expired` |
|
|
272
341
|
| `product.id` | string | Product identifier |
|
|
273
342
|
| `product.title` | string | Product name |
|
|
274
343
|
|
|
275
|
-
**
|
|
344
|
+
**What `test_webhook` sends.** These bodies are built by the MCP server and posted straight to
|
|
345
|
+
your endpoint — the platform is not involved — so they are a plausible payment-shaped payload to
|
|
346
|
+
exercise your handler with, not a byte-for-byte copy of a live delivery:
|
|
276
347
|
|
|
277
348
|
```json
|
|
278
|
-
{ "event": "
|
|
279
|
-
{ "event": "
|
|
280
|
-
{ "event": "
|
|
281
|
-
{ "event": "
|
|
282
|
-
{ "event": "payment.chargeback", "payment": { "status": "chargeback", "method": "card.paid", "paidAt": "..." }, ... }
|
|
349
|
+
{ "event": "pix.paid", "payment": { "status": "paid", "method": "pix", "paidAt": "..." }, ... }
|
|
350
|
+
{ "event": "card.paid", "payment": { "status": "paid", "method": "credit_card", "paidAt": "..." }, ... }
|
|
351
|
+
{ "event": "pix.expired", "payment": { "status": "expired", "method": "pix", "expiredAt": "..." }, ... }
|
|
352
|
+
{ "event": "card.expired", "payment": { "status": "expired", "method": "credit_card", "expiredAt": "..." }, ... }
|
|
283
353
|
```
|
|
284
354
|
|
|
285
355
|
**Signature verification** (when a `secret` is set):
|
|
286
356
|
|
|
287
357
|
```
|
|
288
358
|
X-Webhook-Signature: sha256=<HMAC-SHA256(secret, raw_body)>
|
|
289
|
-
X-GGCheckout-Event:
|
|
359
|
+
X-GGCheckout-Event: pix.paid
|
|
290
360
|
```
|
|
291
361
|
|
|
292
362
|
```ts
|
|
@@ -297,32 +367,64 @@ const isValid = sig === incomingHeader.replace('sha256=', '');
|
|
|
297
367
|
|
|
298
368
|
---
|
|
299
369
|
|
|
300
|
-
### Store (
|
|
370
|
+
### Store (28 tools)
|
|
371
|
+
|
|
372
|
+
`list_stores` returns your stores' ids; every other store tool takes one.
|
|
373
|
+
|
|
374
|
+
**Manage the store:** `create_store`, `get_store`, `update_store`, `delete_store`;
|
|
375
|
+
categories with `list_store_categories`, `create_store_category`, `update_store_category`,
|
|
376
|
+
`delete_store_category`; review moderation with `list_store_reviews`, `create_store_review`,
|
|
377
|
+
`update_store_review`, `delete_store_review`. `update_store` merges objects into the stored
|
|
378
|
+
config and replaces lists (`productOrder`, gateways, a category's `productIds`). Creating or
|
|
379
|
+
publishing a store requires a seller with verified email and phone.
|
|
380
|
+
|
|
381
|
+
**Store builder:** `get_store_layout`, `update_store_layout`, `publish_store_layout`,
|
|
382
|
+
`list_store_layout_history`, `restore_store_layout_version`, `get_store_theme`.
|
|
383
|
+
`update_store_layout` saves a draft and merges `theme`, `config` and `pageSettings` into the
|
|
384
|
+
stored ones; `blocks` replaces the whole list. Nothing is public until you publish.
|
|
385
|
+
|
|
386
|
+
**Catalog reads** (`get_store_public`, `list_store_products`, `get_store_product`,
|
|
387
|
+
`list_categories`, `list_feedbacks`) read the public storefront: they only see published
|
|
388
|
+
stores, list approved reviews only, and may be cached for up to 7 days.
|
|
389
|
+
`get_store_order` only returns pending orders with an API key.
|
|
390
|
+
|
|
391
|
+
Store integrations, store upsells/downsells, video, sales notifications and custom fields
|
|
392
|
+
are dashboard-only.
|
|
301
393
|
|
|
302
394
|
**Example prompts:**
|
|
303
|
-
- "
|
|
395
|
+
- "Create a store called 'Loja Teste', turn on PIX with my AmploPay gateway and publish it"
|
|
396
|
+
- "Create a 'Cursos' category with products abc and def"
|
|
397
|
+
- "Approve all pending reviews of my store"
|
|
398
|
+
- "List my stores"
|
|
399
|
+
- "Change the primary color of my store to #8b5cf6 and publish it"
|
|
400
|
+
- "Undo the last store publish"
|
|
304
401
|
- "List all products in my store"
|
|
305
|
-
- "Get product details for product abc123 in store xyz"
|
|
306
|
-
- "Show me the categories in my store"
|
|
307
402
|
- "List customer reviews for my store with rating stats"
|
|
308
403
|
- "Validate coupon code SAVE20 for an order of R$100"
|
|
309
404
|
|
|
310
405
|
---
|
|
311
406
|
|
|
312
|
-
### Funnels / Quiz (
|
|
407
|
+
### Funnels / Quiz (10 tools)
|
|
408
|
+
|
|
409
|
+
A quiz is a funnel: `question` components with options and scores, `result` components,
|
|
410
|
+
`scoring.ranges` and conditional `flow.edges`. `update_funnel` merges `design` and `settings`
|
|
411
|
+
into the stored ones; `steps`, `flow` and `scoring` replace the stored value, so read the
|
|
412
|
+
funnel first and send the full array back. Pixels and webhooks are linked by id
|
|
413
|
+
(`settings.pixelTokenIds` from `list_tokens`, `settings.webhookIds` from `list_webhooks`).
|
|
414
|
+
`list_funnel_checkouts` gives the checkouts and gateways a `pix` component can use.
|
|
313
415
|
|
|
314
416
|
**Example prompts:**
|
|
315
417
|
- "List all my funnels"
|
|
316
|
-
- "
|
|
317
|
-
- "
|
|
418
|
+
- "Create a quiz with 3 questions that scores leads into beginner and advanced"
|
|
419
|
+
- "Change the primary color of funnel abc123 to red"
|
|
420
|
+
- "Send the leads of funnel abc123 to my Zapier webhook"
|
|
318
421
|
- "Duplicate funnel abc123"
|
|
319
422
|
- "Show me the leads from funnel abc123 that completed all steps"
|
|
320
|
-
- "What's the conversion rate for funnel abc123?"
|
|
321
423
|
- "Show me the drop-off analytics for each step in funnel abc123"
|
|
322
424
|
|
|
323
425
|
---
|
|
324
426
|
|
|
325
|
-
### Members Area (
|
|
427
|
+
### Members Area (32 tools)
|
|
326
428
|
|
|
327
429
|
**Example prompts:**
|
|
328
430
|
- "List all my members areas"
|
|
@@ -335,6 +437,23 @@ const isValid = sig === incomingHeader.replace('sha256=', '');
|
|
|
335
437
|
- "Import these 50 students to members area xyz"
|
|
336
438
|
- "Block student abc123"
|
|
337
439
|
|
|
440
|
+
**Files the seller sends.** `upload_members_area_file` uploads a file that is already on the machine
|
|
441
|
+
running this server (an absolute path inside `GGCHECKOUT_UPLOAD_ROOT`, see "Upload folder") and
|
|
442
|
+
returns the URL to pass on:
|
|
443
|
+
|
|
444
|
+
| `kind` | Accepts | Use the `url` in |
|
|
445
|
+
|---|---|---|
|
|
446
|
+
| `image` | jpg, png, webp, gif, avif | `update_members_area` branding (logo, banner), module `imageUrl`, section and lesson `thumbnailUrl` |
|
|
447
|
+
| `video` | mp4, webm, mov, avi, mpeg — up to 500 MB | `create_lesson` type `video`: `videoUrl` and `content: { videoUrl, videoSourceType: "upload" }` |
|
|
448
|
+
| `file` | pdf, doc(x), xls(x), zip, rar, 7z, mp3, ogg, wav, images, videos — up to 100 MB; needs `areaId` | `create_pdf_lessons`, `create_lesson` `content.fileUrl`, or `add_lesson_attachment` |
|
|
449
|
+
|
|
450
|
+
Nothing is downloaded from another platform: videos and PDFs come from the seller. Modules and
|
|
451
|
+
sections take `dripSettings` (release N days after purchase, enrollment or first access); lessons
|
|
452
|
+
take a cover and a position. `update_module` / `update_section` / `update_lesson` change only the
|
|
453
|
+
fields sent, and `delete_module` / `delete_section` / `delete_lesson` remove the item with everything
|
|
454
|
+
under it — irreversible, so they take `confirm: true`. These six need the API release with the
|
|
455
|
+
`PATCH`/`DELETE` structure routes; an older deployment answers that it has no such route yet.
|
|
456
|
+
|
|
338
457
|
---
|
|
339
458
|
|
|
340
459
|
### Discounts / Coupons (6 tools)
|
|
@@ -348,7 +467,7 @@ const isValid = sig === incomingHeader.replace('sha256=', '');
|
|
|
348
467
|
|
|
349
468
|
---
|
|
350
469
|
|
|
351
|
-
### WhatsApp (
|
|
470
|
+
### WhatsApp (13 tools)
|
|
352
471
|
|
|
353
472
|
**Example prompts:**
|
|
354
473
|
- "List my WhatsApp sessions"
|
|
@@ -363,7 +482,7 @@ const isValid = sig === incomingHeader.replace('sha256=', '');
|
|
|
363
482
|
|
|
364
483
|
---
|
|
365
484
|
|
|
366
|
-
### Billing (
|
|
485
|
+
### Billing (11 tools)
|
|
367
486
|
|
|
368
487
|
**Example prompts:**
|
|
369
488
|
- "What's my current billing balance?"
|
|
@@ -386,14 +505,16 @@ const isValid = sig === incomingHeader.replace('sha256=', '');
|
|
|
386
505
|
|
|
387
506
|
---
|
|
388
507
|
|
|
389
|
-
### Gateway Tokens (
|
|
508
|
+
### Gateway Tokens (4 tools)
|
|
390
509
|
|
|
391
510
|
**Example prompts:**
|
|
392
511
|
- "List my payment gateway tokens"
|
|
393
|
-
- "Add a
|
|
512
|
+
- "Add a PushinPay token"
|
|
394
513
|
- "Remove token abc123"
|
|
395
514
|
|
|
396
|
-
|
|
515
|
+
`insert_token` creates only the four types the API accepts: `pushinpay`, `utmify`,
|
|
516
|
+
`emailprovider` and `mercadopago`. The platform processes payments through 25+ gateways, but the
|
|
517
|
+
others are connected from the dashboard, not through this API — asking for one here is refused.
|
|
397
518
|
|
|
398
519
|
---
|
|
399
520
|
|
|
@@ -427,13 +548,16 @@ Supports 26+ gateways: pushinpay, mercadopago, stripe, efibank, amplopay, infini
|
|
|
427
548
|
|
|
428
549
|
---
|
|
429
550
|
|
|
430
|
-
### Rewards / Goals (
|
|
551
|
+
### Rewards / Goals (2 tools)
|
|
431
552
|
|
|
432
553
|
**Example prompts:**
|
|
433
554
|
- "What's my progress on sales milestones?"
|
|
434
|
-
- "Recalculate my reward progress"
|
|
435
555
|
- "Redeem the 10K bracelet reward"
|
|
436
556
|
|
|
557
|
+
`calculate_rewards` is the only reader: it returns the progress and the milestone list together,
|
|
558
|
+
in reais (`currentRevenueCents` carries the same value in cents). There is no reward catalogue
|
|
559
|
+
endpoint, and a cache miss is rate limited to 10 per hour.
|
|
560
|
+
|
|
437
561
|
---
|
|
438
562
|
|
|
439
563
|
### Profile / Auth (6 tools)
|
|
@@ -455,6 +579,20 @@ Supports 26+ gateways: pushinpay, mercadopago, stripe, efibank, amplopay, infini
|
|
|
455
579
|
|
|
456
580
|
---
|
|
457
581
|
|
|
582
|
+
### Telegram (15 tools)
|
|
583
|
+
|
|
584
|
+
Bots (`list_telegram_bots`, `get_telegram_bot`, `create_telegram_bot`, `update_telegram_bot`,
|
|
585
|
+
`delete_telegram_bot`, `validate_telegram_token`, `get_telegram_bot_groups`), flows
|
|
586
|
+
(`list_telegram_flows`, `get_telegram_flow`, `create_telegram_flow`, `update_telegram_flow`,
|
|
587
|
+
`delete_telegram_flow`, `deploy_telegram_flow`), `list_telegram_leads` and `telegram_media_upload`.
|
|
588
|
+
|
|
589
|
+
**Example prompts:**
|
|
590
|
+
- "List my Telegram bots"
|
|
591
|
+
- "Create a basic flow for bot abc123 and deploy it"
|
|
592
|
+
- "Show the qualified leads of bot abc123"
|
|
593
|
+
|
|
594
|
+
---
|
|
595
|
+
|
|
458
596
|
## Price Formats
|
|
459
597
|
|
|
460
598
|
Prices are accepted in two formats:
|
|
@@ -540,7 +678,7 @@ for each item:
|
|
|
540
678
|
## Local Development
|
|
541
679
|
|
|
542
680
|
```bash
|
|
543
|
-
git clone https://github.com/
|
|
681
|
+
git clone https://github.com/ggCheckout/ggcheckout-mcp.git
|
|
544
682
|
cd ggcheckout-mcp
|
|
545
683
|
npm install
|
|
546
684
|
```
|
|
@@ -550,6 +688,7 @@ npm install
|
|
|
550
688
|
```bash
|
|
551
689
|
GGCHECKOUT_API_KEY=ggck_live_your_key_here
|
|
552
690
|
GGCHECKOUT_API_URL=http://localhost:3000 # optional, defaults to https://ggcheckout.app
|
|
691
|
+
GGCHECKOUT_UPLOAD_ROOT=/path/to/import # needed by upload_members_area_file, the only folder it reads from
|
|
553
692
|
```
|
|
554
693
|
|
|
555
694
|
### Commands
|
|
@@ -610,9 +749,9 @@ Opens a browser UI to test any tool interactively.
|
|
|
610
749
|
|
|
611
750
|
## Support
|
|
612
751
|
|
|
613
|
-
- 📧 Email:
|
|
752
|
+
- 📧 Email: suporte@ggcheckout.com
|
|
614
753
|
- 📖 Docs: https://docs.ggcheckout.com
|
|
615
|
-
- 🐛 Issues: https://github.com/
|
|
754
|
+
- 🐛 Issues: https://github.com/ggCheckout/ggcheckout-mcp/issues
|
|
616
755
|
|
|
617
756
|
## License
|
|
618
757
|
|
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
2
|
-
import type
|
|
2
|
+
import { type BillingService } from '../../../core/services/billing.service.js';
|
|
3
3
|
export declare function registerBillingTools(server: McpServer, service: BillingService): void;
|
|
4
4
|
//# sourceMappingURL=billing.tools.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"billing.tools.d.ts","sourceRoot":"","sources":["../../../../src/adapters/inbound/tools/billing.tools.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACzE,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"billing.tools.d.ts","sourceRoot":"","sources":["../../../../src/adapters/inbound/tools/billing.tools.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACzE,OAAO,EAGL,KAAK,cAAc,EACpB,MAAM,2CAA2C,CAAC;AAGnD,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,cAAc,QAiG9E"}
|