amplitude-cli 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (44) hide show
  1. package/README.md +123 -0
  2. package/dist/commands/auth.d.ts +6 -0
  3. package/dist/commands/auth.js +133 -0
  4. package/dist/commands/auth.js.map +1 -0
  5. package/dist/commands/charts.d.ts +6 -0
  6. package/dist/commands/charts.js +136 -0
  7. package/dist/commands/charts.js.map +1 -0
  8. package/dist/commands/cohorts.d.ts +6 -0
  9. package/dist/commands/cohorts.js +79 -0
  10. package/dist/commands/cohorts.js.map +1 -0
  11. package/dist/commands/dashboards.d.ts +6 -0
  12. package/dist/commands/dashboards.js +76 -0
  13. package/dist/commands/dashboards.js.map +1 -0
  14. package/dist/commands/events.d.ts +6 -0
  15. package/dist/commands/events.js +46 -0
  16. package/dist/commands/events.js.map +1 -0
  17. package/dist/commands/experiments.d.ts +6 -0
  18. package/dist/commands/experiments.js +57 -0
  19. package/dist/commands/experiments.js.map +1 -0
  20. package/dist/commands/query.d.ts +6 -0
  21. package/dist/commands/query.js +227 -0
  22. package/dist/commands/query.js.map +1 -0
  23. package/dist/commands/users.d.ts +6 -0
  24. package/dist/commands/users.js +49 -0
  25. package/dist/commands/users.js.map +1 -0
  26. package/dist/index.d.ts +11 -0
  27. package/dist/index.js +34 -0
  28. package/dist/index.js.map +1 -0
  29. package/dist/mcp-client.d.ts +90 -0
  30. package/dist/mcp-client.js +291 -0
  31. package/dist/mcp-client.js.map +1 -0
  32. package/dist/utils/errors.d.ts +4 -0
  33. package/dist/utils/errors.js +34 -0
  34. package/dist/utils/errors.js.map +1 -0
  35. package/dist/utils/format.d.ts +10 -0
  36. package/dist/utils/format.js +90 -0
  37. package/dist/utils/format.js.map +1 -0
  38. package/dist/utils/mcp-helpers.d.ts +13 -0
  39. package/dist/utils/mcp-helpers.js +49 -0
  40. package/dist/utils/mcp-helpers.js.map +1 -0
  41. package/dist/utils/oauth.d.ts +62 -0
  42. package/dist/utils/oauth.js +344 -0
  43. package/dist/utils/oauth.js.map +1 -0
  44. package/package.json +30 -0
