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,26 @@
|
|
|
1
|
+
interface NombaClientConfig {
|
|
2
|
+
baseUrl: string;
|
|
3
|
+
clientId: string;
|
|
4
|
+
clientSecret: string;
|
|
5
|
+
accountId: string;
|
|
6
|
+
}
|
|
7
|
+
export declare class NombaApiError extends Error {
|
|
8
|
+
readonly status: number;
|
|
9
|
+
readonly code: string;
|
|
10
|
+
readonly description: string;
|
|
11
|
+
constructor(status: number, code: string, description: string);
|
|
12
|
+
}
|
|
13
|
+
export declare class NombaClient {
|
|
14
|
+
private config;
|
|
15
|
+
private tokenData;
|
|
16
|
+
private tokenPromise;
|
|
17
|
+
constructor(config: NombaClientConfig);
|
|
18
|
+
private issueToken;
|
|
19
|
+
private ensureToken;
|
|
20
|
+
request<T = unknown>(method: string, path: string, body?: unknown, params?: Record<string, string>, _retry?: boolean): Promise<T>;
|
|
21
|
+
get<T = unknown>(path: string, params?: Record<string, string>): Promise<T>;
|
|
22
|
+
post<T = unknown>(path: string, body: unknown): Promise<T>;
|
|
23
|
+
put<T = unknown>(path: string, body: unknown): Promise<T>;
|
|
24
|
+
patch<T = unknown>(path: string, body: unknown): Promise<T>;
|
|
25
|
+
}
|
|
26
|
+
export {};
|
package/build/client.js
ADDED
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
import { TOKEN_BUFFER_MS } from "./utils.js";
|
|
2
|
+
export class NombaApiError extends Error {
|
|
3
|
+
status;
|
|
4
|
+
code;
|
|
5
|
+
description;
|
|
6
|
+
constructor(status, code, description) {
|
|
7
|
+
super(`Nomba API error (${status}): ${code} - ${description}`);
|
|
8
|
+
this.name = "NombaApiError";
|
|
9
|
+
this.status = status;
|
|
10
|
+
this.code = code;
|
|
11
|
+
this.description = description;
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
function parseApiError(status, body) {
|
|
15
|
+
try {
|
|
16
|
+
const parsed = JSON.parse(body);
|
|
17
|
+
const code = parsed?.code ?? "UNKNOWN";
|
|
18
|
+
const description = parsed?.description ?? parsed?.message ?? "Unknown error";
|
|
19
|
+
return new NombaApiError(status, code, description);
|
|
20
|
+
}
|
|
21
|
+
catch {
|
|
22
|
+
// Don't expose raw body — it may contain echoed credentials
|
|
23
|
+
return new NombaApiError(status, "UNKNOWN", `HTTP ${status} error`);
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
export class NombaClient {
|
|
27
|
+
config;
|
|
28
|
+
tokenData = null;
|
|
29
|
+
tokenPromise = null;
|
|
30
|
+
constructor(config) {
|
|
31
|
+
this.config = config;
|
|
32
|
+
if (!config.baseUrl.startsWith("https://")) {
|
|
33
|
+
console.error("WARNING: NOMBA_BASE_URL does not use HTTPS. Credentials may be exposed in transit.");
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
async issueToken() {
|
|
37
|
+
const url = `${this.config.baseUrl}/v1/auth/token/issue`;
|
|
38
|
+
const response = await fetch(url, {
|
|
39
|
+
method: "POST",
|
|
40
|
+
headers: {
|
|
41
|
+
"Content-Type": "application/json",
|
|
42
|
+
accountId: this.config.accountId,
|
|
43
|
+
},
|
|
44
|
+
body: JSON.stringify({
|
|
45
|
+
grant_type: "client_credentials",
|
|
46
|
+
client_id: this.config.clientId,
|
|
47
|
+
client_secret: this.config.clientSecret,
|
|
48
|
+
}),
|
|
49
|
+
});
|
|
50
|
+
if (!response.ok) {
|
|
51
|
+
const errorBody = await response.text();
|
|
52
|
+
// Never expose credentials in error messages
|
|
53
|
+
throw parseApiError(response.status, errorBody);
|
|
54
|
+
}
|
|
55
|
+
const result = (await response.json());
|
|
56
|
+
this.tokenData = {
|
|
57
|
+
accessToken: result.data.access_token,
|
|
58
|
+
refreshToken: result.data.refresh_token,
|
|
59
|
+
expiresAt: new Date(result.data.expiresAt),
|
|
60
|
+
};
|
|
61
|
+
}
|
|
62
|
+
async ensureToken() {
|
|
63
|
+
if (this.tokenData &&
|
|
64
|
+
this.tokenData.expiresAt >= new Date(Date.now() + TOKEN_BUFFER_MS)) {
|
|
65
|
+
return this.tokenData.accessToken;
|
|
66
|
+
}
|
|
67
|
+
if (!this.tokenPromise) {
|
|
68
|
+
this.tokenPromise = this.issueToken().finally(() => {
|
|
69
|
+
this.tokenPromise = null;
|
|
70
|
+
});
|
|
71
|
+
}
|
|
72
|
+
await this.tokenPromise;
|
|
73
|
+
return this.tokenData.accessToken;
|
|
74
|
+
}
|
|
75
|
+
async request(method, path, body, params, _retry = false) {
|
|
76
|
+
const token = await this.ensureToken();
|
|
77
|
+
const url = new URL(path, this.config.baseUrl);
|
|
78
|
+
if (params) {
|
|
79
|
+
for (const [k, v] of Object.entries(params)) {
|
|
80
|
+
url.searchParams.set(k, v);
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
const response = await fetch(url.toString(), {
|
|
84
|
+
method,
|
|
85
|
+
headers: {
|
|
86
|
+
Authorization: `Bearer ${token}`,
|
|
87
|
+
accountId: this.config.accountId,
|
|
88
|
+
"Content-Type": "application/json",
|
|
89
|
+
},
|
|
90
|
+
body: body ? JSON.stringify(body) : undefined,
|
|
91
|
+
});
|
|
92
|
+
if (!response.ok) {
|
|
93
|
+
// On 401, clear token and retry once
|
|
94
|
+
if (response.status === 401 && !_retry) {
|
|
95
|
+
this.tokenData = null;
|
|
96
|
+
return this.request(method, path, body, params, true);
|
|
97
|
+
}
|
|
98
|
+
const errorBody = await response.text();
|
|
99
|
+
throw parseApiError(response.status, errorBody);
|
|
100
|
+
}
|
|
101
|
+
const json = await response.json();
|
|
102
|
+
if (json == null) {
|
|
103
|
+
throw new NombaApiError(response.status, "EMPTY_RESPONSE", "API returned empty response");
|
|
104
|
+
}
|
|
105
|
+
return json;
|
|
106
|
+
}
|
|
107
|
+
async get(path, params) {
|
|
108
|
+
return this.request("GET", path, undefined, params);
|
|
109
|
+
}
|
|
110
|
+
async post(path, body) {
|
|
111
|
+
return this.request("POST", path, body);
|
|
112
|
+
}
|
|
113
|
+
async put(path, body) {
|
|
114
|
+
return this.request("PUT", path, body);
|
|
115
|
+
}
|
|
116
|
+
async patch(path, body) {
|
|
117
|
+
return this.request("PATCH", path, body);
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
//# sourceMappingURL=client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
|
package/build/index.d.ts
ADDED
package/build/index.js
ADDED
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
3
|
+
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
|
|
4
|
+
import { NombaClient } from "./client.js";
|
|
5
|
+
import { registerAccountTools } from "./tools/accounts.js";
|
|
6
|
+
import { registerTransferTools } from "./tools/transfers.js";
|
|
7
|
+
import { registerCheckoutTools } from "./tools/checkout.js";
|
|
8
|
+
import { registerVirtualAccountTools } from "./tools/virtual-accounts.js";
|
|
9
|
+
import { registerTransactionTools } from "./tools/transactions.js";
|
|
10
|
+
import { registerBillTools } from "./tools/bills/index.js";
|
|
11
|
+
import { registerAirtimeTools } from "./tools/airtime.js";
|
|
12
|
+
import { registerSubAccountTools } from "./tools/sub-accounts.js";
|
|
13
|
+
import { registerBankListResource } from "./resources/bank-list.js";
|
|
14
|
+
const NOMBA_CLIENT_ID = process.env.NOMBA_CLIENT_ID;
|
|
15
|
+
const NOMBA_CLIENT_SECRET = process.env.NOMBA_CLIENT_SECRET;
|
|
16
|
+
const NOMBA_ACCOUNT_ID = process.env.NOMBA_ACCOUNT_ID;
|
|
17
|
+
const NOMBA_BASE_URL = process.env.NOMBA_BASE_URL || "https://sandbox.nomba.com";
|
|
18
|
+
if (!NOMBA_CLIENT_ID || !NOMBA_CLIENT_SECRET || !NOMBA_ACCOUNT_ID) {
|
|
19
|
+
console.error("Missing required environment variables: NOMBA_CLIENT_ID, NOMBA_CLIENT_SECRET, NOMBA_ACCOUNT_ID");
|
|
20
|
+
process.exit(1);
|
|
21
|
+
}
|
|
22
|
+
if (NOMBA_BASE_URL.includes("api.nomba.com")) {
|
|
23
|
+
console.error("WARNING: Running against PRODUCTION Nomba API");
|
|
24
|
+
}
|
|
25
|
+
const nombaClient = new NombaClient({
|
|
26
|
+
baseUrl: NOMBA_BASE_URL,
|
|
27
|
+
clientId: NOMBA_CLIENT_ID,
|
|
28
|
+
clientSecret: NOMBA_CLIENT_SECRET,
|
|
29
|
+
accountId: NOMBA_ACCOUNT_ID,
|
|
30
|
+
});
|
|
31
|
+
const server = new McpServer({
|
|
32
|
+
name: "nomba-mcp",
|
|
33
|
+
version: "1.0.0",
|
|
34
|
+
});
|
|
35
|
+
registerAccountTools(server, nombaClient);
|
|
36
|
+
registerTransferTools(server, nombaClient);
|
|
37
|
+
registerCheckoutTools(server, nombaClient);
|
|
38
|
+
registerVirtualAccountTools(server, nombaClient);
|
|
39
|
+
registerTransactionTools(server, nombaClient);
|
|
40
|
+
registerBillTools(server, nombaClient);
|
|
41
|
+
registerAirtimeTools(server, nombaClient);
|
|
42
|
+
registerSubAccountTools(server, nombaClient);
|
|
43
|
+
registerBankListResource(server, nombaClient);
|
|
44
|
+
async function main() {
|
|
45
|
+
const transport = new StdioServerTransport();
|
|
46
|
+
await server.connect(transport);
|
|
47
|
+
console.error("Nomba MCP Server running on stdio");
|
|
48
|
+
}
|
|
49
|
+
main().catch((error) => {
|
|
50
|
+
console.error("Fatal error:", error);
|
|
51
|
+
process.exit(1);
|
|
52
|
+
});
|
|
53
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAC3D,OAAO,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAC7D,OAAO,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AAC5D,OAAO,EAAE,2BAA2B,EAAE,MAAM,6BAA6B,CAAC;AAC1E,OAAO,EAAE,wBAAwB,EAAE,MAAM,yBAAyB,CAAC;AACnE,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAC3D,OAAO,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAC1D,OAAO,EAAE,uBAAuB,EAAE,MAAM,yBAAyB,CAAC;AAClE,OAAO,EAAE,wBAAwB,EAAE,MAAM,0BAA0B,CAAC;AAEpE,MAAM,eAAe,GAAG,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC;AACpD,MAAM,mBAAmB,GAAG,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC;AAC5D,MAAM,gBAAgB,GAAG,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC;AACtD,MAAM,cAAc,GAClB,OAAO,CAAC,GAAG,CAAC,cAAc,IAAI,2BAA2B,CAAC;AAE5D,IAAI,CAAC,eAAe,IAAI,CAAC,mBAAmB,IAAI,CAAC,gBAAgB,EAAE,CAAC;IAClE,OAAO,CAAC,KAAK,CACX,gGAAgG,CACjG,CAAC;IACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC;AAED,IAAI,cAAc,CAAC,QAAQ,CAAC,eAAe,CAAC,EAAE,CAAC;IAC7C,OAAO,CAAC,KAAK,CAAC,+CAA+C,CAAC,CAAC;AACjE,CAAC;AAED,MAAM,WAAW,GAAG,IAAI,WAAW,CAAC;IAClC,OAAO,EAAE,cAAc;IACvB,QAAQ,EAAE,eAAe;IACzB,YAAY,EAAE,mBAAmB;IACjC,SAAS,EAAE,gBAAgB;CAC5B,CAAC,CAAC;AAEH,MAAM,MAAM,GAAG,IAAI,SAAS,CAAC;IAC3B,IAAI,EAAE,WAAW;IACjB,OAAO,EAAE,OAAO;CACjB,CAAC,CAAC;AAEH,oBAAoB,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;AAC1C,qBAAqB,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;AAC3C,qBAAqB,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;AAC3C,2BAA2B,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;AACjD,wBAAwB,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;AAC9C,iBAAiB,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;AACvC,oBAAoB,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;AAC1C,uBAAuB,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;AAC7C,wBAAwB,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;AAE9C,KAAK,UAAU,IAAI;IACjB,MAAM,SAAS,GAAG,IAAI,oBAAoB,EAAE,CAAC;IAC7C,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IAChC,OAAO,CAAC,KAAK,CAAC,mCAAmC,CAAC,CAAC;AACrD,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;IACrB,OAAO,CAAC,KAAK,CAAC,cAAc,EAAE,KAAK,CAAC,CAAC;IACrC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { CACHE_TTL_MS } from "../utils.js";
|
|
2
|
+
export function registerBankListResource(server, client) {
|
|
3
|
+
let cache = null;
|
|
4
|
+
server.registerResource("bank-list", "nomba://banks", {
|
|
5
|
+
description: "List of all Nigerian bank codes and names. Cached for 24 hours.",
|
|
6
|
+
mimeType: "application/json",
|
|
7
|
+
}, async () => {
|
|
8
|
+
if (!cache || Date.now() >= cache.expiresAt) {
|
|
9
|
+
const result = await client.get("/v1/transfers/banks");
|
|
10
|
+
cache = {
|
|
11
|
+
data: JSON.stringify(result, null, 2),
|
|
12
|
+
expiresAt: Date.now() + CACHE_TTL_MS,
|
|
13
|
+
};
|
|
14
|
+
}
|
|
15
|
+
return {
|
|
16
|
+
contents: [
|
|
17
|
+
{
|
|
18
|
+
uri: "nomba://banks",
|
|
19
|
+
mimeType: "application/json",
|
|
20
|
+
text: cache.data,
|
|
21
|
+
},
|
|
22
|
+
],
|
|
23
|
+
};
|
|
24
|
+
});
|
|
25
|
+
}
|
|
26
|
+
//# sourceMappingURL=bank-list.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bank-list.js","sourceRoot":"","sources":["../../src/resources/bank-list.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAE3C,MAAM,UAAU,wBAAwB,CACtC,MAAiB,EACjB,MAAmB;IAEnB,IAAI,KAAK,GAA+C,IAAI,CAAC;IAE7D,MAAM,CAAC,gBAAgB,CACrB,WAAW,EACX,eAAe,EACf;QACE,WAAW,EACT,iEAAiE;QACnE,QAAQ,EAAE,kBAAkB;KAC7B,EACD,KAAK,IAAI,EAAE;QACT,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,GAAG,EAAE,IAAI,KAAK,CAAC,SAAS,EAAE,CAAC;YAC5C,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,GAAG,CAAC,qBAAqB,CAAC,CAAC;YACvD,KAAK,GAAG;gBACN,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;gBACrC,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,YAAY;aACrC,CAAC;QACJ,CAAC;QACD,OAAO;YACL,QAAQ,EAAE;gBACR;oBACE,GAAG,EAAE,eAAe;oBACpB,QAAQ,EAAE,kBAAkB;oBAC5B,IAAI,EAAE,KAAK,CAAC,IAAI;iBACjB;aACF;SACF,CAAC;IACJ,CAAC,CACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { jsonResponse, errorResponse, logToolCall } from "../utils.js";
|
|
3
|
+
export function registerAccountTools(server, client) {
|
|
4
|
+
server.registerTool("nomba_get_parent_account", {
|
|
5
|
+
title: "Get Parent Account",
|
|
6
|
+
description: "Fetch the parent account details for the authenticated Nomba business. Returns account ID, name, type, status, BVN, and linked bank accounts.",
|
|
7
|
+
}, async () => {
|
|
8
|
+
logToolCall("nomba_get_parent_account");
|
|
9
|
+
try {
|
|
10
|
+
const result = await client.get("/v1/accounts/parent");
|
|
11
|
+
return jsonResponse(result);
|
|
12
|
+
}
|
|
13
|
+
catch (error) {
|
|
14
|
+
return errorResponse(error);
|
|
15
|
+
}
|
|
16
|
+
});
|
|
17
|
+
server.registerTool("nomba_get_parent_balance", {
|
|
18
|
+
title: "Get Parent Account Balance",
|
|
19
|
+
description: "Fetch the current balance of the parent Nomba business account. Returns available balance in NGN.",
|
|
20
|
+
}, async () => {
|
|
21
|
+
logToolCall("nomba_get_parent_balance");
|
|
22
|
+
try {
|
|
23
|
+
const result = await client.get("/v1/accounts/parent/balance");
|
|
24
|
+
return jsonResponse(result);
|
|
25
|
+
}
|
|
26
|
+
catch (error) {
|
|
27
|
+
return errorResponse(error);
|
|
28
|
+
}
|
|
29
|
+
});
|
|
30
|
+
server.registerTool("nomba_list_terminals", {
|
|
31
|
+
title: "List Terminals",
|
|
32
|
+
description: "List all POS terminals assigned to the parent Nomba account. Returns terminal IDs, serial numbers, and labels.",
|
|
33
|
+
}, async () => {
|
|
34
|
+
logToolCall("nomba_list_terminals");
|
|
35
|
+
try {
|
|
36
|
+
const result = await client.get("/v1/accounts/terminals");
|
|
37
|
+
return jsonResponse(result);
|
|
38
|
+
}
|
|
39
|
+
catch (error) {
|
|
40
|
+
return errorResponse(error);
|
|
41
|
+
}
|
|
42
|
+
});
|
|
43
|
+
server.registerTool("nomba_assign_terminal", {
|
|
44
|
+
title: "Assign Terminal",
|
|
45
|
+
description: "Assign a POS terminal to the parent Nomba account.",
|
|
46
|
+
inputSchema: {
|
|
47
|
+
terminalId: z
|
|
48
|
+
.string()
|
|
49
|
+
.describe("The terminal ID to assign"),
|
|
50
|
+
serialNumber: z
|
|
51
|
+
.string()
|
|
52
|
+
.describe("The terminal serial number"),
|
|
53
|
+
},
|
|
54
|
+
}, async ({ terminalId, serialNumber }) => {
|
|
55
|
+
logToolCall("nomba_assign_terminal", { terminalId, serialNumber });
|
|
56
|
+
try {
|
|
57
|
+
const result = await client.post("/v1/terminals/assign", {
|
|
58
|
+
terminalId,
|
|
59
|
+
serialNumber,
|
|
60
|
+
});
|
|
61
|
+
return jsonResponse(result);
|
|
62
|
+
}
|
|
63
|
+
catch (error) {
|
|
64
|
+
return errorResponse(error);
|
|
65
|
+
}
|
|
66
|
+
});
|
|
67
|
+
server.registerTool("nomba_unassign_terminal", {
|
|
68
|
+
title: "Unassign Terminal",
|
|
69
|
+
description: "Unassign a POS terminal from the parent Nomba account.",
|
|
70
|
+
inputSchema: {
|
|
71
|
+
terminalId: z
|
|
72
|
+
.string()
|
|
73
|
+
.describe("The terminal ID to unassign"),
|
|
74
|
+
},
|
|
75
|
+
}, async ({ terminalId }) => {
|
|
76
|
+
logToolCall("nomba_unassign_terminal", { terminalId });
|
|
77
|
+
try {
|
|
78
|
+
const result = await client.post("/v1/terminals/unassign", {
|
|
79
|
+
terminalId,
|
|
80
|
+
});
|
|
81
|
+
return jsonResponse(result);
|
|
82
|
+
}
|
|
83
|
+
catch (error) {
|
|
84
|
+
return errorResponse(error);
|
|
85
|
+
}
|
|
86
|
+
});
|
|
87
|
+
}
|
|
88
|
+
//# sourceMappingURL=accounts.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"accounts.js","sourceRoot":"","sources":["../../src/tools/accounts.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { jsonResponse, errorResponse, logToolCall } from "../utils.js";
|
|
3
|
+
export function registerAirtimeTools(server, client) {
|
|
4
|
+
server.registerTool("nomba_buy_airtime", {
|
|
5
|
+
title: "Buy Airtime",
|
|
6
|
+
description: "Purchase airtime/credit for a Nigerian phone number. Amount is in Naira. Supports all major networks (MTN, Airtel, Glo, 9mobile).",
|
|
7
|
+
inputSchema: {
|
|
8
|
+
phoneNumber: z
|
|
9
|
+
.string()
|
|
10
|
+
.describe("Nigerian phone number (e.g., 08012345678 or 2348012345678)"),
|
|
11
|
+
amount: z
|
|
12
|
+
.number()
|
|
13
|
+
.positive()
|
|
14
|
+
.describe("Amount of airtime in Naira"),
|
|
15
|
+
network: z
|
|
16
|
+
.string()
|
|
17
|
+
.optional()
|
|
18
|
+
.describe("Network provider (e.g., MTN, AIRTEL, GLO, 9MOBILE). Auto-detected if omitted."),
|
|
19
|
+
},
|
|
20
|
+
}, async ({ phoneNumber, amount, network }) => {
|
|
21
|
+
logToolCall("nomba_buy_airtime", { phoneNumber, amount, network });
|
|
22
|
+
try {
|
|
23
|
+
const body = { phoneNumber, amount };
|
|
24
|
+
if (network)
|
|
25
|
+
body.network = network;
|
|
26
|
+
const result = await client.post("/v1/bills/airtime/pay", body);
|
|
27
|
+
return jsonResponse(result);
|
|
28
|
+
}
|
|
29
|
+
catch (error) {
|
|
30
|
+
return errorResponse(error);
|
|
31
|
+
}
|
|
32
|
+
});
|
|
33
|
+
server.registerTool("nomba_list_data_plans", {
|
|
34
|
+
title: "List Data Plans",
|
|
35
|
+
description: "Fetch available data bundle plans for a specific network provider. Returns plan names, data amounts, prices, and plan codes needed for purchasing.",
|
|
36
|
+
inputSchema: {
|
|
37
|
+
network: z
|
|
38
|
+
.string()
|
|
39
|
+
.describe("Network provider (e.g., MTN, AIRTEL, GLO, 9MOBILE)"),
|
|
40
|
+
},
|
|
41
|
+
}, async ({ network }) => {
|
|
42
|
+
logToolCall("nomba_list_data_plans", { network });
|
|
43
|
+
try {
|
|
44
|
+
const result = await client.get("/v1/bills/data/plans", { network });
|
|
45
|
+
return jsonResponse(result);
|
|
46
|
+
}
|
|
47
|
+
catch (error) {
|
|
48
|
+
return errorResponse(error);
|
|
49
|
+
}
|
|
50
|
+
});
|
|
51
|
+
server.registerTool("nomba_buy_data", {
|
|
52
|
+
title: "Buy Data Bundle",
|
|
53
|
+
description: "Purchase a data bundle for a Nigerian phone number. Use nomba_list_data_plans first to get available plans and their codes.",
|
|
54
|
+
inputSchema: {
|
|
55
|
+
phoneNumber: z
|
|
56
|
+
.string()
|
|
57
|
+
.describe("Nigerian phone number (e.g., 08012345678 or 2348012345678)"),
|
|
58
|
+
dataPlanCode: z
|
|
59
|
+
.string()
|
|
60
|
+
.describe("Data plan code from nomba_list_data_plans"),
|
|
61
|
+
network: z
|
|
62
|
+
.string()
|
|
63
|
+
.describe("Network provider (e.g., MTN, AIRTEL, GLO, 9MOBILE)"),
|
|
64
|
+
},
|
|
65
|
+
}, async ({ phoneNumber, dataPlanCode, network }) => {
|
|
66
|
+
logToolCall("nomba_buy_data", { phoneNumber, dataPlanCode, network });
|
|
67
|
+
try {
|
|
68
|
+
const result = await client.post("/v1/bills/data/pay", {
|
|
69
|
+
phoneNumber,
|
|
70
|
+
dataPlanCode,
|
|
71
|
+
network,
|
|
72
|
+
});
|
|
73
|
+
return jsonResponse(result);
|
|
74
|
+
}
|
|
75
|
+
catch (error) {
|
|
76
|
+
return errorResponse(error);
|
|
77
|
+
}
|
|
78
|
+
});
|
|
79
|
+
}
|
|
80
|
+
//# sourceMappingURL=airtime.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"airtime.js","sourceRoot":"","sources":["../../src/tools/airtime.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { jsonResponse, errorResponse, logToolCall } from "../../utils.js";
|
|
3
|
+
export function registerBettingTools(server, client) {
|
|
4
|
+
server.registerTool("nomba_get_betting_providers", {
|
|
5
|
+
title: "Get Betting Providers",
|
|
6
|
+
description: "Fetch the list of available betting platforms. Use this to get provider codes before funding a betting account.",
|
|
7
|
+
}, async () => {
|
|
8
|
+
logToolCall("nomba_get_betting_providers");
|
|
9
|
+
try {
|
|
10
|
+
const result = await client.get("/v1/bills/betting/providers");
|
|
11
|
+
return jsonResponse(result);
|
|
12
|
+
}
|
|
13
|
+
catch (error) {
|
|
14
|
+
return errorResponse(error);
|
|
15
|
+
}
|
|
16
|
+
});
|
|
17
|
+
server.registerTool("nomba_fund_betting_account", {
|
|
18
|
+
title: "Fund Betting Account",
|
|
19
|
+
description: "Fund a customer's betting account on a supported betting platform. Amount is in Naira.",
|
|
20
|
+
inputSchema: {
|
|
21
|
+
customerId: z
|
|
22
|
+
.string()
|
|
23
|
+
.describe("The customer's betting account ID/username"),
|
|
24
|
+
providerCode: z.string().describe("Betting provider code"),
|
|
25
|
+
amount: z
|
|
26
|
+
.number()
|
|
27
|
+
.positive()
|
|
28
|
+
.describe("Amount in Naira to fund"),
|
|
29
|
+
},
|
|
30
|
+
}, async ({ customerId, providerCode, amount }) => {
|
|
31
|
+
logToolCall("nomba_fund_betting_account", { customerId, providerCode, amount });
|
|
32
|
+
try {
|
|
33
|
+
const result = await client.post("/v1/bills/betting/pay", {
|
|
34
|
+
customerId,
|
|
35
|
+
providerCode,
|
|
36
|
+
amount,
|
|
37
|
+
});
|
|
38
|
+
return jsonResponse(result);
|
|
39
|
+
}
|
|
40
|
+
catch (error) {
|
|
41
|
+
return errorResponse(error);
|
|
42
|
+
}
|
|
43
|
+
});
|
|
44
|
+
}
|
|
45
|
+
//# sourceMappingURL=betting.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"betting.js","sourceRoot":"","sources":["../../../src/tools/bills/betting.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAE1E,MAAM,UAAU,oBAAoB,CAClC,MAAiB,EACjB,MAAmB;IAEnB,MAAM,CAAC,YAAY,CACjB,6BAA6B,EAC7B;QACE,KAAK,EAAE,uBAAuB;QAC9B,WAAW,EACT,iHAAiH;KACpH,EACD,KAAK,IAAI,EAAE;QACT,WAAW,CAAC,6BAA6B,CAAC,CAAC;QAC3C,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,GAAG,CAAC,6BAA6B,CAAC,CAAC;YAC/D,OAAO,YAAY,CAAC,MAAM,CAAC,CAAC;QAC9B,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,aAAa,CAAC,KAAK,CAAC,CAAC;QAC9B,CAAC;IACH,CAAC,CACF,CAAC;IAEF,MAAM,CAAC,YAAY,CACjB,4BAA4B,EAC5B;QACE,KAAK,EAAE,sBAAsB;QAC7B,WAAW,EACT,wFAAwF;QAC1F,WAAW,EAAE;YACX,UAAU,EAAE,CAAC;iBACV,MAAM,EAAE;iBACR,QAAQ,CAAC,4CAA4C,CAAC;YACzD,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,uBAAuB,CAAC;YAC1D,MAAM,EAAE,CAAC;iBACN,MAAM,EAAE;iBACR,QAAQ,EAAE;iBACV,QAAQ,CAAC,yBAAyB,CAAC;SACvC;KACF,EACD,KAAK,EAAE,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,EAAE,EAAE,EAAE;QAC7C,WAAW,CAAC,4BAA4B,EAAE,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,EAAE,CAAC,CAAC;QAChF,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,uBAAuB,EAAE;gBACxD,UAAU;gBACV,YAAY;gBACZ,MAAM;aACP,CAAC,CAAC;YACH,OAAO,YAAY,CAAC,MAAM,CAAC,CAAC;QAC9B,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,aAAa,CAAC,KAAK,CAAC,CAAC;QAC9B,CAAC;IACH,CAAC,CACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { jsonResponse, errorResponse, logToolCall } from "../../utils.js";
|
|
3
|
+
export function registerCableTools(server, client) {
|
|
4
|
+
server.registerTool("nomba_get_cable_providers", {
|
|
5
|
+
title: "Get Cable TV Providers",
|
|
6
|
+
description: "Fetch the list of available cable TV providers (e.g., DSTV, GOtv, Startimes). Use this to get provider codes before paying for a cable subscription.",
|
|
7
|
+
}, async () => {
|
|
8
|
+
logToolCall("nomba_get_cable_providers");
|
|
9
|
+
try {
|
|
10
|
+
const result = await client.get("/v1/bills/cabletv/providers");
|
|
11
|
+
return jsonResponse(result);
|
|
12
|
+
}
|
|
13
|
+
catch (error) {
|
|
14
|
+
return errorResponse(error);
|
|
15
|
+
}
|
|
16
|
+
});
|
|
17
|
+
server.registerTool("nomba_lookup_cable_customer", {
|
|
18
|
+
title: "Lookup Cable TV Customer",
|
|
19
|
+
description: "Validate a cable TV smartcard/IUC number and get the customer's name. Always use this before paying for a cable subscription.",
|
|
20
|
+
inputSchema: {
|
|
21
|
+
smartcardNumber: z
|
|
22
|
+
.string()
|
|
23
|
+
.describe("The smartcard or IUC number"),
|
|
24
|
+
providerCode: z.string().describe("Cable TV provider code"),
|
|
25
|
+
},
|
|
26
|
+
}, async ({ smartcardNumber, providerCode }) => {
|
|
27
|
+
logToolCall("nomba_lookup_cable_customer", { smartcardNumber, providerCode });
|
|
28
|
+
try {
|
|
29
|
+
const result = await client.post("/v1/bills/cabletv/customer-lookup", { smartcardNumber, providerCode });
|
|
30
|
+
return jsonResponse(result);
|
|
31
|
+
}
|
|
32
|
+
catch (error) {
|
|
33
|
+
return errorResponse(error);
|
|
34
|
+
}
|
|
35
|
+
});
|
|
36
|
+
server.registerTool("nomba_pay_cable_subscription", {
|
|
37
|
+
title: "Pay Cable TV Subscription",
|
|
38
|
+
description: "Pay for a cable TV subscription (DSTV, GOtv, Startimes, etc.). Amount is in Naira.",
|
|
39
|
+
inputSchema: {
|
|
40
|
+
smartcardNumber: z
|
|
41
|
+
.string()
|
|
42
|
+
.describe("The smartcard or IUC number"),
|
|
43
|
+
providerCode: z.string().describe("Cable TV provider code"),
|
|
44
|
+
productCode: z
|
|
45
|
+
.string()
|
|
46
|
+
.describe("The subscription plan/bouquet code"),
|
|
47
|
+
amount: z
|
|
48
|
+
.number()
|
|
49
|
+
.positive()
|
|
50
|
+
.describe("Amount in Naira to pay"),
|
|
51
|
+
},
|
|
52
|
+
}, async ({ smartcardNumber, providerCode, productCode, amount }) => {
|
|
53
|
+
logToolCall("nomba_pay_cable_subscription", { smartcardNumber, providerCode, productCode, amount });
|
|
54
|
+
try {
|
|
55
|
+
const result = await client.post("/v1/bills/cabletv/pay", {
|
|
56
|
+
smartcardNumber,
|
|
57
|
+
providerCode,
|
|
58
|
+
productCode,
|
|
59
|
+
amount,
|
|
60
|
+
});
|
|
61
|
+
return jsonResponse(result);
|
|
62
|
+
}
|
|
63
|
+
catch (error) {
|
|
64
|
+
return errorResponse(error);
|
|
65
|
+
}
|
|
66
|
+
});
|
|
67
|
+
}
|
|
68
|
+
//# sourceMappingURL=cable.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cable.js","sourceRoot":"","sources":["../../../src/tools/bills/cable.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAE1E,MAAM,UAAU,kBAAkB,CAChC,MAAiB,EACjB,MAAmB;IAEnB,MAAM,CAAC,YAAY,CACjB,2BAA2B,EAC3B;QACE,KAAK,EAAE,wBAAwB;QAC/B,WAAW,EACT,sJAAsJ;KACzJ,EACD,KAAK,IAAI,EAAE;QACT,WAAW,CAAC,2BAA2B,CAAC,CAAC;QACzC,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,GAAG,CAAC,6BAA6B,CAAC,CAAC;YAC/D,OAAO,YAAY,CAAC,MAAM,CAAC,CAAC;QAC9B,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,aAAa,CAAC,KAAK,CAAC,CAAC;QAC9B,CAAC;IACH,CAAC,CACF,CAAC;IAEF,MAAM,CAAC,YAAY,CACjB,6BAA6B,EAC7B;QACE,KAAK,EAAE,0BAA0B;QACjC,WAAW,EACT,+HAA+H;QACjI,WAAW,EAAE;YACX,eAAe,EAAE,CAAC;iBACf,MAAM,EAAE;iBACR,QAAQ,CAAC,6BAA6B,CAAC;YAC1C,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,wBAAwB,CAAC;SAC5D;KACF,EACD,KAAK,EAAE,EAAE,eAAe,EAAE,YAAY,EAAE,EAAE,EAAE;QAC1C,WAAW,CAAC,6BAA6B,EAAE,EAAE,eAAe,EAAE,YAAY,EAAE,CAAC,CAAC;QAC9E,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,IAAI,CAC9B,mCAAmC,EACnC,EAAE,eAAe,EAAE,YAAY,EAAE,CAClC,CAAC;YACF,OAAO,YAAY,CAAC,MAAM,CAAC,CAAC;QAC9B,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,aAAa,CAAC,KAAK,CAAC,CAAC;QAC9B,CAAC;IACH,CAAC,CACF,CAAC;IAEF,MAAM,CAAC,YAAY,CACjB,8BAA8B,EAC9B;QACE,KAAK,EAAE,2BAA2B;QAClC,WAAW,EACT,oFAAoF;QACtF,WAAW,EAAE;YACX,eAAe,EAAE,CAAC;iBACf,MAAM,EAAE;iBACR,QAAQ,CAAC,6BAA6B,CAAC;YAC1C,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,wBAAwB,CAAC;YAC3D,WAAW,EAAE,CAAC;iBACX,MAAM,EAAE;iBACR,QAAQ,CAAC,oCAAoC,CAAC;YACjD,MAAM,EAAE,CAAC;iBACN,MAAM,EAAE;iBACR,QAAQ,EAAE;iBACV,QAAQ,CAAC,wBAAwB,CAAC;SACtC;KACF,EACD,KAAK,EAAE,EAAE,eAAe,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,EAAE,EAAE,EAAE;QAC/D,WAAW,CAAC,8BAA8B,EAAE,EAAE,eAAe,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,EAAE,CAAC,CAAC;QACpG,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,uBAAuB,EAAE;gBACxD,eAAe;gBACf,YAAY;gBACZ,WAAW;gBACX,MAAM;aACP,CAAC,CAAC;YACH,OAAO,YAAY,CAAC,MAAM,CAAC,CAAC;QAC9B,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,aAAa,CAAC,KAAK,CAAC,CAAC;QAC9B,CAAC;IACH,CAAC,CACF,CAAC;AACJ,CAAC"}
|