@dezhouzhang/archery-query-mcp 0.1.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.
Files changed (66) hide show
  1. package/README.md +48 -0
  2. package/dist/archeryClient.d.ts +16 -0
  3. package/dist/archeryClient.d.ts.map +1 -0
  4. package/dist/archeryClient.js +207 -0
  5. package/dist/archeryClient.js.map +1 -0
  6. package/dist/archeryHttpSupport.d.ts +8 -0
  7. package/dist/archeryHttpSupport.d.ts.map +1 -0
  8. package/dist/archeryHttpSupport.js +47 -0
  9. package/dist/archeryHttpSupport.js.map +1 -0
  10. package/dist/archeryMappers.d.ts +10 -0
  11. package/dist/archeryMappers.d.ts.map +1 -0
  12. package/dist/archeryMappers.js +205 -0
  13. package/dist/archeryMappers.js.map +1 -0
  14. package/dist/archeryShared.d.ts +32 -0
  15. package/dist/archeryShared.d.ts.map +1 -0
  16. package/dist/archeryShared.js +9 -0
  17. package/dist/archeryShared.js.map +1 -0
  18. package/dist/cli.d.ts +3 -0
  19. package/dist/cli.d.ts.map +1 -0
  20. package/dist/cli.js +38 -0
  21. package/dist/cli.js.map +1 -0
  22. package/dist/clouds.d.ts +9 -0
  23. package/dist/clouds.d.ts.map +1 -0
  24. package/dist/clouds.js +23 -0
  25. package/dist/clouds.js.map +1 -0
  26. package/dist/config.d.ts +30 -0
  27. package/dist/config.d.ts.map +1 -0
  28. package/dist/config.js +75 -0
  29. package/dist/config.js.map +1 -0
  30. package/dist/httpServer.d.ts +9 -0
  31. package/dist/httpServer.d.ts.map +1 -0
  32. package/dist/httpServer.js +87 -0
  33. package/dist/httpServer.js.map +1 -0
  34. package/dist/mcpServer.d.ts +5 -0
  35. package/dist/mcpServer.d.ts.map +1 -0
  36. package/dist/mcpServer.js +22 -0
  37. package/dist/mcpServer.js.map +1 -0
  38. package/dist/policy.d.ts +4 -0
  39. package/dist/policy.d.ts.map +1 -0
  40. package/dist/policy.js +91 -0
  41. package/dist/policy.js.map +1 -0
  42. package/dist/responses.d.ts +31 -0
  43. package/dist/responses.d.ts.map +1 -0
  44. package/dist/responses.js +2 -0
  45. package/dist/responses.js.map +1 -0
  46. package/dist/scope.d.ts +21 -0
  47. package/dist/scope.d.ts.map +1 -0
  48. package/dist/scope.js +44 -0
  49. package/dist/scope.js.map +1 -0
  50. package/dist/services.d.ts +39 -0
  51. package/dist/services.d.ts.map +1 -0
  52. package/dist/services.js +171 -0
  53. package/dist/services.js.map +1 -0
  54. package/dist/store.d.ts +8 -0
  55. package/dist/store.d.ts.map +1 -0
  56. package/dist/store.js +17 -0
  57. package/dist/store.js.map +1 -0
  58. package/dist/tools.d.ts +65 -0
  59. package/dist/tools.d.ts.map +1 -0
  60. package/dist/tools.js +98 -0
  61. package/dist/tools.js.map +1 -0
  62. package/dist/types.d.ts +78 -0
  63. package/dist/types.d.ts.map +1 -0
  64. package/dist/types.js +2 -0
  65. package/dist/types.js.map +1 -0
  66. package/package.json +37 -0
