paywhere-mcp-api 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.
Files changed (43) hide show
  1. package/dist/client.d.ts +53 -0
  2. package/dist/client.js +300 -0
  3. package/dist/client.js.map +1 -0
  4. package/dist/environments.d.ts +40 -0
  5. package/dist/environments.js +102 -0
  6. package/dist/environments.js.map +1 -0
  7. package/dist/index.d.ts +2 -0
  8. package/dist/index.js +97 -0
  9. package/dist/index.js.map +1 -0
  10. package/dist/tools/accounts.d.ts +3 -0
  11. package/dist/tools/accounts.js +33 -0
  12. package/dist/tools/accounts.js.map +1 -0
  13. package/dist/tools/ach.d.ts +3 -0
  14. package/dist/tools/ach.js +43 -0
  15. package/dist/tools/ach.js.map +1 -0
  16. package/dist/tools/auth.d.ts +3 -0
  17. package/dist/tools/auth.js +23 -0
  18. package/dist/tools/auth.js.map +1 -0
  19. package/dist/tools/config.d.ts +3 -0
  20. package/dist/tools/config.js +8 -0
  21. package/dist/tools/config.js.map +1 -0
  22. package/dist/tools/environments.d.ts +3 -0
  23. package/dist/tools/environments.js +35 -0
  24. package/dist/tools/environments.js.map +1 -0
  25. package/dist/tools/payments.d.ts +3 -0
  26. package/dist/tools/payments.js +34 -0
  27. package/dist/tools/payments.js.map +1 -0
  28. package/dist/tools/receipts.d.ts +3 -0
  29. package/dist/tools/receipts.js +34 -0
  30. package/dist/tools/receipts.js.map +1 -0
  31. package/dist/tools/recipients.d.ts +3 -0
  32. package/dist/tools/recipients.js +55 -0
  33. package/dist/tools/recipients.js.map +1 -0
  34. package/dist/tools/senders.d.ts +3 -0
  35. package/dist/tools/senders.js +55 -0
  36. package/dist/tools/senders.js.map +1 -0
  37. package/dist/tools/wire.d.ts +3 -0
  38. package/dist/tools/wire.js +65 -0
  39. package/dist/tools/wire.js.map +1 -0
  40. package/dist/util.d.ts +9 -0
  41. package/dist/util.js +10 -0
  42. package/dist/util.js.map +1 -0
  43. package/package.json +32 -0
