@hypequery/mcp 0.8.2 → 0.8.4
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/api.type-test.js +17 -0
- package/dist/prompts/dataset-guide.d.ts.map +1 -1
- package/dist/prompts/dataset-guide.js +11 -2
- package/dist/tools/args.d.ts +25 -13
- package/dist/tools/args.d.ts.map +1 -1
- package/dist/tools/args.js +6 -2
- package/dist/tools/query-dataset.d.ts.map +1 -1
- package/dist/tools/query-dataset.js +6 -1
- package/dist/tools/query-metric.d.ts.map +1 -1
- package/dist/tools/query-metric.js +6 -1
- package/dist/tools/tool-manifest.d.ts +1 -1
- package/dist/tools/tool-manifest.d.ts.map +1 -1
- package/dist/tools/tool-manifest.js +11 -2
- package/dist/tools/utils/legacy-agent-catalog.d.ts.map +1 -1
- package/dist/tools/utils/legacy-agent-catalog.js +2 -2
- package/dist/types.d.ts +11 -7
- package/dist/types.d.ts.map +1 -1
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/package.json +3 -3
package/dist/api.type-test.js
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { expectTypeOf, it } from 'vitest';
|
|
2
|
+
import { dataset, dimension, measure } from '@hypequery/datasets';
|
|
2
3
|
import { HypequeryMCPExecutor, HypequeryMCPProtocolServer, HypequeryMCPServer, MCPToolError, connectMCPServerStdio, createMCPExecutor, createMCPProtocolServer, createMCPServer, startStdioMCPServer, } from './index.js';
|
|
3
4
|
it('exports the transport-neutral and backwards-compatible MCP APIs', () => {
|
|
4
5
|
expectTypeOf(HypequeryMCPExecutor).toBeConstructibleWith({});
|
|
@@ -12,3 +13,19 @@ it('exports the transport-neutral and backwards-compatible MCP APIs', () => {
|
|
|
12
13
|
expectTypeOf(new MCPToolError('MCP_UNAUTHORIZED', 'Forbidden').code)
|
|
13
14
|
.toMatchTypeOf();
|
|
14
15
|
});
|
|
16
|
+
it('accepts segments in the exported query argument types', () => {
|
|
17
|
+
expectTypeOf().toEqualTypeOf();
|
|
18
|
+
expectTypeOf().toEqualTypeOf();
|
|
19
|
+
const _orders = dataset('orders', {
|
|
20
|
+
source: 'orders',
|
|
21
|
+
dimensions: { status: dimension.string() },
|
|
22
|
+
measures: { revenue: measure.sum('amount') },
|
|
23
|
+
segments: { paid: { filters: [{ field: 'status', operator: 'eq', value: 'paid' }] } },
|
|
24
|
+
});
|
|
25
|
+
expectTypeOf()
|
|
26
|
+
.toEqualTypeOf();
|
|
27
|
+
expectTypeOf()
|
|
28
|
+
.toEqualTypeOf();
|
|
29
|
+
expectTypeOf().toEqualTypeOf();
|
|
30
|
+
expectTypeOf().toEqualTypeOf();
|
|
31
|
+
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dataset-guide.d.ts","sourceRoot":"","sources":["../../src/prompts/dataset-guide.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"dataset-guide.d.ts","sourceRoot":"","sources":["../../src/prompts/dataset-guide.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAGnD,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,eAAe,EAAE,WAAW,CAAC,EAAE,MAAM;;;;;;;;EA+IjF"}
|
|
@@ -3,6 +3,7 @@
|
|
|
3
3
|
*
|
|
4
4
|
* Provides natural language guidance for querying datasets.
|
|
5
5
|
*/
|
|
6
|
+
import { getDatasetCatalog } from '@hypequery/datasets';
|
|
6
7
|
export function datasetGuidePrompt(datasets, datasetName) {
|
|
7
8
|
if (datasetName) {
|
|
8
9
|
const dataset = datasets[datasetName];
|
|
@@ -12,7 +13,10 @@ export function datasetGuidePrompt(datasets, datasetName) {
|
|
|
12
13
|
const datasetAny = dataset;
|
|
13
14
|
// Generate dataset-specific guide
|
|
14
15
|
const dimensions = datasetAny.dimensions ? Object.keys(datasetAny.dimensions) : [];
|
|
15
|
-
const
|
|
16
|
+
const catalog = datasetAny.__type === 'dataset' ? getDatasetCatalog(datasetAny) : undefined;
|
|
17
|
+
const measures = catalog
|
|
18
|
+
? [...Object.keys(catalog.measures), ...Object.keys(catalog.derivedMeasures ?? {})]
|
|
19
|
+
: datasetAny.measures ? Object.keys(datasetAny.measures) : [];
|
|
16
20
|
const metrics = datasetAny.metrics ? Object.keys(datasetAny.metrics) : [];
|
|
17
21
|
const guide = `# Querying the ${datasetName} dataset
|
|
18
22
|
|
|
@@ -20,7 +24,12 @@ export function datasetGuidePrompt(datasets, datasetName) {
|
|
|
20
24
|
${dimensions.map((d) => `- ${d}`).join('\n')}
|
|
21
25
|
|
|
22
26
|
## Available Measures
|
|
23
|
-
${measures.map((m) =>
|
|
27
|
+
${measures.map((m) => {
|
|
28
|
+
const definition = catalog?.measures[m] ?? catalog?.derivedMeasures?.[m];
|
|
29
|
+
const range = definition?.requiresTimeRange ? ` (requires by and a bounded ISO time range on ${catalog?.timeKey})` : '';
|
|
30
|
+
const grains = definition?.supportedGrains ? ` [grains: ${definition.supportedGrains.join(', ')}]` : '';
|
|
31
|
+
return `- ${m}${range}${grains}`;
|
|
32
|
+
}).join('\n')}
|
|
24
33
|
|
|
25
34
|
## Available Metrics
|
|
26
35
|
${metrics.map((m) => `- ${m}`).join('\n')}
|
package/dist/tools/args.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { z } from 'zod';
|
|
2
|
-
import { type MetricFilter } from '@hypequery/datasets';
|
|
2
|
+
import { type MetricFilter, type TimeGrain } from '@hypequery/datasets';
|
|
3
3
|
export declare const queryMetricArgsSchema: z.ZodObject<{
|
|
4
4
|
dimensions: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
|
|
5
5
|
filters: z.ZodOptional<z.ZodArray<z.ZodObject<{
|
|
@@ -15,7 +15,9 @@ export declare const queryMetricArgsSchema: z.ZodObject<{
|
|
|
15
15
|
operator: "eq" | "neq" | "gt" | "gte" | "lt" | "lte" | "in" | "notIn" | "between" | "like";
|
|
16
16
|
value?: any;
|
|
17
17
|
}>, "many">>;
|
|
18
|
-
|
|
18
|
+
segments: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
|
|
19
|
+
grain: z.ZodOptional<z.ZodEnum<[TimeGrain, ...TimeGrain[]]>>;
|
|
20
|
+
timezone: z.ZodOptional<z.ZodString>;
|
|
19
21
|
orderBy: z.ZodOptional<z.ZodArray<z.ZodObject<{
|
|
20
22
|
field: z.ZodString;
|
|
21
23
|
direction: z.ZodEnum<["asc", "desc"]>;
|
|
@@ -32,15 +34,17 @@ export declare const queryMetricArgsSchema: z.ZodObject<{
|
|
|
32
34
|
dataset: z.ZodOptional<z.ZodString>;
|
|
33
35
|
metric: z.ZodOptional<z.ZodString>;
|
|
34
36
|
}, "strict", z.ZodTypeAny, {
|
|
37
|
+
dataset?: string | undefined;
|
|
35
38
|
dimensions?: string[] | undefined;
|
|
36
39
|
filters?: {
|
|
37
40
|
field: string;
|
|
38
41
|
operator: "eq" | "neq" | "gt" | "gte" | "lt" | "lte" | "in" | "notIn" | "between" | "like";
|
|
39
42
|
value?: any;
|
|
40
43
|
}[] | undefined;
|
|
44
|
+
segments?: string[] | undefined;
|
|
41
45
|
metric?: string | undefined;
|
|
42
|
-
|
|
43
|
-
|
|
46
|
+
grain?: TimeGrain | undefined;
|
|
47
|
+
timezone?: string | undefined;
|
|
44
48
|
orderBy?: {
|
|
45
49
|
field: string;
|
|
46
50
|
direction: "asc" | "desc";
|
|
@@ -48,15 +52,17 @@ export declare const queryMetricArgsSchema: z.ZodObject<{
|
|
|
48
52
|
limit?: number | undefined;
|
|
49
53
|
offset?: number | undefined;
|
|
50
54
|
}, {
|
|
55
|
+
dataset?: string | undefined;
|
|
51
56
|
dimensions?: string[] | undefined;
|
|
52
57
|
filters?: {
|
|
53
58
|
field: string;
|
|
54
59
|
operator: "eq" | "neq" | "gt" | "gte" | "lt" | "lte" | "in" | "notIn" | "between" | "like";
|
|
55
60
|
value?: any;
|
|
56
61
|
}[] | undefined;
|
|
62
|
+
segments?: string[] | undefined;
|
|
57
63
|
metric?: string | undefined;
|
|
58
|
-
|
|
59
|
-
|
|
64
|
+
grain?: TimeGrain | undefined;
|
|
65
|
+
timezone?: string | undefined;
|
|
60
66
|
orderBy?: {
|
|
61
67
|
field: string;
|
|
62
68
|
direction: "asc" | "desc";
|
|
@@ -79,7 +85,9 @@ export declare const queryDatasetArgsSchema: z.ZodObject<{
|
|
|
79
85
|
operator: "eq" | "neq" | "gt" | "gte" | "lt" | "lte" | "in" | "notIn" | "between" | "like";
|
|
80
86
|
value?: any;
|
|
81
87
|
}>, "many">>;
|
|
82
|
-
|
|
88
|
+
segments: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
|
|
89
|
+
grain: z.ZodOptional<z.ZodEnum<[TimeGrain, ...TimeGrain[]]>>;
|
|
90
|
+
timezone: z.ZodOptional<z.ZodString>;
|
|
83
91
|
orderBy: z.ZodOptional<z.ZodArray<z.ZodObject<{
|
|
84
92
|
field: z.ZodString;
|
|
85
93
|
direction: z.ZodEnum<["asc", "desc"]>;
|
|
@@ -96,15 +104,17 @@ export declare const queryDatasetArgsSchema: z.ZodObject<{
|
|
|
96
104
|
dataset: z.ZodOptional<z.ZodString>;
|
|
97
105
|
measures: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
|
|
98
106
|
}, "strict", z.ZodTypeAny, {
|
|
107
|
+
dataset?: string | undefined;
|
|
99
108
|
dimensions?: string[] | undefined;
|
|
109
|
+
measures?: string[] | undefined;
|
|
100
110
|
filters?: {
|
|
101
111
|
field: string;
|
|
102
112
|
operator: "eq" | "neq" | "gt" | "gte" | "lt" | "lte" | "in" | "notIn" | "between" | "like";
|
|
103
113
|
value?: any;
|
|
104
114
|
}[] | undefined;
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
115
|
+
segments?: string[] | undefined;
|
|
116
|
+
grain?: TimeGrain | undefined;
|
|
117
|
+
timezone?: string | undefined;
|
|
108
118
|
orderBy?: {
|
|
109
119
|
field: string;
|
|
110
120
|
direction: "asc" | "desc";
|
|
@@ -112,15 +122,17 @@ export declare const queryDatasetArgsSchema: z.ZodObject<{
|
|
|
112
122
|
limit?: number | undefined;
|
|
113
123
|
offset?: number | undefined;
|
|
114
124
|
}, {
|
|
125
|
+
dataset?: string | undefined;
|
|
115
126
|
dimensions?: string[] | undefined;
|
|
127
|
+
measures?: string[] | undefined;
|
|
116
128
|
filters?: {
|
|
117
129
|
field: string;
|
|
118
130
|
operator: "eq" | "neq" | "gt" | "gte" | "lt" | "lte" | "in" | "notIn" | "between" | "like";
|
|
119
131
|
value?: any;
|
|
120
132
|
}[] | undefined;
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
133
|
+
segments?: string[] | undefined;
|
|
134
|
+
grain?: TimeGrain | undefined;
|
|
135
|
+
timezone?: string | undefined;
|
|
124
136
|
orderBy?: {
|
|
125
137
|
field: string;
|
|
126
138
|
direction: "asc" | "desc";
|
package/dist/tools/args.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"args.d.ts","sourceRoot":"","sources":["../../src/tools/args.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,
|
|
1
|
+
{"version":3,"file":"args.d.ts","sourceRoot":"","sources":["../../src/tools/args.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAGL,KAAK,YAAY,EACjB,KAAK,SAAS,EACf,MAAM,qBAAqB,CAAC;AAmC7B,eAAO,MAAM,qBAAqB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAGhC,CAAC;AAEH,eAAO,MAAM,sBAAsB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAGjC,CAAC;AAWH,wBAAgB,aAAa,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,GAAG,CAAC,CASzF;AAED,wBAAgB,eAAe,CAC7B,OAAO,GAAE,KAAK,CAAC;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,YAAY,CAAC,UAAU,CAAC,CAAC;IAAC,KAAK,CAAC,EAAE,OAAO,CAAA;CAAE,CAAM,GAC1F,YAAY,EAAE,CAMhB"}
|
package/dist/tools/args.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { z } from 'zod';
|
|
2
|
-
import { SEMANTIC_FILTER_OPERATORS } from '@hypequery/datasets';
|
|
2
|
+
import { SEMANTIC_FILTER_OPERATORS, SUPPORTED_TIME_GRAINS, } from '@hypequery/datasets';
|
|
3
3
|
import { MCPToolError } from '../errors.js';
|
|
4
4
|
import { MAX_QUERY_DIMENSIONS, MAX_QUERY_FILTERS, MAX_QUERY_LIMIT, MAX_QUERY_MEASURES, MAX_QUERY_OFFSET, MAX_QUERY_ORDER_BY, } from '../types.js';
|
|
5
5
|
const filterSchema = z.object({
|
|
@@ -14,7 +14,11 @@ const orderBySchema = z.object({
|
|
|
14
14
|
const baseQuerySchema = z.object({
|
|
15
15
|
dimensions: z.array(z.string().min(1)).max(MAX_QUERY_DIMENSIONS).optional(),
|
|
16
16
|
filters: z.array(filterSchema).max(MAX_QUERY_FILTERS).optional(),
|
|
17
|
-
|
|
17
|
+
// Each dataset narrows this to the segment names it declares.
|
|
18
|
+
segments: z.array(z.string().min(1)).max(MAX_QUERY_FILTERS).optional(),
|
|
19
|
+
// Each dataset narrows this further through its catalog `supportedGrains`.
|
|
20
|
+
grain: z.enum(SUPPORTED_TIME_GRAINS).optional(),
|
|
21
|
+
timezone: z.string().min(1).max(100).optional(),
|
|
18
22
|
orderBy: z.array(orderBySchema).max(MAX_QUERY_ORDER_BY).optional(),
|
|
19
23
|
limit: z.number().int().positive().max(MAX_QUERY_LIMIT).optional(),
|
|
20
24
|
offset: z.number().int().nonnegative().max(MAX_QUERY_OFFSET).optional(),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"query-dataset.d.ts","sourceRoot":"","sources":["../../src/tools/query-dataset.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAgB,MAAM,qBAAqB,CAAC;AAEvE,OAAO,KAAK,EAAE,eAAe,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAYtF,wBAAsB,gBAAgB,CACpC,QAAQ,EAAE,eAAe,EACzB,SAAS,EAAE,aAAa,EACxB,IAAI,EAAE,OAAO,EACb,OAAO,GAAE,gBAAqB,GAC7B,OAAO,CAAC,eAAe,CAAC,
|
|
1
|
+
{"version":3,"file":"query-dataset.d.ts","sourceRoot":"","sources":["../../src/tools/query-dataset.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAgB,MAAM,qBAAqB,CAAC;AAEvE,OAAO,KAAK,EAAE,eAAe,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAYtF,wBAAsB,gBAAgB,CACpC,QAAQ,EAAE,eAAe,EACzB,SAAS,EAAE,aAAa,EACxB,IAAI,EAAE,OAAO,EACb,OAAO,GAAE,gBAAqB,GAC7B,OAAO,CAAC,eAAe,CAAC,CAiE1B"}
|
|
@@ -13,7 +13,7 @@ import { createMCPToolResponse } from './utils/tool-response.js';
|
|
|
13
13
|
export async function queryDatasetTool(datasets, analytics, args, options = {}) {
|
|
14
14
|
const inputSchema = options.inputSchema ?? buildMCPQuerySchemas(datasets, options.limits).queryDataset;
|
|
15
15
|
const validatedArgs = parseToolArgs(inputSchema, 'query_dataset', args);
|
|
16
|
-
const { dataset: datasetName, dimensions, measures, filters, grain, orderBy } = validatedArgs;
|
|
16
|
+
const { dataset: datasetName, dimensions, measures, filters, segments, grain, timezone, orderBy } = validatedArgs;
|
|
17
17
|
if (!datasetName) {
|
|
18
18
|
throw new MCPToolError('MCP_INVALID_ARGUMENTS', 'dataset parameter is required');
|
|
19
19
|
}
|
|
@@ -34,9 +34,14 @@ export async function queryDatasetTool(datasets, analytics, args, options = {})
|
|
|
34
34
|
orderBy: orderBy || [],
|
|
35
35
|
limit: pagination.limit,
|
|
36
36
|
};
|
|
37
|
+
if (timezone !== undefined)
|
|
38
|
+
query.timezone = timezone;
|
|
37
39
|
if (grain) {
|
|
38
40
|
query.by = grain;
|
|
39
41
|
}
|
|
42
|
+
if (segments?.length) {
|
|
43
|
+
query.segments = segments;
|
|
44
|
+
}
|
|
40
45
|
if (pagination.offset !== undefined) {
|
|
41
46
|
query.offset = pagination.offset;
|
|
42
47
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"query-metric.d.ts","sourceRoot":"","sources":["../../src/tools/query-metric.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAe,MAAM,qBAAqB,CAAC;AAEtE,OAAO,KAAK,EAAE,eAAe,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAYtF,wBAAsB,eAAe,CACnC,QAAQ,EAAE,eAAe,EACzB,SAAS,EAAE,aAAa,EACxB,IAAI,EAAE,OAAO,EACb,OAAO,GAAE,gBAAqB,GAC7B,OAAO,CAAC,eAAe,CAAC,
|
|
1
|
+
{"version":3,"file":"query-metric.d.ts","sourceRoot":"","sources":["../../src/tools/query-metric.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAe,MAAM,qBAAqB,CAAC;AAEtE,OAAO,KAAK,EAAE,eAAe,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAYtF,wBAAsB,eAAe,CACnC,QAAQ,EAAE,eAAe,EACzB,SAAS,EAAE,aAAa,EACxB,IAAI,EAAE,OAAO,EACb,OAAO,GAAE,gBAAqB,GAC7B,OAAO,CAAC,eAAe,CAAC,CAwE1B"}
|
|
@@ -13,7 +13,7 @@ import { createMCPToolResponse } from './utils/tool-response.js';
|
|
|
13
13
|
export async function queryMetricTool(datasets, analytics, args, options = {}) {
|
|
14
14
|
const inputSchema = options.inputSchema ?? buildMCPQuerySchemas(datasets, options.limits).queryMetric;
|
|
15
15
|
const validatedArgs = parseToolArgs(inputSchema, 'query_metric', args);
|
|
16
|
-
const { dataset: datasetName, metric: metricName, dimensions, filters, grain, orderBy } = validatedArgs;
|
|
16
|
+
const { dataset: datasetName, metric: metricName, dimensions, filters, segments, grain, timezone, orderBy } = validatedArgs;
|
|
17
17
|
if (!datasetName) {
|
|
18
18
|
throw new MCPToolError('MCP_INVALID_ARGUMENTS', 'dataset parameter is required');
|
|
19
19
|
}
|
|
@@ -38,9 +38,14 @@ export async function queryMetricTool(datasets, analytics, args, options = {}) {
|
|
|
38
38
|
orderBy: orderBy || [],
|
|
39
39
|
limit: pagination.limit,
|
|
40
40
|
};
|
|
41
|
+
if (timezone !== undefined)
|
|
42
|
+
query.timezone = timezone;
|
|
41
43
|
if (grain) {
|
|
42
44
|
query.by = grain;
|
|
43
45
|
}
|
|
46
|
+
if (segments?.length) {
|
|
47
|
+
query.segments = segments;
|
|
48
|
+
}
|
|
44
49
|
if (pagination.offset !== undefined) {
|
|
45
50
|
query.offset = pagination.offset;
|
|
46
51
|
}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type
|
|
1
|
+
import { type CanonicalSemanticQuerySchemas } from '@hypequery/datasets';
|
|
2
2
|
import type { ListToolsResult } from '@modelcontextprotocol/sdk/types.js';
|
|
3
3
|
export declare const DATASET_LIST_OUTPUT_SCHEMA: {
|
|
4
4
|
[x: string]: unknown;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tool-manifest.d.ts","sourceRoot":"","sources":["../../src/tools/tool-manifest.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"tool-manifest.d.ts","sourceRoot":"","sources":["../../src/tools/tool-manifest.ts"],"names":[],"mappings":"AAAA,OAAO,EAAyB,KAAK,6BAA6B,EAAE,MAAM,qBAAqB,CAAC;AAChG,OAAO,KAAK,EAAE,eAAe,EAAQ,MAAM,oCAAoC,CAAC;AAiEhF,eAAO,MAAM,0BAA0B;;;;;;;2BAsBrC,CAAC;AAEH,eAAO,MAAM,4BAA4B;;;;;;;2BAmIvC,CAAC;AAEH,eAAO,MAAM,mBAAmB;;;;;;;2BAwC9B,CAAC;AAYH,wBAAgB,oBAAoB,CAClC,YAAY,EAAE,6BAA6B,GAC1C,eAAe,CA8CjB"}
|
|
@@ -1,10 +1,10 @@
|
|
|
1
|
+
import { SUPPORTED_TIME_GRAINS } from '@hypequery/datasets';
|
|
1
2
|
const semanticMetadataProperties = {
|
|
2
3
|
examples: { type: 'array', items: { type: 'string' } },
|
|
3
4
|
synonyms: { type: 'array', items: { type: 'string' } },
|
|
4
5
|
format: { type: 'string' },
|
|
5
6
|
unit: { type: 'string' },
|
|
6
7
|
currency: { type: 'string' },
|
|
7
|
-
timezone: { type: 'string' },
|
|
8
8
|
sensitivity: {
|
|
9
9
|
type: 'string',
|
|
10
10
|
enum: ['public', 'internal', 'confidential', 'restricted'],
|
|
@@ -99,7 +99,7 @@ export const DATASET_SCHEMA_OUTPUT_SCHEMA = resultSchema({
|
|
|
99
99
|
additionalProperties: false,
|
|
100
100
|
properties: {
|
|
101
101
|
dimensions: { type: 'array', items: { type: 'string' } },
|
|
102
|
-
timeGrain: { type: 'string', enum: [
|
|
102
|
+
timeGrain: { type: 'string', enum: [...SUPPORTED_TIME_GRAINS] },
|
|
103
103
|
},
|
|
104
104
|
},
|
|
105
105
|
timeDimension: { type: ['string', 'null'] },
|
|
@@ -130,6 +130,15 @@ export const DATASET_SCHEMA_OUTPUT_SCHEMA = resultSchema({
|
|
|
130
130
|
label: { type: 'string' },
|
|
131
131
|
description: { type: 'string' },
|
|
132
132
|
...semanticMetadataProperties,
|
|
133
|
+
kind: { type: 'string', enum: ['window', 'shift'] },
|
|
134
|
+
measure: { type: 'string' },
|
|
135
|
+
interval: { type: 'object', properties: { amount: { type: 'integer', minimum: 1 }, unit: { type: 'string', enum: [...SUPPORTED_TIME_GRAINS] } }, required: ['amount', 'unit'], additionalProperties: false },
|
|
136
|
+
trailing: { type: 'object', properties: { amount: { type: 'integer', minimum: 1 }, unit: { type: 'string', enum: [...SUPPORTED_TIME_GRAINS] } }, required: ['amount', 'unit'], additionalProperties: false },
|
|
137
|
+
toDate: { type: 'string', enum: SUPPORTED_TIME_GRAINS.filter(grain => grain !== 'minute') },
|
|
138
|
+
cumulative: { const: true },
|
|
139
|
+
requiresTimeRange: { const: true },
|
|
140
|
+
supportedGrains: { type: 'array', items: { type: 'string', enum: [...SUPPORTED_TIME_GRAINS] } },
|
|
141
|
+
approximate: { const: true },
|
|
133
142
|
},
|
|
134
143
|
required: ['name'],
|
|
135
144
|
},
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"legacy-agent-catalog.d.ts","sourceRoot":"","sources":["../../../src/tools/utils/legacy-agent-catalog.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,mBAAmB,EAQpB,MAAM,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"legacy-agent-catalog.d.ts","sourceRoot":"","sources":["../../../src/tools/utils/legacy-agent-catalog.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,mBAAmB,EAQpB,MAAM,qBAAqB,CAAC;AAG7B,KAAK,aAAa,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AA2F7C;;;;;;;;;;;;;GAaG;AACH,wBAAgB,yBAAyB,CACvC,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,aAAa,EACpB,QAAQ,GAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAM,GAC/C,mBAAmB,CAuFrB"}
|
|
@@ -1,8 +1,9 @@
|
|
|
1
|
+
import { SUPPORTED_TIME_GRAINS } from '@hypequery/datasets';
|
|
1
2
|
/**
|
|
2
3
|
* Grains the semantic planner can actually execute. A legacy registry is
|
|
3
4
|
* untyped, so anything outside this set is dropped rather than advertised.
|
|
4
5
|
*/
|
|
5
|
-
const TIME_GRAINS = new Set(
|
|
6
|
+
const TIME_GRAINS = new Set(SUPPORTED_TIME_GRAINS);
|
|
6
7
|
function record(value) {
|
|
7
8
|
return value !== null && typeof value === 'object' && !Array.isArray(value)
|
|
8
9
|
? value
|
|
@@ -42,7 +43,6 @@ function semanticMetadata(value) {
|
|
|
42
43
|
...(text(value.format) !== undefined ? { format: text(value.format) } : {}),
|
|
43
44
|
...(text(value.unit) !== undefined ? { unit: text(value.unit) } : {}),
|
|
44
45
|
...(/^[A-Z]{3}$/.test(String(value.currency)) ? { currency: String(value.currency) } : {}),
|
|
45
|
-
...(text(value.timezone) !== undefined ? { timezone: text(value.timezone) } : {}),
|
|
46
46
|
...(sensitivity !== undefined ? { sensitivity } : {}),
|
|
47
47
|
};
|
|
48
48
|
}
|
package/dist/types.d.ts
CHANGED
|
@@ -1,33 +1,37 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Type definitions for MCP Server
|
|
3
3
|
*/
|
|
4
|
-
import type { AgentCatalogDataset, AgentCatalogDimension, AgentCatalogFilter, AgentCatalogMeasure, AgentCatalogMetric, AgentCatalogRelationship, AnyDatasetInstance, MetricFilter, TimeGrain, MetricOrderBy } from '@hypequery/datasets';
|
|
4
|
+
import type { AgentCatalogDataset, AgentCatalogDimension, AgentCatalogFilter, AgentCatalogMeasure, AgentCatalogMetric, AgentCatalogRelationship, AnyDatasetInstance, DatasetSegmentNames, MetricFilter, TimeGrain, MetricOrderBy } from '@hypequery/datasets';
|
|
5
5
|
import type { ZodTypeAny } from 'zod';
|
|
6
6
|
/**
|
|
7
7
|
* Registry of datasets - maps dataset names to dataset instances
|
|
8
8
|
*/
|
|
9
9
|
export type DatasetRegistry = Record<string, AnyDatasetInstance | Record<string, unknown>>;
|
|
10
10
|
/**
|
|
11
|
-
* Arguments for query_metric tool
|
|
11
|
+
* Arguments for query_metric tool. Supply a dataset type to restrict the
|
|
12
|
+
* dataset and segment names; the default supports dynamic registries.
|
|
12
13
|
*/
|
|
13
|
-
export interface QueryMetricArgs {
|
|
14
|
-
dataset:
|
|
14
|
+
export interface QueryMetricArgs<TDataset extends AnyDatasetInstance = AnyDatasetInstance> {
|
|
15
|
+
dataset: TDataset['name'];
|
|
15
16
|
metric: string;
|
|
16
17
|
dimensions?: string[];
|
|
17
18
|
filters?: MetricFilter[];
|
|
19
|
+
segments?: DatasetSegmentNames<TDataset>[];
|
|
18
20
|
grain?: TimeGrain;
|
|
19
21
|
orderBy?: MetricOrderBy[];
|
|
20
22
|
limit?: number;
|
|
21
23
|
offset?: number;
|
|
22
24
|
}
|
|
23
25
|
/**
|
|
24
|
-
* Arguments for query_dataset tool
|
|
26
|
+
* Arguments for query_dataset tool. Supply a dataset type to restrict the
|
|
27
|
+
* dataset and segment names; the default supports dynamic registries.
|
|
25
28
|
*/
|
|
26
|
-
export interface QueryDatasetArgs {
|
|
27
|
-
dataset:
|
|
29
|
+
export interface QueryDatasetArgs<TDataset extends AnyDatasetInstance = AnyDatasetInstance> {
|
|
30
|
+
dataset: TDataset['name'];
|
|
28
31
|
dimensions?: string[];
|
|
29
32
|
measures?: string[];
|
|
30
33
|
filters?: MetricFilter[];
|
|
34
|
+
segments?: DatasetSegmentNames<TDataset>[];
|
|
31
35
|
grain?: TimeGrain;
|
|
32
36
|
orderBy?: MetricOrderBy[];
|
|
33
37
|
limit?: number;
|
package/dist/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EACV,mBAAmB,EACnB,qBAAqB,EACrB,kBAAkB,EAClB,mBAAmB,EACnB,kBAAkB,EAClB,wBAAwB,EACxB,kBAAkB,EAClB,YAAY,EACZ,SAAS,EACT,aAAa,EACd,MAAM,qBAAqB,CAAC;AAC7B,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,KAAK,CAAC;AAEtC;;GAEG;AACH,MAAM,MAAM,eAAe,GAAG,MAAM,CAAC,MAAM,EAAE,kBAAkB,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;AAE3F
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
|
package/dist/version.d.ts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export declare const MCP_PACKAGE_VERSION = "0.8.
|
|
1
|
+
export declare const MCP_PACKAGE_VERSION = "0.8.4";
|
|
2
2
|
//# sourceMappingURL=version.d.ts.map
|
package/dist/version.js
CHANGED
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@hypequery/mcp",
|
|
3
|
-
"version": "0.8.
|
|
3
|
+
"version": "0.8.4",
|
|
4
4
|
"description": "Governed ClickHouse MCP server for semantic metrics, datasets, Claude, Cursor, and AI agents",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"mcp",
|
|
@@ -33,7 +33,7 @@
|
|
|
33
33
|
"dist"
|
|
34
34
|
],
|
|
35
35
|
"dependencies": {
|
|
36
|
-
"@hypequery/datasets": "^0.
|
|
36
|
+
"@hypequery/datasets": "^0.20.0",
|
|
37
37
|
"@modelcontextprotocol/sdk": "^1.29.0",
|
|
38
38
|
"zod": "^3.23.8"
|
|
39
39
|
},
|
|
@@ -41,7 +41,7 @@
|
|
|
41
41
|
"@types/node": "^20.11.30",
|
|
42
42
|
"typescript": "^5.7.3",
|
|
43
43
|
"vitest": "^3.2.6",
|
|
44
|
-
"@hypequery/clickhouse": "2.
|
|
44
|
+
"@hypequery/clickhouse": "2.12.1"
|
|
45
45
|
},
|
|
46
46
|
"repository": {
|
|
47
47
|
"type": "git",
|