@dataworks-technology/cli 1.2.0 → 1.4.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/.agents/plugins/marketplace.json +20 -0
- package/.claude-plugin/marketplace.json +16 -0
- package/README.md +85 -2
- package/bin/mcp.js +9 -0
- package/bin/postinstall.js +23 -0
- package/dist/commands/agents/install.d.ts +17 -0
- package/dist/commands/agents/install.d.ts.map +1 -0
- package/dist/commands/agents/install.js +57 -0
- package/dist/commands/agents/install.js.map +1 -0
- package/dist/commands/agents/reminder.d.ts +16 -0
- package/dist/commands/agents/reminder.d.ts.map +1 -0
- package/dist/commands/agents/reminder.js +45 -0
- package/dist/commands/agents/reminder.js.map +1 -0
- package/dist/commands/commands.d.ts.map +1 -1
- package/dist/commands/commands.js +2 -0
- package/dist/commands/commands.js.map +1 -1
- package/dist/generated/metrics.d.ts +15 -0
- package/dist/generated/metrics.d.ts.map +1 -0
- package/dist/generated/metrics.js +131 -0
- package/dist/generated/metrics.js.map +1 -0
- package/dist/lib/agent-install.d.ts +24 -0
- package/dist/lib/agent-install.d.ts.map +1 -0
- package/dist/lib/agent-install.js +196 -0
- package/dist/lib/agent-install.js.map +1 -0
- package/dist/lib/agent-reminder.d.ts +17 -0
- package/dist/lib/agent-reminder.d.ts.map +1 -0
- package/dist/lib/agent-reminder.js +81 -0
- package/dist/lib/agent-reminder.js.map +1 -0
- package/dist/lib/command.d.ts +1 -0
- package/dist/lib/command.d.ts.map +1 -1
- package/dist/lib/command.js +5 -0
- package/dist/lib/command.js.map +1 -1
- package/dist/lib/metric-names.d.ts +29 -0
- package/dist/lib/metric-names.d.ts.map +1 -0
- package/dist/lib/metric-names.js +171 -0
- package/dist/lib/metric-names.js.map +1 -0
- package/dist/lib/query-metrics.d.ts +73 -0
- package/dist/lib/query-metrics.d.ts.map +1 -0
- package/dist/lib/query-metrics.js +374 -0
- package/dist/lib/query-metrics.js.map +1 -0
- package/dist/mcp/main.d.ts +2 -0
- package/dist/mcp/main.d.ts.map +1 -0
- package/dist/mcp/main.js +7 -0
- package/dist/mcp/main.js.map +1 -0
- package/dist/mcp/server.d.ts +85 -0
- package/dist/mcp/server.d.ts.map +1 -0
- package/dist/mcp/server.js +248 -0
- package/dist/mcp/server.js.map +1 -0
- package/oclif.manifest.json +872 -759
- package/package.json +22 -8
- package/plugins/dataworks/.claude-plugin/plugin.json +10 -0
- package/plugins/dataworks/.codex-plugin/plugin.json +27 -0
- package/plugins/dataworks/.mcp.json +8 -0
- package/plugins/dataworks/skills/query-dataworks-metrics/SKILL.md +70 -0
- package/plugins/dataworks/skills/query-dataworks-metrics/agents/openai.yaml +13 -0
- package/skills/dataworks-cli/SKILL.md +18 -2
|
@@ -0,0 +1,248 @@
|
|
|
1
|
+
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
2
|
+
import * as z from "zod/v4";
|
|
3
|
+
import packageJson from "../../package.json" with { type: "json" };
|
|
4
|
+
import { toCliError } from "../lib/errors.js";
|
|
5
|
+
import { allMetricNames, metricCatalogSummary, } from "../lib/metric-names.js";
|
|
6
|
+
import { redact } from "../lib/output.js";
|
|
7
|
+
import { queryMetrics, } from "../lib/query-metrics.js";
|
|
8
|
+
const metricCategory = z.enum(["METRICS_TYPE_A", "METRICS_TYPE_B", "METRICS_TYPE_C"]);
|
|
9
|
+
const _categoriesMatch = true;
|
|
10
|
+
void _categoriesMatch;
|
|
11
|
+
export const queryMetricsInputSchema = z
|
|
12
|
+
.object({
|
|
13
|
+
athlete_id: z
|
|
14
|
+
.string()
|
|
15
|
+
.trim()
|
|
16
|
+
.min(1)
|
|
17
|
+
.optional()
|
|
18
|
+
.describe("Exact Dataworks athlete public ID. Use this instead of athlete_name when known."),
|
|
19
|
+
athlete_name: z
|
|
20
|
+
.string()
|
|
21
|
+
.trim()
|
|
22
|
+
.min(1)
|
|
23
|
+
.optional()
|
|
24
|
+
.describe("Athlete full or short name. The tool resolves a unique authorized athlete and never guesses when ambiguous."),
|
|
25
|
+
metric: z
|
|
26
|
+
.string()
|
|
27
|
+
.trim()
|
|
28
|
+
.min(1)
|
|
29
|
+
.describe(`Canonical metric name. Case, spaces, hyphens and underscores are ignored, so "Heart Rate" resolves to heartrate. ` +
|
|
30
|
+
`Known metrics — ${allMetricNames.join(", ")}. ` +
|
|
31
|
+
`Aliases also accepted: gps/location/position for latlong, hr/bpm/pulse for heartrate, watts for power, ` +
|
|
32
|
+
`rpm for cadence, elevation for altitude, calories for active-energy-burned, placing for rank. ` +
|
|
33
|
+
`Anything else is treated as a custom metric and requires metric_category.`),
|
|
34
|
+
metric_category: metricCategory
|
|
35
|
+
.optional()
|
|
36
|
+
.describe(`Required only for a custom metric absent from the known list. Known metrics infer their own category. ` +
|
|
37
|
+
`Catalogue by category — ${metricCatalogSummary()}.`),
|
|
38
|
+
limit: z
|
|
39
|
+
.number()
|
|
40
|
+
.int()
|
|
41
|
+
.min(1)
|
|
42
|
+
.max(500)
|
|
43
|
+
.default(30)
|
|
44
|
+
.describe("Maximum rows to return; defaults to 30."),
|
|
45
|
+
order: z
|
|
46
|
+
.enum(["newest", "oldest"])
|
|
47
|
+
.default("newest")
|
|
48
|
+
.describe("Sort by timestamp, newest-first by default."),
|
|
49
|
+
from: z
|
|
50
|
+
.string()
|
|
51
|
+
.optional()
|
|
52
|
+
.describe("Optional inclusive start time as an ISO 8601 date-time."),
|
|
53
|
+
to: z
|
|
54
|
+
.string()
|
|
55
|
+
.optional()
|
|
56
|
+
.describe("Optional inclusive end time as an ISO 8601 date-time."),
|
|
57
|
+
event_id: z
|
|
58
|
+
.string()
|
|
59
|
+
.trim()
|
|
60
|
+
.min(1)
|
|
61
|
+
.optional()
|
|
62
|
+
.describe("Optional exact event public ID filter."),
|
|
63
|
+
dataset_datasource_id: z
|
|
64
|
+
.string()
|
|
65
|
+
.trim()
|
|
66
|
+
.min(1)
|
|
67
|
+
.optional()
|
|
68
|
+
.describe("Optional exact dataset-datasource public ID filter."),
|
|
69
|
+
tenant_id: z
|
|
70
|
+
.string()
|
|
71
|
+
.trim()
|
|
72
|
+
.min(1)
|
|
73
|
+
.optional()
|
|
74
|
+
.describe("Optional authorized tenant override; otherwise use the selected CLI tenant."),
|
|
75
|
+
timeout_ms: z
|
|
76
|
+
.number()
|
|
77
|
+
.int()
|
|
78
|
+
.min(1_000)
|
|
79
|
+
.max(120_000)
|
|
80
|
+
.default(30_000)
|
|
81
|
+
.describe("Maximum time to poll an asynchronous Data Explorer query."),
|
|
82
|
+
})
|
|
83
|
+
.superRefine((input, context) => {
|
|
84
|
+
if (Number(Boolean(input.athlete_id)) + Number(Boolean(input.athlete_name)) !== 1) {
|
|
85
|
+
context.addIssue({
|
|
86
|
+
code: "custom",
|
|
87
|
+
message: "Provide exactly one of athlete_id or athlete_name",
|
|
88
|
+
path: ["athlete_id"],
|
|
89
|
+
});
|
|
90
|
+
}
|
|
91
|
+
});
|
|
92
|
+
const nullableString = z.string().nullable();
|
|
93
|
+
export const queryMetricsOutputSchema = z.object({
|
|
94
|
+
environment: z.enum(["uat", "live"]),
|
|
95
|
+
tenant_id: z.string(),
|
|
96
|
+
athlete: z.object({
|
|
97
|
+
public_id: z.string(),
|
|
98
|
+
name: nullableString,
|
|
99
|
+
matched_by: z.enum(["public_id", "name", "partial_name"]),
|
|
100
|
+
}),
|
|
101
|
+
metric: z.object({
|
|
102
|
+
requested: z.string(),
|
|
103
|
+
canonical: z.string(),
|
|
104
|
+
category: metricCategory,
|
|
105
|
+
unit: nullableString,
|
|
106
|
+
}),
|
|
107
|
+
filters: z.object({
|
|
108
|
+
event_id: nullableString,
|
|
109
|
+
dataset_datasource_id: nullableString,
|
|
110
|
+
from: nullableString,
|
|
111
|
+
to: nullableString,
|
|
112
|
+
}),
|
|
113
|
+
order: z.enum(["newest", "oldest"]),
|
|
114
|
+
limit: z.number().int(),
|
|
115
|
+
count: z.number().int(),
|
|
116
|
+
row_count: z.number().int(),
|
|
117
|
+
status: z.string(),
|
|
118
|
+
query_execution_id: nullableString,
|
|
119
|
+
query_time_ms: z.number().int().nullable(),
|
|
120
|
+
rows: z.array(z.object({
|
|
121
|
+
timestamp: z.union([z.string(), z.number()]).nullable(),
|
|
122
|
+
timestamp_iso: nullableString,
|
|
123
|
+
athlete_id: nullableString,
|
|
124
|
+
metric: nullableString,
|
|
125
|
+
value: z.unknown(),
|
|
126
|
+
unit: nullableString,
|
|
127
|
+
position: z.object({ latitude: z.number(), longitude: z.number() }).nullable(),
|
|
128
|
+
event_id: nullableString,
|
|
129
|
+
dataset_datasource_id: nullableString,
|
|
130
|
+
})),
|
|
131
|
+
});
|
|
132
|
+
function structuredOutput(output) {
|
|
133
|
+
return {
|
|
134
|
+
environment: output.environment,
|
|
135
|
+
tenant_id: output.tenantId,
|
|
136
|
+
athlete: {
|
|
137
|
+
public_id: output.athlete.publicId,
|
|
138
|
+
name: output.athlete.name,
|
|
139
|
+
matched_by: output.athlete.matchedBy,
|
|
140
|
+
},
|
|
141
|
+
metric: output.metric,
|
|
142
|
+
filters: {
|
|
143
|
+
event_id: output.filters.eventId,
|
|
144
|
+
dataset_datasource_id: output.filters.datasetDatasourceId,
|
|
145
|
+
from: output.filters.from,
|
|
146
|
+
to: output.filters.to,
|
|
147
|
+
},
|
|
148
|
+
order: output.order,
|
|
149
|
+
limit: output.limit,
|
|
150
|
+
count: output.count,
|
|
151
|
+
row_count: output.rowCount,
|
|
152
|
+
status: output.status,
|
|
153
|
+
query_execution_id: output.queryExecutionId,
|
|
154
|
+
query_time_ms: output.queryTimeMs,
|
|
155
|
+
rows: output.rows.map((row) => ({
|
|
156
|
+
timestamp: row.timestamp,
|
|
157
|
+
timestamp_iso: row.timestampIso,
|
|
158
|
+
athlete_id: row.athleteId,
|
|
159
|
+
metric: row.metric,
|
|
160
|
+
value: row.value,
|
|
161
|
+
unit: row.unit,
|
|
162
|
+
position: row.position,
|
|
163
|
+
event_id: row.eventId,
|
|
164
|
+
dataset_datasource_id: row.datasetDatasourceId,
|
|
165
|
+
})),
|
|
166
|
+
};
|
|
167
|
+
}
|
|
168
|
+
function summary(output) {
|
|
169
|
+
const athlete = output.athlete.name
|
|
170
|
+
? `${output.athlete.name} (${output.athlete.public_id})`
|
|
171
|
+
: output.athlete.public_id;
|
|
172
|
+
return [
|
|
173
|
+
`Returned ${output.count} ${output.metric.canonical} metric value${output.count === 1 ? "" : "s"} for ${athlete}.`,
|
|
174
|
+
`Environment: ${output.environment}; tenant: ${output.tenant_id}; order: ${output.order}.`,
|
|
175
|
+
].join("\n");
|
|
176
|
+
}
|
|
177
|
+
export function createDataworksMcpServer(handler = (input, options) => queryMetrics(input, options)) {
|
|
178
|
+
const server = new McpServer({
|
|
179
|
+
name: "dataworks",
|
|
180
|
+
title: "Dataworks",
|
|
181
|
+
version: packageJson.version,
|
|
182
|
+
}, {
|
|
183
|
+
instructions: "Use query_metrics for read-only athlete metric requests. Prefer athlete_id when the user supplies an ID; " +
|
|
184
|
+
"otherwise pass athlete_name and let the tool resolve it. Do not guess IDs. " +
|
|
185
|
+
`Metric names are drawn from a fixed catalogue: ${allMetricNames.join(", ")}. ` +
|
|
186
|
+
"Map the user's wording onto one of these rather than inventing a name — everyday phrasing such as " +
|
|
187
|
+
"“heart rate”, “HR” or “BPM” all resolve to heartrate. If nothing fits, the tool " +
|
|
188
|
+
"returns METRIC_CATEGORY_REQUIRED with suggestions.",
|
|
189
|
+
});
|
|
190
|
+
server.registerTool("query_metrics", {
|
|
191
|
+
title: "Query athlete metrics",
|
|
192
|
+
description: "Return normalized Dataworks metric values for one athlete. Resolves an athlete name safely, maps common aliases such as GPS and heart rate, applies optional time/event/dataset filters, polls asynchronous Data Explorer queries, and decodes GPS coordinates. Read-only. Requires an existing `dw auth login` session and selected tenant unless tenant_id is supplied.",
|
|
193
|
+
inputSchema: queryMetricsInputSchema,
|
|
194
|
+
outputSchema: queryMetricsOutputSchema,
|
|
195
|
+
annotations: {
|
|
196
|
+
readOnlyHint: true,
|
|
197
|
+
destructiveHint: false,
|
|
198
|
+
idempotentHint: true,
|
|
199
|
+
openWorldHint: false,
|
|
200
|
+
},
|
|
201
|
+
}, async (input, extra) => {
|
|
202
|
+
try {
|
|
203
|
+
const output = structuredOutput(await handler({
|
|
204
|
+
athleteId: input.athlete_id,
|
|
205
|
+
athleteName: input.athlete_name,
|
|
206
|
+
metric: input.metric,
|
|
207
|
+
metricCategory: input.metric_category,
|
|
208
|
+
limit: input.limit,
|
|
209
|
+
order: input.order,
|
|
210
|
+
from: input.from,
|
|
211
|
+
to: input.to,
|
|
212
|
+
eventId: input.event_id,
|
|
213
|
+
datasetDatasourceId: input.dataset_datasource_id,
|
|
214
|
+
tenantId: input.tenant_id,
|
|
215
|
+
timeoutMs: input.timeout_ms,
|
|
216
|
+
}, { signal: extra.signal }));
|
|
217
|
+
return {
|
|
218
|
+
content: [{ type: "text", text: summary(output) }],
|
|
219
|
+
structuredContent: output,
|
|
220
|
+
};
|
|
221
|
+
}
|
|
222
|
+
catch (error) {
|
|
223
|
+
const cliError = toCliError(error);
|
|
224
|
+
return {
|
|
225
|
+
isError: true,
|
|
226
|
+
content: [
|
|
227
|
+
{
|
|
228
|
+
type: "text",
|
|
229
|
+
text: JSON.stringify({
|
|
230
|
+
error: {
|
|
231
|
+
code: cliError.code,
|
|
232
|
+
message: cliError.message,
|
|
233
|
+
details: redact(cliError.details),
|
|
234
|
+
recovery: cliError.code === "AUTH_REQUIRED"
|
|
235
|
+
? "Run `dw auth login`, then retry."
|
|
236
|
+
: cliError.code === "TENANT_REQUIRED"
|
|
237
|
+
? "Run `dw tenant select`, then retry."
|
|
238
|
+
: null,
|
|
239
|
+
},
|
|
240
|
+
}),
|
|
241
|
+
},
|
|
242
|
+
],
|
|
243
|
+
};
|
|
244
|
+
}
|
|
245
|
+
});
|
|
246
|
+
return server;
|
|
247
|
+
}
|
|
248
|
+
//# sourceMappingURL=server.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/mcp/server.ts"],"names":[],"mappings":"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"}
|