stables-mcp-server 1.0.0 → 1.1.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/build/lib/stables-client.d.ts +151 -100
- package/build/lib/stables-client.d.ts.map +1 -1
- package/build/lib/stables-client.js +70 -19
- package/build/lib/stables-client.js.map +1 -1
- package/build/tools/api-keys.d.ts.map +1 -1
- package/build/tools/api-keys.js +6 -7
- package/build/tools/api-keys.js.map +1 -1
- package/build/tools/customers.d.ts +1 -1
- package/build/tools/customers.d.ts.map +1 -1
- package/build/tools/customers.js +106 -23
- package/build/tools/customers.js.map +1 -1
- package/build/tools/quotes.d.ts +1 -2
- package/build/tools/quotes.d.ts.map +1 -1
- package/build/tools/quotes.js +25 -13
- package/build/tools/quotes.js.map +1 -1
- package/build/tools/transfers.d.ts +1 -2
- package/build/tools/transfers.d.ts.map +1 -1
- package/build/tools/transfers.js +15 -10
- package/build/tools/transfers.js.map +1 -1
- package/build/tools/virtual-accounts.d.ts +1 -0
- package/build/tools/virtual-accounts.d.ts.map +1 -1
- package/build/tools/virtual-accounts.js +163 -13
- package/build/tools/virtual-accounts.js.map +1 -1
- package/build/tools/webhooks.d.ts +1 -2
- package/build/tools/webhooks.d.ts.map +1 -1
- package/build/tools/webhooks.js +15 -8
- package/build/tools/webhooks.js.map +1 -1
- package/package.json +1 -1
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Virtual Account Tools for Stables MCP Server
|
|
3
|
+
* Synced with OpenAPI spec from https://api.sandbox.stables.money/docs
|
|
3
4
|
*/
|
|
4
5
|
import { z } from "zod";
|
|
5
6
|
export function registerVirtualAccountTools(server, client) {
|
|
@@ -9,37 +10,47 @@ export function registerVirtualAccountTools(server, client) {
|
|
|
9
10
|
sourceCurrency: z.string().describe("Currency for the virtual account (e.g., 'USD', 'EUR', 'GBP')"),
|
|
10
11
|
depositHandlingMode: z.enum(["auto_payout", "hold", "manual"]).optional()
|
|
11
12
|
.describe("How to handle deposits: 'auto_payout' converts and sends to wallet, 'hold' keeps as fiat, 'manual' requires approval"),
|
|
12
|
-
destinationAddress: z.string().optional().describe("Crypto wallet address for
|
|
13
|
-
|
|
13
|
+
destinationAddress: z.string().optional().describe("Crypto wallet address for payouts"),
|
|
14
|
+
destinationPaymentRail: z.enum(["arbitrum", "avalanche_c_chain", "base", "celo", "ethereum", "optimism", "polygon", "solana", "stellar", "tron"]).optional()
|
|
14
15
|
.describe("Blockchain network for the destination wallet"),
|
|
15
16
|
destinationCurrency: z.enum(["usdc", "usdt", "dai", "pyusd", "eurc"]).optional()
|
|
16
17
|
.describe("Stablecoin to receive (default: usdc)"),
|
|
17
|
-
}, async ({ customerId, sourceCurrency, depositHandlingMode, destinationAddress,
|
|
18
|
+
}, async ({ customerId, sourceCurrency, depositHandlingMode, destinationAddress, destinationPaymentRail, destinationCurrency }) => {
|
|
18
19
|
try {
|
|
19
20
|
const request = {
|
|
20
21
|
source: { currency: sourceCurrency },
|
|
21
22
|
deposit_handling_mode: depositHandlingMode,
|
|
22
23
|
};
|
|
23
24
|
// Add destination if all required fields provided
|
|
24
|
-
if (destinationAddress &&
|
|
25
|
-
request.
|
|
25
|
+
if (destinationAddress && destinationPaymentRail) {
|
|
26
|
+
request.destination = {
|
|
26
27
|
currency: destinationCurrency || "usdc",
|
|
27
|
-
|
|
28
|
+
payment_rail: destinationPaymentRail,
|
|
28
29
|
address: destinationAddress,
|
|
29
30
|
};
|
|
30
31
|
}
|
|
31
32
|
const account = await client.createVirtualAccount(customerId, request);
|
|
32
33
|
const instructions = account.source_deposit_instructions;
|
|
33
34
|
let depositInfo = `Currency: ${instructions.currency}`;
|
|
35
|
+
depositInfo += `\nPayment Rails: ${instructions.payment_rails.join(", ")}`;
|
|
34
36
|
if (instructions.bank_name)
|
|
35
37
|
depositInfo += `\nBank: ${instructions.bank_name}`;
|
|
36
38
|
if (instructions.bank_account_number)
|
|
37
39
|
depositInfo += `\nAccount Number: ${instructions.bank_account_number}`;
|
|
38
40
|
if (instructions.bank_routing_number)
|
|
39
41
|
depositInfo += `\nRouting Number: ${instructions.bank_routing_number}`;
|
|
40
|
-
|
|
41
|
-
|
|
42
|
+
if (instructions.iban)
|
|
43
|
+
depositInfo += `\nIBAN: ${instructions.iban}`;
|
|
44
|
+
if (instructions.bic)
|
|
45
|
+
depositInfo += `\nBIC: ${instructions.bic}`;
|
|
46
|
+
if (instructions.account_holder_name)
|
|
47
|
+
depositInfo += `\nAccount Holder: ${instructions.account_holder_name}`;
|
|
48
|
+
const destInfo = account.destination
|
|
49
|
+
? `\nPayout Address: ${account.destination.address}\nPayment Rail: ${account.destination.payment_rail}\nCurrency: ${account.destination.currency}`
|
|
42
50
|
: "\nNo payout destination configured";
|
|
51
|
+
const balanceInfo = account.held_balance
|
|
52
|
+
? `\nHeld Balance: ${account.held_balance.amount} ${account.held_balance.currency}`
|
|
53
|
+
: "";
|
|
43
54
|
return {
|
|
44
55
|
content: [
|
|
45
56
|
{
|
|
@@ -55,7 +66,7 @@ Deposit Instructions:
|
|
|
55
66
|
${depositInfo}
|
|
56
67
|
|
|
57
68
|
Payout Destination:${destInfo}
|
|
58
|
-
|
|
69
|
+
${balanceInfo}
|
|
59
70
|
Created: ${account.created_at}
|
|
60
71
|
|
|
61
72
|
Share the deposit instructions with the customer to receive funds.`,
|
|
@@ -75,7 +86,7 @@ Share the deposit instructions with the customer to receive funds.`,
|
|
|
75
86
|
};
|
|
76
87
|
}
|
|
77
88
|
});
|
|
78
|
-
// List Virtual Accounts
|
|
89
|
+
// List Virtual Accounts (by customer)
|
|
79
90
|
server.tool("list_virtual_accounts", "List all virtual accounts for a customer", {
|
|
80
91
|
customerId: z.string().describe("The customer ID to list virtual accounts for"),
|
|
81
92
|
status: z.enum(["activated", "deactivated", "pending", "closed"]).optional()
|
|
@@ -95,10 +106,11 @@ Share the deposit instructions with the customer to receive funds.`,
|
|
|
95
106
|
};
|
|
96
107
|
}
|
|
97
108
|
const accountList = response.data.map((a) => {
|
|
98
|
-
const dest = a.
|
|
99
|
-
? `Payout: ${a.
|
|
109
|
+
const dest = a.destination
|
|
110
|
+
? `Payout: ${a.destination.address.slice(0, 10)}... (${a.destination.payment_rail})`
|
|
100
111
|
: "No payout destination";
|
|
101
|
-
|
|
112
|
+
const balance = a.held_balance ? ` | Balance: ${a.held_balance.amount} ${a.held_balance.currency}` : "";
|
|
113
|
+
return `- ${a.id}: ${a.source_deposit_instructions.currency} (${a.status}) - ${dest}${balance}`;
|
|
102
114
|
}).join("\n");
|
|
103
115
|
return {
|
|
104
116
|
content: [
|
|
@@ -123,5 +135,143 @@ ${accountList}`,
|
|
|
123
135
|
};
|
|
124
136
|
}
|
|
125
137
|
});
|
|
138
|
+
// Update Virtual Account
|
|
139
|
+
server.tool("update_virtual_account", "Update virtual account settings (e.g., deposit handling mode)", {
|
|
140
|
+
customerId: z.string().describe("The customer ID"),
|
|
141
|
+
virtualAccountId: z.string().describe("The virtual account ID to update"),
|
|
142
|
+
depositHandlingMode: z.enum(["auto_payout", "hold", "manual"]).describe("New deposit handling mode"),
|
|
143
|
+
}, async ({ customerId, virtualAccountId, depositHandlingMode }) => {
|
|
144
|
+
try {
|
|
145
|
+
const account = await client.updateVirtualAccount(customerId, virtualAccountId, {
|
|
146
|
+
deposit_handling_mode: depositHandlingMode,
|
|
147
|
+
});
|
|
148
|
+
return {
|
|
149
|
+
content: [
|
|
150
|
+
{
|
|
151
|
+
type: "text",
|
|
152
|
+
text: `Virtual account ${account.id} updated.
|
|
153
|
+
Deposit Mode: ${account.deposit_handling_mode}
|
|
154
|
+
Status: ${account.status}`,
|
|
155
|
+
},
|
|
156
|
+
],
|
|
157
|
+
};
|
|
158
|
+
}
|
|
159
|
+
catch (error) {
|
|
160
|
+
return {
|
|
161
|
+
content: [
|
|
162
|
+
{
|
|
163
|
+
type: "text",
|
|
164
|
+
text: `Failed to update virtual account: ${error instanceof Error ? error.message : "Unknown error"}`,
|
|
165
|
+
},
|
|
166
|
+
],
|
|
167
|
+
isError: true,
|
|
168
|
+
};
|
|
169
|
+
}
|
|
170
|
+
});
|
|
171
|
+
// Deactivate Virtual Account
|
|
172
|
+
server.tool("deactivate_virtual_account", "Deactivate a virtual account to prevent new incoming transactions", {
|
|
173
|
+
customerId: z.string().describe("The customer ID"),
|
|
174
|
+
virtualAccountId: z.string().describe("The virtual account ID to deactivate"),
|
|
175
|
+
}, async ({ customerId, virtualAccountId }) => {
|
|
176
|
+
try {
|
|
177
|
+
const account = await client.deactivateVirtualAccount(customerId, virtualAccountId);
|
|
178
|
+
return {
|
|
179
|
+
content: [
|
|
180
|
+
{
|
|
181
|
+
type: "text",
|
|
182
|
+
text: `Virtual account ${account.id} has been deactivated. No new deposits will be accepted.`,
|
|
183
|
+
},
|
|
184
|
+
],
|
|
185
|
+
};
|
|
186
|
+
}
|
|
187
|
+
catch (error) {
|
|
188
|
+
return {
|
|
189
|
+
content: [
|
|
190
|
+
{
|
|
191
|
+
type: "text",
|
|
192
|
+
text: `Failed to deactivate virtual account: ${error instanceof Error ? error.message : "Unknown error"}`,
|
|
193
|
+
},
|
|
194
|
+
],
|
|
195
|
+
isError: true,
|
|
196
|
+
};
|
|
197
|
+
}
|
|
198
|
+
});
|
|
199
|
+
// Reactivate Virtual Account
|
|
200
|
+
server.tool("reactivate_virtual_account", "Reactivate a previously deactivated virtual account", {
|
|
201
|
+
customerId: z.string().describe("The customer ID"),
|
|
202
|
+
virtualAccountId: z.string().describe("The virtual account ID to reactivate"),
|
|
203
|
+
}, async ({ customerId, virtualAccountId }) => {
|
|
204
|
+
try {
|
|
205
|
+
const account = await client.reactivateVirtualAccount(customerId, virtualAccountId);
|
|
206
|
+
return {
|
|
207
|
+
content: [
|
|
208
|
+
{
|
|
209
|
+
type: "text",
|
|
210
|
+
text: `Virtual account ${account.id} has been reactivated. Status: ${account.status}`,
|
|
211
|
+
},
|
|
212
|
+
],
|
|
213
|
+
};
|
|
214
|
+
}
|
|
215
|
+
catch (error) {
|
|
216
|
+
return {
|
|
217
|
+
content: [
|
|
218
|
+
{
|
|
219
|
+
type: "text",
|
|
220
|
+
text: `Failed to reactivate virtual account: ${error instanceof Error ? error.message : "Unknown error"}`,
|
|
221
|
+
},
|
|
222
|
+
],
|
|
223
|
+
isError: true,
|
|
224
|
+
};
|
|
225
|
+
}
|
|
226
|
+
});
|
|
227
|
+
// Get Virtual Account History
|
|
228
|
+
server.tool("get_virtual_account_history", "Get the activity history for a virtual account (deposits, payouts, etc.)", {
|
|
229
|
+
customerId: z.string().describe("The customer ID"),
|
|
230
|
+
virtualAccountId: z.string().describe("The virtual account ID"),
|
|
231
|
+
limit: z.number().optional().describe("Maximum number of events to return (default: 10)"),
|
|
232
|
+
eventType: z.enum(["funds_scheduled", "funds_received", "payment_submitted", "payment_processed", "in_review", "refund", "microdeposit", "account_update", "deactivation", "activation"]).optional()
|
|
233
|
+
.describe("Filter by event type"),
|
|
234
|
+
}, async ({ customerId, virtualAccountId, limit, eventType }) => {
|
|
235
|
+
try {
|
|
236
|
+
const response = await client.getVirtualAccountHistory(customerId, virtualAccountId, {
|
|
237
|
+
limit,
|
|
238
|
+
event_type: eventType,
|
|
239
|
+
});
|
|
240
|
+
if (response.data.length === 0) {
|
|
241
|
+
return {
|
|
242
|
+
content: [
|
|
243
|
+
{
|
|
244
|
+
type: "text",
|
|
245
|
+
text: `No activity found for virtual account ${virtualAccountId}.`,
|
|
246
|
+
},
|
|
247
|
+
],
|
|
248
|
+
};
|
|
249
|
+
}
|
|
250
|
+
const eventList = response.data.map((e) => {
|
|
251
|
+
return `- ${e.created_at}: ${e.type} - ${e.amount} ${e.currency}${e.deposit_id ? ` (Deposit: ${e.deposit_id})` : ""}`;
|
|
252
|
+
}).join("\n");
|
|
253
|
+
return {
|
|
254
|
+
content: [
|
|
255
|
+
{
|
|
256
|
+
type: "text",
|
|
257
|
+
text: `Virtual Account History (${response.count} events):
|
|
258
|
+
|
|
259
|
+
${eventList}`,
|
|
260
|
+
},
|
|
261
|
+
],
|
|
262
|
+
};
|
|
263
|
+
}
|
|
264
|
+
catch (error) {
|
|
265
|
+
return {
|
|
266
|
+
content: [
|
|
267
|
+
{
|
|
268
|
+
type: "text",
|
|
269
|
+
text: `Failed to get virtual account history: ${error instanceof Error ? error.message : "Unknown error"}`,
|
|
270
|
+
},
|
|
271
|
+
],
|
|
272
|
+
isError: true,
|
|
273
|
+
};
|
|
274
|
+
}
|
|
275
|
+
});
|
|
126
276
|
}
|
|
127
277
|
//# sourceMappingURL=virtual-accounts.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"virtual-accounts.js","sourceRoot":"","sources":["../../src/tools/virtual-accounts.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"virtual-accounts.js","sourceRoot":"","sources":["../../src/tools/virtual-accounts.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Webhook Management Tools for Stables MCP Server
|
|
3
|
-
*
|
|
4
|
-
* Uses eventTypes (not events), includes name and secret fields
|
|
3
|
+
* Synced with OpenAPI spec from https://api.sandbox.stables.money/docs
|
|
5
4
|
*/
|
|
6
5
|
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
7
6
|
import { StablesApiClient } from "../lib/stables-client.js";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"webhooks.d.ts","sourceRoot":"","sources":["../../src/tools/webhooks.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"webhooks.d.ts","sourceRoot":"","sources":["../../src/tools/webhooks.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAEpE,OAAO,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAE5D,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,gBAAgB,QAuJ/E"}
|
package/build/tools/webhooks.js
CHANGED
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Webhook Management Tools for Stables MCP Server
|
|
3
|
-
*
|
|
4
|
-
* Uses eventTypes (not events), includes name and secret fields
|
|
3
|
+
* Synced with OpenAPI spec from https://api.sandbox.stables.money/docs
|
|
5
4
|
*/
|
|
6
5
|
import { z } from "zod";
|
|
7
6
|
export function registerWebhookTools(server, client) {
|
|
@@ -10,13 +9,21 @@ export function registerWebhookTools(server, client) {
|
|
|
10
9
|
|
|
11
10
|
Available event types:
|
|
12
11
|
- WEBHOOK_EVENT_TYPE_CUSTOMER_CREATED
|
|
12
|
+
- WEBHOOK_EVENT_TYPE_CUSTOMER_UPDATED
|
|
13
13
|
- WEBHOOK_EVENT_TYPE_KYC_STATUS_CHANGED
|
|
14
|
+
- WEBHOOK_EVENT_TYPE_PAYMENT_CREATED
|
|
14
15
|
- WEBHOOK_EVENT_TYPE_PAYMENT_STATUS_CHANGED
|
|
16
|
+
- WEBHOOK_EVENT_TYPE_QUOTE_CREATED
|
|
17
|
+
- WEBHOOK_EVENT_TYPE_QUOTE_EXPIRED
|
|
18
|
+
- WEBHOOK_EVENT_TYPE_VA_DEPOSIT_RECEIVED
|
|
19
|
+
- WEBHOOK_EVENT_TYPE_VA_PAYOUT_COMPLETED
|
|
20
|
+
- WEBHOOK_EVENT_TYPE_VA_PAYOUT_FAILED
|
|
21
|
+
- WEBHOOK_EVENT_TYPE_ALL
|
|
15
22
|
|
|
16
23
|
Security: Set a secret to enable HMAC-SHA256 signature verification via X-Webhook-Signature header.`, {
|
|
17
24
|
name: z.string().describe("A descriptive name for this webhook (e.g., 'Payment Status Notifications')"),
|
|
18
25
|
url: z.string().url().describe("The HTTPS URL to receive webhook POST requests"),
|
|
19
|
-
eventTypes: z.array(z.string()).describe("List of event types to subscribe to (e.g., ['
|
|
26
|
+
eventTypes: z.array(z.string()).describe("List of event types to subscribe to (e.g., ['WEBHOOK_EVENT_TYPE_PAYMENT_STATUS_CHANGED'])"),
|
|
20
27
|
secret: z.string().optional().describe("Optional signing secret for HMAC-SHA256 webhook signature verification"),
|
|
21
28
|
}, async ({ name, url, eventTypes, secret }) => {
|
|
22
29
|
try {
|
|
@@ -65,18 +72,18 @@ Tip: Return 200 quickly and process events asynchronously. Use eventId for idemp
|
|
|
65
72
|
type: "text",
|
|
66
73
|
text: `No webhooks configured. Use 'create_webhook' to subscribe to events.
|
|
67
74
|
|
|
68
|
-
Available event types:
|
|
69
|
-
-
|
|
75
|
+
Available event types include:
|
|
76
|
+
- WEBHOOK_EVENT_TYPE_PAYMENT_STATUS_CHANGED
|
|
70
77
|
- WEBHOOK_EVENT_TYPE_KYC_STATUS_CHANGED
|
|
71
|
-
-
|
|
78
|
+
- WEBHOOK_EVENT_TYPE_VA_DEPOSIT_RECEIVED
|
|
79
|
+
- WEBHOOK_EVENT_TYPE_ALL (subscribe to everything)`,
|
|
72
80
|
},
|
|
73
81
|
],
|
|
74
82
|
};
|
|
75
83
|
}
|
|
76
84
|
const webhookList = response.subscriptions.map((w) => {
|
|
77
85
|
const status = w.active ? "Active" : "Inactive";
|
|
78
|
-
|
|
79
|
-
return `- ${id}: "${w.name}" → ${w.url} (${status})\n Events: ${w.eventTypes.join(", ")}`;
|
|
86
|
+
return `- ${w.subscriptionId}: "${w.name}" -> ${w.url} (${status})\n Events: ${w.eventTypes.join(", ")}`;
|
|
80
87
|
}).join("\n\n");
|
|
81
88
|
return {
|
|
82
89
|
content: [
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"webhooks.js","sourceRoot":"","sources":["../../src/tools/webhooks.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"webhooks.js","sourceRoot":"","sources":["../../src/tools/webhooks.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED