ggcheckout-mcp 0.2.0 → 0.2.4
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/LICENSE +21 -21
- package/README.md +588 -491
- package/dist/__e2e__/all.e2e.test.js +1 -1
- package/dist/__e2e__/all.e2e.test.js.map +1 -1
- package/dist/__e2e__/setup.js +1 -1
- package/dist/__e2e__/setup.js.map +1 -1
- package/dist/adapters/inbound/tools/webhook.tools.d.ts.map +1 -1
- package/dist/adapters/inbound/tools/webhook.tools.js +43 -0
- package/dist/adapters/inbound/tools/webhook.tools.js.map +1 -1
- package/dist/adapters/inbound/tools/webhook.tools.test.d.ts +2 -0
- package/dist/adapters/inbound/tools/webhook.tools.test.d.ts.map +1 -0
- package/dist/adapters/inbound/tools/webhook.tools.test.js +118 -0
- package/dist/adapters/inbound/tools/webhook.tools.test.js.map +1 -0
- package/dist/adapters/outbound/http-client.d.ts.map +1 -1
- package/dist/adapters/outbound/http-client.js +18 -3
- package/dist/adapters/outbound/http-client.js.map +1 -1
- package/dist/adapters/outbound/http-client.test.js +36 -0
- package/dist/adapters/outbound/http-client.test.js.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/shared/__tests__/webhook-fixtures.test.d.ts +2 -0
- package/dist/shared/__tests__/webhook-fixtures.test.d.ts.map +1 -0
- package/dist/shared/__tests__/webhook-fixtures.test.js +22 -0
- package/dist/shared/__tests__/webhook-fixtures.test.js.map +1 -0
- package/dist/shared/errors.d.ts +3 -0
- package/dist/shared/errors.d.ts.map +1 -1
- package/dist/shared/errors.js +6 -0
- package/dist/shared/errors.js.map +1 -1
- package/dist/shared/webhook-fixtures.d.ts +31 -0
- package/dist/shared/webhook-fixtures.d.ts.map +1 -0
- package/dist/shared/webhook-fixtures.js +50 -0
- package/dist/shared/webhook-fixtures.js.map +1 -0
- package/package.json +61 -61
package/README.md
CHANGED
|
@@ -1,491 +1,588 @@
|
|
|
1
|
-
# GG Checkout MCP Server
|
|
2
|
-
|
|
3
|
-
> Complete Model Context Protocol server for managing the GG Checkout platform via AI agents —
|
|
4
|
-
|
|
5
|
-
## Overview
|
|
6
|
-
|
|
7
|
-
The GG Checkout MCP server enables AI agents (Claude Code, Cursor, Claude Desktop) to manage the entire GG Checkout platform through natural language: products, checkouts, payments, members area, funnels, WhatsApp, billing, and more.
|
|
8
|
-
|
|
9
|
-
## Prerequisites
|
|
10
|
-
|
|
11
|
-
- Node.js >= 18.0.0
|
|
12
|
-
- A GG Checkout account with an active API Key
|
|
13
|
-
|
|
14
|
-
## Installation
|
|
15
|
-
|
|
16
|
-
### NPX (Recommended)
|
|
17
|
-
|
|
18
|
-
```bash
|
|
19
|
-
npx ggcheckout-mcp
|
|
20
|
-
```
|
|
21
|
-
|
|
22
|
-
### Global Install
|
|
23
|
-
|
|
24
|
-
```bash
|
|
25
|
-
npm install -g ggcheckout-mcp
|
|
26
|
-
```
|
|
27
|
-
|
|
28
|
-
## Getting Your API Key
|
|
29
|
-
|
|
30
|
-
1. Visit [ggcheckout.com](https://www.ggcheckout.com/)
|
|
31
|
-
2. Go to **Settings** → **MCP / API Key**
|
|
32
|
-
3. Generate your API Key (format: `ggck_live_...`)
|
|
33
|
-
4. **Important:** Copy and save your API key immediately — it won't be shown again!
|
|
34
|
-
|
|
35
|
-
## Configuration
|
|
36
|
-
|
|
37
|
-
### Claude Code
|
|
38
|
-
|
|
39
|
-
```json
|
|
40
|
-
{
|
|
41
|
-
"mcpServers": {
|
|
42
|
-
"ggcheckout": {
|
|
43
|
-
"command": "npx",
|
|
44
|
-
"args": ["ggcheckout-mcp"],
|
|
45
|
-
"env": {
|
|
46
|
-
"GGCHECKOUT_API_KEY": "ggck_live_your_key_here"
|
|
47
|
-
}
|
|
48
|
-
}
|
|
49
|
-
}
|
|
50
|
-
}
|
|
51
|
-
```
|
|
52
|
-
|
|
53
|
-
### Claude Desktop
|
|
54
|
-
|
|
55
|
-
**macOS**: `~/Library/Application Support/Claude/claude_desktop_config.json`
|
|
56
|
-
**Windows**: `%APPDATA%\Claude\claude_desktop_config.json`
|
|
57
|
-
|
|
58
|
-
Same format as above.
|
|
59
|
-
|
|
60
|
-
### Cursor / Other Clients
|
|
61
|
-
|
|
62
|
-
```bash
|
|
63
|
-
export GGCHECKOUT_API_KEY="ggck_live_your_key_here"
|
|
64
|
-
```
|
|
65
|
-
|
|
66
|
-
### Custom API URL
|
|
67
|
-
|
|
68
|
-
```bash
|
|
69
|
-
export GGCHECKOUT_API_URL="https://your-staging.example.com"
|
|
70
|
-
```
|
|
71
|
-
|
|
72
|
-
---
|
|
73
|
-
|
|
74
|
-
## Available Tools (
|
|
75
|
-
|
|
76
|
-
### Products (16 tools)
|
|
77
|
-
|
|
78
|
-
#### `list_products`
|
|
79
|
-
|
|
80
|
-
List all your products/deliveries.
|
|
81
|
-
|
|
82
|
-
**Example prompt:** "Show me all my products"
|
|
83
|
-
|
|
84
|
-
#### `get_product`
|
|
85
|
-
|
|
86
|
-
Get details of a specific product.
|
|
87
|
-
|
|
88
|
-
**Parameters:** `productId` (string)
|
|
89
|
-
|
|
90
|
-
**Example prompt:** "Get details of product abc123"
|
|
91
|
-
|
|
92
|
-
#### `create_product`
|
|
93
|
-
|
|
94
|
-
Create a new product/delivery.
|
|
95
|
-
|
|
96
|
-
**Parameters:**
|
|
97
|
-
- `title` (string): Product title
|
|
98
|
-
- `description` (string): Product description
|
|
99
|
-
- `price` (number|string): Price in Reais (e.g., 19.90) or Brazilian format ("19,90")
|
|
100
|
-
- `discount` (number): Discount percentage (use 0 for no discount)
|
|
101
|
-
- `url` (string): Product delivery URL
|
|
102
|
-
|
|
103
|
-
**Example prompts:**
|
|
104
|
-
- "Create a product called 'React Course' priced at R$99.00 with delivery URL https://example.com/course"
|
|
105
|
-
- "Add a new product: 'Node.js Guide', R$49.90, no discount, url https://example.com/node"
|
|
106
|
-
|
|
107
|
-
#### `update_product`
|
|
108
|
-
|
|
109
|
-
Update an existing product. Only provide fields you want to change.
|
|
110
|
-
|
|
111
|
-
**Parameters:** `productId` + any fields from create_product (all optional)
|
|
112
|
-
|
|
113
|
-
**Example prompt:** "Update product abc123 price to R$79.90"
|
|
114
|
-
|
|
115
|
-
#### `delete_product`
|
|
116
|
-
|
|
117
|
-
**Example prompt:** "Delete product abc123"
|
|
118
|
-
|
|
119
|
-
#### `upload_deliverable`
|
|
120
|
-
|
|
121
|
-
Upload a deliverable file to a product.
|
|
122
|
-
|
|
123
|
-
**Parameters:** `productId`, `fileUrl`, `fileName`, `fileType` (optional)
|
|
124
|
-
|
|
125
|
-
**Example prompt:** "Upload the ebook at https://files.example.com/ebook.pdf to product abc123"
|
|
126
|
-
|
|
127
|
-
#### `list_upsells` / `create_upsell` / `delete_upsell` / `reorder_upsells`
|
|
128
|
-
|
|
129
|
-
Manage upsells for a product.
|
|
130
|
-
|
|
131
|
-
**Example prompts:**
|
|
132
|
-
- "Show me the upsells for product abc123"
|
|
133
|
-
- "Create an upsell for product abc123 offering product xyz789 at R$29.90"
|
|
134
|
-
- "Reorder the upsells for product abc123"
|
|
135
|
-
|
|
136
|
-
#### `list_downsells` / `create_downsell` / `delete_downsell` / `reorder_downsells`
|
|
137
|
-
|
|
138
|
-
Manage downsells for a product.
|
|
139
|
-
|
|
140
|
-
**Example prompt:** "Add a downsell to product abc123 with a 50% discount headline"
|
|
141
|
-
|
|
142
|
-
#### `manage_tags`
|
|
143
|
-
|
|
144
|
-
Set tags on a product. Tags have a name and a hex color.
|
|
145
|
-
|
|
146
|
-
**Example prompt:** "Tag product abc123 with 'VIP' in purple and 'Featured' in green"
|
|
147
|
-
|
|
148
|
-
---
|
|
149
|
-
|
|
150
|
-
### Checkouts (6 tools)
|
|
151
|
-
|
|
152
|
-
#### `list_checkouts`
|
|
153
|
-
|
|
154
|
-
**Example prompt:** "Show me all my checkout pages"
|
|
155
|
-
|
|
156
|
-
#### `get_checkout`
|
|
157
|
-
|
|
158
|
-
**Example prompt:** "Get details of checkout abc123"
|
|
159
|
-
|
|
160
|
-
> **Note:** Use the `uid` (Firestore document ID), not the custom `id` slug.
|
|
161
|
-
|
|
162
|
-
#### `create_checkout`
|
|
163
|
-
|
|
164
|
-
**Required:** `title`, `id` (slug), `price`, `paymentMethods`, `checkout` (config)
|
|
165
|
-
|
|
166
|
-
**Example prompt:** "Create a checkout page for my React Course priced at R$99.90"
|
|
167
|
-
|
|
168
|
-
#### `update_checkout`
|
|
169
|
-
|
|
170
|
-
Auto-merges with current data — only provide fields you want to change.
|
|
171
|
-
|
|
172
|
-
**Example prompt:** "Update checkout abc123 price to R$79.90 and unpublish it"
|
|
173
|
-
|
|
174
|
-
#### `delete_checkout`
|
|
175
|
-
|
|
176
|
-
**Example prompt:** "Delete checkout abc123"
|
|
177
|
-
|
|
178
|
-
#### `manage_checkout_tags`
|
|
179
|
-
|
|
180
|
-
Tags with name and hex color (max 5 per checkout).
|
|
181
|
-
|
|
182
|
-
**Example prompt:** "Add a 'promo' tag with color #FF5733 to checkout abc123"
|
|
183
|
-
|
|
184
|
-
---
|
|
185
|
-
|
|
186
|
-
### Payments (7 tools)
|
|
187
|
-
|
|
188
|
-
#### `get_my_business_id`
|
|
189
|
-
|
|
190
|
-
**Example prompt:** "What is my business ID?"
|
|
191
|
-
|
|
192
|
-
**Pro Tip:** Use it in follow-up prompts: "Get my business ID, then show me all payments"
|
|
193
|
-
|
|
194
|
-
#### `list_payments` / `get_payments_paginated` / `get_payment`
|
|
195
|
-
|
|
196
|
-
**Example prompts:**
|
|
197
|
-
- "Show me all payments for my business"
|
|
198
|
-
- "Get the last 20 paid payments from this month"
|
|
199
|
-
- "Search for payments with email john@example.com"
|
|
200
|
-
- "How many pending payments do I have?"
|
|
201
|
-
|
|
202
|
-
#### `get_payment_fulfillment` / `update_payment_fulfillment`
|
|
203
|
-
|
|
204
|
-
Manage physical order fulfillment.
|
|
205
|
-
|
|
206
|
-
**Example prompts:**
|
|
207
|
-
- "Show the fulfillment status for payment xyz789"
|
|
208
|
-
- "Mark payment xyz789 as shipped with tracking code BR123456789"
|
|
209
|
-
|
|
210
|
-
#### `check_payment_status`
|
|
211
|
-
|
|
212
|
-
**Example prompt:** "Check the gateway status for payment xyz789"
|
|
213
|
-
|
|
214
|
-
---
|
|
215
|
-
|
|
216
|
-
### Webhooks (
|
|
217
|
-
|
|
218
|
-
**Example prompts:**
|
|
219
|
-
- "Show me all my webhooks"
|
|
220
|
-
- "Create a webhook for payment.paid events at https://myapp.com/webhook"
|
|
221
|
-
- "Update webhook abc123 to also listen for payment.refunded"
|
|
222
|
-
- "Delete webhook abc123"
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
-
|
|
262
|
-
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
- "List my
|
|
281
|
-
- "
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
- "
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
- "
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
- "
|
|
309
|
-
- "
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
- "
|
|
319
|
-
- "
|
|
320
|
-
- "
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
- "
|
|
330
|
-
- "
|
|
331
|
-
- "
|
|
332
|
-
- "
|
|
333
|
-
- "
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
- "
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
- "
|
|
380
|
-
- "
|
|
381
|
-
|
|
382
|
-
---
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
|
|
420
|
-
|
|
421
|
-
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
|
|
425
|
-
|
|
426
|
-
|
|
427
|
-
|
|
428
|
-
|
|
429
|
-
|
|
430
|
-
|
|
431
|
-
|
|
432
|
-
|
|
433
|
-
|
|
434
|
-
|
|
435
|
-
|
|
436
|
-
|
|
437
|
-
|
|
438
|
-
|
|
439
|
-
|
|
440
|
-
|
|
441
|
-
|
|
442
|
-
|
|
443
|
-
|
|
444
|
-
|
|
445
|
-
|
|
446
|
-
|
|
447
|
-
|
|
448
|
-
|
|
449
|
-
|
|
450
|
-
|
|
451
|
-
|
|
452
|
-
|
|
453
|
-
|
|
454
|
-
|
|
455
|
-
|
|
456
|
-
|
|
457
|
-
|
|
458
|
-
|
|
459
|
-
|
|
460
|
-
|
|
461
|
-
|
|
462
|
-
|
|
463
|
-
|
|
464
|
-
|
|
465
|
-
|
|
466
|
-
|
|
467
|
-
|
|
468
|
-
|
|
469
|
-
|
|
470
|
-
|
|
471
|
-
|
|
472
|
-
|
|
473
|
-
|
|
474
|
-
|
|
475
|
-
|
|
476
|
-
|
|
477
|
-
|
|
478
|
-
|
|
479
|
-
|
|
480
|
-
|
|
481
|
-
|
|
482
|
-
|
|
483
|
-
|
|
484
|
-
|
|
485
|
-
|
|
486
|
-
|
|
487
|
-
|
|
488
|
-
|
|
489
|
-
|
|
490
|
-
|
|
491
|
-
|
|
1
|
+
# GG Checkout MCP Server
|
|
2
|
+
|
|
3
|
+
> Complete Model Context Protocol server for managing the GG Checkout platform via AI agents — 142 tools across 18 domains.
|
|
4
|
+
|
|
5
|
+
## Overview
|
|
6
|
+
|
|
7
|
+
The GG Checkout MCP server enables AI agents (Claude Code, Cursor, Claude Desktop) to manage the entire GG Checkout platform through natural language: products, checkouts, payments, members area, funnels, WhatsApp, billing, and more.
|
|
8
|
+
|
|
9
|
+
## Prerequisites
|
|
10
|
+
|
|
11
|
+
- Node.js >= 18.0.0
|
|
12
|
+
- A GG Checkout account with an active API Key
|
|
13
|
+
|
|
14
|
+
## Installation
|
|
15
|
+
|
|
16
|
+
### NPX (Recommended)
|
|
17
|
+
|
|
18
|
+
```bash
|
|
19
|
+
npx ggcheckout-mcp
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
### Global Install
|
|
23
|
+
|
|
24
|
+
```bash
|
|
25
|
+
npm install -g ggcheckout-mcp
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
## Getting Your API Key
|
|
29
|
+
|
|
30
|
+
1. Visit [ggcheckout.com](https://www.ggcheckout.com/)
|
|
31
|
+
2. Go to **Settings** → **MCP / API Key**
|
|
32
|
+
3. Generate your API Key (format: `ggck_live_...`)
|
|
33
|
+
4. **Important:** Copy and save your API key immediately — it won't be shown again!
|
|
34
|
+
|
|
35
|
+
## Configuration
|
|
36
|
+
|
|
37
|
+
### Claude Code
|
|
38
|
+
|
|
39
|
+
```json
|
|
40
|
+
{
|
|
41
|
+
"mcpServers": {
|
|
42
|
+
"ggcheckout": {
|
|
43
|
+
"command": "npx",
|
|
44
|
+
"args": ["-y", "ggcheckout-mcp"],
|
|
45
|
+
"env": {
|
|
46
|
+
"GGCHECKOUT_API_KEY": "ggck_live_your_key_here"
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
### Claude Desktop
|
|
54
|
+
|
|
55
|
+
**macOS**: `~/Library/Application Support/Claude/claude_desktop_config.json`
|
|
56
|
+
**Windows**: `%APPDATA%\Claude\claude_desktop_config.json`
|
|
57
|
+
|
|
58
|
+
Same format as above.
|
|
59
|
+
|
|
60
|
+
### Cursor / Other Clients
|
|
61
|
+
|
|
62
|
+
```bash
|
|
63
|
+
export GGCHECKOUT_API_KEY="ggck_live_your_key_here"
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
### Custom API URL
|
|
67
|
+
|
|
68
|
+
```bash
|
|
69
|
+
export GGCHECKOUT_API_URL="https://your-staging.example.com"
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
---
|
|
73
|
+
|
|
74
|
+
## Available Tools (142)
|
|
75
|
+
|
|
76
|
+
### Products (16 tools)
|
|
77
|
+
|
|
78
|
+
#### `list_products`
|
|
79
|
+
|
|
80
|
+
List all your products/deliveries.
|
|
81
|
+
|
|
82
|
+
**Example prompt:** "Show me all my products"
|
|
83
|
+
|
|
84
|
+
#### `get_product`
|
|
85
|
+
|
|
86
|
+
Get details of a specific product.
|
|
87
|
+
|
|
88
|
+
**Parameters:** `productId` (string)
|
|
89
|
+
|
|
90
|
+
**Example prompt:** "Get details of product abc123"
|
|
91
|
+
|
|
92
|
+
#### `create_product`
|
|
93
|
+
|
|
94
|
+
Create a new product/delivery.
|
|
95
|
+
|
|
96
|
+
**Parameters:**
|
|
97
|
+
- `title` (string): Product title
|
|
98
|
+
- `description` (string): Product description
|
|
99
|
+
- `price` (number|string): Price in Reais (e.g., 19.90) or Brazilian format ("19,90")
|
|
100
|
+
- `discount` (number): Discount percentage (use 0 for no discount)
|
|
101
|
+
- `url` (string): Product delivery URL
|
|
102
|
+
|
|
103
|
+
**Example prompts:**
|
|
104
|
+
- "Create a product called 'React Course' priced at R$99.00 with delivery URL https://example.com/course"
|
|
105
|
+
- "Add a new product: 'Node.js Guide', R$49.90, no discount, url https://example.com/node"
|
|
106
|
+
|
|
107
|
+
#### `update_product`
|
|
108
|
+
|
|
109
|
+
Update an existing product. Only provide fields you want to change.
|
|
110
|
+
|
|
111
|
+
**Parameters:** `productId` + any fields from create_product (all optional)
|
|
112
|
+
|
|
113
|
+
**Example prompt:** "Update product abc123 price to R$79.90"
|
|
114
|
+
|
|
115
|
+
#### `delete_product`
|
|
116
|
+
|
|
117
|
+
**Example prompt:** "Delete product abc123"
|
|
118
|
+
|
|
119
|
+
#### `upload_deliverable`
|
|
120
|
+
|
|
121
|
+
Upload a deliverable file to a product.
|
|
122
|
+
|
|
123
|
+
**Parameters:** `productId`, `fileUrl`, `fileName`, `fileType` (optional)
|
|
124
|
+
|
|
125
|
+
**Example prompt:** "Upload the ebook at https://files.example.com/ebook.pdf to product abc123"
|
|
126
|
+
|
|
127
|
+
#### `list_upsells` / `create_upsell` / `delete_upsell` / `reorder_upsells`
|
|
128
|
+
|
|
129
|
+
Manage upsells for a product.
|
|
130
|
+
|
|
131
|
+
**Example prompts:**
|
|
132
|
+
- "Show me the upsells for product abc123"
|
|
133
|
+
- "Create an upsell for product abc123 offering product xyz789 at R$29.90"
|
|
134
|
+
- "Reorder the upsells for product abc123"
|
|
135
|
+
|
|
136
|
+
#### `list_downsells` / `create_downsell` / `delete_downsell` / `reorder_downsells`
|
|
137
|
+
|
|
138
|
+
Manage downsells for a product.
|
|
139
|
+
|
|
140
|
+
**Example prompt:** "Add a downsell to product abc123 with a 50% discount headline"
|
|
141
|
+
|
|
142
|
+
#### `manage_tags`
|
|
143
|
+
|
|
144
|
+
Set tags on a product. Tags have a name and a hex color.
|
|
145
|
+
|
|
146
|
+
**Example prompt:** "Tag product abc123 with 'VIP' in purple and 'Featured' in green"
|
|
147
|
+
|
|
148
|
+
---
|
|
149
|
+
|
|
150
|
+
### Checkouts (6 tools)
|
|
151
|
+
|
|
152
|
+
#### `list_checkouts`
|
|
153
|
+
|
|
154
|
+
**Example prompt:** "Show me all my checkout pages"
|
|
155
|
+
|
|
156
|
+
#### `get_checkout`
|
|
157
|
+
|
|
158
|
+
**Example prompt:** "Get details of checkout abc123"
|
|
159
|
+
|
|
160
|
+
> **Note:** Use the `uid` (Firestore document ID), not the custom `id` slug.
|
|
161
|
+
|
|
162
|
+
#### `create_checkout`
|
|
163
|
+
|
|
164
|
+
**Required:** `title`, `id` (slug), `price`, `paymentMethods`, `checkout` (config)
|
|
165
|
+
|
|
166
|
+
**Example prompt:** "Create a checkout page for my React Course priced at R$99.90"
|
|
167
|
+
|
|
168
|
+
#### `update_checkout`
|
|
169
|
+
|
|
170
|
+
Auto-merges with current data — only provide fields you want to change.
|
|
171
|
+
|
|
172
|
+
**Example prompt:** "Update checkout abc123 price to R$79.90 and unpublish it"
|
|
173
|
+
|
|
174
|
+
#### `delete_checkout`
|
|
175
|
+
|
|
176
|
+
**Example prompt:** "Delete checkout abc123"
|
|
177
|
+
|
|
178
|
+
#### `manage_checkout_tags`
|
|
179
|
+
|
|
180
|
+
Tags with name and hex color (max 5 per checkout).
|
|
181
|
+
|
|
182
|
+
**Example prompt:** "Add a 'promo' tag with color #FF5733 to checkout abc123"
|
|
183
|
+
|
|
184
|
+
---
|
|
185
|
+
|
|
186
|
+
### Payments (7 tools)
|
|
187
|
+
|
|
188
|
+
#### `get_my_business_id`
|
|
189
|
+
|
|
190
|
+
**Example prompt:** "What is my business ID?"
|
|
191
|
+
|
|
192
|
+
**Pro Tip:** Use it in follow-up prompts: "Get my business ID, then show me all payments"
|
|
193
|
+
|
|
194
|
+
#### `list_payments` / `get_payments_paginated` / `get_payment`
|
|
195
|
+
|
|
196
|
+
**Example prompts:**
|
|
197
|
+
- "Show me all payments for my business"
|
|
198
|
+
- "Get the last 20 paid payments from this month"
|
|
199
|
+
- "Search for payments with email john@example.com"
|
|
200
|
+
- "How many pending payments do I have?"
|
|
201
|
+
|
|
202
|
+
#### `get_payment_fulfillment` / `update_payment_fulfillment`
|
|
203
|
+
|
|
204
|
+
Manage physical order fulfillment.
|
|
205
|
+
|
|
206
|
+
**Example prompts:**
|
|
207
|
+
- "Show the fulfillment status for payment xyz789"
|
|
208
|
+
- "Mark payment xyz789 as shipped with tracking code BR123456789"
|
|
209
|
+
|
|
210
|
+
#### `check_payment_status`
|
|
211
|
+
|
|
212
|
+
**Example prompt:** "Check the gateway status for payment xyz789"
|
|
213
|
+
|
|
214
|
+
---
|
|
215
|
+
|
|
216
|
+
### Webhooks (6 tools)
|
|
217
|
+
|
|
218
|
+
**Example prompts:**
|
|
219
|
+
- "Show me all my webhooks"
|
|
220
|
+
- "Create a webhook for payment.paid events at https://myapp.com/webhook"
|
|
221
|
+
- "Update webhook abc123 to also listen for payment.refunded"
|
|
222
|
+
- "Delete webhook abc123"
|
|
223
|
+
- "Send a test payment.paid event to webhook abc123"
|
|
224
|
+
- "Test my webhook abc123 with a refunded event overriding the payment ID to pay_xyz"
|
|
225
|
+
|
|
226
|
+
#### Webhook Event Payloads
|
|
227
|
+
|
|
228
|
+
All events share the same top-level shape. Key fields:
|
|
229
|
+
|
|
230
|
+
| Field | Type | Notes |
|
|
231
|
+
|---|---|---|
|
|
232
|
+
| `event` | string | Event type (see below) |
|
|
233
|
+
| `payment.id` | string | Payment identifier |
|
|
234
|
+
| `payment.status` | string | `pending`, `paid`, `refunded`, `expired`, `chargeback` |
|
|
235
|
+
| `payment.method` | string | `pix`, `pix.paid`, `card`, `card.paid` |
|
|
236
|
+
| `payment.amount` | number | Amount in **cents** (e.g. `9900` = R$99,00) |
|
|
237
|
+
| `payment.customer.name` | string | Buyer name |
|
|
238
|
+
| `payment.customer.email` | string | Buyer email |
|
|
239
|
+
| `payment.customer.document` | string | CPF |
|
|
240
|
+
| `payment.customer.phone` | string | Phone (E.164, e.g. `5511999999999`) |
|
|
241
|
+
| `payment.createdAt` | string | ISO 8601 |
|
|
242
|
+
| `payment.paidAt` | string \| undefined | Present on `payment.paid`, `payment.refunded`, `payment.chargeback` |
|
|
243
|
+
| `payment.refundedAt` | string \| undefined | Present on `payment.refunded` |
|
|
244
|
+
| `payment.expiredAt` | string \| undefined | Present on `payment.expired` |
|
|
245
|
+
| `product.id` | string | Product identifier |
|
|
246
|
+
| `product.title` | string | Product name |
|
|
247
|
+
|
|
248
|
+
**Supported events:**
|
|
249
|
+
|
|
250
|
+
```json
|
|
251
|
+
{ "event": "payment.created", "payment": { "status": "pending", "method": "pix" }, ... }
|
|
252
|
+
{ "event": "payment.paid", "payment": { "status": "paid", "method": "pix.paid", "paidAt": "..." }, ... }
|
|
253
|
+
{ "event": "payment.refunded", "payment": { "status": "refunded", "method": "pix.paid", "paidAt": "...", "refundedAt": "..." }, ... }
|
|
254
|
+
{ "event": "payment.expired", "payment": { "status": "expired", "method": "pix", "expiredAt": "..." }, ... }
|
|
255
|
+
{ "event": "payment.chargeback", "payment": { "status": "chargeback", "method": "card.paid", "paidAt": "..." }, ... }
|
|
256
|
+
```
|
|
257
|
+
|
|
258
|
+
**Signature verification** (when a `secret` is set):
|
|
259
|
+
|
|
260
|
+
```
|
|
261
|
+
X-Webhook-Signature: sha256=<HMAC-SHA256(secret, raw_body)>
|
|
262
|
+
X-GGCheckout-Event: payment.paid
|
|
263
|
+
```
|
|
264
|
+
|
|
265
|
+
```ts
|
|
266
|
+
import { createHmac } from 'crypto';
|
|
267
|
+
const sig = createHmac('sha256', secret).update(rawBody).digest('hex');
|
|
268
|
+
const isValid = sig === incomingHeader.replace('sha256=', '');
|
|
269
|
+
```
|
|
270
|
+
|
|
271
|
+
---
|
|
272
|
+
|
|
273
|
+
### Store (9 tools)
|
|
274
|
+
|
|
275
|
+
**Example prompts:**
|
|
276
|
+
- "Show me my store configuration"
|
|
277
|
+
- "List all products in my store"
|
|
278
|
+
- "Get product details for product abc123 in store xyz"
|
|
279
|
+
- "Show me the categories in my store"
|
|
280
|
+
- "List customer reviews for my store with rating stats"
|
|
281
|
+
- "Validate coupon code SAVE20 for an order of R$100"
|
|
282
|
+
|
|
283
|
+
---
|
|
284
|
+
|
|
285
|
+
### Funnels / Quiz (9 tools)
|
|
286
|
+
|
|
287
|
+
**Example prompts:**
|
|
288
|
+
- "List all my funnels"
|
|
289
|
+
- "Show me the details of funnel abc123"
|
|
290
|
+
- "Create a new funnel called 'Lead Capture'"
|
|
291
|
+
- "Duplicate funnel abc123"
|
|
292
|
+
- "Show me the leads from funnel abc123 that completed all steps"
|
|
293
|
+
- "What's the conversion rate for funnel abc123?"
|
|
294
|
+
- "Show me the drop-off analytics for each step in funnel abc123"
|
|
295
|
+
|
|
296
|
+
---
|
|
297
|
+
|
|
298
|
+
### Members Area (21 tools)
|
|
299
|
+
|
|
300
|
+
**Example prompts:**
|
|
301
|
+
- "List all my members areas"
|
|
302
|
+
- "Create a members area for product abc123 called 'React Academy'"
|
|
303
|
+
- "Add a module called 'Getting Started' to members area xyz"
|
|
304
|
+
- "Create a video lesson called 'Introduction' in section abc of module xyz"
|
|
305
|
+
- "Reorder the modules in members area xyz"
|
|
306
|
+
- "List all students in members area xyz"
|
|
307
|
+
- "Add student john@example.com to members area xyz"
|
|
308
|
+
- "Import these 50 students to members area xyz"
|
|
309
|
+
- "Block student abc123"
|
|
310
|
+
|
|
311
|
+
---
|
|
312
|
+
|
|
313
|
+
### Discounts / Coupons (6 tools)
|
|
314
|
+
|
|
315
|
+
**Example prompts:**
|
|
316
|
+
- "Show me all my discounts"
|
|
317
|
+
- "Create a 15% discount coupon called SAVE15 for all products"
|
|
318
|
+
- "Create a buy-2-get-1 discount for product abc123"
|
|
319
|
+
- "Deactivate discount abc123"
|
|
320
|
+
- "Validate coupon SAVE15 for an order with 2 items totaling R$200"
|
|
321
|
+
|
|
322
|
+
---
|
|
323
|
+
|
|
324
|
+
### WhatsApp (15 tools)
|
|
325
|
+
|
|
326
|
+
**Example prompts:**
|
|
327
|
+
- "List my WhatsApp sessions"
|
|
328
|
+
- "Create a new WhatsApp session called 'Sales'"
|
|
329
|
+
- "Get a pairing code for session abc123 with phone number 5511999999999"
|
|
330
|
+
- "List all message templates"
|
|
331
|
+
- "Create a template for the 'paid' event: 'Hi {nome}, thanks for purchasing {produto}!'"
|
|
332
|
+
- "Disable template abc123"
|
|
333
|
+
- "Check the WhatsApp delivery status for payment xyz789"
|
|
334
|
+
- "Resend the WhatsApp delivery for payment xyz789"
|
|
335
|
+
- "Send a message to 5511999887766 via session abc123: 'Hello!'"
|
|
336
|
+
|
|
337
|
+
---
|
|
338
|
+
|
|
339
|
+
### Billing (10 tools)
|
|
340
|
+
|
|
341
|
+
**Example prompts:**
|
|
342
|
+
- "What's my current billing balance?"
|
|
343
|
+
- "What's my billing status?"
|
|
344
|
+
- "Show me my invoices"
|
|
345
|
+
- "Pay invoice abc123 via PIX"
|
|
346
|
+
- "Add R$100 in billing credits"
|
|
347
|
+
- "Do I have a card on file?"
|
|
348
|
+
- "Remove my saved card"
|
|
349
|
+
|
|
350
|
+
---
|
|
351
|
+
|
|
352
|
+
### Shipping / MelhorEnvio (7 tools)
|
|
353
|
+
|
|
354
|
+
**Example prompts:**
|
|
355
|
+
- "Calculate shipping to CEP 01001-000 for checkout abc123"
|
|
356
|
+
- "Check the shipping status for payment xyz789"
|
|
357
|
+
- "Generate a shipping label for payment xyz789"
|
|
358
|
+
- "Get the print URL for shipping order abc123"
|
|
359
|
+
|
|
360
|
+
---
|
|
361
|
+
|
|
362
|
+
### Gateway Tokens (3 tools)
|
|
363
|
+
|
|
364
|
+
**Example prompts:**
|
|
365
|
+
- "List my payment gateway tokens"
|
|
366
|
+
- "Add a Stripe token"
|
|
367
|
+
- "Remove token abc123"
|
|
368
|
+
|
|
369
|
+
Supports 26+ gateways: pushinpay, mercadopago, stripe, efibank, amplopay, infinitepay, abacatepay, and more.
|
|
370
|
+
|
|
371
|
+
---
|
|
372
|
+
|
|
373
|
+
### Discord (7 tools)
|
|
374
|
+
|
|
375
|
+
**Example prompts:**
|
|
376
|
+
- "List my Discord connections"
|
|
377
|
+
- "Show me the channels in server 123456"
|
|
378
|
+
- "Show me the roles in server 123456"
|
|
379
|
+
- "Create a private sales notification channel in server 123456"
|
|
380
|
+
- "Update my Discord connection to use Portuguese"
|
|
381
|
+
|
|
382
|
+
---
|
|
383
|
+
|
|
384
|
+
### Dashboard (3 tools)
|
|
385
|
+
|
|
386
|
+
**Example prompts:**
|
|
387
|
+
- "Show me my sales stats for today"
|
|
388
|
+
- "Show me the revenue chart for this month"
|
|
389
|
+
- "Refresh my dashboard cache"
|
|
390
|
+
|
|
391
|
+
---
|
|
392
|
+
|
|
393
|
+
### Custom Domains (5 tools)
|
|
394
|
+
|
|
395
|
+
**Example prompts:**
|
|
396
|
+
- "List my custom domains"
|
|
397
|
+
- "Add domain checkout.mysite.com"
|
|
398
|
+
- "Verify DNS for domain abc123"
|
|
399
|
+
- "Remove domain abc123"
|
|
400
|
+
|
|
401
|
+
---
|
|
402
|
+
|
|
403
|
+
### Rewards / Goals (3 tools)
|
|
404
|
+
|
|
405
|
+
**Example prompts:**
|
|
406
|
+
- "What's my progress on sales milestones?"
|
|
407
|
+
- "Recalculate my reward progress"
|
|
408
|
+
- "Redeem the 10K bracelet reward"
|
|
409
|
+
|
|
410
|
+
---
|
|
411
|
+
|
|
412
|
+
### Profile / Auth (6 tools)
|
|
413
|
+
|
|
414
|
+
**Example prompts:**
|
|
415
|
+
- "Show me my profile"
|
|
416
|
+
- "Update my name to 'John Doe'"
|
|
417
|
+
- "List my support emails"
|
|
418
|
+
- "Add support@mystore.com as a support email"
|
|
419
|
+
- "What's my KYC status?"
|
|
420
|
+
|
|
421
|
+
---
|
|
422
|
+
|
|
423
|
+
### Push Notifications (3 tools)
|
|
424
|
+
|
|
425
|
+
**Example prompts:**
|
|
426
|
+
- "List my registered push devices"
|
|
427
|
+
- "Remove device abc123"
|
|
428
|
+
|
|
429
|
+
---
|
|
430
|
+
|
|
431
|
+
## Price Formats
|
|
432
|
+
|
|
433
|
+
Prices are accepted in two formats:
|
|
434
|
+
|
|
435
|
+
1. **Reais (recommended):** `19.90` = R$19.90 → stored as `1990` cents
|
|
436
|
+
2. **Brazilian format:** `"19,90"` or `"1.990,00"`
|
|
437
|
+
|
|
438
|
+
All prices are stored internally in cents.
|
|
439
|
+
|
|
440
|
+
---
|
|
441
|
+
|
|
442
|
+
## Security Best Practices
|
|
443
|
+
|
|
444
|
+
🔒 **Never share your API key publicly**
|
|
445
|
+
|
|
446
|
+
✅ Always use environment variables
|
|
447
|
+
✅ Revoke compromised keys immediately
|
|
448
|
+
✅ Generate new keys periodically
|
|
449
|
+
❌ Don't hardcode keys in your code
|
|
450
|
+
❌ Don't commit keys to version control
|
|
451
|
+
|
|
452
|
+
---
|
|
453
|
+
|
|
454
|
+
## Rate Limits
|
|
455
|
+
|
|
456
|
+
| Limit | Value |
|
|
457
|
+
|-------|-------|
|
|
458
|
+
| Per hour | 1,000 requests |
|
|
459
|
+
| Per minute | 30 requests |
|
|
460
|
+
|
|
461
|
+
Rate limits are enforced **before** any operation is executed — a blocked request never reaches the database or business logic.
|
|
462
|
+
|
|
463
|
+
When a request is rate limited, the API returns HTTP 429 with a `Retry-After` header and a structured JSON body:
|
|
464
|
+
|
|
465
|
+
**Header:**
|
|
466
|
+
```
|
|
467
|
+
Retry-After: 23
|
|
468
|
+
```
|
|
469
|
+
|
|
470
|
+
**Body:**
|
|
471
|
+
```json
|
|
472
|
+
{
|
|
473
|
+
"error": "rate_limit_exceeded",
|
|
474
|
+
"limit_type": "apikey_strict",
|
|
475
|
+
"limit": 30,
|
|
476
|
+
"window": "1m",
|
|
477
|
+
"retry_after": 23
|
|
478
|
+
}
|
|
479
|
+
```
|
|
480
|
+
|
|
481
|
+
| `limit_type` | Limit | Window | What to do |
|
|
482
|
+
|---|---|---|---|
|
|
483
|
+
| `apikey_strict` | 30 | 1m | Wait `retry_after` seconds, then resume |
|
|
484
|
+
| `apikey` | 1,000 | 1h | Migration too large for one session — split into batches across hours |
|
|
485
|
+
| `product_upload_strict` | 15 | 1m | Slow down file uploads |
|
|
486
|
+
| `product_upload` | 35 | 1h | Max 35 file uploads per hour |
|
|
487
|
+
|
|
488
|
+
Always use the `retry_after` value from the body (or the `Retry-After` header) instead of guessing.
|
|
489
|
+
|
|
490
|
+
### Bulk operations and migrations
|
|
491
|
+
|
|
492
|
+
If you need to create or update many resources in sequence (e.g. importing products, cloning checkouts), follow these guidelines to avoid hitting the limits:
|
|
493
|
+
|
|
494
|
+
- **Space requests by at least 2 seconds** to stay safely under the 30 req/min limit
|
|
495
|
+
- **Cap sustained throughput at ~900 req/hour** to leave headroom below the 1,000/hour ceiling
|
|
496
|
+
- **On a 429 response**, stop immediately, read the `Retry-After` header, wait that many seconds, then resume — do not retry without waiting
|
|
497
|
+
- **Never loop without a delay** — tight loops will exhaust the per-minute quota in under 30 seconds and trigger a full minute of blocking
|
|
498
|
+
|
|
499
|
+
**Recommended pacing for bulk jobs:**
|
|
500
|
+
|
|
501
|
+
```
|
|
502
|
+
for each item:
|
|
503
|
+
call tool()
|
|
504
|
+
if response is 429:
|
|
505
|
+
wait Retry-After seconds
|
|
506
|
+
retry once
|
|
507
|
+
else:
|
|
508
|
+
wait 2 seconds before next call
|
|
509
|
+
```
|
|
510
|
+
|
|
511
|
+
---
|
|
512
|
+
|
|
513
|
+
## Local Development
|
|
514
|
+
|
|
515
|
+
```bash
|
|
516
|
+
git clone https://github.com/gui-drumond/ggcheckout-mcp.git
|
|
517
|
+
cd ggcheckout-mcp
|
|
518
|
+
npm install
|
|
519
|
+
```
|
|
520
|
+
|
|
521
|
+
### .env
|
|
522
|
+
|
|
523
|
+
```bash
|
|
524
|
+
GGCHECKOUT_API_KEY=ggck_live_your_key_here
|
|
525
|
+
GGCHECKOUT_API_URL=http://localhost:3000 # optional, defaults to https://ggcheckout.app
|
|
526
|
+
```
|
|
527
|
+
|
|
528
|
+
### Commands
|
|
529
|
+
|
|
530
|
+
```bash
|
|
531
|
+
npm run dev # Development with hot reload
|
|
532
|
+
npm run build # TypeScript build
|
|
533
|
+
npm start # Run compiled build
|
|
534
|
+
npm test # Unit tests (173 tests)
|
|
535
|
+
npm run test:e2e # E2E against staging (requires .env)
|
|
536
|
+
```
|
|
537
|
+
|
|
538
|
+
### MCP Inspector (Interactive UI)
|
|
539
|
+
|
|
540
|
+
```bash
|
|
541
|
+
GGCHECKOUT_API_KEY=ggck_live_... npx @modelcontextprotocol/inspector -- npx tsx src/index.ts
|
|
542
|
+
```
|
|
543
|
+
|
|
544
|
+
Opens a browser UI to test any tool interactively.
|
|
545
|
+
|
|
546
|
+
---
|
|
547
|
+
|
|
548
|
+
## Troubleshooting
|
|
549
|
+
|
|
550
|
+
### Error: 401 Unauthorized
|
|
551
|
+
|
|
552
|
+
- Check that your API key is correct
|
|
553
|
+
- Ensure the key starts with `ggck_live_`
|
|
554
|
+
- Verify the key hasn't been revoked in your dashboard
|
|
555
|
+
|
|
556
|
+
### Error: 403 Forbidden
|
|
557
|
+
|
|
558
|
+
- You're trying to access a resource that doesn't belong to you
|
|
559
|
+
- API keys are scoped to the user who created them
|
|
560
|
+
|
|
561
|
+
### Error: 404 Not Found
|
|
562
|
+
|
|
563
|
+
- The resource ID doesn't exist
|
|
564
|
+
- For checkouts, use the `uid` (Firestore document ID), not the custom `id` slug
|
|
565
|
+
|
|
566
|
+
### Error: 429 Too Many Requests
|
|
567
|
+
|
|
568
|
+
- Rate limit exceeded (30 req/min or 1,000 req/hour)
|
|
569
|
+
- Read the `Retry-After` response header — it tells you exactly how many seconds to wait
|
|
570
|
+
- For bulk operations, space calls by at least 2 seconds to avoid hitting the limit in the first place
|
|
571
|
+
- See the [Rate Limits](#rate-limits) section for bulk operation guidelines
|
|
572
|
+
|
|
573
|
+
### Error: Invalid price format
|
|
574
|
+
|
|
575
|
+
- Use Reais as a number (`19.90`) or Brazilian format as a string (`"19,90"`)
|
|
576
|
+
- Don't mix formats
|
|
577
|
+
|
|
578
|
+
---
|
|
579
|
+
|
|
580
|
+
## Support
|
|
581
|
+
|
|
582
|
+
- 📧 Email: support@ggcheckout.com
|
|
583
|
+
- 📖 Docs: https://docs.ggcheckout.com
|
|
584
|
+
- 🐛 Issues: https://github.com/gui-drumond/ggcheckout-mcp/issues
|
|
585
|
+
|
|
586
|
+
## License
|
|
587
|
+
|
|
588
|
+
MIT © GG Checkout Team
|