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
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,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,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,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,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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"}
|