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.
Files changed (187) hide show
  1. package/CHANGELOG.md +197 -0
  2. package/README.md +186 -47
  3. package/dist/adapters/inbound/tools/billing.tools.d.ts +1 -1
  4. package/dist/adapters/inbound/tools/billing.tools.d.ts.map +1 -1
  5. package/dist/adapters/inbound/tools/billing.tools.js +32 -6
  6. package/dist/adapters/inbound/tools/billing.tools.js.map +1 -1
  7. package/dist/adapters/inbound/tools/checkout.tools.d.ts.map +1 -1
  8. package/dist/adapters/inbound/tools/checkout.tools.js +7 -2
  9. package/dist/adapters/inbound/tools/checkout.tools.js.map +1 -1
  10. package/dist/adapters/inbound/tools/funnel.tools.d.ts.map +1 -1
  11. package/dist/adapters/inbound/tools/funnel.tools.js +89 -51
  12. package/dist/adapters/inbound/tools/funnel.tools.js.map +1 -1
  13. package/dist/adapters/inbound/tools/gateway.tools.d.ts.map +1 -1
  14. package/dist/adapters/inbound/tools/gateway.tools.js +11 -3
  15. package/dist/adapters/inbound/tools/gateway.tools.js.map +1 -1
  16. package/dist/adapters/inbound/tools/members-area.tools.d.ts.map +1 -1
  17. package/dist/adapters/inbound/tools/members-area.tools.js +263 -31
  18. package/dist/adapters/inbound/tools/members-area.tools.js.map +1 -1
  19. package/dist/adapters/inbound/tools/payment.tools.d.ts.map +1 -1
  20. package/dist/adapters/inbound/tools/payment.tools.js +9 -3
  21. package/dist/adapters/inbound/tools/payment.tools.js.map +1 -1
  22. package/dist/adapters/inbound/tools/product.tools.d.ts.map +1 -1
  23. package/dist/adapters/inbound/tools/product.tools.js +115 -29
  24. package/dist/adapters/inbound/tools/product.tools.js.map +1 -1
  25. package/dist/adapters/inbound/tools/rewards.tools.d.ts.map +1 -1
  26. package/dist/adapters/inbound/tools/rewards.tools.js +6 -2
  27. package/dist/adapters/inbound/tools/rewards.tools.js.map +1 -1
  28. package/dist/adapters/inbound/tools/store.tools.d.ts.map +1 -1
  29. package/dist/adapters/inbound/tools/store.tools.js +302 -25
  30. package/dist/adapters/inbound/tools/store.tools.js.map +1 -1
  31. package/dist/adapters/inbound/tools/telegram.tools.d.ts.map +1 -1
  32. package/dist/adapters/inbound/tools/telegram.tools.js +8 -1
  33. package/dist/adapters/inbound/tools/telegram.tools.js.map +1 -1
  34. package/dist/adapters/inbound/tools/webhook.tools.d.ts.map +1 -1
  35. package/dist/adapters/inbound/tools/webhook.tools.js +17 -8
  36. package/dist/adapters/inbound/tools/webhook.tools.js.map +1 -1
  37. package/dist/adapters/inbound/tools/whatsapp.tools.d.ts.map +1 -1
  38. package/dist/adapters/inbound/tools/whatsapp.tools.js +3 -1
  39. package/dist/adapters/inbound/tools/whatsapp.tools.js.map +1 -1
  40. package/dist/adapters/outbound/billing.api.d.ts +25 -8
  41. package/dist/adapters/outbound/billing.api.d.ts.map +1 -1
  42. package/dist/adapters/outbound/billing.api.js +86 -3
  43. package/dist/adapters/outbound/billing.api.js.map +1 -1
  44. package/dist/adapters/outbound/funnel.api.d.ts +3 -1
  45. package/dist/adapters/outbound/funnel.api.d.ts.map +1 -1
  46. package/dist/adapters/outbound/funnel.api.js +25 -9
  47. package/dist/adapters/outbound/funnel.api.js.map +1 -1
  48. package/dist/adapters/outbound/http-client.d.ts +12 -0
  49. package/dist/adapters/outbound/http-client.d.ts.map +1 -1
  50. package/dist/adapters/outbound/http-client.js +63 -12
  51. package/dist/adapters/outbound/http-client.js.map +1 -1
  52. package/dist/adapters/outbound/members-area.api.d.ts +55 -2
  53. package/dist/adapters/outbound/members-area.api.d.ts.map +1 -1
  54. package/dist/adapters/outbound/members-area.api.js +89 -1
  55. package/dist/adapters/outbound/members-area.api.js.map +1 -1
  56. package/dist/adapters/outbound/payment.api.d.ts +6 -0
  57. package/dist/adapters/outbound/payment.api.d.ts.map +1 -1
  58. package/dist/adapters/outbound/payment.api.js +17 -3
  59. package/dist/adapters/outbound/payment.api.js.map +1 -1
  60. package/dist/adapters/outbound/product.api.d.ts +39 -7
  61. package/dist/adapters/outbound/product.api.d.ts.map +1 -1
  62. package/dist/adapters/outbound/product.api.js +53 -11
  63. package/dist/adapters/outbound/product.api.js.map +1 -1
  64. package/dist/adapters/outbound/product.api.test.js +14 -1
  65. package/dist/adapters/outbound/product.api.test.js.map +1 -1
  66. package/dist/adapters/outbound/rewards.api.d.ts +5 -1
  67. package/dist/adapters/outbound/rewards.api.d.ts.map +1 -1
  68. package/dist/adapters/outbound/rewards.api.js +5 -1
  69. package/dist/adapters/outbound/rewards.api.js.map +1 -1
  70. package/dist/adapters/outbound/signed-upload.d.ts +10 -0
  71. package/dist/adapters/outbound/signed-upload.d.ts.map +1 -0
  72. package/dist/adapters/outbound/signed-upload.js +29 -0
  73. package/dist/adapters/outbound/signed-upload.js.map +1 -0
  74. package/dist/adapters/outbound/store.api.d.ts +37 -1
  75. package/dist/adapters/outbound/store.api.d.ts.map +1 -1
  76. package/dist/adapters/outbound/store.api.js +88 -7
  77. package/dist/adapters/outbound/store.api.js.map +1 -1
  78. package/dist/adapters/outbound/store.api.test.js +62 -0
  79. package/dist/adapters/outbound/store.api.test.js.map +1 -1
  80. package/dist/adapters/outbound/telegram.api.d.ts +5 -0
  81. package/dist/adapters/outbound/telegram.api.d.ts.map +1 -1
  82. package/dist/adapters/outbound/telegram.api.js +7 -2
  83. package/dist/adapters/outbound/telegram.api.js.map +1 -1
  84. package/dist/adapters/outbound/whatsapp.api.d.ts +5 -0
  85. package/dist/adapters/outbound/whatsapp.api.d.ts.map +1 -1
  86. package/dist/adapters/outbound/whatsapp.api.js +20 -3
  87. package/dist/adapters/outbound/whatsapp.api.js.map +1 -1
  88. package/dist/core/ports/billing.port.d.ts +8 -8
  89. package/dist/core/ports/billing.port.d.ts.map +1 -1
  90. package/dist/core/ports/funnel.port.d.ts +4 -1
  91. package/dist/core/ports/funnel.port.d.ts.map +1 -1
  92. package/dist/core/ports/members-area.port.d.ts +42 -1
  93. package/dist/core/ports/members-area.port.d.ts.map +1 -1
  94. package/dist/core/ports/product.port.d.ts +22 -7
  95. package/dist/core/ports/product.port.d.ts.map +1 -1
  96. package/dist/core/ports/rewards.port.d.ts +0 -1
  97. package/dist/core/ports/rewards.port.d.ts.map +1 -1
  98. package/dist/core/ports/store.port.d.ts +36 -1
  99. package/dist/core/ports/store.port.d.ts.map +1 -1
  100. package/dist/core/services/billing.service.d.ts +14 -7
  101. package/dist/core/services/billing.service.d.ts.map +1 -1
  102. package/dist/core/services/billing.service.js +42 -2
  103. package/dist/core/services/billing.service.js.map +1 -1
  104. package/dist/core/services/checkout.service.d.ts.map +1 -1
  105. package/dist/core/services/checkout.service.js +30 -14
  106. package/dist/core/services/checkout.service.js.map +1 -1
  107. package/dist/core/services/checkout.service.test.js +26 -10
  108. package/dist/core/services/checkout.service.test.js.map +1 -1
  109. package/dist/core/services/funnel.service.d.ts +8 -1
  110. package/dist/core/services/funnel.service.d.ts.map +1 -1
  111. package/dist/core/services/funnel.service.js +21 -1
  112. package/dist/core/services/funnel.service.js.map +1 -1
  113. package/dist/core/services/funnel.service.test.d.ts +2 -0
  114. package/dist/core/services/funnel.service.test.d.ts.map +1 -0
  115. package/dist/core/services/funnel.service.test.js +82 -0
  116. package/dist/core/services/funnel.service.test.js.map +1 -0
  117. package/dist/core/services/members-area.service.d.ts +48 -2
  118. package/dist/core/services/members-area.service.d.ts.map +1 -1
  119. package/dist/core/services/members-area.service.js +35 -1
  120. package/dist/core/services/members-area.service.js.map +1 -1
  121. package/dist/core/services/product.service.d.ts +95 -6
  122. package/dist/core/services/product.service.d.ts.map +1 -1
  123. package/dist/core/services/product.service.js +280 -13
  124. package/dist/core/services/product.service.js.map +1 -1
  125. package/dist/core/services/product.service.test.js +80 -0
  126. package/dist/core/services/product.service.test.js.map +1 -1
  127. package/dist/core/services/rewards.service.d.ts +0 -1
  128. package/dist/core/services/rewards.service.d.ts.map +1 -1
  129. package/dist/core/services/rewards.service.js +0 -1
  130. package/dist/core/services/rewards.service.js.map +1 -1
  131. package/dist/core/services/store.service.d.ts +46 -1
  132. package/dist/core/services/store.service.d.ts.map +1 -1
  133. package/dist/core/services/store.service.js +115 -0
  134. package/dist/core/services/store.service.js.map +1 -1
  135. package/dist/core/services/store.service.test.d.ts +2 -0
  136. package/dist/core/services/store.service.test.d.ts.map +1 -0
  137. package/dist/core/services/store.service.test.js +62 -0
  138. package/dist/core/services/store.service.test.js.map +1 -0
  139. package/dist/core/types/billing.d.ts +60 -0
  140. package/dist/core/types/billing.d.ts.map +1 -1
  141. package/dist/core/types/checkout.d.ts +8 -8
  142. package/dist/core/types/checkout.d.ts.map +1 -1
  143. package/dist/core/types/funnel.d.ts +57 -10
  144. package/dist/core/types/funnel.d.ts.map +1 -1
  145. package/dist/core/types/members-area.d.ts +69 -0
  146. package/dist/core/types/members-area.d.ts.map +1 -1
  147. package/dist/core/types/payment.d.ts +10 -1
  148. package/dist/core/types/payment.d.ts.map +1 -1
  149. package/dist/core/types/product.d.ts +92 -11
  150. package/dist/core/types/product.d.ts.map +1 -1
  151. package/dist/core/types/rewards.d.ts +4 -0
  152. package/dist/core/types/rewards.d.ts.map +1 -1
  153. package/dist/core/types/store.d.ts +82 -0
  154. package/dist/core/types/store.d.ts.map +1 -1
  155. package/dist/core/types/telegram.d.ts +3 -1
  156. package/dist/core/types/telegram.d.ts.map +1 -1
  157. package/dist/core/types/telegram.js +1 -1
  158. package/dist/core/types/telegram.js.map +1 -1
  159. package/dist/index.js +5 -3
  160. package/dist/index.js.map +1 -1
  161. package/dist/shared/errors.d.ts +10 -0
  162. package/dist/shared/errors.d.ts.map +1 -1
  163. package/dist/shared/errors.js +13 -0
  164. package/dist/shared/errors.js.map +1 -1
  165. package/dist/shared/external-offer-snippet.d.ts +25 -0
  166. package/dist/shared/external-offer-snippet.d.ts.map +1 -0
  167. package/dist/shared/external-offer-snippet.js +114 -0
  168. package/dist/shared/external-offer-snippet.js.map +1 -0
  169. package/dist/shared/local-file.d.ts +32 -0
  170. package/dist/shared/local-file.d.ts.map +1 -0
  171. package/dist/shared/local-file.js +92 -0
  172. package/dist/shared/local-file.js.map +1 -0
  173. package/dist/shared/merge.d.ts +6 -0
  174. package/dist/shared/merge.d.ts.map +1 -0
  175. package/dist/shared/merge.js +22 -0
  176. package/dist/shared/merge.js.map +1 -0
  177. package/dist/shared/sanitizer.d.ts +7 -0
  178. package/dist/shared/sanitizer.d.ts.map +1 -1
  179. package/dist/shared/sanitizer.js +28 -0
  180. package/dist/shared/sanitizer.js.map +1 -1
  181. package/dist/shared/sanitizer.test.js +20 -1
  182. package/dist/shared/sanitizer.test.js.map +1 -1
  183. package/dist/shared/webhook-fixtures.d.ts +33 -4
  184. package/dist/shared/webhook-fixtures.d.ts.map +1 -1
  185. package/dist/shared/webhook-fixtures.js +63 -21
  186. package/dist/shared/webhook-fixtures.js.map +1 -1
  187. 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 — 142 tools across 18 domains.
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 (142)
93
+ ## Available Tools (189)
83
94
 
