@hypequery/mcp 0.6.0 → 0.8.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.
@@ -0,0 +1,89 @@
1
+ /**
2
+ * Discovery without execution.
3
+ *
4
+ * A hosted gateway lists tools for one principal against one activated
5
+ * deployment, and does that before — and independently of — being able to run
6
+ * anything. `HypequeryMCPExecutor` cannot serve that: it requires a
7
+ * `DatasetClient` it would never call, and refuses to construct at all when a
8
+ * dataset is tenant-scoped and no fixed `tenantId` is configured. Both are
9
+ * correct for a local server, where one process serves one tenant and every
10
+ * listed tool is runnable. Neither holds for a gateway, which resolves a tenant
11
+ * per request through the deployment data plane.
12
+ *
13
+ * The alternative would be a second manifest generator in the gateway, which
14
+ * `CORE-03` exists to prevent: the tool schemas an agent is given and the
15
+ * validators a query is checked against have to come from one catalog.
16
+ *
17
+ * So this shares the schema compiler and the catalog tools, and refuses the two
18
+ * tools that need a query engine. Listing a tool it will not run is deliberate:
19
+ * the manifest a client caches must be the one it will keep seeing once
20
+ * execution is wired in behind it, or every client re-lists on the day that
21
+ * lands.
22
+ */
23
+ import type { CallToolResult, GetPromptResult, ListPromptsResult, ListToolsResult } from '@modelcontextprotocol/sdk/types.js';
24
+ import type { MCPToolExecutor } from './executor.js';
25
+ import type { DatasetRegistry, MCPCatalogBudget, MCPQueryLimits } from './types.js';
26
+ /**
27
+ * Provenance a client needs to cache a manifest and know when it went stale.
28
+ *
29
+ * Namespaced under `com.hypequery/` in the result's `_meta`, as the MCP spec
30
+ * requires of implementation-defined keys.
31
+ */
32
+ export interface MCPToolManifestMeta {
33
+ /** The immutable generation these tools were listed from. */
34
+ readonly activationRevision?: string;
35
+ /** Content-addressed identity of the contract behind them. */
36
+ readonly deploymentIdentity?: string;
37
+ /** How the tools were shaped — `catalog` for the fixed compatibility set. */
38
+ readonly toolMode?: string;
39
+ }
40
+ export interface MCPDiscoveryExecutorConfig {
41
+ /** Datasets to advertise. Already narrowed to what the caller may see. */
42
+ datasets: DatasetRegistry;
43
+ /**
44
+ * Datasets offered as a `query_dataset` target. Defaults to all of them.
45
+ *
46
+ * A deployment authorizes a dataset and each of its metrics through separate
47
+ * endpoint policies, so a caller can be entitled to a metric on a dataset it
48
+ * may not query directly. Such a dataset still belongs in `datasets` — its
49
+ * metrics are reachable, and it may be joined to — but naming it here would
50
+ * advertise a target execution refuses.
51
+ */
52
+ queryableDatasets?: readonly string[];
53
+ /** Server-side query ceilings, so advertised schemas match what will run. */
54
+ queryLimits?: MCPQueryLimits;
55
+ /**
56
+ * Tool-count and manifest-byte ceilings.
57
+ *
58
+ * This is where they bite. A gateway lists one manifest per authorized
59
+ * catalog, and a large deployment's `query_dataset` schema names every
60
+ * dataset, dimension, measure, and filter field it published. Exceeding the
61
+ * budget raises `MCPCatalogBudgetError`, which a caller is expected to catch
62
+ * and answer by choosing a narrower tool mode.
63
+ */
64
+ catalogBudget?: MCPCatalogBudget;
65
+ /** Attached to `listTools`, so a client can pin what it listed. */
66
+ meta?: MCPToolManifestMeta;
67
+ }
68
+ /**
69
+ * A read-only executor over a catalog.
70
+ *
71
+ * `list_datasets`, `get_dataset_schema`, and the prompts read the agent-safe
72
+ * catalog and need no query engine, so they answer normally. `query_dataset`
73
+ * and `query_metric` are advertised with their exact schemas and refuse.
74
+ */
75
+ export declare class HypequeryMCPDiscoveryExecutor implements MCPToolExecutor {
76
+ private readonly config;
77
+ private readonly querySchemas;
78
+ private readonly catalogBudget;
79
+ private readonly meta;
80
+ constructor(config: MCPDiscoveryExecutorConfig);
81
+ /** The catalog these tools were compiled from, for caching by content. */
82
+ getManifestHash(): string;
83
+ listTools(): Promise<ListToolsResult>;
84
+ callTool(name: string, args?: Record<string, unknown>): Promise<CallToolResult>;
85
+ listPrompts(): Promise<ListPromptsResult>;
86
+ getPrompt(name: string, args?: Record<string, string>): Promise<GetPromptResult>;
87
+ }
88
+ export declare function createMCPDiscoveryExecutor(config: MCPDiscoveryExecutorConfig): MCPToolExecutor;
89
+ //# sourceMappingURL=discovery-executor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"discovery-executor.d.ts","sourceRoot":"","sources":["../src/discovery-executor.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAEH,OAAO,KAAK,EACV,cAAc,EACd,eAAe,EACf,iBAAiB,EACjB,eAAe,EAChB,MAAM,oCAAoC,CAAC;AAG5C,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAYrD,OAAO,KAAK,EAAE,eAAe,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAEpF;;;;;GAKG;AACH,MAAM,WAAW,mBAAmB;IAClC,6DAA6D;IAC7D,QAAQ,CAAC,kBAAkB,CAAC,EAAE,MAAM,CAAC;IACrC,8DAA8D;IAC9D,QAAQ,CAAC,kBAAkB,CAAC,EAAE,MAAM,CAAC;IACrC,6EAA6E;IAC7E,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;CAC5B;AAED,MAAM,WAAW,0BAA0B;IACzC,0EAA0E;IAC1E,QAAQ,EAAE,eAAe,CAAC;IAC1B;;;;;;;;OAQG;IACH,iBAAiB,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IACtC,6EAA6E;IAC7E,WAAW,CAAC,EAAE,cAAc,CAAC;IAC7B;;;;;;;;OAQG;IACH,aAAa,CAAC,EAAE,gBAAgB,CAAC;IACjC,mEAAmE;IACnE,IAAI,CAAC,EAAE,mBAAmB,CAAC;CAC5B;AAeD;;;;;;GAMG;AACH,qBAAa,6BAA8B,YAAW,eAAe;IAKvD,OAAO,CAAC,QAAQ,CAAC,MAAM;IAJnC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAgC;IAC7D,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAyB;IACvD,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAqC;gBAE7B,MAAM,EAAE,0BAA0B;IAY/D,0EAA0E;IAC1E,eAAe,IAAI,MAAM;IAInB,SAAS,IAAI,OAAO,CAAC,eAAe,CAAC;IAUrC,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,cAAc,CAAC;IAyB/E,WAAW,IAAI,OAAO,CAAC,iBAAiB,CAAC;IAczC,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,OAAO,CAAC,eAAe,CAAC;CAMvF;AAED,wBAAgB,0BAA0B,CACxC,MAAM,EAAE,0BAA0B,GACjC,eAAe,CAEjB"}
@@ -0,0 +1,116 @@
1
+ /**
2
+ * Discovery without execution.
3
+ *
4
+ * A hosted gateway lists tools for one principal against one activated
5
+ * deployment, and does that before — and independently of — being able to run
6
+ * anything. `HypequeryMCPExecutor` cannot serve that: it requires a
7
+ * `DatasetClient` it would never call, and refuses to construct at all when a
8
+ * dataset is tenant-scoped and no fixed `tenantId` is configured. Both are
9
+ * correct for a local server, where one process serves one tenant and every
10
+ * listed tool is runnable. Neither holds for a gateway, which resolves a tenant
11
+ * per request through the deployment data plane.
12
+ *
13
+ * The alternative would be a second manifest generator in the gateway, which
14
+ * `CORE-03` exists to prevent: the tool schemas an agent is given and the
15
+ * validators a query is checked against have to come from one catalog.
16
+ *
17
+ * So this shares the schema compiler and the catalog tools, and refuses the two
18
+ * tools that need a query engine. Listing a tool it will not run is deliberate:
19
+ * the manifest a client caches must be the one it will keep seeing once
20
+ * execution is wired in behind it, or every client re-lists on the day that
21
+ * lands.
22
+ */
23
+ import { MCPToolError } from './errors.js';
24
+ import { datasetGuidePrompt } from './prompts/dataset-guide.js';
25
+ import { getDatasetSchemaTool } from './tools/introspect.js';
26
+ import { listDatasetsTool } from './tools/list-datasets.js';
27
+ import { buildMCPToolManifest } from './tools/tool-manifest.js';
28
+ import { buildMCPQuerySchemas } from './tools/utils/canonical-query-schemas.js';
29
+ import { assertManifestWithinBudget, resolveCatalogBudget, } from './tools/utils/catalog-budget.js';
30
+ import { createMCPErrorResponse } from './tools/utils/tool-response.js';
31
+ const NOT_EXECUTABLE = 'This endpoint lists datasets and metrics but does not execute queries.';
32
+ function metaEntries(meta) {
33
+ if (meta === undefined)
34
+ return undefined;
35
+ const entries = Object.entries({
36
+ 'com.hypequery/activationRevision': meta.activationRevision,
37
+ 'com.hypequery/deploymentIdentity': meta.deploymentIdentity,
38
+ 'com.hypequery/toolMode': meta.toolMode,
39
+ }).filter((entry) => entry[1] !== undefined);
40
+ return entries.length === 0 ? undefined : Object.fromEntries(entries);
41
+ }
42
+ /**
43
+ * A read-only executor over a catalog.
44
+ *
45
+ * `list_datasets`, `get_dataset_schema`, and the prompts read the agent-safe
46
+ * catalog and need no query engine, so they answer normally. `query_dataset`
47
+ * and `query_metric` are advertised with their exact schemas and refuse.
48
+ */
49
+ export class HypequeryMCPDiscoveryExecutor {
50
+ config;
51
+ querySchemas;
52
+ catalogBudget;
53
+ meta;
54
+ constructor(config) {
55
+ this.config = config;
56
+ // Deliberately no tenant assertion. A gateway has no fixed tenant to
57
+ // declare, and none is needed: nothing here reaches a table.
58
+ this.querySchemas = buildMCPQuerySchemas(config.datasets ?? {}, config.queryLimits, config.queryableDatasets);
59
+ this.catalogBudget = resolveCatalogBudget(config.catalogBudget);
60
+ this.meta = metaEntries(config.meta);
61
+ }
62
+ /** The catalog these tools were compiled from, for caching by content. */
63
+ getManifestHash() {
64
+ return this.querySchemas.manifestHash;
65
+ }
66
+ async listTools() {
67
+ // Budgeted before `_meta` is attached, so the ceiling measures the catalog
68
+ // rather than the provenance a gateway chose to stamp on it.
69
+ const manifest = assertManifestWithinBudget(buildMCPToolManifest(this.querySchemas), this.catalogBudget);
70
+ return this.meta === undefined ? manifest : { ...manifest, _meta: this.meta };
71
+ }
72
+ async callTool(name, args) {
73
+ try {
74
+ switch (name) {
75
+ case 'list_datasets':
76
+ return await listDatasetsTool(this.config.datasets);
77
+ case 'get_dataset_schema':
78
+ return await getDatasetSchemaTool(this.config.datasets, args);
79
+ case 'query_dataset':
80
+ case 'query_metric':
81
+ // Not `MCP_UNKNOWN_TOOL`: the tool exists and is listed, and telling a
82
+ // client it does not would invite it to stop asking for good.
83
+ throw new MCPToolError('MCP_EXECUTION_FAILED', NOT_EXECUTABLE, {
84
+ retryable: false,
85
+ });
86
+ default:
87
+ throw new MCPToolError('MCP_UNKNOWN_TOOL', `Unknown tool: ${name}`);
88
+ }
89
+ }
90
+ catch (error) {
91
+ return createMCPErrorResponse(error);
92
+ }
93
+ }
94
+ async listPrompts() {
95
+ return {
96
+ prompts: [{
97
+ name: 'dataset_guide',
98
+ description: 'Guide for querying datasets with natural language',
99
+ arguments: [{
100
+ name: 'dataset',
101
+ description: 'Name of the dataset to get guidance for',
102
+ required: false,
103
+ }],
104
+ }],
105
+ };
106
+ }
107
+ async getPrompt(name, args) {
108
+ if (name === 'dataset_guide') {
109
+ return datasetGuidePrompt(this.config.datasets, args?.dataset);
110
+ }
111
+ throw new Error(`Unknown prompt: ${name}`);
112
+ }
113
+ }
114
+ export function createMCPDiscoveryExecutor(config) {
115
+ return new HypequeryMCPDiscoveryExecutor(config);
116
+ }
package/dist/errors.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- export type MCPToolErrorCode = 'MCP_INVALID_ARGUMENTS' | 'MCP_NOT_FOUND' | 'MCP_UNKNOWN_TOOL' | 'MCP_UNAUTHORIZED' | 'MCP_STALE_CONTRACT' | 'MCP_REQUEST_CANCELLED' | 'MCP_QUERY_TIMEOUT' | 'MCP_RESULT_TOO_LARGE' | 'MCP_EXECUTION_FAILED';
1
+ export type MCPToolErrorCode = 'MCP_INVALID_ARGUMENTS' | 'MCP_NOT_FOUND' | 'MCP_UNKNOWN_TOOL' | 'MCP_UNAUTHORIZED' | 'MCP_STALE_CONTRACT' | 'MCP_REQUEST_CANCELLED' | 'MCP_QUERY_TIMEOUT' | 'MCP_RESULT_TOO_LARGE' | 'MCP_CATALOG_TOO_LARGE' | 'MCP_EXECUTION_FAILED';
2
2
  export type MCPToolErrorCategory = 'correctable_input' | 'unauthorized' | 'stale_contract' | 'budget' | 'internal';
