stables-mcp-server 1.0.0 → 1.3.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 (35) hide show
  1. package/README.md +221 -36
  2. package/build/index.js +5 -1
  3. package/build/index.js.map +1 -1
  4. package/build/lib/stables-client.d.ts +200 -102
  5. package/build/lib/stables-client.d.ts.map +1 -1
  6. package/build/lib/stables-client.js +176 -52
  7. package/build/lib/stables-client.js.map +1 -1
  8. package/build/tools/api-keys.d.ts.map +1 -1
  9. package/build/tools/api-keys.js +6 -7
  10. package/build/tools/api-keys.js.map +1 -1
  11. package/build/tools/customers.d.ts +1 -1
  12. package/build/tools/customers.d.ts.map +1 -1
  13. package/build/tools/customers.js +243 -56
  14. package/build/tools/customers.js.map +1 -1
  15. package/build/tools/notifications.d.ts +8 -0
  16. package/build/tools/notifications.d.ts.map +1 -0
  17. package/build/tools/notifications.js +125 -0
  18. package/build/tools/notifications.js.map +1 -0
  19. package/build/tools/quotes.d.ts +1 -2
  20. package/build/tools/quotes.d.ts.map +1 -1
  21. package/build/tools/quotes.js +26 -12
  22. package/build/tools/quotes.js.map +1 -1
  23. package/build/tools/transfers.d.ts +1 -2
  24. package/build/tools/transfers.d.ts.map +1 -1
  25. package/build/tools/transfers.js +28 -20
  26. package/build/tools/transfers.js.map +1 -1
  27. package/build/tools/virtual-accounts.d.ts +1 -0
  28. package/build/tools/virtual-accounts.d.ts.map +1 -1
  29. package/build/tools/virtual-accounts.js +162 -13
  30. package/build/tools/virtual-accounts.js.map +1 -1
  31. package/build/tools/webhooks.d.ts +1 -2
  32. package/build/tools/webhooks.d.ts.map +1 -1
  33. package/build/tools/webhooks.js +15 -8
  34. package/build/tools/webhooks.js.map +1 -1
  35. package/package.json +17 -3
@@ -1,55 +1,147 @@
1
1
  /**
2
2
  * Customer Management Tools for Stables MCP Server
3
- * Updated to match official Stables API docs
3
+ * Synced with OpenAPI spec from https://api.sandbox.stables.money/docs
4
4
  */
5
5
  import { z } from "zod";
