@codespar/mcp-nequi 0.1.0 → 0.2.0-alpha.1

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/dist/index.d.ts CHANGED
@@ -2,13 +2,23 @@
2
2
  /**
3
3
  * MCP Server for Nequi — Colombian digital wallet (50M+ users, by Bancolombia).
4
4
  *
5
- * Tools:
5
+ * Tools (16):
6
6
  * - create_push_payment: Send a push payment notification to a Nequi user
7
7
  * - get_payment_status: Check payment status
8
- * - create_qr_payment: Generate a QR code payment
8
+ * - create_qr_payment: Generate a QR code payment (dynamic)
9
+ * - create_static_qr: Generate a static (reusable) QR code
9
10
  * - reverse_payment: Reverse a payment
11
+ * - reverse_transaction: Reverse any transaction by ID
10
12
  * - get_subscription: Get subscription details
11
13
  * - unsubscribe: Cancel a subscription
14
+ * - validate_phone: Check if a phone number is enrolled in Nequi
15
+ * - notify_unregistered_payment: Notify a non-Nequi user with payment instructions
16
+ * - list_transactions: List transactions for a merchant in a date range
17
+ * - get_balance: Get merchant account balance
18
+ * - schedule_payment: Schedule a payment for a future date
19
+ * - authorize_recurring_charge: Authorize a recurring charge agreement
20
+ * - get_merchant_info: Retrieve merchant business profile
21
+ * - get_settlement: Query settlement for a given date
12
22
  *
13
23
  * Environment:
14
24
  * NEQUI_API_KEY — API key
package/dist/index.js CHANGED
@@ -2,13 +2,23 @@
2
2
  /**
3
3
  * MCP Server for Nequi — Colombian digital wallet (50M+ users, by Bancolombia).
4
4
  *
5
- * Tools:
5
+ * Tools (16):
6
6
  * - create_push_payment: Send a push payment notification to a Nequi user
7
7
  * - get_payment_status: Check payment status
8
- * - create_qr_payment: Generate a QR code payment
8
+ * - create_qr_payment: Generate a QR code payment (dynamic)
9
+ * - create_static_qr: Generate a static (reusable) QR code
9
10
  * - reverse_payment: Reverse a payment
11
+ * - reverse_transaction: Reverse any transaction by ID
10
12
  * - get_subscription: Get subscription details
11
13
  * - unsubscribe: Cancel a subscription
14
+ * - validate_phone: Check if a phone number is enrolled in Nequi
15
+ * - notify_unregistered_payment: Notify a non-Nequi user with payment instructions
16
+ * - list_transactions: List transactions for a merchant in a date range
17
+ * - get_balance: Get merchant account balance
18
+ * - schedule_payment: Schedule a payment for a future date
19
+ * - authorize_recurring_charge: Authorize a recurring charge agreement
20
+ * - get_merchant_info: Retrieve merchant business profile
21
+ * - get_settlement: Query settlement for a given date
12
22
  *
13
23
  * Environment:
14
24
  * NEQUI_API_KEY — API key
@@ -67,7 +77,7 @@ async function nequiRequest(method, path, body) {
67
77
  }
68
78
  return res.json();
69
79
  }
70
- const server = new Server({ name: "mcp-nequi", version: "0.1.0" }, { capabilities: { tools: {} } });
80
+ const server = new Server({ name: "mcp-nequi", version: "0.2.0-alpha.1" }, { capabilities: { tools: {} } });
71
81
  server.setRequestHandler(ListToolsRequestSchema, async () => ({
72
82
  tools: [
73
83
  {
@@ -153,6 +163,140 @@ server.setRequestHandler(ListToolsRequestSchema, async () => ({
153
163
  required: ["phone_number", "code", "token"],
154
164
  },
155
165
  },
166
+ {
167
+ name: "create_static_qr",
168
+ description: "Generate a static (reusable) Nequi QR code for a merchant",
169
+ inputSchema: {
170
+ type: "object",
171
+ properties: {
172
+ code: { type: "string", description: "Merchant QR code identifier" },
173
+ merchant_id: { type: "string", description: "Merchant ID" },
174
+ message: { type: "string", description: "QR description" },
175
+ },
176
+ required: ["code"],
177
+ },
178
+ },
179
+ {
180
+ name: "reverse_transaction",
181
+ description: "Reverse any Nequi transaction by transaction ID (refund flow)",
182
+ inputSchema: {
183
+ type: "object",
184
+ properties: {
185
+ transaction_id: { type: "string", description: "Original transaction ID" },
186
+ merchant_id: { type: "string", description: "Merchant ID" },
187
+ value: { type: "string", description: "Amount to reverse in COP" },
188
+ reason: { type: "string", description: "Reversal reason" },
189
+ },
190
+ required: ["transaction_id", "value"],
191
+ },
192
+ },
193
+ {
194
+ name: "validate_phone",
195
+ description: "Check whether a phone number is enrolled in Nequi",
196
+ inputSchema: {
197
+ type: "object",
198
+ properties: {
199
+ phone_number: { type: "string", description: "Phone number (10 digits, CO)" },
200
+ merchant_id: { type: "string", description: "Merchant ID" },
201
+ },
202
+ required: ["phone_number"],
203
+ },
204
+ },
205
+ {
206
+ name: "notify_unregistered_payment",
207
+ description: "Notify a non-Nequi recipient with instructions to claim a payment",
208
+ inputSchema: {
209
+ type: "object",
210
+ properties: {
211
+ phone_number: { type: "string", description: "Recipient phone number" },
212
+ code: { type: "string", description: "Payment code" },
213
+ value: { type: "string", description: "Amount in COP" },
214
+ merchant_id: { type: "string", description: "Merchant ID" },
215
+ message: { type: "string", description: "Notification message" },
216
+ },
217
+ required: ["phone_number", "code", "value"],
218
+ },
219
+ },
220
+ {
221
+ name: "list_transactions",
222
+ description: "List transactions for a merchant within a date range",
223
+ inputSchema: {
224
+ type: "object",
225
+ properties: {
226
+ merchant_id: { type: "string", description: "Merchant ID" },
227
+ date_from: { type: "string", description: "Start date (ISO 8601)" },
228
+ date_to: { type: "string", description: "End date (ISO 8601)" },
229
+ status: { type: "string", description: "Optional status filter" },
230
+ },
231
+ required: ["date_from", "date_to"],
232
+ },
233
+ },
234
+ {
235
+ name: "get_balance",
236
+ description: "Get the merchant's own Nequi account balance",
237
+ inputSchema: {
238
+ type: "object",
239
+ properties: {
240
+ merchant_id: { type: "string", description: "Merchant ID" },
241
+ },
242
+ required: [],
243
+ },
244
+ },
245
+ {
246
+ name: "schedule_payment",
247
+ description: "Schedule a Nequi push payment for a future date",
248
+ inputSchema: {
249
+ type: "object",
250
+ properties: {
251
+ phone_number: { type: "string", description: "Nequi phone number" },
252
+ code: { type: "string", description: "Payment code" },
253
+ value: { type: "string", description: "Amount in COP" },
254
+ merchant_id: { type: "string", description: "Merchant ID" },
255
+ scheduled_date: { type: "string", description: "ISO 8601 date to execute" },
256
+ message: { type: "string", description: "Description" },
257
+ },
258
+ required: ["phone_number", "code", "value", "scheduled_date"],
259
+ },
260
+ },
261
+ {
262
+ name: "authorize_recurring_charge",
263
+ description: "Authorize a recurring charge agreement against a Nequi user",
264
+ inputSchema: {
265
+ type: "object",
266
+ properties: {
267
+ phone_number: { type: "string", description: "Nequi phone number" },
268
+ code: { type: "string", description: "Subscription/agreement code" },
269
+ merchant_id: { type: "string", description: "Merchant ID" },
270
+ max_value: { type: "string", description: "Max charge amount in COP" },
271
+ frequency: { type: "string", description: "Frequency: monthly|weekly|daily" },
272
+ message: { type: "string", description: "Description" },
273
+ },
274
+ required: ["phone_number", "code", "max_value", "frequency"],
275
+ },
276
+ },
277
+ {
278
+ name: "get_merchant_info",
279
+ description: "Retrieve registered merchant business profile",
280
+ inputSchema: {
281
+ type: "object",
282
+ properties: {
283
+ merchant_id: { type: "string", description: "Merchant ID" },
284
+ },
285
+ required: [],
286
+ },
287
+ },
288
+ {
289
+ name: "get_settlement",
290
+ description: "Query settlement (liquidation) for a given date",
291
+ inputSchema: {
292
+ type: "object",
293
+ properties: {
294
+ merchant_id: { type: "string", description: "Merchant ID" },
295
+ settlement_date: { type: "string", description: "Settlement date (YYYY-MM-DD)" },
296
+ },
297
+ required: ["settlement_date"],
298
+ },
299
+ },
156
300
  ],
157
301
  }));
158
302
  server.setRequestHandler(CallToolRequestSchema, async (request) => {
@@ -254,6 +398,160 @@ server.setRequestHandler(CallToolRequestSchema, async (request) => {
254
398
  },
255
399
  },
256
400
  }), null, 2) }] };
401
+ case "create_static_qr":
402
+ return { content: [{ type: "text", text: JSON.stringify(await nequiRequest("POST", "/payments/v2/-services-paymentservice-generatestaticcodeqr", {
403
+ RequestMessage: {
404
+ RequestHeader: { Channel: "PNP04-C001", RequestDate: new Date().toISOString(), MessageID: `MCP-${Date.now()}`, ClientID: CLIENT_ID },
405
+ RequestBody: {
406
+ any: {
407
+ generateStaticCodeQRRQ: {
408
+ code: args?.code,
409
+ merchantId: args?.merchant_id,
410
+ message: args?.message,
411
+ },
412
+ },
413
+ },
414
+ },
415
+ }), null, 2) }] };
416
+ case "reverse_transaction":
417
+ return { content: [{ type: "text", text: JSON.stringify(await nequiRequest("POST", "/payments/v2/-services-reverseservices-reversetransactionbyid", {
418
+ RequestMessage: {
419
+ RequestHeader: { Channel: "PNP04-C001", RequestDate: new Date().toISOString(), MessageID: `MCP-${Date.now()}`, ClientID: CLIENT_ID },
420
+ RequestBody: {
421
+ any: {
422
+ reverseTransactionByIdRQ: {
423
+ transactionId: args?.transaction_id,
424
+ merchantId: args?.merchant_id,
425
+ value: args?.value,
426
+ reason: args?.reason,
427
+ },
428
+ },
429
+ },
430
+ },
431
+ }), null, 2) }] };
432
+ case "validate_phone":
433
+ return { content: [{ type: "text", text: JSON.stringify(await nequiRequest("POST", "/payments/v2/-services-clientservice-validateclient", {
434
+ RequestMessage: {
435
+ RequestHeader: { Channel: "PNP04-C001", RequestDate: new Date().toISOString(), MessageID: `MCP-${Date.now()}`, ClientID: CLIENT_ID },
436
+ RequestBody: {
437
+ any: {
438
+ validateClientRQ: {
439
+ phoneNumber: args?.phone_number,
440
+ merchantId: args?.merchant_id,
441
+ },
442
+ },
443
+ },
444
+ },
445
+ }), null, 2) }] };
446
+ case "notify_unregistered_payment":
447
+ return { content: [{ type: "text", text: JSON.stringify(await nequiRequest("POST", "/payments/v2/-services-paymentservice-notifyunregistered", {
448
+ RequestMessage: {
449
+ RequestHeader: { Channel: "PNP04-C001", RequestDate: new Date().toISOString(), MessageID: `MCP-${Date.now()}`, ClientID: CLIENT_ID },
450
+ RequestBody: {
451
+ any: {
452
+ notifyUnregisteredRQ: {
453
+ phoneNumber: args?.phone_number,
454
+ code: args?.code,
455
+ value: args?.value,
456
+ merchantId: args?.merchant_id,
457
+ message: args?.message,
458
+ },
459
+ },
460
+ },
461
+ },
462
+ }), null, 2) }] };
463
+ case "list_transactions":
464
+ return { content: [{ type: "text", text: JSON.stringify(await nequiRequest("POST", "/payments/v2/-services-reportservice-listtransactions", {
465
+ RequestMessage: {
466
+ RequestHeader: { Channel: "PNP04-C001", RequestDate: new Date().toISOString(), MessageID: `MCP-${Date.now()}`, ClientID: CLIENT_ID },
467
+ RequestBody: {
468
+ any: {
469
+ listTransactionsRQ: {
470
+ merchantId: args?.merchant_id,
471
+ dateFrom: args?.date_from,
472
+ dateTo: args?.date_to,
473
+ status: args?.status,
474
+ },
475
+ },
476
+ },
477
+ },
478
+ }), null, 2) }] };
479
+ case "get_balance":
480
+ return { content: [{ type: "text", text: JSON.stringify(await nequiRequest("POST", "/payments/v2/-services-merchantservice-getbalance", {
481
+ RequestMessage: {
482
+ RequestHeader: { Channel: "PNP04-C001", RequestDate: new Date().toISOString(), MessageID: `MCP-${Date.now()}`, ClientID: CLIENT_ID },
483
+ RequestBody: {
484
+ any: {
485
+ getBalanceRQ: {
486
+ merchantId: args?.merchant_id,
487
+ },
488
+ },
489
+ },
490
+ },
491
+ }), null, 2) }] };
492
+ case "schedule_payment":
493
+ return { content: [{ type: "text", text: JSON.stringify(await nequiRequest("POST", "/payments/v2/-services-paymentservice-schedulepayment", {
494
+ RequestMessage: {
495
+ RequestHeader: { Channel: "PNP04-C001", RequestDate: new Date().toISOString(), MessageID: `MCP-${Date.now()}`, ClientID: CLIENT_ID },
496
+ RequestBody: {
497
+ any: {
498
+ schedulePaymentRQ: {
499
+ phoneNumber: args?.phone_number,
500
+ code: args?.code,
501
+ value: args?.value,
502
+ merchantId: args?.merchant_id,
503
+ scheduledDate: args?.scheduled_date,
504
+ message: args?.message,
505
+ },
506
+ },
507
+ },
508
+ },
509
+ }), null, 2) }] };
510
+ case "authorize_recurring_charge":
511
+ return { content: [{ type: "text", text: JSON.stringify(await nequiRequest("POST", "/payments/v2/-services-subscriptionpaymentservice-authorizerecurring", {
512
+ RequestMessage: {
513
+ RequestHeader: { Channel: "PNP04-C001", RequestDate: new Date().toISOString(), MessageID: `MCP-${Date.now()}`, ClientID: CLIENT_ID },
514
+ RequestBody: {
515
+ any: {
516
+ authorizeRecurringRQ: {
517
+ phoneNumber: args?.phone_number,
518
+ code: args?.code,
519
+ merchantId: args?.merchant_id,
520
+ maxValue: args?.max_value,
521
+ frequency: args?.frequency,
522
+ message: args?.message,
523
+ },
524
+ },
525
+ },
526
+ },
527
+ }), null, 2) }] };
528
+ case "get_merchant_info":
529
+ return { content: [{ type: "text", text: JSON.stringify(await nequiRequest("POST", "/payments/v2/-services-merchantservice-getmerchantinfo", {
530
+ RequestMessage: {
531
+ RequestHeader: { Channel: "PNP04-C001", RequestDate: new Date().toISOString(), MessageID: `MCP-${Date.now()}`, ClientID: CLIENT_ID },
532
+ RequestBody: {
533
+ any: {
534
+ getMerchantInfoRQ: {
535
+ merchantId: args?.merchant_id,
536
+ },
537
+ },
538
+ },
539
+ },
540
+ }), null, 2) }] };
541
+ case "get_settlement":
542
+ return { content: [{ type: "text", text: JSON.stringify(await nequiRequest("POST", "/payments/v2/-services-reportservice-getsettlement", {
543
+ RequestMessage: {
544
+ RequestHeader: { Channel: "PNP04-C001", RequestDate: new Date().toISOString(), MessageID: `MCP-${Date.now()}`, ClientID: CLIENT_ID },
545
+ RequestBody: {
546
+ any: {
547
+ getSettlementRQ: {
548
+ merchantId: args?.merchant_id,
549
+ settlementDate: args?.settlement_date,
550
+ },
551
+ },
552
+ },
553
+ },
554
+ }), null, 2) }] };
257
555
  default:
258
556
  return { content: [{ type: "text", text: `Unknown tool: ${name}` }], isError: true };
259
557
  }
@@ -280,7 +578,7 @@ async function main() {
280
578
  const t = new StreamableHTTPServerTransport({ sessionIdGenerator: () => randomUUID(), onsessioninitialized: (id) => { transports.set(id, t); } });
281
579
  t.onclose = () => { if (t.sessionId)
282
580
  transports.delete(t.sessionId); };
283
- const s = new Server({ name: "mcp-nequi", version: "0.1.0" }, { capabilities: { tools: {} } });
581
+ const s = new Server({ name: "mcp-nequi", version: "0.2.0-alpha.1" }, { capabilities: { tools: {} } });
284
582
  server._requestHandlers.forEach((v, k) => s._requestHandlers.set(k, v));
285
583
  server._notificationHandlers?.forEach((v, k) => s._notificationHandlers.set(k, v));
286
584
  await s.connect(t);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@codespar/mcp-nequi",
3
- "version": "0.1.0",
3
+ "version": "0.2.0-alpha.1",
4
4
  "description": "MCP server for Nequi — Colombian digital wallet (by Bancolombia)",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",