3
3
  /** @deprecated Use MCPToolErrorCode. */
4
4
  export type MCPExecutionErrorCode = Extract<MCPToolErrorCode, 'MCP_REQUEST_CANCELLED' | 'MCP_QUERY_TIMEOUT' | 'MCP_RESULT_TOO_LARGE'>;
@@ -24,6 +24,20 @@ export declare class MCPExecutionBudgetError extends MCPToolError {
24
24
  readonly code: MCPExecutionErrorCode;
25
25
  constructor(code: MCPExecutionErrorCode, message: string);
26
26
  }
27
+ /**
28
+ * A catalog too large to advertise.
29
+ *
30
+ * Separate from `MCPExecutionBudgetError` because it is not raised by a query:
31
+ * it is raised while listing, before any call exists, and a hosted gateway is
32
+ * expected to catch it and choose a smaller tool mode rather than surface it to
33
+ * a client. Truncating instead would be worse — an agent would be shown fewer
34
+ * targets than the validators behind it accept, and the manifest hash would
35
+ * stop identifying the catalog it was built from.
36
+ */
37
+ export declare class MCPCatalogBudgetError extends MCPToolError {
38
+ readonly code: 'MCP_CATALOG_TOO_LARGE';
39
+ constructor(message: string);
40
+ }
27
41
  export declare function classifyMCPToolError(error: unknown): MCPErrorDetails;
28
42
  export declare function formatMCPToolError(error: unknown): string;
