nomba-mcp 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +983 -0
- package/build/client.d.ts +26 -0
- package/build/client.js +120 -0
- package/build/client.js.map +1 -0
- package/build/index.d.ts +2 -0
- package/build/index.js +53 -0
- package/build/index.js.map +1 -0
- package/build/resources/bank-list.d.ts +3 -0
- package/build/resources/bank-list.js +26 -0
- package/build/resources/bank-list.js.map +1 -0
- package/build/tools/accounts.d.ts +3 -0
- package/build/tools/accounts.js +88 -0
- package/build/tools/accounts.js.map +1 -0
- package/build/tools/airtime.d.ts +3 -0
- package/build/tools/airtime.js +80 -0
- package/build/tools/airtime.js.map +1 -0
- package/build/tools/bills/betting.d.ts +3 -0
- package/build/tools/bills/betting.js +45 -0
- package/build/tools/bills/betting.js.map +1 -0
- package/build/tools/bills/cable.d.ts +3 -0
- package/build/tools/bills/cable.js +68 -0
- package/build/tools/bills/cable.js.map +1 -0
- package/build/tools/bills/electricity.d.ts +3 -0
- package/build/tools/bills/electricity.js +69 -0
- package/build/tools/bills/electricity.js.map +1 -0
- package/build/tools/bills/index.d.ts +3 -0
- package/build/tools/bills/index.js +9 -0
- package/build/tools/bills/index.js.map +1 -0
- package/build/tools/bills.d.ts +3 -0
- package/build/tools/bills.js +246 -0
- package/build/tools/bills.js.map +1 -0
- package/build/tools/checkout.d.ts +3 -0
- package/build/tools/checkout.js +138 -0
- package/build/tools/checkout.js.map +1 -0
- package/build/tools/sub-accounts.d.ts +3 -0
- package/build/tools/sub-accounts.js +174 -0
- package/build/tools/sub-accounts.js.map +1 -0
- package/build/tools/transactions.d.ts +3 -0
- package/build/tools/transactions.js +115 -0
- package/build/tools/transactions.js.map +1 -0
- package/build/tools/transfers.d.ts +3 -0
- package/build/tools/transfers.js +97 -0
- package/build/tools/transfers.js.map +1 -0
- package/build/tools/virtual-accounts.d.ts +3 -0
- package/build/tools/virtual-accounts.js +131 -0
- package/build/tools/virtual-accounts.js.map +1 -0
- package/build/utils.d.ts +18 -0
- package/build/utils.js +35 -0
- package/build/utils.js.map +1 -0
- package/package.json +58 -0
|
@@ -0,0 +1,174 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { jsonResponse, errorResponse, logToolCall, buildParams, } from "../utils.js";
|
|
3
|
+
export function registerSubAccountTools(server, client) {
|
|
4
|
+
server.registerTool("nomba_create_sub_account", {
|
|
5
|
+
title: "Create Sub-Account",
|
|
6
|
+
description: "Create a new sub-account under the parent Nomba account. Sub-accounts can have their own balances and make transactions.",
|
|
7
|
+
inputSchema: {
|
|
8
|
+
accountName: z
|
|
9
|
+
.string()
|
|
10
|
+
.describe("Name for the sub-account"),
|
|
11
|
+
email: z
|
|
12
|
+
.string()
|
|
13
|
+
.email()
|
|
14
|
+
.optional()
|
|
15
|
+
.describe("Email address for the sub-account holder"),
|
|
16
|
+
phoneNumber: z
|
|
17
|
+
.string()
|
|
18
|
+
.optional()
|
|
19
|
+
.describe("Phone number for the sub-account holder"),
|
|
20
|
+
},
|
|
21
|
+
}, async ({ accountName, email, phoneNumber }) => {
|
|
22
|
+
logToolCall("nomba_create_sub_account", { accountName });
|
|
23
|
+
try {
|
|
24
|
+
const body = { accountName };
|
|
25
|
+
if (email)
|
|
26
|
+
body.email = email;
|
|
27
|
+
if (phoneNumber)
|
|
28
|
+
body.phoneNumber = phoneNumber;
|
|
29
|
+
const result = await client.post("/v1/accounts", body);
|
|
30
|
+
return jsonResponse(result);
|
|
31
|
+
}
|
|
32
|
+
catch (error) {
|
|
33
|
+
return errorResponse(error);
|
|
34
|
+
}
|
|
35
|
+
});
|
|
36
|
+
server.registerTool("nomba_list_sub_accounts", {
|
|
37
|
+
title: "List Sub-Accounts",
|
|
38
|
+
description: "List all sub-accounts under the parent Nomba account. Supports pagination.",
|
|
39
|
+
inputSchema: {
|
|
40
|
+
limit: z
|
|
41
|
+
.number()
|
|
42
|
+
.int()
|
|
43
|
+
.positive()
|
|
44
|
+
.max(50)
|
|
45
|
+
.optional()
|
|
46
|
+
.describe("Number of results per page (max 50)"),
|
|
47
|
+
cursor: z
|
|
48
|
+
.string()
|
|
49
|
+
.optional()
|
|
50
|
+
.describe("Pagination cursor from a previous response"),
|
|
51
|
+
},
|
|
52
|
+
}, async ({ limit, cursor }) => {
|
|
53
|
+
logToolCall("nomba_list_sub_accounts", { limit, cursor });
|
|
54
|
+
try {
|
|
55
|
+
const params = buildParams({ limit, cursor });
|
|
56
|
+
const result = await client.get("/v1/accounts", params);
|
|
57
|
+
return jsonResponse(result);
|
|
58
|
+
}
|
|
59
|
+
catch (error) {
|
|
60
|
+
return errorResponse(error);
|
|
61
|
+
}
|
|
62
|
+
});
|
|
63
|
+
server.registerTool("nomba_get_sub_account", {
|
|
64
|
+
title: "Get Sub-Account",
|
|
65
|
+
description: "Fetch details of a specific sub-account by its account ID.",
|
|
66
|
+
inputSchema: {
|
|
67
|
+
accountId: z
|
|
68
|
+
.string()
|
|
69
|
+
.describe("The sub-account ID"),
|
|
70
|
+
},
|
|
71
|
+
}, async ({ accountId }) => {
|
|
72
|
+
logToolCall("nomba_get_sub_account", { accountId });
|
|
73
|
+
try {
|
|
74
|
+
const result = await client.get(`/v1/accounts/${accountId}`);
|
|
75
|
+
return jsonResponse(result);
|
|
76
|
+
}
|
|
77
|
+
catch (error) {
|
|
78
|
+
return errorResponse(error);
|
|
79
|
+
}
|
|
80
|
+
});
|
|
81
|
+
server.registerTool("nomba_get_sub_account_balance", {
|
|
82
|
+
title: "Get Sub-Account Balance",
|
|
83
|
+
description: "Fetch the current balance of a specific sub-account. Returns available balance in NGN.",
|
|
84
|
+
inputSchema: {
|
|
85
|
+
accountId: z
|
|
86
|
+
.string()
|
|
87
|
+
.describe("The sub-account ID"),
|
|
88
|
+
},
|
|
89
|
+
}, async ({ accountId }) => {
|
|
90
|
+
logToolCall("nomba_get_sub_account_balance", { accountId });
|
|
91
|
+
try {
|
|
92
|
+
const result = await client.get(`/v1/accounts/${accountId}/balance`);
|
|
93
|
+
return jsonResponse(result);
|
|
94
|
+
}
|
|
95
|
+
catch (error) {
|
|
96
|
+
return errorResponse(error);
|
|
97
|
+
}
|
|
98
|
+
});
|
|
99
|
+
server.registerTool("nomba_update_sub_account", {
|
|
100
|
+
title: "Update Sub-Account",
|
|
101
|
+
description: "Update the details of an existing sub-account.",
|
|
102
|
+
inputSchema: {
|
|
103
|
+
accountId: z
|
|
104
|
+
.string()
|
|
105
|
+
.describe("The sub-account ID to update"),
|
|
106
|
+
accountName: z
|
|
107
|
+
.string()
|
|
108
|
+
.optional()
|
|
109
|
+
.describe("New account name"),
|
|
110
|
+
email: z
|
|
111
|
+
.string()
|
|
112
|
+
.email()
|
|
113
|
+
.optional()
|
|
114
|
+
.describe("New email address"),
|
|
115
|
+
phoneNumber: z
|
|
116
|
+
.string()
|
|
117
|
+
.optional()
|
|
118
|
+
.describe("New phone number"),
|
|
119
|
+
},
|
|
120
|
+
}, async ({ accountId, accountName, email, phoneNumber }) => {
|
|
121
|
+
logToolCall("nomba_update_sub_account", { accountId });
|
|
122
|
+
try {
|
|
123
|
+
const body = {};
|
|
124
|
+
if (accountName)
|
|
125
|
+
body.accountName = accountName;
|
|
126
|
+
if (email)
|
|
127
|
+
body.email = email;
|
|
128
|
+
if (phoneNumber)
|
|
129
|
+
body.phoneNumber = phoneNumber;
|
|
130
|
+
const result = await client.put(`/v1/accounts/${accountId}`, body);
|
|
131
|
+
return jsonResponse(result);
|
|
132
|
+
}
|
|
133
|
+
catch (error) {
|
|
134
|
+
return errorResponse(error);
|
|
135
|
+
}
|
|
136
|
+
});
|
|
137
|
+
server.registerTool("nomba_suspend_sub_account", {
|
|
138
|
+
title: "Suspend Sub-Account",
|
|
139
|
+
description: "Suspend a sub-account. Suspended accounts cannot make or receive transactions.",
|
|
140
|
+
inputSchema: {
|
|
141
|
+
accountId: z
|
|
142
|
+
.string()
|
|
143
|
+
.describe("The sub-account ID to suspend"),
|
|
144
|
+
},
|
|
145
|
+
}, async ({ accountId }) => {
|
|
146
|
+
logToolCall("nomba_suspend_sub_account", { accountId });
|
|
147
|
+
try {
|
|
148
|
+
const result = await client.put(`/v1/accounts/${accountId}/suspend`, {});
|
|
149
|
+
return jsonResponse(result);
|
|
150
|
+
}
|
|
151
|
+
catch (error) {
|
|
152
|
+
return errorResponse(error);
|
|
153
|
+
}
|
|
154
|
+
});
|
|
155
|
+
server.registerTool("nomba_reactivate_sub_account", {
|
|
156
|
+
title: "Reactivate Sub-Account",
|
|
157
|
+
description: "Reactivate a previously suspended sub-account.",
|
|
158
|
+
inputSchema: {
|
|
159
|
+
accountId: z
|
|
160
|
+
.string()
|
|
161
|
+
.describe("The sub-account ID to reactivate"),
|
|
162
|
+
},
|
|
163
|
+
}, async ({ accountId }) => {
|
|
164
|
+
logToolCall("nomba_reactivate_sub_account", { accountId });
|
|
165
|
+
try {
|
|
166
|
+
const result = await client.put(`/v1/accounts/${accountId}/reactivate`, {});
|
|
167
|
+
return jsonResponse(result);
|
|
168
|
+
}
|
|
169
|
+
catch (error) {
|
|
170
|
+
return errorResponse(error);
|
|
171
|
+
}
|
|
172
|
+
});
|
|
173
|
+
}
|
|
174
|
+
//# sourceMappingURL=sub-accounts.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sub-accounts.js","sourceRoot":"","sources":["../../src/tools/sub-accounts.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { jsonResponse, errorResponse, logToolCall, buildParams } from "../utils.js";
|
|
3
|
+
export function registerTransactionTools(server, client) {
|
|
4
|
+
server.registerTool("nomba_list_bank_transactions", {
|
|
5
|
+
title: "List Bank Transactions",
|
|
6
|
+
description: "Fetch bank transactions for the parent Nomba account. Supports filtering by date range and pagination. Returns transaction amounts, types (CREDIT/DEBIT), statuses, and metadata.",
|
|
7
|
+
inputSchema: {
|
|
8
|
+
limit: z
|
|
9
|
+
.number()
|
|
10
|
+
.int()
|
|
11
|
+
.positive()
|
|
12
|
+
.max(50)
|
|
13
|
+
.optional()
|
|
14
|
+
.describe("Number of results per page (max 50)"),
|
|
15
|
+
cursor: z
|
|
16
|
+
.string()
|
|
17
|
+
.optional()
|
|
18
|
+
.describe("Pagination cursor from a previous response"),
|
|
19
|
+
dateFrom: z
|
|
20
|
+
.string()
|
|
21
|
+
.optional()
|
|
22
|
+
.describe("Start date in UTC format (e.g., 2024-01-01T00:00:00Z)"),
|
|
23
|
+
dateTo: z
|
|
24
|
+
.string()
|
|
25
|
+
.optional()
|
|
26
|
+
.describe("End date in UTC format (e.g., 2024-12-31T23:59:59Z)"),
|
|
27
|
+
},
|
|
28
|
+
}, async ({ limit, cursor, dateFrom, dateTo }) => {
|
|
29
|
+
logToolCall("nomba_list_bank_transactions", { limit, dateFrom, dateTo });
|
|
30
|
+
try {
|
|
31
|
+
const params = buildParams({ limit, cursor, dateFrom, dateTo });
|
|
32
|
+
const result = await client.get("/v1/transactions/bank", params);
|
|
33
|
+
return jsonResponse(result);
|
|
34
|
+
}
|
|
35
|
+
catch (error) {
|
|
36
|
+
return errorResponse(error);
|
|
37
|
+
}
|
|
38
|
+
});
|
|
39
|
+
server.registerTool("nomba_requery_transaction", {
|
|
40
|
+
title: "Requery Transaction",
|
|
41
|
+
description: "Requery/check the status of a specific transaction using its session ID. Useful for verifying if a transfer or payment was successful.",
|
|
42
|
+
inputSchema: {
|
|
43
|
+
sessionId: z
|
|
44
|
+
.string()
|
|
45
|
+
.describe("The session ID of the transaction to requery"),
|
|
46
|
+
},
|
|
47
|
+
}, async ({ sessionId }) => {
|
|
48
|
+
logToolCall("nomba_requery_transaction", { sessionId });
|
|
49
|
+
try {
|
|
50
|
+
const result = await client.post("/v1/transactions/accounts", { sessionId });
|
|
51
|
+
return jsonResponse(result);
|
|
52
|
+
}
|
|
53
|
+
catch (error) {
|
|
54
|
+
return errorResponse(error);
|
|
55
|
+
}
|
|
56
|
+
});
|
|
57
|
+
server.registerTool("nomba_get_transaction", {
|
|
58
|
+
title: "Get Transaction Details",
|
|
59
|
+
description: "Fetch details of a single transaction by its transaction ID.",
|
|
60
|
+
inputSchema: {
|
|
61
|
+
transactionId: z
|
|
62
|
+
.string()
|
|
63
|
+
.describe("The transaction ID to look up"),
|
|
64
|
+
},
|
|
65
|
+
}, async ({ transactionId }) => {
|
|
66
|
+
logToolCall("nomba_get_transaction", { transactionId });
|
|
67
|
+
try {
|
|
68
|
+
const result = await client.get(`/v1/transactions/${transactionId}`);
|
|
69
|
+
return jsonResponse(result);
|
|
70
|
+
}
|
|
71
|
+
catch (error) {
|
|
72
|
+
return errorResponse(error);
|
|
73
|
+
}
|
|
74
|
+
});
|
|
75
|
+
server.registerTool("nomba_filter_transactions", {
|
|
76
|
+
title: "Filter Transactions",
|
|
77
|
+
description: "Filter transactions on the parent account with advanced filters. Supports filtering by type (CREDIT/DEBIT), date range, and pagination.",
|
|
78
|
+
inputSchema: {
|
|
79
|
+
type: z
|
|
80
|
+
.enum(["CREDIT", "DEBIT"])
|
|
81
|
+
.optional()
|
|
82
|
+
.describe("Filter by transaction type: CREDIT or DEBIT"),
|
|
83
|
+
limit: z
|
|
84
|
+
.number()
|
|
85
|
+
.int()
|
|
86
|
+
.positive()
|
|
87
|
+
.max(50)
|
|
88
|
+
.optional()
|
|
89
|
+
.describe("Number of results per page (max 50)"),
|
|
90
|
+
cursor: z
|
|
91
|
+
.string()
|
|
92
|
+
.optional()
|
|
93
|
+
.describe("Pagination cursor from a previous response"),
|
|
94
|
+
dateFrom: z
|
|
95
|
+
.string()
|
|
96
|
+
.optional()
|
|
97
|
+
.describe("Start date in UTC format (e.g., 2024-01-01T00:00:00Z)"),
|
|
98
|
+
dateTo: z
|
|
99
|
+
.string()
|
|
100
|
+
.optional()
|
|
101
|
+
.describe("End date in UTC format (e.g., 2024-12-31T23:59:59Z)"),
|
|
102
|
+
},
|
|
103
|
+
}, async ({ type, limit, cursor, dateFrom, dateTo }) => {
|
|
104
|
+
logToolCall("nomba_filter_transactions", { type, limit, dateFrom, dateTo });
|
|
105
|
+
try {
|
|
106
|
+
const params = buildParams({ type, limit, cursor, dateFrom, dateTo });
|
|
107
|
+
const result = await client.get("/v1/transactions/filter", params);
|
|
108
|
+
return jsonResponse(result);
|
|
109
|
+
}
|
|
110
|
+
catch (error) {
|
|
111
|
+
return errorResponse(error);
|
|
112
|
+
}
|
|
113
|
+
});
|
|
114
|
+
}
|
|
115
|
+
//# sourceMappingURL=transactions.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transactions.js","sourceRoot":"","sources":["../../src/tools/transactions.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { jsonResponse, errorResponse, logToolCall } from "../utils.js";
|
|
3
|
+
export function registerTransferTools(server, client) {
|
|
4
|
+
server.registerTool("nomba_list_banks", {
|
|
5
|
+
title: "List Bank Codes",
|
|
6
|
+
description: "Fetch the list of all Nigerian bank codes and names. Use this before making bank transfers to get the correct bankCode for the recipient's bank.",
|
|
7
|
+
}, async () => {
|
|
8
|
+
logToolCall("nomba_list_banks");
|
|
9
|
+
try {
|
|
10
|
+
const result = await client.get("/v1/transfers/banks");
|
|
11
|
+
return jsonResponse(result);
|
|
12
|
+
}
|
|
13
|
+
catch (error) {
|
|
14
|
+
return errorResponse(error);
|
|
15
|
+
}
|
|
16
|
+
});
|
|
17
|
+
server.registerTool("nomba_lookup_bank_account", {
|
|
18
|
+
title: "Lookup Bank Account",
|
|
19
|
+
description: "Validate a bank account by looking up the account holder's name. Always call this before initiating a bank transfer to confirm the recipient is correct.",
|
|
20
|
+
inputSchema: {
|
|
21
|
+
accountNumber: z
|
|
22
|
+
.string()
|
|
23
|
+
.length(10)
|
|
24
|
+
.describe("10-digit Nigerian bank account number"),
|
|
25
|
+
bankCode: z
|
|
26
|
+
.string()
|
|
27
|
+
.describe("Bank code obtained from the nomba_list_banks tool"),
|
|
28
|
+
},
|
|
29
|
+
}, async ({ accountNumber, bankCode }) => {
|
|
30
|
+
logToolCall("nomba_lookup_bank_account", { accountNumber, bankCode });
|
|
31
|
+
try {
|
|
32
|
+
const result = await client.post("/v1/transfers/bank-account-lookup", { accountNumber, bankCode });
|
|
33
|
+
return jsonResponse(result);
|
|
34
|
+
}
|
|
35
|
+
catch (error) {
|
|
36
|
+
return errorResponse(error);
|
|
37
|
+
}
|
|
38
|
+
});
|
|
39
|
+
server.registerTool("nomba_transfer_to_bank", {
|
|
40
|
+
title: "Transfer to Bank Account",
|
|
41
|
+
description:
|
|
42
|
+
// Nomba is NGN-only
|
|
43
|
+
"Transfer funds from the Nomba account to an external Nigerian bank account. Amount is in Naira (NGN). Always use nomba_lookup_bank_account first to verify the recipient.",
|
|
44
|
+
inputSchema: {
|
|
45
|
+
amount: z.number().positive().describe("Amount in Naira to transfer"),
|
|
46
|
+
accountNumber: z
|
|
47
|
+
.string()
|
|
48
|
+
.length(10)
|
|
49
|
+
.describe("Recipient 10-digit bank account number"),
|
|
50
|
+
bankCode: z.string().describe("Recipient bank code"),
|
|
51
|
+
narration: z
|
|
52
|
+
.string()
|
|
53
|
+
.optional()
|
|
54
|
+
.describe("Transfer description/narration"),
|
|
55
|
+
},
|
|
56
|
+
}, async ({ amount, accountNumber, bankCode, narration }) => {
|
|
57
|
+
logToolCall("nomba_transfer_to_bank", { amount, accountNumber, bankCode });
|
|
58
|
+
try {
|
|
59
|
+
const result = await client.post("/v1/transfers/to-banks", {
|
|
60
|
+
amount,
|
|
61
|
+
accountNumber,
|
|
62
|
+
bankCode,
|
|
63
|
+
narration,
|
|
64
|
+
});
|
|
65
|
+
return jsonResponse(result);
|
|
66
|
+
}
|
|
67
|
+
catch (error) {
|
|
68
|
+
return errorResponse(error);
|
|
69
|
+
}
|
|
70
|
+
});
|
|
71
|
+
server.registerTool("nomba_transfer_between_accounts", {
|
|
72
|
+
title: "Transfer Between Nomba Accounts",
|
|
73
|
+
description:
|
|
74
|
+
// Nomba is NGN-only
|
|
75
|
+
"Transfer funds between two Nomba accounts (e.g., parent to sub-account or between sub-accounts). Amount is in Naira (NGN).",
|
|
76
|
+
inputSchema: {
|
|
77
|
+
amount: z.number().positive().describe("Amount in Naira to transfer"),
|
|
78
|
+
destinationAccountId: z
|
|
79
|
+
.string()
|
|
80
|
+
.describe("Destination Nomba account ID (UUID)"),
|
|
81
|
+
narration: z
|
|
82
|
+
.string()
|
|
83
|
+
.optional()
|
|
84
|
+
.describe("Transfer description/narration"),
|
|
85
|
+
},
|
|
86
|
+
}, async ({ amount, destinationAccountId, narration }) => {
|
|
87
|
+
logToolCall("nomba_transfer_between_accounts", { amount, destinationAccountId });
|
|
88
|
+
try {
|
|
89
|
+
const result = await client.post("/v1/transfers/between-accounts", { amount, destinationAccountId, narration });
|
|
90
|
+
return jsonResponse(result);
|
|
91
|
+
}
|
|
92
|
+
catch (error) {
|
|
93
|
+
return errorResponse(error);
|
|
94
|
+
}
|
|
95
|
+
});
|
|
96
|
+
}
|
|
97
|
+
//# sourceMappingURL=transfers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transfers.js","sourceRoot":"","sources":["../../src/tools/transfers.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { jsonResponse, errorResponse, logToolCall, buildParams } from "../utils.js";
|
|
3
|
+
export function registerVirtualAccountTools(server, client) {
|
|
4
|
+
server.registerTool("nomba_create_virtual_account", {
|
|
5
|
+
title: "Create Virtual Account",
|
|
6
|
+
description: "Create a new virtual bank account under the parent Nomba account. Virtual accounts can receive bank transfers and are useful for collecting payments from specific customers.",
|
|
7
|
+
inputSchema: {
|
|
8
|
+
accountName: z
|
|
9
|
+
.string()
|
|
10
|
+
.min(8)
|
|
11
|
+
.max(64)
|
|
12
|
+
.describe("Name for the virtual account holder (8-64 characters)"),
|
|
13
|
+
accountRef: z
|
|
14
|
+
.string()
|
|
15
|
+
.min(16)
|
|
16
|
+
.max(64)
|
|
17
|
+
.optional()
|
|
18
|
+
.describe("Your unique reference for this account (16-64 characters)"),
|
|
19
|
+
},
|
|
20
|
+
}, async ({ accountName, accountRef }) => {
|
|
21
|
+
logToolCall("nomba_create_virtual_account", { accountName });
|
|
22
|
+
try {
|
|
23
|
+
const body = { accountName };
|
|
24
|
+
if (accountRef)
|
|
25
|
+
body.accountRef = accountRef;
|
|
26
|
+
const result = await client.post("/v1/accounts/virtual", body);
|
|
27
|
+
return jsonResponse(result);
|
|
28
|
+
}
|
|
29
|
+
catch (error) {
|
|
30
|
+
return errorResponse(error);
|
|
31
|
+
}
|
|
32
|
+
});
|
|
33
|
+
server.registerTool("nomba_get_virtual_account", {
|
|
34
|
+
title: "Get Virtual Account",
|
|
35
|
+
description: "Fetch details of a specific virtual account by its account ID. Returns account name, bank details, status, and balance.",
|
|
36
|
+
inputSchema: {
|
|
37
|
+
accountId: z
|
|
38
|
+
.string()
|
|
39
|
+
.describe("The virtual account ID (UUID)"),
|
|
40
|
+
},
|
|
41
|
+
}, async ({ accountId }) => {
|
|
42
|
+
logToolCall("nomba_get_virtual_account", { accountId });
|
|
43
|
+
try {
|
|
44
|
+
const result = await client.get(`/v1/accounts/virtual/${accountId}`);
|
|
45
|
+
return jsonResponse(result);
|
|
46
|
+
}
|
|
47
|
+
catch (error) {
|
|
48
|
+
return errorResponse(error);
|
|
49
|
+
}
|
|
50
|
+
});
|
|
51
|
+
server.registerTool("nomba_update_virtual_account", {
|
|
52
|
+
title: "Update Virtual Account",
|
|
53
|
+
description: "Update the details of an existing virtual account, such as the account name or callback URL.",
|
|
54
|
+
inputSchema: {
|
|
55
|
+
accountId: z
|
|
56
|
+
.string()
|
|
57
|
+
.describe("The virtual account ID (UUID) to update"),
|
|
58
|
+
accountName: z
|
|
59
|
+
.string()
|
|
60
|
+
.min(8)
|
|
61
|
+
.max(64)
|
|
62
|
+
.optional()
|
|
63
|
+
.describe("New account name (8-64 characters)"),
|
|
64
|
+
callbackUrl: z
|
|
65
|
+
.string()
|
|
66
|
+
.url()
|
|
67
|
+
.optional()
|
|
68
|
+
.describe("Webhook URL for payment notifications on this account"),
|
|
69
|
+
},
|
|
70
|
+
}, async ({ accountId, accountName, callbackUrl }) => {
|
|
71
|
+
logToolCall("nomba_update_virtual_account", { accountId });
|
|
72
|
+
try {
|
|
73
|
+
const body = {};
|
|
74
|
+
if (accountName)
|
|
75
|
+
body.accountName = accountName;
|
|
76
|
+
if (callbackUrl)
|
|
77
|
+
body.callbackUrl = callbackUrl;
|
|
78
|
+
const result = await client.patch(`/v1/accounts/virtual/${accountId}`, body);
|
|
79
|
+
return jsonResponse(result);
|
|
80
|
+
}
|
|
81
|
+
catch (error) {
|
|
82
|
+
return errorResponse(error);
|
|
83
|
+
}
|
|
84
|
+
});
|
|
85
|
+
server.registerTool("nomba_expire_virtual_account", {
|
|
86
|
+
title: "Expire Virtual Account",
|
|
87
|
+
description: "Expire/deactivate a virtual account so it can no longer receive payments. This action cannot be undone.",
|
|
88
|
+
inputSchema: {
|
|
89
|
+
accountId: z
|
|
90
|
+
.string()
|
|
91
|
+
.describe("The virtual account ID (UUID) to expire"),
|
|
92
|
+
},
|
|
93
|
+
}, async ({ accountId }) => {
|
|
94
|
+
logToolCall("nomba_expire_virtual_account", { accountId });
|
|
95
|
+
try {
|
|
96
|
+
const result = await client.post(`/v1/accounts/virtual/${accountId}/expire`, {});
|
|
97
|
+
return jsonResponse(result);
|
|
98
|
+
}
|
|
99
|
+
catch (error) {
|
|
100
|
+
return errorResponse(error);
|
|
101
|
+
}
|
|
102
|
+
});
|
|
103
|
+
server.registerTool("nomba_list_virtual_accounts", {
|
|
104
|
+
title: "List Virtual Accounts",
|
|
105
|
+
description: "List all virtual accounts under the parent Nomba account. Supports pagination with limit and cursor.",
|
|
106
|
+
inputSchema: {
|
|
107
|
+
limit: z
|
|
108
|
+
.number()
|
|
109
|
+
.int()
|
|
110
|
+
.positive()
|
|
111
|
+
.max(50)
|
|
112
|
+
.optional()
|
|
113
|
+
.describe("Number of results per page (max 50)"),
|
|
114
|
+
cursor: z
|
|
115
|
+
.string()
|
|
116
|
+
.optional()
|
|
117
|
+
.describe("Pagination cursor from a previous response"),
|
|
118
|
+
},
|
|
119
|
+
}, async ({ limit, cursor }) => {
|
|
120
|
+
logToolCall("nomba_list_virtual_accounts", { limit, cursor });
|
|
121
|
+
try {
|
|
122
|
+
const params = buildParams({ limit, cursor });
|
|
123
|
+
const result = await client.get("/v1/accounts/virtual", params);
|
|
124
|
+
return jsonResponse(result);
|
|
125
|
+
}
|
|
126
|
+
catch (error) {
|
|
127
|
+
return errorResponse(error);
|
|
128
|
+
}
|
|
129
|
+
});
|
|
130
|
+
}
|
|
131
|
+
//# sourceMappingURL=virtual-accounts.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"virtual-accounts.js","sourceRoot":"","sources":["../../src/tools/virtual-accounts.ts"],"names":[],"mappings":"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"}
|
package/build/utils.d.ts
ADDED
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
export declare const TOKEN_BUFFER_MS = 60000;
|
|
2
|
+
export declare const MAX_PAGE_SIZE = 50;
|
|
3
|
+
export declare const CACHE_TTL_MS: number;
|
|
4
|
+
export declare function jsonResponse(data: unknown): {
|
|
5
|
+
content: {
|
|
6
|
+
type: "text";
|
|
7
|
+
text: string;
|
|
8
|
+
}[];
|
|
9
|
+
};
|
|
10
|
+
export declare function errorResponse(error: unknown): {
|
|
11
|
+
content: {
|
|
12
|
+
type: "text";
|
|
13
|
+
text: string;
|
|
14
|
+
}[];
|
|
15
|
+
isError: boolean;
|
|
16
|
+
};
|
|
17
|
+
export declare function buildParams(obj: Record<string, unknown>): Record<string, string>;
|
|
18
|
+
export declare function logToolCall(tool: string, params?: Record<string, unknown>): void;
|
package/build/utils.js
ADDED
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
export const TOKEN_BUFFER_MS = 60_000;
|
|
2
|
+
export const MAX_PAGE_SIZE = 50;
|
|
3
|
+
export const CACHE_TTL_MS = 24 * 60 * 60 * 1000; // 24h
|
|
4
|
+
export function jsonResponse(data) {
|
|
5
|
+
return {
|
|
6
|
+
content: [{ type: "text", text: JSON.stringify(data, null, 2) }],
|
|
7
|
+
};
|
|
8
|
+
}
|
|
9
|
+
export function errorResponse(error) {
|
|
10
|
+
const msg = error instanceof Error ? error.message : String(error);
|
|
11
|
+
return {
|
|
12
|
+
content: [{ type: "text", text: `Error: ${msg}` }],
|
|
13
|
+
isError: true,
|
|
14
|
+
};
|
|
15
|
+
}
|
|
16
|
+
export function buildParams(obj) {
|
|
17
|
+
const params = {};
|
|
18
|
+
for (const [k, v] of Object.entries(obj)) {
|
|
19
|
+
if (v !== undefined && v !== null)
|
|
20
|
+
params[k] = String(v);
|
|
21
|
+
}
|
|
22
|
+
return params;
|
|
23
|
+
}
|
|
24
|
+
export function logToolCall(tool, params) {
|
|
25
|
+
const sanitized = { ts: new Date().toISOString(), tool };
|
|
26
|
+
if (params) {
|
|
27
|
+
for (const [k, v] of Object.entries(params)) {
|
|
28
|
+
sanitized[k] = typeof v === "string" && v.length > 100
|
|
29
|
+
? v.slice(0, 20) + "..."
|
|
30
|
+
: v;
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
console.error(JSON.stringify(sanitized));
|
|
34
|
+
}
|
|
35
|
+
//# sourceMappingURL=utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,eAAe,GAAG,MAAM,CAAC;AACtC,MAAM,CAAC,MAAM,aAAa,GAAG,EAAE,CAAC;AAChC,MAAM,CAAC,MAAM,YAAY,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC,MAAM;AAEvD,MAAM,UAAU,YAAY,CAAC,IAAa;IACxC,OAAO;QACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC;KAC1E,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,KAAc;IAC1C,MAAM,GAAG,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IACnE,OAAO;QACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,UAAU,GAAG,EAAE,EAAE,CAAC;QAC3D,OAAO,EAAE,IAAI;KACd,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,WAAW,CACzB,GAA4B;IAE5B,MAAM,MAAM,GAA2B,EAAE,CAAC;IAC1C,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;QACzC,IAAI,CAAC,KAAK,SAAS,IAAI,CAAC,KAAK,IAAI;YAAE,MAAM,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;IAC3D,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,IAAY,EAAE,MAAgC;IACxE,MAAM,SAAS,GAA4B,EAAE,EAAE,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE,IAAI,EAAE,CAAC;IAClF,IAAI,MAAM,EAAE,CAAC;QACX,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;YAC5C,SAAS,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,CAAC,MAAM,GAAG,GAAG;gBACpD,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,KAAK;gBACxB,CAAC,CAAC,CAAC,CAAC;QACR,CAAC;IACH,CAAC;IACD,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC,CAAC;AAC3C,CAAC"}
|