@ibm/ibmi-mcp-server 0.1.2 → 0.3.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.
- package/README.md +2178 -46
- package/dist/config/index.d.ts +2 -0
- package/dist/config/index.d.ts.map +1 -1
- package/dist/config/index.js +57 -24
- package/dist/config/index.js.map +1 -1
- package/dist/config/resolver.d.ts.map +1 -1
- package/dist/config/resolver.js.map +1 -1
- package/dist/ibmi-mcp-server/auth/httpAuthEndpoint.js +1 -1
- package/dist/ibmi-mcp-server/services/connectionPool.js +2 -2
- package/dist/ibmi-mcp-server/tools/executeSql.tool.d.ts +80 -0
- package/dist/ibmi-mcp-server/tools/executeSql.tool.d.ts.map +1 -0
- package/dist/ibmi-mcp-server/tools/executeSql.tool.js +356 -0
- package/dist/ibmi-mcp-server/tools/executeSql.tool.js.map +1 -0
- package/dist/ibmi-mcp-server/tools/generateSql.tool.d.ts +36 -0
- package/dist/ibmi-mcp-server/tools/generateSql.tool.d.ts.map +1 -0
- package/dist/ibmi-mcp-server/tools/generateSql.tool.js +281 -0
- package/dist/ibmi-mcp-server/tools/generateSql.tool.js.map +1 -0
- package/dist/ibmi-mcp-server/tools/index.d.ts +85 -0
- package/dist/ibmi-mcp-server/tools/index.d.ts.map +1 -0
- package/dist/ibmi-mcp-server/tools/index.js +21 -0
- package/dist/ibmi-mcp-server/tools/index.js.map +1 -0
- package/dist/ibmi-mcp-server/utils/config/configParser.d.ts +9 -0
- package/dist/ibmi-mcp-server/utils/config/configParser.d.ts.map +1 -1
- package/dist/ibmi-mcp-server/utils/config/configParser.js +58 -0
- package/dist/ibmi-mcp-server/utils/config/configParser.js.map +1 -1
- package/dist/ibmi-mcp-server/utils/config/toolConfigBuilder.js +1 -1
- package/dist/ibmi-mcp-server/utils/config/toolConfigBuilder.js.map +1 -1
- package/dist/ibmi-mcp-server/utils/config/toolDefinitions.d.ts +4 -4
- package/dist/ibmi-mcp-server/utils/config/toolDefinitions.d.ts.map +1 -1
- package/dist/ibmi-mcp-server/utils/config/toolDefinitions.js +7 -8
- package/dist/ibmi-mcp-server/utils/config/toolDefinitions.js.map +1 -1
- package/dist/ibmi-mcp-server/utils/config/toolFactory.d.ts +0 -8
- package/dist/ibmi-mcp-server/utils/config/toolFactory.d.ts.map +1 -1
- package/dist/ibmi-mcp-server/utils/config/toolFactory.js +0 -31
- package/dist/ibmi-mcp-server/utils/config/toolFactory.js.map +1 -1
- package/dist/ibmi-mcp-server/utils/config/toolsetManager.d.ts +1 -1
- package/dist/ibmi-mcp-server/utils/config/toolsetManager.d.ts.map +1 -1
- package/dist/ibmi-mcp-server/utils/config/toolsetManager.js +2 -2
- package/dist/ibmi-mcp-server/utils/config/toolsetManager.js.map +1 -1
- package/dist/ibmi-mcp-server/utils/language/document.d.ts +26 -0
- package/dist/ibmi-mcp-server/utils/language/document.d.ts.map +1 -0
- package/dist/ibmi-mcp-server/utils/language/document.js +318 -0
- package/dist/ibmi-mcp-server/utils/language/document.js.map +1 -0
- package/dist/ibmi-mcp-server/utils/language/statement.d.ts +43 -0
- package/dist/ibmi-mcp-server/utils/language/statement.d.ts.map +1 -0
- package/dist/ibmi-mcp-server/utils/language/statement.js +796 -0
- package/dist/ibmi-mcp-server/utils/language/statement.js.map +1 -0
- package/dist/ibmi-mcp-server/utils/language/tokens.d.ts +32 -0
- package/dist/ibmi-mcp-server/utils/language/tokens.d.ts.map +1 -0
- package/dist/ibmi-mcp-server/utils/language/tokens.js +532 -0
- package/dist/ibmi-mcp-server/utils/language/tokens.js.map +1 -0
- package/dist/ibmi-mcp-server/utils/language/types.d.ts +138 -0
- package/dist/ibmi-mcp-server/utils/language/types.d.ts.map +1 -0
- package/dist/ibmi-mcp-server/utils/language/types.js +93 -0
- package/dist/ibmi-mcp-server/utils/language/types.js.map +1 -0
- package/dist/ibmi-mcp-server/utils/security/ibmiSqlParser.d.ts +48 -0
- package/dist/ibmi-mcp-server/utils/security/ibmiSqlParser.d.ts.map +1 -0
- package/dist/ibmi-mcp-server/utils/security/ibmiSqlParser.js +93 -0
- package/dist/ibmi-mcp-server/utils/security/ibmiSqlParser.js.map +1 -0
- package/dist/ibmi-mcp-server/utils/security/sqlSecurityValidator.d.ts +35 -59
- package/dist/ibmi-mcp-server/utils/security/sqlSecurityValidator.d.ts.map +1 -1
- package/dist/ibmi-mcp-server/utils/security/sqlSecurityValidator.js +108 -288
- package/dist/ibmi-mcp-server/utils/security/sqlSecurityValidator.js.map +1 -1
- package/dist/ibmi-mcp-server/utils/security/sqlSecurityValidatorFallback.d.ts +54 -0
- package/dist/ibmi-mcp-server/utils/security/sqlSecurityValidatorFallback.d.ts.map +1 -0
- package/dist/ibmi-mcp-server/utils/security/sqlSecurityValidatorFallback.js +91 -0
- package/dist/ibmi-mcp-server/utils/security/sqlSecurityValidatorFallback.js.map +1 -0
- package/dist/index.js +4 -1
- package/dist/index.js.map +1 -1
- package/dist/mcp-server/tools/index.d.ts +13 -2
- package/dist/mcp-server/tools/index.d.ts.map +1 -1
- package/dist/mcp-server/tools/index.js +29 -9
- package/dist/mcp-server/tools/index.js.map +1 -1
- package/dist/mcp-server/tools/utils/index.d.ts +7 -0
- package/dist/mcp-server/tools/utils/index.d.ts.map +1 -0
- package/dist/mcp-server/tools/utils/index.js +7 -0
- package/dist/mcp-server/tools/utils/index.js.map +1 -0
- package/dist/mcp-server/tools/utils/tool-factory.d.ts +129 -0
- package/dist/mcp-server/tools/utils/tool-factory.d.ts.map +1 -0
- package/dist/mcp-server/tools/utils/tool-factory.js +179 -0
- package/dist/mcp-server/tools/utils/tool-factory.js.map +1 -0
- package/dist/mcp-server/tools/utils/types.d.ts +117 -0
- package/dist/mcp-server/tools/utils/types.d.ts.map +1 -0
- package/dist/mcp-server/tools/utils/types.js +11 -0
- package/dist/mcp-server/tools/utils/types.js.map +1 -0
- package/dist/mcp-server/transports/core/cleanupTransformStream.d.ts +26 -0
- package/dist/mcp-server/transports/core/cleanupTransformStream.d.ts.map +1 -0
- package/dist/mcp-server/transports/core/cleanupTransformStream.js +60 -0
- package/dist/mcp-server/transports/core/cleanupTransformStream.js.map +1 -0
- package/dist/mcp-server/transports/core/statefulTransportManager.d.ts +1 -1
- package/dist/mcp-server/transports/core/statefulTransportManager.d.ts.map +1 -1
- package/dist/mcp-server/transports/core/statefulTransportManager.js +50 -40
- package/dist/mcp-server/transports/core/statefulTransportManager.js.map +1 -1
- package/dist/mcp-server/transports/core/statelessTransportManager.d.ts +2 -13
- package/dist/mcp-server/transports/core/statelessTransportManager.d.ts.map +1 -1
- package/dist/mcp-server/transports/core/statelessTransportManager.js +35 -62
- package/dist/mcp-server/transports/core/statelessTransportManager.js.map +1 -1
- package/dist/mcp-server/transports/core/transportRequest.d.ts +1 -2
- package/dist/mcp-server/transports/core/transportRequest.d.ts.map +1 -1
- package/dist/mcp-server/transports/http/mcpTransportMiddleware.d.ts.map +1 -1
- package/dist/mcp-server/transports/http/mcpTransportMiddleware.js +1 -3
- package/dist/mcp-server/transports/http/mcpTransportMiddleware.js.map +1 -1
- package/dist/utils/internal/logger.d.ts +5 -0
- package/dist/utils/internal/logger.d.ts.map +1 -1
- package/dist/utils/internal/logger.js +65 -36
- package/dist/utils/internal/logger.js.map +1 -1
- package/package.json +29 -23
- package/dist/ibmi-mcp-server/tools/executeSql/index.d.ts +0 -9
- package/dist/ibmi-mcp-server/tools/executeSql/index.d.ts.map +0 -1
- package/dist/ibmi-mcp-server/tools/executeSql/index.js +0 -9
- package/dist/ibmi-mcp-server/tools/executeSql/index.js.map +0 -1
- package/dist/ibmi-mcp-server/tools/executeSql/logic.d.ts +0 -51
- package/dist/ibmi-mcp-server/tools/executeSql/logic.d.ts.map +0 -1
- package/dist/ibmi-mcp-server/tools/executeSql/logic.js +0 -179
- package/dist/ibmi-mcp-server/tools/executeSql/logic.js.map +0 -1
- package/dist/ibmi-mcp-server/tools/executeSql/registration.d.ts +0 -52
- package/dist/ibmi-mcp-server/tools/executeSql/registration.d.ts.map +0 -1
- package/dist/ibmi-mcp-server/tools/executeSql/registration.js +0 -161
- package/dist/ibmi-mcp-server/tools/executeSql/registration.js.map +0 -1
- package/dist/ibmi-mcp-server/tools/generateSql/index.d.ts +0 -13
- package/dist/ibmi-mcp-server/tools/generateSql/index.d.ts.map +0 -1
- package/dist/ibmi-mcp-server/tools/generateSql/index.js +0 -13
- package/dist/ibmi-mcp-server/tools/generateSql/index.js.map +0 -1
- package/dist/ibmi-mcp-server/tools/generateSql/logic.d.ts +0 -64
- package/dist/ibmi-mcp-server/tools/generateSql/logic.d.ts.map +0 -1
- package/dist/ibmi-mcp-server/tools/generateSql/logic.js +0 -190
- package/dist/ibmi-mcp-server/tools/generateSql/logic.js.map +0 -1
- package/dist/ibmi-mcp-server/tools/generateSql/registration.d.ts +0 -18
- package/dist/ibmi-mcp-server/tools/generateSql/registration.d.ts.map +0 -1
- package/dist/ibmi-mcp-server/tools/generateSql/registration.js +0 -64
- package/dist/ibmi-mcp-server/tools/generateSql/registration.js.map +0 -1
- package/dist/mcp-server/tools/catFactFetcher/index.d.ts +0 -8
- package/dist/mcp-server/tools/catFactFetcher/index.d.ts.map +0 -1
- package/dist/mcp-server/tools/catFactFetcher/index.js +0 -8
- package/dist/mcp-server/tools/catFactFetcher/index.js.map +0 -1
- package/dist/mcp-server/tools/catFactFetcher/logic.d.ts +0 -52
- package/dist/mcp-server/tools/catFactFetcher/logic.d.ts.map +0 -1
- package/dist/mcp-server/tools/catFactFetcher/logic.js +0 -95
- package/dist/mcp-server/tools/catFactFetcher/logic.js.map +0 -1
- package/dist/mcp-server/tools/catFactFetcher/registration.d.ts +0 -9
- package/dist/mcp-server/tools/catFactFetcher/registration.d.ts.map +0 -1
- package/dist/mcp-server/tools/catFactFetcher/registration.js +0 -43
- package/dist/mcp-server/tools/catFactFetcher/registration.js.map +0 -1
- package/dist/mcp-server/tools/echoTool/index.d.ts +0 -13
- package/dist/mcp-server/tools/echoTool/index.d.ts.map +0 -1
- package/dist/mcp-server/tools/echoTool/index.js +0 -13
- package/dist/mcp-server/tools/echoTool/index.js.map +0 -1
- package/dist/mcp-server/tools/echoTool/logic.d.ts +0 -69
- package/dist/mcp-server/tools/echoTool/logic.d.ts.map +0 -1
- package/dist/mcp-server/tools/echoTool/logic.js +0 -119
- package/dist/mcp-server/tools/echoTool/logic.js.map +0 -1
- package/dist/mcp-server/tools/echoTool/registration.d.ts +0 -9
- package/dist/mcp-server/tools/echoTool/registration.d.ts.map +0 -1
- package/dist/mcp-server/tools/echoTool/registration.js +0 -45
- package/dist/mcp-server/tools/echoTool/registration.js.map +0 -1
- package/dist/mcp-server/tools/imageTest/index.d.ts +0 -7
- package/dist/mcp-server/tools/imageTest/index.d.ts.map +0 -1
- package/dist/mcp-server/tools/imageTest/index.js +0 -7
- package/dist/mcp-server/tools/imageTest/index.js.map +0 -1
- package/dist/mcp-server/tools/imageTest/logic.d.ts +0 -27
- package/dist/mcp-server/tools/imageTest/logic.d.ts.map +0 -1
- package/dist/mcp-server/tools/imageTest/logic.js +0 -44
- package/dist/mcp-server/tools/imageTest/logic.js.map +0 -1
- package/dist/mcp-server/tools/imageTest/registration.d.ts +0 -9
- package/dist/mcp-server/tools/imageTest/registration.d.ts.map +0 -1
- package/dist/mcp-server/tools/imageTest/registration.js +0 -49
- package/dist/mcp-server/tools/imageTest/registration.js.map +0 -1
- package/dist/mcp-server/tools/utils/tool-utils.d.ts +0 -43
- package/dist/mcp-server/tools/utils/tool-utils.d.ts.map +0 -1
- package/dist/mcp-server/tools/utils/tool-utils.js +0 -44
- package/dist/mcp-server/tools/utils/tool-utils.js.map +0 -1
- package/dist/mcp-server/transports/core/headerUtils.d.ts +0 -27
- package/dist/mcp-server/transports/core/headerUtils.d.ts.map +0 -1
- package/dist/mcp-server/transports/core/headerUtils.js +0 -53
- package/dist/mcp-server/transports/core/headerUtils.js.map +0 -1
- package/dist/mcp-server/transports/core/honoNodeBridge.d.ts +0 -77
- package/dist/mcp-server/transports/core/honoNodeBridge.d.ts.map +0 -1
- package/dist/mcp-server/transports/core/honoNodeBridge.js +0 -150
- package/dist/mcp-server/transports/core/honoNodeBridge.js.map +0 -1
- package/dist/services/duck-db/duckDBConnectionManager.d.ts +0 -55
- package/dist/services/duck-db/duckDBConnectionManager.d.ts.map +0 -1
- package/dist/services/duck-db/duckDBConnectionManager.js +0 -184
- package/dist/services/duck-db/duckDBConnectionManager.js.map +0 -1
- package/dist/services/duck-db/duckDBQueryExecutor.d.ts +0 -18
- package/dist/services/duck-db/duckDBQueryExecutor.d.ts.map +0 -1
- package/dist/services/duck-db/duckDBQueryExecutor.js +0 -115
- package/dist/services/duck-db/duckDBQueryExecutor.js.map +0 -1
- package/dist/services/duck-db/duckDBService.d.ts +0 -27
- package/dist/services/duck-db/duckDBService.d.ts.map +0 -1
- package/dist/services/duck-db/duckDBService.js +0 -151
- package/dist/services/duck-db/duckDBService.js.map +0 -1
- package/dist/services/duck-db/types.d.ts +0 -135
- package/dist/services/duck-db/types.d.ts.map +0 -1
- package/dist/services/duck-db/types.js +0 -6
- package/dist/services/duck-db/types.js.map +0 -1
- package/dist/services/llm-providers/openRouterProvider.d.ts +0 -36
- package/dist/services/llm-providers/openRouterProvider.d.ts.map +0 -1
- package/dist/services/llm-providers/openRouterProvider.js +0 -235
- package/dist/services/llm-providers/openRouterProvider.js.map +0 -1
- package/dist/services/supabase/supabaseClient.d.ts +0 -25
- package/dist/services/supabase/supabaseClient.d.ts.map +0 -1
- package/dist/services/supabase/supabaseClient.js +0 -68
- package/dist/services/supabase/supabaseClient.js.map +0 -1
- package/dist/storage/duckdbExample.d.ts +0 -8
- package/dist/storage/duckdbExample.d.ts.map +0 -1
- package/dist/storage/duckdbExample.js +0 -197
- package/dist/storage/duckdbExample.js.map +0 -1
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
import Statement from "./statement.js";
|
|
2
|
+
export declare enum StatementType {
|
|
3
|
+
Unknown = "Unknown",
|
|
4
|
+
Create = "Create",
|
|
5
|
+
Close = "Close",
|
|
6
|
+
Insert = "Insert",
|
|
7
|
+
Select = "Select",
|
|
8
|
+
With = "With",
|
|
9
|
+
Update = "Update",
|
|
10
|
+
Delete = "Delete",
|
|
11
|
+
Declare = "Declare",
|
|
12
|
+
Begin = "Begin",
|
|
13
|
+
Drop = "Drop",
|
|
14
|
+
End = "End",
|
|
15
|
+
Else = "Else",
|
|
16
|
+
Elseif = "Elseif",
|
|
17
|
+
Call = "Call",
|
|
18
|
+
Alter = "Alter",
|
|
19
|
+
Fetch = "Fetch",
|
|
20
|
+
For = "For",
|
|
21
|
+
Get = "Get",
|
|
22
|
+
Goto = "Goto",
|
|
23
|
+
If = "If",
|
|
24
|
+
Include = "Include",
|
|
25
|
+
Iterate = "Iterate",
|
|
26
|
+
Leave = "Leave",
|
|
27
|
+
Loop = "Loop",
|
|
28
|
+
Merge = "Merge",
|
|
29
|
+
Open = "Open",
|
|
30
|
+
Pipe = "Pipe",
|
|
31
|
+
Repeat = "Repeat",
|
|
32
|
+
Resignal = "Resignal",
|
|
33
|
+
Return = "Return",
|
|
34
|
+
Signal = "Signal",
|
|
35
|
+
Set = "Set",
|
|
36
|
+
While = "While"
|
|
37
|
+
}
|
|
38
|
+
export declare const StatementTypeWord: {
|
|
39
|
+
CREATE: StatementType;
|
|
40
|
+
SELECT: StatementType;
|
|
41
|
+
WITH: StatementType;
|
|
42
|
+
INSERT: StatementType;
|
|
43
|
+
UPDATE: StatementType;
|
|
44
|
+
DELETE: StatementType;
|
|
45
|
+
DECLARE: StatementType;
|
|
46
|
+
DROP: StatementType;
|
|
47
|
+
END: StatementType;
|
|
48
|
+
ELSE: StatementType;
|
|
49
|
+
ELSEIF: StatementType;
|
|
50
|
+
CALL: StatementType;
|
|
51
|
+
BEGIN: StatementType;
|
|
52
|
+
ALTER: StatementType;
|
|
53
|
+
FOR: StatementType;
|
|
54
|
+
FETCH: StatementType;
|
|
55
|
+
GET: StatementType;
|
|
56
|
+
GOTO: StatementType;
|
|
57
|
+
IF: StatementType;
|
|
58
|
+
INCLUDE: StatementType;
|
|
59
|
+
ITERATE: StatementType;
|
|
60
|
+
LEAVE: StatementType;
|
|
61
|
+
LOOP: StatementType;
|
|
62
|
+
MERGE: StatementType;
|
|
63
|
+
PIPE: StatementType;
|
|
64
|
+
REPEAT: StatementType;
|
|
65
|
+
RESIGNAL: StatementType;
|
|
66
|
+
RETURN: StatementType;
|
|
67
|
+
SIGNAL: StatementType;
|
|
68
|
+
SET: StatementType;
|
|
69
|
+
WHILE: StatementType;
|
|
70
|
+
};
|
|
71
|
+
export declare enum ClauseType {
|
|
72
|
+
Unknown = "Unknown",
|
|
73
|
+
From = "From",
|
|
74
|
+
Into = "Into",
|
|
75
|
+
Where = "Where",
|
|
76
|
+
Having = "Having",
|
|
77
|
+
Group = "Group",
|
|
78
|
+
Limit = "Limit",
|
|
79
|
+
Offset = "Offset",
|
|
80
|
+
Order = "Order"
|
|
81
|
+
}
|
|
82
|
+
export declare const ClauseTypeWord: {
|
|
83
|
+
FROM: ClauseType;
|
|
84
|
+
INTO: ClauseType;
|
|
85
|
+
WHERE: ClauseType;
|
|
86
|
+
HAVING: ClauseType;
|
|
87
|
+
GROUP: ClauseType;
|
|
88
|
+
LIMIT: ClauseType;
|
|
89
|
+
OFFSET: ClauseType;
|
|
90
|
+
ORDER: ClauseType;
|
|
91
|
+
};
|
|
92
|
+
export interface CTEReference {
|
|
93
|
+
name: string;
|
|
94
|
+
columns: string[];
|
|
95
|
+
statement: Statement;
|
|
96
|
+
}
|
|
97
|
+
export interface IRange {
|
|
98
|
+
start: number;
|
|
99
|
+
end: number;
|
|
100
|
+
}
|
|
101
|
+
export interface Token {
|
|
102
|
+
value?: string;
|
|
103
|
+
block?: Token[];
|
|
104
|
+
type: string;
|
|
105
|
+
range: IRange;
|
|
106
|
+
}
|
|
107
|
+
export interface QualifiedObject {
|
|
108
|
+
schema?: string;
|
|
109
|
+
name?: string;
|
|
110
|
+
system?: string;
|
|
111
|
+
}
|
|
112
|
+
export interface ObjectRef {
|
|
113
|
+
tokens: Token[];
|
|
114
|
+
object: QualifiedObject;
|
|
115
|
+
alias?: string;
|
|
116
|
+
isUDTF?: boolean;
|
|
117
|
+
fromLateral?: boolean;
|
|
118
|
+
/** only used within create statements */
|
|
119
|
+
createType?: string;
|
|
120
|
+
}
|
|
121
|
+
export interface StatementGroup {
|
|
122
|
+
range: IRange;
|
|
123
|
+
statements: Statement[];
|
|
124
|
+
}
|
|
125
|
+
export interface Definition extends ObjectRef {
|
|
126
|
+
range: IRange;
|
|
127
|
+
children: Definition[];
|
|
128
|
+
}
|
|
129
|
+
export interface ParsedEmbeddedStatement {
|
|
130
|
+
changed: boolean;
|
|
131
|
+
content: string;
|
|
132
|
+
parameterCount: number;
|
|
133
|
+
}
|
|
134
|
+
export interface CallableReference {
|
|
135
|
+
tokens: Token[];
|
|
136
|
+
parentRef: ObjectRef;
|
|
137
|
+
}
|
|
138
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../src/ibmi-mcp-server/utils/language/types.ts"],"names":[],"mappings":"AAGA,OAAO,SAAS,MAAM,gBAAgB,CAAC;AAEvC,oBAAY,aAAa;IACvB,OAAO,YAAY;IACnB,MAAM,WAAW;IACjB,KAAK,UAAU;IACf,MAAM,WAAW;IACjB,MAAM,WAAW;IACjB,IAAI,SAAS;IACb,MAAM,WAAW;IACjB,MAAM,WAAW;IACjB,OAAO,YAAY;IACnB,KAAK,UAAU;IACf,IAAI,SAAS;IACb,GAAG,QAAQ;IACX,IAAI,SAAS;IACb,MAAM,WAAW;IACjB,IAAI,SAAS;IACb,KAAK,UAAU;IACf,KAAK,UAAU;IACf,GAAG,QAAQ;IACX,GAAG,QAAQ;IACX,IAAI,SAAS;IACb,EAAE,OAAO;IACT,OAAO,YAAY;IACnB,OAAO,YAAY;IACnB,KAAK,UAAU;IACf,IAAI,SAAS;IACb,KAAK,UAAU;IACf,IAAI,SAAS;IACb,IAAI,SAAS;IACb,MAAM,WAAW;IACjB,QAAQ,aAAa;IACrB,MAAM,WAAW;IACjB,MAAM,WAAW;IACjB,GAAG,QAAQ;IACX,KAAK,UAAU;CAChB;AAED,eAAO,MAAM,iBAAiB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAgC7B,CAAC;AAEF,oBAAY,UAAU;IACpB,OAAO,YAAY;IACnB,IAAI,SAAS;IACb,IAAI,SAAS;IACb,KAAK,UAAU;IACf,MAAM,WAAW;IACjB,KAAK,UAAU;IACf,KAAK,UAAU;IACf,MAAM,WAAW;IACjB,KAAK,UAAU;CAChB;AAED,eAAO,MAAM,cAAc;;;;;;;;;CAS1B,CAAC;AAEF,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,SAAS,EAAE,SAAS,CAAC;CACtB;AAED,MAAM,WAAW,MAAM;IACrB,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;CACb;AAED,MAAM,WAAW,KAAK;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,KAAK,EAAE,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,eAAe;IAC9B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,SAAS;IACxB,MAAM,EAAE,KAAK,EAAE,CAAC;IAChB,MAAM,EAAE,eAAe,CAAC;IACxB,KAAK,CAAC,EAAE,MAAM,CAAC;IAEf,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,WAAW,CAAC,EAAE,OAAO,CAAC;IAEtB,yCAAyC;IACzC,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,SAAS,EAAE,CAAC;CACzB;AAED,MAAM,WAAW,UAAW,SAAQ,SAAS;IAC3C,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,UAAU,EAAE,CAAC;CACxB;AAED,MAAM,WAAW,uBAAuB;IACtC,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,cAAc,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,iBAAiB;IAChC,MAAM,EAAE,KAAK,EAAE,CAAC;IAChB,SAAS,EAAE,SAAS,CAAC;CACtB"}
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
export var StatementType;
|
|
2
|
+
(function (StatementType) {
|
|
3
|
+
StatementType["Unknown"] = "Unknown";
|
|
4
|
+
StatementType["Create"] = "Create";
|
|
5
|
+
StatementType["Close"] = "Close";
|
|
6
|
+
StatementType["Insert"] = "Insert";
|
|
7
|
+
StatementType["Select"] = "Select";
|
|
8
|
+
StatementType["With"] = "With";
|
|
9
|
+
StatementType["Update"] = "Update";
|
|
10
|
+
StatementType["Delete"] = "Delete";
|
|
11
|
+
StatementType["Declare"] = "Declare";
|
|
12
|
+
StatementType["Begin"] = "Begin";
|
|
13
|
+
StatementType["Drop"] = "Drop";
|
|
14
|
+
StatementType["End"] = "End";
|
|
15
|
+
StatementType["Else"] = "Else";
|
|
16
|
+
StatementType["Elseif"] = "Elseif";
|
|
17
|
+
StatementType["Call"] = "Call";
|
|
18
|
+
StatementType["Alter"] = "Alter";
|
|
19
|
+
StatementType["Fetch"] = "Fetch";
|
|
20
|
+
StatementType["For"] = "For";
|
|
21
|
+
StatementType["Get"] = "Get";
|
|
22
|
+
StatementType["Goto"] = "Goto";
|
|
23
|
+
StatementType["If"] = "If";
|
|
24
|
+
StatementType["Include"] = "Include";
|
|
25
|
+
StatementType["Iterate"] = "Iterate";
|
|
26
|
+
StatementType["Leave"] = "Leave";
|
|
27
|
+
StatementType["Loop"] = "Loop";
|
|
28
|
+
StatementType["Merge"] = "Merge";
|
|
29
|
+
StatementType["Open"] = "Open";
|
|
30
|
+
StatementType["Pipe"] = "Pipe";
|
|
31
|
+
StatementType["Repeat"] = "Repeat";
|
|
32
|
+
StatementType["Resignal"] = "Resignal";
|
|
33
|
+
StatementType["Return"] = "Return";
|
|
34
|
+
StatementType["Signal"] = "Signal";
|
|
35
|
+
StatementType["Set"] = "Set";
|
|
36
|
+
StatementType["While"] = "While";
|
|
37
|
+
})(StatementType || (StatementType = {}));
|
|
38
|
+
export const StatementTypeWord = {
|
|
39
|
+
CREATE: StatementType.Create,
|
|
40
|
+
SELECT: StatementType.Select,
|
|
41
|
+
WITH: StatementType.With,
|
|
42
|
+
INSERT: StatementType.Insert,
|
|
43
|
+
UPDATE: StatementType.Update,
|
|
44
|
+
DELETE: StatementType.Delete,
|
|
45
|
+
DECLARE: StatementType.Declare,
|
|
46
|
+
DROP: StatementType.Drop,
|
|
47
|
+
END: StatementType.End,
|
|
48
|
+
ELSE: StatementType.Else,
|
|
49
|
+
ELSEIF: StatementType.Elseif,
|
|
50
|
+
CALL: StatementType.Call,
|
|
51
|
+
BEGIN: StatementType.Begin,
|
|
52
|
+
ALTER: StatementType.Alter,
|
|
53
|
+
FOR: StatementType.For,
|
|
54
|
+
FETCH: StatementType.Fetch,
|
|
55
|
+
GET: StatementType.Get,
|
|
56
|
+
GOTO: StatementType.Goto,
|
|
57
|
+
IF: StatementType.If,
|
|
58
|
+
INCLUDE: StatementType.Include,
|
|
59
|
+
ITERATE: StatementType.Iterate,
|
|
60
|
+
LEAVE: StatementType.Leave,
|
|
61
|
+
LOOP: StatementType.Loop,
|
|
62
|
+
MERGE: StatementType.Merge,
|
|
63
|
+
PIPE: StatementType.Pipe,
|
|
64
|
+
REPEAT: StatementType.Repeat,
|
|
65
|
+
RESIGNAL: StatementType.Resignal,
|
|
66
|
+
RETURN: StatementType.Return,
|
|
67
|
+
SIGNAL: StatementType.Signal,
|
|
68
|
+
SET: StatementType.Set,
|
|
69
|
+
WHILE: StatementType.While,
|
|
70
|
+
};
|
|
71
|
+
export var ClauseType;
|
|
72
|
+
(function (ClauseType) {
|
|
73
|
+
ClauseType["Unknown"] = "Unknown";
|
|
74
|
+
ClauseType["From"] = "From";
|
|
75
|
+
ClauseType["Into"] = "Into";
|
|
76
|
+
ClauseType["Where"] = "Where";
|
|
77
|
+
ClauseType["Having"] = "Having";
|
|
78
|
+
ClauseType["Group"] = "Group";
|
|
79
|
+
ClauseType["Limit"] = "Limit";
|
|
80
|
+
ClauseType["Offset"] = "Offset";
|
|
81
|
+
ClauseType["Order"] = "Order";
|
|
82
|
+
})(ClauseType || (ClauseType = {}));
|
|
83
|
+
export const ClauseTypeWord = {
|
|
84
|
+
FROM: ClauseType.From,
|
|
85
|
+
INTO: ClauseType.Into,
|
|
86
|
+
WHERE: ClauseType.Where,
|
|
87
|
+
HAVING: ClauseType.Having,
|
|
88
|
+
GROUP: ClauseType.Group,
|
|
89
|
+
LIMIT: ClauseType.Limit,
|
|
90
|
+
OFFSET: ClauseType.Offset,
|
|
91
|
+
ORDER: ClauseType.Order,
|
|
92
|
+
};
|
|
93
|
+
//# sourceMappingURL=types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../../src/ibmi-mcp-server/utils/language/types.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview IBM i-aware SQL Parser using vscode-db2i's SQL language module
|
|
3
|
+
* Handles IBM i-specific SQL syntax that standard parsers don't support
|
|
4
|
+
*
|
|
5
|
+
* @module src/ibmi-mcp-server/utils/security/ibmiSqlParser
|
|
6
|
+
*/
|
|
7
|
+
import { RequestContext } from "../../../utils/internal/requestContext.js";
|
|
8
|
+
import { StatementType } from "../../utils/language/types.js";
|
|
9
|
+
/**
|
|
10
|
+
* Parse result from IBM i SQL parser
|
|
11
|
+
*/
|
|
12
|
+
export interface IbmiParseResult {
|
|
13
|
+
success: boolean;
|
|
14
|
+
isReadOnly: boolean;
|
|
15
|
+
statementTypes: string[];
|
|
16
|
+
violations: string[];
|
|
17
|
+
error?: string;
|
|
18
|
+
}
|
|
19
|
+
export declare const readOnlyTypes: StatementType[];
|
|
20
|
+
/**
|
|
21
|
+
* IBM i-aware SQL parser using vscode-db2i's Document class
|
|
22
|
+
*/
|
|
23
|
+
export declare class IbmiSqlParser {
|
|
24
|
+
/**
|
|
25
|
+
* Parse and validate SQL query for IBM i
|
|
26
|
+
*
|
|
27
|
+
* @param query - SQL query to parse
|
|
28
|
+
* @param context - Request context for logging
|
|
29
|
+
* @returns Parse result with read-only validation
|
|
30
|
+
*/
|
|
31
|
+
static parseQuery(query: string, context: RequestContext): IbmiParseResult;
|
|
32
|
+
/**
|
|
33
|
+
* Detect write operations by analyzing statement types
|
|
34
|
+
*
|
|
35
|
+
* @param document - Parsed SQL document
|
|
36
|
+
* @returns Array of violation messages
|
|
37
|
+
*/
|
|
38
|
+
private static detectWriteOperations;
|
|
39
|
+
/**
|
|
40
|
+
* Determine if a statement type is a write operation
|
|
41
|
+
*
|
|
42
|
+
* @param type - Statement type enum value
|
|
43
|
+
* @returns True if the statement modifies data
|
|
44
|
+
*/
|
|
45
|
+
private static isWriteOperation;
|
|
46
|
+
}
|
|
47
|
+
export { StatementType } from "../../utils/language/types.js";
|
|
48
|
+
//# sourceMappingURL=ibmiSqlParser.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ibmiSqlParser.d.ts","sourceRoot":"","sources":["../../../../src/ibmi-mcp-server/utils/security/ibmiSqlParser.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,EAAE,cAAc,EAAE,MAAM,oCAAoC,CAAC;AAEpE,OAAO,EAAE,aAAa,EAAE,MAAM,2CAA2C,CAAC;AAE1E;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,OAAO,CAAC;IACjB,UAAU,EAAE,OAAO,CAAC;IACpB,cAAc,EAAE,MAAM,EAAE,CAAC;IACzB,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,eAAO,MAAM,aAAa,iBAA6C,CAAC;AAExE;;GAEG;AACH,qBAAa,aAAa;IACxB;;;;;;OAMG;IACH,MAAM,CAAC,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,cAAc,GAAG,eAAe;IAuD1E;;;;;OAKG;IACH,OAAO,CAAC,MAAM,CAAC,qBAAqB;IAiBpC;;;;;OAKG;IACH,OAAO,CAAC,MAAM,CAAC,gBAAgB;CAMhC;AAGD,OAAO,EAAE,aAAa,EAAE,MAAM,2CAA2C,CAAC"}
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview IBM i-aware SQL Parser using vscode-db2i's SQL language module
|
|
3
|
+
* Handles IBM i-specific SQL syntax that standard parsers don't support
|
|
4
|
+
*
|
|
5
|
+
* @module src/ibmi-mcp-server/utils/security/ibmiSqlParser
|
|
6
|
+
*/
|
|
7
|
+
import { logger } from "../../../utils/internal/logger.js";
|
|
8
|
+
import Document from "../../utils/language/document.js";
|
|
9
|
+
import { StatementType } from "../../utils/language/types.js";
|
|
10
|
+
export const readOnlyTypes = [StatementType.Select, StatementType.With];
|
|
11
|
+
/**
|
|
12
|
+
* IBM i-aware SQL parser using vscode-db2i's Document class
|
|
13
|
+
*/
|
|
14
|
+
export class IbmiSqlParser {
|
|
15
|
+
/**
|
|
16
|
+
* Parse and validate SQL query for IBM i
|
|
17
|
+
*
|
|
18
|
+
* @param query - SQL query to parse
|
|
19
|
+
* @param context - Request context for logging
|
|
20
|
+
* @returns Parse result with read-only validation
|
|
21
|
+
*/
|
|
22
|
+
static parseQuery(query, context) {
|
|
23
|
+
try {
|
|
24
|
+
// Parse query using vscode-db2i's Document class
|
|
25
|
+
const document = new Document(query);
|
|
26
|
+
// Extract statement types from parsed statements
|
|
27
|
+
const statementTypes = document.statements.map((stmt) => StatementType[stmt.type] || "Unknown");
|
|
28
|
+
// Check for write operations by analyzing statement types
|
|
29
|
+
const violations = this.detectWriteOperations(document);
|
|
30
|
+
// Determine if query is read-only
|
|
31
|
+
const isReadOnly = violations.length === 0;
|
|
32
|
+
logger.debug({
|
|
33
|
+
...context,
|
|
34
|
+
statementTypes,
|
|
35
|
+
isReadOnly,
|
|
36
|
+
violationCount: violations.length,
|
|
37
|
+
statementCount: document.statements.length,
|
|
38
|
+
}, "IBM i SQL parsed successfully with vscode-db2i parser");
|
|
39
|
+
return {
|
|
40
|
+
success: true,
|
|
41
|
+
isReadOnly,
|
|
42
|
+
statementTypes,
|
|
43
|
+
violations,
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
catch (error) {
|
|
47
|
+
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
48
|
+
logger.debug({
|
|
49
|
+
...context,
|
|
50
|
+
error: errorMessage,
|
|
51
|
+
}, "vscode-db2i parsing failed - will fall back to other validators");
|
|
52
|
+
return {
|
|
53
|
+
success: false,
|
|
54
|
+
isReadOnly: false,
|
|
55
|
+
statementTypes: [],
|
|
56
|
+
violations: ["Parse error"],
|
|
57
|
+
error: errorMessage,
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Detect write operations by analyzing statement types
|
|
63
|
+
*
|
|
64
|
+
* @param document - Parsed SQL document
|
|
65
|
+
* @returns Array of violation messages
|
|
66
|
+
*/
|
|
67
|
+
static detectWriteOperations(document) {
|
|
68
|
+
const violations = [];
|
|
69
|
+
for (const statement of document.statements) {
|
|
70
|
+
const stmtType = statement.type;
|
|
71
|
+
// Check if statement type is a write operation
|
|
72
|
+
if (this.isWriteOperation(stmtType)) {
|
|
73
|
+
violations.push(`Write operation detected: ${StatementType[stmtType] || "Unknown"}`);
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
return violations;
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Determine if a statement type is a write operation
|
|
80
|
+
*
|
|
81
|
+
* @param type - Statement type enum value
|
|
82
|
+
* @returns True if the statement modifies data
|
|
83
|
+
*/
|
|
84
|
+
static isWriteOperation(type) {
|
|
85
|
+
// Only SELECT and WITH (CTE) are read-only
|
|
86
|
+
// All other statement types (including CALL) are write operations
|
|
87
|
+
// TODO: Consider refining this logic if certain CALL statements are allowed
|
|
88
|
+
return !readOnlyTypes.includes(type);
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
// Re-export StatementType for convenience
|
|
92
|
+
export { StatementType } from "../../utils/language/types.js";
|
|
93
|
+
//# sourceMappingURL=ibmiSqlParser.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ibmiSqlParser.js","sourceRoot":"","sources":["../../../../src/ibmi-mcp-server/utils/security/ibmiSqlParser.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,4BAA4B,CAAC;AAEpD,OAAO,QAAQ,MAAM,8CAA8C,CAAC;AACpE,OAAO,EAAE,aAAa,EAAE,MAAM,2CAA2C,CAAC;AAa1E,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,aAAa,CAAC,MAAM,EAAE,aAAa,CAAC,IAAI,CAAC,CAAC;AAExE;;GAEG;AACH,MAAM,OAAO,aAAa;IACxB;;;;;;OAMG;IACH,MAAM,CAAC,UAAU,CAAC,KAAa,EAAE,OAAuB;QACtD,IAAI,CAAC;YACH,iDAAiD;YACjD,MAAM,QAAQ,GAAG,IAAI,QAAQ,CAAC,KAAK,CAAC,CAAC;YAErC,iDAAiD;YACjD,MAAM,cAAc,GAAG,QAAQ,CAAC,UAAU,CAAC,GAAG,CAC5C,CAAC,IAAI,EAAE,EAAE,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,SAAS,CAChD,CAAC;YAEF,0DAA0D;YAC1D,MAAM,UAAU,GAAG,IAAI,CAAC,qBAAqB,CAAC,QAAQ,CAAC,CAAC;YAExD,kCAAkC;YAClC,MAAM,UAAU,GAAG,UAAU,CAAC,MAAM,KAAK,CAAC,CAAC;YAE3C,MAAM,CAAC,KAAK,CACV;gBACE,GAAG,OAAO;gBACV,cAAc;gBACd,UAAU;gBACV,cAAc,EAAE,UAAU,CAAC,MAAM;gBACjC,cAAc,EAAE,QAAQ,CAAC,UAAU,CAAC,MAAM;aAC3C,EACD,uDAAuD,CACxD,CAAC;YAEF,OAAO;gBACL,OAAO,EAAE,IAAI;gBACb,UAAU;gBACV,cAAc;gBACd,UAAU;aACX,CAAC;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,YAAY,GAChB,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YAEzD,MAAM,CAAC,KAAK,CACV;gBACE,GAAG,OAAO;gBACV,KAAK,EAAE,YAAY;aACpB,EACD,iEAAiE,CAClE,CAAC;YAEF,OAAO;gBACL,OAAO,EAAE,KAAK;gBACd,UAAU,EAAE,KAAK;gBACjB,cAAc,EAAE,EAAE;gBAClB,UAAU,EAAE,CAAC,aAAa,CAAC;gBAC3B,KAAK,EAAE,YAAY;aACpB,CAAC;QACJ,CAAC;IACH,CAAC;IAED;;;;;OAKG;IACK,MAAM,CAAC,qBAAqB,CAAC,QAAkB;QACrD,MAAM,UAAU,GAAa,EAAE,CAAC;QAEhC,KAAK,MAAM,SAAS,IAAI,QAAQ,CAAC,UAAU,EAAE,CAAC;YAC5C,MAAM,QAAQ,GAAG,SAAS,CAAC,IAAI,CAAC;YAEhC,+CAA+C;YAC/C,IAAI,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC,EAAE,CAAC;gBACpC,UAAU,CAAC,IAAI,CACb,6BAA6B,aAAa,CAAC,QAAQ,CAAC,IAAI,SAAS,EAAE,CACpE,CAAC;YACJ,CAAC;QACH,CAAC;QAED,OAAO,UAAU,CAAC;IACpB,CAAC;IAED;;;;;OAKG;IACK,MAAM,CAAC,gBAAgB,CAAC,IAAmB;QACjD,2CAA2C;QAC3C,kEAAkE;QAClE,4EAA4E;QAC5E,OAAO,CAAC,aAAa,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;IACvC,CAAC;CACF;AAED,0CAA0C;AAC1C,OAAO,EAAE,aAAa,EAAE,MAAM,2CAA2C,CAAC"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* @fileoverview SQL Security Validator for validating SQL queries against security policies
|
|
3
|
-
*
|
|
3
|
+
* Uses vscode-db2i tokenizer for precise validation and regex patterns as fallback
|
|
4
4
|
*
|
|
5
5
|
* @module src/utils/security/sqlSecurityValidator
|
|
6
6
|
*/
|
|
@@ -15,25 +15,49 @@ export interface SecurityValidationResult {
|
|
|
15
15
|
/** List of security violations found */
|
|
16
16
|
violations: string[];
|
|
17
17
|
/** Validation method used */
|
|
18
|
-
validationMethod: "
|
|
18
|
+
validationMethod: "regex" | "combined";
|
|
19
19
|
}
|
|
20
20
|
/**
|
|
21
21
|
* Dangerous SQL operations that should be blocked in read-only mode
|
|
22
22
|
*/
|
|
23
|
-
export declare const DANGEROUS_OPERATIONS: readonly ["INSERT", "UPDATE", "DELETE", "
|
|
24
|
-
/**
|
|
25
|
-
* Dangerous SQL functions that should be monitored/blocked
|
|
26
|
-
*/
|
|
27
|
-
export declare const DANGEROUS_FUNCTIONS: readonly ["SYSTEM", "QCMDEXC", "SQL_EXECUTE_IMMEDIATE", "SQLCMD", "LOAD_EXTENSION", "EXEC", "EXECUTE_IMMEDIATE", "EVAL", "CONCAT", "CHAR", "VARCHAR"];
|
|
23
|
+
export declare const DANGEROUS_OPERATIONS: readonly ["INSERT", "UPDATE", "DELETE", "MERGE", "TRUNCATE", "DROP", "CREATE", "ALTER", "RENAME", "CALL", "EXEC", "EXECUTE", "SET", "DECLARE", "GRANT", "REVOKE", "DENY", "LOAD", "IMPORT", "EXPORT", "BULK", "SHUTDOWN", "RESTART", "KILL", "STOP", "START", "BACKUP", "RESTORE", "DUMP", "LOCK", "UNLOCK", "COMMIT", "ROLLBACK", "SAVEPOINT", "QCMDEXC", "SQL_EXECUTE_IMMEDIATE"];
|
|
28
24
|
/**
|
|
29
25
|
* Dangerous SQL patterns that should be detected
|
|
30
26
|
*/
|
|
31
|
-
export declare const DANGEROUS_PATTERNS: readonly [RegExp, RegExp, RegExp
|
|
27
|
+
export declare const DANGEROUS_PATTERNS: readonly [RegExp, RegExp, RegExp];
|
|
32
28
|
/**
|
|
33
29
|
* SQL Security Validator class for comprehensive SQL security validation
|
|
30
|
+
* Uses token-based validation with vscode-db2i tokenizer as primary method
|
|
34
31
|
*/
|
|
35
32
|
export declare class SqlSecurityValidator {
|
|
36
|
-
private static
|
|
33
|
+
private static tokeniser;
|
|
34
|
+
/**
|
|
35
|
+
* Truncate query string for error messages and logging
|
|
36
|
+
* @param query - SQL query to truncate
|
|
37
|
+
* @param maxLength - Maximum length before truncation (default: 100)
|
|
38
|
+
* @returns Truncated query with ellipsis if needed
|
|
39
|
+
* @private
|
|
40
|
+
*/
|
|
41
|
+
private static truncateQuery;
|
|
42
|
+
/**
|
|
43
|
+
* Throw validation error with standardized format
|
|
44
|
+
* @param message - Error message
|
|
45
|
+
* @param violations - List of violations
|
|
46
|
+
* @param context - Additional context for error
|
|
47
|
+
* @param query - SQL query being validated
|
|
48
|
+
* @throws McpError with ValidationError code
|
|
49
|
+
* @private
|
|
50
|
+
*/
|
|
51
|
+
private static throwValidationError;
|
|
52
|
+
/**
|
|
53
|
+
* Validate forbidden keywords using token-based approach
|
|
54
|
+
* This method uses the vscode-db2i tokenizer to precisely identify SQL keywords
|
|
55
|
+
* @param query - SQL query to validate
|
|
56
|
+
* @param forbiddenKeywords - List of forbidden keywords
|
|
57
|
+
* @returns Security validation result
|
|
58
|
+
* @private
|
|
59
|
+
*/
|
|
60
|
+
private static validateForbiddenKeywordsToken;
|
|
37
61
|
/**
|
|
38
62
|
* Validate SQL query against security configuration
|
|
39
63
|
* @param query - SQL query to validate
|
|
@@ -50,7 +74,7 @@ export declare class SqlSecurityValidator {
|
|
|
50
74
|
*/
|
|
51
75
|
private static validateQueryLength;
|
|
52
76
|
/**
|
|
53
|
-
* Validate forbidden keywords using
|
|
77
|
+
* Validate forbidden keywords using token-based approach with regex fallback
|
|
54
78
|
* @param query - SQL query to validate
|
|
55
79
|
* @param securityConfig - Security configuration
|
|
56
80
|
* @param context - Request context for logging
|
|
@@ -58,59 +82,11 @@ export declare class SqlSecurityValidator {
|
|
|
58
82
|
*/
|
|
59
83
|
private static validateForbiddenKeywords;
|
|
60
84
|
/**
|
|
61
|
-
* Validate read-only restrictions using
|
|
85
|
+
* Validate read-only restrictions using IBM i parser with regex fallback
|
|
62
86
|
* @param query - SQL query to validate
|
|
63
87
|
* @param context - Request context for logging
|
|
64
88
|
* @private
|
|
65
89
|
*/
|
|
66
90
|
private static validateReadOnlyRestrictions;
|
|
67
|
-
/**
|
|
68
|
-
* Validate SQL query using AST parsing
|
|
69
|
-
* @param query - SQL query to validate
|
|
70
|
-
* @param context - Request context for logging
|
|
71
|
-
* @private
|
|
72
|
-
*/
|
|
73
|
-
private static validateQueryAST;
|
|
74
|
-
/**
|
|
75
|
-
* Validate SQL query using regex patterns
|
|
76
|
-
* @param query - SQL query to validate
|
|
77
|
-
* @param _context - Request context for logging (unused but kept for consistency)
|
|
78
|
-
* @private
|
|
79
|
-
*/
|
|
80
|
-
private static validateQueryRegex;
|
|
81
|
-
/**
|
|
82
|
-
* Validate forbidden keywords using AST parsing
|
|
83
|
-
* @param query - SQL query to validate
|
|
84
|
-
* @param forbiddenKeywords - List of forbidden keywords
|
|
85
|
-
* @param context - Request context for logging
|
|
86
|
-
* @private
|
|
87
|
-
*/
|
|
88
|
-
private static validateForbiddenKeywordsAST;
|
|
89
|
-
/**
|
|
90
|
-
* Validate forbidden keywords using regex patterns
|
|
91
|
-
* @param query - SQL query to validate
|
|
92
|
-
* @param forbiddenKeywords - List of forbidden keywords
|
|
93
|
-
* @private
|
|
94
|
-
*/
|
|
95
|
-
private static validateForbiddenKeywordsRegex;
|
|
96
|
-
/**
|
|
97
|
-
* Find dangerous functions anywhere in the AST
|
|
98
|
-
* @param node - AST node to analyze
|
|
99
|
-
* @private
|
|
100
|
-
*/
|
|
101
|
-
private static findDangerousFunctionsInAST;
|
|
102
|
-
/**
|
|
103
|
-
* Find forbidden keywords anywhere in the AST
|
|
104
|
-
* @param node - AST node to analyze
|
|
105
|
-
* @param forbiddenKeywords - List of forbidden keywords
|
|
106
|
-
* @private
|
|
107
|
-
*/
|
|
108
|
-
private static findForbiddenKeywordsInAST;
|
|
109
|
-
/**
|
|
110
|
-
* Check for UNION with dangerous statements
|
|
111
|
-
* @param statement - AST statement to check
|
|
112
|
-
* @private
|
|
113
|
-
*/
|
|
114
|
-
private static hasUnionWithDangerousStatements;
|
|
115
91
|
}
|
|
116
92
|
//# sourceMappingURL=sqlSecurityValidator.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sqlSecurityValidator.d.ts","sourceRoot":"","sources":["../../../../src/ibmi-mcp-server/utils/security/sqlSecurityValidator.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;
|
|
1
|
+
{"version":3,"file":"sqlSecurityValidator.d.ts","sourceRoot":"","sources":["../../../../src/ibmi-mcp-server/utils/security/sqlSecurityValidator.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,EAAE,cAAc,EAAE,MAAM,oCAAoC,CAAC;AAEpE,OAAO,EAAE,qBAAqB,EAAE,MAAM,wBAAwB,CAAC;AAK/D;;GAEG;AACH,MAAM,WAAW,wBAAwB;IACvC,oCAAoC;IACpC,OAAO,EAAE,OAAO,CAAC;IACjB,wCAAwC;IACxC,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,6BAA6B;IAC7B,gBAAgB,EAAE,OAAO,GAAG,UAAU,CAAC;CACxC;AAED;;GAEG;AACH,eAAO,MAAM,oBAAoB,qXA+CvB,CAAC;AAEX;;GAEG;AACH,eAAO,MAAM,kBAAkB,mCAOrB,CAAC;AAEX;;;GAGG;AACH,qBAAa,oBAAoB;IAC/B,OAAO,CAAC,MAAM,CAAC,SAAS,CAAsB;IAE9C;;;;;;OAMG;IACH,OAAO,CAAC,MAAM,CAAC,aAAa;IAM5B;;;;;;;;OAQG;IACH,OAAO,CAAC,MAAM,CAAC,oBAAoB;IAanC;;;;;;;OAOG;IACH,OAAO,CAAC,MAAM,CAAC,8BAA8B;IA6B7C;;;;;;OAMG;IACH,MAAM,CAAC,aAAa,CAClB,KAAK,EAAE,MAAM,EACb,cAAc,EAAE,qBAAqB,EACrC,OAAO,EAAE,cAAc,GACtB,IAAI;IA8BP;;;;;OAKG;IACH,OAAO,CAAC,MAAM,CAAC,mBAAmB;IAkBlC;;;;;;OAMG;IACH,OAAO,CAAC,MAAM,CAAC,yBAAyB;IA+DxC;;;;;OAKG;IACH,OAAO,CAAC,MAAM,CAAC,4BAA4B;CA0D5C"}
|