84
- ### Products (16 tools)
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
- Upload a deliverable file to a product.
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
- **Parameters:** `productId`, `fileUrl`, `fileName`, `fileType` (optional)
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
- **Example prompt:** "Upload the ebook at https://files.example.com/ebook.pdf to product abc123"
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
- Auto-merges with current data — only provide fields you want to change. The API
195
- resets any field missing from the body rather than merging, so the whole document
196
- is re-sent on your behalf; edits made outside the MCP between the read and the
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 payment.paid events at https://myapp.com/webhook"
248
- - "Update webhook abc123 to also listen for payment.refunded"
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 payment.paid event to webhook abc123"
251
- - "Test my webhook abc123 with a refunded event overriding the payment ID to pay_xyz"
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`, `refunded`, `expired`, `chargeback` |
262
- | `payment.method` | string | `pix`, `pix.paid`, `card`, `card.paid` |
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 `payment.paid`, `payment.refunded`, `payment.chargeback` |
270
- | `payment.refundedAt` | string \| undefined | Present on `payment.refunded` |
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
- **Supported events:**
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": "payment.created", "payment": { "status": "pending", "method": "pix" }, ... }
279
- { "event": "payment.paid", "payment": { "status": "paid", "method": "pix.paid", "paidAt": "..." }, ... }
280
- { "event": "payment.refunded", "payment": { "status": "refunded", "method": "pix.paid", "paidAt": "...", "refundedAt": "..." }, ... }
281
- { "event": "payment.expired", "payment": { "status": "expired", "method": "pix", "expiredAt": "..." }, ... }
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: payment.paid
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 (9 tools)
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
- - "Show me my store configuration"
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 (9 tools)
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
- - "Show me the details of funnel abc123"
317
- - "Create a new funnel called 'Lead Capture'"
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 (21 tools)
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 (15 tools)
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 (10 tools)
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 (3 tools)
508
+ ### Gateway Tokens (4 tools)
390
509
 
391
510
  **Example prompts:**
392
511
  - "List my payment gateway tokens"
393
- - "Add a Stripe token"
512
+ - "Add a PushinPay token"
394
513
  - "Remove token abc123"
395
514
 
396
- Supports 26+ gateways: pushinpay, mercadopago, stripe, efibank, amplopay, infinitepay, abacatepay, and more.
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 (3 tools)
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/gui-drumond/ggcheckout-mcp.git
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: support@ggcheckout.com
752
+ - 📧 Email: suporte@ggcheckout.com
614
753
  - 📖 Docs: https://docs.ggcheckout.com
615
- - 🐛 Issues: https://github.com/gui-drumond/ggcheckout-mcp/issues
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 { BillingService } from '../../../core/services/billing.service.js';
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,EAAE,cAAc,EAAE,MAAM,2CAA2C,CAAC;AAGhF,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,cAAc,QAkE9E"}
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"}