29
43
  //# sourceMappingURL=errors.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,gBAAgB,GACxB,uBAAuB,GACvB,eAAe,GACf,kBAAkB,GAClB,kBAAkB,GAClB,oBAAoB,GACpB,uBAAuB,GACvB,mBAAmB,GACnB,sBAAsB,GACtB,sBAAsB,CAAC;AAE3B,MAAM,MAAM,oBAAoB,GAC5B,mBAAmB,GACnB,cAAc,GACd,gBAAgB,GAChB,QAAQ,GACR,UAAU,CAAC;AAEf,wCAAwC;AACxC,MAAM,MAAM,qBAAqB,GAAG,OAAO,CACzC,gBAAgB,EAChB,uBAAuB,GAAG,mBAAmB,GAAG,sBAAsB,CACvE,CAAC;AAEF,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,gBAAgB,CAAC;IACvB,QAAQ,EAAE,oBAAoB,CAAC;IAC/B,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,OAAO,CAAC;IACnB,WAAW,EAAE,OAAO,CAAC;CACtB;AAsBD,qBAAa,YAAa,SAAQ,KAAK;IACrC,QAAQ,CAAC,IAAI,EAAE,gBAAgB,CAAC;IAChC,QAAQ,CAAC,QAAQ,EAAE,oBAAoB,CAAC;IACxC,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC;IAC5B,QAAQ,CAAC,WAAW,EAAE,OAAO,CAAC;gBAG5B,IAAI,EAAE,gBAAgB,EACtB,OAAO,EAAE,MAAM,EACf,OAAO,GAAE;QACP,QAAQ,CAAC,EAAE,oBAAoB,CAAC;QAChC,SAAS,CAAC,EAAE,OAAO,CAAC;QACpB,WAAW,CAAC,EAAE,OAAO,CAAC;KAClB;CAUT;AAED,qBAAa,uBAAwB,SAAQ,YAAY;IACvD,SAAiB,IAAI,EAAE,qBAAqB,CAAC;gBAEjC,IAAI,EAAE,qBAAqB,EAAE,OAAO,EAAE,MAAM;CAOzD;AAED,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,OAAO,GAAG,eAAe,CAkBpE;AAED,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAGzD"}