@@ -0,0 +1,39 @@
1
+ import type { DescribeTableResponse, ExecuteQueryResponse, PrepareQueryResponse, QueryHistoryResponse } from "./responses.js";
2
+ import { type QueryScopeInput, QueryScopeStore } from "./scope.js";
3
+ import { PreparedQueryStore } from "./store.js";
4
+ import type { ArcheryClient, PolicyConfig } from "./types.js";
5
+ export type ServiceContext = {
6
+ readonly userSubject: string;
7
+ readonly policy: PolicyConfig;
8
+ readonly archeryClient: ArcheryClient;
9
+ readonly preparedQueries: PreparedQueryStore;
10
+ readonly scopes: QueryScopeStore;
11
+ };
12
+ export type PrepareQueryInput = QueryScopeInput & {
13
+ readonly bugContext: string;
14
+ readonly sql: string;
15
+ readonly limitNum: number;
16
+ };
17
+ export type ExecuteQueryInput = {
18
+ readonly prepareId: string;
19
+ readonly confirmationToken: string | null;
20
+ readonly maxRows: number;
21
+ };
22
+ export type DescribeTableInput = QueryScopeInput & {
23
+ readonly schemaName: string;
24
+ readonly tableName: string;
25
+ };
26
+ export type QueryHistoryInput = QueryScopeInput & {
27
+ readonly search: string;
28
+ readonly limit: number;
29
+ };
30
+ export declare function createServiceContext(options: {
31
+ readonly userSubject: string;
32
+ readonly policy: PolicyConfig;
33
+ readonly archeryClient: ArcheryClient;
34
+ }): ServiceContext;
35
+ export declare function prepareQuery(context: ServiceContext, input: PrepareQueryInput): Promise<PrepareQueryResponse>;
36
+ export declare function executeQuery(context: ServiceContext, input: ExecuteQueryInput): Promise<ExecuteQueryResponse>;
37
+ export declare function describeTable(context: ServiceContext, input: DescribeTableInput): Promise<DescribeTableResponse>;
38
+ export declare function queryHistory(context: ServiceContext, input: QueryHistoryInput): Promise<QueryHistoryResponse>;
39
+ //# sourceMappingURL=services.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"services.d.ts","sourceRoot":"","sources":["../src/services.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACV,qBAAqB,EACrB,oBAAoB,EACpB,oBAAoB,EACpB,oBAAoB,EACrB,MAAM,gBAAgB,CAAA;AACvB,OAAO,EAAE,KAAK,eAAe,EAAE,eAAe,EAAgB,MAAM,YAAY,CAAA;AAChF,OAAO,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAA;AAC/C,OAAO,KAAK,EAAE,aAAa,EAAE,YAAY,EAA6B,MAAM,YAAY,CAAA;AAExF,MAAM,MAAM,cAAc,GAAG;IAC3B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAA;IAC5B,QAAQ,CAAC,MAAM,EAAE,YAAY,CAAA;IAC7B,QAAQ,CAAC,aAAa,EAAE,aAAa,CAAA;IACrC,QAAQ,CAAC,eAAe,EAAE,kBAAkB,CAAA;IAC5C,QAAQ,CAAC,MAAM,EAAE,eAAe,CAAA;CACjC,CAAA;AAED,MAAM,MAAM,iBAAiB,GAAG,eAAe,GAAG;IAChD,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAA;IAC3B,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAA;IACpB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAA;CAC1B,CAAA;AAED,MAAM,MAAM,iBAAiB,GAAG;IAC9B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAA;IAC1B,QAAQ,CAAC,iBAAiB,EAAE,MAAM,GAAG,IAAI,CAAA;IACzC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;CACzB,CAAA;AAED,MAAM,MAAM,kBAAkB,GAAG,eAAe,GAAG;IACjD,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAA;IAC3B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAA;CAC3B,CAAA;AAED,MAAM,MAAM,iBAAiB,GAAG,eAAe,GAAG;IAChD,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;IACvB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;CACvB,CAAA;AAED,wBAAgB,oBAAoB,CAAC,OAAO,EAAE;IAC5C,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAA;IAC5B,QAAQ,CAAC,MAAM,EAAE,YAAY,CAAA;IAC7B,QAAQ,CAAC,aAAa,EAAE,aAAa,CAAA;CACtC,GAAG,cAAc,CAQjB;AAED,wBAAsB,YAAY,CAChC,OAAO,EAAE,cAAc,EACvB,KAAK,EAAE,iBAAiB,GACvB,OAAO,CAAC,oBAAoB,CAAC,CAwD/B;AAED,wBAAsB,YAAY,CAChC,OAAO,EAAE,cAAc,EACvB,KAAK,EAAE,iBAAiB,GACvB,OAAO,CAAC,oBAAoB,CAAC,CAsC/B;AAED,wBAAsB,aAAa,CACjC,OAAO,EAAE,cAAc,EACvB,KAAK,EAAE,kBAAkB,GACxB,OAAO,CAAC,qBAAqB,CAAC,CAqBhC;AAED,wBAAsB,YAAY,CAChC,OAAO,EAAE,cAAc,EACvB,KAAK,EAAE,iBAAiB,GACvB,OAAO,CAAC,oBAAoB,CAAC,CAa/B"}
@@ -0,0 +1,171 @@
1
+ import { randomUUID } from "node:crypto";
2
+ import { sqlHash, validateSql } from "./policy.js";
3
+ import { QueryScopeStore, resolveScope } from "./scope.js";
4
+ import { PreparedQueryStore } from "./store.js";
5
+ export function createServiceContext(options) {
6
+ return {
7
+ userSubject: options.userSubject,
8
+ policy: options.policy,
9
+ archeryClient: options.archeryClient,
10
+ preparedQueries: new PreparedQueryStore(),
11
+ scopes: new QueryScopeStore(),
12
+ };
13
+ }
14
+ export async function prepareQuery(context, input) {
15
+ const scopeResult = resolveScope(context.scopes, context.userSubject, input);
16
+ if (!scopeResult.ok) {
17
+ return {
18
+ prepareId: null,
19
+ normalizedSql: input.sql,
20
+ riskLevel: scopeResult.code,
21
+ requiresConfirmation: false,
22
+ policyFindings: [],
23
+ confirmationSummary: scopeResult.message,
24
+ };
25
+ }
26
+ const decision = validateSql(context.policy, scopeResult.scope.instanceName, scopeResult.scope.dbName, input.sql, input.limitNum);
27
+ const hash = sqlHash(decision.normalizedSql);
28
+ if (!decision.allowed) {
29
+ return {
30
+ prepareId: null,
31
+ normalizedSql: decision.normalizedSql,
32
+ riskLevel: "blocked",
33
+ requiresConfirmation: false,
34
+ policyFindings: decision.findings,
35
+ confirmationSummary: "Query blocked by MCP policy",
36
+ };
37
+ }
38
+ const prepareId = `prep_${randomUUID()}`;
39
+ const riskLevel = decision.riskLevel === "low" ? "low" : "medium";
40
+ const preparedQuery = {
41
+ id: prepareId,
42
+ requestUser: context.userSubject,
43
+ ...scopeResult.scope,
44
+ normalizedSql: decision.normalizedSql,
45
+ sqlHash: hash,
46
+ riskLevel,
47
+ expiresAt: new Date(Date.now() + 10 * 60 * 1000),
48
+ used: false,
49
+ };
50
+ context.preparedQueries.save(preparedQuery);
51
+ context.scopes.bind(context.userSubject, scopeResult.scope);
52
+ const requiresConfirmation = context.policy.requireConfirmation || riskLevel !== "low";
53
+ const baseSummary = `Review SQL hash ${hash} for ${scopeResult.scope.cloudName}/${scopeResult.scope.instanceName}/${scopeResult.scope.dbName}`;
54
+ return {
55
+ prepareId,
56
+ normalizedSql: decision.normalizedSql,
57
+ riskLevel,
58
+ requiresConfirmation,
59
+ policyFindings: decision.findings,
60
+ confirmationSummary: requiresConfirmation
61
+ ? `${baseSummary}; required confirmation token: CONFIRM:${prepareId}:${hash}`
62
+ : `${baseSummary}; low-risk query may execute without a confirmation token by policy`,
63
+ };
64
+ }
65
+ export async function executeQuery(context, input) {
66
+ const preparedQuery = context.preparedQueries.find(input.prepareId);
67
+ if (preparedQuery === null) {
68
+ return blockedExecution("Unknown prepare_id");
69
+ }
70
+ if (preparedQuery.used) {
71
+ return blockedExecution("Prepared query already used");
72
+ }
73
+ if (preparedQuery.expiresAt.getTime() < Date.now()) {
74
+ return blockedExecution("Prepared query expired");
75
+ }
76
+ if (requiresConfirmation(context.policy, preparedQuery)) {
77
+ const approval = verifyConfirmation(context.userSubject, preparedQuery, input.confirmationToken);
78
+ if (!approval.ok) {
79
+ return blockedExecution(approval.reason);
80
+ }
81
+ }
82
+ const effectiveMaxRows = input.maxRows <= 0
83
+ ? context.policy.defaultLimit
84
+ : Math.min(input.maxRows, context.policy.maxLimit);
85
+ const result = await context.archeryClient.executeQuery(preparedQuery, preparedQuery.normalizedSql, effectiveMaxRows);
86
+ context.preparedQueries.markUsed(input.prepareId);
87
+ return {
88
+ executionId: `exec_${randomUUID()}`,
89
+ status: result.status,
90
+ columns: result.columns,
91
+ rows: result.rows,
92
+ rowCount: result.rowCount,
93
+ durationMs: result.durationMs,
94
+ masked: result.masked,
95
+ archeryMessage: result.message,
96
+ archeryQueryLogId: result.archeryQueryLogId,
97
+ };
98
+ }
99
+ export async function describeTable(context, input) {
100
+ const scopeResult = resolveScope(context.scopes, context.userSubject, input);
101
+ if (!scopeResult.ok) {
102
+ return { columns: [], source: `${scopeResult.code}: ${scopeResult.message}` };
103
+ }
104
+ const blockReason = metadataPolicyBlock(context.policy, scopeResult.scope, input.tableName, "table");
105
+ if (blockReason !== null) {
106
+ return { columns: [], source: `blocked: ${blockReason}` };
107
+ }
108
+ const metadata = await context.archeryClient.describeTable(scopeResult.scope, input.schemaName, input.tableName);
109
+ context.scopes.bind(context.userSubject, scopeResult.scope);
110
+ return metadata;
111
+ }
112
+ export async function queryHistory(context, input) {
113
+ const scopeResult = resolveScope(context.scopes, context.userSubject, input);
114
+ if (!scopeResult.ok) {
115
+ return { matches: [], total: 0, truncated: false, status: scopeResult.code };
116
+ }
117
+ const blockReason = metadataPolicyBlock(context.policy, scopeResult.scope, input.search, "search");
118
+ if (blockReason !== null) {
119
+ return { matches: [], total: 0, truncated: false, status: "blocked" };
120
+ }
121
+ const limit = input.limit <= 0 ? 20 : Math.min(input.limit, 100);
122
+ const result = await context.archeryClient.queryHistory(scopeResult.scope, input.search, limit);
123
+ context.scopes.bind(context.userSubject, scopeResult.scope);
124
+ return { ...result, status: "ok" };
125
+ }
126
+ function requiresConfirmation(config, query) {
127
+ return config.requireConfirmation || query.riskLevel !== "low";
128
+ }
129
+ function verifyConfirmation(userSubject, query, token) {
130
+ if (token === null || token.trim().length === 0) {
131
+ return { ok: false, reason: "Confirmation token required" };
132
+ }
133
+ if (query.requestUser !== userSubject) {
134
+ return { ok: false, reason: "Confirmation token mismatch" };
135
+ }
136
+ const expectedToken = `CONFIRM:${query.id}:${query.sqlHash}`;
137
+ return token.trim() === expectedToken
138
+ ? { ok: true }
139
+ : { ok: false, reason: "Confirmation token mismatch" };
140
+ }
141
+ function blockedExecution(reason) {
142
+ return {
143
+ executionId: `exec_${randomUUID()}`,
144
+ status: "blocked",
145
+ columns: [],
146
+ rows: [],
147
+ rowCount: 0,
148
+ durationMs: 0,
149
+ masked: false,
150
+ archeryMessage: reason,
151
+ archeryQueryLogId: null,
152
+ };
153
+ }
154
+ function metadataPolicyBlock(config, scope, checkedText, checkedKind) {
155
+ if (config.allowedInstances.size > 0 && !config.allowedInstances.has(scope.instanceName)) {
156
+ return "Instance is outside the configured allowlist";
157
+ }
158
+ if (config.allowedDatabases.size > 0 && !config.allowedDatabases.has(scope.dbName)) {
159
+ return "Database is outside the configured allowlist";
160
+ }
161
+ const lowerText = checkedText.toLowerCase();
162
+ for (const blockedTable of config.blockedTables) {
163
+ if (blockedTable.trim().length > 0 && lowerText.includes(blockedTable.toLowerCase())) {
164
+ return checkedKind === "table"
165
+ ? "Table is blocked by policy"
166
+ : "Search references a blocked table";
167
+ }
168
+ }
169
+ return null;
170
+ }
171
+ //# sourceMappingURL=services.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"services.js","sourceRoot":"","sources":["../src/services.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ import type { PreparedQuery } from "./types.js";
2
+ export declare class PreparedQueryStore {
3
+ #private;
4
+ save(query: PreparedQuery): PreparedQuery;
5
+ find(prepareId: string): PreparedQuery | null;
6
+ markUsed(prepareId: string): void;
7
+ }
8
+ //# sourceMappingURL=store.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../src/store.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAA;AAE/C,qBAAa,kBAAkB;;IAG7B,IAAI,CAAC,KAAK,EAAE,aAAa,GAAG,aAAa;IAKzC,IAAI,CAAC,SAAS,EAAE,MAAM,GAAG,aAAa,GAAG,IAAI;IAI7C,QAAQ,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI;CAMlC"}
package/dist/store.js ADDED
@@ -0,0 +1,17 @@
1
+ export class PreparedQueryStore {
2
+ #queries = new Map();
3
+ save(query) {
4
+ this.#queries.set(query.id, query);
5
+ return query;
6
+ }
7
+ find(prepareId) {
8
+ return this.#queries.get(prepareId) ?? null;
9
+ }
10
+ markUsed(prepareId) {
11
+ const query = this.#queries.get(prepareId);
12
+ if (query !== undefined) {
13
+ this.#queries.set(prepareId, { ...query, used: true });
14
+ }
15
+ }
16
+ }
17
+ //# sourceMappingURL=store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"store.js","sourceRoot":"","sources":["../src/store.ts"],"names":[],"mappings":"AAEA,MAAM,OAAO,kBAAkB;IACpB,QAAQ,GAAG,IAAI,GAAG,EAAyB,CAAA;IAEpD,IAAI,CAAC,KAAoB;QACvB,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,EAAE,KAAK,CAAC,CAAA;QAClC,OAAO,KAAK,CAAA;IACd,CAAC;IAED,IAAI,CAAC,SAAiB;QACpB,OAAO,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,IAAI,CAAA;IAC7C,CAAC;IAED,QAAQ,CAAC,SAAiB;QACxB,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,SAAS,CAAC,CAAA;QAC1C,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;YACxB,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,SAAS,EAAE,EAAE,GAAG,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAA;QACxD,CAAC;IACH,CAAC;CACF"}
@@ -0,0 +1,65 @@
1
+ import { z } from "zod";
2
+ import { type ServiceContext } from "./services.js";
3
+ import type { JsonValue } from "./types.js";
4
+ export declare const PrepareQueryShape: {
5
+ bugContext: z.ZodString;
6
+ cloudName: z.ZodDefault<z.ZodOptional<z.ZodString>>;
7
+ instanceName: z.ZodDefault<z.ZodOptional<z.ZodString>>;
8
+ dbName: z.ZodDefault<z.ZodOptional<z.ZodString>>;
9
+ sql: z.ZodString;
10
+ limitNum: z.ZodDefault<z.ZodOptional<z.ZodNumber>>;
11
+ };
12
+ export declare const PrepareQuerySchema: z.ZodObject<{
13
+ bugContext: z.ZodString;
14
+ cloudName: z.ZodDefault<z.ZodOptional<z.ZodString>>;
15
+ instanceName: z.ZodDefault<z.ZodOptional<z.ZodString>>;
16
+ dbName: z.ZodDefault<z.ZodOptional<z.ZodString>>;
17
+ sql: z.ZodString;
18
+ limitNum: z.ZodDefault<z.ZodOptional<z.ZodNumber>>;
19
+ }, z.core.$strip>;
20
+ export declare const ExecuteQueryShape: {
21
+ prepareId: z.ZodString;
22
+ confirmationToken: z.ZodDefault<z.ZodNullable<z.ZodOptional<z.ZodString>>>;
23
+ maxRows: z.ZodDefault<z.ZodOptional<z.ZodNumber>>;
24
+ };
25
+ export declare const ExecuteQuerySchema: z.ZodObject<{
26
+ prepareId: z.ZodString;
27
+ confirmationToken: z.ZodDefault<z.ZodNullable<z.ZodOptional<z.ZodString>>>;
28
+ maxRows: z.ZodDefault<z.ZodOptional<z.ZodNumber>>;
29
+ }, z.core.$strip>;
30
+ export declare const DescribeTableShape: {
31
+ cloudName: z.ZodDefault<z.ZodOptional<z.ZodString>>;
32
+ instanceName: z.ZodDefault<z.ZodOptional<z.ZodString>>;
33
+ dbName: z.ZodDefault<z.ZodOptional<z.ZodString>>;
34
+ schemaName: z.ZodDefault<z.ZodOptional<z.ZodString>>;
35
+ tableName: z.ZodString;
36
+ };
37
+ export declare const DescribeTableSchema: z.ZodObject<{
38
+ cloudName: z.ZodDefault<z.ZodOptional<z.ZodString>>;
39
+ instanceName: z.ZodDefault<z.ZodOptional<z.ZodString>>;
40
+ dbName: z.ZodDefault<z.ZodOptional<z.ZodString>>;
41
+ schemaName: z.ZodDefault<z.ZodOptional<z.ZodString>>;
42
+ tableName: z.ZodString;
43
+ }, z.core.$strip>;
44
+ export declare const QueryHistoryShape: {
45
+ search: z.ZodString;
46
+ cloudName: z.ZodDefault<z.ZodOptional<z.ZodString>>;
47
+ instanceName: z.ZodDefault<z.ZodOptional<z.ZodString>>;
48
+ dbName: z.ZodDefault<z.ZodOptional<z.ZodString>>;
49
+ limit: z.ZodDefault<z.ZodOptional<z.ZodNumber>>;
50
+ };
51
+ export declare const QueryHistorySchema: z.ZodObject<{
52
+ search: z.ZodString;
53
+ cloudName: z.ZodDefault<z.ZodOptional<z.ZodString>>;
54
+ instanceName: z.ZodDefault<z.ZodOptional<z.ZodString>>;
55
+ dbName: z.ZodDefault<z.ZodOptional<z.ZodString>>;
56
+ limit: z.ZodDefault<z.ZodOptional<z.ZodNumber>>;
57
+ }, z.core.$strip>;
58
+ export declare function callTool(context: ServiceContext, name: string, args: unknown): Promise<JsonValue>;
59
+ export declare function toolDefinitions(): readonly JsonValue[];
60
+ export declare class UnknownToolError extends Error {
61
+ readonly toolName: string;
62
+ readonly name = "UnknownToolError";
63
+ constructor(toolName: string);
64
+ }
65
+ //# sourceMappingURL=tools.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tools.d.ts","sourceRoot":"","sources":["../src/tools.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AACvB,OAAO,EAKL,KAAK,cAAc,EACpB,MAAM,eAAe,CAAA;AACtB,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAA;AAK3C,eAAO,MAAM,iBAAiB;;;;;;;CAO7B,CAAA;AAED,eAAO,MAAM,kBAAkB;;;;;;;iBAA8B,CAAA;AAE7D,eAAO,MAAM,iBAAiB;;;;CAI7B,CAAA;AAED,eAAO,MAAM,kBAAkB;;;;iBAA8B,CAAA;AAE7D,eAAO,MAAM,kBAAkB;;;;;;CAM9B,CAAA;AAED,eAAO,MAAM,mBAAmB;;;;;;iBAA+B,CAAA;AAE/D,eAAO,MAAM,iBAAiB;;;;;;CAM7B,CAAA;AAED,eAAO,MAAM,kBAAkB;;;;;;iBAA8B,CAAA;AAE7D,wBAAsB,QAAQ,CAC5B,OAAO,EAAE,cAAc,EACvB,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,OAAO,GACZ,OAAO,CAAC,SAAS,CAAC,CAapB;AAED,wBAAgB,eAAe,IAAI,SAAS,SAAS,EAAE,CAmCtD;AAED,qBAAa,gBAAiB,SAAQ,KAAK;IAE7B,QAAQ,CAAC,QAAQ,EAAE,MAAM;IADrC,QAAQ,CAAC,IAAI,sBAAqB;gBACb,QAAQ,EAAE,MAAM;CAGtC"}
package/dist/tools.js ADDED
@@ -0,0 +1,98 @@
1
+ import { z } from "zod";
2
+ import { describeTable, executeQuery, prepareQuery, queryHistory, } from "./services.js";
3
+ const OptionalString = z.string().optional().default("");
4
+ const OptionalNumber = z.number().int().optional().default(0);
5
+ export const PrepareQueryShape = {
6
+ bugContext: z.string(),
7
+ cloudName: OptionalString,
8
+ instanceName: OptionalString,
9
+ dbName: OptionalString,
10
+ sql: z.string(),
11
+ limitNum: OptionalNumber,
12
+ };
13
+ export const PrepareQuerySchema = z.object(PrepareQueryShape);
14
+ export const ExecuteQueryShape = {
15
+ prepareId: z.string(),
16
+ confirmationToken: z.string().optional().nullable().default(null),
17
+ maxRows: z.number().int().optional().default(100),
18
+ };
19
+ export const ExecuteQuerySchema = z.object(ExecuteQueryShape);
20
+ export const DescribeTableShape = {
21
+ cloudName: OptionalString,
22
+ instanceName: OptionalString,
23
+ dbName: OptionalString,
24
+ schemaName: OptionalString,
25
+ tableName: z.string(),
26
+ };
27
+ export const DescribeTableSchema = z.object(DescribeTableShape);
28
+ export const QueryHistoryShape = {
29
+ search: z.string(),
30
+ cloudName: OptionalString,
31
+ instanceName: OptionalString,
32
+ dbName: OptionalString,
33
+ limit: z.number().int().optional().default(20),
34
+ };
35
+ export const QueryHistorySchema = z.object(QueryHistoryShape);
36
+ export async function callTool(context, name, args) {
37
+ switch (name) {
38
+ case "archery_prepare_query":
39
+ return prepareQuery(context, PrepareQuerySchema.parse(args));
40
+ case "archery_execute_query":
41
+ return executeQuery(context, ExecuteQuerySchema.parse(args));
42
+ case "archery_describe_table":
43
+ return describeTable(context, DescribeTableSchema.parse(args));
44
+ case "archery_query_history":
45
+ return queryHistory(context, QueryHistorySchema.parse(args));
46
+ default:
47
+ throw new UnknownToolError(name);
48
+ }
49
+ }
50
+ export function toolDefinitions() {
51
+ return [
52
+ tool("archery_prepare_query", "Validate and prepare a read-only SQL query for Archery execution", ["bugContext", "sql"], {
53
+ bugContext: stringSchema("Bug context or reason for the query"),
54
+ cloudName: stringSchema("Archery cloud name: hangzhou, beijing, or huawei"),
55
+ instanceName: stringSchema("Archery instance name"),
56
+ dbName: stringSchema("Database name"),
57
+ sql: stringSchema("Candidate read-only SQL"),
58
+ limitNum: integerSchema("Requested row limit"),
59
+ }),
60
+ tool("archery_execute_query", "Execute a prepared query through Archery", ["prepareId"], {
61
+ prepareId: stringSchema("Prepared query ID"),
62
+ confirmationToken: stringSchema("Human confirmation token"),
63
+ maxRows: integerSchema("Maximum rows"),
64
+ }),
65
+ tool("archery_describe_table", "Read table metadata through Archery", ["tableName"], {
66
+ cloudName: stringSchema("Archery cloud name"),
67
+ instanceName: stringSchema("Archery instance name"),
68
+ dbName: stringSchema("Database name"),
69
+ schemaName: stringSchema("Schema name"),
70
+ tableName: stringSchema("Table name"),
71
+ }),
72
+ tool("archery_query_history", "Search prior query history summaries", ["search"], {
73
+ search: stringSchema("Search text or SQL fragment"),
74
+ cloudName: stringSchema("Archery cloud name"),
75
+ instanceName: stringSchema("Archery instance name"),
76
+ dbName: stringSchema("Database name"),
77
+ limit: integerSchema("Maximum matches"),
78
+ }),
79
+ ];
80
+ }
81
+ export class UnknownToolError extends Error {
82
+ toolName;
83
+ name = "UnknownToolError";
84
+ constructor(toolName) {
85
+ super(`Unknown tool: ${toolName}`);
86
+ this.toolName = toolName;
87
+ }
88
+ }
89
+ function tool(name, description, required, properties) {
90
+ return { name, description, inputSchema: { type: "object", properties, required } };
91
+ }
92
+ function stringSchema(description) {
93
+ return { type: "string", description };
94
+ }
95
+ function integerSchema(description) {
96
+ return { type: "integer", description };
97
+ }
98
+ //# sourceMappingURL=tools.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tools.js","sourceRoot":"","sources":["../src/tools.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,78 @@
1
+ export type JsonPrimitive = string | number | boolean | null;
2
+ export type JsonValue = JsonPrimitive | readonly JsonValue[] | {
3
+ readonly [key: string]: JsonValue;
4
+ };
5
+ export type JsonObject = {
6
+ readonly [key: string]: JsonValue;
7
+ };
8
+ export type PolicyFinding = {
9
+ readonly code: string;
10
+ readonly message: string;
11
+ };
12
+ export type PolicyDecision = {
13
+ readonly allowed: boolean;
14
+ readonly normalizedSql: string;
15
+ readonly effectiveLimit: number;
16
+ readonly riskLevel: "low" | "medium" | "blocked";
17
+ readonly findings: readonly PolicyFinding[];
18
+ };
19
+ export type QueryScope = {
20
+ readonly cloudName: CloudName;
21
+ readonly instanceName: string;
22
+ readonly dbName: string;
23
+ };
24
+ export type CloudName = "hangzhou" | "beijing" | "huawei";
25
+ export type PolicyConfig = {
26
+ readonly defaultLimit: number;
27
+ readonly maxLimit: number;
28
+ readonly requireConfirmation: boolean;
29
+ readonly allowedInstances: ReadonlySet<string>;
30
+ readonly allowedDatabases: ReadonlySet<string>;
31
+ readonly blockedTables: ReadonlySet<string>;
32
+ };
33
+ export type PreparedQuery = QueryScope & {
34
+ readonly id: string;
35
+ readonly requestUser: string;
36
+ readonly normalizedSql: string;
37
+ readonly sqlHash: string;
38
+ readonly riskLevel: "low" | "medium";
39
+ readonly expiresAt: Date;
40
+ readonly used: boolean;
41
+ };
42
+ export type QueryResult = {
43
+ readonly status: string;
44
+ readonly columns: readonly string[];
45
+ readonly rows: readonly JsonObject[];
46
+ readonly rowCount: number;
47
+ readonly durationMs: number;
48
+ readonly masked: boolean;
49
+ readonly message: string;
50
+ readonly archeryQueryLogId: string | null;
51
+ };
52
+ export type TableColumn = {
53
+ readonly name: string;
54
+ readonly type: string;
55
+ readonly sensitive: boolean;
56
+ };
57
+ export type TableMetadata = {
58
+ readonly columns: readonly TableColumn[];
59
+ readonly source: string;
60
+ };
61
+ export type HistoryMatch = {
62
+ readonly id: string;
63
+ readonly sqlPreview: string;
64
+ readonly instanceName: string;
65
+ readonly dbName: string;
66
+ readonly createdAt: string;
67
+ };
68
+ export type HistoryResult = {
69
+ readonly matches: readonly HistoryMatch[];
70
+ readonly total: number;
71
+ readonly truncated: boolean;
72
+ };
73
+ export interface ArcheryClient {
74
+ executeQuery(scope: QueryScope, sql: string, maxRows: number): Promise<QueryResult>;
75
+ describeTable(scope: QueryScope, schemaName: string, tableName: string): Promise<TableMetadata>;
76
+ queryHistory(scope: QueryScope, search: string, limit: number): Promise<HistoryResult>;
77
+ }
78
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
package/dist/types.js ADDED
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":""}
package/package.json ADDED
@@ -0,0 +1,37 @@
1
+ {
2
+ "name": "@dezhouzhang/archery-query-mcp",
3
+ "version": "0.1.0",
4
+ "description": "MCP server for querying Archery safely via stdio or HTTP",
5
+ "type": "module",
6
+ "bin": {
7
+ "archery-query-mcp": "dist/cli.js"
8
+ },
9
+ "files": [
10
+ "dist",
11
+ "README.md"
12
+ ],
13
+ "scripts": {
14
+ "build": "tsc -p tsconfig.json",
15
+ "typecheck": "tsc -p tsconfig.json --noEmit",
16
+ "test": "vitest run",
17
+ "start:stdio": "node dist/cli.js --transport stdio",
18
+ "start:http": "node dist/cli.js --transport http --port 8080"
19
+ },
20
+ "dependencies": {
21
+ "@modelcontextprotocol/sdk": "^1.29.0",
22
+ "@hono/node-server": "^1.19.8",
23
+ "commander": "^14.0.2",
24
+ "hono": "^4.10.7",
25
+ "ky": "^1.14.0",
26
+ "zod": "^4.2.1"
27
+ },
28
+ "devDependencies": {
29
+ "@biomejs/biome": "^2.3.8",
30
+ "@types/node": "^25.0.3",
31
+ "typescript": "^5.9.3",
32
+ "vitest": "^4.0.16"
33
+ },
34
+ "engines": {
35
+ "node": ">=20.0.0"
36
+ }
37
+ }