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.
- package/README.md +123 -0
- package/dist/commands/auth.d.ts +6 -0
- package/dist/commands/auth.js +133 -0
- package/dist/commands/auth.js.map +1 -0
- package/dist/commands/charts.d.ts +6 -0
- package/dist/commands/charts.js +136 -0
- package/dist/commands/charts.js.map +1 -0
- package/dist/commands/cohorts.d.ts +6 -0
- package/dist/commands/cohorts.js +79 -0
- package/dist/commands/cohorts.js.map +1 -0
- package/dist/commands/dashboards.d.ts +6 -0
- package/dist/commands/dashboards.js +76 -0
- package/dist/commands/dashboards.js.map +1 -0
- package/dist/commands/events.d.ts +6 -0
- package/dist/commands/events.js +46 -0
- package/dist/commands/events.js.map +1 -0
- package/dist/commands/experiments.d.ts +6 -0
- package/dist/commands/experiments.js +57 -0
- package/dist/commands/experiments.js.map +1 -0
- package/dist/commands/query.d.ts +6 -0
- package/dist/commands/query.js +227 -0
- package/dist/commands/query.js.map +1 -0
- package/dist/commands/users.d.ts +6 -0
- package/dist/commands/users.js +49 -0
- package/dist/commands/users.js.map +1 -0
- package/dist/index.d.ts +11 -0
- package/dist/index.js +34 -0
- package/dist/index.js.map +1 -0
- package/dist/mcp-client.d.ts +90 -0
- package/dist/mcp-client.js +291 -0
- package/dist/mcp-client.js.map +1 -0
- package/dist/utils/errors.d.ts +4 -0
- package/dist/utils/errors.js +34 -0
- package/dist/utils/errors.js.map +1 -0
- package/dist/utils/format.d.ts +10 -0
- package/dist/utils/format.js +90 -0
- package/dist/utils/format.js.map +1 -0
- package/dist/utils/mcp-helpers.d.ts +13 -0
- package/dist/utils/mcp-helpers.js +49 -0
- package/dist/utils/mcp-helpers.js.map +1 -0
- package/dist/utils/oauth.d.ts +62 -0
- package/dist/utils/oauth.js +344 -0
- package/dist/utils/oauth.js.map +1 -0
- package/package.json +30 -0
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Event discovery commands — list events, get properties.
|
|
3
|
+
* All queries go through the Amplitude 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 registerEventCommands(program) {
|
|
10
|
+
const events = program
|
|
11
|
+
.command("events")
|
|
12
|
+
.description("Discover and inspect event types");
|
|
13
|
+
events
|
|
14
|
+
.command("list")
|
|
15
|
+
.description("List event types in the project")
|
|
16
|
+
.option("-s, --search <query>", "Filter events by name")
|
|
17
|
+
.option("--limit <n>", "Max results", "50")
|
|
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, ["EVENT", "CUSTOM_EVENT"], parseInt(opts.limit));
|
|
24
|
+
const data = extractMcpText(result);
|
|
25
|
+
output(data, opts.format);
|
|
26
|
+
}
|
|
27
|
+
catch (err) {
|
|
28
|
+
handleError(err);
|
|
29
|
+
}
|
|
30
|
+
});
|
|
31
|
+
events
|
|
32
|
+
.command("props <event-type>")
|
|
33
|
+
.description("Get all properties for an event type")
|
|
34
|
+
.option("-f, --format <format>", "Output format: json, compact, csv", "json")
|
|
35
|
+
.action(async (eventType, opts) => {
|
|
36
|
+
try {
|
|
37
|
+
const mcp = new AmplitudeMcpClient();
|
|
38
|
+
const result = await mcp.getEventProperties(eventType);
|
|
39
|
+
output(extractMcpText(result), opts.format);
|
|
40
|
+
}
|
|
41
|
+
catch (err) {
|
|
42
|
+
handleError(err);
|
|
43
|
+
}
|
|
44
|
+
});
|
|
45
|
+
}
|
|
46
|
+
//# sourceMappingURL=events.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"events.js","sourceRoot":"","sources":["../../src/commands/events.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AACtD,OAAO,EAAE,MAAM,EAAqB,MAAM,oBAAoB,CAAC;AAC/D,OAAO,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AACzD,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAEjD,MAAM,UAAU,qBAAqB,CAAC,OAAgB;IACpD,MAAM,MAAM,GAAG,OAAO;SACnB,OAAO,CAAC,QAAQ,CAAC;SACjB,WAAW,CAAC,kCAAkC,CAAC,CAAC;IAEnD,MAAM;SACH,OAAO,CAAC,MAAM,CAAC;SACf,WAAW,CAAC,iCAAiC,CAAC;SAC9C,MAAM,CAAC,sBAAsB,EAAE,uBAAuB,CAAC;SACvD,MAAM,CAAC,aAAa,EAAE,aAAa,EAAE,IAAI,CAAC;SAC1C,MAAM,CAAC,uBAAuB,EAAE,mCAAmC,EAAE,MAAM,CAAC;SAC5E,MAAM,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE;QACrB,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,IAAI,kBAAkB,EAAE,CAAC;YACrC,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,IAAI,GAAG,CAAC;YACjC,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,MAAM,CAC7B,KAAK,EACL,CAAC,OAAO,EAAE,cAAc,CAAC,EACzB,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CACrB,CAAC;YACF,MAAM,IAAI,GAAG,cAAc,CAAC,MAAM,CAAC,CAAC;YACpC,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,MAAsB,CAAC,CAAC;QAC5C,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,WAAW,CAAC,GAAG,CAAC,CAAC;QACnB,CAAC;IACH,CAAC,CAAC,CAAC;IAEL,MAAM;SACH,OAAO,CAAC,oBAAoB,CAAC;SAC7B,WAAW,CAAC,sCAAsC,CAAC;SACnD,MAAM,CAAC,uBAAuB,EAAE,mCAAmC,EAAE,MAAM,CAAC;SAC5E,MAAM,CAAC,KAAK,EAAE,SAAS,EAAE,IAAI,EAAE,EAAE;QAChC,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,IAAI,kBAAkB,EAAE,CAAC;YACrC,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,kBAAkB,CAAC,SAAS,CAAC,CAAC;YACvD,MAAM,CAAC,cAAc,CAAC,MAAM,CAAC,EAAE,IAAI,CAAC,MAAsB,CAAC,CAAC;QAC9D,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,WAAW,CAAC,GAAG,CAAC,CAAC;QACnB,CAAC;IACH,CAAC,CAAC,CAAC;AACP,CAAC"}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Experiment commands — analyze A/B tests and feature flags.
|
|
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 registerExperimentCommands(program) {
|
|
10
|
+
const experiments = program
|
|
11
|
+
.command("experiments")
|
|
12
|
+
.description("Analyze experiments and feature flags");
|
|
13
|
+
experiments
|
|
14
|
+
.command("search <query>")
|
|
15
|
+
.description("Search for experiments and feature flags")
|
|
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, ["EXPERIMENT"], parseInt(opts.limit));
|
|
22
|
+
output(extractMcpText(result), opts.format);
|
|
23
|
+
}
|
|
24
|
+
catch (err) {
|
|
25
|
+
handleError(err);
|
|
26
|
+
}
|
|
27
|
+
});
|
|
28
|
+
experiments
|
|
29
|
+
.command("get <experiment-id...>")
|
|
30
|
+
.description("Get detailed experiment information")
|
|
31
|
+
.option("-f, --format <format>", "Output format: json, compact, csv", "json")
|
|
32
|
+
.action(async (experimentIds, opts) => {
|
|
33
|
+
try {
|
|
34
|
+
const mcp = new AmplitudeMcpClient();
|
|
35
|
+
const result = await mcp.getExperiments(experimentIds);
|
|
36
|
+
output(extractMcpText(result), opts.format);
|
|
37
|
+
}
|
|
38
|
+
catch (err) {
|
|
39
|
+
handleError(err);
|
|
40
|
+
}
|
|
41
|
+
});
|
|
42
|
+
experiments
|
|
43
|
+
.command("results <experiment-id>")
|
|
44
|
+
.description("Get experiment results with statistical significance")
|
|
45
|
+
.option("-f, --format <format>", "Output format: json, compact, csv", "json")
|
|
46
|
+
.action(async (experimentId, opts) => {
|
|
47
|
+
try {
|
|
48
|
+
const mcp = new AmplitudeMcpClient();
|
|
49
|
+
const result = await mcp.queryExperiment(experimentId);
|
|
50
|
+
output(extractMcpText(result), opts.format);
|
|
51
|
+
}
|
|
52
|
+
catch (err) {
|
|
53
|
+
handleError(err);
|
|
54
|
+
}
|
|
55
|
+
});
|
|
56
|
+
}
|
|
57
|
+
//# sourceMappingURL=experiments.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"experiments.js","sourceRoot":"","sources":["../../src/commands/experiments.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AACtD,OAAO,EAAE,MAAM,EAAqB,MAAM,oBAAoB,CAAC;AAC/D,OAAO,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AACzD,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAEjD,MAAM,UAAU,0BAA0B,CAAC,OAAgB;IACzD,MAAM,WAAW,GAAG,OAAO;SACxB,OAAO,CAAC,aAAa,CAAC;SACtB,WAAW,CAAC,uCAAuC,CAAC,CAAC;IAExD,WAAW;SACR,OAAO,CAAC,gBAAgB,CAAC;SACzB,WAAW,CAAC,0CAA0C,CAAC;SACvD,MAAM,CAAC,aAAa,EAAE,aAAa,EAAE,IAAI,CAAC;SAC1C,MAAM,CAAC,uBAAuB,EAAE,mCAAmC,EAAE,MAAM,CAAC;SAC5E,MAAM,CAAC,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE;QAC5B,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,IAAI,kBAAkB,EAAE,CAAC;YACrC,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,YAAY,CAAC,EAAE,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;YAC7E,MAAM,CAAC,cAAc,CAAC,MAAM,CAAC,EAAE,IAAI,CAAC,MAAsB,CAAC,CAAC;QAC9D,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,WAAW,CAAC,GAAG,CAAC,CAAC;QACnB,CAAC;IACH,CAAC,CAAC,CAAC;IAEL,WAAW;SACR,OAAO,CAAC,wBAAwB,CAAC;SACjC,WAAW,CAAC,qCAAqC,CAAC;SAClD,MAAM,CAAC,uBAAuB,EAAE,mCAAmC,EAAE,MAAM,CAAC;SAC5E,MAAM,CAAC,KAAK,EAAE,aAAa,EAAE,IAAI,EAAE,EAAE;QACpC,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,IAAI,kBAAkB,EAAE,CAAC;YACrC,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,cAAc,CAAC,aAAa,CAAC,CAAC;YACvD,MAAM,CAAC,cAAc,CAAC,MAAM,CAAC,EAAE,IAAI,CAAC,MAAsB,CAAC,CAAC;QAC9D,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,WAAW,CAAC,GAAG,CAAC,CAAC;QACnB,CAAC;IACH,CAAC,CAAC,CAAC;IAEL,WAAW;SACR,OAAO,CAAC,yBAAyB,CAAC;SAClC,WAAW,CAAC,sDAAsD,CAAC;SACnE,MAAM,CAAC,uBAAuB,EAAE,mCAAmC,EAAE,MAAM,CAAC;SAC5E,MAAM,CAAC,KAAK,EAAE,YAAY,EAAE,IAAI,EAAE,EAAE;QACnC,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,IAAI,kBAAkB,EAAE,CAAC;YACrC,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,eAAe,CAAC,YAAY,CAAC,CAAC;YACvD,MAAM,CAAC,cAAc,CAAC,MAAM,CAAC,EAAE,IAAI,CAAC,MAAsB,CAAC,CAAC;QAC9D,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,WAAW,CAAC,GAAG,CAAC,CAAC;QACnB,CAAC;IACH,CAAC,CAAC,CAAC;AACP,CAAC"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Query commands — event segmentation, funnels, retention, revenue, sessions.
|
|
3
|
+
* All queries go through the Amplitude MCP server via query_dataset.
|
|
4
|
+
*/
|
|
5
|
+
import { Command } from "commander";
|
|
6
|
+
export declare function registerQueryCommands(program: Command): void;
|
|
@@ -0,0 +1,227 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Query commands — event segmentation, funnels, retention, revenue, sessions.
|
|
3
|
+
* All queries go through the Amplitude MCP server via query_dataset.
|
|
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
|
+
/**
|
|
10
|
+
* Build a query_dataset definition for event segmentation.
|
|
11
|
+
*/
|
|
12
|
+
function buildSegmentDefinition(opts) {
|
|
13
|
+
const definition = {
|
|
14
|
+
chart_type: "LINE",
|
|
15
|
+
time_range: {
|
|
16
|
+
start: opts.from,
|
|
17
|
+
end: opts.to,
|
|
18
|
+
},
|
|
19
|
+
series: [
|
|
20
|
+
{
|
|
21
|
+
event: opts.event,
|
|
22
|
+
metric: opts.metric || "uniques",
|
|
23
|
+
...(opts.groupBy ? { group_by: parseGroupBy(opts.groupBy) } : {}),
|
|
24
|
+
...(opts.filters ? { filters: JSON.parse(opts.filters) } : {}),
|
|
25
|
+
},
|
|
26
|
+
],
|
|
27
|
+
};
|
|
28
|
+
if (opts.interval) {
|
|
29
|
+
definition.interval = intervalToString(opts.interval);
|
|
30
|
+
}
|
|
31
|
+
return definition;
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Parse group-by string: "user:platform" → { type: "user", name: "platform" }
|
|
35
|
+
*/
|
|
36
|
+
function parseGroupBy(groupBy) {
|
|
37
|
+
const parts = groupBy.split(":");
|
|
38
|
+
if (parts.length > 1) {
|
|
39
|
+
return [{ type: parts[0], name: parts.slice(1).join(":") }];
|
|
40
|
+
}
|
|
41
|
+
return [{ type: "user", name: parts[0] }];
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Map numeric interval to human-readable string for MCP.
|
|
45
|
+
*/
|
|
46
|
+
function intervalToString(interval) {
|
|
47
|
+
switch (interval) {
|
|
48
|
+
case "1": return "daily";
|
|
49
|
+
case "7": return "weekly";
|
|
50
|
+
case "30": return "monthly";
|
|
51
|
+
case "-300000": return "realtime";
|
|
52
|
+
default: return "daily";
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
export function registerQueryCommands(program) {
|
|
56
|
+
const query = program
|
|
57
|
+
.command("query")
|
|
58
|
+
.description("Run analytics queries");
|
|
59
|
+
// --- Event Segmentation ---
|
|
60
|
+
query
|
|
61
|
+
.command("segment")
|
|
62
|
+
.description("Event segmentation — count events/users over time")
|
|
63
|
+
.requiredOption("-e, --event <type>", "Event type (_active, _all, or custom)")
|
|
64
|
+
.requiredOption("--from <date>", "Start date (YYYY-MM-DD)")
|
|
65
|
+
.requiredOption("--to <date>", "End date (YYYY-MM-DD)")
|
|
66
|
+
.option("-m, --metric <metric>", "Metric: uniques, totals, avg, pctdau", "uniques")
|
|
67
|
+
.option("-i, --interval <n>", "Interval: 1 (daily), 7 (weekly), 30 (monthly)", "1")
|
|
68
|
+
.option("-g, --group-by <property>", "Group by (format: user:prop or event:prop)")
|
|
69
|
+
.option("--filters <json>", "Event filters as JSON array")
|
|
70
|
+
.option("-f, --format <format>", "Output format: json, compact, csv", "json")
|
|
71
|
+
.action(async (opts) => {
|
|
72
|
+
try {
|
|
73
|
+
const mcp = new AmplitudeMcpClient();
|
|
74
|
+
const definition = buildSegmentDefinition(opts);
|
|
75
|
+
const result = await mcp.queryDataset(definition);
|
|
76
|
+
output(extractMcpText(result), opts.format);
|
|
77
|
+
}
|
|
78
|
+
catch (err) {
|
|
79
|
+
handleError(err);
|
|
80
|
+
}
|
|
81
|
+
});
|
|
82
|
+
// --- Funnel Analysis ---
|
|
83
|
+
query
|
|
84
|
+
.command("funnel")
|
|
85
|
+
.description("Funnel analysis — conversion through event sequence")
|
|
86
|
+
.requiredOption("-e, --events <types...>", "Events in funnel order (space-separated)")
|
|
87
|
+
.requiredOption("--from <date>", "Start date (YYYY-MM-DD)")
|
|
88
|
+
.requiredOption("--to <date>", "End date (YYYY-MM-DD)")
|
|
89
|
+
.option("-g, --group-by <property>", "Group by property")
|
|
90
|
+
.option("-f, --format <format>", "Output format: json, compact, csv", "json")
|
|
91
|
+
.action(async (opts) => {
|
|
92
|
+
try {
|
|
93
|
+
const mcp = new AmplitudeMcpClient();
|
|
94
|
+
const definition = {
|
|
95
|
+
chart_type: "FUNNEL",
|
|
96
|
+
time_range: {
|
|
97
|
+
start: opts.from,
|
|
98
|
+
end: opts.to,
|
|
99
|
+
},
|
|
100
|
+
series: opts.events.map((e) => ({
|
|
101
|
+
event: e,
|
|
102
|
+
})),
|
|
103
|
+
};
|
|
104
|
+
if (opts.groupBy) {
|
|
105
|
+
definition.group_by = parseGroupBy(opts.groupBy);
|
|
106
|
+
}
|
|
107
|
+
const result = await mcp.queryDataset(definition);
|
|
108
|
+
output(extractMcpText(result), opts.format);
|
|
109
|
+
}
|
|
110
|
+
catch (err) {
|
|
111
|
+
handleError(err);
|
|
112
|
+
}
|
|
113
|
+
});
|
|
114
|
+
// --- Retention Analysis ---
|
|
115
|
+
query
|
|
116
|
+
.command("retention")
|
|
117
|
+
.description("Retention analysis — how users return over time")
|
|
118
|
+
.requiredOption("--start-event <type>", "Starting event (e.g. signup, _new)")
|
|
119
|
+
.requiredOption("--return-event <type>", "Return event (e.g. _active, purchase)")
|
|
120
|
+
.requiredOption("--from <date>", "Start date (YYYY-MM-DD)")
|
|
121
|
+
.requiredOption("--to <date>", "End date (YYYY-MM-DD)")
|
|
122
|
+
.option("-f, --format <format>", "Output format: json, compact, csv", "json")
|
|
123
|
+
.action(async (opts) => {
|
|
124
|
+
try {
|
|
125
|
+
const mcp = new AmplitudeMcpClient();
|
|
126
|
+
const definition = {
|
|
127
|
+
chart_type: "RETENTION",
|
|
128
|
+
time_range: {
|
|
129
|
+
start: opts.from,
|
|
130
|
+
end: opts.to,
|
|
131
|
+
},
|
|
132
|
+
series: [
|
|
133
|
+
{ event: opts.startEvent, role: "start" },
|
|
134
|
+
{ event: opts.returnEvent, role: "return" },
|
|
135
|
+
],
|
|
136
|
+
};
|
|
137
|
+
const result = await mcp.queryDataset(definition);
|
|
138
|
+
output(extractMcpText(result), opts.format);
|
|
139
|
+
}
|
|
140
|
+
catch (err) {
|
|
141
|
+
handleError(err);
|
|
142
|
+
}
|
|
143
|
+
});
|
|
144
|
+
// --- Chart Data ---
|
|
145
|
+
query
|
|
146
|
+
.command("chart <chart-id>")
|
|
147
|
+
.description("Get data from a saved Amplitude chart by ID")
|
|
148
|
+
.option("-f, --format <format>", "Output format: json, compact, csv", "json")
|
|
149
|
+
.action(async (chartId, opts) => {
|
|
150
|
+
try {
|
|
151
|
+
const mcp = new AmplitudeMcpClient();
|
|
152
|
+
const result = await mcp.queryChart(chartId);
|
|
153
|
+
output(extractMcpText(result), opts.format);
|
|
154
|
+
}
|
|
155
|
+
catch (err) {
|
|
156
|
+
handleError(err);
|
|
157
|
+
}
|
|
158
|
+
});
|
|
159
|
+
// --- Revenue ---
|
|
160
|
+
query
|
|
161
|
+
.command("revenue")
|
|
162
|
+
.description("Revenue analysis (LTV, ARPU, etc.)")
|
|
163
|
+
.requiredOption("--from <date>", "Start date (YYYY-MM-DD)")
|
|
164
|
+
.requiredOption("--to <date>", "End date (YYYY-MM-DD)")
|
|
165
|
+
.option("-m, --metric <type>", "Metric: total, paying, arppu, arpu, avg-revenue, ltv", "total")
|
|
166
|
+
.option("-i, --interval <n>", "Interval: 1 (daily), 7 (weekly), 30 (monthly)", "1")
|
|
167
|
+
.option("-g, --group-by <property>", "Group by property")
|
|
168
|
+
.option("-f, --format <format>", "Output format: json, compact, csv", "json")
|
|
169
|
+
.action(async (opts) => {
|
|
170
|
+
try {
|
|
171
|
+
const mcp = new AmplitudeMcpClient();
|
|
172
|
+
const definition = {
|
|
173
|
+
chart_type: "LINE",
|
|
174
|
+
time_range: {
|
|
175
|
+
start: opts.from,
|
|
176
|
+
end: opts.to,
|
|
177
|
+
},
|
|
178
|
+
series: [
|
|
179
|
+
{
|
|
180
|
+
event: "_any_revenue_event",
|
|
181
|
+
metric: opts.metric || "total",
|
|
182
|
+
...(opts.groupBy ? { group_by: parseGroupBy(opts.groupBy) } : {}),
|
|
183
|
+
},
|
|
184
|
+
],
|
|
185
|
+
};
|
|
186
|
+
if (opts.interval) {
|
|
187
|
+
definition.interval = intervalToString(opts.interval);
|
|
188
|
+
}
|
|
189
|
+
const result = await mcp.queryDataset(definition);
|
|
190
|
+
output(extractMcpText(result), opts.format);
|
|
191
|
+
}
|
|
192
|
+
catch (err) {
|
|
193
|
+
handleError(err);
|
|
194
|
+
}
|
|
195
|
+
});
|
|
196
|
+
// --- Sessions ---
|
|
197
|
+
query
|
|
198
|
+
.command("sessions")
|
|
199
|
+
.description("Session analytics")
|
|
200
|
+
.requiredOption("--from <date>", "Start date (YYYY-MM-DD)")
|
|
201
|
+
.requiredOption("--to <date>", "End date (YYYY-MM-DD)")
|
|
202
|
+
.option("-f, --format <format>", "Output format: json, compact, csv", "json")
|
|
203
|
+
.action(async (opts) => {
|
|
204
|
+
try {
|
|
205
|
+
const mcp = new AmplitudeMcpClient();
|
|
206
|
+
const definition = {
|
|
207
|
+
chart_type: "LINE",
|
|
208
|
+
time_range: {
|
|
209
|
+
start: opts.from,
|
|
210
|
+
end: opts.to,
|
|
211
|
+
},
|
|
212
|
+
series: [
|
|
213
|
+
{
|
|
214
|
+
event: "_active",
|
|
215
|
+
metric: "sessions",
|
|
216
|
+
},
|
|
217
|
+
],
|
|
218
|
+
};
|
|
219
|
+
const result = await mcp.queryDataset(definition);
|
|
220
|
+
output(extractMcpText(result), opts.format);
|
|
221
|
+
}
|
|
222
|
+
catch (err) {
|
|
223
|
+
handleError(err);
|
|
224
|
+
}
|
|
225
|
+
});
|
|
226
|
+
}
|
|
227
|
+
//# sourceMappingURL=query.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"query.js","sourceRoot":"","sources":["../../src/commands/query.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* User lookup commands — search and activity.
|
|
3
|
+
* Uses MCP get_users tool.
|
|
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 registerUserCommands(program) {
|
|
10
|
+
const users = program
|
|
11
|
+
.command("users")
|
|
12
|
+
.description("User search and activity lookup");
|
|
13
|
+
users
|
|
14
|
+
.command("search <query>")
|
|
15
|
+
.description("Search for users by user ID, device ID, or Amplitude ID")
|
|
16
|
+
.option("-f, --format <format>", "Output format: json, compact, csv", "json")
|
|
17
|
+
.action(async (query, opts) => {
|
|
18
|
+
try {
|
|
19
|
+
const mcp = new AmplitudeMcpClient();
|
|
20
|
+
const result = await mcp.callTool("get_users", {
|
|
21
|
+
user_id: query,
|
|
22
|
+
});
|
|
23
|
+
output(extractMcpText(result), opts.format);
|
|
24
|
+
}
|
|
25
|
+
catch (err) {
|
|
26
|
+
handleError(err);
|
|
27
|
+
}
|
|
28
|
+
});
|
|
29
|
+
users
|
|
30
|
+
.command("activity <amplitude-id>")
|
|
31
|
+
.description("Get event timeline for a specific user")
|
|
32
|
+
.option("--limit <n>", "Max events to return", "100")
|
|
33
|
+
.option("-f, --format <format>", "Output format: json, compact, csv", "json")
|
|
34
|
+
.action(async (amplitudeId, opts) => {
|
|
35
|
+
try {
|
|
36
|
+
const mcp = new AmplitudeMcpClient();
|
|
37
|
+
const result = await mcp.callTool("get_users", {
|
|
38
|
+
amplitude_id: amplitudeId,
|
|
39
|
+
include_events: true,
|
|
40
|
+
event_limit: parseInt(opts.limit),
|
|
41
|
+
});
|
|
42
|
+
output(extractMcpText(result), opts.format);
|
|
43
|
+
}
|
|
44
|
+
catch (err) {
|
|
45
|
+
handleError(err);
|
|
46
|
+
}
|
|
47
|
+
});
|
|
48
|
+
}
|
|
49
|
+
//# sourceMappingURL=users.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"users.js","sourceRoot":"","sources":["../../src/commands/users.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AACtD,OAAO,EAAE,MAAM,EAAqB,MAAM,oBAAoB,CAAC;AAC/D,OAAO,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AACzD,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAEjD,MAAM,UAAU,oBAAoB,CAAC,OAAgB;IACnD,MAAM,KAAK,GAAG,OAAO;SAClB,OAAO,CAAC,OAAO,CAAC;SAChB,WAAW,CAAC,iCAAiC,CAAC,CAAC;IAElD,KAAK;SACF,OAAO,CAAC,gBAAgB,CAAC;SACzB,WAAW,CAAC,yDAAyD,CAAC;SACtE,MAAM,CAAC,uBAAuB,EAAE,mCAAmC,EAAE,MAAM,CAAC;SAC5E,MAAM,CAAC,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE;QAC5B,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,IAAI,kBAAkB,EAAE,CAAC;YACrC,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,QAAQ,CAAC,WAAW,EAAE;gBAC7C,OAAO,EAAE,KAAK;aACf,CAAC,CAAC;YACH,MAAM,CAAC,cAAc,CAAC,MAAM,CAAC,EAAE,IAAI,CAAC,MAAsB,CAAC,CAAC;QAC9D,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,WAAW,CAAC,GAAG,CAAC,CAAC;QACnB,CAAC;IACH,CAAC,CAAC,CAAC;IAEL,KAAK;SACF,OAAO,CAAC,yBAAyB,CAAC;SAClC,WAAW,CAAC,wCAAwC,CAAC;SACrD,MAAM,CAAC,aAAa,EAAE,sBAAsB,EAAE,KAAK,CAAC;SACpD,MAAM,CAAC,uBAAuB,EAAE,mCAAmC,EAAE,MAAM,CAAC;SAC5E,MAAM,CAAC,KAAK,EAAE,WAAW,EAAE,IAAI,EAAE,EAAE;QAClC,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,IAAI,kBAAkB,EAAE,CAAC;YACrC,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,QAAQ,CAAC,WAAW,EAAE;gBAC7C,YAAY,EAAE,WAAW;gBACzB,cAAc,EAAE,IAAI;gBACpB,WAAW,EAAE,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC;aAClC,CAAC,CAAC;YACH,MAAM,CAAC,cAAc,CAAC,MAAM,CAAC,EAAE,IAAI,CAAC,MAAsB,CAAC,CAAC;QAC9D,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,WAAW,CAAC,GAAG,CAAC,CAAC;QACnB,CAAC;IACH,CAAC,CAAC,CAAC;AACP,CAAC"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* amplitude-cli (amp)
|
|
4
|
+
*
|
|
5
|
+
* CLI for querying and managing Amplitude analytics data.
|
|
6
|
+
* All commands go through Amplitude's MCP server (OAuth).
|
|
7
|
+
*
|
|
8
|
+
* Auth: AMPLITUDE_ACCESS_TOKEN env var (Nango) or `amp auth login` (interactive).
|
|
9
|
+
* Designed for AI agents (OpenClaw) and humans alike.
|
|
10
|
+
*/
|
|
11
|
+
export {};
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* amplitude-cli (amp)
|
|
4
|
+
*
|
|
5
|
+
* CLI for querying and managing Amplitude analytics data.
|
|
6
|
+
* All commands go through Amplitude's MCP server (OAuth).
|
|
7
|
+
*
|
|
8
|
+
* Auth: AMPLITUDE_ACCESS_TOKEN env var (Nango) or `amp auth login` (interactive).
|
|
9
|
+
* Designed for AI agents (OpenClaw) and humans alike.
|
|
10
|
+
*/
|
|
11
|
+
import { Command } from "commander";
|
|
12
|
+
import { registerAuthCommands } from "./commands/auth.js";
|
|
13
|
+
import { registerEventCommands } from "./commands/events.js";
|
|
14
|
+
import { registerQueryCommands } from "./commands/query.js";
|
|
15
|
+
import { registerUserCommands } from "./commands/users.js";
|
|
16
|
+
import { registerCohortCommands } from "./commands/cohorts.js";
|
|
17
|
+
import { registerChartCommands } from "./commands/charts.js";
|
|
18
|
+
import { registerDashboardCommands } from "./commands/dashboards.js";
|
|
19
|
+
import { registerExperimentCommands } from "./commands/experiments.js";
|
|
20
|
+
const program = new Command();
|
|
21
|
+
program
|
|
22
|
+
.name("amp")
|
|
23
|
+
.description("CLI for Amplitude analytics — query data, create charts, build dashboards, analyze experiments")
|
|
24
|
+
.version("0.3.0");
|
|
25
|
+
registerAuthCommands(program);
|
|
26
|
+
registerEventCommands(program);
|
|
27
|
+
registerQueryCommands(program);
|
|
28
|
+
registerUserCommands(program);
|
|
29
|
+
registerCohortCommands(program);
|
|
30
|
+
registerChartCommands(program);
|
|
31
|
+
registerDashboardCommands(program);
|
|
32
|
+
registerExperimentCommands(program);
|
|
33
|
+
program.parse();
|
|
34
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA;;;;;;;;GAQG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAC1D,OAAO,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAC7D,OAAO,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AAC5D,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAC3D,OAAO,EAAE,sBAAsB,EAAE,MAAM,uBAAuB,CAAC;AAC/D,OAAO,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAC7D,OAAO,EAAE,yBAAyB,EAAE,MAAM,0BAA0B,CAAC;AACrE,OAAO,EAAE,0BAA0B,EAAE,MAAM,2BAA2B,CAAC;AAEvE,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;AAE9B,OAAO;KACJ,IAAI,CAAC,KAAK,CAAC;KACX,WAAW,CACV,gGAAgG,CACjG;KACA,OAAO,CAAC,OAAO,CAAC,CAAC;AAEpB,oBAAoB,CAAC,OAAO,CAAC,CAAC;AAC9B,qBAAqB,CAAC,OAAO,CAAC,CAAC;AAC/B,qBAAqB,CAAC,OAAO,CAAC,CAAC;AAC/B,oBAAoB,CAAC,OAAO,CAAC,CAAC;AAC9B,sBAAsB,CAAC,OAAO,CAAC,CAAC;AAChC,qBAAqB,CAAC,OAAO,CAAC,CAAC;AAC/B,yBAAyB,CAAC,OAAO,CAAC,CAAC;AACnC,0BAA0B,CAAC,OAAO,CAAC,CAAC;AAEpC,OAAO,CAAC,KAAK,EAAE,CAAC"}
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Amplitude MCP client.
|
|
3
|
+
* Calls Amplitude's MCP server tools (search, query_dataset, save_chart_edits,
|
|
4
|
+
* create_dashboard, etc.) using OAuth tokens.
|
|
5
|
+
*
|
|
6
|
+
* The MCP server exposes tools via JSON-RPC over HTTP (Streamable HTTP transport).
|
|
7
|
+
*/
|
|
8
|
+
export interface McpToolResult {
|
|
9
|
+
content: Array<{
|
|
10
|
+
type: string;
|
|
11
|
+
text?: string;
|
|
12
|
+
data?: unknown;
|
|
13
|
+
}>;
|
|
14
|
+
isError?: boolean;
|
|
15
|
+
}
|
|
16
|
+
export declare class AmplitudeMcpClient {
|
|
17
|
+
private region;
|
|
18
|
+
private sessionId?;
|
|
19
|
+
private initialized;
|
|
20
|
+
constructor(region?: string);
|
|
21
|
+
/**
|
|
22
|
+
* Initialize MCP session. Must be called before any tool calls.
|
|
23
|
+
* Auto-called by callTool if not yet initialized.
|
|
24
|
+
*/
|
|
25
|
+
private ensureSession;
|
|
26
|
+
/**
|
|
27
|
+
* Call an MCP tool on the Amplitude server.
|
|
28
|
+
*/
|
|
29
|
+
callTool(toolName: string, args?: Record<string, unknown>): Promise<McpToolResult>;
|
|
30
|
+
private _callToolOnce;
|
|
31
|
+
/**
|
|
32
|
+
* Parse SSE response from MCP server.
|
|
33
|
+
*/
|
|
34
|
+
private parseSSEResponse;
|
|
35
|
+
/**
|
|
36
|
+
* List available MCP tools.
|
|
37
|
+
*/
|
|
38
|
+
listTools(): Promise<unknown>;
|
|
39
|
+
/**
|
|
40
|
+
* Search for entities (charts, dashboards, events, cohorts, etc.)
|
|
41
|
+
*/
|
|
42
|
+
search(query: string, entityTypes?: string[], limit?: number): Promise<McpToolResult>;
|
|
43
|
+
/**
|
|
44
|
+
* Get context (project info, user info).
|
|
45
|
+
*/
|
|
46
|
+
getContext(): Promise<McpToolResult>;
|
|
47
|
+
/**
|
|
48
|
+
* Get chart definitions by ID.
|
|
49
|
+
*/
|
|
50
|
+
getCharts(chartIds: string[]): Promise<McpToolResult>;
|
|
51
|
+
/**
|
|
52
|
+
* Get dashboard by ID.
|
|
53
|
+
*/
|
|
54
|
+
getDashboard(dashboardId: string): Promise<McpToolResult>;
|
|
55
|
+
/**
|
|
56
|
+
* Query a dataset (create/preview a chart).
|
|
57
|
+
* Returns data + an editId that can be saved.
|
|
58
|
+
*/
|
|
59
|
+
queryDataset(definition: Record<string, unknown>): Promise<McpToolResult>;
|
|
60
|
+
/**
|
|
61
|
+
* Save a chart from query_dataset results.
|
|
62
|
+
*/
|
|
63
|
+
saveChart(editId: string, name: string, description?: string): Promise<McpToolResult>;
|
|
64
|
+
/**
|
|
65
|
+
* Create a dashboard with charts and layout.
|
|
66
|
+
*/
|
|
67
|
+
createDashboard(name: string, rows: unknown[], description?: string): Promise<McpToolResult>;
|
|
68
|
+
/**
|
|
69
|
+
* Get event properties for an event type.
|
|
70
|
+
*/
|
|
71
|
+
getEventProperties(eventType: string): Promise<McpToolResult>;
|
|
72
|
+
/**
|
|
73
|
+
* Query an existing chart's data.
|
|
74
|
+
*/
|
|
75
|
+
queryChart(chartId: string): Promise<McpToolResult>;
|
|
76
|
+
/**
|
|
77
|
+
* Get experiment details.
|
|
78
|
+
*/
|
|
79
|
+
getExperiments(experimentIds: string[]): Promise<McpToolResult>;
|
|
80
|
+
/**
|
|
81
|
+
* Query experiment results.
|
|
82
|
+
*/
|
|
83
|
+
queryExperiment(experimentId: string): Promise<McpToolResult>;
|
|
84
|
+
}
|
|
85
|
+
export declare class McpError extends Error {
|
|
86
|
+
code: number;
|
|
87
|
+
detail: string;
|
|
88
|
+
tool: string;
|
|
89
|
+
constructor(code: number, detail: string, tool: string);
|
|
90
|
+
}
|