1
+ {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,gBAAgB,GACxB,uBAAuB,GACvB,eAAe,GACf,kBAAkB,GAClB,kBAAkB,GAClB,oBAAoB,GACpB,uBAAuB,GACvB,mBAAmB,GACnB,sBAAsB,GACtB,uBAAuB,GACvB,sBAAsB,CAAC;AAE3B,MAAM,MAAM,oBAAoB,GAC5B,mBAAmB,GACnB,cAAc,GACd,gBAAgB,GAChB,QAAQ,GACR,UAAU,CAAC;AAEf,wCAAwC;AACxC,MAAM,MAAM,qBAAqB,GAAG,OAAO,CACzC,gBAAgB,EAChB,uBAAuB,GAAG,mBAAmB,GAAG,sBAAsB,CACvE,CAAC;AAEF,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,gBAAgB,CAAC;IACvB,QAAQ,EAAE,oBAAoB,CAAC;IAC/B,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,OAAO,CAAC;IACnB,WAAW,EAAE,OAAO,CAAC;CACtB;AA0BD,qBAAa,YAAa,SAAQ,KAAK;IACrC,QAAQ,CAAC,IAAI,EAAE,gBAAgB,CAAC;IAChC,QAAQ,CAAC,QAAQ,EAAE,oBAAoB,CAAC;IACxC,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC;IAC5B,QAAQ,CAAC,WAAW,EAAE,OAAO,CAAC;gBAG5B,IAAI,EAAE,gBAAgB,EACtB,OAAO,EAAE,MAAM,EACf,OAAO,GAAE;QACP,QAAQ,CAAC,EAAE,oBAAoB,CAAC;QAChC,SAAS,CAAC,EAAE,OAAO,CAAC;QACpB,WAAW,CAAC,EAAE,OAAO,CAAC;KAClB;CAUT;AAED,qBAAa,uBAAwB,SAAQ,YAAY;IACvD,SAAiB,IAAI,EAAE,qBAAqB,CAAC;gBAEjC,IAAI,EAAE,qBAAqB,EAAE,OAAO,EAAE,MAAM;CAOzD;AAED;;;;;;;;;GASG;AACH,qBAAa,qBAAsB,SAAQ,YAAY;IACrD,SAAiB,IAAI,EAAE,uBAAuB,CAAC;gBAEnC,OAAO,EAAE,MAAM;CAI5B;AAED,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,OAAO,GAAG,eAAe,CAkBpE;AAED,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAGzD"}
package/dist/errors.js CHANGED
@@ -8,8 +8,12 @@ function defaultErrorMetadata(code) {
8
8
  return { category: 'unauthorized', retryable: false, correctable: false };
9
9
  case 'MCP_STALE_CONTRACT':
10
10
  return { category: 'stale_contract', retryable: true, correctable: false };
11
+ // `MCP_CATALOG_TOO_LARGE` is not retryable: the same catalog produces the
12
+ // same manifest every time. A caller fixes it by publishing fewer targets
13
+ // or choosing a tool mode that does not name every one of them.
11
14
  case 'MCP_REQUEST_CANCELLED':
12
15
  case 'MCP_RESULT_TOO_LARGE':
16
+ case 'MCP_CATALOG_TOO_LARGE':
13
17
  return { category: 'budget', retryable: false, correctable: false };
14
18
  case 'MCP_QUERY_TIMEOUT':
15
19
  return { category: 'budget', retryable: true, correctable: false };
@@ -41,6 +45,22 @@ export class MCPExecutionBudgetError extends MCPToolError {
41
45
  this.name = 'MCPExecutionBudgetError';
42
46
  }
43
47
  }
48
+ /**
49
+ * A catalog too large to advertise.
50
+ *
51
+ * Separate from `MCPExecutionBudgetError` because it is not raised by a query:
52
+ * it is raised while listing, before any call exists, and a hosted gateway is
53
+ * expected to catch it and choose a smaller tool mode rather than surface it to
54
+ * a client. Truncating instead would be worse — an agent would be shown fewer
55
+ * targets than the validators behind it accept, and the manifest hash would
56
+ * stop identifying the catalog it was built from.
57
+ */
58
+ export class MCPCatalogBudgetError extends MCPToolError {
59
+ constructor(message) {
60
+ super('MCP_CATALOG_TOO_LARGE', message, { category: 'budget', retryable: false });
61
+ this.name = 'MCPCatalogBudgetError';
62
+ }
63
+ }
44
64
  export function classifyMCPToolError(error) {
45
65
  if (error instanceof MCPToolError) {
46
66
  return {
@@ -1,6 +1,6 @@
1
1
  import type { CallToolResult, GetPromptResult, ListPromptsResult, ListToolsResult } from '@modelcontextprotocol/sdk/types.js';
2
2
  import type { DatasetClient } from '@hypequery/datasets';
3
- import type { DatasetRegistry, MCPExecutionBudget, MCPQueryLimits } from './types.js';
3
+ import type { DatasetRegistry, MCPCatalogBudget, MCPExecutionBudget, MCPQueryLimits } from './types.js';
4
4
  export interface MCPExecutorConfig {
5
5
  /** Dataset registry - map of dataset names to instances. */
6
6
  datasets: DatasetRegistry;
@@ -14,6 +14,8 @@ export interface MCPExecutorConfig {
14
14
  queryLimits?: MCPQueryLimits;
15
15
  /** Query deadline and serialized-result byte ceilings. */
16
16
  executionBudget?: MCPExecutionBudget;
17
+ /** Tool-count and manifest-byte ceilings applied when listing tools. */
18
+ catalogBudget?: MCPCatalogBudget;
17
19
  }
18
20
  export interface MCPServerConfig extends MCPExecutorConfig {
19
21
  /** Server name shown to MCP clients. */
@@ -39,6 +41,7 @@ export declare class HypequeryMCPExecutor implements MCPToolExecutor {
39
41
  private readonly config;
40
42
  private readonly querySchemas;
41
43
  private readonly executionBudget;
44
+ private readonly catalogBudget;
42
45
  constructor(config: MCPExecutorConfig);
43
46
  getManifestHash(): string;
44
47
  listTools(): Promise<ListToolsResult>;
@@ -1 +1 @@
1
- {"version":3,"file":"executor.d.ts","sourceRoot":"","sources":["../src/executor.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,cAAc,EACd,eAAe,EACf,iBAAiB,EACjB,eAAe,EAChB,MAAM,oCAAoC,CAAC;AAC5C,OAAO,KAAK,EAEV,aAAa,EACd,MAAM,qBAAqB,CAAC;AAe7B,OAAO,KAAK,EAAE,eAAe,EAAE,kBAAkB,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAOtF,MAAM,WAAW,iBAAiB;IAChC,4DAA4D;IAC5D,QAAQ,EAAE,eAAe,CAAC;IAC1B,wEAAwE;IACxE,SAAS,EAAE,aAAa,CAAC;IACzB,6DAA6D;IAC7D,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,2EAA2E;IAC3E,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,wEAAwE;IACxE,WAAW,CAAC,EAAE,cAAc,CAAC;IAC7B,0DAA0D;IAC1D,eAAe,CAAC,EAAE,kBAAkB,CAAC;CACtC;AAED,MAAM,WAAW,eAAgB,SAAQ,iBAAiB;IACxD,wCAAwC;IACxC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,2CAA2C;IAC3C,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,eAAe;IAC9B,SAAS,IAAI,OAAO,CAAC,eAAe,CAAC,CAAC;IACtC,QAAQ,CACN,IAAI,EAAE,MAAM,EACZ,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC9B,MAAM,CAAC,EAAE,WAAW,GACnB,OAAO,CAAC,cAAc,CAAC,CAAC;IAC3B,WAAW,IAAI,OAAO,CAAC,iBAAiB,CAAC,CAAC;IAC1C,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,OAAO,CAAC,eAAe,CAAC,CAAC;IACjF,eAAe,IAAI,MAAM,CAAC;CAC3B;AAED;;;;;;GAMG;AACH,qBAAa,oBAAqB,YAAW,eAAe;IAI9C,OAAO,CAAC,QAAQ,CAAC,MAAM;IAHnC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAgC;IAC7D,OAAO,CAAC,QAAQ,CAAC,eAAe,CAA2B;gBAE9B,MAAM,EAAE,iBAAiB;IAOtD,eAAe,IAAI,MAAM;IAInB,SAAS,IAAI,OAAO,CAAC,eAAe,CAAC;IAIrC,QAAQ,CACZ,IAAI,EAAE,MAAM,EACZ,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC9B,MAAM,CAAC,EAAE,WAAW,GACnB,OAAO,CAAC,cAAc,CAAC;IAwDpB,WAAW,IAAI,OAAO,CAAC,iBAAiB,CAAC;IAkBzC,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,OAAO,CAAC,eAAe,CAAC;CAOvF;AAED,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,iBAAiB,GAAG,oBAAoB,CAEjF"}
1
+ {"version":3,"file":"executor.d.ts","sourceRoot":"","sources":["../src/executor.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,cAAc,EACd,eAAe,EACf,iBAAiB,EACjB,eAAe,EAChB,MAAM,oCAAoC,CAAC;AAC5C,OAAO,KAAK,EAEV,aAAa,EACd,MAAM,qBAAqB,CAAC;AAoB7B,OAAO,KAAK,EACV,eAAe,EACf,gBAAgB,EAChB,kBAAkB,EAClB,cAAc,EACf,MAAM,YAAY,CAAC;AAOpB,MAAM,WAAW,iBAAiB;IAChC,4DAA4D;IAC5D,QAAQ,EAAE,eAAe,CAAC;IAC1B,wEAAwE;IACxE,SAAS,EAAE,aAAa,CAAC;IACzB,6DAA6D;IAC7D,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,2EAA2E;IAC3E,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,wEAAwE;IACxE,WAAW,CAAC,EAAE,cAAc,CAAC;IAC7B,0DAA0D;IAC1D,eAAe,CAAC,EAAE,kBAAkB,CAAC;IACrC,wEAAwE;IACxE,aAAa,CAAC,EAAE,gBAAgB,CAAC;CAClC;AAED,MAAM,WAAW,eAAgB,SAAQ,iBAAiB;IACxD,wCAAwC;IACxC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,2CAA2C;IAC3C,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,eAAe;IAC9B,SAAS,IAAI,OAAO,CAAC,eAAe,CAAC,CAAC;IACtC,QAAQ,CACN,IAAI,EAAE,MAAM,EACZ,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC9B,MAAM,CAAC,EAAE,WAAW,GACnB,OAAO,CAAC,cAAc,CAAC,CAAC;IAC3B,WAAW,IAAI,OAAO,CAAC,iBAAiB,CAAC,CAAC;IAC1C,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,OAAO,CAAC,eAAe,CAAC,CAAC;IACjF,eAAe,IAAI,MAAM,CAAC;CAC3B;AAED;;;;;;GAMG;AACH,qBAAa,oBAAqB,YAAW,eAAe;IAK9C,OAAO,CAAC,QAAQ,CAAC,MAAM;IAJnC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAgC;IAC7D,OAAO,CAAC,QAAQ,CAAC,eAAe,CAA2B;IAC3D,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAyB;gBAE1B,MAAM,EAAE,iBAAiB;IAQtD,eAAe,IAAI,MAAM;IAInB,SAAS,IAAI,OAAO,CAAC,eAAe,CAAC;IAIrC,QAAQ,CACZ,IAAI,EAAE,MAAM,EACZ,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC9B,MAAM,CAAC,EAAE,WAAW,GACnB,OAAO,CAAC,cAAc,CAAC;IAwDpB,WAAW,IAAI,OAAO,CAAC,iBAAiB,CAAC;IAkBzC,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,OAAO,CAAC,eAAe,CAAC;CAOvF;AAED,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,iBAAiB,GAAG,oBAAoB,CAEjF"}
package/dist/executor.js CHANGED
@@ -6,6 +6,7 @@ import { queryDatasetTool } from './tools/query-dataset.js';
6
6
  import { queryMetricTool } from './tools/query-metric.js';
7
7
  import { buildMCPToolManifest } from './tools/tool-manifest.js';
8
8
  import { buildMCPQuerySchemas } from './tools/utils/canonical-query-schemas.js';
9
+ import { assertManifestWithinBudget, resolveCatalogBudget, } from './tools/utils/catalog-budget.js';
9
10
  import { assertWithinBudget, resolveExecutionBudget, } from './tools/utils/execution-budget.js';
10
11
  import { resolveQueryLimits } from './tools/utils/query-limits.js';
11
12
  import { validateMCPServerTenantConfig } from './utils/tenant-config.js';
@@ -21,18 +22,20 @@ export class HypequeryMCPExecutor {
21
22
  config;
22
23
  querySchemas;
23
24
  executionBudget;
25
+ catalogBudget;
24
26
  constructor(config) {
25
27
  this.config = config;
26
28
  validateMCPServerTenantConfig(config);
27
29
  resolveQueryLimits(undefined, config.queryLimits);
28
30
  this.executionBudget = resolveExecutionBudget(config.executionBudget);
31
+ this.catalogBudget = resolveCatalogBudget(config.catalogBudget);
29
32
  this.querySchemas = buildMCPQuerySchemas(config.datasets ?? {}, config.queryLimits);
30
33
  }
31
34
  getManifestHash() {
32
35
  return this.querySchemas.manifestHash;
33
36
  }
34
37
  async listTools() {
35
- return buildMCPToolManifest(this.querySchemas);
38
+ return assertManifestWithinBudget(buildMCPToolManifest(this.querySchemas), this.catalogBudget);
36
39
  }
37
40
  async callTool(name, args, signal) {
38
41
  try {
package/dist/index.d.ts CHANGED
@@ -6,6 +6,7 @@
6
6
  */
7
7
  export { HypequeryMCPServer, createMCPServer, type MCPServerConfig } from './server.js';
8
8
  export { HypequeryMCPExecutor, createMCPExecutor, type MCPExecutorConfig, type MCPToolExecutor, } from './executor.js';
9
+ export { HypequeryMCPDiscoveryExecutor, createMCPDiscoveryExecutor, type MCPDiscoveryExecutorConfig, type MCPToolManifestMeta, } from './discovery-executor.js';
9
10
  export { HypequeryMCPProtocolServer, createMCPProtocolServer, type MCPProtocolServerOptions, } from './protocol-server.js';
10
11
  export { connectMCPServerStdio, startStdioMCPServer } from './stdio.js';
11
12
  export { listDatasetsTool } from './tools/list-datasets.js';
@@ -13,8 +14,8 @@ export { getDatasetSchemaTool, getTrustedDatasetSchema } from './tools/introspec
13
14
  export { queryMetricTool } from './tools/query-metric.js';
14
15
  export { queryDatasetTool } from './tools/query-dataset.js';
15
16
  export { datasetGuidePrompt } from './prompts/dataset-guide.js';
16
- export type { DatasetRegistry, QueryMetricArgs, QueryDatasetArgs, QueryToolOptions, MCPExecutionBudget, MCPQueryLimits, SchemaToolOptions, GetDatasetSchemaArgs, MCPToolResponse, DatasetSchema, DimensionSchema, MetricSchema, RelationshipSchema, DatasetListItem, DatasetsListResponse, QueryResultResponse, QueryResultMeta, } from './types.js';
17
- export { MCPExecutionBudgetError, MCPToolError, classifyMCPToolError, formatMCPToolError, type MCPErrorDetails, type MCPExecutionErrorCode, type MCPToolErrorCode, type MCPToolErrorCategory, } from './errors.js';
18
- export { MAX_QUERY_LIMIT, DEFAULT_QUERY_LIMIT, MAX_QUERY_OFFSET, MAX_QUERY_DIMENSIONS, MAX_QUERY_MEASURES, MAX_QUERY_FILTERS, MAX_QUERY_ORDER_BY, DEFAULT_QUERY_TIMEOUT_MS, MAX_QUERY_TIMEOUT_MS, DEFAULT_RESPONSE_BYTES, MAX_RESPONSE_BYTES, } from './types.js';
17
+ export type { DatasetRegistry, QueryMetricArgs, QueryDatasetArgs, QueryToolOptions, MCPExecutionBudget, MCPCatalogBudget, MCPQueryLimits, SchemaToolOptions, GetDatasetSchemaArgs, MCPToolResponse, DatasetSchema, DimensionSchema, MetricSchema, RelationshipSchema, DatasetListItem, DatasetsListResponse, QueryResultResponse, QueryResultMeta, } from './types.js';
18
+ export { MCPCatalogBudgetError, MCPExecutionBudgetError, MCPToolError, classifyMCPToolError, formatMCPToolError, type MCPErrorDetails, type MCPExecutionErrorCode, type MCPToolErrorCode, type MCPToolErrorCategory, } from './errors.js';
19
+ export { MAX_QUERY_LIMIT, DEFAULT_QUERY_LIMIT, MAX_QUERY_OFFSET, MAX_QUERY_DIMENSIONS, MAX_QUERY_MEASURES, MAX_QUERY_FILTERS, MAX_QUERY_ORDER_BY, DEFAULT_QUERY_TIMEOUT_MS, MAX_QUERY_TIMEOUT_MS, DEFAULT_RESPONSE_BYTES, MAX_RESPONSE_BYTES, DEFAULT_MANIFEST_TOOLS, MAX_MANIFEST_TOOLS, DEFAULT_MANIFEST_BYTES, MAX_MANIFEST_BYTES, } from './types.js';
19
20
  export { MCP_PACKAGE_VERSION } from './version.js';
20
21
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,kBAAkB,EAAE,eAAe,EAAE,KAAK,eAAe,EAAE,MAAM,aAAa,CAAC;AACxF,OAAO,EACL,oBAAoB,EACpB,iBAAiB,EACjB,KAAK,iBAAiB,EACtB,KAAK,eAAe,GACrB,MAAM,eAAe,CAAC;AACvB,OAAO,EACL,0BAA0B,EAC1B,uBAAuB,EACvB,KAAK,wBAAwB,GAC9B,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,qBAAqB,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AACxE,OAAO,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAC5D,OAAO,EAAE,oBAAoB,EAAE,uBAAuB,EAAE,MAAM,uBAAuB,CAAC;AACtF,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAC1D,OAAO,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAC5D,OAAO,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAC;AAGhE,YAAY,EACV,eAAe,EACf,eAAe,EACf,gBAAgB,EAChB,gBAAgB,EAChB,kBAAkB,EAClB,cAAc,EACd,iBAAiB,EACjB,oBAAoB,EACpB,eAAe,EACf,aAAa,EACb,eAAe,EACf,YAAY,EACZ,kBAAkB,EAClB,eAAe,EACf,oBAAoB,EACpB,mBAAmB,EACnB,eAAe,GAChB,MAAM,YAAY,CAAC;AACpB,OAAO,EACL,uBAAuB,EACvB,YAAY,EACZ,oBAAoB,EACpB,kBAAkB,EAClB,KAAK,eAAe,EACpB,KAAK,qBAAqB,EAC1B,KAAK,gBAAgB,EACrB,KAAK,oBAAoB,GAC1B,MAAM,aAAa,CAAC;AACrB,OAAO,EACL,eAAe,EACf,mBAAmB,EACnB,gBAAgB,EAChB,oBAAoB,EACpB,kBAAkB,EAClB,iBAAiB,EACjB,kBAAkB,EAClB,wBAAwB,EACxB,oBAAoB,EACpB,sBAAsB,EACtB,kBAAkB,GACnB,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,kBAAkB,EAAE,eAAe,EAAE,KAAK,eAAe,EAAE,MAAM,aAAa,CAAC;AACxF,OAAO,EACL,oBAAoB,EACpB,iBAAiB,EACjB,KAAK,iBAAiB,EACtB,KAAK,eAAe,GACrB,MAAM,eAAe,CAAC;AACvB,OAAO,EACL,6BAA6B,EAC7B,0BAA0B,EAC1B,KAAK,0BAA0B,EAC/B,KAAK,mBAAmB,GACzB,MAAM,yBAAyB,CAAC;AACjC,OAAO,EACL,0BAA0B,EAC1B,uBAAuB,EACvB,KAAK,wBAAwB,GAC9B,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,qBAAqB,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AACxE,OAAO,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAC5D,OAAO,EAAE,oBAAoB,EAAE,uBAAuB,EAAE,MAAM,uBAAuB,CAAC;AACtF,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAC1D,OAAO,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAC5D,OAAO,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAC;AAGhE,YAAY,EACV,eAAe,EACf,eAAe,EACf,gBAAgB,EAChB,gBAAgB,EAChB,kBAAkB,EAClB,gBAAgB,EAChB,cAAc,EACd,iBAAiB,EACjB,oBAAoB,EACpB,eAAe,EACf,aAAa,EACb,eAAe,EACf,YAAY,EACZ,kBAAkB,EAClB,eAAe,EACf,oBAAoB,EACpB,mBAAmB,EACnB,eAAe,GAChB,MAAM,YAAY,CAAC;AACpB,OAAO,EACL,qBAAqB,EACrB,uBAAuB,EACvB,YAAY,EACZ,oBAAoB,EACpB,kBAAkB,EAClB,KAAK,eAAe,EACpB,KAAK,qBAAqB,EAC1B,KAAK,gBAAgB,EACrB,KAAK,oBAAoB,GAC1B,MAAM,aAAa,CAAC;AACrB,OAAO,EACL,eAAe,EACf,mBAAmB,EACnB,gBAAgB,EAChB,oBAAoB,EACpB,kBAAkB,EAClB,iBAAiB,EACjB,kBAAkB,EAClB,wBAAwB,EACxB,oBAAoB,EACpB,sBAAsB,EACtB,kBAAkB,EAClB,sBAAsB,EACtB,kBAAkB,EAClB,sBAAsB,EACtB,kBAAkB,GACnB,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC"}
package/dist/index.js CHANGED
@@ -6,6 +6,7 @@
6
6
  */
7
7
  export { HypequeryMCPServer, createMCPServer } from './server.js';
8
8
  export { HypequeryMCPExecutor, createMCPExecutor, } from './executor.js';
9
+ export { HypequeryMCPDiscoveryExecutor, createMCPDiscoveryExecutor, } from './discovery-executor.js';
9
10
  export { HypequeryMCPProtocolServer, createMCPProtocolServer, } from './protocol-server.js';
10
11
  export { connectMCPServerStdio, startStdioMCPServer } from './stdio.js';
11
12
  export { listDatasetsTool } from './tools/list-datasets.js';
@@ -13,6 +14,6 @@ export { getDatasetSchemaTool, getTrustedDatasetSchema } from './tools/introspec
13
14
  export { queryMetricTool } from './tools/query-metric.js';
14
15
  export { queryDatasetTool } from './tools/query-dataset.js';
15
16
  export { datasetGuidePrompt } from './prompts/dataset-guide.js';
16
- export { MCPExecutionBudgetError, MCPToolError, classifyMCPToolError, formatMCPToolError, } from './errors.js';
17
- export { MAX_QUERY_LIMIT, DEFAULT_QUERY_LIMIT, MAX_QUERY_OFFSET, MAX_QUERY_DIMENSIONS, MAX_QUERY_MEASURES, MAX_QUERY_FILTERS, MAX_QUERY_ORDER_BY, DEFAULT_QUERY_TIMEOUT_MS, MAX_QUERY_TIMEOUT_MS, DEFAULT_RESPONSE_BYTES, MAX_RESPONSE_BYTES, } from './types.js';
17
+ export { MCPCatalogBudgetError, MCPExecutionBudgetError, MCPToolError, classifyMCPToolError, formatMCPToolError, } from './errors.js';
18
+ export { MAX_QUERY_LIMIT, DEFAULT_QUERY_LIMIT, MAX_QUERY_OFFSET, MAX_QUERY_DIMENSIONS, MAX_QUERY_MEASURES, MAX_QUERY_FILTERS, MAX_QUERY_ORDER_BY, DEFAULT_QUERY_TIMEOUT_MS, MAX_QUERY_TIMEOUT_MS, DEFAULT_RESPONSE_BYTES, MAX_RESPONSE_BYTES, DEFAULT_MANIFEST_TOOLS, MAX_MANIFEST_TOOLS, DEFAULT_MANIFEST_BYTES, MAX_MANIFEST_BYTES, } from './types.js';
18
19
  export { MCP_PACKAGE_VERSION } from './version.js';
@@ -5,5 +5,13 @@ import type { DatasetRegistry, MCPQueryLimits } from '../../types.js';
5
5
  * type also accepts legacy metadata-only objects; retain a generic validator for
6
6
  * those compatibility inputs until the publishing API replaces them.
7
7
  */
8
- export declare function buildMCPQuerySchemas(datasets: DatasetRegistry, configured?: MCPQueryLimits): CanonicalSemanticQuerySchemas;
8
+ export declare function buildMCPQuerySchemas(datasets: DatasetRegistry, configured?: MCPQueryLimits,
9
+ /**
10
+ * Datasets offered as a `query_dataset` target. Defaults to all of them.
11
+ *
12
+ * A dataset outside this list keeps its metrics and its joins; it is only
13
+ * withheld as a direct target, which a hosted gateway needs when a caller is
14
+ * entitled to a metric on a dataset it may not query itself.
15
+ */
16
+ queryableDatasets?: readonly string[]): CanonicalSemanticQuerySchemas;
9
17
  //# sourceMappingURL=canonical-query-schemas.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"canonical-query-schemas.d.ts","sourceRoot":"","sources":["../../../src/tools/utils/canonical-query-schemas.ts"],"names":[],"mappings":"AACA,OAAO,EAGL,KAAK,6BAA6B,EAEnC,MAAM,qBAAqB,CAAC;AAE7B,OAAO,KAAK,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AA0BtE;;;;GAIG;AACH,wBAAgB,oBAAoB,CAClC,QAAQ,EAAE,eAAe,EACzB,UAAU,CAAC,EAAE,cAAc,GAC1B,6BAA6B,CAqF/B"}
1
+ {"version":3,"file":"canonical-query-schemas.d.ts","sourceRoot":"","sources":["../../../src/tools/utils/canonical-query-schemas.ts"],"names":[],"mappings":"AACA,OAAO,EAGL,KAAK,6BAA6B,EAEnC,MAAM,qBAAqB,CAAC;AAE7B,OAAO,KAAK,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AA0BtE;;;;GAIG;AACH,wBAAgB,oBAAoB,CAClC,QAAQ,EAAE,eAAe,EACzB,UAAU,CAAC,EAAE,cAAc;AAC3B;;;;;;GAMG;AACH,iBAAiB,CAAC,EAAE,SAAS,MAAM,EAAE,GACpC,6BAA6B,CAqG/B"}
@@ -26,8 +26,17 @@ function withLegacyDirectMetrics(datasets) {
26
26
  * type also accepts legacy metadata-only objects; retain a generic validator for
27
27
  * those compatibility inputs until the publishing API replaces them.
28
28
  */
29
- export function buildMCPQuerySchemas(datasets, configured) {
29
+ export function buildMCPQuerySchemas(datasets, configured,
30
+ /**
31
+ * Datasets offered as a `query_dataset` target. Defaults to all of them.
32
+ *
33
+ * A dataset outside this list keeps its metrics and its joins; it is only
34
+ * withheld as a direct target, which a hosted gateway needs when a caller is
35
+ * entitled to a metric on a dataset it may not query itself.
36
+ */
37
+ queryableDatasets) {
30
38
  const limits = resolveQueryLimits(undefined, configured);
39
+ const queryable = queryableDatasets === undefined ? undefined : new Set(queryableDatasets);
31
40
  const entries = Object.entries(datasets).sort(([left], [right]) => (left < right ? -1 : left > right ? 1 : 0));
32
41
  if (entries.length === 0) {
33
42
  const queryDatasetJsonSchema = toSemanticJsonSchema(queryDatasetArgsSchema);
@@ -45,7 +54,11 @@ export function buildMCPQuerySchemas(datasets, configured) {
45
54
  });
46
55
  }
47
56
  if (entries.every(([, dataset]) => isCanonicalSchemaSource(dataset))) {
48
- return buildCanonicalSemanticQuerySchemas(withLegacyDirectMetrics(datasets), { grainField: 'grain', ...limits });
57
+ return buildCanonicalSemanticQuerySchemas(withLegacyDirectMetrics(datasets), {
58
+ grainField: 'grain',
59
+ ...limits,
60
+ ...(queryableDatasets === undefined ? {} : { queryableDatasets }),
61
+ });
49
62
  }
50
63
  const datasetSchemas = [];
51
64
  const metricSchemas = [];
@@ -54,9 +67,11 @@ export function buildMCPQuerySchemas(datasets, configured) {
54
67
  for (const [name, dataset] of entries) {
55
68
  if (isCanonicalSchemaSource(dataset)) {
56
69
  const exact = buildCanonicalSemanticQuerySchemas(withLegacyDirectMetrics({ [name]: dataset }), { grainField: 'grain', ...limits });
57
- datasetSchemas.push(exact.queryDataset);
70
+ if (queryable === undefined || queryable.has(name)) {
71
+ datasetSchemas.push(exact.queryDataset);
72
+ datasetJsonSchemas.push(exact.queryDatasetJsonSchema);
73
+ }
58
74
  metricSchemas.push(exact.queryMetric);
59
- datasetJsonSchemas.push(exact.queryDatasetJsonSchema);
60
75
  metricJsonSchemas.push(exact.queryMetricJsonSchema);
61
76
  }
62
77
  else {
@@ -67,16 +82,18 @@ export function buildMCPQuerySchemas(datasets, configured) {
67
82
  dataset: z.literal(name),
68
83
  metric: z.string().min(1),
69
84
  });
70
- datasetSchemas.push(queryDataset);
85
+ if (queryable === undefined || queryable.has(name)) {
86
+ datasetSchemas.push(queryDataset);
87
+ datasetJsonSchemas.push(advertiseDatasetQueryLimits(toSemanticJsonSchema(queryDataset), { [name]: dataset }, configured, true));
88
+ }
71
89
  metricSchemas.push(queryMetric);
72
- datasetJsonSchemas.push(advertiseDatasetQueryLimits(toSemanticJsonSchema(queryDataset), { [name]: dataset }, configured, true));
73
90
  metricJsonSchemas.push(advertiseDatasetQueryLimits(toSemanticJsonSchema(queryMetric), { [name]: dataset }, configured, false));
74
91
  }
75
92
  }
76
- const queryDataset = unionSchemas(datasetSchemas);
77
- const queryMetric = unionSchemas(metricSchemas);
78
- const queryDatasetJsonSchema = unionJsonSchemas(datasetJsonSchemas);
79
- const queryMetricJsonSchema = unionJsonSchemas(metricJsonSchemas);
93
+ const queryDataset = unionSchemas(datasetSchemas, z.object({ dataset: z.never() }).strict());
94
+ const queryMetric = unionSchemas(metricSchemas, z.object({ dataset: z.never(), metric: z.never() }).strict());
95
+ const queryDatasetJsonSchema = unionJsonSchemas(datasetJsonSchemas, toSemanticJsonSchema(queryDataset));
96
+ const queryMetricJsonSchema = unionJsonSchemas(metricJsonSchemas, toSemanticJsonSchema(queryMetric));
80
97
  const manifestHash = createHash('sha256').update(JSON.stringify({
81
98
  query_dataset: queryDatasetJsonSchema,
82
99
  query_metric: queryMetricJsonSchema,
@@ -96,12 +113,18 @@ function isCanonicalSchemaSource(dataset) {
96
113
  return source.__type === 'dataset'
97
114
  || ('requiresTenant' in source && 'supportedGrains' in source && 'orderableFields' in source);
98
115
  }
99
- function unionSchemas(schemas) {
116
+ function unionSchemas(schemas, empty) {
117
+ // No variants means nothing is offered under this tool. `z.union([])` throws,
118
+ // and a permissive fallback would advertise every dataset instead of none.
119
+ if (schemas.length === 0)
120
+ return empty;
100
121
  return schemas.length === 1
101
122
  ? schemas[0]
102
123
  : z.union(schemas);
103
124
  }
104
- function unionJsonSchemas(schemas) {
125
+ function unionJsonSchemas(schemas, empty) {
126
+ if (schemas.length === 0)
127
+ return empty;
105
128
  return schemas.length === 1
106
129
  ? schemas[0]
107
130
  : { type: 'object', anyOf: schemas };
@@ -0,0 +1,16 @@
1
+ import { type MCPCatalogBudget } from '../../types.js';
2
+ import type { ListToolsResult } from '@modelcontextprotocol/sdk/types.js';
3
+ export interface EffectiveCatalogBudget {
4
+ readonly maxTools: number;
5
+ readonly maxManifestBytes: number;
6
+ }
7
+ export declare function resolveCatalogBudget(configured?: MCPCatalogBudget): EffectiveCatalogBudget;
8
+ /**
9
+ * Refuses a manifest too large to advertise, and says which ceiling it hit.
10
+ *
11
+ * Both counts are reported so a caller choosing a tool mode can tell a catalog
12
+ * with too many targets from one with a few enormous ones; the answers are
13
+ * different — fewer tools versus fewer enum members per tool.
14
+ */
15
+ export declare function assertManifestWithinBudget(manifest: ListToolsResult, budget: EffectiveCatalogBudget): ListToolsResult;
16
+ //# sourceMappingURL=catalog-budget.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"catalog-budget.d.ts","sourceRoot":"","sources":["../../../src/tools/utils/catalog-budget.ts"],"names":[],"mappings":"AACA,OAAO,EAKL,KAAK,gBAAgB,EACtB,MAAM,gBAAgB,CAAC;AACxB,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,oCAAoC,CAAC;AAE1E,MAAM,WAAW,sBAAsB;IACrC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,gBAAgB,EAAE,MAAM,CAAC;CACnC;AAeD,wBAAgB,oBAAoB,CAClC,UAAU,GAAE,gBAAqB,GAChC,sBAAsB,CAUxB;AAED;;;;;;GAMG;AACH,wBAAgB,0BAA0B,CACxC,QAAQ,EAAE,eAAe,EACzB,MAAM,EAAE,sBAAsB,GAC7B,eAAe,CAcjB"}
@@ -0,0 +1,33 @@
1
+ import { MCPCatalogBudgetError } from '../../errors.js';
2
+ import { DEFAULT_MANIFEST_BYTES, DEFAULT_MANIFEST_TOOLS, MAX_MANIFEST_BYTES, MAX_MANIFEST_TOOLS, } from '../../types.js';
3
+ function ceiling(value, fallback, maximum, name) {
4
+ const resolved = value ?? fallback;
5
+ if (!Number.isSafeInteger(resolved) || resolved < 1 || resolved > maximum) {
6
+ throw new Error(`${name} must be an integer between 1 and ${maximum}`);
7
+ }
8
+ return resolved;
9
+ }
10
+ export function resolveCatalogBudget(configured = {}) {
11
+ return Object.freeze({
12
+ maxTools: ceiling(configured.maxTools, DEFAULT_MANIFEST_TOOLS, MAX_MANIFEST_TOOLS, 'maxTools'),
13
+ maxManifestBytes: ceiling(configured.maxManifestBytes, DEFAULT_MANIFEST_BYTES, MAX_MANIFEST_BYTES, 'maxManifestBytes'),
14
+ });
15
+ }
16
+ /**
17
+ * Refuses a manifest too large to advertise, and says which ceiling it hit.
18
+ *
19
+ * Both counts are reported so a caller choosing a tool mode can tell a catalog
20
+ * with too many targets from one with a few enormous ones; the answers are
21
+ * different — fewer tools versus fewer enum members per tool.
22
+ */
23
+ export function assertManifestWithinBudget(manifest, budget) {
24
+ if (manifest.tools.length > budget.maxTools) {
25
+ throw new MCPCatalogBudgetError(`The tool manifest advertises ${manifest.tools.length} tools; maximum is ${budget.maxTools}`);
26
+ }
27
+ const size = Buffer.byteLength(JSON.stringify(manifest), 'utf8');
28
+ if (size > budget.maxManifestBytes) {
29
+ throw new MCPCatalogBudgetError(`The tool manifest is ${size} bytes across ${manifest.tools.length} tools; `
30
+ + `maximum is ${budget.maxManifestBytes} bytes`);
31
+ }
32
+ return manifest;
33
+ }
package/dist/types.d.ts CHANGED
@@ -49,6 +49,34 @@ export interface MCPExecutionBudget {
49
49
  /** Maximum UTF-8 bytes in the serialized query response. Defaults to 1 MiB. */
50
50
  maxResponseBytes?: number;
51
51
  }
52
+ /**
53
+ * Ceilings on the tool manifest itself, rather than on any one call.
54
+ *
55
+ * Every other budget here bounds a query. This one bounds what a client is
56
+ * handed before it makes one: `query_dataset` and `query_metric` carry exact
57
+ * enums of every published dataset, dimension, measure, and filter field, so a
58
+ * large catalog produces a large manifest — paid by every client on every
59
+ * connection, and spent out of the model's context before a question is asked.
60
+ *
61
+ * A breach raises `MCPCatalogBudgetError`. It is not truncated: an agent shown
62
+ * fewer targets than the validators accept would be misled, and the manifest
63
+ * hash would no longer identify the catalog behind it.
64
+ */
65
+ export interface MCPCatalogBudget {
66
+ /**
67
+ * Maximum tools a manifest may advertise. Defaults to 64, ceiling 256.
68
+ *
69
+ * The local server publishes a fixed four. This exists for the hosted tool
70
+ * modes that publish one tool per dataset or per verified metric, where the
71
+ * count follows the catalog and needs a stop.
72
+ */
73
+ maxTools?: number;
74
+ /**
75
+ * Maximum UTF-8 bytes in the serialized manifest. Defaults to 256 KiB,
76
+ * ceiling 1 MiB.
77
+ */
78
+ maxManifestBytes?: number;
79
+ }
52
80
  /** Server-side ceilings applied in addition to Dataset limits. */
53
81
  export interface MCPQueryLimits {
54
82
  /** Rows used when a tool call omits `limit`. Defaults to 100. */
@@ -174,4 +202,8 @@ export declare const DEFAULT_QUERY_TIMEOUT_MS = 30000;
174
202
  export declare const MAX_QUERY_TIMEOUT_MS = 120000;
175
203
  export declare const DEFAULT_RESPONSE_BYTES = 1048576;
176
204
  export declare const MAX_RESPONSE_BYTES = 10485760;
205
+ export declare const DEFAULT_MANIFEST_TOOLS = 64;
206
+ export declare const MAX_MANIFEST_TOOLS = 256;
207
+ export declare const DEFAULT_MANIFEST_BYTES = 262144;
208
+ export declare const MAX_MANIFEST_BYTES = 1048576;
177
209
  //# sourceMappingURL=types.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
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;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IACtB,OAAO,CAAC,EAAE,YAAY,EAAE,CAAC;IACzB,KAAK,CAAC,EAAE,SAAS,CAAC;IAClB,OAAO,CAAC,EAAE,aAAa,EAAE,CAAC;IAC1B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IACtB,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IACpB,OAAO,CAAC,EAAE,YAAY,EAAE,CAAC;IACzB,KAAK,CAAC,EAAE,SAAS,CAAC;IAClB,OAAO,CAAC,EAAE,aAAa,EAAE,CAAC;IAC1B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,MAAM,CAAC,EAAE,cAAc,CAAC;IACxB,eAAe,CAAC,EAAE,kBAAkB,CAAC;IACrC,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,yEAAyE;IACzE,WAAW,CAAC,EAAE,UAAU,CAAC;CAC1B;AAED,6DAA6D;AAC7D,MAAM,WAAW,kBAAkB;IACjC,sEAAsE;IACtE,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,+EAA+E;IAC/E,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED;;;;;;;;;;;;GAYG;AACH,MAAM,WAAW,gBAAgB;IAC/B;;;;;;OAMG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB;;;OAGG;IACH,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED,kEAAkE;AAClE,MAAM,WAAW,cAAc;IAC7B,iEAAiE;IACjE,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,mEAAmE;IACnE,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,uDAAuD;IACvD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,qDAAqD;IACrD,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,mDAAmD;IACnD,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,0CAA0C;IAC1C,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,+CAA+C;IAC/C,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,iBAAiB;IAChC,qGAAqG;IACrG,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB;AAED;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACnC,OAAO,EAAE,MAAM,CAAC;CACjB;AAED;;;GAGG;AACH,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,KAAK,CAAC;QACb,IAAI,EAAE,MAAM,CAAC;QACb,IAAI,EAAE,MAAM,CAAC;KACd,CAAC,CAAC;IACH,iBAAiB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC5C,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED;;GAEG;AACH,MAAM,MAAM,aAAa,GAAG,mBAAmB,CAAC;AAEhD;;GAEG;AACH,MAAM,MAAM,eAAe,GAAG,qBAAqB,CAAC;AAEpD;;GAEG;AACH,MAAM,MAAM,aAAa,GAAG,mBAAmB,CAAC;AAEhD;;GAEG;AACH,MAAM,MAAM,YAAY,GAAG,kBAAkB,CAAC;AAE9C;;GAEG;AACH,MAAM,MAAM,YAAY,GAAG,kBAAkB,CAAC;AAE9C;;GAEG;AACH,MAAM,MAAM,kBAAkB,GAAG,wBAAwB,CAAC;AAE1D;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,cAAc,EAAE,MAAM,CAAC;IACvB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACnC,QAAQ,EAAE,eAAe,EAAE,CAAC;IAC5B,KAAK,EAAE,MAAM,CAAC;CACf;AAED;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB;;;OAGG;IACH,UAAU,CAAC,EAAE;QACX,KAAK,EAAE,MAAM,CAAC;QACd,MAAM,EAAE,MAAM,CAAC;QACf,OAAO,EAAE,OAAO,CAAC;KAClB,CAAC;IACF,6CAA6C;IAC7C,KAAK,CAAC,EAAE;QACN,MAAM,EAAE,KAAK,GAAG,MAAM,GAAG,QAAQ,CAAC;QAClC,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,KAAK,CAAC,EAAE,OAAO,CAAC;KACjB,CAAC;CACH;AAED;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAAC;IAChC,IAAI,EAAE,eAAe,CAAC;CACvB;AAED;;GAEG;AACH,eAAO,MAAM,eAAe,QAAQ,CAAC;AACrC,eAAO,MAAM,mBAAmB,MAAM,CAAC;AACvC,eAAO,MAAM,gBAAgB,QAAQ,CAAC;AACtC,eAAO,MAAM,oBAAoB,KAAK,CAAC;AACvC,eAAO,MAAM,kBAAkB,KAAK,CAAC;AACrC,eAAO,MAAM,iBAAiB,MAAM,CAAC;AACrC,eAAO,MAAM,kBAAkB,KAAK,CAAC;AACrC,eAAO,MAAM,wBAAwB,QAAS,CAAC;AAC/C,eAAO,MAAM,oBAAoB,SAAU,CAAC;AAC5C,eAAO,MAAM,sBAAsB,UAAY,CAAC;AAChD,eAAO,MAAM,kBAAkB,WAAa,CAAC;AAC7C,eAAO,MAAM,sBAAsB,KAAK,CAAC;AACzC,eAAO,MAAM,kBAAkB,MAAM,CAAC;AACtC,eAAO,MAAM,sBAAsB,SAAU,CAAC;AAC9C,eAAO,MAAM,kBAAkB,UAAY,CAAC"}
package/dist/types.js CHANGED
@@ -15,3 +15,7 @@ export const DEFAULT_QUERY_TIMEOUT_MS = 30_000;
15
15
  export const MAX_QUERY_TIMEOUT_MS = 120_000;
16
16
  export const DEFAULT_RESPONSE_BYTES = 1_048_576;
17
17
  export const MAX_RESPONSE_BYTES = 10_485_760;
18
+ export const DEFAULT_MANIFEST_TOOLS = 64;
19
+ export const MAX_MANIFEST_TOOLS = 256;
20
+ export const DEFAULT_MANIFEST_BYTES = 262_144;
21
+ export const MAX_MANIFEST_BYTES = 1_048_576;
package/dist/version.d.ts CHANGED
@@ -1,2 +1,2 @@
1
- export declare const MCP_PACKAGE_VERSION = "0.6.0";
1
+ export declare const MCP_PACKAGE_VERSION = "0.8.0";
2
2
  //# sourceMappingURL=version.d.ts.map
package/dist/version.js CHANGED
@@ -2,4 +2,4 @@
2
2
  //
3
3
  // Resolved at build time rather than read from package.json at import time, so
4
4
  // importing this package touches no filesystem and survives bundling.
5
- export const MCP_PACKAGE_VERSION = '0.6.0';
5
+ export const MCP_PACKAGE_VERSION = '0.8.0';
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@hypequery/mcp",
3
- "version": "0.6.0",
3
+ "version": "0.8.0",
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.14.0",
36
+ "@hypequery/datasets": "^0.16.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.10.0"
44
+ "@hypequery/clickhouse": "2.11.0"
45
45
  },
46
46
  "repository": {
47
47
  "type": "git",