@@ -0,0 +1,53 @@
1
+ /**
2
+ * HTTP client for the Paywhere API Storefront.
3
+ * Manages session tokens and provides typed methods for all API endpoints.
4
+ */
5
+ export declare class PaywhereClient {
6
+ private baseUrl;
7
+ private userToken;
8
+ private bankUserToken;
9
+ constructor(baseUrl: string);
10
+ getBaseUrl(): string;
11
+ getUserToken(): string | null;
12
+ getBankUserToken(): string | null;
13
+ isLoggedIn(): boolean;
14
+ isBankUserLoggedIn(): boolean;
15
+ private request;
16
+ loginUser(username: string, secret: string): Promise<unknown>;
17
+ loginBankUser(username: string, password: string): Promise<unknown>;
18
+ ping(): Promise<unknown>;
19
+ listAccounts(): Promise<unknown>;
20
+ getAccountBalance(accountNumber: string): Promise<unknown>;
21
+ getAccountTransactions(accountNumber: string, options?: {
22
+ fromDate?: string;
23
+ toDate?: string;
24
+ pageNumber?: number;
25
+ pageSize?: number;
26
+ }): Promise<unknown>;
27
+ transferFunds(body: Record<string, unknown>): Promise<unknown>;
28
+ makeACHPayment(body: Record<string, unknown>): Promise<unknown>;
29
+ authorizeACHPayment(paymentId: number): Promise<unknown>;
30
+ getACHPaymentStatus(paymentId: number): Promise<unknown>;
31
+ getWireConfig(): Promise<unknown>;
32
+ makeWirePayment(body: Record<string, unknown>): Promise<unknown>;
33
+ getWirePayment(paymentId: number): Promise<unknown>;
34
+ getWirePaymentStatus(paymentId: number): Promise<unknown>;
35
+ getWireInbound(wireTransactionId: number): Promise<unknown>;
36
+ listRecipients(): Promise<unknown>;
37
+ createRecipient(body: Record<string, unknown>): Promise<unknown>;
38
+ getRecipient(walletAddress: string): Promise<unknown>;
39
+ deleteRecipient(walletAddress: string, skipExternalDelete?: boolean): Promise<unknown>;
40
+ listSenders(): Promise<unknown>;
41
+ createSender(body: Record<string, unknown>): Promise<unknown>;
42
+ getSender(walletAddress: string): Promise<unknown>;
43
+ deleteSender(walletAddress: string, skipExternalDelete?: boolean): Promise<unknown>;
44
+ makeStablecoinPayment(body: Record<string, unknown>): Promise<unknown>;
45
+ listStablecoinPayments(): Promise<unknown>;
46
+ getStablecoinPayment(paymentId: string): Promise<unknown>;
47
+ getStablecoinPaymentStatus(paymentId: string): Promise<unknown>;
48
+ initiateReceipt(body: Record<string, unknown>): Promise<unknown>;
49
+ listReceipts(): Promise<unknown>;
50
+ getReceipt(paymentId: string): Promise<unknown>;
51
+ getReceiptStatus(paymentId: string): Promise<unknown>;
52
+ listSupportedChains(): Promise<unknown>;
53
+ }
package/dist/client.js ADDED
@@ -0,0 +1,300 @@
1
+ /**
2
+ * HTTP client for the Paywhere API Storefront.
3
+ * Manages session tokens and provides typed methods for all API endpoints.
4
+ */
5
+ export class PaywhereClient {
6
+ baseUrl;
7
+ userToken = null;
8
+ bankUserToken = null;
9
+ constructor(baseUrl) {
10
+ // Strip trailing slash
11
+ this.baseUrl = baseUrl.replace(/\/+$/, "");
12
+ }
13
+ getBaseUrl() {
14
+ return this.baseUrl;
15
+ }
16
+ getUserToken() {
17
+ return this.userToken;
18
+ }
19
+ getBankUserToken() {
20
+ return this.bankUserToken;
21
+ }
22
+ isLoggedIn() {
23
+ return this.userToken !== null;
24
+ }
25
+ isBankUserLoggedIn() {
26
+ return this.bankUserToken !== null;
27
+ }
28
+ async request(method, path, options = {}) {
29
+ const { body, query, requireUserToken = true, requireBankUserToken = false, } = options;
30
+ if (requireUserToken && !this.userToken) {
31
+ throw new Error("Not authenticated. Call login_user first to obtain a user token.");
32
+ }
33
+ if (requireBankUserToken && !this.bankUserToken) {
34
+ throw new Error("Bank user not authenticated. Call login_bank_user first to obtain a bank user token.");
35
+ }
36
+ // Build URL with query params
37
+ let url = `${this.baseUrl}${path}`;
38
+ if (query) {
39
+ const params = new URLSearchParams();
40
+ for (const [key, value] of Object.entries(query)) {
41
+ if (value !== undefined) {
42
+ params.append(key, String(value));
43
+ }
44
+ }
45
+ const qs = params.toString();
46
+ if (qs) {
47
+ url += `?${qs}`;
48
+ }
49
+ }
50
+ // Build headers
51
+ const headers = {
52
+ "Content-Type": "application/json",
53
+ Accept: "application/json",
54
+ };
55
+ if (this.userToken) {
56
+ headers["X-User-Token"] = this.userToken;
57
+ }
58
+ if (this.bankUserToken) {
59
+ headers["X-Bank-User-Token"] = this.bankUserToken;
60
+ }
61
+ const response = await fetch(url, {
62
+ method,
63
+ headers,
64
+ body: body ? JSON.stringify(body) : undefined,
65
+ });
66
+ const text = await response.text();
67
+ if (!text) {
68
+ return {};
69
+ }
70
+ try {
71
+ return JSON.parse(text);
72
+ }
73
+ catch {
74
+ throw new Error(`Non-JSON response (HTTP ${response.status}): ${text.substring(0, 500)}`);
75
+ }
76
+ }
77
+ // ── Auth ──────────────────────────────────────────────────────────────
78
+ async loginUser(username, secret) {
79
+ const result = await this.request("POST", "/user/login", {
80
+ body: { username, secret },
81
+ requireUserToken: false,
82
+ });
83
+ const data = result;
84
+ if (data.token) {
85
+ this.userToken = data.token;
86
+ }
87
+ return result;
88
+ }
89
+ async loginBankUser(username, password) {
90
+ const result = await this.request("POST", "/bankuser/login", {
91
+ body: { username, password },
92
+ requireUserToken: true,
93
+ });
94
+ const data = result;
95
+ if (data.token) {
96
+ this.bankUserToken = data.token;
97
+ }
98
+ return result;
99
+ }
100
+ async ping() {
101
+ return this.request("GET", "/ping", { requireUserToken: false });
102
+ }
103
+ // ── Accounts ──────────────────────────────────────────────────────────
104
+ async listAccounts() {
105
+ return this.request("GET", "/accounts", {
106
+ requireUserToken: true,
107
+ requireBankUserToken: true,
108
+ });
109
+ }
110
+ async getAccountBalance(accountNumber) {
111
+ return this.request("GET", `/accounts/${encodeURIComponent(accountNumber)}/balance`, {
112
+ requireUserToken: true,
113
+ requireBankUserToken: true,
114
+ });
115
+ }
116
+ async getAccountTransactions(accountNumber, options) {
117
+ return this.request("GET", `/accounts/${encodeURIComponent(accountNumber)}/transactions`, {
118
+ query: options,
119
+ requireUserToken: true,
120
+ requireBankUserToken: true,
121
+ });
122
+ }
123
+ async transferFunds(body) {
124
+ return this.request("POST", "/accounts/transfers", {
125
+ body,
126
+ requireUserToken: true,
127
+ requireBankUserToken: true,
128
+ });
129
+ }
130
+ // ── ACH Payments ──────────────────────────────────────────────────────
131
+ async makeACHPayment(body) {
132
+ return this.request("POST", "/ach/payments", {
133
+ body,
134
+ requireUserToken: true,
135
+ requireBankUserToken: true,
136
+ });
137
+ }
138
+ async authorizeACHPayment(paymentId) {
139
+ return this.request("POST", `/ach/payments/${paymentId}/authorize`, {
140
+ body: { paymentId },
141
+ requireUserToken: true,
142
+ requireBankUserToken: true,
143
+ });
144
+ }
145
+ async getACHPaymentStatus(paymentId) {
146
+ return this.request("GET", `/ach/payments/${paymentId}/status`, {
147
+ requireUserToken: true,
148
+ requireBankUserToken: true,
149
+ });
150
+ }
151
+ // ── Wire Payments ─────────────────────────────────────────────────────
152
+ async getWireConfig() {
153
+ return this.request("GET", "/wire/config", {
154
+ requireUserToken: true,
155
+ requireBankUserToken: true,
156
+ });
157
+ }
158
+ async makeWirePayment(body) {
159
+ return this.request("POST", "/wire/payments", {
160
+ body,
161
+ requireUserToken: true,
162
+ requireBankUserToken: true,
163
+ });
164
+ }
165
+ async getWirePayment(paymentId) {
166
+ return this.request("GET", `/wire/payments/${paymentId}`, {
167
+ requireUserToken: true,
168
+ requireBankUserToken: true,
169
+ });
170
+ }
171
+ async getWirePaymentStatus(paymentId) {
172
+ return this.request("GET", `/wire/payments/${paymentId}/status`, {
173
+ requireUserToken: true,
174
+ requireBankUserToken: true,
175
+ });
176
+ }
177
+ async getWireInbound(wireTransactionId) {
178
+ return this.request("GET", `/wire/inbound/${wireTransactionId}`, {
179
+ requireUserToken: true,
180
+ requireBankUserToken: true,
181
+ });
182
+ }
183
+ // ── Stablecoin Recipients ─────────────────────────────────────────────
184
+ async listRecipients() {
185
+ return this.request("GET", "/stablecoin/recipients", {
186
+ requireUserToken: true,
187
+ requireBankUserToken: true,
188
+ });
189
+ }
190
+ async createRecipient(body) {
191
+ return this.request("POST", "/stablecoin/recipients", {
192
+ body,
193
+ requireUserToken: true,
194
+ requireBankUserToken: true,
195
+ });
196
+ }
197
+ async getRecipient(walletAddress) {
198
+ return this.request("GET", `/stablecoin/recipients/${encodeURIComponent(walletAddress)}`, {
199
+ requireUserToken: true,
200
+ requireBankUserToken: true,
201
+ });
202
+ }
203
+ async deleteRecipient(walletAddress, skipExternalDelete) {
204
+ return this.request("DELETE", `/stablecoin/recipients/${encodeURIComponent(walletAddress)}`, {
205
+ query: skipExternalDelete !== undefined ? { skipExternalDelete } : undefined,
206
+ requireUserToken: true,
207
+ requireBankUserToken: true,
208
+ });
209
+ }
210
+ // ── Stablecoin Senders ────────────────────────────────────────────────
211
+ async listSenders() {
212
+ return this.request("GET", "/stablecoin/senders", {
213
+ requireUserToken: true,
214
+ requireBankUserToken: true,
215
+ });
216
+ }
217
+ async createSender(body) {
218
+ return this.request("POST", "/stablecoin/senders", {
219
+ body,
220
+ requireUserToken: true,
221
+ requireBankUserToken: true,
222
+ });
223
+ }
224
+ async getSender(walletAddress) {
225
+ return this.request("GET", `/stablecoin/senders/${encodeURIComponent(walletAddress)}`, {
226
+ requireUserToken: true,
227
+ requireBankUserToken: true,
228
+ });
229
+ }
230
+ async deleteSender(walletAddress, skipExternalDelete) {
231
+ return this.request("DELETE", `/stablecoin/senders/${encodeURIComponent(walletAddress)}`, {
232
+ query: skipExternalDelete !== undefined ? { skipExternalDelete } : undefined,
233
+ requireUserToken: true,
234
+ requireBankUserToken: true,
235
+ });
236
+ }
237
+ // ── Stablecoin Payments (Outbound) ────────────────────────────────────
238
+ async makeStablecoinPayment(body) {
239
+ const { preview, ...rest } = body;
240
+ return this.request("POST", "/stablecoin/payments", {
241
+ body: rest,
242
+ query: preview !== undefined ? { preview: preview } : undefined,
243
+ requireUserToken: true,
244
+ requireBankUserToken: true,
245
+ });
246
+ }
247
+ async listStablecoinPayments() {
248
+ return this.request("GET", "/stablecoin/payments", {
249
+ requireUserToken: true,
250
+ requireBankUserToken: true,
251
+ });
252
+ }
253
+ async getStablecoinPayment(paymentId) {
254
+ return this.request("GET", `/stablecoin/payments/${encodeURIComponent(paymentId)}`, {
255
+ requireUserToken: true,
256
+ requireBankUserToken: true,
257
+ });
258
+ }
259
+ async getStablecoinPaymentStatus(paymentId) {
260
+ return this.request("GET", `/stablecoin/payments/${encodeURIComponent(paymentId)}/status`, {
261
+ requireUserToken: true,
262
+ requireBankUserToken: true,
263
+ });
264
+ }
265
+ // ── Stablecoin Receipts (Inbound) ─────────────────────────────────────
266
+ async initiateReceipt(body) {
267
+ const { preview, ...rest } = body;
268
+ return this.request("POST", "/stablecoin/receipts", {
269
+ body: rest,
270
+ query: preview !== undefined ? { preview: preview } : undefined,
271
+ requireUserToken: true,
272
+ requireBankUserToken: true,
273
+ });
274
+ }
275
+ async listReceipts() {
276
+ return this.request("GET", "/stablecoin/receipts", {
277
+ requireUserToken: true,
278
+ requireBankUserToken: true,
279
+ });
280
+ }
281
+ async getReceipt(paymentId) {
282
+ return this.request("GET", `/stablecoin/receipts/${encodeURIComponent(paymentId)}`, {
283
+ requireUserToken: true,
284
+ requireBankUserToken: true,
285
+ });
286
+ }
287
+ async getReceiptStatus(paymentId) {
288
+ return this.request("GET", `/stablecoin/receipts/${encodeURIComponent(paymentId)}/status`, {
289
+ requireUserToken: true,
290
+ requireBankUserToken: true,
291
+ });
292
+ }
293
+ // ── Stablecoin Config ─────────────────────────────────────────────────
294
+ async listSupportedChains() {
295
+ return this.request("GET", "/stablecoin/chains", {
296
+ requireUserToken: true,
297
+ });
298
+ }
299
+ }
300
+ //# sourceMappingURL=client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,40 @@
1
+ import { PaywhereClient } from "./client.js";
2
+ /**
3
+ * Manages multiple Paywhere API Storefront environments with per-environment session state.
4
+ *
5
+ * Environments can be pre-configured via PAYWHERE_ENVIRONMENTS env var (JSON map of
6
+ * name → URL) or connected to dynamically via URL at runtime.
7
+ */
8
+ export declare class EnvironmentManager {
9
+ /** Named environments from config */
10
+ private namedEnvironments;
11
+ /** Active clients keyed by base URL (preserves session state across switches) */
12
+ private clients;
13
+ /** Currently active environment URL */
14
+ private activeUrl;
15
+ /** Friendly name of the active environment (if it was connected by name) */
16
+ private activeName;
17
+ constructor();
18
+ /** List pre-configured named environments. */
19
+ listEnvironments(): Record<string, string>;
20
+ /**
21
+ * Connect to an environment by name or URL.
22
+ * If a name matches a pre-configured environment, uses that URL.
23
+ * Otherwise treats the argument as a raw URL.
24
+ * Reuses existing client (and its tokens) if already connected before.
25
+ */
26
+ connect(nameOrUrl: string): {
27
+ name: string | null;
28
+ url: string;
29
+ };
30
+ /** Get the active client. Throws if no environment is connected. */
31
+ getActiveClient(): PaywhereClient;
32
+ /** Get info about the current connection state. */
33
+ getStatus(): {
34
+ connected: boolean;
35
+ name: string | null;
36
+ url: string | null;
37
+ authenticated: boolean;
38
+ bankUserAuthenticated: boolean;
39
+ };
40
+ }
@@ -0,0 +1,102 @@
1
+ import { PaywhereClient } from "./client.js";
2
+ /**
3
+ * Manages multiple Paywhere API Storefront environments with per-environment session state.
4
+ *
5
+ * Environments can be pre-configured via PAYWHERE_ENVIRONMENTS env var (JSON map of
6
+ * name → URL) or connected to dynamically via URL at runtime.
7
+ */
8
+ export class EnvironmentManager {
9
+ /** Named environments from config */
10
+ namedEnvironments;
11
+ /** Active clients keyed by base URL (preserves session state across switches) */
12
+ clients = new Map();
13
+ /** Currently active environment URL */
14
+ activeUrl = null;
15
+ /** Friendly name of the active environment (if it was connected by name) */
16
+ activeName = null;
17
+ constructor() {
18
+ const envJson = process.env.PAYWHERE_ENVIRONMENTS;
19
+ if (envJson) {
20
+ try {
21
+ this.namedEnvironments = JSON.parse(envJson);
22
+ }
23
+ catch {
24
+ console.error("Warning: PAYWHERE_ENVIRONMENTS is not valid JSON. No named environments loaded.");
25
+ this.namedEnvironments = {};
26
+ }
27
+ }
28
+ else {
29
+ this.namedEnvironments = {};
30
+ }
31
+ // If PAYWHERE_BASE_URL is set, auto-connect to it as default
32
+ const defaultUrl = process.env.PAYWHERE_BASE_URL;
33
+ if (defaultUrl) {
34
+ const url = defaultUrl.replace(/\/+$/, "");
35
+ this.clients.set(url, new PaywhereClient(url));
36
+ this.activeUrl = url;
37
+ }
38
+ }
39
+ /** List pre-configured named environments. */
40
+ listEnvironments() {
41
+ return { ...this.namedEnvironments };
42
+ }
43
+ /**
44
+ * Connect to an environment by name or URL.
45
+ * If a name matches a pre-configured environment, uses that URL.
46
+ * Otherwise treats the argument as a raw URL.
47
+ * Reuses existing client (and its tokens) if already connected before.
48
+ */
49
+ connect(nameOrUrl) {
50
+ let url;
51
+ let name = null;
52
+ if (this.namedEnvironments[nameOrUrl]) {
53
+ name = nameOrUrl;
54
+ url = this.namedEnvironments[nameOrUrl];
55
+ }
56
+ else {
57
+ url = nameOrUrl;
58
+ // Check if this URL matches a named environment
59
+ for (const [n, u] of Object.entries(this.namedEnvironments)) {
60
+ if (u === url || u === url.replace(/\/+$/, "")) {
61
+ name = n;
62
+ break;
63
+ }
64
+ }
65
+ }
66
+ url = url.replace(/\/+$/, "");
67
+ if (!this.clients.has(url)) {
68
+ this.clients.set(url, new PaywhereClient(url));
69
+ }
70
+ this.activeUrl = url;
71
+ this.activeName = name;
72
+ return { name, url };
73
+ }
74
+ /** Get the active client. Throws if no environment is connected. */
75
+ getActiveClient() {
76
+ if (!this.activeUrl) {
77
+ throw new Error("No environment connected. Call connect() with an environment name or URL first.");
78
+ }
79
+ return this.clients.get(this.activeUrl);
80
+ }
81
+ /** Get info about the current connection state. */
82
+ getStatus() {
83
+ if (!this.activeUrl) {
84
+ return {
85
+ connected: false,
86
+ name: null,
87
+ url: null,
88
+ authenticated: false,
89
+ bankUserAuthenticated: false,
90
+ };
91
+ }
92
+ const client = this.clients.get(this.activeUrl);
93
+ return {
94
+ connected: true,
95
+ name: this.activeName,
96
+ url: this.activeUrl,
97
+ authenticated: client.isLoggedIn(),
98
+ bankUserAuthenticated: client.isBankUserLoggedIn(),
99
+ };
100
+ }
101
+ }
102
+ //# sourceMappingURL=environments.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"environments.js","sourceRoot":"","sources":["../src/environments.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ #!/usr/bin/env node
2
+ export {};
package/dist/index.js ADDED
@@ -0,0 +1,97 @@
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 { registerAccountTools } from "./tools/accounts.js";
7
+ import { registerACHTools } from "./tools/ach.js";
8
+ import { registerWireTools } from "./tools/wire.js";
9
+ import { registerRecipientTools } from "./tools/recipients.js";
10
+ import { registerSenderTools } from "./tools/senders.js";
11
+ import { registerPaymentTools } from "./tools/payments.js";
12
+ import { registerReceiptTools } from "./tools/receipts.js";
13
+ import { registerConfigTools } from "./tools/config.js";
14
+ // Parse CLI args
15
+ const args = process.argv.slice(2);
16
+ const httpMode = args.includes("--http");
17
+ const portIndex = args.indexOf("--port");
18
+ const port = portIndex !== -1 ? parseInt(args[portIndex + 1], 10) : 3100;
19
+ function createServer(envManager) {
20
+ const server = new McpServer({
21
+ name: "Paywhere API Storefront",
22
+ version: "1.0.0",
23
+ });
24
+ registerEnvironmentTools(server, envManager);
25
+ registerAuthTools(server, envManager);
26
+ registerAccountTools(server, envManager);
27
+ registerACHTools(server, envManager);
28
+ registerWireTools(server, envManager);
29
+ registerRecipientTools(server, envManager);
30
+ registerSenderTools(server, envManager);
31
+ registerPaymentTools(server, envManager);
32
+ registerReceiptTools(server, envManager);
33
+ registerConfigTools(server, envManager);
34
+ return server;
35
+ }
36
+ if (httpMode) {
37
+ // HTTP mode — persistent server, multiple clients can connect
38
+ const { StreamableHTTPServerTransport } = await import("@modelcontextprotocol/sdk/server/streamableHttp.js");
39
+ const { createMcpExpressApp } = await import("@modelcontextprotocol/sdk/server/express.js");
40
+ // Shared state across all requests
41
+ const envManager = new EnvironmentManager();
42
+ const app = createMcpExpressApp();
43
+ app.post("/mcp", async (req, res) => {
44
+ const server = createServer(envManager);
45
+ try {
46
+ const transport = new StreamableHTTPServerTransport({
47
+ sessionIdGenerator: undefined,
48
+ });
49
+ await server.connect(transport);
50
+ await transport.handleRequest(req, res, req.body);
51
+ res.on("close", () => {
52
+ transport.close();
53
+ server.close();
54
+ });
55
+ }
56
+ catch (error) {
57
+ console.error("Error handling MCP request:", error);
58
+ if (!res.headersSent) {
59
+ res.status(500).json({
60
+ jsonrpc: "2.0",
61
+ error: { code: -32603, message: "Internal server error" },
62
+ id: null,
63
+ });
64
+ }
65
+ }
66
+ });
67
+ app.get("/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.delete("/mcp", (_req, res) => {
75
+ res.writeHead(405).end(JSON.stringify({
76
+ jsonrpc: "2.0",
77
+ error: { code: -32000, message: "Method not allowed." },
78
+ id: null,
79
+ }));
80
+ });
81
+ app.listen(port, () => {
82
+ console.log(`Paywhere API Storefront MCP server listening on http://localhost:${port}/mcp`);
83
+ });
84
+ process.on("SIGINT", () => {
85
+ console.log("Shutting down...");
86
+ process.exit(0);
87
+ });
88
+ }
89
+ else {
90
+ // Stdio mode — launched as child process by Claude Code
91
+ const { StdioServerTransport } = await import("@modelcontextprotocol/sdk/server/stdio.js");
92
+ const envManager = new EnvironmentManager();
93
+ const server = createServer(envManager);
94
+ const transport = new StdioServerTransport();
95
+ await server.connect(transport);
96
+ }
97
+ //# 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,3 @@
1
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ import { EnvironmentManager } from "../environments.js";
3
+ export declare function registerAccountTools(server: McpServer, envManager: EnvironmentManager): void;
@@ -0,0 +1,33 @@
1
+ import { z } from "zod";
2
+ import { toolResult } from "../util.js";
3
+ export function registerAccountTools(server, envManager) {
4
+ server.tool("list_accounts", "List all bank accounts for the logged-in bank user. Returns account number, type, name, balances, status, and primary flag for each account.", {}, async () => {
5
+ const result = await envManager.getActiveClient().listAccounts();
6
+ return toolResult(result);
7
+ });
8
+ server.tool("get_account_balance", "Get the core balance of a specific bank account.", {
9
+ accountNumber: z.string().describe("The bank account number"),
10
+ }, async ({ accountNumber }) => {
11
+ const result = await envManager.getActiveClient().getAccountBalance(accountNumber);
12
+ return toolResult(result);
13
+ });
14
+ server.tool("get_account_transactions", "Get transaction history for a bank account with optional date filtering and pagination.", {
15
+ accountNumber: z.string().describe("The bank account number"),
16
+ fromDate: z.string().optional().describe("Start date filter (YYYY-MM-DD)"),
17
+ toDate: z.string().optional().describe("End date filter (YYYY-MM-DD)"),
18
+ pageNumber: z.number().int().optional().describe("Page number (default 1)"),
19
+ pageSize: z.number().int().optional().describe("Page size (default 100)"),
20
+ }, async ({ accountNumber, ...options }) => {
21
+ const result = await envManager.getActiveClient().getAccountTransactions(accountNumber, options);
22
+ return toolResult(result);
23
+ });
24
+ server.tool("transfer_funds", "Transfer funds between two accounts of the same bank user.", {
25
+ fromAccountNumber: z.string().describe("Source account number"),
26
+ toAccountNumber: z.string().describe("Destination account number"),
27
+ amount: z.number().describe("Amount to transfer"),
28
+ }, async (params) => {
29
+ const result = await envManager.getActiveClient().transferFunds(params);
30
+ return toolResult(result);
31
+ });
32
+ }
33
+ //# sourceMappingURL=accounts.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"accounts.js","sourceRoot":"","sources":["../../src/tools/accounts.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAExC,MAAM,UAAU,oBAAoB,CAAC,MAAiB,EAAE,UAA8B;IACpF,MAAM,CAAC,IAAI,CACT,eAAe,EACf,8IAA8I,EAC9I,EAAE,EACF,KAAK,IAAI,EAAE;QACT,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,eAAe,EAAE,CAAC,YAAY,EAAE,CAAC;QACjE,OAAO,UAAU,CAAC,MAAM,CAAC,CAAC;IAC5B,CAAC,CACF,CAAC;IAEF,MAAM,CAAC,IAAI,CACT,qBAAqB,EACrB,kDAAkD,EAClD;QACE,aAAa,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,yBAAyB,CAAC;KAC9D,EACD,KAAK,EAAE,EAAE,aAAa,EAAE,EAAE,EAAE;QAC1B,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,eAAe,EAAE,CAAC,iBAAiB,CAAC,aAAa,CAAC,CAAC;QACnF,OAAO,UAAU,CAAC,MAAM,CAAC,CAAC;IAC5B,CAAC,CACF,CAAC;IAEF,MAAM,CAAC,IAAI,CACT,0BAA0B,EAC1B,yFAAyF,EACzF;QACE,aAAa,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,yBAAyB,CAAC;QAC7D,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,gCAAgC,CAAC;QAC1E,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,8BAA8B,CAAC;QACtE,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,yBAAyB,CAAC;QAC3E,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,yBAAyB,CAAC;KAC1E,EACD,KAAK,EAAE,EAAE,aAAa,EAAE,GAAG,OAAO,EAAE,EAAE,EAAE;QACtC,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,eAAe,EAAE,CAAC,sBAAsB,CAAC,aAAa,EAAE,OAAO,CAAC,CAAC;QACjG,OAAO,UAAU,CAAC,MAAM,CAAC,CAAC;IAC5B,CAAC,CACF,CAAC;IAEF,MAAM,CAAC,IAAI,CACT,gBAAgB,EAChB,4DAA4D,EAC5D;QACE,iBAAiB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,uBAAuB,CAAC;QAC/D,eAAe,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,4BAA4B,CAAC;QAClE,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,oBAAoB,CAAC;KAClD,EACD,KAAK,EAAE,MAAM,EAAE,EAAE;QACf,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,eAAe,EAAE,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;QACxE,OAAO,UAAU,CAAC,MAAM,CAAC,CAAC;IAC5B,CAAC,CACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ import { EnvironmentManager } from "../environments.js";
3
+ export declare function registerACHTools(server: McpServer, envManager: EnvironmentManager): void;
@@ -0,0 +1,43 @@
1
+ import { z } from "zod";
2
+ import { toolResult } from "../util.js";
3
+ export function registerACHTools(server, envManager) {
4
+ server.tool("make_ach_payment", "Initiate an ACH payment. Supports two modes: 'DisplayName' (pre-registered recipient by display name) or 'Inline' (provide ABA, account number, account type to search/create recipient). Returns a paymentId for tracking.", {
5
+ fromAccountNumber: z.string().describe("The account number to pay from"),
6
+ recipientIdType: z
7
+ .enum(["DisplayName", "Inline"])
8
+ .describe("How to identify the recipient"),
9
+ recipientId: z
10
+ .string()
11
+ .optional()
12
+ .describe("Display name of pre-registered recipient (required when recipientIdType is 'DisplayName')"),
13
+ recipient: z
14
+ .object({
15
+ name: z.string().optional().describe("Recipient name (required when creating new)"),
16
+ aba: z.string().describe("ABA routing number (9 digits)"),
17
+ accountNumber: z.string().describe("Recipient account number"),
18
+ accountType: z.enum(["Checking", "Savings"]).describe("Account type"),
19
+ emailAddress: z.string().optional().describe("Recipient email (required when creating new)"),
20
+ })
21
+ .optional()
22
+ .describe("Inline recipient details (required when recipientIdType is 'Inline')"),
23
+ paymentAmount: z.number().describe("Amount to pay"),
24
+ paymentDate: z.string().describe("Payment date in YYYY-MM-DD format"),
25
+ paymentName: z.string().describe("Descriptive name for the payment"),
26
+ }, async (params) => {
27
+ const result = await envManager.getActiveClient().makeACHPayment(params);
28
+ return toolResult(result);
29
+ });
30
+ server.tool("authorize_ach_payment", "Authorize a previously submitted ACH payment.", {
31
+ paymentId: z.number().int().describe("The payment ID returned by make_ach_payment"),
32
+ }, async ({ paymentId }) => {
33
+ const result = await envManager.getActiveClient().authorizeACHPayment(paymentId);
34
+ return toolResult(result);
35
+ });
36
+ server.tool("get_ach_payment_status", "Get the status of an ACH payment. Possible statuses: Authorized, Cancelled, CsrActionItem, Drafted, FatalError, HostFailed, PendingProcessing, Processed, RtControlDenied, SentToHost, Suspect.", {
37
+ paymentId: z.number().int().describe("The payment ID to check"),
38
+ }, async ({ paymentId }) => {
39
+ const result = await envManager.getActiveClient().getACHPaymentStatus(paymentId);
40
+ return toolResult(result);
41
+ });
42
+ }
43
+ //# sourceMappingURL=ach.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ach.js","sourceRoot":"","sources":["../../src/tools/ach.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAExC,MAAM,UAAU,gBAAgB,CAAC,MAAiB,EAAE,UAA8B;IAChF,MAAM,CAAC,IAAI,CACT,kBAAkB,EAClB,6NAA6N,EAC7N;QACE,iBAAiB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,gCAAgC,CAAC;QACxE,eAAe,EAAE,CAAC;aACf,IAAI,CAAC,CAAC,aAAa,EAAE,QAAQ,CAAC,CAAC;aAC/B,QAAQ,CAAC,+BAA+B,CAAC;QAC5C,WAAW,EAAE,CAAC;aACX,MAAM,EAAE;aACR,QAAQ,EAAE;aACV,QAAQ,CAAC,2FAA2F,CAAC;QACxG,SAAS,EAAE,CAAC;aACT,MAAM,CAAC;YACN,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,6CAA6C,CAAC;YACnF,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,+BAA+B,CAAC;YACzD,aAAa,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,0BAA0B,CAAC;YAC9D,WAAW,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,UAAU,EAAE,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC,cAAc,CAAC;YACrE,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,8CAA8C,CAAC;SAC7F,CAAC;aACD,QAAQ,EAAE;aACV,QAAQ,CAAC,sEAAsE,CAAC;QACnF,aAAa,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,eAAe,CAAC;QACnD,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,mCAAmC,CAAC;QACrE,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,kCAAkC,CAAC;KACrE,EACD,KAAK,EAAE,MAAM,EAAE,EAAE;QACf,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,eAAe,EAAE,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC;QACzE,OAAO,UAAU,CAAC,MAAM,CAAC,CAAC;IAC5B,CAAC,CACF,CAAC;IAEF,MAAM,CAAC,IAAI,CACT,uBAAuB,EACvB,+CAA+C,EAC/C;QACE,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,6CAA6C,CAAC;KACpF,EACD,KAAK,EAAE,EAAE,SAAS,EAAE,EAAE,EAAE;QACtB,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,eAAe,EAAE,CAAC,mBAAmB,CAAC,SAAS,CAAC,CAAC;QACjF,OAAO,UAAU,CAAC,MAAM,CAAC,CAAC;IAC5B,CAAC,CACF,CAAC;IAEF,MAAM,CAAC,IAAI,CACT,wBAAwB,EACxB,iMAAiM,EACjM;QACE,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,yBAAyB,CAAC;KAChE,EACD,KAAK,EAAE,EAAE,SAAS,EAAE,EAAE,EAAE;QACtB,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,eAAe,EAAE,CAAC,mBAAmB,CAAC,SAAS,CAAC,CAAC;QACjF,OAAO,UAAU,CAAC,MAAM,CAAC,CAAC;IAC5B,CAAC,CACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ import { EnvironmentManager } from "../environments.js";
3
+ export declare function registerAuthTools(server: McpServer, envManager: EnvironmentManager): void;
@@ -0,0 +1,23 @@
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 API Storefront 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 API Storefront username"),
6
+ secret: z.string().describe("The Paywhere API Storefront secret"),
7
+ }, async ({ username, secret }) => {
8
+ const result = await envManager.getActiveClient().loginUser(username, secret);
9
+ return toolResult(result);
10
+ });
11
+ server.tool("login_bank_user", "Authenticate as a bank user. Requires a prior login_user call. Returns a bank user token that is automatically stored for subsequent calls. This must be called before account, payment, recipient, or sender operations.", {
12
+ username: z.string().describe("The bank user's username"),
13
+ password: z.string().describe("The bank user's password"),
14
+ }, async ({ username, password }) => {
15
+ const result = await envManager.getActiveClient().loginBankUser(username, password);
16
+ return toolResult(result);
17
+ });
18
+ server.tool("ping", "Health check endpoint. Returns the status of the Paywhere API Storefront. No authentication required.", {}, async () => {
19
+ const result = await envManager.getActiveClient().ping();
20
+ return toolResult(result);
21
+ });
22
+ }
23
+ //# 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,CAAC,MAAiB,EAAE,UAA8B;IACjF,MAAM,CAAC,IAAI,CACT,YAAY,EACZ,sLAAsL,EACtL;QACE,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,sCAAsC,CAAC;QACrE,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,oCAAoC,CAAC;KAClE,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;IAEF,MAAM,CAAC,IAAI,CACT,iBAAiB,EACjB,2NAA2N,EAC3N;QACE,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,0BAA0B,CAAC;QACzD,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,0BAA0B,CAAC;KAC1D,EACD,KAAK,EAAE,EAAE,QAAQ,EAAE,QAAQ,EAAE,EAAE,EAAE;QAC/B,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,eAAe,EAAE,CAAC,aAAa,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;QACpF,OAAO,UAAU,CAAC,MAAM,CAAC,CAAC;IAC5B,CAAC,CACF,CAAC;IAEF,MAAM,CAAC,IAAI,CACT,MAAM,EACN,uGAAuG,EACvG,EAAE,EACF,KAAK,IAAI,EAAE;QACT,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,eAAe,EAAE,CAAC,IAAI,EAAE,CAAC;QACzD,OAAO,UAAU,CAAC,MAAM,CAAC,CAAC;IAC5B,CAAC,CACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ import { EnvironmentManager } from "../environments.js";
3
+ export declare function registerConfigTools(server: McpServer, envManager: EnvironmentManager): void;
@@ -0,0 +1,8 @@
1
+ import { toolResult } from "../util.js";
2
+ export function registerConfigTools(server, envManager) {
3
+ server.tool("list_supported_chains", "List the blockchain chains supported by this Paywhere deployment. Returns chain IDs (ETH, POLY, ARB, BASE, SOL) and their display names.", {}, async () => {
4
+ const result = await envManager.getActiveClient().listSupportedChains();
5
+ return toolResult(result);
6
+ });
7
+ }
8
+ //# 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,CAAC,MAAiB,EAAE,UAA8B;IACnF,MAAM,CAAC,IAAI,CACT,uBAAuB,EACvB,0IAA0I,EAC1I,EAAE,EACF,KAAK,IAAI,EAAE;QACT,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,eAAe,EAAE,CAAC,mBAAmB,EAAE,CAAC;QACxE,OAAO,UAAU,CAAC,MAAM,CAAC,CAAC;IAC5B,CAAC,CACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ import { EnvironmentManager } from "../environments.js";
3
+ export declare function registerEnvironmentTools(server: McpServer, envManager: EnvironmentManager): void;
@@ -0,0 +1,35 @@
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 API Storefront 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
+ bankUserAuthenticated: status.bankUserAuthenticated,
15
+ }
16
+ : null,
17
+ });
18
+ });
19
+ server.tool("connect", "Connect to a Paywhere API Storefront environment. Accepts either a pre-configured environment name (from list_environments) or a raw API base URL. Session tokens are preserved per environment — switching back to a previously connected environment restores authentication state.", {
20
+ environment: z
21
+ .string()
22
+ .describe("Environment name (e.g. 'acme') or full API base URL (e.g. 'https://acme-api.paywhere.com/paywhere-api/v1')"),
23
+ }, async ({ environment }) => {
24
+ const result = envManager.connect(environment);
25
+ const status = envManager.getStatus();
26
+ return toolResult({
27
+ connected: true,
28
+ name: result.name,
29
+ url: result.url,
30
+ authenticated: status.authenticated,
31
+ bankUserAuthenticated: status.bankUserAuthenticated,
32
+ });
33
+ });
34
+ }
35
+ //# 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,+KAA+K,EAC/K,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;oBACnC,qBAAqB,EAAE,MAAM,CAAC,qBAAqB;iBACpD;gBACH,CAAC,CAAC,IAAI;SACT,CAAC,CAAC;IACL,CAAC,CACF,CAAC;IAEF,MAAM,CAAC,IAAI,CACT,SAAS,EACT,uRAAuR,EACvR;QACE,WAAW,EAAE,CAAC;aACX,MAAM,EAAE;aACR,QAAQ,CACP,4GAA4G,CAC7G;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;YACnC,qBAAqB,EAAE,MAAM,CAAC,qBAAqB;SACpD,CAAC,CAAC;IACL,CAAC,CACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ import { EnvironmentManager } from "../environments.js";
3
+ export declare function registerPaymentTools(server: McpServer, envManager: EnvironmentManager): void;
@@ -0,0 +1,34 @@
1
+ import { z } from "zod";
2
+ import { toolResult } from "../util.js";
3
+ export function registerPaymentTools(server, envManager) {
4
+ server.tool("make_stablecoin_payment", "Disburse stablecoin from a fiat bank account to a crypto recipient's wallet. The recipient must exist and be fully verified. Supports preview mode (preview=true) to get a fee estimate (1% of amount) without executing. Returns paymentId, fee, and status.", {
5
+ walletAddress: z.string().describe("Recipient's wallet address (must be a verified recipient)"),
6
+ currency: z.enum(["USD"]).describe("Stablecoin currency"),
7
+ accountNumber: z.string().describe("Source bank account number"),
8
+ amount: z.number().describe("Payment amount (must be > 0)"),
9
+ preview: z
10
+ .boolean()
11
+ .optional()
12
+ .describe("If true, returns fee estimate without executing payment"),
13
+ }, async (params) => {
14
+ const result = await envManager.getActiveClient().makeStablecoinPayment(params);
15
+ return toolResult(result);
16
+ });
17
+ server.tool("list_stablecoin_payments", "List all outgoing stablecoin payments for the bank user. Returns paymentId, amount, status, recipient, fee, and source account for each payment.", {}, async () => {
18
+ const result = await envManager.getActiveClient().listStablecoinPayments();
19
+ return toolResult(result);
20
+ });
21
+ server.tool("get_stablecoin_payment", "Get details of a stablecoin payment including amount, recipient, fee, source account, and status.", {
22
+ paymentId: z.string().describe("The stablecoin payment ID"),
23
+ }, async ({ paymentId }) => {
24
+ const result = await envManager.getActiveClient().getStablecoinPayment(paymentId);
25
+ return toolResult(result);
26
+ });
27
+ server.tool("get_stablecoin_payment_status", "Get the status of a stablecoin payment. Possible statuses: Pending, Complete, Failed.", {
28
+ paymentId: z.string().describe("The stablecoin payment ID"),
29
+ }, async ({ paymentId }) => {
30
+ const result = await envManager.getActiveClient().getStablecoinPaymentStatus(paymentId);
31
+ return toolResult(result);
32
+ });
33
+ }
34
+ //# sourceMappingURL=payments.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"payments.js","sourceRoot":"","sources":["../../src/tools/payments.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAExC,MAAM,UAAU,oBAAoB,CAAC,MAAiB,EAAE,UAA8B;IACpF,MAAM,CAAC,IAAI,CACT,yBAAyB,EACzB,+PAA+P,EAC/P;QACE,aAAa,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,2DAA2D,CAAC;QAC/F,QAAQ,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,qBAAqB,CAAC;QACzD,aAAa,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,4BAA4B,CAAC;QAChE,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,8BAA8B,CAAC;QAC3D,OAAO,EAAE,CAAC;aACP,OAAO,EAAE;aACT,QAAQ,EAAE;aACV,QAAQ,CAAC,yDAAyD,CAAC;KACvE,EACD,KAAK,EAAE,MAAM,EAAE,EAAE;QACf,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,eAAe,EAAE,CAAC,qBAAqB,CAAC,MAAM,CAAC,CAAC;QAChF,OAAO,UAAU,CAAC,MAAM,CAAC,CAAC;IAC5B,CAAC,CACF,CAAC;IAEF,MAAM,CAAC,IAAI,CACT,0BAA0B,EAC1B,kJAAkJ,EAClJ,EAAE,EACF,KAAK,IAAI,EAAE;QACT,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,eAAe,EAAE,CAAC,sBAAsB,EAAE,CAAC;QAC3E,OAAO,UAAU,CAAC,MAAM,CAAC,CAAC;IAC5B,CAAC,CACF,CAAC;IAEF,MAAM,CAAC,IAAI,CACT,wBAAwB,EACxB,mGAAmG,EACnG;QACE,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,2BAA2B,CAAC;KAC5D,EACD,KAAK,EAAE,EAAE,SAAS,EAAE,EAAE,EAAE;QACtB,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,eAAe,EAAE,CAAC,oBAAoB,CAAC,SAAS,CAAC,CAAC;QAClF,OAAO,UAAU,CAAC,MAAM,CAAC,CAAC;IAC5B,CAAC,CACF,CAAC;IAEF,MAAM,CAAC,IAAI,CACT,+BAA+B,EAC/B,uFAAuF,EACvF;QACE,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,2BAA2B,CAAC;KAC5D,EACD,KAAK,EAAE,EAAE,SAAS,EAAE,EAAE,EAAE;QACtB,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,eAAe,EAAE,CAAC,0BAA0B,CAAC,SAAS,CAAC,CAAC;QACxF,OAAO,UAAU,CAAC,MAAM,CAAC,CAAC;IAC5B,CAAC,CACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ import { EnvironmentManager } from "../environments.js";
3
+ export declare function registerReceiptTools(server: McpServer, envManager: EnvironmentManager): void;
@@ -0,0 +1,34 @@
1
+ import { z } from "zod";
2
+ import { toolResult } from "../util.js";
3
+ export function registerReceiptTools(server, envManager) {
4
+ server.tool("initiate_stablecoin_receipt", "Create a deposit address for receiving stablecoin. The sender sends crypto to this address; it auto-converts to fiat and deposits to the target bank account. The sender must exist and be fully verified. Supports preview mode for fee estimates.", {
5
+ walletAddress: z.string().describe("Sender's wallet address (must be a verified sender)"),
6
+ amount: z.number().describe("Expected amount to receive (must be > 0)"),
7
+ currency: z.enum(["USD"]).describe("Payment currency"),
8
+ targetAccountNumber: z.string().describe("Bank account where fiat funds will be deposited"),
9
+ preview: z
10
+ .boolean()
11
+ .optional()
12
+ .describe("If true, returns fee estimate without creating a deposit address"),
13
+ }, async (params) => {
14
+ const result = await envManager.getActiveClient().initiateReceipt(params);
15
+ return toolResult(result);
16
+ });
17
+ server.tool("list_stablecoin_receipts", "List all incoming stablecoin payment receipts for the bank user.", {}, async () => {
18
+ const result = await envManager.getActiveClient().listReceipts();
19
+ return toolResult(result);
20
+ });
21
+ server.tool("get_stablecoin_receipt", "Get details of a stablecoin payment receipt including sender, deposit address, target account, and status.", {
22
+ paymentId: z.string().describe("The payment receipt ID"),
23
+ }, async ({ paymentId }) => {
24
+ const result = await envManager.getActiveClient().getReceipt(paymentId);
25
+ return toolResult(result);
26
+ });
27
+ server.tool("get_stablecoin_receipt_status", "Get the status of a stablecoin payment receipt. Possible statuses: Pending (awaiting receipt), Received (stablecoin received), Settled (fiat deposited), Failed.", {
28
+ paymentId: z.string().describe("The payment receipt ID"),
29
+ }, async ({ paymentId }) => {
30
+ const result = await envManager.getActiveClient().getReceiptStatus(paymentId);
31
+ return toolResult(result);
32
+ });
33
+ }
34
+ //# sourceMappingURL=receipts.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"receipts.js","sourceRoot":"","sources":["../../src/tools/receipts.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAExC,MAAM,UAAU,oBAAoB,CAAC,MAAiB,EAAE,UAA8B;IACpF,MAAM,CAAC,IAAI,CACT,6BAA6B,EAC7B,qPAAqP,EACrP;QACE,aAAa,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,qDAAqD,CAAC;QACzF,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,0CAA0C,CAAC;QACvE,QAAQ,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,kBAAkB,CAAC;QACtD,mBAAmB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,iDAAiD,CAAC;QAC3F,OAAO,EAAE,CAAC;aACP,OAAO,EAAE;aACT,QAAQ,EAAE;aACV,QAAQ,CAAC,kEAAkE,CAAC;KAChF,EACD,KAAK,EAAE,MAAM,EAAE,EAAE;QACf,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,eAAe,EAAE,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC;QAC1E,OAAO,UAAU,CAAC,MAAM,CAAC,CAAC;IAC5B,CAAC,CACF,CAAC;IAEF,MAAM,CAAC,IAAI,CACT,0BAA0B,EAC1B,kEAAkE,EAClE,EAAE,EACF,KAAK,IAAI,EAAE;QACT,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,eAAe,EAAE,CAAC,YAAY,EAAE,CAAC;QACjE,OAAO,UAAU,CAAC,MAAM,CAAC,CAAC;IAC5B,CAAC,CACF,CAAC;IAEF,MAAM,CAAC,IAAI,CACT,wBAAwB,EACxB,4GAA4G,EAC5G;QACE,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,wBAAwB,CAAC;KACzD,EACD,KAAK,EAAE,EAAE,SAAS,EAAE,EAAE,EAAE;QACtB,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,eAAe,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC;QACxE,OAAO,UAAU,CAAC,MAAM,CAAC,CAAC;IAC5B,CAAC,CACF,CAAC;IAEF,MAAM,CAAC,IAAI,CACT,+BAA+B,EAC/B,kKAAkK,EAClK;QACE,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,wBAAwB,CAAC;KACzD,EACD,KAAK,EAAE,EAAE,SAAS,EAAE,EAAE,EAAE;QACtB,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,eAAe,EAAE,CAAC,gBAAgB,CAAC,SAAS,CAAC,CAAC;QAC9E,OAAO,UAAU,CAAC,MAAM,CAAC,CAAC;IAC5B,CAAC,CACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ import { EnvironmentManager } from "../environments.js";
3
+ export declare function registerRecipientTools(server: McpServer, envManager: EnvironmentManager): void;
@@ -0,0 +1,55 @@
1
+ import { z } from "zod";
2
+ import { toolResult } from "../util.js";
3
+ export function registerRecipientTools(server, envManager) {
4
+ server.tool("list_stablecoin_recipients", "List all stablecoin recipients for the bank user. Returns wallet info, owner info, verification statuses, and description for each recipient.", {}, async () => {
5
+ const result = await envManager.getActiveClient().listRecipients();
6
+ return toolResult(result);
7
+ });
8
+ server.tool("create_stablecoin_recipient", "Create a stablecoin recipient. A recipient is a crypto wallet that receives fiat-to-stablecoin disbursements. The wallet address is the unique identifier. Returns verification statuses.", {
9
+ wallet: z
10
+ .object({
11
+ address: z.string().describe("Blockchain wallet address"),
12
+ chain: z.enum(["ETH", "POLY", "ARB", "BASE", "SOL"]).describe("Blockchain chain"),
13
+ currency: z.enum(["USD"]).describe("Stablecoin currency"),
14
+ })
15
+ .describe("Recipient wallet info"),
16
+ walletOwner: z
17
+ .object({
18
+ type: z.enum(["Self", "Individual", "Business"]).describe("Owner type"),
19
+ name: z.string().optional().describe("Full name (required for Individual/Business)"),
20
+ address: z
21
+ .object({
22
+ line1: z.string().describe("Street address line 1"),
23
+ line2: z.string().optional().describe("Street address line 2"),
24
+ city: z.string().describe("City"),
25
+ district: z.string().optional().describe("State/province (required for US/CA)"),
26
+ country: z.string().describe("Two-letter country code (ISO 3166-1)"),
27
+ postalCode: z.string().describe("Postal/ZIP code"),
28
+ })
29
+ .optional()
30
+ .describe("Owner physical address (required for Individual/Business)"),
31
+ })
32
+ .describe("Wallet owner info"),
33
+ description: z.string().describe("User-provided description for the recipient"),
34
+ }, async (params) => {
35
+ const result = await envManager.getActiveClient().createRecipient(params);
36
+ return toolResult(result);
37
+ });
38
+ server.tool("get_stablecoin_recipient", "Get details of a stablecoin recipient by wallet address. Fetches latest verification status if pending.", {
39
+ walletAddress: z.string().describe("The recipient's blockchain wallet address"),
40
+ }, async ({ walletAddress }) => {
41
+ const result = await envManager.getActiveClient().getRecipient(walletAddress);
42
+ return toolResult(result);
43
+ });
44
+ server.tool("delete_stablecoin_recipient", "Delete a stablecoin recipient by wallet address.", {
45
+ walletAddress: z.string().describe("The recipient's blockchain wallet address"),
46
+ skipExternalDelete: z
47
+ .boolean()
48
+ .optional()
49
+ .describe("If true, skip deleting from the external stablecoin provider (default false)"),
50
+ }, async ({ walletAddress, skipExternalDelete }) => {
51
+ const result = await envManager.getActiveClient().deleteRecipient(walletAddress, skipExternalDelete);
52
+ return toolResult(result);
53
+ });
54
+ }
55
+ //# sourceMappingURL=recipients.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"recipients.js","sourceRoot":"","sources":["../../src/tools/recipients.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ import { EnvironmentManager } from "../environments.js";
3
+ export declare function registerSenderTools(server: McpServer, envManager: EnvironmentManager): void;
@@ -0,0 +1,55 @@
1
+ import { z } from "zod";
2
+ import { toolResult } from "../util.js";
3
+ export function registerSenderTools(server, envManager) {
4
+ server.tool("list_stablecoin_senders", "List all stablecoin senders for the bank user. A sender is a crypto wallet that can send stablecoin to the bank user's fiat account.", {}, async () => {
5
+ const result = await envManager.getActiveClient().listSenders();
6
+ return toolResult(result);
7
+ });
8
+ server.tool("create_stablecoin_sender", "Create a stablecoin sender. A sender represents a crypto wallet that can send stablecoin funds to a banking user's fiat account. The wallet address is the unique identifier.", {
9
+ wallet: z
10
+ .object({
11
+ address: z.string().describe("Blockchain wallet address"),
12
+ chain: z.enum(["ETH", "POLY", "ARB", "BASE", "SOL"]).describe("Blockchain chain"),
13
+ currency: z.enum(["USD"]).describe("Stablecoin currency"),
14
+ })
15
+ .describe("Sender wallet info"),
16
+ walletOwner: z
17
+ .object({
18
+ type: z.enum(["Self", "Individual", "Business"]).describe("Owner type"),
19
+ name: z.string().optional().describe("Full name (required for Individual/Business)"),
20
+ address: z
21
+ .object({
22
+ line1: z.string().describe("Street address line 1"),
23
+ line2: z.string().optional().describe("Street address line 2"),
24
+ city: z.string().describe("City"),
25
+ district: z.string().optional().describe("State/province (required for US/CA)"),
26
+ country: z.string().describe("Two-letter country code (ISO 3166-1)"),
27
+ postalCode: z.string().describe("Postal/ZIP code"),
28
+ })
29
+ .optional()
30
+ .describe("Owner physical address (required for Individual/Business)"),
31
+ })
32
+ .describe("Wallet owner info"),
33
+ description: z.string().describe("User-provided description for the sender"),
34
+ }, async (params) => {
35
+ const result = await envManager.getActiveClient().createSender(params);
36
+ return toolResult(result);
37
+ });
38
+ server.tool("get_stablecoin_sender", "Get details of a stablecoin sender by wallet address including verification statuses.", {
39
+ walletAddress: z.string().describe("The sender's blockchain wallet address"),
40
+ }, async ({ walletAddress }) => {
41
+ const result = await envManager.getActiveClient().getSender(walletAddress);
42
+ return toolResult(result);
43
+ });
44
+ server.tool("delete_stablecoin_sender", "Delete a stablecoin sender by wallet address.", {
45
+ walletAddress: z.string().describe("The sender's blockchain wallet address"),
46
+ skipExternalDelete: z
47
+ .boolean()
48
+ .optional()
49
+ .describe("If true, skip deleting from the external stablecoin provider (default false)"),
50
+ }, async ({ walletAddress, skipExternalDelete }) => {
51
+ const result = await envManager.getActiveClient().deleteSender(walletAddress, skipExternalDelete);
52
+ return toolResult(result);
53
+ });
54
+ }
55
+ //# sourceMappingURL=senders.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"senders.js","sourceRoot":"","sources":["../../src/tools/senders.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ import { EnvironmentManager } from "../environments.js";
3
+ export declare function registerWireTools(server: McpServer, envManager: EnvironmentManager): void;
@@ -0,0 +1,65 @@
1
+ import { z } from "zod";
2
+ import { toolResult } from "../util.js";
3
+ export function registerWireTools(server, envManager) {
4
+ server.tool("get_wire_config", "Get wire payment configuration: available subsidiaries, next valid payment date, and default settings. Call this before making a wire payment.", {}, async () => {
5
+ const result = await envManager.getActiveClient().getWireConfig();
6
+ return toolResult(result);
7
+ });
8
+ server.tool("make_wire_payment", "Initiate a domestic wire payment. Returns paymentId and status. By default, wires are auto-approved; set autoApprove=false to leave in Draft status.", {
9
+ fromAccountNumber: z.string().describe("Source account number"),
10
+ amount: z.number().describe("Wire transfer amount"),
11
+ processDate: z.string().describe("Processing date in YYYY-MM-DD format"),
12
+ recipient: z
13
+ .object({
14
+ name: z.string().describe("Recipient full name"),
15
+ accountNumber: z.string().describe("Recipient account number"),
16
+ accountType: z.string().optional().describe("Account type (e.g., Checking, Savings)"),
17
+ address1: z.string().optional().describe("Recipient address line 1"),
18
+ address2: z.string().optional().describe("Recipient address line 2"),
19
+ address3: z.string().optional().describe("Recipient address line 3"),
20
+ city: z.string().optional().describe("Recipient city"),
21
+ state: z.string().optional().describe("Recipient state"),
22
+ postalCode: z.string().optional().describe("Recipient postal code"),
23
+ })
24
+ .describe("Recipient details"),
25
+ recipientBank: z
26
+ .object({
27
+ name: z.string().describe("Bank name"),
28
+ routingNumber: z.string().describe("Bank routing number"),
29
+ address1: z.string().optional().describe("Bank address"),
30
+ city: z.string().optional().describe("Bank city"),
31
+ state: z.string().optional().describe("Bank state"),
32
+ postalCode: z.string().optional().describe("Bank postal code"),
33
+ })
34
+ .describe("Recipient bank details"),
35
+ purposeOfWire: z.string().optional().describe("Purpose of the wire transfer"),
36
+ description: z.string().optional().describe("Additional notes"),
37
+ emailAddress: z.string().optional().describe("Email for wire confirmation"),
38
+ originatorToBeneficiaryInfo: z.string().optional().describe("Fedwire Tag 6000"),
39
+ referenceForBeneficiary: z.string().optional().describe("Fedwire Tag 4200"),
40
+ autoApprove: z.boolean().optional().describe("Auto-authorize (default true)"),
41
+ subsidiaryId: z.number().int().optional().describe("Subsidiary ID for multi-subsidiary users"),
42
+ }, async (params) => {
43
+ const result = await envManager.getActiveClient().makeWirePayment(params);
44
+ return toolResult(result);
45
+ });
46
+ server.tool("get_wire_payment", "Get full details of a domestic wire payment including recipient, bank, authorization, and status.", {
47
+ paymentId: z.number().int().describe("The wire payment ID"),
48
+ }, async ({ paymentId }) => {
49
+ const result = await envManager.getActiveClient().getWirePayment(paymentId);
50
+ return toolResult(result);
51
+ });
52
+ server.tool("get_wire_payment_status", "Get the status of a domestic wire payment.", {
53
+ paymentId: z.number().int().describe("The wire payment ID"),
54
+ }, async ({ paymentId }) => {
55
+ const result = await envManager.getActiveClient().getWirePaymentStatus(paymentId);
56
+ return toolResult(result);
57
+ });
58
+ server.tool("get_wire_inbound", "Get details of an inbound domestic wire transfer (FedWire). Includes sender info, sender bank, and message to beneficiary.", {
59
+ wireTransactionId: z.number().int().describe("The wire transaction ID"),
60
+ }, async ({ wireTransactionId }) => {
61
+ const result = await envManager.getActiveClient().getWireInbound(wireTransactionId);
62
+ return toolResult(result);
63
+ });
64
+ }
65
+ //# sourceMappingURL=wire.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wire.js","sourceRoot":"","sources":["../../src/tools/wire.ts"],"names":[],"mappings":"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"}
package/dist/util.d.ts ADDED
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Wraps an API result into the MCP tool response format.
3
+ */
4
+ export declare function toolResult(data: unknown): {
5
+ content: {
6
+ type: "text";
7
+ text: string;
8
+ }[];
9
+ };
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
@@ -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-api",
3
+ "version": "1.0.0",
4
+ "description": "MCP server for the Paywhere API Storefront — banking operations for AI agents",
5
+ "type": "module",
6
+ "bin": {
7
+ "paywhere-mcp-api": "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
+ }