mcp-xdx-schema-ctx 1.1.9

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 (60) hide show
  1. package/.env.example +43 -0
  2. package/README.md +269 -0
  3. package/dist/config.d.ts +131 -0
  4. package/dist/config.js +138 -0
  5. package/dist/config.js.map +1 -0
  6. package/dist/crypto-utils.d.ts +29 -0
  7. package/dist/crypto-utils.js +118 -0
  8. package/dist/crypto-utils.js.map +1 -0
  9. package/dist/db.d.ts +10 -0
  10. package/dist/db.js +149 -0
  11. package/dist/db.js.map +1 -0
  12. package/dist/diff-utils.d.ts +42 -0
  13. package/dist/diff-utils.js +130 -0
  14. package/dist/diff-utils.js.map +1 -0
  15. package/dist/encrypt-secrets.d.ts +12 -0
  16. package/dist/encrypt-secrets.js +190 -0
  17. package/dist/encrypt-secrets.js.map +1 -0
  18. package/dist/index.d.ts +2 -0
  19. package/dist/index.js +30 -0
  20. package/dist/index.js.map +1 -0
  21. package/dist/migrate-utils.d.ts +91 -0
  22. package/dist/migrate-utils.js +399 -0
  23. package/dist/migrate-utils.js.map +1 -0
  24. package/dist/schema-compat.d.ts +46 -0
  25. package/dist/schema-compat.js +169 -0
  26. package/dist/schema-compat.js.map +1 -0
  27. package/dist/shared.d.ts +70 -0
  28. package/dist/shared.js +197 -0
  29. package/dist/shared.js.map +1 -0
  30. package/dist/sql-build.d.ts +121 -0
  31. package/dist/sql-build.js +254 -0
  32. package/dist/sql-build.js.map +1 -0
  33. package/dist/tool-availability.d.ts +35 -0
  34. package/dist/tool-availability.js +90 -0
  35. package/dist/tool-availability.js.map +1 -0
  36. package/dist/tools/data-tools.d.ts +2 -0
  37. package/dist/tools/data-tools.js +243 -0
  38. package/dist/tools/data-tools.js.map +1 -0
  39. package/dist/tools/dataflow-tools.d.ts +2 -0
  40. package/dist/tools/dataflow-tools.js +434 -0
  41. package/dist/tools/dataflow-tools.js.map +1 -0
  42. package/dist/tools/dbo-tools.d.ts +2 -0
  43. package/dist/tools/dbo-tools.js +228 -0
  44. package/dist/tools/dbo-tools.js.map +1 -0
  45. package/dist/tools/diff-tools.d.ts +2 -0
  46. package/dist/tools/diff-tools.js +224 -0
  47. package/dist/tools/diff-tools.js.map +1 -0
  48. package/dist/tools/form-tools.d.ts +2 -0
  49. package/dist/tools/form-tools.js +715 -0
  50. package/dist/tools/form-tools.js.map +1 -0
  51. package/dist/tools/migrate-tools.d.ts +2 -0
  52. package/dist/tools/migrate-tools.js +423 -0
  53. package/dist/tools/migrate-tools.js.map +1 -0
  54. package/dist/tools/system-tools.d.ts +2 -0
  55. package/dist/tools/system-tools.js +1102 -0
  56. package/dist/tools/system-tools.js.map +1 -0
  57. package/dist/tools/table-tools.d.ts +2 -0
  58. package/dist/tools/table-tools.js +1322 -0
  59. package/dist/tools/table-tools.js.map +1 -0
  60. package/package.json +48 -0
