@armor/zuora-mcp 1.0.1
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/.env.example +16 -0
- package/README.md +246 -0
- package/dist/config.d.ts +26 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +56 -0
- package/dist/config.js.map +1 -0
- package/dist/index.d.ts +22 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +146 -0
- package/dist/index.js.map +1 -0
- package/dist/token-manager.d.ts +34 -0
- package/dist/token-manager.d.ts.map +1 -0
- package/dist/token-manager.js +103 -0
- package/dist/token-manager.js.map +1 -0
- package/dist/tools.d.ts +734 -0
- package/dist/tools.d.ts.map +1 -0
- package/dist/tools.js +1336 -0
- package/dist/tools.js.map +1 -0
- package/dist/types.d.ts +448 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +5 -0
- package/dist/types.js.map +1 -0
- package/dist/zuora-client.d.ts +119 -0
- package/dist/zuora-client.d.ts.map +1 -0
- package/dist/zuora-client.js +405 -0
- package/dist/zuora-client.js.map +1 -0
- package/package.json +59 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"zuora-client.d.ts","sourceRoot":"","sources":["../src/zuora-client.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,405 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Zuora REST API Client
|
|
3
|
+
* Direct REST calls via native fetch - no third-party HTTP dependencies
|
|
4
|
+
* Security-first: Input validation, rate limiting awareness, token lifecycle
|
|
5
|
+
*/
|
|
6
|
+
import { TokenManager } from "./token-manager.js";
|
|
7
|
+
// Fields that must NEVER appear in debug logs (payment credentials + PII)
|
|
8
|
+
const SENSITIVE_FIELD_PATTERNS = [
|
|
9
|
+
"creditcard",
|
|
10
|
+
"bankaccount",
|
|
11
|
+
"cardnumber",
|
|
12
|
+
"securitycode",
|
|
13
|
+
"routingnumber",
|
|
14
|
+
"iban",
|
|
15
|
+
"authorization",
|
|
16
|
+
"password",
|
|
17
|
+
"secret",
|
|
18
|
+
"accesstoken",
|
|
19
|
+
"refreshtoken",
|
|
20
|
+
"access_token",
|
|
21
|
+
"client_secret",
|
|
22
|
+
"jti",
|
|
23
|
+
"gatewayresponse",
|
|
24
|
+
"workemail",
|
|
25
|
+
"email",
|
|
26
|
+
"firstname",
|
|
27
|
+
"lastname",
|
|
28
|
+
"address1",
|
|
29
|
+
"postalcode",
|
|
30
|
+
"phone",
|
|
31
|
+
"fax",
|
|
32
|
+
"taxid",
|
|
33
|
+
"vatid",
|
|
34
|
+
];
|
|
35
|
+
export class ZuoraClient {
|
|
36
|
+
static DEFAULT_REQUEST_TIMEOUT_MS = 20_000;
|
|
37
|
+
static MAX_ATTEMPTS = 3;
|
|
38
|
+
static RETRYABLE_STATUS_CODES = new Set([
|
|
39
|
+
429, 502, 503, 504,
|
|
40
|
+
]);
|
|
41
|
+
static IDEMPOTENT_METHODS = new Set([
|
|
42
|
+
"GET",
|
|
43
|
+
"HEAD",
|
|
44
|
+
"OPTIONS",
|
|
45
|
+
"PUT",
|
|
46
|
+
"DELETE",
|
|
47
|
+
]);
|
|
48
|
+
baseUrl;
|
|
49
|
+
tokenManager;
|
|
50
|
+
debug;
|
|
51
|
+
constructor(config) {
|
|
52
|
+
this.baseUrl = `${config.zuoraBaseUrl}/v1`;
|
|
53
|
+
this.tokenManager = new TokenManager(config);
|
|
54
|
+
this.debug = config.debug;
|
|
55
|
+
}
|
|
56
|
+
log(message, data) {
|
|
57
|
+
if (!this.debug)
|
|
58
|
+
return;
|
|
59
|
+
const sanitized = data !== undefined ? this.sanitizeForLog(data) : "";
|
|
60
|
+
console.error(`[ZuoraClient] ${message}`, sanitized);
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Strip sensitive fields from data before logging.
|
|
64
|
+
* Prevents PII and payment data from appearing in stderr/logs.
|
|
65
|
+
* Recurses into nested objects and arrays.
|
|
66
|
+
*/
|
|
67
|
+
sanitizeForLog(data) {
|
|
68
|
+
if (data === null || data === undefined)
|
|
69
|
+
return data;
|
|
70
|
+
if (typeof data !== "object")
|
|
71
|
+
return data;
|
|
72
|
+
if (Array.isArray(data)) {
|
|
73
|
+
return data.map((item) => this.sanitizeForLog(item));
|
|
74
|
+
}
|
|
75
|
+
const sanitized = {};
|
|
76
|
+
for (const [key, value] of Object.entries(data)) {
|
|
77
|
+
const isSensitive = SENSITIVE_FIELD_PATTERNS.some((pattern) => key.toLowerCase().includes(pattern));
|
|
78
|
+
sanitized[key] = isSensitive
|
|
79
|
+
? "[REDACTED]"
|
|
80
|
+
: this.sanitizeForLog(value);
|
|
81
|
+
}
|
|
82
|
+
return sanitized;
|
|
83
|
+
}
|
|
84
|
+
isIdempotentMethod(method) {
|
|
85
|
+
return ZuoraClient.IDEMPOTENT_METHODS.has(method);
|
|
86
|
+
}
|
|
87
|
+
async sleep(ms) {
|
|
88
|
+
await new Promise((resolve) => setTimeout(resolve, ms));
|
|
89
|
+
}
|
|
90
|
+
parseRetryAfterMs(response) {
|
|
91
|
+
const retryAfter = response.headers.get("retry-after");
|
|
92
|
+
if (!retryAfter)
|
|
93
|
+
return null;
|
|
94
|
+
const seconds = Number(retryAfter);
|
|
95
|
+
if (Number.isFinite(seconds)) {
|
|
96
|
+
return Math.max(0, Math.round(seconds * 1000));
|
|
97
|
+
}
|
|
98
|
+
const dateMs = Date.parse(retryAfter);
|
|
99
|
+
if (Number.isNaN(dateMs))
|
|
100
|
+
return null;
|
|
101
|
+
return Math.max(0, dateMs - Date.now());
|
|
102
|
+
}
|
|
103
|
+
getRetryDelayMs(attempt, response) {
|
|
104
|
+
const retryAfterMs = response ? this.parseRetryAfterMs(response) : null;
|
|
105
|
+
if (retryAfterMs !== null) {
|
|
106
|
+
return Math.min(retryAfterMs, 30_000);
|
|
107
|
+
}
|
|
108
|
+
const exponential = Math.min(5_000, 250 * 2 ** (attempt - 1));
|
|
109
|
+
const jitter = Math.floor(Math.random() * 150);
|
|
110
|
+
return exponential + jitter;
|
|
111
|
+
}
|
|
112
|
+
async fetchWithResilience(method, url, init) {
|
|
113
|
+
const normalizedMethod = method.toUpperCase();
|
|
114
|
+
const isIdempotent = this.isIdempotentMethod(normalizedMethod);
|
|
115
|
+
const canRetryByStatus = isIdempotent;
|
|
116
|
+
const timeoutMs = init.timeoutMs ?? ZuoraClient.DEFAULT_REQUEST_TIMEOUT_MS;
|
|
117
|
+
for (let attempt = 1; attempt <= ZuoraClient.MAX_ATTEMPTS; attempt++) {
|
|
118
|
+
const controller = new AbortController();
|
|
119
|
+
const timeoutId = setTimeout(() => controller.abort(), timeoutMs);
|
|
120
|
+
try {
|
|
121
|
+
const response = await fetch(url, {
|
|
122
|
+
method: normalizedMethod,
|
|
123
|
+
headers: init.headers,
|
|
124
|
+
body: init.body,
|
|
125
|
+
signal: controller.signal,
|
|
126
|
+
});
|
|
127
|
+
if (attempt < ZuoraClient.MAX_ATTEMPTS &&
|
|
128
|
+
canRetryByStatus &&
|
|
129
|
+
ZuoraClient.RETRYABLE_STATUS_CODES.has(response.status)) {
|
|
130
|
+
const delayMs = this.getRetryDelayMs(attempt, response);
|
|
131
|
+
this.log(`Retrying ${normalizedMethod} ${url} after status ${response.status} ` +
|
|
132
|
+
`(attempt ${attempt + 1}/${ZuoraClient.MAX_ATTEMPTS}) in ${delayMs}ms`);
|
|
133
|
+
await this.sleep(delayMs);
|
|
134
|
+
continue;
|
|
135
|
+
}
|
|
136
|
+
return response;
|
|
137
|
+
}
|
|
138
|
+
catch (error) {
|
|
139
|
+
const isTransportFailure = error instanceof Error &&
|
|
140
|
+
(error.name === "AbortError" || error instanceof TypeError);
|
|
141
|
+
if (isTransportFailure &&
|
|
142
|
+
isIdempotent &&
|
|
143
|
+
attempt < ZuoraClient.MAX_ATTEMPTS) {
|
|
144
|
+
const delayMs = this.getRetryDelayMs(attempt);
|
|
145
|
+
this.log(`Transport failure on ${normalizedMethod} ${url}, ` +
|
|
146
|
+
`retrying (attempt ${attempt + 1}/${ZuoraClient.MAX_ATTEMPTS}) in ${delayMs}ms`);
|
|
147
|
+
await this.sleep(delayMs);
|
|
148
|
+
continue;
|
|
149
|
+
}
|
|
150
|
+
throw error;
|
|
151
|
+
}
|
|
152
|
+
finally {
|
|
153
|
+
clearTimeout(timeoutId);
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
throw new Error("Max retry attempts exceeded");
|
|
157
|
+
}
|
|
158
|
+
/**
|
|
159
|
+
* Core request method. Handles auth, retry, and Zuora-specific response parsing.
|
|
160
|
+
* For idempotent methods, automatically retries once on 401 (token may have
|
|
161
|
+
* expired mid-session). Non-idempotent methods (POST) are NOT retried on 401
|
|
162
|
+
* to prevent duplicate financial operations.
|
|
163
|
+
*/
|
|
164
|
+
async request(method, endpoint, body, extraHeaders) {
|
|
165
|
+
const url = `${this.baseUrl}${endpoint}`;
|
|
166
|
+
const normalizedMethod = method.toUpperCase();
|
|
167
|
+
const token = await this.tokenManager.getAccessToken();
|
|
168
|
+
const headers = {
|
|
169
|
+
...extraHeaders,
|
|
170
|
+
Authorization: `Bearer ${token}`,
|
|
171
|
+
"Content-Type": "application/json",
|
|
172
|
+
Accept: "application/json",
|
|
173
|
+
};
|
|
174
|
+
this.log(`${normalizedMethod} ${endpoint}`, body);
|
|
175
|
+
const response = await this.fetchWithResilience(normalizedMethod, url, {
|
|
176
|
+
headers,
|
|
177
|
+
body: body ? JSON.stringify(body) : undefined,
|
|
178
|
+
});
|
|
179
|
+
// Handle 401 with one token refresh retry (idempotent methods only)
|
|
180
|
+
if (response.status === 401 &&
|
|
181
|
+
this.isIdempotentMethod(normalizedMethod)) {
|
|
182
|
+
this.log("Received 401 on idempotent request, refreshing token and retrying");
|
|
183
|
+
const newToken = await this.tokenManager.forceRefresh();
|
|
184
|
+
headers.Authorization = `Bearer ${newToken}`;
|
|
185
|
+
const retryResponse = await this.fetchWithResilience(normalizedMethod, url, {
|
|
186
|
+
headers,
|
|
187
|
+
body: body ? JSON.stringify(body) : undefined,
|
|
188
|
+
});
|
|
189
|
+
return this.parseResponse(retryResponse, endpoint);
|
|
190
|
+
}
|
|
191
|
+
// For non-idempotent 401s, refresh token for next call but fail this one
|
|
192
|
+
if (response.status === 401) {
|
|
193
|
+
this.log("Received 401 on non-idempotent request, refreshing token for next call");
|
|
194
|
+
void this.tokenManager.forceRefresh();
|
|
195
|
+
}
|
|
196
|
+
return this.parseResponse(response, endpoint);
|
|
197
|
+
}
|
|
198
|
+
/**
|
|
199
|
+
* Parse Zuora API response. Handles Zuora's inconsistent response envelope:
|
|
200
|
+
* - Some endpoints return HTTP errors with JSON body
|
|
201
|
+
* - Some return 200 with { success: false } in body
|
|
202
|
+
*/
|
|
203
|
+
async parseResponse(response, endpoint) {
|
|
204
|
+
const text = await response.text();
|
|
205
|
+
if (!response.ok) {
|
|
206
|
+
let errorMessage = `Zuora API error (${response.status}) on ${endpoint}`;
|
|
207
|
+
try {
|
|
208
|
+
const errorBody = JSON.parse(text);
|
|
209
|
+
if (errorBody.reasons?.length) {
|
|
210
|
+
errorMessage += `: ${errorBody.reasons.map((r) => r.message).join("; ")}`;
|
|
211
|
+
}
|
|
212
|
+
else if (errorBody.message) {
|
|
213
|
+
errorMessage += `: ${errorBody.message}`;
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
catch {
|
|
217
|
+
if (text.length > 0) {
|
|
218
|
+
errorMessage += `: ${text.slice(0, 500)}`;
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
// Scrub any accidentally leaked bearer tokens from error messages
|
|
222
|
+
const sanitized = errorMessage.replace(/Bearer\s+[A-Za-z0-9\-._~+/]+=*/g, "Bearer [REDACTED]");
|
|
223
|
+
throw new Error(sanitized);
|
|
224
|
+
}
|
|
225
|
+
// Handle empty responses (204 No Content, etc.)
|
|
226
|
+
if (!text.trim()) {
|
|
227
|
+
if (response.status === 204) {
|
|
228
|
+
return {};
|
|
229
|
+
}
|
|
230
|
+
throw new Error(`Zuora API returned empty body for ${endpoint} (status ${response.status})`);
|
|
231
|
+
}
|
|
232
|
+
const data = JSON.parse(text);
|
|
233
|
+
// Zuora sometimes returns 200 with success: false
|
|
234
|
+
if (data.success === false) {
|
|
235
|
+
const reasons = data.reasons;
|
|
236
|
+
const message = reasons?.map((r) => r.message).join("; ") ?? "Unknown error";
|
|
237
|
+
throw new Error(`Zuora operation failed on ${endpoint}: ${message}`);
|
|
238
|
+
}
|
|
239
|
+
return data;
|
|
240
|
+
}
|
|
241
|
+
// ==================== Account Operations ====================
|
|
242
|
+
async getAccount(accountKey) {
|
|
243
|
+
return this.request("GET", `/accounts/${encodeURIComponent(accountKey)}`);
|
|
244
|
+
}
|
|
245
|
+
async getAccountSummary(accountKey) {
|
|
246
|
+
return this.request("GET", `/accounts/${encodeURIComponent(accountKey)}/summary`);
|
|
247
|
+
}
|
|
248
|
+
// ==================== Invoice Operations ====================
|
|
249
|
+
async getInvoice(invoiceId) {
|
|
250
|
+
return this.request("GET", `/invoices/${encodeURIComponent(invoiceId)}`);
|
|
251
|
+
}
|
|
252
|
+
async listInvoices(accountKey, page = 1, pageSize = 20) {
|
|
253
|
+
return this.request("GET", `/invoices?accountKey=${encodeURIComponent(accountKey)}&page=${page}&pageSize=${pageSize}`);
|
|
254
|
+
}
|
|
255
|
+
// ==================== Subscription Operations ====================
|
|
256
|
+
async getSubscription(subscriptionKey) {
|
|
257
|
+
return this.request("GET", `/subscriptions/${encodeURIComponent(subscriptionKey)}`);
|
|
258
|
+
}
|
|
259
|
+
async listSubscriptionsByAccount(accountKey) {
|
|
260
|
+
return this.request("GET", `/subscriptions/accounts/${encodeURIComponent(accountKey)}`);
|
|
261
|
+
}
|
|
262
|
+
// ==================== Payment Operations ====================
|
|
263
|
+
async getPayment(paymentId) {
|
|
264
|
+
return this.request("GET", `/payments/${encodeURIComponent(paymentId)}`);
|
|
265
|
+
}
|
|
266
|
+
async listPayments(page = 1, pageSize = 20) {
|
|
267
|
+
return this.request("GET", `/payments?page=${page}&pageSize=${pageSize}`);
|
|
268
|
+
}
|
|
269
|
+
async listPaymentsByAccount(accountKey, page = 1, pageSize = 20) {
|
|
270
|
+
return this.request("GET", `/payments?accountKey=${encodeURIComponent(accountKey)}&page=${page}&pageSize=${pageSize}`);
|
|
271
|
+
}
|
|
272
|
+
// ==================== ZOQL Query Operations ====================
|
|
273
|
+
async executeQuery(zoqlQuery) {
|
|
274
|
+
return this.request("POST", "/action/query", {
|
|
275
|
+
queryString: zoqlQuery,
|
|
276
|
+
});
|
|
277
|
+
}
|
|
278
|
+
async queryMore(queryLocator) {
|
|
279
|
+
return this.request("POST", "/action/queryMore", {
|
|
280
|
+
queryLocator,
|
|
281
|
+
});
|
|
282
|
+
}
|
|
283
|
+
// ==================== Product Catalog ====================
|
|
284
|
+
async listProducts(page = 1, pageSize = 20) {
|
|
285
|
+
return this.request("GET", `/catalog/products?page=${page}&pageSize=${pageSize}`);
|
|
286
|
+
}
|
|
287
|
+
// ==================== Invoice File Operations ====================
|
|
288
|
+
async getInvoiceFiles(invoiceId) {
|
|
289
|
+
return this.request("GET", `/invoices/${encodeURIComponent(invoiceId)}/files`);
|
|
290
|
+
}
|
|
291
|
+
// ==================== Credit Memo Operations ====================
|
|
292
|
+
async getCreditMemo(creditMemoId) {
|
|
293
|
+
return this.request("GET", `/creditmemos/${encodeURIComponent(creditMemoId)}`);
|
|
294
|
+
}
|
|
295
|
+
async listCreditMemos(accountId, page = 1, pageSize = 20) {
|
|
296
|
+
const accountFilter = accountId
|
|
297
|
+
? `&accountId=${encodeURIComponent(accountId)}`
|
|
298
|
+
: "";
|
|
299
|
+
return this.request("GET", `/creditmemos?page=${page}&pageSize=${pageSize}${accountFilter}`);
|
|
300
|
+
}
|
|
301
|
+
// ==================== Account Search Operations ====================
|
|
302
|
+
static ALLOWED_SEARCH_FIELDS = new Set([
|
|
303
|
+
"Name", "AccountNumber", "Status", "Currency", "Balance",
|
|
304
|
+
]);
|
|
305
|
+
static ALLOWED_OPERATORS = new Set([
|
|
306
|
+
"=", "!=", "LIKE", ">", "<", ">=", "<=",
|
|
307
|
+
]);
|
|
308
|
+
async searchAccounts(field, value, operator = "=") {
|
|
309
|
+
if (!ZuoraClient.ALLOWED_SEARCH_FIELDS.has(field)) {
|
|
310
|
+
throw new Error(`Invalid search field: ${field}`);
|
|
311
|
+
}
|
|
312
|
+
if (!ZuoraClient.ALLOWED_OPERATORS.has(operator)) {
|
|
313
|
+
throw new Error(`Invalid operator: ${operator}`);
|
|
314
|
+
}
|
|
315
|
+
const safeValue = value.replace(/'/g, "''");
|
|
316
|
+
const query = `SELECT Id, AccountNumber, Name, Status, Balance, Currency FROM Account WHERE ${field} ${operator} '${safeValue}'`;
|
|
317
|
+
return this.request("POST", "/action/query", {
|
|
318
|
+
queryString: query,
|
|
319
|
+
});
|
|
320
|
+
}
|
|
321
|
+
// ==================== Usage Operations ====================
|
|
322
|
+
async listUsage(accountKey, page = 1, pageSize = 20) {
|
|
323
|
+
return this.request("GET", `/usage/accounts/${encodeURIComponent(accountKey)}?page=${page}&pageSize=${pageSize}`);
|
|
324
|
+
}
|
|
325
|
+
// ==================== Write Operations (Phase 3) ====================
|
|
326
|
+
/**
|
|
327
|
+
* Create a payment in Zuora.
|
|
328
|
+
* Uses Idempotency-Key header to prevent duplicate payments on retries.
|
|
329
|
+
* POST requests are NOT retried on 401 to prevent double-charging.
|
|
330
|
+
*/
|
|
331
|
+
async createPayment(request, idempotencyKey) {
|
|
332
|
+
return this.request("POST", "/payments", request, { "Idempotency-Key": idempotencyKey });
|
|
333
|
+
}
|
|
334
|
+
/**
|
|
335
|
+
* Apply an unapplied payment to one or more invoices.
|
|
336
|
+
* PUT is idempotent and will be retried on 401.
|
|
337
|
+
*/
|
|
338
|
+
async applyPayment(paymentId, request) {
|
|
339
|
+
return this.request("PUT", `/payments/${encodeURIComponent(paymentId)}/apply`, request);
|
|
340
|
+
}
|
|
341
|
+
/**
|
|
342
|
+
* Create a draft invoice for an account.
|
|
343
|
+
* Uses Idempotency-Key header to prevent duplicate invoices on retries.
|
|
344
|
+
* POST requests are NOT retried on 401.
|
|
345
|
+
*/
|
|
346
|
+
async createInvoice(request, idempotencyKey) {
|
|
347
|
+
return this.request("POST", "/invoices", request, { "Idempotency-Key": idempotencyKey });
|
|
348
|
+
}
|
|
349
|
+
/**
|
|
350
|
+
* Post a draft invoice, changing its status to Posted.
|
|
351
|
+
* Once posted, the invoice becomes immutable and affects account balance.
|
|
352
|
+
* PUT is idempotent and will be retried on 401.
|
|
353
|
+
*/
|
|
354
|
+
async postInvoice(invoiceId) {
|
|
355
|
+
return this.request("PUT", `/invoices/${encodeURIComponent(invoiceId)}`, { status: "Posted" });
|
|
356
|
+
}
|
|
357
|
+
/**
|
|
358
|
+
* Cancel a subscription.
|
|
359
|
+
* PUT is idempotent and will be retried on 401.
|
|
360
|
+
*/
|
|
361
|
+
async cancelSubscription(subscriptionKey, request) {
|
|
362
|
+
return this.request("PUT", `/subscriptions/${encodeURIComponent(subscriptionKey)}/cancel`, request);
|
|
363
|
+
}
|
|
364
|
+
// ==================== Advanced Operations (Phase 4) ====================
|
|
365
|
+
/**
|
|
366
|
+
* Create a new subscription for an account.
|
|
367
|
+
* Uses Idempotency-Key header to prevent duplicate subscriptions on retries.
|
|
368
|
+
* POST requests are NOT retried on 401.
|
|
369
|
+
*/
|
|
370
|
+
async createSubscription(request, idempotencyKey) {
|
|
371
|
+
return this.request("POST", "/subscriptions", request, { "Idempotency-Key": idempotencyKey });
|
|
372
|
+
}
|
|
373
|
+
/**
|
|
374
|
+
* Update an existing subscription's renewal terms, auto-renew, or notes.
|
|
375
|
+
* PUT is idempotent and will be retried on 401.
|
|
376
|
+
*/
|
|
377
|
+
async updateSubscription(subscriptionKey, request) {
|
|
378
|
+
return this.request("PUT", `/subscriptions/${encodeURIComponent(subscriptionKey)}`, request);
|
|
379
|
+
}
|
|
380
|
+
/**
|
|
381
|
+
* Create a new billing account in Zuora.
|
|
382
|
+
* Uses Idempotency-Key header to prevent duplicate accounts on retries.
|
|
383
|
+
* POST requests are NOT retried on 401.
|
|
384
|
+
*/
|
|
385
|
+
async createAccount(request, idempotencyKey) {
|
|
386
|
+
return this.request("POST", "/accounts", request, { "Idempotency-Key": idempotencyKey });
|
|
387
|
+
}
|
|
388
|
+
/**
|
|
389
|
+
* Update an existing Zuora account's name, notes, autoPay, or contact info.
|
|
390
|
+
* PUT is idempotent and will be retried on 401.
|
|
391
|
+
*/
|
|
392
|
+
async updateAccount(accountKey, request) {
|
|
393
|
+
return this.request("PUT", `/accounts/${encodeURIComponent(accountKey)}`, request);
|
|
394
|
+
}
|
|
395
|
+
/**
|
|
396
|
+
* Create a refund against a payment.
|
|
397
|
+
* Uses POST /v1/payments/{paymentId}/refunds (not the legacy /v1/refunds).
|
|
398
|
+
* Uses Idempotency-Key header to prevent duplicate refunds on retries.
|
|
399
|
+
* POST requests are NOT retried on 401 to prevent double refunds.
|
|
400
|
+
*/
|
|
401
|
+
async createRefund(paymentId, request, idempotencyKey) {
|
|
402
|
+
return this.request("POST", `/payments/${encodeURIComponent(paymentId)}/refunds`, request, { "Idempotency-Key": idempotencyKey });
|
|
403
|
+
}
|
|
404
|
+
}
|
|
405
|
+
//# sourceMappingURL=zuora-client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"zuora-client.js","sourceRoot":"","sources":["../src/zuora-client.ts"],"names":[],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@armor/zuora-mcp",
|
|
3
|
+
"version": "1.0.1",
|
|
4
|
+
"description": "Zuora Billing MCP Server - Account, invoice, subscription, and payment management",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"main": "dist/index.js",
|
|
7
|
+
"types": "dist/index.d.ts",
|
|
8
|
+
"bin": {
|
|
9
|
+
"zuora-mcp": "./dist/index.js"
|
|
10
|
+
},
|
|
11
|
+
"files": [
|
|
12
|
+
"dist",
|
|
13
|
+
"README.md",
|
|
14
|
+
".env.example"
|
|
15
|
+
],
|
|
16
|
+
"scripts": {
|
|
17
|
+
"build": "tsc",
|
|
18
|
+
"start": "node dist/index.js",
|
|
19
|
+
"dev": "tsx src/index.ts",
|
|
20
|
+
"lint": "eslint src/",
|
|
21
|
+
"test": "npm run build && node --test tests/*.test.mjs",
|
|
22
|
+
"typecheck": "tsc --noEmit",
|
|
23
|
+
"clean": "rm -rf dist"
|
|
24
|
+
},
|
|
25
|
+
"keywords": [
|
|
26
|
+
"zuora",
|
|
27
|
+
"billing",
|
|
28
|
+
"mcp",
|
|
29
|
+
"model-context-protocol",
|
|
30
|
+
"invoices",
|
|
31
|
+
"subscriptions"
|
|
32
|
+
],
|
|
33
|
+
"repository": {
|
|
34
|
+
"type": "git",
|
|
35
|
+
"url": "git@github.com:armor/zuora-mcp.git"
|
|
36
|
+
},
|
|
37
|
+
"author": "Armor Defense, Inc.",
|
|
38
|
+
"license": "SEE LICENSE IN LICENSE",
|
|
39
|
+
"publishConfig": {
|
|
40
|
+
"registry": "https://registry.npmjs.org/",
|
|
41
|
+
"access": "public"
|
|
42
|
+
},
|
|
43
|
+
"engines": {
|
|
44
|
+
"node": ">=20.0.0"
|
|
45
|
+
},
|
|
46
|
+
"dependencies": {
|
|
47
|
+
"@modelcontextprotocol/sdk": "^1.25.2",
|
|
48
|
+
"dotenv": "^17.2.3",
|
|
49
|
+
"zod": "^3.25.0"
|
|
50
|
+
},
|
|
51
|
+
"devDependencies": {
|
|
52
|
+
"@types/node": "^22.0.0",
|
|
53
|
+
"@typescript-eslint/eslint-plugin": "^8.0.0",
|
|
54
|
+
"@typescript-eslint/parser": "^8.0.0",
|
|
55
|
+
"eslint": "^9.0.0",
|
|
56
|
+
"tsx": "^4.19.0",
|
|
57
|
+
"typescript": "^5.6.0"
|
|
58
|
+
}
|
|
59
|
+
}
|