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.
- package/README.md +221 -36
- package/build/index.js +5 -1
- package/build/index.js.map +1 -1
- package/build/lib/stables-client.d.ts +200 -102
- package/build/lib/stables-client.d.ts.map +1 -1
- package/build/lib/stables-client.js +176 -52
- 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 +243 -56
- package/build/tools/customers.js.map +1 -1
- package/build/tools/notifications.d.ts +8 -0
- package/build/tools/notifications.d.ts.map +1 -0
- package/build/tools/notifications.js +125 -0
- package/build/tools/notifications.js.map +1 -0
- package/build/tools/quotes.d.ts +1 -2
- package/build/tools/quotes.d.ts.map +1 -1
- package/build/tools/quotes.js +26 -12
- 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 +28 -20
- 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 +162 -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 +17 -3
package/build/tools/customers.js
CHANGED
|
@@ -1,55 +1,147 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Customer Management Tools for Stables MCP Server
|
|
3
|
-
*
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
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
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
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
|
-
${
|
|
64
|
-
${phone ? `Phone: ${phone}` : ""}
|
|
65
|
-
${nationality ? `Nationality: ${nationality}` : ""}
|
|
66
|
-
|
|
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
|
|
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}
|
|
105
|
-
${customer.
|
|
197
|
+
${customer.firstName ? `Name: ${customer.firstName} ${customer.lastName || ""}` : ""}
|
|
198
|
+
${customer.companyName ? `Company: ${customer.companyName}` : ""}
|
|
106
199
|
${customer.phone ? `Phone: ${customer.phone}` : ""}
|
|
107
|
-
|
|
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
|
|
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
|
|
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(
|
|
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}
|
|
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
|
|
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
|
-
|
|
178
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
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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"}
|
package/build/tools/quotes.d.ts
CHANGED
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Quote Tools for Stables MCP Server
|
|
3
|
-
*
|
|
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
|
|
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"}
|