@@ -0,0 +1,35 @@
1
+ /**
2
+ * 工具可用性推导 — 纯函数,不依赖数据库/连接池,便于离线单元测试。
3
+ *
4
+ * 输入:环境库元数据表存在性 + 用户库表存在性 + 用户库可达性。
5
+ * 输出:每个 A 侧工具的 { available, requires, userRequires, missing, userMissing, reason?, fallback? }。
6
+ *
7
+ * 关键区分:环境库(元数据)表与用户库(业务)表必须分开探测。
8
+ * 例如 get_sys_dict 依赖的是**用户库**的 SysDbType/SyDbValue,若按环境库探测会误判为不可用。
9
+ */
10
+ export interface CapabilityProbe {
11
+ /** 环境库元数据表名 -> 是否存在(如 "TableSetTB") */
12
+ tables: Record<string, boolean>;
13
+ /** 用户库表名 -> 是否存在(如 "SysDbType");未配置用户库时可为空对象 */
14
+ userTables?: Record<string, boolean>;
15
+ userDbConfigured: boolean;
16
+ userDbReachable: boolean;
17
+ }
18
+ export interface ToolCapability {
19
+ tool: string;
20
+ available: boolean;
21
+ /** 依赖的环境库元数据表(物理名) */
22
+ requires: string[];
23
+ /** 依赖的用户库表(物理名) */
24
+ userRequires: string[];
25
+ /** 环境库缺失的表 */
26
+ missing: string[];
27
+ /** 用户库缺失的表 */
28
+ userMissing: string[];
29
+ needsUserDb: boolean;
30
+ reason?: string;
31
+ fallback?: string;
32
+ }
33
+ /** 全部需要探测的用户库表(供 get_capabilities 预取) */
34
+ export declare const USER_DB_PROBE_TABLES: string[];
35
+ export declare function computeToolAvailability(probe: CapabilityProbe): ToolCapability[];
@@ -0,0 +1,90 @@
1
+ /**
2
+ * 工具可用性推导 — 纯函数,不依赖数据库/连接池,便于离线单元测试。
3
+ *
4
+ * 输入:环境库元数据表存在性 + 用户库表存在性 + 用户库可达性。
5
+ * 输出:每个 A 侧工具的 { available, requires, userRequires, missing, userMissing, reason?, fallback? }。
6
+ *
7
+ * 关键区分:环境库(元数据)表与用户库(业务)表必须分开探测。
8
+ * 例如 get_sys_dict 依赖的是**用户库**的 SysDbType/SyDbValue,若按环境库探测会误判为不可用。
9
+ */
10
+ /**
11
+ * A 侧工具 → 依赖的表。
12
+ * - requires / userRequires 为空 = 仅依赖 INFORMATION_SCHEMA / 自身逻辑,永远可用;
13
+ * - needsUserDb = 需要用户库(DB_TARGET_DATABASES)可达;
14
+ * - 只列"硬依赖",可选子表不列入(工具内部已按模块降级)。
15
+ */
16
+ const TOOL_SPECS = [
17
+ { tool: "list_tables", requires: ["TableSetTB"], fallback: "list_tables(scope=system)" },
18
+ { tool: "describe_table", requires: [], fallback: "describe_table" },
19
+ { tool: "search_schema", requires: ["TableSetTB", "TableFieldSetTB"], fallback: "list_tables" },
20
+ { tool: "get_table_relations", requires: ["TableSetTB"], fallback: "describe_table" },
21
+ { tool: "check_user_table", requires: [], needsUserDb: true, fallback: "get_capabilities" },
22
+ { tool: "get_table_indexes", requires: [], needsUserDb: true, fallback: "get_capabilities" },
23
+ { tool: "suggest_indexes", requires: ["TableFieldSetTB"], fallback: "describe_table" },
24
+ { tool: "get_virtual_tables", requires: ["VirtualTableTB"], fallback: "get_capabilities" },
25
+ { tool: "get_module_tree", requires: ["ModuleManageTB"], fallback: "get_capabilities" },
26
+ { tool: "get_inoutkind_detail", requires: ["InOutKindTB"], fallback: "query_table_data" },
27
+ { tool: "resolve_table", requires: ["TableSetTB"], fallback: "describe_table" },
28
+ { tool: "query_table_data", requires: [], fallback: "describe_table" },
29
+ { tool: "list_forms", requires: ["FormSetTB"], fallback: "get_capabilities" },
30
+ { tool: "get_form", requires: ["FormSetTB"], fallback: "get_capabilities" },
31
+ { tool: "get_form_full", requires: ["FormSetTB"], fallback: "get_form" },
32
+ { tool: "get_user_form_schemes", requires: ["UserFormSetHedTB"], fallback: "get_form_full" },
33
+ { tool: "get_dbo_detail", requires: ["DBOSetTB"], fallback: "get_capabilities" },
34
+ { tool: "trace_dataflow", requires: ["DataFlowHedTB"], fallback: "get_capabilities" },
35
+ { tool: "get_data_source_full", requires: ["DataSourceSetHedTB"], fallback: "get_capabilities" },
36
+ { tool: "get_transfer_rules", requires: ["TransferRuleHedTB"], fallback: "get_capabilities" },
37
+ { tool: "get_function_tree", requires: ["FunctionTB"], fallback: "get_capabilities" },
38
+ { tool: "get_page_actions", requires: ["MenuFunction"], fallback: "get_capabilities" },
39
+ { tool: "get_choose_ui_detail", requires: ["ChooseUISetTB"], fallback: "get_capabilities" },
40
+ { tool: "get_button_detail", requires: ["ButtonTB"], fallback: "get_capabilities" },
41
+ { tool: "get_system_enums", requires: ["LinkTypeTB"], fallback: "get_sys_dict" },
42
+ {
43
+ tool: "get_sys_dict",
44
+ requires: [],
45
+ userRequires: ["SysDbType", "SyDbValue"],
46
+ needsUserDb: true,
47
+ fallback: "get_capabilities",
48
+ },
49
+ { tool: "get_db_object_source", requires: [], needsUserDb: true, fallback: "get_capabilities" },
50
+ { tool: "get_view_lineage", requires: [], needsUserDb: true, fallback: "get_db_object_source" },
51
+ { tool: "get_capabilities", requires: [], fallback: "get_capabilities" },
52
+ ];
53
+ /** 全部需要探测的用户库表(供 get_capabilities 预取) */
54
+ export const USER_DB_PROBE_TABLES = [
55
+ ...new Set(TOOL_SPECS.flatMap((s) => s.userRequires ?? [])),
56
+ ];
57
+ export function computeToolAvailability(probe) {
58
+ const userOk = probe.userDbConfigured && probe.userDbReachable;
59
+ const userTables = probe.userTables ?? {};
60
+ return TOOL_SPECS.map((spec) => {
61
+ const userRequires = spec.userRequires ?? [];
62
+ const missing = spec.requires.filter((t) => !probe.tables[t]);
63
+ const userMissing = userRequires.filter((t) => !userTables[t]);
64
+ const needsUserDb = spec.needsUserDb === true;
65
+ const userDbProblem = needsUserDb && !userOk;
66
+ const available = missing.length === 0 && userMissing.length === 0 && !userDbProblem;
67
+ const reasonParts = [];
68
+ if (missing.length > 0)
69
+ reasonParts.push(`环境库缺少 ${missing.join(", ")}`);
70
+ if (userMissing.length > 0)
71
+ reasonParts.push(`用户库缺少 ${userMissing.join(", ")}`);
72
+ if (userDbProblem)
73
+ reasonParts.push(probe.userDbConfigured
74
+ ? "用户库不可达(请检查 DB_TARGET_DATABASES / 权限)"
75
+ : "未配置用户库(DB_TARGET_DATABASES 为空)");
76
+ return {
77
+ tool: spec.tool,
78
+ available,
79
+ requires: spec.requires,
80
+ userRequires,
81
+ missing,
82
+ userMissing,
83
+ needsUserDb,
84
+ ...(available
85
+ ? {}
86
+ : { reason: reasonParts.join(";"), fallback: spec.fallback }),
87
+ };
88
+ });
89
+ }
90
+ //# sourceMappingURL=tool-availability.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tool-availability.js","sourceRoot":"","sources":["../src/tool-availability.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ export declare function registerDataTools(server: McpServer): void;
@@ -0,0 +1,243 @@
1
+ import { z } from "zod";
2
+ import { envDb, table, queryWithParams } from "../db.js";
3
+ import { env } from "../config.js";
4
+ import { WARNING, envelope, ok, topNPagination, userName } from "../shared.js";
5
+ import { getTableColumns, hasCol, pickCols, tableExists, tryQuery, userTableExists, } from "../schema-compat.js";
6
+ import { buildDataQuery, buildWhere, maskRow, DATA_QUERY_MAX_TOP, } from "../sql-build.js";
7
+ /** 文本类列(用于 keyword 模糊搜索) */
8
+ const TEXT_TYPE = /char|text|xml|uniqueidentifier/i;
9
+ export function registerDataTools(server) {
10
+ // ============================================================
11
+ // query_table_data — 只读查询表数据(值参数化,敏感列默认脱敏)
12
+ // ============================================================
13
+ server.registerTool("query_table_data", {
14
+ description: WARNING +
15
+ "\n\n【只读查数据】查询一张表的数据行,用于回答「某字段值是什么」类问题。\n" +
16
+ "安全边界:只读守卫 + TOP≤200 + 语句超时 + 列名白名单(来自实际 schema)+ 值参数化 + 敏感列默认脱敏;禁止任意 SQL。\n" +
17
+ "表解析顺序:用户库 → 环境库 → 都未命中则返回 TableSetTB 中的模糊候选。",
18
+ inputSchema: {
19
+ tableName: z.string().max(128).describe("表名,如 MoveKindTB"),
20
+ columns: z
21
+ .string()
22
+ .max(1000)
23
+ .optional()
24
+ .describe("要返回的列,逗号分隔;缺省返回全部列"),
25
+ filter: z
26
+ .array(z.object({
27
+ column: z.string().max(128).describe("列名"),
28
+ op: z.enum(["eq", "like", "in"]).describe("比较方式"),
29
+ value: z
30
+ .union([z.string(), z.array(z.string())])
31
+ .describe("值;op=in 时传数组"),
32
+ }))
33
+ .max(20)
34
+ .optional()
35
+ .describe("过滤条件(组间 AND)"),
36
+ keyword: z
37
+ .string()
38
+ .max(200)
39
+ .optional()
40
+ .describe("在文本列之间做 OR 模糊搜索"),
41
+ orderBy: z.string().max(128).optional().describe("排序列名"),
42
+ orderDir: z.enum(["ASC", "DESC"]).optional().default("ASC").describe("排序方向"),
43
+ top: z
44
+ .number()
45
+ .int()
46
+ .min(1)
47
+ .max(DATA_QUERY_MAX_TOP)
48
+ .default(20)
49
+ .describe(`返回行数上限(1..${DATA_QUERY_MAX_TOP},默认 20)`),
50
+ mask: z
51
+ .boolean()
52
+ .optional()
53
+ .default(true)
54
+ .describe("是否对敏感列脱敏(默认 true)"),
55
+ },
56
+ }, async ({ tableName, columns, filter, keyword, orderBy, orderDir = "ASC", top = 20, mask = true, }) => {
57
+ const warnings = [];
58
+ const safeName = tableName.replace(/[^a-zA-Z0-9_]/g, "");
59
+ if (!safeName) {
60
+ return ok(envelope({
61
+ items: [],
62
+ pagination: null,
63
+ warnings: [
64
+ {
65
+ module: "query_table_data",
66
+ message: `表名 "${tableName}" 非法(仅允许字母/数字/下划线)`,
67
+ },
68
+ ],
69
+ table: tableName,
70
+ resolved: false,
71
+ }));
72
+ }
73
+ // ---- 1) 解析表所在库:用户库 → 环境库 ----
74
+ let db = "";
75
+ if (userName && (await userTableExists(userName, safeName))) {
76
+ db = userName;
77
+ }
78
+ else if (await tableExists(table(envDb(), safeName))) {
79
+ db = envDb();
80
+ }
81
+ if (!db) {
82
+ // 未命中 → 返回 TableSetTB 中的模糊候选,便于定位
83
+ let candidates = [];
84
+ if (await tableExists(table(envDb(), "TableSetTB"))) {
85
+ const tCols = await getTableColumns(table(envDb(), "TableSetTB"));
86
+ const filters = [
87
+ { col: "TableName", op: "like", value: safeName },
88
+ { col: "TableDesc", op: "like", value: tableName },
89
+ ].filter((f) => hasCol(tCols, f.col));
90
+ if (filters.length > 0) {
91
+ const { where } = buildWhere(tCols, [{ logic: "or", filters }]);
92
+ if (where) {
93
+ const sel = pickCols(tCols, ["TableName", "TableDesc", "TableType"]);
94
+ candidates = await tryQuery("query_table_data.candidates", `SELECT TOP 10 ${sel.map((c) => `[${c}]`).join(", ")} FROM ${table(envDb(), "TableSetTB")}${where}`, warnings);
95
+ }
96
+ }
97
+ }
98
+ warnings.push({
99
+ module: "query_table_data",
100
+ message: `表 "${tableName}" 在用户库/环境库中都不存在`,
101
+ hint: "可用 resolve_table(nameOrKeyword=...) 或 list_tables(keyword=...) 定位",
102
+ fallback: "resolve_table",
103
+ });
104
+ return ok(envelope({
105
+ items: [],
106
+ pagination: null,
107
+ warnings,
108
+ table: safeName,
109
+ resolved: false,
110
+ candidates,
111
+ }));
112
+ }
113
+ // ---- 2) 实际列(原始大小写 + 类型) ----
114
+ const colRows = await tryQuery("query_table_data.columns", `SELECT COLUMN_NAME, DATA_TYPE FROM [${db}].INFORMATION_SCHEMA.COLUMNS ` +
115
+ `WHERE TABLE_SCHEMA='dbo' AND TABLE_NAME='${safeName}' ORDER BY ORDINAL_POSITION`, warnings);
116
+ const physical = colRows.map((r) => String(r.COLUMN_NAME));
117
+ if (physical.length === 0) {
118
+ return ok(envelope({
119
+ items: [],
120
+ pagination: null,
121
+ warnings: [
122
+ {
123
+ module: "query_table_data",
124
+ message: `无法读取 ${db}.${safeName} 的列定义`,
125
+ },
126
+ ],
127
+ table: safeName,
128
+ db,
129
+ resolved: false,
130
+ }));
131
+ }
132
+ const allCols = new Set(physical.map((c) => c.toUpperCase()));
133
+ const textCols = colRows
134
+ .filter((r) => TEXT_TYPE.test(String(r.DATA_TYPE)))
135
+ .map((r) => String(r.COLUMN_NAME));
136
+ // ---- 3) 选择列(白名单)+ 无效列名候选建议 ----
137
+ let wanted;
138
+ let columnSuggestions = [];
139
+ if (columns) {
140
+ const requested = columns
141
+ .split(",")
142
+ .map((s) => s.trim())
143
+ .filter((s) => /^[A-Za-z0-9_]+$/.test(s));
144
+ const invalid = requested.filter((c) => !hasCol(allCols, c));
145
+ wanted = requested.filter((c) => hasCol(allCols, c));
146
+ if (invalid.length > 0) {
147
+ // 按名称子串/前缀给出候选列;无匹配则回退前 30 列
148
+ columnSuggestions = invalid.map((req) => {
149
+ const r = req.toLowerCase();
150
+ let sug = physical.filter((c) => c.toLowerCase().includes(r));
151
+ if (sug.length === 0 && r.length >= 3) {
152
+ sug = physical.filter((c) => c.toLowerCase().includes(r.slice(0, 3)));
153
+ }
154
+ if (sug.length === 0)
155
+ sug = physical.slice(0, 30);
156
+ return { requested: req, suggestions: sug.slice(0, 20) };
157
+ });
158
+ warnings.push({
159
+ module: "query_table_data",
160
+ message: `以下列在本表不存在,已忽略: ${invalid.join(", ")}`,
161
+ hint: "见 columnSuggestions / availableColumns 候选列名;可用 describe_table 查看完整字段",
162
+ });
163
+ }
164
+ }
165
+ else {
166
+ wanted = physical;
167
+ }
168
+ if (wanted.length === 0) {
169
+ return ok(envelope({
170
+ items: [],
171
+ pagination: null,
172
+ warnings: [
173
+ {
174
+ module: "query_table_data",
175
+ message: "没有可查询的列(columns 全部无效)",
176
+ hint: "见 columnSuggestions / availableColumns 候选列名",
177
+ },
178
+ ],
179
+ table: safeName,
180
+ db,
181
+ resolved: true,
182
+ availableColumns: physical.slice(0, 200),
183
+ columnSuggestions,
184
+ }));
185
+ }
186
+ // ---- 4) 构造并执行参数化查询 ----
187
+ const built = buildDataQuery({
188
+ table: table(db, safeName),
189
+ cols: wanted,
190
+ filters: (filter ?? []).map((f) => ({
191
+ col: f.column,
192
+ op: f.op,
193
+ value: f.value,
194
+ })),
195
+ keyword: keyword && textCols.length > 0
196
+ ? { value: keyword, cols: textCols }
197
+ : undefined,
198
+ orderBy: orderBy ? { col: orderBy, dir: orderDir } : undefined,
199
+ top,
200
+ });
201
+ if (built.skipped.length > 0) {
202
+ warnings.push({
203
+ module: "query_table_data",
204
+ message: `以下过滤/排序列无效或不存在,已跳过: ${built.skipped.join(", ")}`,
205
+ });
206
+ }
207
+ let items = [];
208
+ try {
209
+ items = await queryWithParams(built.sql, built.params);
210
+ }
211
+ catch (err) {
212
+ const message = err instanceof Error ? err.message : String(err);
213
+ warnings.push({
214
+ module: "query_table_data",
215
+ message,
216
+ hint: "可用 describe_table 查看实际字段,或缩小过滤范围后重试",
217
+ fallback: "describe_table",
218
+ });
219
+ }
220
+ // ---- 5) 敏感列脱敏 ----
221
+ let maskedColumns = [];
222
+ if (mask && items.length > 0) {
223
+ const masked = items.map((r) => maskRow(r, env.DB_SENSITIVE_COLUMNS));
224
+ items = masked.map((m) => m.row);
225
+ maskedColumns = [...new Set(masked.flatMap((m) => m.maskedColumns))];
226
+ }
227
+ const limit = Math.min(DATA_QUERY_MAX_TOP, Math.max(1, top));
228
+ return ok(envelope({
229
+ items,
230
+ pagination: topNPagination(limit, items.length),
231
+ warnings,
232
+ table: safeName,
233
+ db,
234
+ resolved: true,
235
+ columns: wanted,
236
+ availableColumns: physical.slice(0, 200),
237
+ columnSuggestions,
238
+ maskedColumns,
239
+ appliedFilters: built.applied,
240
+ }));
241
+ });
242
+ }
243
+ //# sourceMappingURL=data-tools.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"data-tools.js","sourceRoot":"","sources":["../../src/tools/data-tools.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ export declare function registerDataflowTools(server: McpServer): void;