paywhere-mcp-admin 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/dist/client.d.ts +49 -0
- package/dist/client.js +192 -0
- package/dist/client.js.map +1 -0
- package/dist/environments.d.ts +23 -0
- package/dist/environments.js +77 -0
- package/dist/environments.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +89 -0
- package/dist/index.js.map +1 -0
- package/dist/tools/approval.d.ts +3 -0
- package/dist/tools/approval.js +69 -0
- package/dist/tools/approval.js.map +1 -0
- package/dist/tools/auth.d.ts +3 -0
- package/dist/tools/auth.js +12 -0
- package/dist/tools/auth.js.map +1 -0
- package/dist/tools/config.d.ts +3 -0
- package/dist/tools/config.js +10 -0
- package/dist/tools/config.js.map +1 -0
- package/dist/tools/disbursements.d.ts +3 -0
- package/dist/tools/disbursements.js +57 -0
- package/dist/tools/disbursements.js.map +1 -0
- package/dist/tools/environments.d.ts +3 -0
- package/dist/tools/environments.js +33 -0
- package/dist/tools/environments.js.map +1 -0
- package/dist/tools/mock.d.ts +3 -0
- package/dist/tools/mock.js +77 -0
- package/dist/tools/mock.js.map +1 -0
- package/dist/tools/stablecoin.d.ts +3 -0
- package/dist/tools/stablecoin.js +31 -0
- package/dist/tools/stablecoin.js.map +1 -0
- package/dist/tools/users.d.ts +3 -0
- package/dist/tools/users.js +82 -0
- package/dist/tools/users.js.map +1 -0
- package/dist/util.d.ts +9 -0
- package/dist/util.js +10 -0
- package/dist/util.js.map +1 -0
- package/package.json +32 -0
package/dist/client.d.ts
ADDED
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* HTTP client for the Paywhere Admin API.
|
|
3
|
+
* Manages session tokens and provides typed methods for all admin API endpoints.
|
|
4
|
+
*/
|
|
5
|
+
export declare class PaywhereAdminClient {
|
|
6
|
+
private baseUrl;
|
|
7
|
+
private userToken;
|
|
8
|
+
constructor(baseUrl: string);
|
|
9
|
+
getBaseUrl(): string;
|
|
10
|
+
getUserToken(): string | null;
|
|
11
|
+
isLoggedIn(): boolean;
|
|
12
|
+
private request;
|
|
13
|
+
loginUser(username: string, secret: string): Promise<unknown>;
|
|
14
|
+
createUser(body: Record<string, unknown>): Promise<unknown>;
|
|
15
|
+
updateUser(username: string, body: Record<string, unknown>): Promise<unknown>;
|
|
16
|
+
getUser(username: string): Promise<unknown>;
|
|
17
|
+
listUsers(): Promise<unknown>;
|
|
18
|
+
listAuthorizableEndpoints(): Promise<unknown>;
|
|
19
|
+
resetUserSecret(username: string): Promise<unknown>;
|
|
20
|
+
deleteUser(username: string): Promise<unknown>;
|
|
21
|
+
authorizeEndpoint(username: string, endpoint: string): Promise<unknown>;
|
|
22
|
+
listAuthorizedEndpoints(username: string): Promise<unknown>;
|
|
23
|
+
deauthorizeEndpoint(username: string, endpoint: string): Promise<unknown>;
|
|
24
|
+
submitDisbursementJob(body: Record<string, unknown>): Promise<unknown>;
|
|
25
|
+
listDisbursementJobs(): Promise<unknown>;
|
|
26
|
+
authorizeDisbursementJob(jobId: string): Promise<unknown>;
|
|
27
|
+
getDisbursementJobStatus(jobId: string): Promise<unknown>;
|
|
28
|
+
deleteDisbursementJob(jobId: string): Promise<unknown>;
|
|
29
|
+
clearActiveDisbursementJob(): Promise<unknown>;
|
|
30
|
+
listRecipientsForApproval(options?: {
|
|
31
|
+
bankUsername?: string;
|
|
32
|
+
pendingOnly?: string;
|
|
33
|
+
}): Promise<unknown>;
|
|
34
|
+
approveRecipient(walletAddress: string, bankUsername: string, approved?: boolean): Promise<unknown>;
|
|
35
|
+
listSendersForApproval(options?: {
|
|
36
|
+
bankUsername?: string;
|
|
37
|
+
pendingOnly?: string;
|
|
38
|
+
}): Promise<unknown>;
|
|
39
|
+
approveSender(walletAddress: string, bankUsername: string, approved?: boolean): Promise<unknown>;
|
|
40
|
+
getMasterWalletBalance(currency: string): Promise<unknown>;
|
|
41
|
+
listPayments(bankUsername: string): Promise<unknown>;
|
|
42
|
+
listReceipts(bankUsername: string): Promise<unknown>;
|
|
43
|
+
createMockUser(body: Record<string, unknown>): Promise<unknown>;
|
|
44
|
+
openMockAccount(body: Record<string, unknown>): Promise<unknown>;
|
|
45
|
+
createMockACHRecipient(body: Record<string, unknown>): Promise<unknown>;
|
|
46
|
+
depositToMockAccount(accountNumber: string, body: Record<string, unknown>): Promise<unknown>;
|
|
47
|
+
withdrawFromMockAccount(accountNumber: string, body: Record<string, unknown>): Promise<unknown>;
|
|
48
|
+
getDeploymentConfig(): Promise<unknown>;
|
|
49
|
+
}
|
package/dist/client.js
ADDED
|
@@ -0,0 +1,192 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* HTTP client for the Paywhere Admin API.
|
|
3
|
+
* Manages session tokens and provides typed methods for all admin API endpoints.
|
|
4
|
+
*/
|
|
5
|
+
export class PaywhereAdminClient {
|
|
6
|
+
baseUrl;
|
|
7
|
+
userToken = null;
|
|
8
|
+
constructor(baseUrl) {
|
|
9
|
+
this.baseUrl = baseUrl.replace(/\/+$/, "");
|
|
10
|
+
}
|
|
11
|
+
getBaseUrl() {
|
|
12
|
+
return this.baseUrl;
|
|
13
|
+
}
|
|
14
|
+
getUserToken() {
|
|
15
|
+
return this.userToken;
|
|
16
|
+
}
|
|
17
|
+
isLoggedIn() {
|
|
18
|
+
return this.userToken !== null;
|
|
19
|
+
}
|
|
20
|
+
async request(method, path, options = {}) {
|
|
21
|
+
const { body, query, requireUserToken = true } = options;
|
|
22
|
+
if (requireUserToken && !this.userToken) {
|
|
23
|
+
throw new Error("Not authenticated. Call login_user first to obtain a user token.");
|
|
24
|
+
}
|
|
25
|
+
let url = `${this.baseUrl}${path}`;
|
|
26
|
+
if (query) {
|
|
27
|
+
const params = new URLSearchParams();
|
|
28
|
+
for (const [key, value] of Object.entries(query)) {
|
|
29
|
+
if (value !== undefined) {
|
|
30
|
+
params.append(key, String(value));
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
const qs = params.toString();
|
|
34
|
+
if (qs) {
|
|
35
|
+
url += `?${qs}`;
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
const headers = {
|
|
39
|
+
"Content-Type": "application/json",
|
|
40
|
+
Accept: "application/json",
|
|
41
|
+
};
|
|
42
|
+
if (this.userToken) {
|
|
43
|
+
headers["X-User-Token"] = this.userToken;
|
|
44
|
+
}
|
|
45
|
+
const response = await fetch(url, {
|
|
46
|
+
method,
|
|
47
|
+
headers,
|
|
48
|
+
body: body ? JSON.stringify(body) : undefined,
|
|
49
|
+
});
|
|
50
|
+
const text = await response.text();
|
|
51
|
+
if (!text) {
|
|
52
|
+
return {};
|
|
53
|
+
}
|
|
54
|
+
try {
|
|
55
|
+
return JSON.parse(text);
|
|
56
|
+
}
|
|
57
|
+
catch {
|
|
58
|
+
throw new Error(`Non-JSON response (HTTP ${response.status}): ${text.substring(0, 500)}`);
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
// ── Auth ──────────────────────────────────────────────────────────────
|
|
62
|
+
async loginUser(username, secret) {
|
|
63
|
+
const result = await this.request("POST", "/user/login", {
|
|
64
|
+
body: { username, secret },
|
|
65
|
+
requireUserToken: false,
|
|
66
|
+
});
|
|
67
|
+
const data = result;
|
|
68
|
+
if (data.token) {
|
|
69
|
+
this.userToken = data.token;
|
|
70
|
+
}
|
|
71
|
+
return result;
|
|
72
|
+
}
|
|
73
|
+
// ── User Management ──────────────────────────────────────────────────
|
|
74
|
+
async createUser(body) {
|
|
75
|
+
return this.request("POST", "/users", { body });
|
|
76
|
+
}
|
|
77
|
+
async updateUser(username, body) {
|
|
78
|
+
return this.request("POST", `/users/${encodeURIComponent(username)}`, {
|
|
79
|
+
body,
|
|
80
|
+
});
|
|
81
|
+
}
|
|
82
|
+
async getUser(username) {
|
|
83
|
+
return this.request("GET", `/users/${encodeURIComponent(username)}`);
|
|
84
|
+
}
|
|
85
|
+
async listUsers() {
|
|
86
|
+
return this.request("GET", "/users");
|
|
87
|
+
}
|
|
88
|
+
async listAuthorizableEndpoints() {
|
|
89
|
+
return this.request("GET", "/endpoints");
|
|
90
|
+
}
|
|
91
|
+
async resetUserSecret(username) {
|
|
92
|
+
return this.request("POST", `/users/${encodeURIComponent(username)}/reset-secret`, { body: {} });
|
|
93
|
+
}
|
|
94
|
+
async deleteUser(username) {
|
|
95
|
+
return this.request("DELETE", `/users/${encodeURIComponent(username)}`, { body: {} });
|
|
96
|
+
}
|
|
97
|
+
async authorizeEndpoint(username, endpoint) {
|
|
98
|
+
return this.request("POST", `/users/${encodeURIComponent(username)}/endpoints`, { body: { username, endpoint } });
|
|
99
|
+
}
|
|
100
|
+
async listAuthorizedEndpoints(username) {
|
|
101
|
+
return this.request("GET", `/users/${encodeURIComponent(username)}/endpoints`);
|
|
102
|
+
}
|
|
103
|
+
async deauthorizeEndpoint(username, endpoint) {
|
|
104
|
+
return this.request("POST", `/users/${encodeURIComponent(username)}/endpoints/${encodeURIComponent(endpoint)}`, { body: {} });
|
|
105
|
+
}
|
|
106
|
+
// ── Stablecoin Disbursements ─────────────────────────────────────────
|
|
107
|
+
async submitDisbursementJob(body) {
|
|
108
|
+
return this.request("POST", "/stablecoin/disbursements", { body });
|
|
109
|
+
}
|
|
110
|
+
async listDisbursementJobs() {
|
|
111
|
+
return this.request("GET", "/stablecoin/disbursements");
|
|
112
|
+
}
|
|
113
|
+
async authorizeDisbursementJob(jobId) {
|
|
114
|
+
return this.request("POST", `/stablecoin/disbursements/${encodeURIComponent(jobId)}/authorize`, { body: {} });
|
|
115
|
+
}
|
|
116
|
+
async getDisbursementJobStatus(jobId) {
|
|
117
|
+
return this.request("GET", `/stablecoin/disbursements/${encodeURIComponent(jobId)}/status`);
|
|
118
|
+
}
|
|
119
|
+
async deleteDisbursementJob(jobId) {
|
|
120
|
+
return this.request("DELETE", `/stablecoin/disbursements/${encodeURIComponent(jobId)}`, { body: {} });
|
|
121
|
+
}
|
|
122
|
+
async clearActiveDisbursementJob() {
|
|
123
|
+
return this.request("POST", "/stablecoin/disbursements/active/clear", {
|
|
124
|
+
body: {},
|
|
125
|
+
});
|
|
126
|
+
}
|
|
127
|
+
// ── Stablecoin Approval ──────────────────────────────────────────────
|
|
128
|
+
async listRecipientsForApproval(options) {
|
|
129
|
+
return this.request("GET", "/stablecoin/recipients", {
|
|
130
|
+
query: options,
|
|
131
|
+
});
|
|
132
|
+
}
|
|
133
|
+
async approveRecipient(walletAddress, bankUsername, approved) {
|
|
134
|
+
return this.request("POST", `/stablecoin/recipients/${encodeURIComponent(walletAddress)}/approve`, { query: { bankUsername, approved } });
|
|
135
|
+
}
|
|
136
|
+
async listSendersForApproval(options) {
|
|
137
|
+
return this.request("GET", "/stablecoin/senders", {
|
|
138
|
+
query: options,
|
|
139
|
+
});
|
|
140
|
+
}
|
|
141
|
+
async approveSender(walletAddress, bankUsername, approved) {
|
|
142
|
+
return this.request("POST", `/stablecoin/senders/${encodeURIComponent(walletAddress)}/approve`, { query: { bankUsername, approved } });
|
|
143
|
+
}
|
|
144
|
+
// ── Stablecoin Master Wallet & Payments ──────────────────────────────
|
|
145
|
+
async getMasterWalletBalance(currency) {
|
|
146
|
+
return this.request("GET", "/stablecoin/master/balance", {
|
|
147
|
+
query: { currency },
|
|
148
|
+
});
|
|
149
|
+
}
|
|
150
|
+
async listPayments(bankUsername) {
|
|
151
|
+
return this.request("GET", "/stablecoin/payments", {
|
|
152
|
+
query: { bankUsername },
|
|
153
|
+
});
|
|
154
|
+
}
|
|
155
|
+
async listReceipts(bankUsername) {
|
|
156
|
+
return this.request("GET", "/stablecoin/receipts", {
|
|
157
|
+
query: { bankUsername },
|
|
158
|
+
});
|
|
159
|
+
}
|
|
160
|
+
// ── Mock Bank Connector ──────────────────────────────────────────────
|
|
161
|
+
async createMockUser(body) {
|
|
162
|
+
return this.request("POST", "/mock/users", {
|
|
163
|
+
body,
|
|
164
|
+
requireUserToken: false,
|
|
165
|
+
});
|
|
166
|
+
}
|
|
167
|
+
async openMockAccount(body) {
|
|
168
|
+
return this.request("POST", "/mock/accounts", {
|
|
169
|
+
body,
|
|
170
|
+
requireUserToken: false,
|
|
171
|
+
});
|
|
172
|
+
}
|
|
173
|
+
async createMockACHRecipient(body) {
|
|
174
|
+
return this.request("POST", "/mock/recipients", {
|
|
175
|
+
body,
|
|
176
|
+
requireUserToken: false,
|
|
177
|
+
});
|
|
178
|
+
}
|
|
179
|
+
async depositToMockAccount(accountNumber, body) {
|
|
180
|
+
return this.request("POST", `/mock/accounts/${encodeURIComponent(accountNumber)}/deposit`, { body, requireUserToken: false });
|
|
181
|
+
}
|
|
182
|
+
async withdrawFromMockAccount(accountNumber, body) {
|
|
183
|
+
return this.request("POST", `/mock/accounts/${encodeURIComponent(accountNumber)}/withdraw`, { body, requireUserToken: false });
|
|
184
|
+
}
|
|
185
|
+
// ── Deployment Config ────────────────────────────────────────────────
|
|
186
|
+
async getDeploymentConfig() {
|
|
187
|
+
return this.request("GET", "/deployment/config", {
|
|
188
|
+
requireUserToken: false,
|
|
189
|
+
});
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
//# sourceMappingURL=client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,OAAO,mBAAmB;IACtB,OAAO,CAAS;IAChB,SAAS,GAAkB,IAAI,CAAC;IAExC,YAAY,OAAe;QACzB,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;IAC7C,CAAC;IAED,UAAU;QACR,OAAO,IAAI,CAAC,OAAO,CAAC;IACtB,CAAC;IAED,YAAY;QACV,OAAO,IAAI,CAAC,SAAS,CAAC;IACxB,CAAC;IAED,UAAU;QACR,OAAO,IAAI,CAAC,SAAS,KAAK,IAAI,CAAC;IACjC,CAAC;IAEO,KAAK,CAAC,OAAO,CACnB,MAAc,EACd,IAAY,EACZ,UAII,EAAE;QAEN,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,gBAAgB,GAAG,IAAI,EAAE,GAAG,OAAO,CAAC;QAEzD,IAAI,gBAAgB,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC;YACxC,MAAM,IAAI,KAAK,CACb,kEAAkE,CACnE,CAAC;QACJ,CAAC;QAED,IAAI,GAAG,GAAG,GAAG,IAAI,CAAC,OAAO,GAAG,IAAI,EAAE,CAAC;QACnC,IAAI,KAAK,EAAE,CAAC;YACV,MAAM,MAAM,GAAG,IAAI,eAAe,EAAE,CAAC;YACrC,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;gBACjD,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;oBACxB,MAAM,CAAC,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;gBACpC,CAAC;YACH,CAAC;YACD,MAAM,EAAE,GAAG,MAAM,CAAC,QAAQ,EAAE,CAAC;YAC7B,IAAI,EAAE,EAAE,CAAC;gBACP,GAAG,IAAI,IAAI,EAAE,EAAE,CAAC;YAClB,CAAC;QACH,CAAC;QAED,MAAM,OAAO,GAA2B;YACtC,cAAc,EAAE,kBAAkB;YAClC,MAAM,EAAE,kBAAkB;SAC3B,CAAC;QACF,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;YACnB,OAAO,CAAC,cAAc,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC;QAC3C,CAAC;QAED,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE;YAChC,MAAM;YACN,OAAO;YACP,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS;SAC9C,CAAC,CAAC;QAEH,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;QACnC,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,OAAO,EAAE,CAAC;QACZ,CAAC;QAED,IAAI,CAAC;YACH,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAC1B,CAAC;QAAC,MAAM,CAAC;YACP,MAAM,IAAI,KAAK,CACb,2BAA2B,QAAQ,CAAC,MAAM,MAAM,IAAI,CAAC,SAAS,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CACzE,CAAC;QACJ,CAAC;IACH,CAAC;IAED,yEAAyE;IAEzE,KAAK,CAAC,SAAS,CAAC,QAAgB,EAAE,MAAc;QAC9C,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,aAAa,EAAE;YACvD,IAAI,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE;YAC1B,gBAAgB,EAAE,KAAK;SACxB,CAAC,CAAC;QACH,MAAM,IAAI,GAAG,MAAiC,CAAC;QAC/C,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;YACf,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,KAAe,CAAC;QACxC,CAAC;QACD,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,wEAAwE;IAExE,KAAK,CAAC,UAAU,CAAC,IAA6B;QAC5C,OAAO,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,QAAQ,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC;IAClD,CAAC;IAED,KAAK,CAAC,UAAU,CACd,QAAgB,EAChB,IAA6B;QAE7B,OAAO,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,UAAU,kBAAkB,CAAC,QAAQ,CAAC,EAAE,EAAE;YACpE,IAAI;SACL,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,QAAgB;QAC5B,OAAO,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,UAAU,kBAAkB,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;IACvE,CAAC;IAED,KAAK,CAAC,SAAS;QACb,OAAO,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;IACvC,CAAC;IAED,KAAK,CAAC,yBAAyB;QAC7B,OAAO,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,YAAY,CAAC,CAAC;IAC3C,CAAC;IAED,KAAK,CAAC,eAAe,CAAC,QAAgB;QACpC,OAAO,IAAI,CAAC,OAAO,CACjB,MAAM,EACN,UAAU,kBAAkB,CAAC,QAAQ,CAAC,eAAe,EACrD,EAAE,IAAI,EAAE,EAAE,EAAE,CACb,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,QAAgB;QAC/B,OAAO,IAAI,CAAC,OAAO,CACjB,QAAQ,EACR,UAAU,kBAAkB,CAAC,QAAQ,CAAC,EAAE,EACxC,EAAE,IAAI,EAAE,EAAE,EAAE,CACb,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,iBAAiB,CACrB,QAAgB,EAChB,QAAgB;QAEhB,OAAO,IAAI,CAAC,OAAO,CACjB,MAAM,EACN,UAAU,kBAAkB,CAAC,QAAQ,CAAC,YAAY,EAClD,EAAE,IAAI,EAAE,EAAE,QAAQ,EAAE,QAAQ,EAAE,EAAE,CACjC,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,uBAAuB,CAAC,QAAgB;QAC5C,OAAO,IAAI,CAAC,OAAO,CACjB,KAAK,EACL,UAAU,kBAAkB,CAAC,QAAQ,CAAC,YAAY,CACnD,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,mBAAmB,CACvB,QAAgB,EAChB,QAAgB;QAEhB,OAAO,IAAI,CAAC,OAAO,CACjB,MAAM,EACN,UAAU,kBAAkB,CAAC,QAAQ,CAAC,cAAc,kBAAkB,CAAC,QAAQ,CAAC,EAAE,EAClF,EAAE,IAAI,EAAE,EAAE,EAAE,CACb,CAAC;IACJ,CAAC;IAED,wEAAwE;IAExE,KAAK,CAAC,qBAAqB,CAAC,IAA6B;QACvD,OAAO,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,2BAA2B,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC;IACrE,CAAC;IAED,KAAK,CAAC,oBAAoB;QACxB,OAAO,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,2BAA2B,CAAC,CAAC;IAC1D,CAAC;IAED,KAAK,CAAC,wBAAwB,CAAC,KAAa;QAC1C,OAAO,IAAI,CAAC,OAAO,CACjB,MAAM,EACN,6BAA6B,kBAAkB,CAAC,KAAK,CAAC,YAAY,EAClE,EAAE,IAAI,EAAE,EAAE,EAAE,CACb,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,wBAAwB,CAAC,KAAa;QAC1C,OAAO,IAAI,CAAC,OAAO,CACjB,KAAK,EACL,6BAA6B,kBAAkB,CAAC,KAAK,CAAC,SAAS,CAChE,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,qBAAqB,CAAC,KAAa;QACvC,OAAO,IAAI,CAAC,OAAO,CACjB,QAAQ,EACR,6BAA6B,kBAAkB,CAAC,KAAK,CAAC,EAAE,EACxD,EAAE,IAAI,EAAE,EAAE,EAAE,CACb,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,0BAA0B;QAC9B,OAAO,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,wCAAwC,EAAE;YACpE,IAAI,EAAE,EAAE;SACT,CAAC,CAAC;IACL,CAAC;IAED,wEAAwE;IAExE,KAAK,CAAC,yBAAyB,CAAC,OAG/B;QACC,OAAO,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,wBAAwB,EAAE;YACnD,KAAK,EAAE,OAA6C;SACrD,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,gBAAgB,CACpB,aAAqB,EACrB,YAAoB,EACpB,QAAkB;QAElB,OAAO,IAAI,CAAC,OAAO,CACjB,MAAM,EACN,0BAA0B,kBAAkB,CAAC,aAAa,CAAC,UAAU,EACrE,EAAE,KAAK,EAAE,EAAE,YAAY,EAAE,QAAQ,EAAE,EAAE,CACtC,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,sBAAsB,CAAC,OAG5B;QACC,OAAO,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,qBAAqB,EAAE;YAChD,KAAK,EAAE,OAA6C;SACrD,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,aAAa,CACjB,aAAqB,EACrB,YAAoB,EACpB,QAAkB;QAElB,OAAO,IAAI,CAAC,OAAO,CACjB,MAAM,EACN,uBAAuB,kBAAkB,CAAC,aAAa,CAAC,UAAU,EAClE,EAAE,KAAK,EAAE,EAAE,YAAY,EAAE,QAAQ,EAAE,EAAE,CACtC,CAAC;IACJ,CAAC;IAED,wEAAwE;IAExE,KAAK,CAAC,sBAAsB,CAAC,QAAgB;QAC3C,OAAO,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,4BAA4B,EAAE;YACvD,KAAK,EAAE,EAAE,QAAQ,EAAE;SACpB,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,YAAY,CAAC,YAAoB;QACrC,OAAO,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,sBAAsB,EAAE;YACjD,KAAK,EAAE,EAAE,YAAY,EAAE;SACxB,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,YAAY,CAAC,YAAoB;QACrC,OAAO,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,sBAAsB,EAAE;YACjD,KAAK,EAAE,EAAE,YAAY,EAAE;SACxB,CAAC,CAAC;IACL,CAAC;IAED,wEAAwE;IAExE,KAAK,CAAC,cAAc,CAAC,IAA6B;QAChD,OAAO,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,aAAa,EAAE;YACzC,IAAI;YACJ,gBAAgB,EAAE,KAAK;SACxB,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,eAAe,CAAC,IAA6B;QACjD,OAAO,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,gBAAgB,EAAE;YAC5C,IAAI;YACJ,gBAAgB,EAAE,KAAK;SACxB,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,sBAAsB,CAC1B,IAA6B;QAE7B,OAAO,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,kBAAkB,EAAE;YAC9C,IAAI;YACJ,gBAAgB,EAAE,KAAK;SACxB,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,oBAAoB,CACxB,aAAqB,EACrB,IAA6B;QAE7B,OAAO,IAAI,CAAC,OAAO,CACjB,MAAM,EACN,kBAAkB,kBAAkB,CAAC,aAAa,CAAC,UAAU,EAC7D,EAAE,IAAI,EAAE,gBAAgB,EAAE,KAAK,EAAE,CAClC,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,uBAAuB,CAC3B,aAAqB,EACrB,IAA6B;QAE7B,OAAO,IAAI,CAAC,OAAO,CACjB,MAAM,EACN,kBAAkB,kBAAkB,CAAC,aAAa,CAAC,WAAW,EAC9D,EAAE,IAAI,EAAE,gBAAgB,EAAE,KAAK,EAAE,CAClC,CAAC;IACJ,CAAC;IAED,wEAAwE;IAExE,KAAK,CAAC,mBAAmB;QACvB,OAAO,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,oBAAoB,EAAE;YAC/C,gBAAgB,EAAE,KAAK;SACxB,CAAC,CAAC;IACL,CAAC;CACF"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { PaywhereAdminClient } from "./client.js";
|
|
2
|
+
/**
|
|
3
|
+
* Manages multiple Paywhere Admin API environments with per-environment session state.
|
|
4
|
+
*/
|
|
5
|
+
export declare class EnvironmentManager {
|
|
6
|
+
private namedEnvironments;
|
|
7
|
+
private clients;
|
|
8
|
+
private activeUrl;
|
|
9
|
+
private activeName;
|
|
10
|
+
constructor();
|
|
11
|
+
listEnvironments(): Record<string, string>;
|
|
12
|
+
connect(nameOrUrl: string): {
|
|
13
|
+
name: string | null;
|
|
14
|
+
url: string;
|
|
15
|
+
};
|
|
16
|
+
getActiveClient(): PaywhereAdminClient;
|
|
17
|
+
getStatus(): {
|
|
18
|
+
connected: boolean;
|
|
19
|
+
name: string | null;
|
|
20
|
+
url: string | null;
|
|
21
|
+
authenticated: boolean;
|
|
22
|
+
};
|
|
23
|
+
}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
import { PaywhereAdminClient } from "./client.js";
|
|
2
|
+
/**
|
|
3
|
+
* Manages multiple Paywhere Admin API environments with per-environment session state.
|
|
4
|
+
*/
|
|
5
|
+
export class EnvironmentManager {
|
|
6
|
+
namedEnvironments;
|
|
7
|
+
clients = new Map();
|
|
8
|
+
activeUrl = null;
|
|
9
|
+
activeName = null;
|
|
10
|
+
constructor() {
|
|
11
|
+
const envJson = process.env.PAYWHERE_ADMIN_ENVIRONMENTS;
|
|
12
|
+
if (envJson) {
|
|
13
|
+
try {
|
|
14
|
+
this.namedEnvironments = JSON.parse(envJson);
|
|
15
|
+
}
|
|
16
|
+
catch {
|
|
17
|
+
console.error("Warning: PAYWHERE_ADMIN_ENVIRONMENTS is not valid JSON. No named environments loaded.");
|
|
18
|
+
this.namedEnvironments = {};
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
else {
|
|
22
|
+
this.namedEnvironments = {};
|
|
23
|
+
}
|
|
24
|
+
const defaultUrl = process.env.PAYWHERE_ADMIN_BASE_URL;
|
|
25
|
+
if (defaultUrl) {
|
|
26
|
+
const url = defaultUrl.replace(/\/+$/, "");
|
|
27
|
+
this.clients.set(url, new PaywhereAdminClient(url));
|
|
28
|
+
this.activeUrl = url;
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
listEnvironments() {
|
|
32
|
+
return { ...this.namedEnvironments };
|
|
33
|
+
}
|
|
34
|
+
connect(nameOrUrl) {
|
|
35
|
+
let url;
|
|
36
|
+
let name = null;
|
|
37
|
+
if (this.namedEnvironments[nameOrUrl]) {
|
|
38
|
+
name = nameOrUrl;
|
|
39
|
+
url = this.namedEnvironments[nameOrUrl];
|
|
40
|
+
}
|
|
41
|
+
else {
|
|
42
|
+
url = nameOrUrl;
|
|
43
|
+
for (const [n, u] of Object.entries(this.namedEnvironments)) {
|
|
44
|
+
if (u === url || u === url.replace(/\/+$/, "")) {
|
|
45
|
+
name = n;
|
|
46
|
+
break;
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
url = url.replace(/\/+$/, "");
|
|
51
|
+
if (!this.clients.has(url)) {
|
|
52
|
+
this.clients.set(url, new PaywhereAdminClient(url));
|
|
53
|
+
}
|
|
54
|
+
this.activeUrl = url;
|
|
55
|
+
this.activeName = name;
|
|
56
|
+
return { name, url };
|
|
57
|
+
}
|
|
58
|
+
getActiveClient() {
|
|
59
|
+
if (!this.activeUrl) {
|
|
60
|
+
throw new Error("No environment connected. Call connect() with an environment name or URL first.");
|
|
61
|
+
}
|
|
62
|
+
return this.clients.get(this.activeUrl);
|
|
63
|
+
}
|
|
64
|
+
getStatus() {
|
|
65
|
+
if (!this.activeUrl) {
|
|
66
|
+
return { connected: false, name: null, url: null, authenticated: false };
|
|
67
|
+
}
|
|
68
|
+
const client = this.clients.get(this.activeUrl);
|
|
69
|
+
return {
|
|
70
|
+
connected: true,
|
|
71
|
+
name: this.activeName,
|
|
72
|
+
url: this.activeUrl,
|
|
73
|
+
authenticated: client.isLoggedIn(),
|
|
74
|
+
};
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
//# sourceMappingURL=environments.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"environments.js","sourceRoot":"","sources":["../src/environments.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
package/dist/index.js
ADDED
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
3
|
+
import { EnvironmentManager } from "./environments.js";
|
|
4
|
+
import { registerEnvironmentTools } from "./tools/environments.js";
|
|
5
|
+
import { registerAuthTools } from "./tools/auth.js";
|
|
6
|
+
import { registerUserTools } from "./tools/users.js";
|
|
7
|
+
import { registerDisbursementTools } from "./tools/disbursements.js";
|
|
8
|
+
import { registerApprovalTools } from "./tools/approval.js";
|
|
9
|
+
import { registerStablecoinTools } from "./tools/stablecoin.js";
|
|
10
|
+
import { registerMockTools } from "./tools/mock.js";
|
|
11
|
+
import { registerConfigTools } from "./tools/config.js";
|
|
12
|
+
const args = process.argv.slice(2);
|
|
13
|
+
const httpMode = args.includes("--http");
|
|
14
|
+
const portIndex = args.indexOf("--port");
|
|
15
|
+
const port = portIndex !== -1 ? parseInt(args[portIndex + 1], 10) : 3101;
|
|
16
|
+
function createServer(envManager) {
|
|
17
|
+
const server = new McpServer({
|
|
18
|
+
name: "Paywhere Admin API",
|
|
19
|
+
version: "1.0.0",
|
|
20
|
+
});
|
|
21
|
+
registerEnvironmentTools(server, envManager);
|
|
22
|
+
registerAuthTools(server, envManager);
|
|
23
|
+
registerUserTools(server, envManager);
|
|
24
|
+
registerDisbursementTools(server, envManager);
|
|
25
|
+
registerApprovalTools(server, envManager);
|
|
26
|
+
registerStablecoinTools(server, envManager);
|
|
27
|
+
registerMockTools(server, envManager);
|
|
28
|
+
registerConfigTools(server, envManager);
|
|
29
|
+
return server;
|
|
30
|
+
}
|
|
31
|
+
if (httpMode) {
|
|
32
|
+
const { StreamableHTTPServerTransport } = await import("@modelcontextprotocol/sdk/server/streamableHttp.js");
|
|
33
|
+
const { createMcpExpressApp } = await import("@modelcontextprotocol/sdk/server/express.js");
|
|
34
|
+
const envManager = new EnvironmentManager();
|
|
35
|
+
const app = createMcpExpressApp();
|
|
36
|
+
app.post("/mcp", async (req, res) => {
|
|
37
|
+
const server = createServer(envManager);
|
|
38
|
+
try {
|
|
39
|
+
const transport = new StreamableHTTPServerTransport({
|
|
40
|
+
sessionIdGenerator: undefined,
|
|
41
|
+
});
|
|
42
|
+
await server.connect(transport);
|
|
43
|
+
await transport.handleRequest(req, res, req.body);
|
|
44
|
+
res.on("close", () => {
|
|
45
|
+
transport.close();
|
|
46
|
+
server.close();
|
|
47
|
+
});
|
|
48
|
+
}
|
|
49
|
+
catch (error) {
|
|
50
|
+
console.error("Error handling MCP request:", error);
|
|
51
|
+
if (!res.headersSent) {
|
|
52
|
+
res.status(500).json({
|
|
53
|
+
jsonrpc: "2.0",
|
|
54
|
+
error: { code: -32603, message: "Internal server error" },
|
|
55
|
+
id: null,
|
|
56
|
+
});
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
});
|
|
60
|
+
app.get("/mcp", (_req, res) => {
|
|
61
|
+
res.writeHead(405).end(JSON.stringify({
|
|
62
|
+
jsonrpc: "2.0",
|
|
63
|
+
error: { code: -32000, message: "Method not allowed." },
|
|
64
|
+
id: null,
|
|
65
|
+
}));
|
|
66
|
+
});
|
|
67
|
+
app.delete("/mcp", (_req, res) => {
|
|
68
|
+
res.writeHead(405).end(JSON.stringify({
|
|
69
|
+
jsonrpc: "2.0",
|
|
70
|
+
error: { code: -32000, message: "Method not allowed." },
|
|
71
|
+
id: null,
|
|
72
|
+
}));
|
|
73
|
+
});
|
|
74
|
+
app.listen(port, () => {
|
|
75
|
+
console.log(`Paywhere Admin API MCP server listening on http://localhost:${port}/mcp`);
|
|
76
|
+
});
|
|
77
|
+
process.on("SIGINT", () => {
|
|
78
|
+
console.log("Shutting down...");
|
|
79
|
+
process.exit(0);
|
|
80
|
+
});
|
|
81
|
+
}
|
|
82
|
+
else {
|
|
83
|
+
const { StdioServerTransport } = await import("@modelcontextprotocol/sdk/server/stdio.js");
|
|
84
|
+
const envManager = new EnvironmentManager();
|
|
85
|
+
const server = createServer(envManager);
|
|
86
|
+
const transport = new StdioServerTransport();
|
|
87
|
+
await server.connect(transport);
|
|
88
|
+
}
|
|
89
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { toolResult } from "../util.js";
|
|
3
|
+
export function registerApprovalTools(server, envManager) {
|
|
4
|
+
server.tool("list_recipients_for_approval", "List stablecoin recipients pending wallet owner verification. By default returns only pending recipients. Set pendingOnly to 'false' to return all. Optionally filter by bankUsername, or omit to list across all bank users. Requires login_user first.", {
|
|
5
|
+
bankUsername: z
|
|
6
|
+
.string()
|
|
7
|
+
.optional()
|
|
8
|
+
.describe("The bank user whose recipients to list. If omitted, lists across all bank users"),
|
|
9
|
+
pendingOnly: z
|
|
10
|
+
.string()
|
|
11
|
+
.optional()
|
|
12
|
+
.describe("If 'true' (default), return only pending recipients. Set to 'false' for all"),
|
|
13
|
+
}, async ({ bankUsername, pendingOnly }) => {
|
|
14
|
+
const result = await envManager
|
|
15
|
+
.getActiveClient()
|
|
16
|
+
.listRecipientsForApproval({ bankUsername, pendingOnly });
|
|
17
|
+
return toolResult(result);
|
|
18
|
+
});
|
|
19
|
+
server.tool("approve_recipient", "Approve or reject a stablecoin recipient's wallet owner verification. Requires login_user first.", {
|
|
20
|
+
walletAddress: z
|
|
21
|
+
.string()
|
|
22
|
+
.describe("The wallet address of the recipient to approve/reject"),
|
|
23
|
+
bankUsername: z
|
|
24
|
+
.string()
|
|
25
|
+
.describe("The bank user who owns this recipient"),
|
|
26
|
+
approved: z
|
|
27
|
+
.boolean()
|
|
28
|
+
.optional()
|
|
29
|
+
.describe("true to approve, false to reject. Defaults to true"),
|
|
30
|
+
}, async ({ walletAddress, bankUsername, approved }) => {
|
|
31
|
+
const result = await envManager
|
|
32
|
+
.getActiveClient()
|
|
33
|
+
.approveRecipient(walletAddress, bankUsername, approved);
|
|
34
|
+
return toolResult(result);
|
|
35
|
+
});
|
|
36
|
+
server.tool("list_senders_for_approval", "List stablecoin senders pending wallet owner verification. By default returns only pending senders. Set pendingOnly to 'false' to return all. Optionally filter by bankUsername, or omit to list across all bank users. Requires login_user first.", {
|
|
37
|
+
bankUsername: z
|
|
38
|
+
.string()
|
|
39
|
+
.optional()
|
|
40
|
+
.describe("The bank user whose senders to list. If omitted, lists across all bank users"),
|
|
41
|
+
pendingOnly: z
|
|
42
|
+
.string()
|
|
43
|
+
.optional()
|
|
44
|
+
.describe("If 'true' (default), return only pending senders. Set to 'false' for all"),
|
|
45
|
+
}, async ({ bankUsername, pendingOnly }) => {
|
|
46
|
+
const result = await envManager
|
|
47
|
+
.getActiveClient()
|
|
48
|
+
.listSendersForApproval({ bankUsername, pendingOnly });
|
|
49
|
+
return toolResult(result);
|
|
50
|
+
});
|
|
51
|
+
server.tool("approve_sender", "Approve or reject a stablecoin sender's wallet owner verification. Requires login_user first.", {
|
|
52
|
+
walletAddress: z
|
|
53
|
+
.string()
|
|
54
|
+
.describe("The wallet address of the sender to approve/reject"),
|
|
55
|
+
bankUsername: z
|
|
56
|
+
.string()
|
|
57
|
+
.describe("The bank user who owns this sender"),
|
|
58
|
+
approved: z
|
|
59
|
+
.boolean()
|
|
60
|
+
.optional()
|
|
61
|
+
.describe("true to approve, false to reject. Defaults to true"),
|
|
62
|
+
}, async ({ walletAddress, bankUsername, approved }) => {
|
|
63
|
+
const result = await envManager
|
|
64
|
+
.getActiveClient()
|
|
65
|
+
.approveSender(walletAddress, bankUsername, approved);
|
|
66
|
+
return toolResult(result);
|
|
67
|
+
});
|
|
68
|
+
}
|
|
69
|
+
//# sourceMappingURL=approval.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"approval.js","sourceRoot":"","sources":["../../src/tools/approval.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAExC,MAAM,UAAU,qBAAqB,CACnC,MAAiB,EACjB,UAA8B;IAE9B,MAAM,CAAC,IAAI,CACT,8BAA8B,EAC9B,0PAA0P,EAC1P;QACE,YAAY,EAAE,CAAC;aACZ,MAAM,EAAE;aACR,QAAQ,EAAE;aACV,QAAQ,CACP,iFAAiF,CAClF;QACH,WAAW,EAAE,CAAC;aACX,MAAM,EAAE;aACR,QAAQ,EAAE;aACV,QAAQ,CAAC,6EAA6E,CAAC;KAC3F,EACD,KAAK,EAAE,EAAE,YAAY,EAAE,WAAW,EAAE,EAAE,EAAE;QACtC,MAAM,MAAM,GAAG,MAAM,UAAU;aAC5B,eAAe,EAAE;aACjB,yBAAyB,CAAC,EAAE,YAAY,EAAE,WAAW,EAAE,CAAC,CAAC;QAC5D,OAAO,UAAU,CAAC,MAAM,CAAC,CAAC;IAC5B,CAAC,CACF,CAAC;IAEF,MAAM,CAAC,IAAI,CACT,mBAAmB,EACnB,kGAAkG,EAClG;QACE,aAAa,EAAE,CAAC;aACb,MAAM,EAAE;aACR,QAAQ,CAAC,uDAAuD,CAAC;QACpE,YAAY,EAAE,CAAC;aACZ,MAAM,EAAE;aACR,QAAQ,CAAC,uCAAuC,CAAC;QACpD,QAAQ,EAAE,CAAC;aACR,OAAO,EAAE;aACT,QAAQ,EAAE;aACV,QAAQ,CAAC,oDAAoD,CAAC;KAClE,EACD,KAAK,EAAE,EAAE,aAAa,EAAE,YAAY,EAAE,QAAQ,EAAE,EAAE,EAAE;QAClD,MAAM,MAAM,GAAG,MAAM,UAAU;aAC5B,eAAe,EAAE;aACjB,gBAAgB,CAAC,aAAa,EAAE,YAAY,EAAE,QAAQ,CAAC,CAAC;QAC3D,OAAO,UAAU,CAAC,MAAM,CAAC,CAAC;IAC5B,CAAC,CACF,CAAC;IAEF,MAAM,CAAC,IAAI,CACT,2BAA2B,EAC3B,oPAAoP,EACpP;QACE,YAAY,EAAE,CAAC;aACZ,MAAM,EAAE;aACR,QAAQ,EAAE;aACV,QAAQ,CACP,8EAA8E,CAC/E;QACH,WAAW,EAAE,CAAC;aACX,MAAM,EAAE;aACR,QAAQ,EAAE;aACV,QAAQ,CAAC,0EAA0E,CAAC;KACxF,EACD,KAAK,EAAE,EAAE,YAAY,EAAE,WAAW,EAAE,EAAE,EAAE;QACtC,MAAM,MAAM,GAAG,MAAM,UAAU;aAC5B,eAAe,EAAE;aACjB,sBAAsB,CAAC,EAAE,YAAY,EAAE,WAAW,EAAE,CAAC,CAAC;QACzD,OAAO,UAAU,CAAC,MAAM,CAAC,CAAC;IAC5B,CAAC,CACF,CAAC;IAEF,MAAM,CAAC,IAAI,CACT,gBAAgB,EAChB,+FAA+F,EAC/F;QACE,aAAa,EAAE,CAAC;aACb,MAAM,EAAE;aACR,QAAQ,CAAC,oDAAoD,CAAC;QACjE,YAAY,EAAE,CAAC;aACZ,MAAM,EAAE;aACR,QAAQ,CAAC,oCAAoC,CAAC;QACjD,QAAQ,EAAE,CAAC;aACR,OAAO,EAAE;aACT,QAAQ,EAAE;aACV,QAAQ,CAAC,oDAAoD,CAAC;KAClE,EACD,KAAK,EAAE,EAAE,aAAa,EAAE,YAAY,EAAE,QAAQ,EAAE,EAAE,EAAE;QAClD,MAAM,MAAM,GAAG,MAAM,UAAU;aAC5B,eAAe,EAAE;aACjB,aAAa,CAAC,aAAa,EAAE,YAAY,EAAE,QAAQ,CAAC,CAAC;QACxD,OAAO,UAAU,CAAC,MAAM,CAAC,CAAC;IAC5B,CAAC,CACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { toolResult } from "../util.js";
|
|
3
|
+
export function registerAuthTools(server, envManager) {
|
|
4
|
+
server.tool("login_user", "Authenticate as a Paywhere admin user. Returns a user token that is automatically stored for subsequent calls. This must be called before any other authenticated endpoint.", {
|
|
5
|
+
username: z.string().describe("The Paywhere admin username"),
|
|
6
|
+
secret: z.string().describe("The Paywhere admin secret"),
|
|
7
|
+
}, async ({ username, secret }) => {
|
|
8
|
+
const result = await envManager.getActiveClient().loginUser(username, secret);
|
|
9
|
+
return toolResult(result);
|
|
10
|
+
});
|
|
11
|
+
}
|
|
12
|
+
//# sourceMappingURL=auth.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth.js","sourceRoot":"","sources":["../../src/tools/auth.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAExC,MAAM,UAAU,iBAAiB,CAC/B,MAAiB,EACjB,UAA8B;IAE9B,MAAM,CAAC,IAAI,CACT,YAAY,EACZ,6KAA6K,EAC7K;QACE,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,6BAA6B,CAAC;QAC5D,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,2BAA2B,CAAC;KACzD,EACD,KAAK,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE;QAC7B,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,eAAe,EAAE,CAAC,SAAS,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;QAC9E,OAAO,UAAU,CAAC,MAAM,CAAC,CAAC;IAC5B,CAAC,CACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { toolResult } from "../util.js";
|
|
2
|
+
export function registerConfigTools(server, envManager) {
|
|
3
|
+
server.tool("get_deployment_config", "Get the deployment configuration including the core banking provider and stablecoin provider. No authentication required.", {}, async () => {
|
|
4
|
+
const result = await envManager
|
|
5
|
+
.getActiveClient()
|
|
6
|
+
.getDeploymentConfig();
|
|
7
|
+
return toolResult(result);
|
|
8
|
+
});
|
|
9
|
+
}
|
|
10
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/tools/config.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAExC,MAAM,UAAU,mBAAmB,CACjC,MAAiB,EACjB,UAA8B;IAE9B,MAAM,CAAC,IAAI,CACT,uBAAuB,EACvB,2HAA2H,EAC3H,EAAE,EACF,KAAK,IAAI,EAAE;QACT,MAAM,MAAM,GAAG,MAAM,UAAU;aAC5B,eAAe,EAAE;aACjB,mBAAmB,EAAE,CAAC;QACzB,OAAO,UAAU,CAAC,MAAM,CAAC,CAAC;IAC5B,CAAC,CACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { toolResult } from "../util.js";
|
|
3
|
+
export function registerDisbursementTools(server, envManager) {
|
|
4
|
+
server.tool("submit_disbursement_job", "Submit a stablecoin disbursement job to transfer funds from the bank's master wallet to external wallets. The job is validated and placed in Submitted state pending authorization. Requires login_user first.", {
|
|
5
|
+
jobId: z.string().describe("A caller-specified unique identifier for the job"),
|
|
6
|
+
records: z
|
|
7
|
+
.array(z.object({
|
|
8
|
+
walletAddress: z.string().describe("The destination wallet address"),
|
|
9
|
+
chain: z
|
|
10
|
+
.string()
|
|
11
|
+
.describe("The blockchain chain (ETH, POLY, ARB, BASE, SOL)"),
|
|
12
|
+
currency: z.string().describe("The stablecoin currency (e.g. USDC)"),
|
|
13
|
+
amount: z.number().describe("The amount to transfer"),
|
|
14
|
+
}))
|
|
15
|
+
.describe("The list of disbursement records"),
|
|
16
|
+
}, async ({ jobId, records }) => {
|
|
17
|
+
const result = await envManager
|
|
18
|
+
.getActiveClient()
|
|
19
|
+
.submitDisbursementJob({ jobId, records });
|
|
20
|
+
return toolResult(result);
|
|
21
|
+
});
|
|
22
|
+
server.tool("list_disbursement_jobs", "List all submitted stablecoin disbursement jobs. Requires login_user first.", {}, async () => {
|
|
23
|
+
const result = await envManager.getActiveClient().listDisbursementJobs();
|
|
24
|
+
return toolResult(result);
|
|
25
|
+
});
|
|
26
|
+
server.tool("authorize_disbursement_job", "Authorize a previously submitted stablecoin disbursement job, triggering its execution. The job must be in Submitted state. Requires login_user first.", {
|
|
27
|
+
jobId: z.string().describe("The job ID to authorize"),
|
|
28
|
+
}, async ({ jobId }) => {
|
|
29
|
+
const result = await envManager
|
|
30
|
+
.getActiveClient()
|
|
31
|
+
.authorizeDisbursementJob(jobId);
|
|
32
|
+
return toolResult(result);
|
|
33
|
+
});
|
|
34
|
+
server.tool("get_disbursement_job_status", "Get the current status of a stablecoin disbursement job, including overall and per-record status. Requires login_user first.", {
|
|
35
|
+
jobId: z.string().describe("The job ID to check"),
|
|
36
|
+
}, async ({ jobId }) => {
|
|
37
|
+
const result = await envManager
|
|
38
|
+
.getActiveClient()
|
|
39
|
+
.getDisbursementJobStatus(jobId);
|
|
40
|
+
return toolResult(result);
|
|
41
|
+
});
|
|
42
|
+
server.tool("delete_disbursement_job", "Delete a previously submitted stablecoin disbursement job. The job must be in Submitted state. Requires login_user first.", {
|
|
43
|
+
jobId: z.string().describe("The job ID to delete"),
|
|
44
|
+
}, async ({ jobId }) => {
|
|
45
|
+
const result = await envManager
|
|
46
|
+
.getActiveClient()
|
|
47
|
+
.deleteDisbursementJob(jobId);
|
|
48
|
+
return toolResult(result);
|
|
49
|
+
});
|
|
50
|
+
server.tool("clear_active_disbursement_job", "Clear the active stablecoin disbursement job. Use this to patch an environment that has an erroneous active job set. Requires login_user first.", {}, async () => {
|
|
51
|
+
const result = await envManager
|
|
52
|
+
.getActiveClient()
|
|
53
|
+
.clearActiveDisbursementJob();
|
|
54
|
+
return toolResult(result);
|
|
55
|
+
});
|
|
56
|
+
}
|
|
57
|
+
//# sourceMappingURL=disbursements.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"disbursements.js","sourceRoot":"","sources":["../../src/tools/disbursements.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { toolResult } from "../util.js";
|
|
3
|
+
export function registerEnvironmentTools(server, envManager) {
|
|
4
|
+
server.tool("list_environments", "List pre-configured Paywhere Admin API environments. Returns a map of environment names to their API URLs. Use connect() with a name or URL to switch to an environment.", {}, async () => {
|
|
5
|
+
const environments = envManager.listEnvironments();
|
|
6
|
+
const status = envManager.getStatus();
|
|
7
|
+
return toolResult({
|
|
8
|
+
environments,
|
|
9
|
+
active: status.connected
|
|
10
|
+
? {
|
|
11
|
+
name: status.name,
|
|
12
|
+
url: status.url,
|
|
13
|
+
authenticated: status.authenticated,
|
|
14
|
+
}
|
|
15
|
+
: null,
|
|
16
|
+
});
|
|
17
|
+
});
|
|
18
|
+
server.tool("connect", "Connect to a Paywhere Admin API environment. Accepts either a pre-configured environment name (from list_environments) or a raw API base URL. Session tokens are preserved per environment.", {
|
|
19
|
+
environment: z
|
|
20
|
+
.string()
|
|
21
|
+
.describe("Environment name (e.g. 'acme') or full Admin API base URL (e.g. 'https://acme-api.paywhere.com/paywhere-adminapi/v1')"),
|
|
22
|
+
}, async ({ environment }) => {
|
|
23
|
+
const result = envManager.connect(environment);
|
|
24
|
+
const status = envManager.getStatus();
|
|
25
|
+
return toolResult({
|
|
26
|
+
connected: true,
|
|
27
|
+
name: result.name,
|
|
28
|
+
url: result.url,
|
|
29
|
+
authenticated: status.authenticated,
|
|
30
|
+
});
|
|
31
|
+
});
|
|
32
|
+
}
|
|
33
|
+
//# sourceMappingURL=environments.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"environments.js","sourceRoot":"","sources":["../../src/tools/environments.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAExC,MAAM,UAAU,wBAAwB,CACtC,MAAiB,EACjB,UAA8B;IAE9B,MAAM,CAAC,IAAI,CACT,mBAAmB,EACnB,0KAA0K,EAC1K,EAAE,EACF,KAAK,IAAI,EAAE;QACT,MAAM,YAAY,GAAG,UAAU,CAAC,gBAAgB,EAAE,CAAC;QACnD,MAAM,MAAM,GAAG,UAAU,CAAC,SAAS,EAAE,CAAC;QACtC,OAAO,UAAU,CAAC;YAChB,YAAY;YACZ,MAAM,EAAE,MAAM,CAAC,SAAS;gBACtB,CAAC,CAAC;oBACE,IAAI,EAAE,MAAM,CAAC,IAAI;oBACjB,GAAG,EAAE,MAAM,CAAC,GAAG;oBACf,aAAa,EAAE,MAAM,CAAC,aAAa;iBACpC;gBACH,CAAC,CAAC,IAAI;SACT,CAAC,CAAC;IACL,CAAC,CACF,CAAC;IAEF,MAAM,CAAC,IAAI,CACT,SAAS,EACT,6LAA6L,EAC7L;QACE,WAAW,EAAE,CAAC;aACX,MAAM,EAAE;aACR,QAAQ,CACP,uHAAuH,CACxH;KACJ,EACD,KAAK,EAAE,EAAE,WAAW,EAAE,EAAE,EAAE;QACxB,MAAM,MAAM,GAAG,UAAU,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;QAC/C,MAAM,MAAM,GAAG,UAAU,CAAC,SAAS,EAAE,CAAC;QACtC,OAAO,UAAU,CAAC;YAChB,SAAS,EAAE,IAAI;YACf,IAAI,EAAE,MAAM,CAAC,IAAI;YACjB,GAAG,EAAE,MAAM,CAAC,GAAG;YACf,aAAa,EAAE,MAAM,CAAC,aAAa;SACpC,CAAC,CAAC;IACL,CAAC,CACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { toolResult } from "../util.js";
|
|
3
|
+
export function registerMockTools(server, envManager) {
|
|
4
|
+
server.tool("create_mock_user", "Create a bank user in the mock banking connector. The user must be created before they can log in or have accounts opened. Only available when core banking provider is 'mock'. No authentication required.", {
|
|
5
|
+
username: z.string().describe("The bank username to create"),
|
|
6
|
+
password: z.string().describe("The bank user's password"),
|
|
7
|
+
}, async ({ username, password }) => {
|
|
8
|
+
const result = await envManager
|
|
9
|
+
.getActiveClient()
|
|
10
|
+
.createMockUser({ username, password });
|
|
11
|
+
return toolResult(result);
|
|
12
|
+
});
|
|
13
|
+
server.tool("open_mock_account", "Open a bank account in the mock banking connector. Creates the bank user if not already present. Only available when core banking provider is 'mock'. No authentication required.", {
|
|
14
|
+
username: z.string().describe("The bank username who will own the account"),
|
|
15
|
+
password: z.string().describe("The bank user's password"),
|
|
16
|
+
accountNumber: z.string().describe("The account number to assign"),
|
|
17
|
+
accountType: z.string().describe("The account type (e.g. 'Checking', 'Savings')"),
|
|
18
|
+
accountName: z.string().describe("A display name for the account"),
|
|
19
|
+
initialBalance: z.number().optional().describe("Initial balance (default 0)"),
|
|
20
|
+
isPrimary: z.boolean().optional().describe("Whether this is the primary account"),
|
|
21
|
+
}, async ({ username, password, accountNumber, accountType, accountName, initialBalance, isPrimary }) => {
|
|
22
|
+
const body = {
|
|
23
|
+
username,
|
|
24
|
+
password,
|
|
25
|
+
accountNumber,
|
|
26
|
+
accountType,
|
|
27
|
+
accountName,
|
|
28
|
+
};
|
|
29
|
+
if (initialBalance !== undefined)
|
|
30
|
+
body.initialBalance = initialBalance;
|
|
31
|
+
if (isPrimary !== undefined)
|
|
32
|
+
body.isPrimary = isPrimary;
|
|
33
|
+
const result = await envManager.getActiveClient().openMockAccount(body);
|
|
34
|
+
return toolResult(result);
|
|
35
|
+
});
|
|
36
|
+
server.tool("create_mock_ach_recipient", "Create an ACH recipient in the mock banking connector. Multiple recipients with the same displayName simulate ambiguous recipient scenarios. Only available when core banking provider is 'mock'. No authentication required.", {
|
|
37
|
+
recipientId: z.string().describe("A unique identifier for the recipient"),
|
|
38
|
+
displayName: z.string().describe("The recipient's display name"),
|
|
39
|
+
aba: z.string().optional().describe("The ABA routing number"),
|
|
40
|
+
accountNumber: z.string().optional().describe("The recipient's bank account number"),
|
|
41
|
+
accountType: z.string().optional().describe("Account type (e.g. 'Checking')"),
|
|
42
|
+
email: z.string().optional().describe("The recipient's email address"),
|
|
43
|
+
hasAccount: z.boolean().describe("Whether the recipient has a linked bank account"),
|
|
44
|
+
}, async (params) => {
|
|
45
|
+
const result = await envManager
|
|
46
|
+
.getActiveClient()
|
|
47
|
+
.createMockACHRecipient(params);
|
|
48
|
+
return toolResult(result);
|
|
49
|
+
});
|
|
50
|
+
server.tool("deposit_to_mock_account", "Deposit funds into a mock bank account. Supports simple deposits and inbound wire simulations. Only available when core banking provider is 'mock'. No authentication required.", {
|
|
51
|
+
accountNumber: z.string().describe("The account number to deposit into"),
|
|
52
|
+
username: z.string().describe("The bank username who owns the account"),
|
|
53
|
+
amount: z.number().describe("The amount to deposit"),
|
|
54
|
+
description: z.string().optional().describe("A description for the transaction"),
|
|
55
|
+
postDate: z
|
|
56
|
+
.string()
|
|
57
|
+
.optional()
|
|
58
|
+
.describe("The post date (YYYY-MM-DD). Defaults to today"),
|
|
59
|
+
}, async ({ accountNumber, ...body }) => {
|
|
60
|
+
const result = await envManager
|
|
61
|
+
.getActiveClient()
|
|
62
|
+
.depositToMockAccount(accountNumber, body);
|
|
63
|
+
return toolResult(result);
|
|
64
|
+
});
|
|
65
|
+
server.tool("withdraw_from_mock_account", "Withdraw funds from a mock bank account. Only available when core banking provider is 'mock'. No authentication required.", {
|
|
66
|
+
accountNumber: z.string().describe("The account number to withdraw from"),
|
|
67
|
+
username: z.string().describe("The bank username who owns the account"),
|
|
68
|
+
amount: z.number().describe("The amount to withdraw"),
|
|
69
|
+
description: z.string().optional().describe("A description for the transaction"),
|
|
70
|
+
}, async ({ accountNumber, ...body }) => {
|
|
71
|
+
const result = await envManager
|
|
72
|
+
.getActiveClient()
|
|
73
|
+
.withdrawFromMockAccount(accountNumber, body);
|
|
74
|
+
return toolResult(result);
|
|
75
|
+
});
|
|
76
|
+
}
|
|
77
|
+
//# sourceMappingURL=mock.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mock.js","sourceRoot":"","sources":["../../src/tools/mock.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { toolResult } from "../util.js";
|
|
3
|
+
export function registerStablecoinTools(server, envManager) {
|
|
4
|
+
server.tool("get_master_wallet_balance", "Get the balance of a stablecoin in the bank's master wallet. Requires login_user first.", {
|
|
5
|
+
currency: z
|
|
6
|
+
.string()
|
|
7
|
+
.describe("The stablecoin currency (e.g. 'USDC')"),
|
|
8
|
+
}, async ({ currency }) => {
|
|
9
|
+
const result = await envManager
|
|
10
|
+
.getActiveClient()
|
|
11
|
+
.getMasterWalletBalance(currency);
|
|
12
|
+
return toolResult(result);
|
|
13
|
+
});
|
|
14
|
+
server.tool("list_payments_for_admin", "List outgoing stablecoin payments for a specific bank user. Requires login_user first.", {
|
|
15
|
+
bankUsername: z
|
|
16
|
+
.string()
|
|
17
|
+
.describe("The bank user whose stablecoin payments to list"),
|
|
18
|
+
}, async ({ bankUsername }) => {
|
|
19
|
+
const result = await envManager.getActiveClient().listPayments(bankUsername);
|
|
20
|
+
return toolResult(result);
|
|
21
|
+
});
|
|
22
|
+
server.tool("list_receipts_for_admin", "List incoming stablecoin payment receipts for a specific bank user. Requires login_user first.", {
|
|
23
|
+
bankUsername: z
|
|
24
|
+
.string()
|
|
25
|
+
.describe("The bank user whose stablecoin payment receipts to list"),
|
|
26
|
+
}, async ({ bankUsername }) => {
|
|
27
|
+
const result = await envManager.getActiveClient().listReceipts(bankUsername);
|
|
28
|
+
return toolResult(result);
|
|
29
|
+
});
|
|
30
|
+
}
|
|
31
|
+
//# sourceMappingURL=stablecoin.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stablecoin.js","sourceRoot":"","sources":["../../src/tools/stablecoin.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAExC,MAAM,UAAU,uBAAuB,CACrC,MAAiB,EACjB,UAA8B;IAE9B,MAAM,CAAC,IAAI,CACT,2BAA2B,EAC3B,yFAAyF,EACzF;QACE,QAAQ,EAAE,CAAC;aACR,MAAM,EAAE;aACR,QAAQ,CAAC,uCAAuC,CAAC;KACrD,EACD,KAAK,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE;QACrB,MAAM,MAAM,GAAG,MAAM,UAAU;aAC5B,eAAe,EAAE;aACjB,sBAAsB,CAAC,QAAQ,CAAC,CAAC;QACpC,OAAO,UAAU,CAAC,MAAM,CAAC,CAAC;IAC5B,CAAC,CACF,CAAC;IAEF,MAAM,CAAC,IAAI,CACT,yBAAyB,EACzB,wFAAwF,EACxF;QACE,YAAY,EAAE,CAAC;aACZ,MAAM,EAAE;aACR,QAAQ,CAAC,iDAAiD,CAAC;KAC/D,EACD,KAAK,EAAE,EAAE,YAAY,EAAE,EAAE,EAAE;QACzB,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,eAAe,EAAE,CAAC,YAAY,CAAC,YAAY,CAAC,CAAC;QAC7E,OAAO,UAAU,CAAC,MAAM,CAAC,CAAC;IAC5B,CAAC,CACF,CAAC;IAEF,MAAM,CAAC,IAAI,CACT,yBAAyB,EACzB,gGAAgG,EAChG;QACE,YAAY,EAAE,CAAC;aACZ,MAAM,EAAE;aACR,QAAQ,CAAC,yDAAyD,CAAC;KACvE,EACD,KAAK,EAAE,EAAE,YAAY,EAAE,EAAE,EAAE;QACzB,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,eAAe,EAAE,CAAC,YAAY,CAAC,YAAY,CAAC,CAAC;QAC7E,OAAO,UAAU,CAAC,MAAM,CAAC,CAAC;IAC5B,CAAC,CACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { toolResult } from "../util.js";
|
|
3
|
+
export function registerUserTools(server, envManager) {
|
|
4
|
+
server.tool("create_user", "Create a new Paywhere user. Returns the system-generated secret for the new user. Requires login_user first.", {
|
|
5
|
+
username: z.string().describe("The unique username for the new Paywhere user"),
|
|
6
|
+
}, async ({ username }) => {
|
|
7
|
+
const result = await envManager.getActiveClient().createUser({ username });
|
|
8
|
+
return toolResult(result);
|
|
9
|
+
});
|
|
10
|
+
server.tool("update_user", "Update profile fields of a Paywhere user. Requires login_user first.", {
|
|
11
|
+
username: z.string().describe("The Paywhere user to update"),
|
|
12
|
+
displayName: z.string().optional().describe("The display name to set"),
|
|
13
|
+
email: z.string().optional().describe("The email address to set"),
|
|
14
|
+
}, async ({ username, ...fields }) => {
|
|
15
|
+
const body = {};
|
|
16
|
+
for (const [key, value] of Object.entries(fields)) {
|
|
17
|
+
if (value !== undefined)
|
|
18
|
+
body[key] = value;
|
|
19
|
+
}
|
|
20
|
+
const result = await envManager.getActiveClient().updateUser(username, body);
|
|
21
|
+
return toolResult(result);
|
|
22
|
+
});
|
|
23
|
+
server.tool("get_user", "Get the profile data of a Paywhere user. Requires login_user first.", {
|
|
24
|
+
username: z.string().describe("The Paywhere user whose profile to retrieve"),
|
|
25
|
+
}, async ({ username }) => {
|
|
26
|
+
const result = await envManager.getActiveClient().getUser(username);
|
|
27
|
+
return toolResult(result);
|
|
28
|
+
});
|
|
29
|
+
server.tool("list_users", "List all Paywhere users in the system. Requires login_user first.", {}, async () => {
|
|
30
|
+
const result = await envManager.getActiveClient().listUsers();
|
|
31
|
+
return toolResult(result);
|
|
32
|
+
});
|
|
33
|
+
server.tool("reset_user_secret", "Reset the secret of a Paywhere user. Returns the new system-generated secret. Requires login_user first.", {
|
|
34
|
+
username: z.string().describe("The Paywhere user whose secret to reset"),
|
|
35
|
+
}, async ({ username }) => {
|
|
36
|
+
const result = await envManager.getActiveClient().resetUserSecret(username);
|
|
37
|
+
return toolResult(result);
|
|
38
|
+
});
|
|
39
|
+
server.tool("delete_user", "Delete a Paywhere user. Requires login_user first.", {
|
|
40
|
+
username: z.string().describe("The Paywhere user to delete"),
|
|
41
|
+
}, async ({ username }) => {
|
|
42
|
+
const result = await envManager.getActiveClient().deleteUser(username);
|
|
43
|
+
return toolResult(result);
|
|
44
|
+
});
|
|
45
|
+
server.tool("authorize_endpoint", "Grant a Paywhere user authorization to invoke a specific API endpoint. Requires login_user first.", {
|
|
46
|
+
username: z.string().describe("The Paywhere user to authorize"),
|
|
47
|
+
endpoint: z
|
|
48
|
+
.string()
|
|
49
|
+
.describe("The API endpoint to authorize (e.g. 'CreateUser', 'LoginBankUser', 'GetAccountList')"),
|
|
50
|
+
}, async ({ username, endpoint }) => {
|
|
51
|
+
const result = await envManager
|
|
52
|
+
.getActiveClient()
|
|
53
|
+
.authorizeEndpoint(username, endpoint);
|
|
54
|
+
return toolResult(result);
|
|
55
|
+
});
|
|
56
|
+
server.tool("list_authorized_endpoints", "List the API endpoints a Paywhere user is authorized to invoke. Requires login_user first.", {
|
|
57
|
+
username: z
|
|
58
|
+
.string()
|
|
59
|
+
.describe("The Paywhere user whose authorized endpoints to list"),
|
|
60
|
+
}, async ({ username }) => {
|
|
61
|
+
const result = await envManager
|
|
62
|
+
.getActiveClient()
|
|
63
|
+
.listAuthorizedEndpoints(username);
|
|
64
|
+
return toolResult(result);
|
|
65
|
+
});
|
|
66
|
+
server.tool("deauthorize_endpoint", "Revoke a Paywhere user's authorization to invoke a specific API endpoint. Requires login_user first.", {
|
|
67
|
+
username: z.string().describe("The Paywhere user to deauthorize"),
|
|
68
|
+
endpoint: z.string().describe("The API endpoint to revoke"),
|
|
69
|
+
}, async ({ username, endpoint }) => {
|
|
70
|
+
const result = await envManager
|
|
71
|
+
.getActiveClient()
|
|
72
|
+
.deauthorizeEndpoint(username, endpoint);
|
|
73
|
+
return toolResult(result);
|
|
74
|
+
});
|
|
75
|
+
server.tool("list_authorizable_endpoints", "List all API endpoints that can be authorized for Paywhere users. Returns two lists: client API endpoints (e.g. LoginUser, GetAccountList) and admin API endpoints (e.g. CreateUser, AuthorizeEndpoint). Use these endpoint names with authorize_endpoint and deauthorize_endpoint. Requires login_user first.", {}, async () => {
|
|
76
|
+
const result = await envManager
|
|
77
|
+
.getActiveClient()
|
|
78
|
+
.listAuthorizableEndpoints();
|
|
79
|
+
return toolResult(result);
|
|
80
|
+
});
|
|
81
|
+
}
|
|
82
|
+
//# sourceMappingURL=users.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"users.js","sourceRoot":"","sources":["../../src/tools/users.ts"],"names":[],"mappings":"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"}
|
package/dist/util.d.ts
ADDED
package/dist/util.js
ADDED
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Wraps an API result into the MCP tool response format.
|
|
3
|
+
*/
|
|
4
|
+
export function toolResult(data) {
|
|
5
|
+
const text = typeof data === "string" ? data : JSON.stringify(data, null, 2);
|
|
6
|
+
return {
|
|
7
|
+
content: [{ type: "text", text }],
|
|
8
|
+
};
|
|
9
|
+
}
|
|
10
|
+
//# sourceMappingURL=util.js.map
|
package/dist/util.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"util.js","sourceRoot":"","sources":["../src/util.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,UAAU,UAAU,CAAC,IAAa;IACtC,MAAM,IAAI,GACR,OAAO,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;IAClE,OAAO;QACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,CAAC;KAC3C,CAAC;AACJ,CAAC"}
|
package/package.json
ADDED
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "paywhere-mcp-admin",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"description": "MCP server for the Paywhere Admin API — user management, disbursements, approvals, and mock banking for AI agents",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"bin": {
|
|
7
|
+
"paywhere-mcp-admin": "dist/index.js"
|
|
8
|
+
},
|
|
9
|
+
"scripts": {
|
|
10
|
+
"build": "tsc",
|
|
11
|
+
"start": "node dist/index.js",
|
|
12
|
+
"start:http": "node dist/index.js --http",
|
|
13
|
+
"dev": "tsc --watch"
|
|
14
|
+
},
|
|
15
|
+
"dependencies": {
|
|
16
|
+
"@modelcontextprotocol/sdk": "^1.12.1",
|
|
17
|
+
"express": "^5.2.1",
|
|
18
|
+
"zod": "^3.24.4"
|
|
19
|
+
},
|
|
20
|
+
"devDependencies": {
|
|
21
|
+
"@types/express": "^5.0.6",
|
|
22
|
+
"@types/node": "^22.15.2",
|
|
23
|
+
"typescript": "^5.8.3"
|
|
24
|
+
},
|
|
25
|
+
"engines": {
|
|
26
|
+
"node": ">=18.0.0"
|
|
27
|
+
},
|
|
28
|
+
"files": [
|
|
29
|
+
"dist"
|
|
30
|
+
],
|
|
31
|
+
"license": "UNLICENSED"
|
|
32
|
+
}
|