@stephendolan/chartmogul-cli 1.0.2 → 1.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cli.js +149 -3
- package/dist/cli.js.map +1 -1
- package/package.json +4 -2
package/dist/cli.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
#!/usr/bin/env bun
|
|
2
2
|
|
|
3
3
|
// src/cli.ts
|
|
4
|
-
import { Command as
|
|
4
|
+
import { Command as Command10 } from "commander";
|
|
5
5
|
|
|
6
6
|
// src/lib/utils.ts
|
|
7
7
|
function centsToDollars(cents) {
|
|
@@ -633,9 +633,154 @@ function createActivitiesCommand() {
|
|
|
633
633
|
return cmd;
|
|
634
634
|
}
|
|
635
635
|
|
|
636
|
+
// src/commands/mcp.ts
|
|
637
|
+
import { Command as Command9 } from "commander";
|
|
638
|
+
|
|
639
|
+
// src/mcp/server.ts
|
|
640
|
+
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
641
|
+
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
|
|
642
|
+
import { z } from "zod";
|
|
643
|
+
var server = new McpServer({
|
|
644
|
+
name: "chartmogul",
|
|
645
|
+
version: "1.0.0"
|
|
646
|
+
});
|
|
647
|
+
function jsonResponse(data) {
|
|
648
|
+
return { content: [{ type: "text", text: JSON.stringify(data, null, 2) }] };
|
|
649
|
+
}
|
|
650
|
+
var dateRangeSchema = {
|
|
651
|
+
startDate: z.string().describe("Start date (YYYY-MM-DD)"),
|
|
652
|
+
endDate: z.string().describe("End date (YYYY-MM-DD)"),
|
|
653
|
+
interval: z.enum(["day", "week", "month", "quarter"]).optional().describe("Aggregation interval")
|
|
654
|
+
};
|
|
655
|
+
server.tool(
|
|
656
|
+
"get_all_metrics",
|
|
657
|
+
"Get all revenue metrics (MRR, ARR, ARPA, churn rates, LTV, customer count) for a date range",
|
|
658
|
+
{
|
|
659
|
+
startDate: dateRangeSchema.startDate,
|
|
660
|
+
endDate: dateRangeSchema.endDate,
|
|
661
|
+
interval: dateRangeSchema.interval
|
|
662
|
+
},
|
|
663
|
+
async ({ startDate, endDate, interval }) => jsonResponse(await client.getAllMetrics({ "start-date": startDate, "end-date": endDate, interval }))
|
|
664
|
+
);
|
|
665
|
+
server.tool(
|
|
666
|
+
"get_mrr",
|
|
667
|
+
"Get Monthly Recurring Revenue (MRR) for a date range",
|
|
668
|
+
{
|
|
669
|
+
startDate: dateRangeSchema.startDate,
|
|
670
|
+
endDate: dateRangeSchema.endDate,
|
|
671
|
+
interval: dateRangeSchema.interval
|
|
672
|
+
},
|
|
673
|
+
async ({ startDate, endDate, interval }) => jsonResponse(await client.getMrr({ "start-date": startDate, "end-date": endDate, interval }))
|
|
674
|
+
);
|
|
675
|
+
server.tool(
|
|
676
|
+
"get_arr",
|
|
677
|
+
"Get Annual Recurring Revenue (ARR) for a date range",
|
|
678
|
+
{
|
|
679
|
+
startDate: dateRangeSchema.startDate,
|
|
680
|
+
endDate: dateRangeSchema.endDate,
|
|
681
|
+
interval: dateRangeSchema.interval
|
|
682
|
+
},
|
|
683
|
+
async ({ startDate, endDate, interval }) => jsonResponse(await client.getArr({ "start-date": startDate, "end-date": endDate, interval }))
|
|
684
|
+
);
|
|
685
|
+
server.tool(
|
|
686
|
+
"get_customer_churn_rate",
|
|
687
|
+
"Get customer churn rate for a date range",
|
|
688
|
+
{
|
|
689
|
+
startDate: dateRangeSchema.startDate,
|
|
690
|
+
endDate: dateRangeSchema.endDate,
|
|
691
|
+
interval: dateRangeSchema.interval
|
|
692
|
+
},
|
|
693
|
+
async ({ startDate, endDate, interval }) => jsonResponse(await client.getCustomerChurnRate({ "start-date": startDate, "end-date": endDate, interval }))
|
|
694
|
+
);
|
|
695
|
+
server.tool(
|
|
696
|
+
"get_mrr_churn_rate",
|
|
697
|
+
"Get MRR churn rate for a date range",
|
|
698
|
+
{
|
|
699
|
+
startDate: dateRangeSchema.startDate,
|
|
700
|
+
endDate: dateRangeSchema.endDate,
|
|
701
|
+
interval: dateRangeSchema.interval
|
|
702
|
+
},
|
|
703
|
+
async ({ startDate, endDate, interval }) => jsonResponse(await client.getMrrChurnRate({ "start-date": startDate, "end-date": endDate, interval }))
|
|
704
|
+
);
|
|
705
|
+
server.tool(
|
|
706
|
+
"list_activities",
|
|
707
|
+
"List subscription activities (new business, expansion, contraction, churn)",
|
|
708
|
+
{
|
|
709
|
+
startDate: z.string().optional().describe("Start date (YYYY-MM-DD)"),
|
|
710
|
+
endDate: z.string().optional().describe("End date (YYYY-MM-DD)"),
|
|
711
|
+
type: z.enum(["new-biz", "expansion", "contraction", "churn", "reactivation"]).optional().describe("Activity type filter"),
|
|
712
|
+
page: z.number().optional().describe("Page number"),
|
|
713
|
+
perPage: z.number().optional().describe("Results per page")
|
|
714
|
+
},
|
|
715
|
+
async ({ startDate, endDate, type, page, perPage }) => jsonResponse(await client.listActivities({ "start-date": startDate, "end-date": endDate, type, page, per_page: perPage }))
|
|
716
|
+
);
|
|
717
|
+
server.tool(
|
|
718
|
+
"search_customers",
|
|
719
|
+
"Search for customers by email address",
|
|
720
|
+
{ email: z.string().describe("Email address to search for") },
|
|
721
|
+
async ({ email }) => jsonResponse(await client.searchCustomers(email))
|
|
722
|
+
);
|
|
723
|
+
server.tool(
|
|
724
|
+
"get_customer",
|
|
725
|
+
"Get detailed information about a specific customer",
|
|
726
|
+
{ uuid: z.string().describe("Customer UUID") },
|
|
727
|
+
async ({ uuid }) => jsonResponse(await client.getCustomer(uuid))
|
|
728
|
+
);
|
|
729
|
+
server.tool(
|
|
730
|
+
"get_customer_activities",
|
|
731
|
+
"Get subscription activities for a specific customer",
|
|
732
|
+
{
|
|
733
|
+
uuid: z.string().describe("Customer UUID"),
|
|
734
|
+
page: z.number().optional().describe("Page number"),
|
|
735
|
+
perPage: z.number().optional().describe("Results per page")
|
|
736
|
+
},
|
|
737
|
+
async ({ uuid, page, perPage }) => jsonResponse(await client.getCustomerActivities(uuid, { page, per_page: perPage }))
|
|
738
|
+
);
|
|
739
|
+
server.tool(
|
|
740
|
+
"get_customer_subscriptions",
|
|
741
|
+
"Get active subscriptions for a specific customer",
|
|
742
|
+
{ uuid: z.string().describe("Customer UUID") },
|
|
743
|
+
async ({ uuid }) => jsonResponse(await client.getCustomerSubscriptions(uuid))
|
|
744
|
+
);
|
|
745
|
+
server.tool(
|
|
746
|
+
"list_customers",
|
|
747
|
+
"List all customers with optional filtering",
|
|
748
|
+
{
|
|
749
|
+
status: z.enum(["Lead", "Active", "Past Due", "Cancelled"]).optional().describe("Customer status"),
|
|
750
|
+
page: z.number().optional().describe("Page number"),
|
|
751
|
+
perPage: z.number().optional().describe("Results per page")
|
|
752
|
+
},
|
|
753
|
+
async ({ status, page, perPage }) => jsonResponse(await client.listCustomers({ status, page, per_page: perPage }))
|
|
754
|
+
);
|
|
755
|
+
server.tool(
|
|
756
|
+
"get_account",
|
|
757
|
+
"Get ChartMogul account information",
|
|
758
|
+
{},
|
|
759
|
+
async () => jsonResponse(await client.getAccount())
|
|
760
|
+
);
|
|
761
|
+
server.tool(
|
|
762
|
+
"check_auth",
|
|
763
|
+
"Check if ChartMogul authentication is configured",
|
|
764
|
+
{},
|
|
765
|
+
async () => jsonResponse({ authenticated: auth.isAuthenticated() })
|
|
766
|
+
);
|
|
767
|
+
async function runMcpServer() {
|
|
768
|
+
const transport = new StdioServerTransport();
|
|
769
|
+
await server.connect(transport);
|
|
770
|
+
}
|
|
771
|
+
|
|
772
|
+
// src/commands/mcp.ts
|
|
773
|
+
function createMcpCommand() {
|
|
774
|
+
const cmd = new Command9("mcp").description("Run ChartMogul MCP server");
|
|
775
|
+
cmd.action(async () => {
|
|
776
|
+
await runMcpServer();
|
|
777
|
+
});
|
|
778
|
+
return cmd;
|
|
779
|
+
}
|
|
780
|
+
|
|
636
781
|
// src/cli.ts
|
|
637
|
-
var version = true ? "1.0
|
|
638
|
-
var program = new
|
|
782
|
+
var version = true ? "1.1.0" : "0.0.0-dev";
|
|
783
|
+
var program = new Command10();
|
|
639
784
|
program.name("chartmogul").description("A command-line interface for ChartMogul analytics").version(version).option("-c, --compact", "Minified JSON output (single line)").hook("preAction", (thisCommand) => {
|
|
640
785
|
const options = thisCommand.opts();
|
|
641
786
|
setOutputOptions({
|
|
@@ -650,6 +795,7 @@ program.addCommand(createPlansCommand());
|
|
|
650
795
|
program.addCommand(createInvoicesCommand());
|
|
651
796
|
program.addCommand(createMetricsCommand());
|
|
652
797
|
program.addCommand(createActivitiesCommand());
|
|
798
|
+
program.addCommand(createMcpCommand());
|
|
653
799
|
program.parseAsync().catch(() => {
|
|
654
800
|
process.exit(1);
|
|
655
801
|
});
|
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"],"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';\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());\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 '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\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[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 CustomerListResponse,\n PaginatedResponse,\n} from '../types/index.js';\n\nconst API_BASE = 'https://api.chartmogul.com/v1';\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 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(\n params: {\n 'start-date'?: string;\n 'end-date'?: string;\n type?: string;\n page?: number;\n per_page?: number;\n } = {}\n ) {\n return this.request<PaginatedResponse<Activity>>('GET', '/activities', { params });\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('--page <number>', 'Page number')\n .option('--per-page <number>', 'Results per page')\n .action(\n withErrorHandling(\n async (options: {\n startDate?: string;\n endDate?: string;\n type?: string;\n page?: string;\n perPage?: string;\n }) => {\n const result = await client.listActivities({\n 'start-date': options.startDate,\n 'end-date': options.endDate,\n type: options.type,\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 return cmd;\n}\n"],"mappings":"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","names":["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 '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\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[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 CustomerListResponse,\n PaginatedResponse,\n} from '../types/index.js';\n\nconst API_BASE = 'https://api.chartmogul.com/v1';\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 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(\n params: {\n 'start-date'?: string;\n 'end-date'?: string;\n type?: string;\n page?: number;\n per_page?: number;\n } = {}\n ) {\n return this.request<PaginatedResponse<Activity>>('GET', '/activities', { params });\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('--page <number>', 'Page number')\n .option('--per-page <number>', 'Results per page')\n .action(\n withErrorHandling(\n async (options: {\n startDate?: string;\n endDate?: string;\n type?: string;\n page?: string;\n perPage?: string;\n }) => {\n const result = await client.listActivities({\n 'start-date': options.startDate,\n 'end-date': options.endDate,\n type: options.type,\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 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';\n\nconst server = new McpServer({\n name: 'chartmogul',\n version: '1.0.0',\n});\n\nfunction jsonResponse(data: unknown) {\n return { content: [{ type: 'text' as const, text: JSON.stringify(data, 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 '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 page: z.number().optional().describe('Page number'),\n perPage: z.number().optional().describe('Results per page'),\n },\n async ({ startDate, endDate, type, page, perPage }) =>\n jsonResponse(await client.listActivities({ 'start-date': startDate, 'end-date': endDate, type, page, per_page: perPage }))\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_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',\n {\n status: z.enum(['Lead', 'Active', 'Past Due', 'Cancelled']).optional().describe('Customer status'),\n page: z.number().optional().describe('Page number'),\n perPage: z.number().optional().describe('Results per page'),\n },\n async ({ status, page, perPage }) =>\n jsonResponse(await client.listCustomers({ status, page, per_page: perPage }))\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\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"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@stephendolan/chartmogul-cli",
|
|
3
|
-
"version": "1.0
|
|
3
|
+
"version": "1.1.0",
|
|
4
4
|
"description": "A command-line interface for ChartMogul analytics",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/cli.js",
|
|
@@ -49,10 +49,12 @@
|
|
|
49
49
|
"LICENSE"
|
|
50
50
|
],
|
|
51
51
|
"dependencies": {
|
|
52
|
+
"@modelcontextprotocol/sdk": "^1.12.0",
|
|
52
53
|
"@napi-rs/keyring": "^1.2.0",
|
|
53
54
|
"commander": "^12.0.0",
|
|
54
55
|
"conf": "^12.0.0",
|
|
55
|
-
"dayjs": "^1.11.19"
|
|
56
|
+
"dayjs": "^1.11.19",
|
|
57
|
+
"zod": "^3.24.0"
|
|
56
58
|
},
|
|
57
59
|
"devDependencies": {
|
|
58
60
|
"@biomejs/biome": "^1.9.4",
|