package/README.md ADDED
@@ -0,0 +1,123 @@
1
+ # amplitude-cli (`amp`)
2
+
3
+ CLI for querying Amplitude analytics data via Amplitude's MCP server. OAuth only — single auth method, no API keys needed. Designed for AI agents (OpenClaw) and humans alike.
4
+
5
+ ## Install
6
+
7
+ ```bash
8
+ npm install -g amplitude-cli
9
+ ```
10
+
11
+ ## Authentication
12
+
13
+ All commands use OAuth (via Amplitude's MCP server). Two ways to authenticate:
14
+
15
+ ### Option 1: Environment variable (recommended for agents)
16
+
17
+ Set `AMPLITUDE_ACCESS_TOKEN` — typically injected via Nango/OpenClaw:
18
+
19
+ ```bash
20
+ export AMPLITUDE_ACCESS_TOKEN="your-oauth-token"
21
+ ```
22
+
23
+ #### OpenClaw integration
24
+
25
+ In `~/.openclaw/openclaw.json`:
26
+
27
+ ```json
28
+ {
29
+ "skills": {
30
+ "entries": {
31
+ "amplitude": {
32
+ "enabled": true,
33
+ "env": {
34
+ "AMPLITUDE_ACCESS_TOKEN": "your-nango-token"
35
+ }
36
+ }
37
+ }
38
+ }
39
+ }
40
+ ```
41
+
42
+ ### Option 2: Interactive login (for humans)
43
+
44
+ ```bash
45
+ amp auth login # opens browser for OAuth
46
+ amp auth login --region eu
47
+ ```
48
+
49
+ Tokens are saved to `~/.amplituderc` and auto-refreshed.
50
+
51
+ ## Usage
52
+
53
+ ```bash
54
+ # Auth
55
+ amp auth status # check connection
56
+ amp auth tools # list available MCP tools
57
+
58
+ # Events
59
+ amp events list # list all event types
60
+ amp events list -s "purchase" # search events
61
+ amp events props "page_view" # get properties for an event
62
+
63
+ # Segmentation
64
+ amp query segment -e "page_view" --from 2026-01-01 --to 2026-03-01
65
+ amp query segment -e "purchase" --from 2026-01-01 --to 2026-03-01 -m totals -g "user:platform"
66
+
67
+ # Funnels
68
+ amp query funnel -e signup onboarding purchase --from 2026-01-01 --to 2026-03-01
69
+
70
+ # Retention
71
+ amp query retention --start-event signup --return-event _active --from 2026-01-01 --to 2026-03-01
72
+
73
+ # Revenue
74
+ amp query revenue --from 2026-01-01 --to 2026-03-01 -m arpu
75
+
76
+ # Charts
77
+ amp charts search "DAU" # search charts
78
+ amp charts get abc123 # get chart definition
79
+ amp charts query abc123 # get chart data
80
+ amp charts create --definition '{}' --save --name "My Chart"
81
+
82
+ # Dashboards
83
+ amp dashboards search "KPIs"
84
+ amp dashboards get abc123
85
+ amp dashboards create --name "Weekly KPIs" --definition '[...]'
86
+
87
+ # Users
88
+ amp users search "user@example.com"
89
+ amp users activity 12345678
90
+
91
+ # Cohorts
92
+ amp cohorts list
93
+ amp cohorts get abc123
94
+
95
+ # Experiments
96
+ amp experiments search "onboarding"
97
+ amp experiments get abc123
98
+ amp experiments results abc123
99
+
100
+ # Output formats
101
+ amp query segment -e "signup" --from 2026-01-01 --to 2026-03-01 -f csv > signups.csv
102
+ amp query segment -e "purchase" --from 2026-01-01 --to 2026-03-01 -f compact | jq '.data'
103
+ ```
104
+
105
+ ## Output Formats
106
+
107
+ All commands support `-f` / `--format`:
108
+
109
+ - `json` — pretty-printed (default)
110
+ - `compact` — single-line JSON (for piping)
111
+ - `csv` — CSV output
112
+
113
+ ## Architecture
114
+
115
+ ```
116
+ amp CLI → Amplitude MCP server (OAuth)
117
+ ```
118
+
119
+ Single transport, single auth method. The CLI is a thin layer over Amplitude's MCP server, which handles all analytics queries, chart creation, dashboard management, and more.
120
+
121
+ ## License
122
+
123
+ MIT
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Auth commands — login (OAuth), status, logout, tools listing.
3
+ * OAuth is the only auth method — via Nango (managed) or interactive login.
4
+ */
5
+ import { Command } from "commander";
6
+ export declare function registerAuthCommands(program: Command): void;
@@ -0,0 +1,133 @@
1
+ /**
2
+ * Auth commands — login (OAuth), status, logout, tools listing.
3
+ * OAuth is the only auth method — via Nango (managed) or interactive login.
4
+ */
5
+ import { AmplitudeMcpClient } from "../mcp-client.js";
6
+ import { login, logout, getOAuthConfig } from "../utils/oauth.js";
7
+ import { output } from "../utils/format.js";
8
+ import { extractMcpText } from "../utils/mcp-helpers.js";
9
+ import { handleError } from "../utils/errors.js";
10
+ export function registerAuthCommands(program) {
11
+ const auth = program.command("auth").description("Authentication utilities");
12
+ // ─── OAuth login (interactive) ──────────────────────────────────────
13
+ auth
14
+ .command("login")
15
+ .description("Log in to Amplitude via OAuth (opens browser)")
16
+ .option("--region <region>", "Region: us or eu", "us")
17
+ .action(async (opts) => {
18
+ try {
19
+ const oauthConfig = await login(opts.region);
20
+ console.error(`\nRegion: ${oauthConfig.region}`);
21
+ console.error(`Scopes: ${oauthConfig.tokens.scope || "mcp:read mcp:write offline_access"}`);
22
+ // Verify by getting context
23
+ try {
24
+ const mcp = new AmplitudeMcpClient(oauthConfig.region);
25
+ const ctx = await mcp.getContext();
26
+ const text = ctx.content?.[0]?.text;
27
+ if (text) {
28
+ console.error(`\nProject context:\n${text.slice(0, 200)}`);
29
+ }
30
+ }
31
+ catch {
32
+ console.error("\n(Could not verify MCP connection — tokens saved anyway)");
33
+ }
34
+ }
35
+ catch (err) {
36
+ if (err instanceof Error) {
37
+ console.error(`\nLogin failed: ${err.message}`);
38
+ process.exit(1);
39
+ }
40
+ throw err;
41
+ }
42
+ });
43
+ // ─── Logout ─────────────────────────────────────────────────────────
44
+ auth
45
+ .command("logout")
46
+ .description("Revoke OAuth tokens and log out")
47
+ .action(async () => {
48
+ try {
49
+ await logout();
50
+ }
51
+ catch (err) {
52
+ if (err instanceof Error) {
53
+ console.error(`Logout error: ${err.message}`);
54
+ process.exit(1);
55
+ }
56
+ throw err;
57
+ }
58
+ });
59
+ // ─── Status ─────────────────────────────────────────────────────────
60
+ auth
61
+ .command("status")
62
+ .description("Show authentication status")
63
+ .option("-f, --format <format>", "Output format: json, compact, csv", "json")
64
+ .action(async (opts) => {
65
+ const status = {
66
+ authenticated: false,
67
+ source: null,
68
+ region: null,
69
+ };
70
+ // Check env var (managed environment — Nango)
71
+ if (process.env.AMPLITUDE_ACCESS_TOKEN || process.env.AMPLITUDE_OAUTH_TOKEN) {
72
+ console.error("✓ OAuth: token injected via environment (Nango/managed)");
73
+ status.authenticated = true;
74
+ status.source = "env";
75
+ // Try to get context to verify
76
+ try {
77
+ const mcp = new AmplitudeMcpClient();
78
+ const ctx = await mcp.getContext();
79
+ const text = ctx.content?.[0]?.text;
80
+ if (text) {
81
+ console.error(` Context: ${text.slice(0, 150)}`);
82
+ status.context = extractMcpText(ctx);
83
+ }
84
+ }
85
+ catch (err) {
86
+ console.error(" ⚠ Token present but MCP connection failed");
87
+ status.verified = false;
88
+ }
89
+ }
90
+ else {
91
+ // Check config file (interactive login)
92
+ const oauth = getOAuthConfig();
93
+ if (oauth?.tokens?.access_token) {
94
+ const expired = oauth.tokens.expires_at && Date.now() > oauth.tokens.expires_at;
95
+ const hasRefresh = !!oauth.tokens.refresh_token;
96
+ if (expired && !hasRefresh) {
97
+ console.error("✗ OAuth: token expired (run 'amp auth login')");
98
+ status.authenticated = false;
99
+ status.expired = true;
100
+ }
101
+ else {
102
+ console.error(`✓ OAuth: logged in (region: ${oauth.region})${expired ? " (will auto-refresh)" : ""}`);
103
+ console.error(` Scopes: ${oauth.tokens.scope || "unknown"}`);
104
+ status.authenticated = true;
105
+ status.source = "config";
106
+ status.region = oauth.region;
107
+ status.scopes = oauth.tokens.scope;
108
+ }
109
+ }
110
+ else {
111
+ console.error("✗ Not authenticated");
112
+ console.error(" Set AMPLITUDE_ACCESS_TOKEN env var, or run 'amp auth login'");
113
+ }
114
+ }
115
+ output(status, opts.format);
116
+ });
117
+ // ─── MCP tools listing ──────────────────────────────────────────────
118
+ auth
119
+ .command("tools")
120
+ .description("List available MCP tools")
121
+ .option("-f, --format <format>", "Output format: json, compact, csv", "json")
122
+ .action(async (opts) => {
123
+ try {
124
+ const mcp = new AmplitudeMcpClient();
125
+ const result = await mcp.listTools();
126
+ output(result, opts.format);
127
+ }
128
+ catch (err) {
129
+ handleError(err);
130
+ }
131
+ });
132
+ }
133
+ //# sourceMappingURL=auth.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.js","sourceRoot":"","sources":["../../src/commands/auth.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Chart commands — search, create, query, and manage Amplitude charts.
3
+ * All via MCP server (OAuth).
4
+ */
5
+ import { Command } from "commander";
6
+ export declare function registerChartCommands(program: Command): void;
@@ -0,0 +1,136 @@
1
+ /**
2
+ * Chart commands — search, create, query, and manage Amplitude charts.
3
+ * All via MCP server (OAuth).
4
+ */
5
+ import { AmplitudeMcpClient } from "../mcp-client.js";
6
+ import { output } from "../utils/format.js";
7
+ import { extractMcpText, extractEditId } from "../utils/mcp-helpers.js";
8
+ import { handleError } from "../utils/errors.js";
9
+ export function registerChartCommands(program) {
10
+ const charts = program
11
+ .command("charts")
12
+ .description("Create and manage Amplitude charts");
13
+ charts
14
+ .command("search <query>")
15
+ .description("Search for existing charts in Amplitude")
16
+ .option("--limit <n>", "Max results", "10")
17
+ .option("-f, --format <format>", "Output format: json, compact, csv", "json")
18
+ .action(async (query, opts) => {
19
+ try {
20
+ const mcp = new AmplitudeMcpClient();
21
+ const result = await mcp.search(query, ["CHART"], parseInt(opts.limit));
22
+ output(extractMcpText(result), opts.format);
23
+ }
24
+ catch (err) {
25
+ handleError(err);
26
+ }
27
+ });
28
+ charts
29
+ .command("get <chart-id...>")
30
+ .description("Get full chart definitions by ID")
31
+ .option("-f, --format <format>", "Output format: json, compact, csv", "json")
32
+ .action(async (chartIds, opts) => {
33
+ try {
34
+ const mcp = new AmplitudeMcpClient();
35
+ const result = await mcp.getCharts(chartIds);
36
+ output(extractMcpText(result), opts.format);
37
+ }
38
+ catch (err) {
39
+ handleError(err);
40
+ }
41
+ });
42
+ charts
43
+ .command("query <chart-id>")
44
+ .description("Query data from an existing chart")
45
+ .option("-f, --format <format>", "Output format: json, compact, csv", "json")
46
+ .action(async (chartId, opts) => {
47
+ try {
48
+ const mcp = new AmplitudeMcpClient();
49
+ const result = await mcp.queryChart(chartId);
50
+ output(extractMcpText(result), opts.format);
51
+ }
52
+ catch (err) {
53
+ handleError(err);
54
+ }
55
+ });
56
+ charts
57
+ .command("create")
58
+ .description("Create a chart from a JSON definition (reads from stdin or --definition)")
59
+ .option("--definition <json>", "Chart definition as JSON string")
60
+ .option("--name <name>", "Chart name (required for save)")
61
+ .option("--description <desc>", "Chart description")
62
+ .option("--save", "Save the chart after creation", false)
63
+ .option("-f, --format <format>", "Output format: json, compact, csv", "json")
64
+ .action(async (opts) => {
65
+ try {
66
+ let definition;
67
+ if (opts.definition) {
68
+ definition = JSON.parse(opts.definition);
69
+ }
70
+ else {
71
+ const chunks = [];
72
+ for await (const chunk of process.stdin) {
73
+ chunks.push(chunk);
74
+ }
75
+ definition = JSON.parse(Buffer.concat(chunks).toString("utf-8"));
76
+ }
77
+ const mcp = new AmplitudeMcpClient();
78
+ console.error("Querying dataset...");
79
+ const result = await mcp.queryDataset(definition);
80
+ const resultText = extractMcpText(result);
81
+ if (opts.save && opts.name) {
82
+ const editId = extractEditId(resultText);
83
+ if (editId) {
84
+ console.error(`Saving chart as "${opts.name}"...`);
85
+ const saveResult = await mcp.saveChart(editId, opts.name, opts.description);
86
+ output(extractMcpText(saveResult), opts.format);
87
+ }
88
+ else {
89
+ console.error("Warning: Could not extract editId. Chart not saved.");
90
+ output(resultText, opts.format);
91
+ }
92
+ }
93
+ else {
94
+ output(resultText, opts.format);
95
+ if (!opts.save) {
96
+ console.error("\nChart previewed but not saved. Use --save --name 'Name' to save.");
97
+ }
98
+ }
99
+ }
100
+ catch (err) {
101
+ handleError(err);
102
+ }
103
+ });
104
+ charts
105
+ .command("discover <query>")
106
+ .description("Discover events, custom events, and their properties")
107
+ .option("--type <types>", "Entity types (comma-separated)", "EVENT,CUSTOM_EVENT")
108
+ .option("--limit <n>", "Max results", "20")
109
+ .option("-f, --format <format>", "Output format: json, compact, csv", "json")
110
+ .action(async (query, opts) => {
111
+ try {
112
+ const mcp = new AmplitudeMcpClient();
113
+ const entityTypes = opts.type.split(",").map((t) => t.trim());
114
+ const result = await mcp.search(query, entityTypes, parseInt(opts.limit));
115
+ output(extractMcpText(result), opts.format);
116
+ }
117
+ catch (err) {
118
+ handleError(err);
119
+ }
120
+ });
121
+ charts
122
+ .command("event-props <event-type>")
123
+ .description("Get all properties for an event type")
124
+ .option("-f, --format <format>", "Output format: json, compact, csv", "json")
125
+ .action(async (eventType, opts) => {
126
+ try {
127
+ const mcp = new AmplitudeMcpClient();
128
+ const result = await mcp.getEventProperties(eventType);
129
+ output(extractMcpText(result), opts.format);
130
+ }
131
+ catch (err) {
132
+ handleError(err);
133
+ }
134
+ });
135
+ }
136
+ //# sourceMappingURL=charts.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"charts.js","sourceRoot":"","sources":["../../src/commands/charts.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Cohort commands — list, get, create.
3
+ * Uses MCP tools: search, get_cohorts, create_cohort.
4
+ */
5
+ import { Command } from "commander";
6
+ export declare function registerCohortCommands(program: Command): void;
@@ -0,0 +1,79 @@
1
+ /**
2
+ * Cohort commands — list, get, create.
3
+ * Uses MCP tools: search, get_cohorts, create_cohort.
4
+ */
5
+ import { AmplitudeMcpClient } from "../mcp-client.js";
6
+ import { output } from "../utils/format.js";
7
+ import { extractMcpText } from "../utils/mcp-helpers.js";
8
+ import { handleError } from "../utils/errors.js";
9
+ export function registerCohortCommands(program) {
10
+ const cohorts = program
11
+ .command("cohorts")
12
+ .description("Manage and inspect cohorts");
13
+ cohorts
14
+ .command("list")
15
+ .description("List cohorts in the project")
16
+ .option("-s, --search <query>", "Search cohorts by name", "")
17
+ .option("--limit <n>", "Max results", "20")
18
+ .option("-f, --format <format>", "Output format: json, compact, csv", "json")
19
+ .action(async (opts) => {
20
+ try {
21
+ const mcp = new AmplitudeMcpClient();
22
+ const query = opts.search || "*";
23
+ const result = await mcp.search(query, ["COHORT"], parseInt(opts.limit));
24
+ output(extractMcpText(result), opts.format);
25
+ }
26
+ catch (err) {
27
+ handleError(err);
28
+ }
29
+ });
30
+ cohorts
31
+ .command("get <cohort-id...>")
32
+ .description("Get cohort definitions by ID")
33
+ .option("-f, --format <format>", "Output format: json, compact, csv", "json")
34
+ .action(async (cohortIds, opts) => {
35
+ try {
36
+ const mcp = new AmplitudeMcpClient();
37
+ const result = await mcp.callTool("get_cohorts", {
38
+ cohort_ids: cohortIds,
39
+ });
40
+ output(extractMcpText(result), opts.format);
41
+ }
42
+ catch (err) {
43
+ handleError(err);
44
+ }
45
+ });
46
+ cohorts
47
+ .command("create")
48
+ .description("Create a cohort from a JSON definition (reads from stdin or --definition)")
49
+ .requiredOption("--name <name>", "Cohort name")
50
+ .option("--description <desc>", "Cohort description")
51
+ .option("--definition <json>", "Cohort definition as JSON string")
52
+ .option("-f, --format <format>", "Output format: json, compact, csv", "json")
53
+ .action(async (opts) => {
54
+ try {
55
+ let definition;
56
+ if (opts.definition) {
57
+ definition = JSON.parse(opts.definition);
58
+ }
59
+ else {
60
+ const chunks = [];
61
+ for await (const chunk of process.stdin) {
62
+ chunks.push(chunk);
63
+ }
64
+ definition = JSON.parse(Buffer.concat(chunks).toString("utf-8"));
65
+ }
66
+ const mcp = new AmplitudeMcpClient();
67
+ const result = await mcp.callTool("create_cohort", {
68
+ name: opts.name,
69
+ ...(opts.description ? { description: opts.description } : {}),
70
+ ...definition,
71
+ });
72
+ output(extractMcpText(result), opts.format);
73
+ }
74
+ catch (err) {
75
+ handleError(err);
76
+ }
77
+ });
78
+ }
79
+ //# sourceMappingURL=cohorts.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cohorts.js","sourceRoot":"","sources":["../../src/commands/cohorts.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Dashboard commands — search, create, and manage Amplitude dashboards.
3
+ * All via MCP server (OAuth).
4
+ */
5
+ import { Command } from "commander";
6
+ export declare function registerDashboardCommands(program: Command): void;
@@ -0,0 +1,76 @@
1
+ /**
2
+ * Dashboard commands — search, create, and manage Amplitude dashboards.
3
+ * All via MCP server (OAuth).
4
+ */
5
+ import { AmplitudeMcpClient } from "../mcp-client.js";
6
+ import { output } from "../utils/format.js";
7
+ import { extractMcpText } from "../utils/mcp-helpers.js";
8
+ import { handleError } from "../utils/errors.js";
9
+ export function registerDashboardCommands(program) {
10
+ const dashboards = program
11
+ .command("dashboards")
12
+ .description("Create and manage Amplitude dashboards");
13
+ dashboards
14
+ .command("search <query>")
15
+ .description("Search for existing dashboards")
16
+ .option("--limit <n>", "Max results", "10")
17
+ .option("-f, --format <format>", "Output format: json, compact, csv", "json")
18
+ .action(async (query, opts) => {
19
+ try {
20
+ const mcp = new AmplitudeMcpClient();
21
+ const result = await mcp.search(query, ["DASHBOARD"], parseInt(opts.limit));
22
+ output(extractMcpText(result), opts.format);
23
+ }
24
+ catch (err) {
25
+ handleError(err);
26
+ }
27
+ });
28
+ dashboards
29
+ .command("get <dashboard-id>")
30
+ .description("Get full dashboard definition and contents")
31
+ .option("-f, --format <format>", "Output format: json, compact, csv", "json")
32
+ .action(async (dashboardId, opts) => {
33
+ try {
34
+ const mcp = new AmplitudeMcpClient();
35
+ const result = await mcp.getDashboard(dashboardId);
36
+ output(extractMcpText(result), opts.format);
37
+ }
38
+ catch (err) {
39
+ handleError(err);
40
+ }
41
+ });
42
+ dashboards
43
+ .command("create")
44
+ .description("Create a dashboard from a JSON definition (reads from stdin or --definition)")
45
+ .requiredOption("--name <name>", "Dashboard name")
46
+ .option("--description <desc>", "Dashboard description")
47
+ .option("--definition <json>", "Dashboard rows/layout as JSON string")
48
+ .option("-f, --format <format>", "Output format: json, compact, csv", "json")
49
+ .action(async (opts) => {
50
+ try {
51
+ let rows;
52
+ if (opts.definition) {
53
+ rows = JSON.parse(opts.definition);
54
+ }
55
+ else {
56
+ const chunks = [];
57
+ for await (const chunk of process.stdin) {
58
+ chunks.push(chunk);
59
+ }
60
+ rows = JSON.parse(Buffer.concat(chunks).toString("utf-8"));
61
+ }
62
+ if (!Array.isArray(rows)) {
63
+ console.error("Error: Dashboard definition must be a JSON array of rows.");
64
+ process.exit(1);
65
+ }
66
+ const mcp = new AmplitudeMcpClient();
67
+ console.error(`Creating dashboard "${opts.name}"...`);
68
+ const result = await mcp.createDashboard(opts.name, rows, opts.description);
69
+ output(extractMcpText(result), opts.format);
70
+ }
71
+ catch (err) {
72
+ handleError(err);
73
+ }
74
+ });
75
+ }
76
+ //# sourceMappingURL=dashboards.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dashboards.js","sourceRoot":"","sources":["../../src/commands/dashboards.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Event discovery commands — list events, get properties.
3
+ * All queries go through the Amplitude MCP server (OAuth).
4
+ */
5
+ import { Command } from "commander";
6
+ export declare function registerEventCommands(program: Command): void;