@duckcodeailabs/dql-mcp 1.6.15 → 1.6.17
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/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +36 -20
- package/dist/server.js.map +1 -1
- package/dist/tools/workflows.d.ts +155 -0
- package/dist/tools/workflows.d.ts.map +1 -0
- package/dist/tools/workflows.js +210 -0
- package/dist/tools/workflows.js.map +1 -0
- package/package.json +5 -5
package/dist/index.d.ts
CHANGED
|
@@ -15,4 +15,5 @@ export { lineageImpact, lineageImpactInput } from './tools/lineage-impact.js';
|
|
|
15
15
|
export { certify, certifyInput } from './tools/certify.js';
|
|
16
16
|
export { suggestBlock, suggestBlockInput } from './tools/suggest-block.js';
|
|
17
17
|
export { kgSearch, kgSearchInput, feedbackRecord, feedbackRecordInput } from './tools/kg.js';
|
|
18
|
+
export { askDql, askDqlInput, buildDqlApp, buildDqlAppInput, buildDqlBlock, buildDqlBlockInput, inspectDqlProject, inspectDqlProjectInput, } from './tools/workflows.js';
|
|
18
19
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AACjD,OAAO,EAAE,UAAU,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAC3D,YAAY,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AACtD,OAAO,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AACjD,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAEvD,OAAO,EAAE,YAAY,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAC3E,OAAO,EAAE,QAAQ,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAC/D,OAAO,EAAE,aAAa,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAC;AAC/E,OAAO,EACL,WAAW,EACX,gBAAgB,EAChB,cAAc,EACd,mBAAmB,GACpB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,aAAa,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAC9E,OAAO,EAAE,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAC3D,OAAO,EAAE,YAAY,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAC3E,OAAO,EAAE,QAAQ,EAAE,aAAa,EAAE,cAAc,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AACjD,OAAO,EAAE,UAAU,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAC3D,YAAY,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AACtD,OAAO,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AACjD,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAEvD,OAAO,EAAE,YAAY,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAC3E,OAAO,EAAE,QAAQ,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAC/D,OAAO,EAAE,aAAa,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAC;AAC/E,OAAO,EACL,WAAW,EACX,gBAAgB,EAChB,cAAc,EACd,mBAAmB,GACpB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,aAAa,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAC9E,OAAO,EAAE,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAC3D,OAAO,EAAE,YAAY,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAC3E,OAAO,EAAE,QAAQ,EAAE,aAAa,EAAE,cAAc,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC;AAC7F,OAAO,EACL,MAAM,EACN,WAAW,EACX,WAAW,EACX,gBAAgB,EAChB,aAAa,EACb,kBAAkB,EAClB,iBAAiB,EACjB,sBAAsB,GACvB,MAAM,sBAAsB,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -14,4 +14,5 @@ export { lineageImpact, lineageImpactInput } from './tools/lineage-impact.js';
|
|
|
14
14
|
export { certify, certifyInput } from './tools/certify.js';
|
|
15
15
|
export { suggestBlock, suggestBlockInput } from './tools/suggest-block.js';
|
|
16
16
|
export { kgSearch, kgSearchInput, feedbackRecord, feedbackRecordInput } from './tools/kg.js';
|
|
17
|
+
export { askDql, askDqlInput, buildDqlApp, buildDqlAppInput, buildDqlBlock, buildDqlBlockInput, inspectDqlProject, inspectDqlProjectInput, } from './tools/workflows.js';
|
|
17
18
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AACjD,OAAO,EAAE,UAAU,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAE3D,OAAO,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AACjD,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAEvD,OAAO,EAAE,YAAY,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAC3E,OAAO,EAAE,QAAQ,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAC/D,OAAO,EAAE,aAAa,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAC;AAC/E,OAAO,EACL,WAAW,EACX,gBAAgB,EAChB,cAAc,EACd,mBAAmB,GACpB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,aAAa,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAC9E,OAAO,EAAE,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAC3D,OAAO,EAAE,YAAY,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAC3E,OAAO,EAAE,QAAQ,EAAE,aAAa,EAAE,cAAc,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AACjD,OAAO,EAAE,UAAU,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAE3D,OAAO,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AACjD,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAEvD,OAAO,EAAE,YAAY,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAC3E,OAAO,EAAE,QAAQ,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAC/D,OAAO,EAAE,aAAa,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAC;AAC/E,OAAO,EACL,WAAW,EACX,gBAAgB,EAChB,cAAc,EACd,mBAAmB,GACpB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,aAAa,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAC9E,OAAO,EAAE,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAC3D,OAAO,EAAE,YAAY,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAC3E,OAAO,EAAE,QAAQ,EAAE,aAAa,EAAE,cAAc,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC;AAC7F,OAAO,EACL,MAAM,EACN,WAAW,EACX,WAAW,EACX,gBAAgB,EAChB,aAAa,EACb,kBAAkB,EAClB,iBAAiB,EACjB,sBAAsB,GACvB,MAAM,sBAAsB,CAAC"}
|
package/dist/server.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;
|
|
1
|
+
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AA8BpE,MAAM,WAAW,mBAAmB;IAClC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,eAAO,MAAM,oBAAoB,QAmBT,CAAC;AAEzB,wBAAgB,kBAAkB,CAAC,OAAO,GAAE,mBAAwB,GAAG,SAAS,CAoI/E"}
|
package/dist/server.js
CHANGED
|
@@ -10,30 +10,46 @@ import { suggestBlock, suggestBlockInput } from './tools/suggest-block.js';
|
|
|
10
10
|
import { queryViaMetadata, queryViaMetadataInput } from './tools/query-via-metadata.js';
|
|
11
11
|
import { listProposals, listProposalsInput } from './tools/list-proposals.js';
|
|
12
12
|
import { feedbackRecord, feedbackRecordInput, inspectMetadataContext, inspectMetadataContextInput, kgSearch, kgSearchInput, } from './tools/kg.js';
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
'
|
|
16
|
-
'
|
|
17
|
-
'
|
|
18
|
-
'
|
|
19
|
-
'
|
|
20
|
-
'
|
|
21
|
-
'
|
|
22
|
-
'
|
|
23
|
-
'
|
|
24
|
-
'
|
|
25
|
-
'path verbatim.\n' +
|
|
26
|
-
'
|
|
27
|
-
'dimension, or grain, refuse and ask for
|
|
28
|
-
'
|
|
29
|
-
'
|
|
30
|
-
'`lineage_impact`
|
|
31
|
-
'
|
|
32
|
-
'
|
|
13
|
+
import { askDql, askDqlInput, buildDqlApp, buildDqlAppInput, buildDqlBlock, buildDqlBlockInput, inspectDqlProject, inspectDqlProjectInput, } from './tools/workflows.js';
|
|
14
|
+
export const DQL_MCP_INSTRUCTIONS = 'DQL is a governed analytics MCP server. Start each session with ' +
|
|
15
|
+
'`inspect_dql_project`; route every analytics question through `ask_dql` ' +
|
|
16
|
+
'before writing SQL. It returns the safe route, trust label, certified ' +
|
|
17
|
+
'candidate when available, allowed SQL context, and next tool.\n' +
|
|
18
|
+
'Tier 1 certified: for an exact saved block or direct KPI, use ' +
|
|
19
|
+
'`search_blocks`/`get_block` for discovery and `query_via_block` only when ' +
|
|
20
|
+
'a certified block grain exactly answers the question.\n' +
|
|
21
|
+
'Tier 2 generated: for named customer/user/account questions, custom filters, ' +
|
|
22
|
+
'rankings, breakdowns, comparisons, drill-throughs, or different grain, use ' +
|
|
23
|
+
'certified assets only as context. Call `inspect_metadata_context`, then `query_via_metadata` with ' +
|
|
24
|
+
'one read-only SELECT/WITH query from the inspected context. Surface ' +
|
|
25
|
+
'`uncertified: true`, the trust status, and draft path verbatim.\n' +
|
|
26
|
+
'Tier 3 missing context: if metadata does not identify a safe table, metric, ' +
|
|
27
|
+
'dimension, or grain, refuse and ask for what is missing.\n' +
|
|
28
|
+
'Use `build_dql_block` for reusable draft blocks, `build_dql_app` for app ' +
|
|
29
|
+
'drafts with certified tiles plus review-only gaps, `certify` for governance, ' +
|
|
30
|
+
'`lineage_impact` for dependencies, `kg_search` for the knowledge graph, and ' +
|
|
31
|
+
'`feedback_record` for answer quality. Never present generated SQL or draft ' +
|
|
32
|
+
'output as certified.';
|
|
33
33
|
export function createDQLMCPServer(options = {}) {
|
|
34
34
|
const projectRoot = options.projectRoot ?? findProjectRoot(process.cwd());
|
|
35
35
|
const ctx = new DQLContext({ projectRoot, dqlVersion: options.version });
|
|
36
36
|
const server = new McpServer({ name: 'dql-mcp', version: options.version ?? '0.1.0' }, { instructions: DQL_MCP_INSTRUCTIONS });
|
|
37
|
+
server.registerTool('inspect_dql_project', {
|
|
38
|
+
description: 'Front-door project health/context tool for MCP clients. Refreshes metadata/index by default and returns block, app, dashboard, semantic, catalog, and recommended-next-step status.',
|
|
39
|
+
inputSchema: inspectDqlProjectInput,
|
|
40
|
+
}, async (args) => wrap(await inspectDqlProject(ctx, args)));
|
|
41
|
+
server.registerTool('ask_dql', {
|
|
42
|
+
description: 'High-level governed ask router. Use first for business questions. Returns certified-vs-generated route, contextPackId, exact block candidate, allowed SQL context, missing context, trust status, and next safe DQL tool.',
|
|
43
|
+
inputSchema: askDqlInput,
|
|
44
|
+
}, async (args) => wrap(await askDql(ctx, args)));
|
|
45
|
+
server.registerTool('build_dql_block', {
|
|
46
|
+
description: 'High-level draft-block tool. Writes a proposed block to blocks/_drafts/ with governance results. Does not certify automatically.',
|
|
47
|
+
inputSchema: buildDqlBlockInput,
|
|
48
|
+
}, async (args) => wrap(await buildDqlBlock(ctx, args)));
|
|
49
|
+
server.registerTool('build_dql_app', {
|
|
50
|
+
description: 'High-level app builder. Creates or plans a governed DQL app draft from a prompt using certified tiles first and review-only placeholders for missing evidence.',
|
|
51
|
+
inputSchema: buildDqlAppInput,
|
|
52
|
+
}, async (args) => wrap(await buildDqlApp(ctx, args)));
|
|
37
53
|
server.registerTool('search_blocks', { description: 'Find certified DQL blocks by keyword, domain, or status.', inputSchema: searchBlocksInput }, async (args) => wrap(await searchBlocks(ctx, args)));
|
|
38
54
|
server.registerTool('get_block', { description: 'Return full metadata, dependencies, and SQL for a block.', inputSchema: getBlockInput }, async (args) => wrap(await getBlock(ctx, args)));
|
|
39
55
|
server.registerTool('query_via_block', {
|
package/dist/server.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,EAAE,UAAU,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAC3D,OAAO,EAAE,YAAY,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAC3E,OAAO,EAAE,QAAQ,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAC/D,OAAO,EAAE,aAAa,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAC;AAC/E,OAAO,EAAE,WAAW,EAAE,gBAAgB,EAAE,cAAc,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AACzG,OAAO,EAAE,aAAa,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAC9E,OAAO,EAAE,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAC3D,OAAO,EAAE,YAAY,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAC3E,OAAO,EAAE,gBAAgB,EAAE,qBAAqB,EAAE,MAAM,+BAA+B,CAAC;AACxF,OAAO,EAAE,aAAa,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAC9E,OAAO,EACL,cAAc,EACd,mBAAmB,EACnB,sBAAsB,EACtB,2BAA2B,EAC3B,QAAQ,EACR,aAAa,GACd,MAAM,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import type { DQLContext } from '../context.js';
|
|
3
|
+
import { type MetadataAllowedSqlContext } from '@duckcodeailabs/dql-agent';
|
|
4
|
+
import { suggestBlock } from './suggest-block.js';
|
|
5
|
+
export declare const askDqlInput: {
|
|
6
|
+
question: z.ZodString;
|
|
7
|
+
focusObjectKey: z.ZodOptional<z.ZodString>;
|
|
8
|
+
limit: z.ZodOptional<z.ZodNumber>;
|
|
9
|
+
};
|
|
10
|
+
export declare function askDql(ctx: DQLContext, args: {
|
|
11
|
+
question: string;
|
|
12
|
+
focusObjectKey?: string;
|
|
13
|
+
limit?: number;
|
|
14
|
+
}): Promise<{
|
|
15
|
+
question: string;
|
|
16
|
+
contextPackId: string;
|
|
17
|
+
route: import("@duckcodeailabs/dql-agent").MetadataAnswerRoute;
|
|
18
|
+
intent: import("@duckcodeailabs/dql-agent").MetadataAgentIntent;
|
|
19
|
+
trustStatus: import("@duckcodeailabs/dql-agent").MetadataTrustLabel;
|
|
20
|
+
reviewStatus: "certified" | "none" | "draft_ready" | "needs_review";
|
|
21
|
+
reason: string;
|
|
22
|
+
recommendedAction: string;
|
|
23
|
+
nextTool: string;
|
|
24
|
+
exactCertifiedBlock: {
|
|
25
|
+
objectKey: string;
|
|
26
|
+
objectType: string;
|
|
27
|
+
name: string;
|
|
28
|
+
fullName: string | undefined;
|
|
29
|
+
domain: string | undefined;
|
|
30
|
+
owner: string | undefined;
|
|
31
|
+
status: string | undefined;
|
|
32
|
+
description: string | undefined;
|
|
33
|
+
sourcePath: string | undefined;
|
|
34
|
+
} | undefined;
|
|
35
|
+
certifiedCandidates: {
|
|
36
|
+
objectKey: string;
|
|
37
|
+
objectType: string;
|
|
38
|
+
name: string;
|
|
39
|
+
fullName: string | undefined;
|
|
40
|
+
domain: string | undefined;
|
|
41
|
+
owner: string | undefined;
|
|
42
|
+
status: string | undefined;
|
|
43
|
+
description: string | undefined;
|
|
44
|
+
sourcePath: string | undefined;
|
|
45
|
+
}[];
|
|
46
|
+
selectedEvidence: {
|
|
47
|
+
objectKey: string;
|
|
48
|
+
objectType: string;
|
|
49
|
+
name: string;
|
|
50
|
+
role: import("@duckcodeailabs/dql-agent").MetadataEvidenceRole;
|
|
51
|
+
reason: string;
|
|
52
|
+
}[];
|
|
53
|
+
allowedSqlContext: MetadataAllowedSqlContext;
|
|
54
|
+
missingContext: import("@duckcodeailabs/dql-agent").MetadataMissingContext[];
|
|
55
|
+
followUps: string[];
|
|
56
|
+
warnings: string[];
|
|
57
|
+
answerContract: {
|
|
58
|
+
requiredFields: string[];
|
|
59
|
+
rule: string;
|
|
60
|
+
};
|
|
61
|
+
}>;
|
|
62
|
+
export declare const buildDqlAppInput: {
|
|
63
|
+
prompt: z.ZodString;
|
|
64
|
+
domain: z.ZodOptional<z.ZodString>;
|
|
65
|
+
owner: z.ZodOptional<z.ZodString>;
|
|
66
|
+
aiLayout: z.ZodOptional<z.ZodBoolean>;
|
|
67
|
+
saveDraft: z.ZodOptional<z.ZodBoolean>;
|
|
68
|
+
overwrite: z.ZodOptional<z.ZodBoolean>;
|
|
69
|
+
};
|
|
70
|
+
export declare function buildDqlApp(ctx: DQLContext, args: {
|
|
71
|
+
prompt: string;
|
|
72
|
+
domain?: string;
|
|
73
|
+
owner?: string;
|
|
74
|
+
aiLayout?: boolean;
|
|
75
|
+
saveDraft?: boolean;
|
|
76
|
+
overwrite?: boolean;
|
|
77
|
+
}): Promise<{
|
|
78
|
+
ok: boolean;
|
|
79
|
+
appId: string;
|
|
80
|
+
name: string;
|
|
81
|
+
domain: string;
|
|
82
|
+
audience: string;
|
|
83
|
+
lifecycle: "draft" | "review";
|
|
84
|
+
certifiedTiles: number;
|
|
85
|
+
draftTiles: number;
|
|
86
|
+
validation: import("@duckcodeailabs/dql-agent").AppPlanValidationResult;
|
|
87
|
+
plan: import("@duckcodeailabs/dql-agent").AppPlan;
|
|
88
|
+
generated: import("@duckcodeailabs/dql-agent").GeneratedAppPackage | undefined;
|
|
89
|
+
nextActions: string[];
|
|
90
|
+
}>;
|
|
91
|
+
export declare const inspectDqlProjectInput: {
|
|
92
|
+
refresh: z.ZodOptional<z.ZodBoolean>;
|
|
93
|
+
};
|
|
94
|
+
export declare function inspectDqlProject(ctx: DQLContext, args: {
|
|
95
|
+
refresh?: boolean;
|
|
96
|
+
}): Promise<{
|
|
97
|
+
projectRoot: string;
|
|
98
|
+
blocks: {
|
|
99
|
+
total: number;
|
|
100
|
+
certified: number;
|
|
101
|
+
draft: number;
|
|
102
|
+
};
|
|
103
|
+
apps: number;
|
|
104
|
+
dashboards: number;
|
|
105
|
+
semantic: {
|
|
106
|
+
metrics: number;
|
|
107
|
+
dimensions: number;
|
|
108
|
+
};
|
|
109
|
+
index: {
|
|
110
|
+
nodes: number;
|
|
111
|
+
edges: number;
|
|
112
|
+
skills: number;
|
|
113
|
+
} | undefined;
|
|
114
|
+
catalog: {
|
|
115
|
+
path: string;
|
|
116
|
+
refreshed: boolean;
|
|
117
|
+
objectCount: number;
|
|
118
|
+
edgeCount: number;
|
|
119
|
+
diagnostics: unknown[];
|
|
120
|
+
} | undefined;
|
|
121
|
+
recommendedNextStep: string;
|
|
122
|
+
}>;
|
|
123
|
+
export declare const buildDqlBlockInput: {
|
|
124
|
+
name: z.ZodString;
|
|
125
|
+
domain: z.ZodString;
|
|
126
|
+
owner: z.ZodString;
|
|
127
|
+
description: z.ZodString;
|
|
128
|
+
sql: z.ZodString;
|
|
129
|
+
tags: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
|
|
130
|
+
chartType: z.ZodOptional<z.ZodString>;
|
|
131
|
+
};
|
|
132
|
+
export declare function buildDqlBlock(ctx: DQLContext, args: Parameters<typeof suggestBlock>[1]): {
|
|
133
|
+
error: string;
|
|
134
|
+
name?: undefined;
|
|
135
|
+
path?: undefined;
|
|
136
|
+
certified?: undefined;
|
|
137
|
+
errors?: undefined;
|
|
138
|
+
warnings?: undefined;
|
|
139
|
+
nextStep?: undefined;
|
|
140
|
+
} | {
|
|
141
|
+
name: string;
|
|
142
|
+
path: string;
|
|
143
|
+
certified: boolean;
|
|
144
|
+
errors: {
|
|
145
|
+
rule: string;
|
|
146
|
+
message: string;
|
|
147
|
+
}[];
|
|
148
|
+
warnings: {
|
|
149
|
+
rule: string;
|
|
150
|
+
message: string;
|
|
151
|
+
}[];
|
|
152
|
+
nextStep: string;
|
|
153
|
+
error?: undefined;
|
|
154
|
+
};
|
|
155
|
+
//# sourceMappingURL=workflows.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workflows.d.ts","sourceRoot":"","sources":["../../src/tools/workflows.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,EASL,KAAK,yBAAyB,EAE/B,MAAM,2BAA2B,CAAC;AACnC,OAAO,EAAE,YAAY,EAAqB,MAAM,oBAAoB,CAAC;AAErE,eAAO,MAAM,WAAW;;;;CAIvB,CAAC;AAEF,wBAAsB,MAAM,CAC1B,GAAG,EAAE,UAAU,EACf,IAAI,EAAE;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,cAAc,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8DpE;AAED,eAAO,MAAM,gBAAgB;;;;;;;CAO5B,CAAC;AAEF,wBAAsB,WAAW,CAC/B,GAAG,EAAE,UAAU,EACf,IAAI,EAAE;IACJ,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;;;;;;;;;;;;;GA+CF;AAED,eAAO,MAAM,sBAAsB;;CAElC,CAAC;AAEF,wBAAsB,iBAAiB,CACrC,GAAG,EAAE,UAAU,EACf,IAAI,EAAE;IAAE,OAAO,CAAC,EAAE,OAAO,CAAA;CAAE;;;;;;;;;;;;;;eAEP,MAAM;eAAS,MAAM;gBAAU,MAAM;;;cACpC,MAAM;mBAAa,OAAO;qBAAe,MAAM;mBAAa,MAAM;qBAAe,OAAO,EAAE;;;GA2BhH;AAED,eAAO,MAAM,kBAAkB;;;;;;;;CAAoB,CAAC;AAEpD,wBAAgB,aAAa,CAC3B,GAAG,EAAE,UAAU,EACf,IAAI,EAAE,UAAU,CAAC,OAAO,YAAY,CAAC,CAAC,CAAC,CAAC;;;;;;;;;;;;;;;;;;;;;;EAGzC"}
|
|
@@ -0,0 +1,210 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import { KGStore, defaultKgPath, ensureMetadataCatalogFresh, generateAppFromPlan, planAgentAnswer, planAppFromPrompt, reindexProject, validateAppPlan, } from '@duckcodeailabs/dql-agent';
|
|
3
|
+
import { suggestBlock, suggestBlockInput } from './suggest-block.js';
|
|
4
|
+
export const askDqlInput = {
|
|
5
|
+
question: z.string().min(1).describe('Business or analytics question to route through governed DQL context.'),
|
|
6
|
+
focusObjectKey: z.string().optional().describe('Optional metadata object key to bias retrieval.'),
|
|
7
|
+
limit: z.number().int().min(1).max(160).optional().describe('Maximum metadata objects in the context pack.'),
|
|
8
|
+
};
|
|
9
|
+
export async function askDql(ctx, args) {
|
|
10
|
+
const catalog = await ensureMetadataCatalogFresh(ctx.projectRoot).catch((error) => ({
|
|
11
|
+
path: '',
|
|
12
|
+
refreshed: false,
|
|
13
|
+
objectCount: 0,
|
|
14
|
+
edgeCount: 0,
|
|
15
|
+
diagnostics: [{
|
|
16
|
+
kind: 'metadata',
|
|
17
|
+
severity: 'error',
|
|
18
|
+
message: error instanceof Error ? error.message : String(error),
|
|
19
|
+
}],
|
|
20
|
+
fingerprint: '',
|
|
21
|
+
}));
|
|
22
|
+
const planned = await planAgentAnswer(ctx.projectRoot, {
|
|
23
|
+
question: args.question,
|
|
24
|
+
focusObjectKey: args.focusObjectKey,
|
|
25
|
+
limit: args.limit ?? 100,
|
|
26
|
+
surface: 'mcp',
|
|
27
|
+
});
|
|
28
|
+
const route = planned.routeDecision;
|
|
29
|
+
const exact = route.exactObjectKey
|
|
30
|
+
? planned.contextPack.objects.find((object) => object.objectKey === route.exactObjectKey)
|
|
31
|
+
: undefined;
|
|
32
|
+
const certifiedCandidates = planned.contextPack.objects
|
|
33
|
+
.filter((object) => object.objectType === 'dql_block' && isCertified(object))
|
|
34
|
+
.slice(0, 8)
|
|
35
|
+
.map(summarizeObject);
|
|
36
|
+
return {
|
|
37
|
+
question: args.question,
|
|
38
|
+
contextPackId: planned.contextPackId,
|
|
39
|
+
route: route.route,
|
|
40
|
+
intent: route.intent,
|
|
41
|
+
trustStatus: route.trustLabel,
|
|
42
|
+
reviewStatus: route.reviewStatus,
|
|
43
|
+
reason: route.reason,
|
|
44
|
+
recommendedAction: recommendedAction(route.route),
|
|
45
|
+
nextTool: nextTool(route.route),
|
|
46
|
+
exactCertifiedBlock: exact && exact.objectType === 'dql_block' ? summarizeObject(exact) : undefined,
|
|
47
|
+
certifiedCandidates,
|
|
48
|
+
selectedEvidence: route.selectedEvidence,
|
|
49
|
+
allowedSqlContext: summarizeAllowedSqlContext(planned.allowedSqlContext),
|
|
50
|
+
missingContext: planned.missingContext,
|
|
51
|
+
followUps: route.followUps,
|
|
52
|
+
warnings: [
|
|
53
|
+
...planned.warnings,
|
|
54
|
+
...catalog.diagnostics.map((diagnostic) => diagnostic.message),
|
|
55
|
+
],
|
|
56
|
+
answerContract: {
|
|
57
|
+
requiredFields: [
|
|
58
|
+
'answer',
|
|
59
|
+
'tableOrResultSummary',
|
|
60
|
+
'sqlWhenGenerated',
|
|
61
|
+
'trustStatus',
|
|
62
|
+
'citations',
|
|
63
|
+
'draftPathWhenGenerated',
|
|
64
|
+
'nextReviewAction',
|
|
65
|
+
],
|
|
66
|
+
rule: 'Never present generated SQL or Tier-2 preview rows as certified.',
|
|
67
|
+
},
|
|
68
|
+
};
|
|
69
|
+
}
|
|
70
|
+
export const buildDqlAppInput = {
|
|
71
|
+
prompt: z.string().min(1).describe('App outcome request, for example "Build a Customer 360 for Melissa Lopez".'),
|
|
72
|
+
domain: z.string().optional().describe('Optional business domain to prioritize.'),
|
|
73
|
+
owner: z.string().optional().describe('Owner identity to store on the generated app.'),
|
|
74
|
+
aiLayout: z.boolean().optional().describe('Store richer dynamic GenUI layout metadata.'),
|
|
75
|
+
saveDraft: z.boolean().optional().describe('Write the app draft files. Default true.'),
|
|
76
|
+
overwrite: z.boolean().optional().describe('Overwrite an existing app folder if it already exists. Default false.'),
|
|
77
|
+
};
|
|
78
|
+
export async function buildDqlApp(ctx, args) {
|
|
79
|
+
const kgPath = defaultKgPath(ctx.projectRoot);
|
|
80
|
+
await reindexProject(ctx.projectRoot, { kgPath });
|
|
81
|
+
const kg = new KGStore(kgPath);
|
|
82
|
+
try {
|
|
83
|
+
const plan = planAppFromPrompt({
|
|
84
|
+
prompt: args.prompt,
|
|
85
|
+
kg,
|
|
86
|
+
domain: cleanOptional(args.domain),
|
|
87
|
+
owner: cleanOptional(args.owner),
|
|
88
|
+
plannerMode: args.aiLayout ? 'ai_assisted' : 'deterministic',
|
|
89
|
+
});
|
|
90
|
+
const validation = validateAppPlan(plan, kg);
|
|
91
|
+
const generated = args.saveDraft === false
|
|
92
|
+
? undefined
|
|
93
|
+
: generateAppFromPlan(ctx.projectRoot, plan, kg, { overwrite: args.overwrite === true });
|
|
94
|
+
if (generated) {
|
|
95
|
+
ctx.refresh();
|
|
96
|
+
await ensureMetadataCatalogFresh(ctx.projectRoot, { force: true }).catch(() => undefined);
|
|
97
|
+
}
|
|
98
|
+
return {
|
|
99
|
+
ok: true,
|
|
100
|
+
appId: plan.appId,
|
|
101
|
+
name: plan.name,
|
|
102
|
+
domain: plan.domain,
|
|
103
|
+
audience: plan.audience,
|
|
104
|
+
lifecycle: plan.lifecycle,
|
|
105
|
+
certifiedTiles: validation.certifiedTiles,
|
|
106
|
+
draftTiles: validation.draftTiles,
|
|
107
|
+
validation,
|
|
108
|
+
plan,
|
|
109
|
+
generated,
|
|
110
|
+
nextActions: generated
|
|
111
|
+
? [
|
|
112
|
+
'Open the generated app draft in DQL.',
|
|
113
|
+
'Review draft/research tiles before stakeholder use.',
|
|
114
|
+
'Run dql app build after review.',
|
|
115
|
+
]
|
|
116
|
+
: [
|
|
117
|
+
'Review the returned plan.',
|
|
118
|
+
'Call build_dql_app again with saveDraft=true to write files.',
|
|
119
|
+
],
|
|
120
|
+
};
|
|
121
|
+
}
|
|
122
|
+
finally {
|
|
123
|
+
kg.close();
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
export const inspectDqlProjectInput = {
|
|
127
|
+
refresh: z.boolean().optional().describe('Refresh metadata and agent index before returning status. Default true.'),
|
|
128
|
+
};
|
|
129
|
+
export async function inspectDqlProject(ctx, args) {
|
|
130
|
+
let index;
|
|
131
|
+
let catalog;
|
|
132
|
+
if (args.refresh !== false) {
|
|
133
|
+
index = await reindexProject(ctx.projectRoot, { kgPath: defaultKgPath(ctx.projectRoot) });
|
|
134
|
+
catalog = await ensureMetadataCatalogFresh(ctx.projectRoot);
|
|
135
|
+
ctx.refresh();
|
|
136
|
+
}
|
|
137
|
+
const manifest = ctx.manifest;
|
|
138
|
+
const blocks = Object.values(manifest.blocks ?? {});
|
|
139
|
+
const dashboards = Object.values(manifest.dashboards ?? {});
|
|
140
|
+
const apps = Object.values(manifest.apps ?? {});
|
|
141
|
+
return {
|
|
142
|
+
projectRoot: ctx.projectRoot,
|
|
143
|
+
blocks: {
|
|
144
|
+
total: blocks.length,
|
|
145
|
+
certified: blocks.filter((block) => block.status === 'certified').length,
|
|
146
|
+
draft: blocks.filter((block) => block.status !== 'certified').length,
|
|
147
|
+
},
|
|
148
|
+
apps: apps.length,
|
|
149
|
+
dashboards: dashboards.length,
|
|
150
|
+
semantic: {
|
|
151
|
+
metrics: ctx.semanticLayer.listMetrics().length,
|
|
152
|
+
dimensions: ctx.semanticLayer.listDimensions().length,
|
|
153
|
+
},
|
|
154
|
+
index,
|
|
155
|
+
catalog,
|
|
156
|
+
recommendedNextStep: 'Use ask_dql before writing SQL, then query_via_block or query_via_metadata based on the returned route.',
|
|
157
|
+
};
|
|
158
|
+
}
|
|
159
|
+
export const buildDqlBlockInput = suggestBlockInput;
|
|
160
|
+
export function buildDqlBlock(ctx, args) {
|
|
161
|
+
return suggestBlock(ctx, args);
|
|
162
|
+
}
|
|
163
|
+
function recommendedAction(route) {
|
|
164
|
+
if (route === 'certified')
|
|
165
|
+
return 'Use query_via_block only if the certified grain exactly answers the question.';
|
|
166
|
+
if (route === 'generated_sql')
|
|
167
|
+
return 'Generate one read-only SELECT/WITH query from the allowed SQL context, then call query_via_metadata.';
|
|
168
|
+
if (route === 'research')
|
|
169
|
+
return 'Use lineage, proposals, and metadata evidence before creating or promoting any app tile.';
|
|
170
|
+
return 'Ask for the missing business object, metric, table, filter, or grain before writing SQL.';
|
|
171
|
+
}
|
|
172
|
+
function nextTool(route) {
|
|
173
|
+
if (route === 'certified')
|
|
174
|
+
return 'query_via_block';
|
|
175
|
+
if (route === 'generated_sql')
|
|
176
|
+
return 'query_via_metadata';
|
|
177
|
+
if (route === 'research')
|
|
178
|
+
return 'inspect_metadata_context';
|
|
179
|
+
return 'ask_user_clarifying_question';
|
|
180
|
+
}
|
|
181
|
+
function summarizeAllowedSqlContext(context) {
|
|
182
|
+
return {
|
|
183
|
+
relations: context.relations.slice(0, 12).map((relation) => ({
|
|
184
|
+
...relation,
|
|
185
|
+
columns: relation.columns.slice(0, 40),
|
|
186
|
+
})),
|
|
187
|
+
sourceBlockSql: context.sourceBlockSql.slice(0, 8),
|
|
188
|
+
};
|
|
189
|
+
}
|
|
190
|
+
function summarizeObject(object) {
|
|
191
|
+
return {
|
|
192
|
+
objectKey: object.objectKey,
|
|
193
|
+
objectType: object.objectType,
|
|
194
|
+
name: object.name,
|
|
195
|
+
fullName: object.fullName,
|
|
196
|
+
domain: object.domain,
|
|
197
|
+
owner: object.owner,
|
|
198
|
+
status: object.status,
|
|
199
|
+
description: object.description,
|
|
200
|
+
sourcePath: object.sourcePath,
|
|
201
|
+
};
|
|
202
|
+
}
|
|
203
|
+
function isCertified(object) {
|
|
204
|
+
return object.status === 'certified' || object.payload?.certification === 'certified';
|
|
205
|
+
}
|
|
206
|
+
function cleanOptional(value) {
|
|
207
|
+
const trimmed = value?.trim();
|
|
208
|
+
return trimmed || undefined;
|
|
209
|
+
}
|
|
210
|
+
//# sourceMappingURL=workflows.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workflows.js","sourceRoot":"","sources":["../../src/tools/workflows.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@duckcodeailabs/dql-mcp",
|
|
3
|
-
"version": "1.6.
|
|
3
|
+
"version": "1.6.17",
|
|
4
4
|
"description": "DQL MCP server: expose certified blocks, semantic layer, lineage, and governance to LLM agents via the Model Context Protocol",
|
|
5
5
|
"license": "Apache-2.0",
|
|
6
6
|
"type": "module",
|
|
@@ -24,10 +24,10 @@
|
|
|
24
24
|
"access": "public"
|
|
25
25
|
},
|
|
26
26
|
"dependencies": {
|
|
27
|
-
"@duckcodeailabs/dql-agent": "^1.6.
|
|
28
|
-
"@duckcodeailabs/dql-core": "^1.6.
|
|
29
|
-
"@duckcodeailabs/dql-governance": "^1.6.
|
|
30
|
-
"@duckcodeailabs/dql-project": "^1.6.
|
|
27
|
+
"@duckcodeailabs/dql-agent": "^1.6.17",
|
|
28
|
+
"@duckcodeailabs/dql-core": "^1.6.17",
|
|
29
|
+
"@duckcodeailabs/dql-governance": "^1.6.17",
|
|
30
|
+
"@duckcodeailabs/dql-project": "^1.6.17",
|
|
31
31
|
"@modelcontextprotocol/sdk": "^1.0.4",
|
|
32
32
|
"zod": "^3.25.0"
|
|
33
33
|
},
|