@stephendolan/chartmogul-cli 1.6.2 → 1.7.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/dist/cli.js +100 -6
- package/dist/cli.js.map +1 -1
- package/package.json +1 -1
package/dist/cli.js
CHANGED
|
@@ -221,11 +221,28 @@ function handleChartMogulError(error) {
|
|
|
221
221
|
// src/lib/api-client.ts
|
|
222
222
|
var API_BASE = "https://api.chartmogul.com/v1";
|
|
223
223
|
var MS_PER_MONTH = 1e3 * 60 * 60 * 24 * 30.44;
|
|
224
|
+
var CHARTMOGUL_UUID_PATTERN = /^cus_/;
|
|
225
|
+
var STANDARD_UUID_PATTERN = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;
|
|
226
|
+
function isValidCustomerUuid(id) {
|
|
227
|
+
return CHARTMOGUL_UUID_PATTERN.test(id) || STANDARD_UUID_PATTERN.test(id);
|
|
228
|
+
}
|
|
224
229
|
function calculateTenureMonths(activityDate, customerSince) {
|
|
225
230
|
return Math.round(
|
|
226
231
|
(new Date(activityDate).getTime() - new Date(customerSince).getTime()) / MS_PER_MONTH
|
|
227
232
|
);
|
|
228
233
|
}
|
|
234
|
+
var LOOKUP_PRIORITY = [
|
|
235
|
+
{ field: "uuid", by: "uuid" },
|
|
236
|
+
{ field: "externalId", by: "external_id" },
|
|
237
|
+
{ field: "email", by: "email" },
|
|
238
|
+
{ field: "name", by: "name" }
|
|
239
|
+
];
|
|
240
|
+
function resolveCustomerLookup(fields) {
|
|
241
|
+
for (const { field, by } of LOOKUP_PRIORITY) {
|
|
242
|
+
if (fields[field]) return { by, value: fields[field] };
|
|
243
|
+
}
|
|
244
|
+
return null;
|
|
245
|
+
}
|
|
229
246
|
var ChartMogulClient = class {
|
|
230
247
|
getAuthHeader() {
|
|
231
248
|
const apiKey = auth.getApiKey();
|
|
@@ -294,6 +311,12 @@ var ChartMogulClient = class {
|
|
|
294
311
|
return this.request("GET", "/customers", { params });
|
|
295
312
|
}
|
|
296
313
|
async getCustomer(uuid) {
|
|
314
|
+
if (!isValidCustomerUuid(uuid)) {
|
|
315
|
+
throw new ChartMogulCliError(
|
|
316
|
+
`Invalid customer ID format: "${uuid}". Expected a ChartMogul UUID (cus_xxx). To find a customer by Stripe ID, use list_customers with external_id.`,
|
|
317
|
+
400
|
|
318
|
+
);
|
|
319
|
+
}
|
|
297
320
|
return this.request("GET", `/customers/${uuid}`);
|
|
298
321
|
}
|
|
299
322
|
async searchCustomers(email) {
|
|
@@ -361,6 +384,47 @@ var ChartMogulClient = class {
|
|
|
361
384
|
async listActivities(params = {}) {
|
|
362
385
|
return this.request("GET", "/activities", { params });
|
|
363
386
|
}
|
|
387
|
+
async customerLookup(params) {
|
|
388
|
+
let customer;
|
|
389
|
+
switch (params.by) {
|
|
390
|
+
case "uuid": {
|
|
391
|
+
customer = await this.getCustomer(params.value);
|
|
392
|
+
break;
|
|
393
|
+
}
|
|
394
|
+
case "external_id": {
|
|
395
|
+
const result = await this.listCustomers({ external_id: params.value });
|
|
396
|
+
if (result.entries.length === 0) {
|
|
397
|
+
throw new ChartMogulCliError(`No customer found with external_id: ${params.value}`, 404);
|
|
398
|
+
}
|
|
399
|
+
customer = result.entries[0];
|
|
400
|
+
break;
|
|
401
|
+
}
|
|
402
|
+
case "email": {
|
|
403
|
+
const result = await this.searchCustomers(params.value);
|
|
404
|
+
if (result.entries.length === 0) {
|
|
405
|
+
throw new ChartMogulCliError(`No customer found with email: ${params.value}`, 404);
|
|
406
|
+
}
|
|
407
|
+
customer = result.entries[0];
|
|
408
|
+
break;
|
|
409
|
+
}
|
|
410
|
+
case "name": {
|
|
411
|
+
const result = await this.listCustomers();
|
|
412
|
+
const match = result.entries.find(
|
|
413
|
+
(c) => c.name?.toLowerCase() === params.value.toLowerCase()
|
|
414
|
+
);
|
|
415
|
+
if (!match) {
|
|
416
|
+
throw new ChartMogulCliError(`No customer found with name: ${params.value}`, 404);
|
|
417
|
+
}
|
|
418
|
+
customer = match;
|
|
419
|
+
break;
|
|
420
|
+
}
|
|
421
|
+
}
|
|
422
|
+
const subscriptions = await this.getCustomerSubscriptions(customer.uuid);
|
|
423
|
+
return {
|
|
424
|
+
customer,
|
|
425
|
+
subscriptions: subscriptions.entries
|
|
426
|
+
};
|
|
427
|
+
}
|
|
364
428
|
async listActivitiesEnriched(params = {}) {
|
|
365
429
|
const activities = await this.listActivities(params);
|
|
366
430
|
const uniqueCustomerUuids = [
|
|
@@ -483,7 +547,7 @@ function createCustomersCommand() {
|
|
|
483
547
|
}
|
|
484
548
|
)
|
|
485
549
|
);
|
|
486
|
-
cmd.command("view").description("View a customer").argument("<uuid>", "
|
|
550
|
+
cmd.command("view").description("View a customer").argument("<uuid>", "ChartMogul customer UUID (cus_xxx format)").action(
|
|
487
551
|
withErrorHandling(async (uuid) => {
|
|
488
552
|
const customer = await client.getCustomer(uuid);
|
|
489
553
|
outputJson(customer);
|
|
@@ -504,6 +568,18 @@ function createCustomersCommand() {
|
|
|
504
568
|
outputJson(result);
|
|
505
569
|
})
|
|
506
570
|
);
|
|
571
|
+
cmd.command("lookup").description("Look up a customer with subscriptions by UUID, email, external ID, or name").option("--uuid <uuid>", "Customer UUID").option("--email <email>", "Customer email address").option("--external-id <id>", "Customer external ID").option("--name <name>", "Customer name").action(
|
|
572
|
+
withErrorHandling(
|
|
573
|
+
async (options) => {
|
|
574
|
+
const lookup = resolveCustomerLookup(options);
|
|
575
|
+
if (!lookup) {
|
|
576
|
+
throw new Error("Provide one of --uuid, --email, --external-id, or --name");
|
|
577
|
+
}
|
|
578
|
+
const result = await client.customerLookup(lookup);
|
|
579
|
+
outputJson(result);
|
|
580
|
+
}
|
|
581
|
+
)
|
|
582
|
+
);
|
|
507
583
|
cmd.command("subscriptions").description("List customer subscriptions").argument("<uuid>", "Customer UUID").action(
|
|
508
584
|
withErrorHandling(async (uuid) => {
|
|
509
585
|
const result = await client.getCustomerSubscriptions(uuid);
|
|
@@ -693,7 +769,7 @@ var toolRegistry = [
|
|
|
693
769
|
{ name: "get_ltv", description: "Get Customer Lifetime Value (LTV) for a date range" },
|
|
694
770
|
{ name: "list_activities", description: "List subscription activities (new business, expansion, contraction, churn)" },
|
|
695
771
|
{ name: "search_customers", description: "Search for customers by email address" },
|
|
696
|
-
{ name: "get_customer", description: "Get detailed information about a specific customer" },
|
|
772
|
+
{ name: "get_customer", description: "Get detailed information about a specific customer by ChartMogul UUID (cus_xxx). For Stripe IDs, use list_customers with externalId." },
|
|
697
773
|
{ name: "get_customers_batch", description: "Get detailed information about multiple customers in one call" },
|
|
698
774
|
{ name: "get_customer_activities", description: "Get subscription activities for a specific customer" },
|
|
699
775
|
{ name: "get_customer_subscriptions", description: "Get active subscriptions for a specific customer" },
|
|
@@ -705,7 +781,8 @@ var toolRegistry = [
|
|
|
705
781
|
{ name: "list_data_sources", description: "List all configured data sources" },
|
|
706
782
|
{ name: "get_data_source", description: "Get detailed information about a specific data source" },
|
|
707
783
|
{ name: "get_account", description: "Get ChartMogul account information" },
|
|
708
|
-
{ name: "check_auth", description: "Check if ChartMogul authentication is configured" }
|
|
784
|
+
{ name: "check_auth", description: "Check if ChartMogul authentication is configured" },
|
|
785
|
+
{ name: "customer_lookup", description: "Look up a customer with subscriptions by UUID, email, external ID, or name in a single call" }
|
|
709
786
|
];
|
|
710
787
|
var server = new McpServer({
|
|
711
788
|
name: "chartmogul",
|
|
@@ -835,8 +912,8 @@ server.tool(
|
|
|
835
912
|
);
|
|
836
913
|
server.tool(
|
|
837
914
|
"get_customer",
|
|
838
|
-
"Get detailed information about a specific customer",
|
|
839
|
-
{ uuid: z.string().describe("
|
|
915
|
+
"Get detailed information about a specific customer by ChartMogul UUID (cus_xxx). For Stripe IDs, use list_customers with externalId.",
|
|
916
|
+
{ uuid: z.string().describe("ChartMogul customer UUID (cus_xxx format). Slug IDs from ChartMogul URLs won't work \u2014 use list_customers with external_id for Stripe customer IDs instead.") },
|
|
840
917
|
async ({ uuid }) => jsonResponse(await client.getCustomer(uuid))
|
|
841
918
|
);
|
|
842
919
|
server.tool(
|
|
@@ -931,6 +1008,23 @@ server.tool(
|
|
|
931
1008
|
{},
|
|
932
1009
|
async () => jsonResponse({ authenticated: auth.isAuthenticated() })
|
|
933
1010
|
);
|
|
1011
|
+
server.tool(
|
|
1012
|
+
"customer_lookup",
|
|
1013
|
+
"Look up a customer with subscriptions by UUID, email, external ID, or name in a single call",
|
|
1014
|
+
{
|
|
1015
|
+
uuid: z.string().optional().describe("Customer UUID (highest priority)"),
|
|
1016
|
+
externalId: z.string().optional().describe("Customer external ID"),
|
|
1017
|
+
email: z.string().optional().describe("Customer email address"),
|
|
1018
|
+
name: z.string().optional().describe("Customer name (lowest priority, client-side filtered)")
|
|
1019
|
+
},
|
|
1020
|
+
async ({ uuid, externalId, email, name }) => {
|
|
1021
|
+
const lookup = resolveCustomerLookup({ uuid, externalId, email, name });
|
|
1022
|
+
if (!lookup) {
|
|
1023
|
+
return jsonResponse({ error: "Provide one of: uuid, externalId, email, or name" });
|
|
1024
|
+
}
|
|
1025
|
+
return jsonResponse(await client.customerLookup(lookup));
|
|
1026
|
+
}
|
|
1027
|
+
);
|
|
934
1028
|
server.tool(
|
|
935
1029
|
"search_tools",
|
|
936
1030
|
"Search for available tools by name or description using regex. Returns matching tool names.",
|
|
@@ -962,7 +1056,7 @@ function createMcpCommand() {
|
|
|
962
1056
|
}
|
|
963
1057
|
|
|
964
1058
|
// src/cli.ts
|
|
965
|
-
var version = true ? "1.
|
|
1059
|
+
var version = true ? "1.7.1" : "0.0.0-dev";
|
|
966
1060
|
var program = new Command10();
|
|
967
1061
|
program.name("chartmogul").description("A command-line interface for ChartMogul analytics").version(version).option("-c, --compact", "Minified JSON output (single line)").hook("preAction", (thisCommand) => {
|
|
968
1062
|
const options = thisCommand.opts();
|
package/dist/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/cli.ts","../src/lib/utils.ts","../src/lib/output.ts","../src/commands/auth.ts","../src/lib/auth.ts","../src/lib/config.ts","../src/lib/errors.ts","../src/lib/api-client.ts","../src/lib/command-utils.ts","../src/commands/account.ts","../src/commands/data-sources.ts","../src/commands/customers.ts","../src/commands/plans.ts","../src/commands/invoices.ts","../src/commands/metrics.ts","../src/lib/dates.ts","../src/commands/activities.ts","../src/commands/mcp.ts","../src/mcp/server.ts"],"sourcesContent":["#!/usr/bin/env bun\n\nimport { Command } from 'commander';\nimport { setOutputOptions } from './lib/output.js';\nimport { createAuthCommand } from './commands/auth.js';\nimport { createAccountCommand } from './commands/account.js';\nimport { createDataSourcesCommand } from './commands/data-sources.js';\nimport { createCustomersCommand } from './commands/customers.js';\nimport { createPlansCommand } from './commands/plans.js';\nimport { createInvoicesCommand } from './commands/invoices.js';\nimport { createMetricsCommand } from './commands/metrics.js';\nimport { createActivitiesCommand } from './commands/activities.js';\nimport { createMcpCommand } from './commands/mcp.js';\n\ndeclare const __VERSION__: string | undefined;\n\nconst version = typeof __VERSION__ !== 'undefined' ? __VERSION__ : '0.0.0-dev';\n\nconst program = new Command();\n\nprogram\n .name('chartmogul')\n .description('A command-line interface for ChartMogul analytics')\n .version(version)\n .option('-c, --compact', 'Minified JSON output (single line)')\n .hook('preAction', (thisCommand) => {\n const options = thisCommand.opts();\n setOutputOptions({\n compact: options.compact,\n });\n });\n\nprogram.addCommand(createAuthCommand());\nprogram.addCommand(createAccountCommand());\nprogram.addCommand(createDataSourcesCommand());\nprogram.addCommand(createCustomersCommand());\nprogram.addCommand(createPlansCommand());\nprogram.addCommand(createInvoicesCommand());\nprogram.addCommand(createMetricsCommand());\nprogram.addCommand(createActivitiesCommand());\nprogram.addCommand(createMcpCommand());\n\nprogram.parseAsync().catch(() => {\n process.exit(1);\n});\n","function centsToDollars(cents: number): number {\n return cents / 100;\n}\n\nconst CENTS_FIELDS = new Set([\n 'amount_in_cents',\n 'discount_amount_in_cents',\n 'tax_amount_in_cents',\n 'mrr',\n 'arr',\n 'arpa',\n 'asp',\n 'ltv',\n 'activity_mrr',\n 'activity_arr',\n 'activity_mrr_movement',\n 'activity-mrr',\n 'activity-arr',\n 'activity-mrr-movement',\n 'new-biz',\n 'expansion',\n 'contraction',\n 'churn',\n 'reactivation',\n]);\n\nfunction isCentsField(fieldName: string): boolean {\n return CENTS_FIELDS.has(fieldName) || fieldName.endsWith('_in_cents');\n}\n\nfunction normalizeFieldName(fieldName: string): string {\n return fieldName.replace(/_in_cents$/, '');\n}\n\nexport function convertCentsToDollars(data: unknown): unknown {\n if (data === null || data === undefined) return data;\n if (Array.isArray(data)) return data.map(convertCentsToDollars);\n if (typeof data !== 'object') return data;\n\n const converted: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(data)) {\n if (isCentsField(key) && typeof value === 'number') {\n converted[normalizeFieldName(key)] = centsToDollars(value);\n } else {\n converted[key] = convertCentsToDollars(value);\n }\n }\n return converted;\n}\n","import type { OutputOptions } from '../types/index.js';\nimport { convertCentsToDollars } from './utils.js';\n\nlet globalOutputOptions: OutputOptions = {};\n\nexport function setOutputOptions(options: OutputOptions): void {\n globalOutputOptions = options;\n}\n\nexport function outputJson(data: unknown, options: OutputOptions = {}): void {\n const convertedData = convertCentsToDollars(data);\n const mergedOptions = { ...globalOutputOptions, ...options };\n\n const jsonString = mergedOptions.compact\n ? JSON.stringify(convertedData)\n : JSON.stringify(convertedData, null, 2);\n\n console.log(jsonString);\n}\n","import { Command } from 'commander';\nimport { auth } from '../lib/auth.js';\nimport { client } from '../lib/api-client.js';\nimport { outputJson } from '../lib/output.js';\nimport { withErrorHandling } from '../lib/command-utils.js';\n\nexport function createAuthCommand(): Command {\n const cmd = new Command('auth').description('Authentication operations');\n\n cmd\n .command('login')\n .description('Configure ChartMogul API credentials')\n .requiredOption('--api-key <key>', 'ChartMogul API Key')\n .action(\n withErrorHandling(async (options: { apiKey: string }) => {\n auth.setApiKey(options.apiKey);\n await client.ping();\n outputJson({ message: 'Successfully authenticated with ChartMogul' });\n })\n );\n\n cmd\n .command('logout')\n .description('Remove stored credentials')\n .action(\n withErrorHandling(async () => {\n auth.logout();\n outputJson({ message: 'Logged out successfully' });\n })\n );\n\n cmd\n .command('status')\n .description('Check authentication status')\n .action(\n withErrorHandling(async () => {\n outputJson({ authenticated: auth.isAuthenticated() });\n })\n );\n\n return cmd;\n}\n","import { Entry } from '@napi-rs/keyring';\nimport { config } from './config.js';\n\nconst SERVICE_NAME = 'chartmogul-cli';\nconst API_KEY_ACCOUNT = 'api-key';\n\nconst KEYRING_UNAVAILABLE_ERROR =\n 'Keychain storage unavailable. Cannot store credentials securely.\\n' +\n 'On Linux, install libsecret: sudo apt-get install libsecret-1-dev\\n' +\n 'Then reinstall: bun install -g @stephendolan/chartmogul-cli\\n' +\n 'Alternatively, use CHARTMOGUL_API_KEY environment variable.';\n\nfunction getKeyring(account: string): Entry | null {\n try {\n return new Entry(SERVICE_NAME, account);\n } catch {\n return null;\n }\n}\n\nfunction getPassword(account: string): string | null {\n const entry = getKeyring(account);\n if (entry) {\n try {\n return entry.getPassword();\n } catch {\n return null;\n }\n }\n return null;\n}\n\nfunction setPassword(account: string, value: string): void {\n const entry = getKeyring(account);\n if (!entry) {\n throw new Error(KEYRING_UNAVAILABLE_ERROR);\n }\n entry.setPassword(value);\n}\n\nfunction deletePassword(account: string): boolean {\n const entry = getKeyring(account);\n if (entry) {\n return entry.deletePassword();\n }\n return false;\n}\n\nexport class AuthManager {\n getApiKey(): string | null {\n return getPassword(API_KEY_ACCOUNT) || process.env.CHARTMOGUL_API_KEY || null;\n }\n\n setApiKey(apiKey: string): void {\n setPassword(API_KEY_ACCOUNT, apiKey);\n }\n\n isAuthenticated(): boolean {\n return this.getApiKey() !== null;\n }\n\n logout(): void {\n deletePassword(API_KEY_ACCOUNT);\n config.clearDefaultDataSource();\n }\n}\n\nexport const auth = new AuthManager();\n","import Conf from 'conf';\n\ninterface ConfigSchema {\n defaultDataSource?: string;\n}\n\nconst store = new Conf<ConfigSchema>({\n projectName: 'chartmogul-cli',\n});\n\nexport const config = {\n getDefaultDataSource(): string | undefined {\n return store.get('defaultDataSource') || process.env.CHARTMOGUL_DATA_SOURCE;\n },\n\n setDefaultDataSource(dataSourceUuid: string): void {\n store.set('defaultDataSource', dataSourceUuid);\n },\n\n clearDefaultDataSource(): void {\n store.delete('defaultDataSource');\n },\n\n clear(): void {\n store.clear();\n },\n};\n","import type { ChartMogulError } from '../types/index.js';\nimport { outputJson } from './output.js';\n\nexport class ChartMogulCliError extends Error {\n constructor(\n message: string,\n public statusCode?: number\n ) {\n super(message);\n this.name = 'ChartMogulCliError';\n }\n}\n\nexport class ChartMogulApiError extends Error {\n constructor(\n message: string,\n public apiError: unknown,\n public statusCode: number\n ) {\n super(message);\n this.name = 'ChartMogulApiError';\n }\n}\n\nexport function sanitizeErrorMessage(message: string): string {\n const sensitivePatterns = [\n /Bearer\\s+[\\w\\-._~+/]+=*/gi,\n /token[=:]\\s*[\\w\\-._~+/]+=*/gi,\n /api[_-]?key[=:]\\s*[\\w\\-._~+/]+=*/gi,\n /authorization:\\s*basic\\s+[\\w\\-._~+/]+=*/gi,\n ];\n\n let sanitized = message;\n for (const pattern of sensitivePatterns) {\n sanitized = sanitized.replace(pattern, '[REDACTED]');\n }\n\n return sanitized.length > 500 ? sanitized.substring(0, 500) + '...' : sanitized;\n}\n\ninterface ApiErrorResponse {\n error?: string;\n message?: string;\n errors?: Array<{\n key?: string;\n message?: string;\n }>;\n}\n\nfunction isErrorObject(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null;\n}\n\nexport function sanitizeApiError(error: unknown): ChartMogulError {\n if (!isErrorObject(error)) {\n return {\n name: 'api_error',\n detail: 'An error occurred',\n };\n }\n\n const apiError = error as ApiErrorResponse;\n\n let detail = 'An error occurred';\n if (apiError.message) {\n detail = apiError.message;\n } else if (apiError.errors?.length) {\n detail = apiError.errors\n .map((e) => e.message || e.key)\n .filter(Boolean)\n .join('; ');\n }\n\n return {\n name: apiError.error || 'api_error',\n detail: sanitizeErrorMessage(detail),\n };\n}\n\nfunction formatErrorResponse(name: string, detail: string, statusCode: number): never {\n const hint =\n name === 'too_many_requests'\n ? 'ChartMogul API rate limit exceeded. Wait a moment and retry.'\n : undefined;\n\n const response: { error: { name: string; detail: string; statusCode: number }; hint?: string } = {\n error: { name, detail, statusCode },\n };\n\n if (hint) {\n response.hint = hint;\n }\n\n outputJson(response);\n process.exit(1);\n}\n\nexport function handleChartMogulError(error: unknown): never {\n if (error instanceof ChartMogulCliError) {\n const sanitized = sanitizeErrorMessage(error.message);\n formatErrorResponse('cli_error', sanitized, error.statusCode || 1);\n }\n\n if (error instanceof ChartMogulApiError) {\n const cmError = sanitizeApiError(error.apiError);\n formatErrorResponse(cmError.name, cmError.detail, error.statusCode);\n }\n\n if (error instanceof Error) {\n const sanitized = sanitizeErrorMessage(error.message);\n formatErrorResponse('unknown_error', sanitized, 1);\n }\n\n formatErrorResponse('unknown_error', 'An unexpected error occurred', 1);\n}\n","import { auth } from './auth.js';\nimport { ChartMogulCliError, ChartMogulApiError } from './errors.js';\nimport type {\n Account,\n DataSource,\n Customer,\n Plan,\n Subscription,\n Invoice,\n MetricsResponse,\n Activity,\n EnrichedActivity,\n CustomerListResponse,\n PaginatedResponse,\n CursorPaginatedResponse,\n} from '../types/index.js';\n\nconst API_BASE = 'https://api.chartmogul.com/v1';\n\ntype ActivityListParams = {\n 'start-date'?: string;\n 'end-date'?: string;\n type?: string;\n cursor?: string;\n 'per-page'?: number;\n};\n\nconst MS_PER_MONTH = 1000 * 60 * 60 * 24 * 30.44;\n\nfunction calculateTenureMonths(activityDate: string, customerSince: string): number {\n return Math.round(\n (new Date(activityDate).getTime() - new Date(customerSince).getTime()) / MS_PER_MONTH\n );\n}\n\nexport class ChartMogulClient {\n private getAuthHeader(): string {\n const apiKey = auth.getApiKey();\n if (!apiKey) {\n throw new ChartMogulCliError('Not authenticated. Please run: chartmogul auth login', 401);\n }\n return `Basic ${Buffer.from(`${apiKey}:`).toString('base64')}`;\n }\n\n private async request<T>(\n method: string,\n path: string,\n options: {\n params?: Record<string, string | number | boolean | undefined>;\n body?: unknown;\n } = {}\n ): Promise<T> {\n const { params, body } = options;\n\n const url = new URL(`${API_BASE}${path}`);\n if (params) {\n Object.entries(params).forEach(([key, value]) => {\n if (value !== undefined) {\n url.searchParams.set(key, String(value));\n }\n });\n }\n\n const authHeader = this.getAuthHeader();\n const fetchOptions: RequestInit = {\n method,\n headers: {\n Authorization: authHeader,\n 'Content-Type': 'application/json',\n },\n };\n if (body) {\n fetchOptions.body = JSON.stringify(body);\n }\n\n let response: Response;\n try {\n response = await fetch(url.toString(), fetchOptions);\n } catch (error) {\n const message = error instanceof Error ? error.message : 'Unknown network error';\n throw new ChartMogulCliError(`Network request failed: ${message}`, 0);\n }\n\n if (response.status === 429) {\n const retryAfter = response.headers.get('Retry-After') || '60';\n throw new ChartMogulCliError(\n `Rate limited by ChartMogul API. Retry after ${retryAfter} seconds.`,\n 429\n );\n }\n\n if (response.status === 204) {\n return {} as T;\n }\n\n if (!response.ok) {\n const error = await response.json().catch(() => ({}));\n throw new ChartMogulApiError('API request failed', error, response.status);\n }\n\n return response.json() as Promise<T>;\n }\n\n async getAccount() {\n return this.request<Account>('GET', '/account');\n }\n\n async ping() {\n return this.request<{ data: string }>('GET', '/ping');\n }\n\n async listDataSources() {\n return this.request<{ data_sources: DataSource[] }>('GET', '/data_sources');\n }\n\n async getDataSource(uuid: string) {\n return this.request<DataSource>('GET', `/data_sources/${uuid}`);\n }\n\n async listCustomers(\n params: {\n data_source_uuid?: string;\n status?: string;\n system?: string;\n external_id?: string;\n page?: number;\n per_page?: number;\n } = {}\n ) {\n return this.request<CustomerListResponse>('GET', '/customers', { params });\n }\n\n async getCustomer(uuid: string) {\n return this.request<Customer>('GET', `/customers/${uuid}`);\n }\n\n async searchCustomers(email: string) {\n return this.request<{ entries: Customer[] }>('GET', '/customers/search', {\n params: { email },\n });\n }\n\n async getCustomersBatch(uuids: string[]): Promise<Customer[]> {\n const results = await Promise.all(\n uuids.map((uuid) => this.getCustomer(uuid).catch(() => null))\n );\n return results.filter((c): c is Customer => c !== null);\n }\n\n async getCustomerActivities(uuid: string, params: { page?: number; per_page?: number } = {}) {\n return this.request<PaginatedResponse<Activity>>('GET', `/customers/${uuid}/activities`, {\n params,\n });\n }\n\n async getCustomerSubscriptions(uuid: string) {\n return this.request<{ entries: Subscription[] }>('GET', `/customers/${uuid}/subscriptions`);\n }\n\n async listPlans(params: { data_source_uuid?: string; page?: number; per_page?: number } = {}) {\n return this.request<{ plans: Plan[]; has_more: boolean; per_page: number; page: number }>(\n 'GET',\n '/plans',\n { params }\n );\n }\n\n async getPlan(uuid: string) {\n return this.request<Plan>('GET', `/plans/${uuid}`);\n }\n\n async listInvoices(\n params: {\n customer_uuid?: string;\n data_source_uuid?: string;\n external_id?: string;\n page?: number;\n per_page?: number;\n } = {}\n ) {\n return this.request<{ invoices: Invoice[]; has_more: boolean }>('GET', '/invoices', { params });\n }\n\n async getInvoice(uuid: string) {\n return this.request<Invoice>('GET', `/invoices/${uuid}`);\n }\n\n async getMrr(params: { 'start-date': string; 'end-date': string; interval?: string }) {\n return this.request<MetricsResponse>('GET', '/metrics/mrr', { params });\n }\n\n async getArr(params: { 'start-date': string; 'end-date': string; interval?: string }) {\n return this.request<MetricsResponse>('GET', '/metrics/arr', { params });\n }\n\n async getArpa(params: { 'start-date': string; 'end-date': string; interval?: string }) {\n return this.request<MetricsResponse>('GET', '/metrics/arpa', { params });\n }\n\n async getAsp(params: { 'start-date': string; 'end-date': string; interval?: string }) {\n return this.request<MetricsResponse>('GET', '/metrics/asp', { params });\n }\n\n async getCustomerCount(params: { 'start-date': string; 'end-date': string; interval?: string }) {\n return this.request<MetricsResponse>('GET', '/metrics/customer-count', { params });\n }\n\n async getCustomerChurnRate(params: {\n 'start-date': string;\n 'end-date': string;\n interval?: string;\n }) {\n return this.request<MetricsResponse>('GET', '/metrics/customer-churn-rate', { params });\n }\n\n async getMrrChurnRate(params: { 'start-date': string; 'end-date': string; interval?: string }) {\n return this.request<MetricsResponse>('GET', '/metrics/mrr-churn-rate', { params });\n }\n\n async getLtv(params: { 'start-date': string; 'end-date': string; interval?: string }) {\n return this.request<MetricsResponse>('GET', '/metrics/ltv', { params });\n }\n\n async getAllMetrics(params: { 'start-date': string; 'end-date': string; interval?: string }) {\n return this.request<MetricsResponse>('GET', '/metrics/all', { params });\n }\n\n async listActivities(params: ActivityListParams = {}) {\n return this.request<CursorPaginatedResponse<Activity>>('GET', '/activities', { params });\n }\n\n async listActivitiesEnriched(\n params: ActivityListParams = {}\n ): Promise<CursorPaginatedResponse<EnrichedActivity>> {\n const activities = await this.listActivities(params);\n\n const uniqueCustomerUuids = [\n ...new Set(activities.entries.map((a) => a['customer-uuid']).filter(Boolean)),\n ];\n\n const customers = await this.getCustomersBatch(uniqueCustomerUuids);\n const customerMap = new Map(customers.map((c) => [c.uuid, c]));\n\n const enrichedEntries: EnrichedActivity[] = activities.entries.map((activity) => {\n const customer = customerMap.get(activity['customer-uuid']);\n const customerSince = customer?.['customer-since'] ?? customer?.customer_since;\n const tenureMonths = customerSince\n ? calculateTenureMonths(activity.date, customerSince)\n : undefined;\n\n return {\n ...activity,\n 'customer-since': customerSince,\n 'customer-tenure-months': tenureMonths,\n };\n });\n\n return {\n ...activities,\n entries: enrichedEntries,\n };\n }\n}\n\nexport const client = new ChartMogulClient();\n","import { handleChartMogulError } from './errors.js';\n\nexport function withErrorHandling<T extends unknown[], R>(\n fn: (...args: T) => Promise<R>\n): (...args: T) => Promise<void> {\n return async (...args: T) => {\n try {\n await fn(...args);\n } catch (error) {\n handleChartMogulError(error);\n }\n };\n}\n","import { Command } from 'commander';\nimport { client } from '../lib/api-client.js';\nimport { outputJson } from '../lib/output.js';\nimport { withErrorHandling } from '../lib/command-utils.js';\n\nexport function createAccountCommand(): Command {\n const cmd = new Command('account').description('Account operations');\n\n cmd\n .command('view')\n .description('View account details')\n .action(\n withErrorHandling(async () => {\n const account = await client.getAccount();\n outputJson(account);\n })\n );\n\n return cmd;\n}\n","import { Command } from 'commander';\nimport { client } from '../lib/api-client.js';\nimport { config } from '../lib/config.js';\nimport { outputJson } from '../lib/output.js';\nimport { withErrorHandling } from '../lib/command-utils.js';\n\nexport function createDataSourcesCommand(): Command {\n const cmd = new Command('data-sources').description('Data source operations');\n\n cmd\n .command('list')\n .description('List all data sources')\n .action(\n withErrorHandling(async () => {\n const result = await client.listDataSources();\n outputJson(result.data_sources);\n })\n );\n\n cmd\n .command('view')\n .description('View a data source')\n .argument('<uuid>', 'Data source UUID')\n .action(\n withErrorHandling(async (uuid: string) => {\n const dataSource = await client.getDataSource(uuid);\n outputJson(dataSource);\n })\n );\n\n cmd\n .command('set-default')\n .description('Set default data source for filtering')\n .argument('<uuid>', 'Data source UUID')\n .action(\n withErrorHandling(async (uuid: string) => {\n config.setDefaultDataSource(uuid);\n outputJson({ message: `Default data source set to ${uuid}` });\n })\n );\n\n cmd\n .command('get-default')\n .description('Get default data source')\n .action(\n withErrorHandling(async () => {\n const defaultDs = config.getDefaultDataSource();\n outputJson({ default_data_source: defaultDs || null });\n })\n );\n\n return cmd;\n}\n","import { Command } from 'commander';\nimport { client } from '../lib/api-client.js';\nimport { config } from '../lib/config.js';\nimport { outputJson } from '../lib/output.js';\nimport { withErrorHandling } from '../lib/command-utils.js';\n\nexport function createCustomersCommand(): Command {\n const cmd = new Command('customers').description('Customer queries');\n\n cmd\n .command('list')\n .description('List customers')\n .option('--data-source <uuid>', 'Filter by data source UUID')\n .option('--status <status>', 'Filter by status (Lead, Active, Cancelled)')\n .option('--external-id <id>', 'Filter by external ID')\n .option('--page <number>', 'Page number')\n .option('--per-page <number>', 'Results per page (max 200)')\n .action(\n withErrorHandling(\n async (options: {\n dataSource?: string;\n status?: string;\n externalId?: string;\n page?: string;\n perPage?: string;\n }) => {\n const result = await client.listCustomers({\n data_source_uuid: options.dataSource || config.getDefaultDataSource(),\n status: options.status,\n external_id: options.externalId,\n page: options.page ? parseInt(options.page, 10) : undefined,\n per_page: options.perPage ? parseInt(options.perPage, 10) : undefined,\n });\n outputJson(result);\n }\n )\n );\n\n cmd\n .command('view')\n .description('View a customer')\n .argument('<uuid>', 'Customer UUID')\n .action(\n withErrorHandling(async (uuid: string) => {\n const customer = await client.getCustomer(uuid);\n outputJson(customer);\n })\n );\n\n cmd\n .command('search')\n .description('Search customers by email')\n .requiredOption('--email <email>', 'Email address to search')\n .action(\n withErrorHandling(async (options: { email: string }) => {\n const result = await client.searchCustomers(options.email);\n outputJson(result.entries);\n })\n );\n\n cmd\n .command('activities')\n .description('List customer activities')\n .argument('<uuid>', 'Customer UUID')\n .option('--page <number>', 'Page number')\n .option('--per-page <number>', 'Results per page')\n .action(\n withErrorHandling(async (uuid: string, options: { page?: string; perPage?: string }) => {\n const result = await client.getCustomerActivities(uuid, {\n page: options.page ? parseInt(options.page, 10) : undefined,\n per_page: options.perPage ? parseInt(options.perPage, 10) : undefined,\n });\n outputJson(result);\n })\n );\n\n cmd\n .command('subscriptions')\n .description('List customer subscriptions')\n .argument('<uuid>', 'Customer UUID')\n .action(\n withErrorHandling(async (uuid: string) => {\n const result = await client.getCustomerSubscriptions(uuid);\n outputJson(result.entries);\n })\n );\n\n return cmd;\n}\n","import { Command } from 'commander';\nimport { client } from '../lib/api-client.js';\nimport { config } from '../lib/config.js';\nimport { outputJson } from '../lib/output.js';\nimport { withErrorHandling } from '../lib/command-utils.js';\n\nexport function createPlansCommand(): Command {\n const cmd = new Command('plans').description('Plan queries');\n\n cmd\n .command('list')\n .description('List plans')\n .option('--data-source <uuid>', 'Filter by data source UUID')\n .option('--page <number>', 'Page number')\n .option('--per-page <number>', 'Results per page')\n .action(\n withErrorHandling(\n async (options: { dataSource?: string; page?: string; perPage?: string }) => {\n const result = await client.listPlans({\n data_source_uuid: options.dataSource || config.getDefaultDataSource(),\n page: options.page ? parseInt(options.page, 10) : undefined,\n per_page: options.perPage ? parseInt(options.perPage, 10) : undefined,\n });\n outputJson(result);\n }\n )\n );\n\n cmd\n .command('view')\n .description('View a plan')\n .argument('<uuid>', 'Plan UUID')\n .action(\n withErrorHandling(async (uuid: string) => {\n const plan = await client.getPlan(uuid);\n outputJson(plan);\n })\n );\n\n return cmd;\n}\n","import { Command } from 'commander';\nimport { client } from '../lib/api-client.js';\nimport { config } from '../lib/config.js';\nimport { outputJson } from '../lib/output.js';\nimport { withErrorHandling } from '../lib/command-utils.js';\n\nexport function createInvoicesCommand(): Command {\n const cmd = new Command('invoices').description('Invoice queries');\n\n cmd\n .command('list')\n .description('List invoices')\n .option('--customer <uuid>', 'Filter by customer UUID')\n .option('--data-source <uuid>', 'Filter by data source UUID')\n .option('--external-id <id>', 'Filter by external ID')\n .option('--page <number>', 'Page number')\n .option('--per-page <number>', 'Results per page')\n .action(\n withErrorHandling(\n async (options: {\n customer?: string;\n dataSource?: string;\n externalId?: string;\n page?: string;\n perPage?: string;\n }) => {\n const result = await client.listInvoices({\n customer_uuid: options.customer,\n data_source_uuid: options.dataSource || config.getDefaultDataSource(),\n external_id: options.externalId,\n page: options.page ? parseInt(options.page, 10) : undefined,\n per_page: options.perPage ? parseInt(options.perPage, 10) : undefined,\n });\n outputJson(result);\n }\n )\n );\n\n cmd\n .command('view')\n .description('View an invoice')\n .argument('<uuid>', 'Invoice UUID')\n .action(\n withErrorHandling(async (uuid: string) => {\n const invoice = await client.getInvoice(uuid);\n outputJson(invoice);\n })\n );\n\n return cmd;\n}\n","import { Command } from 'commander';\nimport { client } from '../lib/api-client.js';\nimport { outputJson } from '../lib/output.js';\nimport { withErrorHandling } from '../lib/command-utils.js';\nimport { getDefaultDateRange, parseDate } from '../lib/dates.js';\n\ninterface MetricOptions {\n startDate?: string;\n endDate?: string;\n interval?: string;\n}\n\nfunction buildMetricParams(options: MetricOptions) {\n const defaults = getDefaultDateRange();\n return {\n 'start-date': options.startDate ? parseDate(options.startDate) : defaults.startDate,\n 'end-date': options.endDate ? parseDate(options.endDate) : defaults.endDate,\n interval: options.interval,\n };\n}\n\nexport function createMetricsCommand(): Command {\n const cmd = new Command('metrics').description('Metrics and analytics');\n\n cmd\n .command('all')\n .description('Get all key metrics')\n .option('--start-date <date>', 'Start date (YYYY-MM-DD)')\n .option('--end-date <date>', 'End date (YYYY-MM-DD)')\n .option('--interval <interval>', 'Interval (day, week, month, quarter)')\n .action(\n withErrorHandling(async (options: MetricOptions) => {\n const result = await client.getAllMetrics(buildMetricParams(options));\n outputJson(result);\n })\n );\n\n cmd\n .command('mrr')\n .description('Get Monthly Recurring Revenue')\n .option('--start-date <date>', 'Start date (YYYY-MM-DD)')\n .option('--end-date <date>', 'End date (YYYY-MM-DD)')\n .option('--interval <interval>', 'Interval (day, week, month, quarter)')\n .action(\n withErrorHandling(async (options: MetricOptions) => {\n const result = await client.getMrr(buildMetricParams(options));\n outputJson(result);\n })\n );\n\n cmd\n .command('arr')\n .description('Get Annual Recurring Revenue')\n .option('--start-date <date>', 'Start date (YYYY-MM-DD)')\n .option('--end-date <date>', 'End date (YYYY-MM-DD)')\n .option('--interval <interval>', 'Interval (day, week, month, quarter)')\n .action(\n withErrorHandling(async (options: MetricOptions) => {\n const result = await client.getArr(buildMetricParams(options));\n outputJson(result);\n })\n );\n\n cmd\n .command('arpa')\n .description('Get Average Revenue Per Account')\n .option('--start-date <date>', 'Start date (YYYY-MM-DD)')\n .option('--end-date <date>', 'End date (YYYY-MM-DD)')\n .option('--interval <interval>', 'Interval (day, week, month, quarter)')\n .action(\n withErrorHandling(async (options: MetricOptions) => {\n const result = await client.getArpa(buildMetricParams(options));\n outputJson(result);\n })\n );\n\n cmd\n .command('asp')\n .description('Get Average Sale Price')\n .option('--start-date <date>', 'Start date (YYYY-MM-DD)')\n .option('--end-date <date>', 'End date (YYYY-MM-DD)')\n .option('--interval <interval>', 'Interval (day, week, month, quarter)')\n .action(\n withErrorHandling(async (options: MetricOptions) => {\n const result = await client.getAsp(buildMetricParams(options));\n outputJson(result);\n })\n );\n\n cmd\n .command('customer-count')\n .description('Get customer count over time')\n .option('--start-date <date>', 'Start date (YYYY-MM-DD)')\n .option('--end-date <date>', 'End date (YYYY-MM-DD)')\n .option('--interval <interval>', 'Interval (day, week, month, quarter)')\n .action(\n withErrorHandling(async (options: MetricOptions) => {\n const result = await client.getCustomerCount(buildMetricParams(options));\n outputJson(result);\n })\n );\n\n cmd\n .command('customer-churn')\n .description('Get customer churn rate')\n .option('--start-date <date>', 'Start date (YYYY-MM-DD)')\n .option('--end-date <date>', 'End date (YYYY-MM-DD)')\n .option('--interval <interval>', 'Interval (day, week, month, quarter)')\n .action(\n withErrorHandling(async (options: MetricOptions) => {\n const result = await client.getCustomerChurnRate(buildMetricParams(options));\n outputJson(result);\n })\n );\n\n cmd\n .command('mrr-churn')\n .description('Get MRR churn rate')\n .option('--start-date <date>', 'Start date (YYYY-MM-DD)')\n .option('--end-date <date>', 'End date (YYYY-MM-DD)')\n .option('--interval <interval>', 'Interval (day, week, month, quarter)')\n .action(\n withErrorHandling(async (options: MetricOptions) => {\n const result = await client.getMrrChurnRate(buildMetricParams(options));\n outputJson(result);\n })\n );\n\n cmd\n .command('ltv')\n .description('Get Customer Lifetime Value')\n .option('--start-date <date>', 'Start date (YYYY-MM-DD)')\n .option('--end-date <date>', 'End date (YYYY-MM-DD)')\n .option('--interval <interval>', 'Interval (day, week, month, quarter)')\n .action(\n withErrorHandling(async (options: MetricOptions) => {\n const result = await client.getLtv(buildMetricParams(options));\n outputJson(result);\n })\n );\n\n return cmd;\n}\n","import dayjs from 'dayjs';\nimport { ChartMogulCliError } from './errors.js';\n\nexport function parseDate(input: string): string {\n const d = dayjs(input);\n if (!d.isValid()) {\n throw new ChartMogulCliError(`Invalid date: ${input}`, 400);\n }\n return d.format('YYYY-MM-DD');\n}\n\nexport function getDefaultDateRange(): { startDate: string; endDate: string } {\n return {\n startDate: dayjs().subtract(30, 'day').format('YYYY-MM-DD'),\n endDate: dayjs().format('YYYY-MM-DD'),\n };\n}\n","import { Command } from 'commander';\nimport { client } from '../lib/api-client.js';\nimport { outputJson } from '../lib/output.js';\nimport { withErrorHandling } from '../lib/command-utils.js';\n\nexport function createActivitiesCommand(): Command {\n const cmd = new Command('activities').description('Activity operations');\n\n cmd\n .command('list')\n .description('List activities')\n .option('--start-date <date>', 'Start date (YYYY-MM-DD)')\n .option('--end-date <date>', 'End date (YYYY-MM-DD)')\n .option('--type <type>', 'Activity type (new_biz, expansion, contraction, churn, reactivation)')\n .option('--cursor <cursor>', 'Cursor for next page (from previous response)')\n .option('--per-page <number>', 'Results per page')\n .option('--enrich', 'Include customer tenure data (customer-since, customer-tenure-months)')\n .action(\n withErrorHandling(\n async (options: {\n startDate?: string;\n endDate?: string;\n type?: string;\n cursor?: string;\n perPage?: string;\n enrich?: boolean;\n }) => {\n const params = {\n 'start-date': options.startDate,\n 'end-date': options.endDate,\n type: options.type,\n cursor: options.cursor,\n 'per-page': options.perPage ? parseInt(options.perPage, 10) : undefined,\n };\n const result = options.enrich\n ? await client.listActivitiesEnriched(params)\n : await client.listActivities(params);\n outputJson(result);\n }\n )\n );\n\n return cmd;\n}\n","import { Command } from 'commander';\nimport { runMcpServer } from '../mcp/server.js';\n\nexport function createMcpCommand(): Command {\n const cmd = new Command('mcp').description('Run ChartMogul MCP server');\n\n cmd.action(async () => {\n await runMcpServer();\n });\n\n return cmd;\n}\n","import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';\nimport { z } from 'zod';\nimport { client } from '../lib/api-client.js';\nimport { auth } from '../lib/auth.js';\nimport { convertCentsToDollars } from '../lib/utils.js';\n\nconst toolRegistry = [\n { name: 'get_all_metrics', description: 'Get all revenue metrics (MRR, ARR, ARPA, churn rates, LTV, customer count) for a date range' },\n { name: 'get_mrr', description: 'Get Monthly Recurring Revenue (MRR) for a date range' },\n { name: 'get_arr', description: 'Get Annual Recurring Revenue (ARR) for a date range' },\n { name: 'get_arpa', description: 'Get Average Revenue Per Account (ARPA) for a date range' },\n { name: 'get_asp', description: 'Get Average Sale Price (ASP) for a date range' },\n { name: 'get_customer_count', description: 'Get customer count over a date range' },\n { name: 'get_customer_churn_rate', description: 'Get customer churn rate for a date range' },\n { name: 'get_mrr_churn_rate', description: 'Get MRR churn rate for a date range' },\n { name: 'get_ltv', description: 'Get Customer Lifetime Value (LTV) for a date range' },\n { name: 'list_activities', description: 'List subscription activities (new business, expansion, contraction, churn)' },\n { name: 'search_customers', description: 'Search for customers by email address' },\n { name: 'get_customer', description: 'Get detailed information about a specific customer' },\n { name: 'get_customers_batch', description: 'Get detailed information about multiple customers in one call' },\n { name: 'get_customer_activities', description: 'Get subscription activities for a specific customer' },\n { name: 'get_customer_subscriptions', description: 'Get active subscriptions for a specific customer' },\n { name: 'list_customers', description: 'List all customers with optional filtering by status, external ID, or data source' },\n { name: 'list_invoices', description: 'List invoices with optional filtering by customer, data source, or external ID' },\n { name: 'get_invoice', description: 'Get detailed information about a specific invoice' },\n { name: 'list_plans', description: 'List subscription plans with optional filtering by data source' },\n { name: 'get_plan', description: 'Get detailed information about a specific plan' },\n { name: 'list_data_sources', description: 'List all configured data sources' },\n { name: 'get_data_source', description: 'Get detailed information about a specific data source' },\n { name: 'get_account', description: 'Get ChartMogul account information' },\n { name: 'check_auth', description: 'Check if ChartMogul authentication is configured' },\n];\n\nconst server = new McpServer({\n name: 'chartmogul',\n version: '1.0.0',\n});\n\nfunction jsonResponse(data: unknown) {\n const converted = convertCentsToDollars(data);\n return { content: [{ type: 'text' as const, text: JSON.stringify(converted, null, 2) }] };\n}\n\nconst dateRangeSchema = {\n startDate: z.string().describe('Start date (YYYY-MM-DD)'),\n endDate: z.string().describe('End date (YYYY-MM-DD)'),\n interval: z\n .enum(['day', 'week', 'month', 'quarter'])\n .optional()\n .describe('Aggregation interval'),\n};\n\nserver.tool(\n 'get_all_metrics',\n 'Get all revenue metrics (MRR, ARR, ARPA, churn rates, LTV, customer count) for a date range',\n {\n startDate: dateRangeSchema.startDate,\n endDate: dateRangeSchema.endDate,\n interval: dateRangeSchema.interval,\n },\n async ({ startDate, endDate, interval }) =>\n jsonResponse(await client.getAllMetrics({ 'start-date': startDate, 'end-date': endDate, interval }))\n);\n\nserver.tool(\n 'get_mrr',\n 'Get Monthly Recurring Revenue (MRR) for a date range',\n {\n startDate: dateRangeSchema.startDate,\n endDate: dateRangeSchema.endDate,\n interval: dateRangeSchema.interval,\n },\n async ({ startDate, endDate, interval }) =>\n jsonResponse(await client.getMrr({ 'start-date': startDate, 'end-date': endDate, interval }))\n);\n\nserver.tool(\n 'get_arr',\n 'Get Annual Recurring Revenue (ARR) for a date range',\n {\n startDate: dateRangeSchema.startDate,\n endDate: dateRangeSchema.endDate,\n interval: dateRangeSchema.interval,\n },\n async ({ startDate, endDate, interval }) =>\n jsonResponse(await client.getArr({ 'start-date': startDate, 'end-date': endDate, interval }))\n);\n\nserver.tool(\n 'get_customer_churn_rate',\n 'Get customer churn rate for a date range',\n {\n startDate: dateRangeSchema.startDate,\n endDate: dateRangeSchema.endDate,\n interval: dateRangeSchema.interval,\n },\n async ({ startDate, endDate, interval }) =>\n jsonResponse(await client.getCustomerChurnRate({ 'start-date': startDate, 'end-date': endDate, interval }))\n);\n\nserver.tool(\n 'get_mrr_churn_rate',\n 'Get MRR churn rate for a date range',\n {\n startDate: dateRangeSchema.startDate,\n endDate: dateRangeSchema.endDate,\n interval: dateRangeSchema.interval,\n },\n async ({ startDate, endDate, interval }) =>\n jsonResponse(await client.getMrrChurnRate({ 'start-date': startDate, 'end-date': endDate, interval }))\n);\n\nserver.tool(\n 'get_arpa',\n 'Get Average Revenue Per Account (ARPA) for a date range',\n {\n startDate: dateRangeSchema.startDate,\n endDate: dateRangeSchema.endDate,\n interval: dateRangeSchema.interval,\n },\n async ({ startDate, endDate, interval }) =>\n jsonResponse(await client.getArpa({ 'start-date': startDate, 'end-date': endDate, interval }))\n);\n\nserver.tool(\n 'get_asp',\n 'Get Average Sale Price (ASP) for a date range',\n {\n startDate: dateRangeSchema.startDate,\n endDate: dateRangeSchema.endDate,\n interval: dateRangeSchema.interval,\n },\n async ({ startDate, endDate, interval }) =>\n jsonResponse(await client.getAsp({ 'start-date': startDate, 'end-date': endDate, interval }))\n);\n\nserver.tool(\n 'get_customer_count',\n 'Get customer count over a date range',\n {\n startDate: dateRangeSchema.startDate,\n endDate: dateRangeSchema.endDate,\n interval: dateRangeSchema.interval,\n },\n async ({ startDate, endDate, interval }) =>\n jsonResponse(await client.getCustomerCount({ 'start-date': startDate, 'end-date': endDate, interval }))\n);\n\nserver.tool(\n 'get_ltv',\n 'Get Customer Lifetime Value (LTV) for a date range',\n {\n startDate: dateRangeSchema.startDate,\n endDate: dateRangeSchema.endDate,\n interval: dateRangeSchema.interval,\n },\n async ({ startDate, endDate, interval }) =>\n jsonResponse(await client.getLtv({ 'start-date': startDate, 'end-date': endDate, interval }))\n);\n\nserver.tool(\n 'list_activities',\n 'List subscription activities (new business, expansion, contraction, churn)',\n {\n startDate: z.string().optional().describe('Start date (YYYY-MM-DD)'),\n endDate: z.string().optional().describe('End date (YYYY-MM-DD)'),\n type: z\n .enum(['new-biz', 'expansion', 'contraction', 'churn', 'reactivation'])\n .optional()\n .describe('Activity type filter'),\n cursor: z.string().optional().describe('Cursor for next page (from previous response)'),\n perPage: z.number().optional().describe('Results per page'),\n enrich: z.boolean().optional().describe('Include customer tenure data (customer-since, customer-tenure-months)'),\n },\n async ({ startDate, endDate, type, cursor, perPage, enrich }) => {\n const params = { 'start-date': startDate, 'end-date': endDate, type, cursor, 'per-page': perPage };\n const result = enrich\n ? await client.listActivitiesEnriched(params)\n : await client.listActivities(params);\n return jsonResponse(result);\n }\n);\n\nserver.tool(\n 'search_customers',\n 'Search for customers by email address',\n { email: z.string().describe('Email address to search for') },\n async ({ email }) => jsonResponse(await client.searchCustomers(email))\n);\n\nserver.tool(\n 'get_customer',\n 'Get detailed information about a specific customer',\n { uuid: z.string().describe('Customer UUID') },\n async ({ uuid }) => jsonResponse(await client.getCustomer(uuid))\n);\n\nserver.tool(\n 'get_customers_batch',\n 'Get detailed information about multiple customers in one call',\n { uuids: z.array(z.string()).describe('Array of customer UUIDs') },\n async ({ uuids }) => jsonResponse(await client.getCustomersBatch(uuids))\n);\n\nserver.tool(\n 'get_customer_activities',\n 'Get subscription activities for a specific customer',\n {\n uuid: z.string().describe('Customer UUID'),\n page: z.number().optional().describe('Page number'),\n perPage: z.number().optional().describe('Results per page'),\n },\n async ({ uuid, page, perPage }) =>\n jsonResponse(await client.getCustomerActivities(uuid, { page, per_page: perPage }))\n);\n\nserver.tool(\n 'get_customer_subscriptions',\n 'Get active subscriptions for a specific customer',\n { uuid: z.string().describe('Customer UUID') },\n async ({ uuid }) => jsonResponse(await client.getCustomerSubscriptions(uuid))\n);\n\nserver.tool(\n 'list_customers',\n 'List all customers with optional filtering by status, external ID, or data source',\n {\n status: z.enum(['Lead', 'Active', 'Past Due', 'Cancelled']).optional().describe('Customer status'),\n externalId: z.string().optional().describe('Filter by external ID'),\n dataSourceUuid: z.string().optional().describe('Filter by data source UUID'),\n page: z.number().optional().describe('Page number'),\n perPage: z.number().optional().describe('Results per page'),\n },\n async ({ status, externalId, dataSourceUuid, page, perPage }) =>\n jsonResponse(await client.listCustomers({ status, external_id: externalId, data_source_uuid: dataSourceUuid, page, per_page: perPage }))\n);\n\nserver.tool(\n 'list_invoices',\n 'List invoices with optional filtering by customer, data source, or external ID',\n {\n customerUuid: z.string().optional().describe('Filter by customer UUID'),\n dataSourceUuid: z.string().optional().describe('Filter by data source UUID'),\n externalId: z.string().optional().describe('Filter by external ID'),\n page: z.number().optional().describe('Page number'),\n perPage: z.number().optional().describe('Results per page'),\n },\n async ({ customerUuid, dataSourceUuid, externalId, page, perPage }) =>\n jsonResponse(await client.listInvoices({ customer_uuid: customerUuid, data_source_uuid: dataSourceUuid, external_id: externalId, page, per_page: perPage }))\n);\n\nserver.tool(\n 'get_invoice',\n 'Get detailed information about a specific invoice',\n { uuid: z.string().describe('Invoice UUID') },\n async ({ uuid }) => jsonResponse(await client.getInvoice(uuid))\n);\n\nserver.tool(\n 'list_plans',\n 'List subscription plans with optional filtering by data source',\n {\n dataSourceUuid: z.string().optional().describe('Filter by data source UUID'),\n page: z.number().optional().describe('Page number'),\n perPage: z.number().optional().describe('Results per page'),\n },\n async ({ dataSourceUuid, page, perPage }) =>\n jsonResponse(await client.listPlans({ data_source_uuid: dataSourceUuid, page, per_page: perPage }))\n);\n\nserver.tool(\n 'get_plan',\n 'Get detailed information about a specific plan',\n { uuid: z.string().describe('Plan UUID') },\n async ({ uuid }) => jsonResponse(await client.getPlan(uuid))\n);\n\nserver.tool(\n 'list_data_sources',\n 'List all configured data sources',\n {},\n async () => jsonResponse(await client.listDataSources())\n);\n\nserver.tool(\n 'get_data_source',\n 'Get detailed information about a specific data source',\n { uuid: z.string().describe('Data source UUID') },\n async ({ uuid }) => jsonResponse(await client.getDataSource(uuid))\n);\n\nserver.tool(\n 'get_account',\n 'Get ChartMogul account information',\n {},\n async () => jsonResponse(await client.getAccount())\n);\n\nserver.tool(\n 'check_auth',\n 'Check if ChartMogul authentication is configured',\n {},\n async () => jsonResponse({ authenticated: auth.isAuthenticated() })\n);\n\nserver.tool(\n 'search_tools',\n 'Search for available tools by name or description using regex. Returns matching tool names.',\n {\n query: z.string().describe('Regex pattern to match against tool names and descriptions (case-insensitive)'),\n },\n async ({ query }) => {\n try {\n const pattern = new RegExp(query, 'i');\n const matches = toolRegistry.filter((t) => pattern.test(t.name) || pattern.test(t.description));\n return jsonResponse({ tools: matches });\n } catch {\n return jsonResponse({ error: 'Invalid regex pattern' });\n }\n }\n);\n\nexport async function runMcpServer() {\n const transport = new StdioServerTransport();\n await server.connect(transport);\n}\n"],"mappings":"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","names":["Command","Command","Command","Command","Command","Command","Command","Command","Command","Command","Command","Command","Command","Command","Command","Command","Command","Command"]}
|
|
1
|
+
{"version":3,"sources":["../src/cli.ts","../src/lib/utils.ts","../src/lib/output.ts","../src/commands/auth.ts","../src/lib/auth.ts","../src/lib/config.ts","../src/lib/errors.ts","../src/lib/api-client.ts","../src/lib/command-utils.ts","../src/commands/account.ts","../src/commands/data-sources.ts","../src/commands/customers.ts","../src/commands/plans.ts","../src/commands/invoices.ts","../src/commands/metrics.ts","../src/lib/dates.ts","../src/commands/activities.ts","../src/commands/mcp.ts","../src/mcp/server.ts"],"sourcesContent":["#!/usr/bin/env bun\n\nimport { Command } from 'commander';\nimport { setOutputOptions } from './lib/output.js';\nimport { createAuthCommand } from './commands/auth.js';\nimport { createAccountCommand } from './commands/account.js';\nimport { createDataSourcesCommand } from './commands/data-sources.js';\nimport { createCustomersCommand } from './commands/customers.js';\nimport { createPlansCommand } from './commands/plans.js';\nimport { createInvoicesCommand } from './commands/invoices.js';\nimport { createMetricsCommand } from './commands/metrics.js';\nimport { createActivitiesCommand } from './commands/activities.js';\nimport { createMcpCommand } from './commands/mcp.js';\n\ndeclare const __VERSION__: string | undefined;\n\nconst version = typeof __VERSION__ !== 'undefined' ? __VERSION__ : '0.0.0-dev';\n\nconst program = new Command();\n\nprogram\n .name('chartmogul')\n .description('A command-line interface for ChartMogul analytics')\n .version(version)\n .option('-c, --compact', 'Minified JSON output (single line)')\n .hook('preAction', (thisCommand) => {\n const options = thisCommand.opts();\n setOutputOptions({\n compact: options.compact,\n });\n });\n\nprogram.addCommand(createAuthCommand());\nprogram.addCommand(createAccountCommand());\nprogram.addCommand(createDataSourcesCommand());\nprogram.addCommand(createCustomersCommand());\nprogram.addCommand(createPlansCommand());\nprogram.addCommand(createInvoicesCommand());\nprogram.addCommand(createMetricsCommand());\nprogram.addCommand(createActivitiesCommand());\nprogram.addCommand(createMcpCommand());\n\nprogram.parseAsync().catch(() => {\n process.exit(1);\n});\n","function centsToDollars(cents: number): number {\n return cents / 100;\n}\n\nconst CENTS_FIELDS = new Set([\n 'amount_in_cents',\n 'discount_amount_in_cents',\n 'tax_amount_in_cents',\n 'mrr',\n 'arr',\n 'arpa',\n 'asp',\n 'ltv',\n 'activity_mrr',\n 'activity_arr',\n 'activity_mrr_movement',\n 'activity-mrr',\n 'activity-arr',\n 'activity-mrr-movement',\n 'new-biz',\n 'expansion',\n 'contraction',\n 'churn',\n 'reactivation',\n]);\n\nfunction isCentsField(fieldName: string): boolean {\n return CENTS_FIELDS.has(fieldName) || fieldName.endsWith('_in_cents');\n}\n\nfunction normalizeFieldName(fieldName: string): string {\n return fieldName.replace(/_in_cents$/, '');\n}\n\nexport function convertCentsToDollars(data: unknown): unknown {\n if (data === null || data === undefined) return data;\n if (Array.isArray(data)) return data.map(convertCentsToDollars);\n if (typeof data !== 'object') return data;\n\n const converted: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(data)) {\n if (isCentsField(key) && typeof value === 'number') {\n converted[normalizeFieldName(key)] = centsToDollars(value);\n } else {\n converted[key] = convertCentsToDollars(value);\n }\n }\n return converted;\n}\n","import type { OutputOptions } from '../types/index.js';\nimport { convertCentsToDollars } from './utils.js';\n\nlet globalOutputOptions: OutputOptions = {};\n\nexport function setOutputOptions(options: OutputOptions): void {\n globalOutputOptions = options;\n}\n\nexport function outputJson(data: unknown, options: OutputOptions = {}): void {\n const convertedData = convertCentsToDollars(data);\n const mergedOptions = { ...globalOutputOptions, ...options };\n\n const jsonString = mergedOptions.compact\n ? JSON.stringify(convertedData)\n : JSON.stringify(convertedData, null, 2);\n\n console.log(jsonString);\n}\n","import { Command } from 'commander';\nimport { auth } from '../lib/auth.js';\nimport { client } from '../lib/api-client.js';\nimport { outputJson } from '../lib/output.js';\nimport { withErrorHandling } from '../lib/command-utils.js';\n\nexport function createAuthCommand(): Command {\n const cmd = new Command('auth').description('Authentication operations');\n\n cmd\n .command('login')\n .description('Configure ChartMogul API credentials')\n .requiredOption('--api-key <key>', 'ChartMogul API Key')\n .action(\n withErrorHandling(async (options: { apiKey: string }) => {\n auth.setApiKey(options.apiKey);\n await client.ping();\n outputJson({ message: 'Successfully authenticated with ChartMogul' });\n })\n );\n\n cmd\n .command('logout')\n .description('Remove stored credentials')\n .action(\n withErrorHandling(async () => {\n auth.logout();\n outputJson({ message: 'Logged out successfully' });\n })\n );\n\n cmd\n .command('status')\n .description('Check authentication status')\n .action(\n withErrorHandling(async () => {\n outputJson({ authenticated: auth.isAuthenticated() });\n })\n );\n\n return cmd;\n}\n","import { Entry } from '@napi-rs/keyring';\nimport { config } from './config.js';\n\nconst SERVICE_NAME = 'chartmogul-cli';\nconst API_KEY_ACCOUNT = 'api-key';\n\nconst KEYRING_UNAVAILABLE_ERROR =\n 'Keychain storage unavailable. Cannot store credentials securely.\\n' +\n 'On Linux, install libsecret: sudo apt-get install libsecret-1-dev\\n' +\n 'Then reinstall: bun install -g @stephendolan/chartmogul-cli\\n' +\n 'Alternatively, use CHARTMOGUL_API_KEY environment variable.';\n\nfunction getKeyring(account: string): Entry | null {\n try {\n return new Entry(SERVICE_NAME, account);\n } catch {\n return null;\n }\n}\n\nfunction getPassword(account: string): string | null {\n const entry = getKeyring(account);\n if (entry) {\n try {\n return entry.getPassword();\n } catch {\n return null;\n }\n }\n return null;\n}\n\nfunction setPassword(account: string, value: string): void {\n const entry = getKeyring(account);\n if (!entry) {\n throw new Error(KEYRING_UNAVAILABLE_ERROR);\n }\n entry.setPassword(value);\n}\n\nfunction deletePassword(account: string): boolean {\n const entry = getKeyring(account);\n if (entry) {\n return entry.deletePassword();\n }\n return false;\n}\n\nexport class AuthManager {\n getApiKey(): string | null {\n return getPassword(API_KEY_ACCOUNT) || process.env.CHARTMOGUL_API_KEY || null;\n }\n\n setApiKey(apiKey: string): void {\n setPassword(API_KEY_ACCOUNT, apiKey);\n }\n\n isAuthenticated(): boolean {\n return this.getApiKey() !== null;\n }\n\n logout(): void {\n deletePassword(API_KEY_ACCOUNT);\n config.clearDefaultDataSource();\n }\n}\n\nexport const auth = new AuthManager();\n","import Conf from 'conf';\n\ninterface ConfigSchema {\n defaultDataSource?: string;\n}\n\nconst store = new Conf<ConfigSchema>({\n projectName: 'chartmogul-cli',\n});\n\nexport const config = {\n getDefaultDataSource(): string | undefined {\n return store.get('defaultDataSource') || process.env.CHARTMOGUL_DATA_SOURCE;\n },\n\n setDefaultDataSource(dataSourceUuid: string): void {\n store.set('defaultDataSource', dataSourceUuid);\n },\n\n clearDefaultDataSource(): void {\n store.delete('defaultDataSource');\n },\n\n clear(): void {\n store.clear();\n },\n};\n","import type { ChartMogulError } from '../types/index.js';\nimport { outputJson } from './output.js';\n\nexport class ChartMogulCliError extends Error {\n constructor(\n message: string,\n public statusCode?: number\n ) {\n super(message);\n this.name = 'ChartMogulCliError';\n }\n}\n\nexport class ChartMogulApiError extends Error {\n constructor(\n message: string,\n public apiError: unknown,\n public statusCode: number\n ) {\n super(message);\n this.name = 'ChartMogulApiError';\n }\n}\n\nexport function sanitizeErrorMessage(message: string): string {\n const sensitivePatterns = [\n /Bearer\\s+[\\w\\-._~+/]+=*/gi,\n /token[=:]\\s*[\\w\\-._~+/]+=*/gi,\n /api[_-]?key[=:]\\s*[\\w\\-._~+/]+=*/gi,\n /authorization:\\s*basic\\s+[\\w\\-._~+/]+=*/gi,\n ];\n\n let sanitized = message;\n for (const pattern of sensitivePatterns) {\n sanitized = sanitized.replace(pattern, '[REDACTED]');\n }\n\n return sanitized.length > 500 ? sanitized.substring(0, 500) + '...' : sanitized;\n}\n\ninterface ApiErrorResponse {\n error?: string;\n message?: string;\n errors?: Array<{\n key?: string;\n message?: string;\n }>;\n}\n\nfunction isErrorObject(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null;\n}\n\nexport function sanitizeApiError(error: unknown): ChartMogulError {\n if (!isErrorObject(error)) {\n return {\n name: 'api_error',\n detail: 'An error occurred',\n };\n }\n\n const apiError = error as ApiErrorResponse;\n\n let detail = 'An error occurred';\n if (apiError.message) {\n detail = apiError.message;\n } else if (apiError.errors?.length) {\n detail = apiError.errors\n .map((e) => e.message || e.key)\n .filter(Boolean)\n .join('; ');\n }\n\n return {\n name: apiError.error || 'api_error',\n detail: sanitizeErrorMessage(detail),\n };\n}\n\nfunction formatErrorResponse(name: string, detail: string, statusCode: number): never {\n const hint =\n name === 'too_many_requests'\n ? 'ChartMogul API rate limit exceeded. Wait a moment and retry.'\n : undefined;\n\n const response: { error: { name: string; detail: string; statusCode: number }; hint?: string } = {\n error: { name, detail, statusCode },\n };\n\n if (hint) {\n response.hint = hint;\n }\n\n outputJson(response);\n process.exit(1);\n}\n\nexport function handleChartMogulError(error: unknown): never {\n if (error instanceof ChartMogulCliError) {\n const sanitized = sanitizeErrorMessage(error.message);\n formatErrorResponse('cli_error', sanitized, error.statusCode || 1);\n }\n\n if (error instanceof ChartMogulApiError) {\n const cmError = sanitizeApiError(error.apiError);\n formatErrorResponse(cmError.name, cmError.detail, error.statusCode);\n }\n\n if (error instanceof Error) {\n const sanitized = sanitizeErrorMessage(error.message);\n formatErrorResponse('unknown_error', sanitized, 1);\n }\n\n formatErrorResponse('unknown_error', 'An unexpected error occurred', 1);\n}\n","import { auth } from './auth.js';\nimport { ChartMogulCliError, ChartMogulApiError } from './errors.js';\nimport type {\n Account,\n DataSource,\n Customer,\n Plan,\n Subscription,\n Invoice,\n MetricsResponse,\n Activity,\n EnrichedActivity,\n CustomerListResponse,\n PaginatedResponse,\n CursorPaginatedResponse,\n} from '../types/index.js';\n\nconst API_BASE = 'https://api.chartmogul.com/v1';\n\ntype ActivityListParams = {\n 'start-date'?: string;\n 'end-date'?: string;\n type?: string;\n cursor?: string;\n 'per-page'?: number;\n};\n\nconst MS_PER_MONTH = 1000 * 60 * 60 * 24 * 30.44;\n\n// ChartMogul UUIDs are \"cus_\" followed by a hex-ish identifier (e.g. cus_a1b2c3d4-...)\n// Standard UUIDs (xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx) are also accepted.\n// Slug-format IDs from ChartMogul URLs (e.g. \"293549973-Alens_Team\") are NOT valid.\nconst CHARTMOGUL_UUID_PATTERN = /^cus_/;\nconst STANDARD_UUID_PATTERN = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;\n\nexport function isValidCustomerUuid(id: string): boolean {\n return CHARTMOGUL_UUID_PATTERN.test(id) || STANDARD_UUID_PATTERN.test(id);\n}\n\nfunction calculateTenureMonths(activityDate: string, customerSince: string): number {\n return Math.round(\n (new Date(activityDate).getTime() - new Date(customerSince).getTime()) / MS_PER_MONTH\n );\n}\n\ntype CustomerLookupParams = {\n by: 'uuid' | 'email' | 'external_id' | 'name';\n value: string;\n};\n\ntype CustomerLookupFields = {\n uuid?: string;\n externalId?: string;\n email?: string;\n name?: string;\n};\n\nconst LOOKUP_PRIORITY: { field: keyof CustomerLookupFields; by: CustomerLookupParams['by'] }[] = [\n { field: 'uuid', by: 'uuid' },\n { field: 'externalId', by: 'external_id' },\n { field: 'email', by: 'email' },\n { field: 'name', by: 'name' },\n];\n\nexport function resolveCustomerLookup(fields: CustomerLookupFields): CustomerLookupParams | null {\n for (const { field, by } of LOOKUP_PRIORITY) {\n if (fields[field]) return { by, value: fields[field] };\n }\n return null;\n}\n\nexport class ChartMogulClient {\n private getAuthHeader(): string {\n const apiKey = auth.getApiKey();\n if (!apiKey) {\n throw new ChartMogulCliError('Not authenticated. Please run: chartmogul auth login', 401);\n }\n return `Basic ${Buffer.from(`${apiKey}:`).toString('base64')}`;\n }\n\n private async request<T>(\n method: string,\n path: string,\n options: {\n params?: Record<string, string | number | boolean | undefined>;\n body?: unknown;\n } = {}\n ): Promise<T> {\n const { params, body } = options;\n\n const url = new URL(`${API_BASE}${path}`);\n if (params) {\n Object.entries(params).forEach(([key, value]) => {\n if (value !== undefined) {\n url.searchParams.set(key, String(value));\n }\n });\n }\n\n const authHeader = this.getAuthHeader();\n const fetchOptions: RequestInit = {\n method,\n headers: {\n Authorization: authHeader,\n 'Content-Type': 'application/json',\n },\n };\n if (body) {\n fetchOptions.body = JSON.stringify(body);\n }\n\n let response: Response;\n try {\n response = await fetch(url.toString(), fetchOptions);\n } catch (error) {\n const message = error instanceof Error ? error.message : 'Unknown network error';\n throw new ChartMogulCliError(`Network request failed: ${message}`, 0);\n }\n\n if (response.status === 429) {\n const retryAfter = response.headers.get('Retry-After') || '60';\n throw new ChartMogulCliError(\n `Rate limited by ChartMogul API. Retry after ${retryAfter} seconds.`,\n 429\n );\n }\n\n if (response.status === 204) {\n return {} as T;\n }\n\n if (!response.ok) {\n const error = await response.json().catch(() => ({}));\n throw new ChartMogulApiError('API request failed', error, response.status);\n }\n\n return response.json() as Promise<T>;\n }\n\n async getAccount() {\n return this.request<Account>('GET', '/account');\n }\n\n async ping() {\n return this.request<{ data: string }>('GET', '/ping');\n }\n\n async listDataSources() {\n return this.request<{ data_sources: DataSource[] }>('GET', '/data_sources');\n }\n\n async getDataSource(uuid: string) {\n return this.request<DataSource>('GET', `/data_sources/${uuid}`);\n }\n\n async listCustomers(\n params: {\n data_source_uuid?: string;\n status?: string;\n system?: string;\n external_id?: string;\n page?: number;\n per_page?: number;\n } = {}\n ) {\n return this.request<CustomerListResponse>('GET', '/customers', { params });\n }\n\n async getCustomer(uuid: string) {\n if (!isValidCustomerUuid(uuid)) {\n throw new ChartMogulCliError(\n `Invalid customer ID format: \"${uuid}\". Expected a ChartMogul UUID (cus_xxx). To find a customer by Stripe ID, use list_customers with external_id.`,\n 400\n );\n }\n return this.request<Customer>('GET', `/customers/${uuid}`);\n }\n\n async searchCustomers(email: string) {\n return this.request<{ entries: Customer[] }>('GET', '/customers/search', {\n params: { email },\n });\n }\n\n async getCustomersBatch(uuids: string[]): Promise<Customer[]> {\n const results = await Promise.all(\n uuids.map((uuid) => this.getCustomer(uuid).catch(() => null))\n );\n return results.filter((c): c is Customer => c !== null);\n }\n\n async getCustomerActivities(uuid: string, params: { page?: number; per_page?: number } = {}) {\n return this.request<PaginatedResponse<Activity>>('GET', `/customers/${uuid}/activities`, {\n params,\n });\n }\n\n async getCustomerSubscriptions(uuid: string) {\n return this.request<{ entries: Subscription[] }>('GET', `/customers/${uuid}/subscriptions`);\n }\n\n async listPlans(params: { data_source_uuid?: string; page?: number; per_page?: number } = {}) {\n return this.request<{ plans: Plan[]; has_more: boolean; per_page: number; page: number }>(\n 'GET',\n '/plans',\n { params }\n );\n }\n\n async getPlan(uuid: string) {\n return this.request<Plan>('GET', `/plans/${uuid}`);\n }\n\n async listInvoices(\n params: {\n customer_uuid?: string;\n data_source_uuid?: string;\n external_id?: string;\n page?: number;\n per_page?: number;\n } = {}\n ) {\n return this.request<{ invoices: Invoice[]; has_more: boolean }>('GET', '/invoices', { params });\n }\n\n async getInvoice(uuid: string) {\n return this.request<Invoice>('GET', `/invoices/${uuid}`);\n }\n\n async getMrr(params: { 'start-date': string; 'end-date': string; interval?: string }) {\n return this.request<MetricsResponse>('GET', '/metrics/mrr', { params });\n }\n\n async getArr(params: { 'start-date': string; 'end-date': string; interval?: string }) {\n return this.request<MetricsResponse>('GET', '/metrics/arr', { params });\n }\n\n async getArpa(params: { 'start-date': string; 'end-date': string; interval?: string }) {\n return this.request<MetricsResponse>('GET', '/metrics/arpa', { params });\n }\n\n async getAsp(params: { 'start-date': string; 'end-date': string; interval?: string }) {\n return this.request<MetricsResponse>('GET', '/metrics/asp', { params });\n }\n\n async getCustomerCount(params: { 'start-date': string; 'end-date': string; interval?: string }) {\n return this.request<MetricsResponse>('GET', '/metrics/customer-count', { params });\n }\n\n async getCustomerChurnRate(params: {\n 'start-date': string;\n 'end-date': string;\n interval?: string;\n }) {\n return this.request<MetricsResponse>('GET', '/metrics/customer-churn-rate', { params });\n }\n\n async getMrrChurnRate(params: { 'start-date': string; 'end-date': string; interval?: string }) {\n return this.request<MetricsResponse>('GET', '/metrics/mrr-churn-rate', { params });\n }\n\n async getLtv(params: { 'start-date': string; 'end-date': string; interval?: string }) {\n return this.request<MetricsResponse>('GET', '/metrics/ltv', { params });\n }\n\n async getAllMetrics(params: { 'start-date': string; 'end-date': string; interval?: string }) {\n return this.request<MetricsResponse>('GET', '/metrics/all', { params });\n }\n\n async listActivities(params: ActivityListParams = {}) {\n return this.request<CursorPaginatedResponse<Activity>>('GET', '/activities', { params });\n }\n\n async customerLookup(params: CustomerLookupParams) {\n let customer: Customer;\n\n switch (params.by) {\n case 'uuid': {\n customer = await this.getCustomer(params.value);\n break;\n }\n case 'external_id': {\n const result = await this.listCustomers({ external_id: params.value });\n if (result.entries.length === 0) {\n throw new ChartMogulCliError(`No customer found with external_id: ${params.value}`, 404);\n }\n customer = result.entries[0];\n break;\n }\n case 'email': {\n const result = await this.searchCustomers(params.value);\n if (result.entries.length === 0) {\n throw new ChartMogulCliError(`No customer found with email: ${params.value}`, 404);\n }\n customer = result.entries[0];\n break;\n }\n case 'name': {\n const result = await this.listCustomers();\n const match = result.entries.find(\n (c) => c.name?.toLowerCase() === params.value.toLowerCase()\n );\n if (!match) {\n throw new ChartMogulCliError(`No customer found with name: ${params.value}`, 404);\n }\n customer = match;\n break;\n }\n }\n\n const subscriptions = await this.getCustomerSubscriptions(customer.uuid);\n\n return {\n customer,\n subscriptions: subscriptions.entries,\n };\n }\n\n async listActivitiesEnriched(\n params: ActivityListParams = {}\n ): Promise<CursorPaginatedResponse<EnrichedActivity>> {\n const activities = await this.listActivities(params);\n\n const uniqueCustomerUuids = [\n ...new Set(activities.entries.map((a) => a['customer-uuid']).filter(Boolean)),\n ];\n\n const customers = await this.getCustomersBatch(uniqueCustomerUuids);\n const customerMap = new Map(customers.map((c) => [c.uuid, c]));\n\n const enrichedEntries: EnrichedActivity[] = activities.entries.map((activity) => {\n const customer = customerMap.get(activity['customer-uuid']);\n const customerSince = customer?.['customer-since'] ?? customer?.customer_since;\n const tenureMonths = customerSince\n ? calculateTenureMonths(activity.date, customerSince)\n : undefined;\n\n return {\n ...activity,\n 'customer-since': customerSince,\n 'customer-tenure-months': tenureMonths,\n };\n });\n\n return {\n ...activities,\n entries: enrichedEntries,\n };\n }\n}\n\nexport const client = new ChartMogulClient();\n","import { handleChartMogulError } from './errors.js';\n\nexport function withErrorHandling<T extends unknown[], R>(\n fn: (...args: T) => Promise<R>\n): (...args: T) => Promise<void> {\n return async (...args: T) => {\n try {\n await fn(...args);\n } catch (error) {\n handleChartMogulError(error);\n }\n };\n}\n","import { Command } from 'commander';\nimport { client } from '../lib/api-client.js';\nimport { outputJson } from '../lib/output.js';\nimport { withErrorHandling } from '../lib/command-utils.js';\n\nexport function createAccountCommand(): Command {\n const cmd = new Command('account').description('Account operations');\n\n cmd\n .command('view')\n .description('View account details')\n .action(\n withErrorHandling(async () => {\n const account = await client.getAccount();\n outputJson(account);\n })\n );\n\n return cmd;\n}\n","import { Command } from 'commander';\nimport { client } from '../lib/api-client.js';\nimport { config } from '../lib/config.js';\nimport { outputJson } from '../lib/output.js';\nimport { withErrorHandling } from '../lib/command-utils.js';\n\nexport function createDataSourcesCommand(): Command {\n const cmd = new Command('data-sources').description('Data source operations');\n\n cmd\n .command('list')\n .description('List all data sources')\n .action(\n withErrorHandling(async () => {\n const result = await client.listDataSources();\n outputJson(result.data_sources);\n })\n );\n\n cmd\n .command('view')\n .description('View a data source')\n .argument('<uuid>', 'Data source UUID')\n .action(\n withErrorHandling(async (uuid: string) => {\n const dataSource = await client.getDataSource(uuid);\n outputJson(dataSource);\n })\n );\n\n cmd\n .command('set-default')\n .description('Set default data source for filtering')\n .argument('<uuid>', 'Data source UUID')\n .action(\n withErrorHandling(async (uuid: string) => {\n config.setDefaultDataSource(uuid);\n outputJson({ message: `Default data source set to ${uuid}` });\n })\n );\n\n cmd\n .command('get-default')\n .description('Get default data source')\n .action(\n withErrorHandling(async () => {\n const defaultDs = config.getDefaultDataSource();\n outputJson({ default_data_source: defaultDs || null });\n })\n );\n\n return cmd;\n}\n","import { Command } from 'commander';\nimport { client, resolveCustomerLookup } from '../lib/api-client.js';\nimport { config } from '../lib/config.js';\nimport { outputJson } from '../lib/output.js';\nimport { withErrorHandling } from '../lib/command-utils.js';\n\nexport function createCustomersCommand(): Command {\n const cmd = new Command('customers').description('Customer queries');\n\n cmd\n .command('list')\n .description('List customers')\n .option('--data-source <uuid>', 'Filter by data source UUID')\n .option('--status <status>', 'Filter by status (Lead, Active, Cancelled)')\n .option('--external-id <id>', 'Filter by external ID')\n .option('--page <number>', 'Page number')\n .option('--per-page <number>', 'Results per page (max 200)')\n .action(\n withErrorHandling(\n async (options: {\n dataSource?: string;\n status?: string;\n externalId?: string;\n page?: string;\n perPage?: string;\n }) => {\n const result = await client.listCustomers({\n data_source_uuid: options.dataSource || config.getDefaultDataSource(),\n status: options.status,\n external_id: options.externalId,\n page: options.page ? parseInt(options.page, 10) : undefined,\n per_page: options.perPage ? parseInt(options.perPage, 10) : undefined,\n });\n outputJson(result);\n }\n )\n );\n\n cmd\n .command('view')\n .description('View a customer')\n .argument('<uuid>', 'ChartMogul customer UUID (cus_xxx format)')\n .action(\n withErrorHandling(async (uuid: string) => {\n const customer = await client.getCustomer(uuid);\n outputJson(customer);\n })\n );\n\n cmd\n .command('search')\n .description('Search customers by email')\n .requiredOption('--email <email>', 'Email address to search')\n .action(\n withErrorHandling(async (options: { email: string }) => {\n const result = await client.searchCustomers(options.email);\n outputJson(result.entries);\n })\n );\n\n cmd\n .command('activities')\n .description('List customer activities')\n .argument('<uuid>', 'Customer UUID')\n .option('--page <number>', 'Page number')\n .option('--per-page <number>', 'Results per page')\n .action(\n withErrorHandling(async (uuid: string, options: { page?: string; perPage?: string }) => {\n const result = await client.getCustomerActivities(uuid, {\n page: options.page ? parseInt(options.page, 10) : undefined,\n per_page: options.perPage ? parseInt(options.perPage, 10) : undefined,\n });\n outputJson(result);\n })\n );\n\n cmd\n .command('lookup')\n .description('Look up a customer with subscriptions by UUID, email, external ID, or name')\n .option('--uuid <uuid>', 'Customer UUID')\n .option('--email <email>', 'Customer email address')\n .option('--external-id <id>', 'Customer external ID')\n .option('--name <name>', 'Customer name')\n .action(\n withErrorHandling(\n async (options: { uuid?: string; email?: string; externalId?: string; name?: string }) => {\n const lookup = resolveCustomerLookup(options);\n if (!lookup) {\n throw new Error('Provide one of --uuid, --email, --external-id, or --name');\n }\n\n const result = await client.customerLookup(lookup);\n outputJson(result);\n }\n )\n );\n\n cmd\n .command('subscriptions')\n .description('List customer subscriptions')\n .argument('<uuid>', 'Customer UUID')\n .action(\n withErrorHandling(async (uuid: string) => {\n const result = await client.getCustomerSubscriptions(uuid);\n outputJson(result.entries);\n })\n );\n\n return cmd;\n}\n","import { Command } from 'commander';\nimport { client } from '../lib/api-client.js';\nimport { config } from '../lib/config.js';\nimport { outputJson } from '../lib/output.js';\nimport { withErrorHandling } from '../lib/command-utils.js';\n\nexport function createPlansCommand(): Command {\n const cmd = new Command('plans').description('Plan queries');\n\n cmd\n .command('list')\n .description('List plans')\n .option('--data-source <uuid>', 'Filter by data source UUID')\n .option('--page <number>', 'Page number')\n .option('--per-page <number>', 'Results per page')\n .action(\n withErrorHandling(\n async (options: { dataSource?: string; page?: string; perPage?: string }) => {\n const result = await client.listPlans({\n data_source_uuid: options.dataSource || config.getDefaultDataSource(),\n page: options.page ? parseInt(options.page, 10) : undefined,\n per_page: options.perPage ? parseInt(options.perPage, 10) : undefined,\n });\n outputJson(result);\n }\n )\n );\n\n cmd\n .command('view')\n .description('View a plan')\n .argument('<uuid>', 'Plan UUID')\n .action(\n withErrorHandling(async (uuid: string) => {\n const plan = await client.getPlan(uuid);\n outputJson(plan);\n })\n );\n\n return cmd;\n}\n","import { Command } from 'commander';\nimport { client } from '../lib/api-client.js';\nimport { config } from '../lib/config.js';\nimport { outputJson } from '../lib/output.js';\nimport { withErrorHandling } from '../lib/command-utils.js';\n\nexport function createInvoicesCommand(): Command {\n const cmd = new Command('invoices').description('Invoice queries');\n\n cmd\n .command('list')\n .description('List invoices')\n .option('--customer <uuid>', 'Filter by customer UUID')\n .option('--data-source <uuid>', 'Filter by data source UUID')\n .option('--external-id <id>', 'Filter by external ID')\n .option('--page <number>', 'Page number')\n .option('--per-page <number>', 'Results per page')\n .action(\n withErrorHandling(\n async (options: {\n customer?: string;\n dataSource?: string;\n externalId?: string;\n page?: string;\n perPage?: string;\n }) => {\n const result = await client.listInvoices({\n customer_uuid: options.customer,\n data_source_uuid: options.dataSource || config.getDefaultDataSource(),\n external_id: options.externalId,\n page: options.page ? parseInt(options.page, 10) : undefined,\n per_page: options.perPage ? parseInt(options.perPage, 10) : undefined,\n });\n outputJson(result);\n }\n )\n );\n\n cmd\n .command('view')\n .description('View an invoice')\n .argument('<uuid>', 'Invoice UUID')\n .action(\n withErrorHandling(async (uuid: string) => {\n const invoice = await client.getInvoice(uuid);\n outputJson(invoice);\n })\n );\n\n return cmd;\n}\n","import { Command } from 'commander';\nimport { client } from '../lib/api-client.js';\nimport { outputJson } from '../lib/output.js';\nimport { withErrorHandling } from '../lib/command-utils.js';\nimport { getDefaultDateRange, parseDate } from '../lib/dates.js';\n\ninterface MetricOptions {\n startDate?: string;\n endDate?: string;\n interval?: string;\n}\n\nfunction buildMetricParams(options: MetricOptions) {\n const defaults = getDefaultDateRange();\n return {\n 'start-date': options.startDate ? parseDate(options.startDate) : defaults.startDate,\n 'end-date': options.endDate ? parseDate(options.endDate) : defaults.endDate,\n interval: options.interval,\n };\n}\n\nexport function createMetricsCommand(): Command {\n const cmd = new Command('metrics').description('Metrics and analytics');\n\n cmd\n .command('all')\n .description('Get all key metrics')\n .option('--start-date <date>', 'Start date (YYYY-MM-DD)')\n .option('--end-date <date>', 'End date (YYYY-MM-DD)')\n .option('--interval <interval>', 'Interval (day, week, month, quarter)')\n .action(\n withErrorHandling(async (options: MetricOptions) => {\n const result = await client.getAllMetrics(buildMetricParams(options));\n outputJson(result);\n })\n );\n\n cmd\n .command('mrr')\n .description('Get Monthly Recurring Revenue')\n .option('--start-date <date>', 'Start date (YYYY-MM-DD)')\n .option('--end-date <date>', 'End date (YYYY-MM-DD)')\n .option('--interval <interval>', 'Interval (day, week, month, quarter)')\n .action(\n withErrorHandling(async (options: MetricOptions) => {\n const result = await client.getMrr(buildMetricParams(options));\n outputJson(result);\n })\n );\n\n cmd\n .command('arr')\n .description('Get Annual Recurring Revenue')\n .option('--start-date <date>', 'Start date (YYYY-MM-DD)')\n .option('--end-date <date>', 'End date (YYYY-MM-DD)')\n .option('--interval <interval>', 'Interval (day, week, month, quarter)')\n .action(\n withErrorHandling(async (options: MetricOptions) => {\n const result = await client.getArr(buildMetricParams(options));\n outputJson(result);\n })\n );\n\n cmd\n .command('arpa')\n .description('Get Average Revenue Per Account')\n .option('--start-date <date>', 'Start date (YYYY-MM-DD)')\n .option('--end-date <date>', 'End date (YYYY-MM-DD)')\n .option('--interval <interval>', 'Interval (day, week, month, quarter)')\n .action(\n withErrorHandling(async (options: MetricOptions) => {\n const result = await client.getArpa(buildMetricParams(options));\n outputJson(result);\n })\n );\n\n cmd\n .command('asp')\n .description('Get Average Sale Price')\n .option('--start-date <date>', 'Start date (YYYY-MM-DD)')\n .option('--end-date <date>', 'End date (YYYY-MM-DD)')\n .option('--interval <interval>', 'Interval (day, week, month, quarter)')\n .action(\n withErrorHandling(async (options: MetricOptions) => {\n const result = await client.getAsp(buildMetricParams(options));\n outputJson(result);\n })\n );\n\n cmd\n .command('customer-count')\n .description('Get customer count over time')\n .option('--start-date <date>', 'Start date (YYYY-MM-DD)')\n .option('--end-date <date>', 'End date (YYYY-MM-DD)')\n .option('--interval <interval>', 'Interval (day, week, month, quarter)')\n .action(\n withErrorHandling(async (options: MetricOptions) => {\n const result = await client.getCustomerCount(buildMetricParams(options));\n outputJson(result);\n })\n );\n\n cmd\n .command('customer-churn')\n .description('Get customer churn rate')\n .option('--start-date <date>', 'Start date (YYYY-MM-DD)')\n .option('--end-date <date>', 'End date (YYYY-MM-DD)')\n .option('--interval <interval>', 'Interval (day, week, month, quarter)')\n .action(\n withErrorHandling(async (options: MetricOptions) => {\n const result = await client.getCustomerChurnRate(buildMetricParams(options));\n outputJson(result);\n })\n );\n\n cmd\n .command('mrr-churn')\n .description('Get MRR churn rate')\n .option('--start-date <date>', 'Start date (YYYY-MM-DD)')\n .option('--end-date <date>', 'End date (YYYY-MM-DD)')\n .option('--interval <interval>', 'Interval (day, week, month, quarter)')\n .action(\n withErrorHandling(async (options: MetricOptions) => {\n const result = await client.getMrrChurnRate(buildMetricParams(options));\n outputJson(result);\n })\n );\n\n cmd\n .command('ltv')\n .description('Get Customer Lifetime Value')\n .option('--start-date <date>', 'Start date (YYYY-MM-DD)')\n .option('--end-date <date>', 'End date (YYYY-MM-DD)')\n .option('--interval <interval>', 'Interval (day, week, month, quarter)')\n .action(\n withErrorHandling(async (options: MetricOptions) => {\n const result = await client.getLtv(buildMetricParams(options));\n outputJson(result);\n })\n );\n\n return cmd;\n}\n","import dayjs from 'dayjs';\nimport { ChartMogulCliError } from './errors.js';\n\nexport function parseDate(input: string): string {\n const d = dayjs(input);\n if (!d.isValid()) {\n throw new ChartMogulCliError(`Invalid date: ${input}`, 400);\n }\n return d.format('YYYY-MM-DD');\n}\n\nexport function getDefaultDateRange(): { startDate: string; endDate: string } {\n return {\n startDate: dayjs().subtract(30, 'day').format('YYYY-MM-DD'),\n endDate: dayjs().format('YYYY-MM-DD'),\n };\n}\n","import { Command } from 'commander';\nimport { client } from '../lib/api-client.js';\nimport { outputJson } from '../lib/output.js';\nimport { withErrorHandling } from '../lib/command-utils.js';\n\nexport function createActivitiesCommand(): Command {\n const cmd = new Command('activities').description('Activity operations');\n\n cmd\n .command('list')\n .description('List activities')\n .option('--start-date <date>', 'Start date (YYYY-MM-DD)')\n .option('--end-date <date>', 'End date (YYYY-MM-DD)')\n .option('--type <type>', 'Activity type (new_biz, expansion, contraction, churn, reactivation)')\n .option('--cursor <cursor>', 'Cursor for next page (from previous response)')\n .option('--per-page <number>', 'Results per page')\n .option('--enrich', 'Include customer tenure data (customer-since, customer-tenure-months)')\n .action(\n withErrorHandling(\n async (options: {\n startDate?: string;\n endDate?: string;\n type?: string;\n cursor?: string;\n perPage?: string;\n enrich?: boolean;\n }) => {\n const params = {\n 'start-date': options.startDate,\n 'end-date': options.endDate,\n type: options.type,\n cursor: options.cursor,\n 'per-page': options.perPage ? parseInt(options.perPage, 10) : undefined,\n };\n const result = options.enrich\n ? await client.listActivitiesEnriched(params)\n : await client.listActivities(params);\n outputJson(result);\n }\n )\n );\n\n return cmd;\n}\n","import { Command } from 'commander';\nimport { runMcpServer } from '../mcp/server.js';\n\nexport function createMcpCommand(): Command {\n const cmd = new Command('mcp').description('Run ChartMogul MCP server');\n\n cmd.action(async () => {\n await runMcpServer();\n });\n\n return cmd;\n}\n","import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';\nimport { z } from 'zod';\nimport { client, resolveCustomerLookup } from '../lib/api-client.js';\nimport { auth } from '../lib/auth.js';\nimport { convertCentsToDollars } from '../lib/utils.js';\n\nconst toolRegistry = [\n { name: 'get_all_metrics', description: 'Get all revenue metrics (MRR, ARR, ARPA, churn rates, LTV, customer count) for a date range' },\n { name: 'get_mrr', description: 'Get Monthly Recurring Revenue (MRR) for a date range' },\n { name: 'get_arr', description: 'Get Annual Recurring Revenue (ARR) for a date range' },\n { name: 'get_arpa', description: 'Get Average Revenue Per Account (ARPA) for a date range' },\n { name: 'get_asp', description: 'Get Average Sale Price (ASP) for a date range' },\n { name: 'get_customer_count', description: 'Get customer count over a date range' },\n { name: 'get_customer_churn_rate', description: 'Get customer churn rate for a date range' },\n { name: 'get_mrr_churn_rate', description: 'Get MRR churn rate for a date range' },\n { name: 'get_ltv', description: 'Get Customer Lifetime Value (LTV) for a date range' },\n { name: 'list_activities', description: 'List subscription activities (new business, expansion, contraction, churn)' },\n { name: 'search_customers', description: 'Search for customers by email address' },\n { name: 'get_customer', description: 'Get detailed information about a specific customer by ChartMogul UUID (cus_xxx). For Stripe IDs, use list_customers with externalId.' },\n { name: 'get_customers_batch', description: 'Get detailed information about multiple customers in one call' },\n { name: 'get_customer_activities', description: 'Get subscription activities for a specific customer' },\n { name: 'get_customer_subscriptions', description: 'Get active subscriptions for a specific customer' },\n { name: 'list_customers', description: 'List all customers with optional filtering by status, external ID, or data source' },\n { name: 'list_invoices', description: 'List invoices with optional filtering by customer, data source, or external ID' },\n { name: 'get_invoice', description: 'Get detailed information about a specific invoice' },\n { name: 'list_plans', description: 'List subscription plans with optional filtering by data source' },\n { name: 'get_plan', description: 'Get detailed information about a specific plan' },\n { name: 'list_data_sources', description: 'List all configured data sources' },\n { name: 'get_data_source', description: 'Get detailed information about a specific data source' },\n { name: 'get_account', description: 'Get ChartMogul account information' },\n { name: 'check_auth', description: 'Check if ChartMogul authentication is configured' },\n { name: 'customer_lookup', description: 'Look up a customer with subscriptions by UUID, email, external ID, or name in a single call' },\n];\n\nconst server = new McpServer({\n name: 'chartmogul',\n version: '1.0.0',\n});\n\nfunction jsonResponse(data: unknown) {\n const converted = convertCentsToDollars(data);\n return { content: [{ type: 'text' as const, text: JSON.stringify(converted, null, 2) }] };\n}\n\nconst dateRangeSchema = {\n startDate: z.string().describe('Start date (YYYY-MM-DD)'),\n endDate: z.string().describe('End date (YYYY-MM-DD)'),\n interval: z\n .enum(['day', 'week', 'month', 'quarter'])\n .optional()\n .describe('Aggregation interval'),\n};\n\nserver.tool(\n 'get_all_metrics',\n 'Get all revenue metrics (MRR, ARR, ARPA, churn rates, LTV, customer count) for a date range',\n {\n startDate: dateRangeSchema.startDate,\n endDate: dateRangeSchema.endDate,\n interval: dateRangeSchema.interval,\n },\n async ({ startDate, endDate, interval }) =>\n jsonResponse(await client.getAllMetrics({ 'start-date': startDate, 'end-date': endDate, interval }))\n);\n\nserver.tool(\n 'get_mrr',\n 'Get Monthly Recurring Revenue (MRR) for a date range',\n {\n startDate: dateRangeSchema.startDate,\n endDate: dateRangeSchema.endDate,\n interval: dateRangeSchema.interval,\n },\n async ({ startDate, endDate, interval }) =>\n jsonResponse(await client.getMrr({ 'start-date': startDate, 'end-date': endDate, interval }))\n);\n\nserver.tool(\n 'get_arr',\n 'Get Annual Recurring Revenue (ARR) for a date range',\n {\n startDate: dateRangeSchema.startDate,\n endDate: dateRangeSchema.endDate,\n interval: dateRangeSchema.interval,\n },\n async ({ startDate, endDate, interval }) =>\n jsonResponse(await client.getArr({ 'start-date': startDate, 'end-date': endDate, interval }))\n);\n\nserver.tool(\n 'get_customer_churn_rate',\n 'Get customer churn rate for a date range',\n {\n startDate: dateRangeSchema.startDate,\n endDate: dateRangeSchema.endDate,\n interval: dateRangeSchema.interval,\n },\n async ({ startDate, endDate, interval }) =>\n jsonResponse(await client.getCustomerChurnRate({ 'start-date': startDate, 'end-date': endDate, interval }))\n);\n\nserver.tool(\n 'get_mrr_churn_rate',\n 'Get MRR churn rate for a date range',\n {\n startDate: dateRangeSchema.startDate,\n endDate: dateRangeSchema.endDate,\n interval: dateRangeSchema.interval,\n },\n async ({ startDate, endDate, interval }) =>\n jsonResponse(await client.getMrrChurnRate({ 'start-date': startDate, 'end-date': endDate, interval }))\n);\n\nserver.tool(\n 'get_arpa',\n 'Get Average Revenue Per Account (ARPA) for a date range',\n {\n startDate: dateRangeSchema.startDate,\n endDate: dateRangeSchema.endDate,\n interval: dateRangeSchema.interval,\n },\n async ({ startDate, endDate, interval }) =>\n jsonResponse(await client.getArpa({ 'start-date': startDate, 'end-date': endDate, interval }))\n);\n\nserver.tool(\n 'get_asp',\n 'Get Average Sale Price (ASP) for a date range',\n {\n startDate: dateRangeSchema.startDate,\n endDate: dateRangeSchema.endDate,\n interval: dateRangeSchema.interval,\n },\n async ({ startDate, endDate, interval }) =>\n jsonResponse(await client.getAsp({ 'start-date': startDate, 'end-date': endDate, interval }))\n);\n\nserver.tool(\n 'get_customer_count',\n 'Get customer count over a date range',\n {\n startDate: dateRangeSchema.startDate,\n endDate: dateRangeSchema.endDate,\n interval: dateRangeSchema.interval,\n },\n async ({ startDate, endDate, interval }) =>\n jsonResponse(await client.getCustomerCount({ 'start-date': startDate, 'end-date': endDate, interval }))\n);\n\nserver.tool(\n 'get_ltv',\n 'Get Customer Lifetime Value (LTV) for a date range',\n {\n startDate: dateRangeSchema.startDate,\n endDate: dateRangeSchema.endDate,\n interval: dateRangeSchema.interval,\n },\n async ({ startDate, endDate, interval }) =>\n jsonResponse(await client.getLtv({ 'start-date': startDate, 'end-date': endDate, interval }))\n);\n\nserver.tool(\n 'list_activities',\n 'List subscription activities (new business, expansion, contraction, churn)',\n {\n startDate: z.string().optional().describe('Start date (YYYY-MM-DD)'),\n endDate: z.string().optional().describe('End date (YYYY-MM-DD)'),\n type: z\n .enum(['new-biz', 'expansion', 'contraction', 'churn', 'reactivation'])\n .optional()\n .describe('Activity type filter'),\n cursor: z.string().optional().describe('Cursor for next page (from previous response)'),\n perPage: z.number().optional().describe('Results per page'),\n enrich: z.boolean().optional().describe('Include customer tenure data (customer-since, customer-tenure-months)'),\n },\n async ({ startDate, endDate, type, cursor, perPage, enrich }) => {\n const params = { 'start-date': startDate, 'end-date': endDate, type, cursor, 'per-page': perPage };\n const result = enrich\n ? await client.listActivitiesEnriched(params)\n : await client.listActivities(params);\n return jsonResponse(result);\n }\n);\n\nserver.tool(\n 'search_customers',\n 'Search for customers by email address',\n { email: z.string().describe('Email address to search for') },\n async ({ email }) => jsonResponse(await client.searchCustomers(email))\n);\n\nserver.tool(\n 'get_customer',\n 'Get detailed information about a specific customer by ChartMogul UUID (cus_xxx). For Stripe IDs, use list_customers with externalId.',\n { uuid: z.string().describe('ChartMogul customer UUID (cus_xxx format). Slug IDs from ChartMogul URLs won\\'t work — use list_customers with external_id for Stripe customer IDs instead.') },\n async ({ uuid }) => jsonResponse(await client.getCustomer(uuid))\n);\n\nserver.tool(\n 'get_customers_batch',\n 'Get detailed information about multiple customers in one call',\n { uuids: z.array(z.string()).describe('Array of customer UUIDs') },\n async ({ uuids }) => jsonResponse(await client.getCustomersBatch(uuids))\n);\n\nserver.tool(\n 'get_customer_activities',\n 'Get subscription activities for a specific customer',\n {\n uuid: z.string().describe('Customer UUID'),\n page: z.number().optional().describe('Page number'),\n perPage: z.number().optional().describe('Results per page'),\n },\n async ({ uuid, page, perPage }) =>\n jsonResponse(await client.getCustomerActivities(uuid, { page, per_page: perPage }))\n);\n\nserver.tool(\n 'get_customer_subscriptions',\n 'Get active subscriptions for a specific customer',\n { uuid: z.string().describe('Customer UUID') },\n async ({ uuid }) => jsonResponse(await client.getCustomerSubscriptions(uuid))\n);\n\nserver.tool(\n 'list_customers',\n 'List all customers with optional filtering by status, external ID, or data source',\n {\n status: z.enum(['Lead', 'Active', 'Past Due', 'Cancelled']).optional().describe('Customer status'),\n externalId: z.string().optional().describe('Filter by external ID'),\n dataSourceUuid: z.string().optional().describe('Filter by data source UUID'),\n page: z.number().optional().describe('Page number'),\n perPage: z.number().optional().describe('Results per page'),\n },\n async ({ status, externalId, dataSourceUuid, page, perPage }) =>\n jsonResponse(await client.listCustomers({ status, external_id: externalId, data_source_uuid: dataSourceUuid, page, per_page: perPage }))\n);\n\nserver.tool(\n 'list_invoices',\n 'List invoices with optional filtering by customer, data source, or external ID',\n {\n customerUuid: z.string().optional().describe('Filter by customer UUID'),\n dataSourceUuid: z.string().optional().describe('Filter by data source UUID'),\n externalId: z.string().optional().describe('Filter by external ID'),\n page: z.number().optional().describe('Page number'),\n perPage: z.number().optional().describe('Results per page'),\n },\n async ({ customerUuid, dataSourceUuid, externalId, page, perPage }) =>\n jsonResponse(await client.listInvoices({ customer_uuid: customerUuid, data_source_uuid: dataSourceUuid, external_id: externalId, page, per_page: perPage }))\n);\n\nserver.tool(\n 'get_invoice',\n 'Get detailed information about a specific invoice',\n { uuid: z.string().describe('Invoice UUID') },\n async ({ uuid }) => jsonResponse(await client.getInvoice(uuid))\n);\n\nserver.tool(\n 'list_plans',\n 'List subscription plans with optional filtering by data source',\n {\n dataSourceUuid: z.string().optional().describe('Filter by data source UUID'),\n page: z.number().optional().describe('Page number'),\n perPage: z.number().optional().describe('Results per page'),\n },\n async ({ dataSourceUuid, page, perPage }) =>\n jsonResponse(await client.listPlans({ data_source_uuid: dataSourceUuid, page, per_page: perPage }))\n);\n\nserver.tool(\n 'get_plan',\n 'Get detailed information about a specific plan',\n { uuid: z.string().describe('Plan UUID') },\n async ({ uuid }) => jsonResponse(await client.getPlan(uuid))\n);\n\nserver.tool(\n 'list_data_sources',\n 'List all configured data sources',\n {},\n async () => jsonResponse(await client.listDataSources())\n);\n\nserver.tool(\n 'get_data_source',\n 'Get detailed information about a specific data source',\n { uuid: z.string().describe('Data source UUID') },\n async ({ uuid }) => jsonResponse(await client.getDataSource(uuid))\n);\n\nserver.tool(\n 'get_account',\n 'Get ChartMogul account information',\n {},\n async () => jsonResponse(await client.getAccount())\n);\n\nserver.tool(\n 'check_auth',\n 'Check if ChartMogul authentication is configured',\n {},\n async () => jsonResponse({ authenticated: auth.isAuthenticated() })\n);\n\nserver.tool(\n 'customer_lookup',\n 'Look up a customer with subscriptions by UUID, email, external ID, or name in a single call',\n {\n uuid: z.string().optional().describe('Customer UUID (highest priority)'),\n externalId: z.string().optional().describe('Customer external ID'),\n email: z.string().optional().describe('Customer email address'),\n name: z.string().optional().describe('Customer name (lowest priority, client-side filtered)'),\n },\n async ({ uuid, externalId, email, name }) => {\n const lookup = resolveCustomerLookup({ uuid, externalId, email, name });\n if (!lookup) {\n return jsonResponse({ error: 'Provide one of: uuid, externalId, email, or name' });\n }\n\n return jsonResponse(await client.customerLookup(lookup));\n }\n);\n\nserver.tool(\n 'search_tools',\n 'Search for available tools by name or description using regex. Returns matching tool names.',\n {\n query: z.string().describe('Regex pattern to match against tool names and descriptions (case-insensitive)'),\n },\n async ({ query }) => {\n try {\n const pattern = new RegExp(query, 'i');\n const matches = toolRegistry.filter((t) => pattern.test(t.name) || pattern.test(t.description));\n return jsonResponse({ tools: matches });\n } catch {\n return jsonResponse({ error: 'Invalid regex pattern' });\n }\n }\n);\n\nexport async function runMcpServer() {\n const transport = new StdioServerTransport();\n await server.connect(transport);\n}\n"],"mappings":"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","names":["Command","Command","Command","Command","Command","Command","Command","Command","Command","Command","Command","Command","Command","Command","Command","Command","Command","Command"]}
|