6
+ import { StablesApiError } from "../lib/stables-client.js";
7
+ function formatError(error) {
8
+ if (error instanceof StablesApiError) {
9
+ return `${error.message} (HTTP ${error.statusCode})`;
10
+ }
11
+ return error instanceof Error ? error.message : "Unknown error";
12
+ }
6
13
  export function registerCustomerTools(server, client) {
7
14
  // Create Customer
8
15
  server.tool("create_customer", "Create a new customer in Stables for KYC verification and transfers. Use 'individual' for personal accounts or 'business' for company accounts. Include entitlements like 'base_payout' to enable transactions.", {
9
- email: z.string().email().describe("Customer's email address"),
16
+ email: z.string().email().optional().describe("Customer's email address"),
10
17
  customerType: z.enum(["individual", "business"]).describe("Type of customer - 'individual' for personal, 'business' for companies"),
18
+ // Individual fields
11
19
  firstName: z.string().optional().describe("First name (required for individuals)"),
12
20
  lastName: z.string().optional().describe("Last name (required for individuals)"),
13
21
  middleName: z.string().optional().describe("Middle name"),
14
- businessName: z.string().optional().describe("Business name (required for businesses)"),
15
- externalCustomerId: z.string().optional().describe("Your own reference ID for this customer"),
16
- phone: z.string().optional().describe("Phone number with country code (e.g., '+14155552671')"),
17
22
  dob: z.string().optional().describe("Date of birth in YYYY-MM-DD format (e.g., '1990-01-15')"),
18
23
  nationality: z.string().optional().describe("Two-letter country code (e.g., 'US', 'GB')"),
19
- entitlements: z.array(z.string()).optional().describe("List of entitlements to request (e.g., ['base_payout'])"),
24
+ // Business fields
25
+ companyName: z.string().optional().describe("Company name (required for businesses)"),
26
+ country: z.string().optional().describe("Country code ISO 3166-1 alpha-2 (required for businesses, e.g., 'US')"),
27
+ registrationNumber: z.string().optional().describe("Business registration number"),
28
+ incorporatedOn: z.string().optional().describe("Date of incorporation in YYYY-MM-DD format"),
29
+ type: z.string().optional().describe("Company type (e.g., 'Private Company Limited by Shares')"),
30
+ taxId: z.string().optional().describe("Tax ID (e.g., '12-3456789')"),
31
+ registrationLocation: z.string().optional().describe("Registration location (e.g., state for USA)"),
32
+ website: z.string().optional().describe("Website URL"),
33
+ describeBusiness: z.string().optional().describe("Description of the business"),
34
+ conductMoneyServices: z.boolean().optional().describe("Whether the company conducts money services"),
35
+ describeMoneyServices: z.string().optional().describe("Describe money services (required if conductMoneyServices is true)"),
36
+ describeComplianceControls: z.string().optional().describe("Description of compliance controls"),
37
+ mainSourceOfFunds: z.enum(["BUSINESS_LOANS", "GRANTS", "INTER_COMPANY_FUNDS", "INVESTMENT_PROCEEDS", "LEGAL_SETTLEMENT", "OWNERS_CAPITAL", "PENSION_RETIREMENT", "SALE_OF_ASSETS", "SALES_OF_GOODS_AND_SERVICES", "THIRD_PARTY_FUNDS", "TREASURY_RESERVES"]).optional().describe("Main source of funds"),
38
+ accountPurpose: z.enum(["CHARITABLE_DONATIONS", "ECOMMERCE_RETAIL_PAYMENTS", "INVESTMENT_PURPOSES", "PAYMENTS_TO_FRIENDS_OR_FAMILY_ABROAD", "PAYROLL", "PERSONAL_OR_LIVING_EXPENSES", "PROTECT_WEALTH", "PURCHASE_GOODS_AND_SERVICES", "RECEIVE_PAYMENTS_FOR_GOODS_AND_SERVICES", "TAX_OPTIMIZATION", "THIRD_PARTY_MONEY_TRANSMISSION", "TREASURY_MANAGEMENT", "OTHER"]).optional().describe("What will you use Stables for?"),
39
+ accountPurposeOther: z.string().optional().describe("Explain purpose (required if accountPurpose is OTHER)"),
40
+ isYourBusinessADao: z.boolean().optional().describe("Is your business a DAO?"),
41
+ industrySelection: z.string().optional().describe("NAICS industry code (e.g., '5415')"),
42
+ expectedAnnualRevenue: z.enum(["0_99999", "100000_999999", "1000000_9999999", "10000000_49999999", "50000000_249999999", "250000000_plus"]).optional().describe("Estimated annual revenue in USD"),
43
+ expectedMonthlyPayments: z.string().optional().describe("Expected monthly payments in USD"),
44
+ sourceOfFunds: z.enum(["BUSINESS_LOANS", "GRANTS", "INTER_COMPANY_FUNDS", "INVESTMENT_PROCEEDS", "LEGAL_SETTLEMENT", "OWNERS_CAPITAL", "PENSION_RETIREMENT", "SALE_OF_ASSETS", "SALES_OF_GOODS_AND_SERVICES", "THIRD_PARTY_FUNDS", "TREASURY_RESERVES"]).optional().describe("Source of funds"),
45
+ sourceOfFundsDescription: z.string().optional().describe("Describe where your business funds come from"),
46
+ operateInProhibitedCountry: z.boolean().optional().describe("Does your business operate in any prohibited countries?"),
47
+ doesYourBusinessEngageInHighRiskActivities: z.enum(["yes", "no"]).optional().describe("Does your business engage in high risk activities?"),
48
+ acceptTerms: z.boolean().optional().describe("Accept Stables' terms of service and privacy policy"),
49
+ howDidYouComeAcrossStables: z.string().optional().describe("How did you come across Stables?"),
50
+ // Shared fields
51
+ externalCustomerId: z.string().optional().describe("Your own reference ID for this customer"),
52
+ phone: z.string().optional().describe("Phone number with country code (e.g., '+14155552671')"),
53
+ entitlements: z.array(z.enum(["base_payout", "virtual_account"])).optional().describe("List of entitlements to request"),
54
+ // Address fields (for individuals)
20
55
  addressLine1: z.string().optional().describe("Street address line 1"),
21
56
  addressLine2: z.string().optional().describe("Street address line 2"),
22
57
  addressCity: z.string().optional().describe("City"),
23
58
  addressState: z.string().optional().describe("State or region"),
24
59
  addressPostalCode: z.string().optional().describe("Postal/ZIP code"),
25
60
  addressCountry: z.string().optional().describe("Two-letter country code (e.g., 'US')"),
26
- }, async ({ email, customerType, firstName, lastName, middleName, businessName, externalCustomerId, phone, dob, nationality, entitlements, addressLine1, addressLine2, addressCity, addressState, addressPostalCode, addressCountry }) => {
61
+ // Legal address fields (for businesses)
62
+ legalAddressLine1: z.string().optional().describe("Legal address line 1 (for businesses)"),
63
+ legalAddressLine2: z.string().optional().describe("Legal address line 2 (for businesses)"),
64
+ legalAddressCity: z.string().optional().describe("Legal address city (for businesses)"),
65
+ legalAddressState: z.string().optional().describe("Legal address state (for businesses)"),
66
+ legalAddressPostalCode: z.string().optional().describe("Legal address postal code (for businesses)"),
67
+ legalAddressCountry: z.string().optional().describe("Legal address country code (for businesses)"),
68
+ }, async (params) => {
27
69
  try {
28
- const address = addressLine1 ? {
29
- line1: addressLine1,
30
- line2: addressLine2,
31
- city: addressCity || "",
32
- state: addressState,
33
- postalCode: addressPostalCode,
34
- country: addressCountry || "",
70
+ const isBusiness = params.customerType === "business";
71
+ // Build address for individuals
72
+ const address = (!isBusiness && params.addressLine1) ? {
73
+ line1: params.addressLine1,
74
+ line2: params.addressLine2,
75
+ city: params.addressCity || "",
76
+ state: params.addressState,
77
+ postalCode: params.addressPostalCode,
78
+ country: params.addressCountry || "",
35
79
  } : undefined;
36
- const customer = await client.createCustomer({
37
- email,
38
- customerType: customerType === "individual"
39
- ? "CUSTOMER_TYPE_INDIVIDUAL"
40
- : "CUSTOMER_TYPE_BUSINESS",
41
- firstName,
42
- lastName,
43
- middleName,
44
- businessName,
45
- externalCustomerId: externalCustomerId || crypto.randomUUID(),
46
- phone,
47
- dob,
48
- nationality,
49
- entitlements,
50
- address,
51
- });
80
+ // Build legal address for businesses
81
+ const legalAddress = (isBusiness && params.legalAddressLine1) ? {
82
+ line1: params.legalAddressLine1,
83
+ line2: params.legalAddressLine2,
84
+ city: params.legalAddressCity || "",
85
+ state: params.legalAddressState,
86
+ postalCode: params.legalAddressPostalCode,
87
+ country: params.legalAddressCountry || "",
88
+ } : undefined;
89
+ // Build request body based on customer type
90
+ const requestBody = {
91
+ email: params.email,
92
+ customerType: isBusiness ? "CUSTOMER_TYPE_BUSINESS" : "CUSTOMER_TYPE_INDIVIDUAL",
93
+ externalCustomerId: params.externalCustomerId || crypto.randomUUID(),
94
+ phone: params.phone,
95
+ entitlements: params.entitlements,
96
+ };
97
+ if (isBusiness) {
98
+ Object.assign(requestBody, {
99
+ companyName: params.companyName,
100
+ country: params.country,
101
+ registrationNumber: params.registrationNumber,
102
+ incorporatedOn: params.incorporatedOn,
103
+ type: params.type,
104
+ taxId: params.taxId,
105
+ registrationLocation: params.registrationLocation,
106
+ website: params.website,
107
+ legalAddress,
108
+ describeBusiness: params.describeBusiness,
109
+ conductMoneyServices: params.conductMoneyServices,
110
+ describeMoneyServices: params.describeMoneyServices,
111
+ describeComplianceControls: params.describeComplianceControls,
112
+ mainSourceOfFunds: params.mainSourceOfFunds,
113
+ accountPurpose: params.accountPurpose,
114
+ accountPurposeOther: params.accountPurposeOther,
115
+ isYourBusinessADao: params.isYourBusinessADao,
116
+ industrySelection: params.industrySelection,
117
+ expectedAnnualRevenue: params.expectedAnnualRevenue,
118
+ expectedMonthlyPayments: params.expectedMonthlyPayments,
119
+ sourceOfFunds: params.sourceOfFunds,
120
+ sourceOfFundsDescription: params.sourceOfFundsDescription,
121
+ operateInProhibitedCountry: params.operateInProhibitedCountry,
122
+ doesYourBusinessEngageInHighRiskActivities: params.doesYourBusinessEngageInHighRiskActivities,
123
+ acceptTerms: params.acceptTerms,
124
+ howDidYouComeAcrossStables: params.howDidYouComeAcrossStables,
125
+ });
126
+ }
127
+ else {
128
+ Object.assign(requestBody, {
129
+ firstName: params.firstName,
130
+ lastName: params.lastName,
131
+ middleName: params.middleName,
132
+ dob: params.dob,
133
+ nationality: params.nationality,
134
+ address,
135
+ });
136
+ }
137
+ // Remove undefined values
138
+ for (const key of Object.keys(requestBody)) {
139
+ if (requestBody[key] === undefined)
140
+ delete requestBody[key];
141
+ }
142
+ const customer = await client.createCustomer(requestBody);
52
143
  const verificationStatus = customer.verificationLevels?.[0]?.status || "NOT_STARTED";
144
+ const entitlementsList = customer.entitlements?.map(e => `${e.name}: ${e.status}`).join(", ") || "None";
53
145
  return {
54
146
  content: [
55
147
  {
@@ -58,12 +150,12 @@ export function registerCustomerTools(server, client) {
58
150
 
59
151
  Customer ID: ${customer.customerId}
60
152
  Email: ${customer.email}
61
- Type: ${customerType}
62
- ${firstName ? `Name: ${firstName}${middleName ? ` ${middleName}` : ""} ${lastName || ""}` : ""}
63
- ${businessName ? `Business: ${businessName}` : ""}
64
- ${phone ? `Phone: ${phone}` : ""}
65
- ${nationality ? `Nationality: ${nationality}` : ""}
66
- ${entitlements?.length ? `Entitlements: ${entitlements.join(", ")}` : ""}
153
+ Type: ${params.customerType}
154
+ ${params.firstName ? `Name: ${params.firstName}${params.middleName ? ` ${params.middleName}` : ""} ${params.lastName || ""}` : ""}
155
+ ${params.companyName ? `Company: ${params.companyName}` : ""}
156
+ ${params.phone ? `Phone: ${params.phone}` : ""}
157
+ ${params.nationality ? `Nationality: ${params.nationality}` : ""}
158
+ Entitlements: ${entitlementsList}
67
159
  Verification Status: ${verificationStatus}
68
160
  Created: ${customer.createdAt}
69
161
 
@@ -77,7 +169,7 @@ Next step: Use 'get_verification_link' to get a KYC verification link for this c
77
169
  content: [
78
170
  {
79
171
  type: "text",
80
- text: `Failed to create customer: ${error instanceof Error ? error.message : "Unknown error"}`,
172
+ text: `Failed to create customer: ${formatError(error)}`,
81
173
  },
82
174
  ],
83
175
  isError: true,
@@ -92,6 +184,7 @@ Next step: Use 'get_verification_link' to get a KYC verification link for this c
92
184
  const customer = await client.getCustomer(customerId);
93
185
  const verificationStatus = customer.verificationLevels?.[0]?.status || "NOT_STARTED";
94
186
  const isVerified = verificationStatus === "VERIFICATION_APPROVED";
187
+ const entitlementsList = customer.entitlements?.map(e => `${e.name}: ${e.status}`).join(", ") || "None";
95
188
  return {
96
189
  content: [
97
190
  {
@@ -101,11 +194,10 @@ Next step: Use 'get_verification_link' to get a KYC verification link for this c
101
194
  Customer ID: ${customer.customerId}
102
195
  Email: ${customer.email || "Not set"}
103
196
  Type: ${customer.customerType}
104
- ${customer.firstName ? `Name: ${customer.firstName}${customer.middleName ? ` ${customer.middleName}` : ""} ${customer.lastName || ""}` : ""}
105
- ${customer.businessName ? `Business: ${customer.businessName}` : ""}
197
+ ${customer.firstName ? `Name: ${customer.firstName} ${customer.lastName || ""}` : ""}
198
+ ${customer.companyName ? `Company: ${customer.companyName}` : ""}
106
199
  ${customer.phone ? `Phone: ${customer.phone}` : ""}
107
- ${customer.nationality ? `Nationality: ${customer.nationality}` : ""}
108
- ${customer.dob ? `Date of Birth: ${customer.dob}` : ""}
200
+ Entitlements: ${entitlementsList}
109
201
  Verification Status: ${verificationStatus}
110
202
  Can Transfer: ${isVerified ? "Yes" : "No - needs KYC verification"}
111
203
  Created: ${customer.createdAt}
@@ -119,7 +211,7 @@ Updated: ${customer.updatedAt}`,
119
211
  content: [
120
212
  {
121
213
  type: "text",
122
- text: `Failed to get customer: ${error instanceof Error ? error.message : "Unknown error"}`,
214
+ text: `Failed to get customer: ${formatError(error)}`,
123
215
  },
124
216
  ],
125
217
  isError: true,
@@ -127,12 +219,9 @@ Updated: ${customer.updatedAt}`,
127
219
  }
128
220
  });
129
221
  // List Customers
130
- server.tool("list_customers", "List all customers with optional pagination", {
131
- pageSize: z.number().optional().describe("Number of customers per page (default: 20)"),
132
- pageToken: z.string().optional().describe("Token for the next page of results"),
133
- }, async ({ pageSize, pageToken }) => {
222
+ server.tool("list_customers", "List all customers for the authenticated tenant", {}, async () => {
134
223
  try {
135
- const response = await client.listCustomers({ pageSize, pageToken });
224
+ const response = await client.listCustomers();
136
225
  if (response.customers.length === 0) {
137
226
  return {
138
227
  content: [
@@ -151,10 +240,9 @@ Updated: ${customer.updatedAt}`,
151
240
  content: [
152
241
  {
153
242
  type: "text",
154
- text: `Customers (${response.customers.length} of ${response.page.total}):
243
+ text: `Customers (${response.customers.length}):
155
244
 
156
- ${customerList}
157
- ${response.page.nextPageToken ? `\nMore results available. Use pageToken: "${response.page.nextPageToken}"` : ""}`,
245
+ ${customerList}`,
158
246
  },
159
247
  ],
160
248
  };
@@ -164,7 +252,7 @@ ${response.page.nextPageToken ? `\nMore results available. Use pageToken: "${res
164
252
  content: [
165
253
  {
166
254
  type: "text",
167
- text: `Failed to list customers: ${error instanceof Error ? error.message : "Unknown error"}`,
255
+ text: `Failed to list customers: ${formatError(error)}`,
168
256
  },
169
257
  ],
170
258
  isError: true,
@@ -174,12 +262,20 @@ ${response.page.nextPageToken ? `\nMore results available. Use pageToken: "${res
174
262
  // Get Verification Link
175
263
  server.tool("get_verification_link", "Generate a KYC verification link for a customer. The customer must complete verification before they can make transfers.", {
176
264
  customerId: z.string().describe("The customer ID to generate verification link for"),
177
- verificationType: z.enum(["KYC", "KYB"]).optional().describe("Type of verification - KYC for individuals, KYB for businesses"),
178
- }, async ({ customerId, verificationType }) => {
265
+ ttlInSecs: z.number().optional().describe("Time-to-live for the KYC link in seconds (default: 1800)"),
266
+ successUrl: z.string().optional().describe("URL to redirect to after successful verification"),
267
+ rejectUrl: z.string().optional().describe("URL to redirect to after rejected verification"),
268
+ }, async ({ customerId, ttlInSecs, successUrl, rejectUrl }) => {
179
269
  try {
270
+ const redirect = (successUrl || rejectUrl) ? {
271
+ successUrl,
272
+ rejectUrl,
273
+ } : undefined;
180
274
  const result = await client.generateVerificationLink(customerId, {
181
- verificationType,
275
+ ttlInSecs,
276
+ redirect,
182
277
  });
278
+ const ttlDisplay = ttlInSecs ? `${Math.floor(ttlInSecs / 60)} minutes` : "30 minutes (default)";
183
279
  return {
184
280
  content: [
185
281
  {
@@ -189,7 +285,98 @@ ${response.page.nextPageToken ? `\nMore results available. Use pageToken: "${res
189
285
  Customer ID: ${result.customerId}
190
286
  Verification Link: ${result.kycLink}
191
287
 
192
- Share this link with the customer to complete their identity verification. The link will expire in 24 hours.`,
288
+ The link will expire in ${ttlDisplay}.
289
+ Share this link with the customer to complete their identity verification.`,
290
+ },
291
+ ],
292
+ };
293
+ }
294
+ catch (error) {
295
+ return {
296
+ content: [
297
+ {
298
+ type: "text",
299
+ text: `Failed to generate verification link: ${formatError(error)}`,
300
+ },
301
+ ],
302
+ isError: true,
303
+ };
304
+ }
305
+ });
306
+ // Update Customer
307
+ server.tool("update_customer", "Update customer details, entitlements, or verification information", {
308
+ customerId: z.string().describe("The customer ID to update"),
309
+ email: z.string().optional().describe("Updated email address"),
310
+ phone: z.string().optional().describe("Updated phone number"),
311
+ firstName: z.string().optional().describe("Updated first name"),
312
+ lastName: z.string().optional().describe("Updated last name"),
313
+ middleName: z.string().optional().describe("Updated middle name"),
314
+ dob: z.string().optional().describe("Updated date of birth (YYYY-MM-DD)"),
315
+ nationality: z.string().optional().describe("Updated nationality (two-letter country code)"),
316
+ companyName: z.string().optional().describe("Updated company name (for businesses)"),
317
+ entitlements: z.array(z.enum(["base_payout", "virtual_account"])).optional().describe("Updated entitlements"),
318
+ }, async ({ customerId, email, phone, firstName, lastName, middleName, dob, nationality, companyName, entitlements }) => {
319
+ try {
320
+ const updates = {};
321
+ if (email)
322
+ updates.email = email;
323
+ if (phone)
324
+ updates.phone = phone;
325
+ if (firstName)
326
+ updates.firstName = firstName;
327
+ if (lastName)
328
+ updates.lastName = lastName;
329
+ if (middleName)
330
+ updates.middleName = middleName;
331
+ if (dob)
332
+ updates.dob = dob;
333
+ if (nationality)
334
+ updates.nationality = nationality;
335
+ if (companyName)
336
+ updates.companyName = companyName;
337
+ if (entitlements)
338
+ updates.entitlements = entitlements;
339
+ const customer = await client.updateCustomer(customerId, updates);
340
+ return {
341
+ content: [
342
+ {
343
+ type: "text",
344
+ text: `Customer ${customer.customerId} updated successfully.
345
+
346
+ Email: ${customer.email}
347
+ ${customer.firstName ? `Name: ${customer.firstName} ${customer.lastName || ""}` : ""}
348
+ ${customer.companyName ? `Company: ${customer.companyName}` : ""}
349
+ Updated: ${customer.updatedAt}`,
350
+ },
351
+ ],
352
+ };
353
+ }
354
+ catch (error) {
355
+ return {
356
+ content: [
357
+ {
358
+ type: "text",
359
+ text: `Failed to update customer: ${formatError(error)}`,
360
+ },
361
+ ],
362
+ isError: true,
363
+ };
364
+ }
365
+ });
366
+ // Update Metadata
367
+ server.tool("update_customer_metadata", "Update customer metadata key-value pairs", {
368
+ customerId: z.string().describe("The customer ID to update metadata for"),
369
+ metadata: z.record(z.string()).describe("Metadata key-value pairs to set"),
370
+ }, async ({ customerId, metadata }) => {
371
+ try {
372
+ await client.updateMetadata(customerId, metadata);
373
+ return {
374
+ content: [
375
+ {
376
+ type: "text",
377
+ text: `Metadata updated for customer ${customerId}.
378
+
379
+ Keys set: ${Object.keys(metadata).join(", ")}`,
193
380
  },
194
381
  ],
195
382
  };
@@ -199,7 +386,7 @@ Share this link with the customer to complete their identity verification. The l
199
386
  content: [
200
387
  {
201
388
  type: "text",
202
- text: `Failed to generate verification link: ${error instanceof Error ? error.message : "Unknown error"}`,
389
+ text: `Failed to update metadata: ${formatError(error)}`,
203
390
  },
204
391
  ],
205
392
  isError: true,
@@ -1 +1 @@
1
- {"version":3,"file":"customers.js","sourceRoot":"","sources":["../../src/tools/customers.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"customers.js","sourceRoot":"","sources":["../../src/tools/customers.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Notification Tools for Stables MCP Server
3
+ * Sends verification SMS to customers via Twilio
4
+ */
5
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
6
+ import { StablesApiClient } from "../lib/stables-client.js";
7
+ export declare function registerNotificationTools(server: McpServer, client: StablesApiClient): void;
8
+ //# sourceMappingURL=notifications.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"notifications.d.ts","sourceRoot":"","sources":["../../src/tools/notifications.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAEpE,OAAO,EAAE,gBAAgB,EAAmB,MAAM,0BAA0B,CAAC;AAS7E,wBAAgB,yBAAyB,CACvC,MAAM,EAAE,SAAS,EACjB,MAAM,EAAE,gBAAgB,QAqJzB"}
@@ -0,0 +1,125 @@
1
+ import { z } from "zod";
2
+ import { StablesApiError } from "../lib/stables-client.js";
3
+ function formatError(error) {
4
+ if (error instanceof StablesApiError) {
5
+ return `${error.message} (HTTP ${error.statusCode})`;
6
+ }
7
+ return error instanceof Error ? error.message : "Unknown error";
8
+ }
9
+ export function registerNotificationTools(server, client) {
10
+ server.tool("send_verification_sms", "Send a KYC verification link to a customer via SMS. Automatically fetches the customer's phone number and generates a fresh verification link. Requires TWILIO_ACCOUNT_SID, TWILIO_AUTH_TOKEN, and TWILIO_PHONE_NUMBER environment variables.", {
11
+ customerId: z
12
+ .string()
13
+ .describe("The customer ID to send the verification SMS to"),
14
+ phone: z
15
+ .string()
16
+ .optional()
17
+ .describe("Override phone number (with country code, e.g., '+14155552671'). If not provided, uses the customer's phone on file."),
18
+ botName: z
19
+ .string()
20
+ .optional()
21
+ .describe("Name of the bot/assistant sending the message (default: 'your assistant')"),
22
+ verificationLinkTtlSecs: z
23
+ .number()
24
+ .optional()
25
+ .describe("TTL for the verification link in seconds (default: 1800)"),
26
+ }, async ({ customerId, phone, botName, verificationLinkTtlSecs }) => {
27
+ try {
28
+ // 1. Validate Twilio environment variables
29
+ const twilioAccountSid = process.env.TWILIO_ACCOUNT_SID;
30
+ const twilioAuthToken = process.env.TWILIO_AUTH_TOKEN;
31
+ const twilioPhoneNumber = process.env.TWILIO_PHONE_NUMBER;
32
+ if (!twilioAccountSid || !twilioAuthToken || !twilioPhoneNumber) {
33
+ return {
34
+ content: [
35
+ {
36
+ type: "text",
37
+ text: "Missing Twilio configuration. Please set TWILIO_ACCOUNT_SID, TWILIO_AUTH_TOKEN, and TWILIO_PHONE_NUMBER environment variables.",
38
+ },
39
+ ],
40
+ isError: true,
41
+ };
42
+ }
43
+ // 2. Fetch customer details to get phone and name
44
+ const customer = await client.getCustomer(customerId);
45
+ const recipientPhone = phone || customer.phone;
46
+ if (!recipientPhone) {
47
+ return {
48
+ content: [
49
+ {
50
+ type: "text",
51
+ text: `Customer ${customerId} has no phone number on file. Please provide a phone number via the 'phone' parameter or update the customer's phone first using 'update_customer'.`,
52
+ },
53
+ ],
54
+ isError: true,
55
+ };
56
+ }
57
+ const customerName = customer.firstName || "there";
58
+ const assistantName = botName || "your assistant";
59
+ // 3. Generate a fresh verification link
60
+ const verificationResult = await client.generateVerificationLink(customerId, { ttlInSecs: verificationLinkTtlSecs });
61
+ const verificationLink = verificationResult.kycLink;
62
+ // 4. Compose the SMS message
63
+ const messageBody = `Hi ${customerName}, I'm ${assistantName}. Please complete verification to give me access to global commerce payment rails: ${verificationLink}`;
64
+ // 5. Send SMS via Twilio REST API (using native fetch, no SDK needed)
65
+ const twilioUrl = `https://api.twilio.com/2010-04-01/Accounts/${twilioAccountSid}/Messages.json`;
66
+ const authHeader = "Basic " +
67
+ Buffer.from(`${twilioAccountSid}:${twilioAuthToken}`).toString("base64");
68
+ const formBody = new URLSearchParams({
69
+ To: recipientPhone,
70
+ From: twilioPhoneNumber,
71
+ Body: messageBody,
72
+ });
73
+ const twilioResponse = await fetch(twilioUrl, {
74
+ method: "POST",
75
+ headers: {
76
+ Authorization: authHeader,
77
+ "Content-Type": "application/x-www-form-urlencoded",
78
+ },
79
+ body: formBody.toString(),
80
+ });
81
+ if (!twilioResponse.ok) {
82
+ const errorData = await twilioResponse
83
+ .json()
84
+ .catch(() => null);
85
+ const errorMsg = errorData?.message ||
86
+ `HTTP ${twilioResponse.status}: ${twilioResponse.statusText}`;
87
+ throw new Error(`Twilio API error: ${errorMsg}`);
88
+ }
89
+ const smsResult = (await twilioResponse.json());
90
+ // 6. Return success
91
+ const ttlDisplay = verificationLinkTtlSecs
92
+ ? `${Math.floor(verificationLinkTtlSecs / 60)} minutes`
93
+ : "30 minutes (default)";
94
+ return {
95
+ content: [
96
+ {
97
+ type: "text",
98
+ text: `Verification SMS sent successfully!
99
+
100
+ Customer ID: ${customerId}
101
+ Customer Name: ${customerName}
102
+ Sent To: ${recipientPhone}
103
+ Twilio Message SID: ${smsResult.sid}
104
+ Status: ${smsResult.status}
105
+
106
+ Verification link expires in ${ttlDisplay}.
107
+ The customer will receive an SMS with a link to complete KYC verification.`,
108
+ },
109
+ ],
110
+ };
111
+ }
112
+ catch (error) {
113
+ return {
114
+ content: [
115
+ {
116
+ type: "text",
117
+ text: `Failed to send verification SMS: ${formatError(error)}`,
118
+ },
119
+ ],
120
+ isError: true,
121
+ };
122
+ }
123
+ });
124
+ }
125
+ //# sourceMappingURL=notifications.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"notifications.js","sourceRoot":"","sources":["../../src/tools/notifications.ts"],"names":[],"mappings":"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"}
@@ -1,7 +1,6 @@
1
1
  /**
2
2
  * Quote Tools for Stables MCP Server
3
- * Updated to match official Stables API docs
4
- * Supports paymentMethodType (SWIFT, LOCAL) for fiat payouts
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":"quotes.d.ts","sourceRoot":"","sources":["../../src/tools/quotes.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAEpE,OAAO,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAE5D,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,gBAAgB,QAmI7E"}
1
+ {"version":3,"file":"quotes.d.ts","sourceRoot":"","sources":["../../src/tools/quotes.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAEpE,OAAO,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAE5D,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,gBAAgB,QA6I7E"}