@ibm/ibmi-mcp-server 0.2.0 → 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 +140 -0
- package/dist/config/index.d.ts +2 -0
- package/dist/config/index.d.ts.map +1 -1
- package/dist/config/index.js +14 -0
- 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/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/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/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/package.json +21 -22
- 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,356 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Execute SQL Tool
|
|
3
|
+
*
|
|
4
|
+
* Executes SQL queries on IBM i database with optional security restrictions.
|
|
5
|
+
* Migrated from 3-file pattern to factory pattern.
|
|
6
|
+
*
|
|
7
|
+
* @module executeSql.tool
|
|
8
|
+
* @feature 001-tool-factory
|
|
9
|
+
*/
|
|
10
|
+
import { z } from "zod";
|
|
11
|
+
import { JsonRpcErrorCode, McpError } from "../../types-global/errors.js";
|
|
12
|
+
import { getRequestContext, requestContextService, } from "../../utils/index.js";
|
|
13
|
+
import { logger } from "../../utils/internal/logger.js";
|
|
14
|
+
import { SqlSecurityValidator } from "../utils/security/sqlSecurityValidator.js";
|
|
15
|
+
import { logOperationStart, logOperationSuccess, } from "../../utils/internal/logging-helpers.js";
|
|
16
|
+
import { IBMiConnectionPool } from "../services/connectionPool.js";
|
|
17
|
+
import { defineTool } from "../../mcp-server/tools/utils/tool-factory.js";
|
|
18
|
+
import { config } from "../../config/index.js";
|
|
19
|
+
// =============================================================================
|
|
20
|
+
// Constants & Configuration
|
|
21
|
+
// =============================================================================
|
|
22
|
+
const TOOL_NAME = "execute_sql";
|
|
23
|
+
const TOOL_DESCRIPTION = "Executes a SELECT query on the IBM i database and returns the results. Use this tool to retrieve data from database tables and views.";
|
|
24
|
+
/**
|
|
25
|
+
* Default tool configuration
|
|
26
|
+
* Readonly mode is controlled by IBMI_EXECUTE_SQL_READONLY environment variable (defaults to true)
|
|
27
|
+
* This ensures write operations are opt-in for security
|
|
28
|
+
*/
|
|
29
|
+
let toolConfig = {
|
|
30
|
+
enabled: true,
|
|
31
|
+
security: {
|
|
32
|
+
readOnly: config.ibmi_executeSqlReadonly,
|
|
33
|
+
maxQueryLength: 10000,
|
|
34
|
+
},
|
|
35
|
+
};
|
|
36
|
+
/**
|
|
37
|
+
* Configure the execute SQL tool
|
|
38
|
+
* @param config - Configuration options
|
|
39
|
+
*/
|
|
40
|
+
export function configureExecuteSqlTool(config) {
|
|
41
|
+
const context = getRequestContext() ??
|
|
42
|
+
requestContextService.createRequestContext({
|
|
43
|
+
operation: "ConfigureExecuteSqlTool",
|
|
44
|
+
});
|
|
45
|
+
logOperationStart(context, "Configuring Execute SQL tool", {
|
|
46
|
+
config,
|
|
47
|
+
toolName: TOOL_NAME,
|
|
48
|
+
});
|
|
49
|
+
// Merge with existing config
|
|
50
|
+
toolConfig = {
|
|
51
|
+
...toolConfig,
|
|
52
|
+
...config,
|
|
53
|
+
security: {
|
|
54
|
+
...toolConfig.security,
|
|
55
|
+
...config.security,
|
|
56
|
+
},
|
|
57
|
+
};
|
|
58
|
+
logOperationSuccess(context, "Execute SQL tool configuration updated", {
|
|
59
|
+
enabled: toolConfig.enabled,
|
|
60
|
+
readOnly: toolConfig.security?.readOnly,
|
|
61
|
+
maxQueryLength: toolConfig.security?.maxQueryLength,
|
|
62
|
+
});
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Get the current configuration for the execute SQL tool
|
|
66
|
+
* @returns Current tool configuration
|
|
67
|
+
*/
|
|
68
|
+
export function getExecuteSqlConfig() {
|
|
69
|
+
return toolConfig;
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Check if the execute SQL tool is enabled
|
|
73
|
+
* @returns True if the tool is enabled
|
|
74
|
+
*/
|
|
75
|
+
export function isExecuteSqlEnabled() {
|
|
76
|
+
return toolConfig.enabled;
|
|
77
|
+
}
|
|
78
|
+
// =============================================================================
|
|
79
|
+
// Schemas
|
|
80
|
+
// =============================================================================
|
|
81
|
+
/**
|
|
82
|
+
* Input schema for executing SQL queries
|
|
83
|
+
*/
|
|
84
|
+
const ExecuteSqlInputSchema = z.object({
|
|
85
|
+
sql: z
|
|
86
|
+
.string()
|
|
87
|
+
.min(1, "SQL query cannot be empty.")
|
|
88
|
+
.max(10000, "SQL query exceeds maximum length of 10000 characters.")
|
|
89
|
+
.describe("The SQL query to execute on the IBM i database."),
|
|
90
|
+
});
|
|
91
|
+
/**
|
|
92
|
+
* Output schema for SQL execution results
|
|
93
|
+
*/
|
|
94
|
+
const ExecuteSqlResponseSchema = z.object({
|
|
95
|
+
success: z.boolean().describe("Whether the query executed successfully."),
|
|
96
|
+
data: z
|
|
97
|
+
.array(z.record(z.unknown()))
|
|
98
|
+
.optional()
|
|
99
|
+
.describe("Array of result rows if query was successful."),
|
|
100
|
+
rowCount: z
|
|
101
|
+
.number()
|
|
102
|
+
.optional()
|
|
103
|
+
.describe("Number of rows returned by the query."),
|
|
104
|
+
executionTime: z
|
|
105
|
+
.number()
|
|
106
|
+
.optional()
|
|
107
|
+
.describe("Query execution time in milliseconds."),
|
|
108
|
+
metadata: z
|
|
109
|
+
.object({
|
|
110
|
+
columns: z
|
|
111
|
+
.array(z.object({
|
|
112
|
+
name: z.string().describe("Column name"),
|
|
113
|
+
type: z.string().describe("Column data type"),
|
|
114
|
+
}))
|
|
115
|
+
.optional()
|
|
116
|
+
.describe("Column metadata for the result set."),
|
|
117
|
+
})
|
|
118
|
+
.optional()
|
|
119
|
+
.describe("Additional metadata about the query results."),
|
|
120
|
+
error: z
|
|
121
|
+
.object({
|
|
122
|
+
code: z.string().describe("Error code"),
|
|
123
|
+
message: z.string().describe("Error message"),
|
|
124
|
+
details: z.record(z.unknown()).optional().describe("Error details"),
|
|
125
|
+
})
|
|
126
|
+
.optional()
|
|
127
|
+
.describe("Error information if the query failed."),
|
|
128
|
+
});
|
|
129
|
+
// =============================================================================
|
|
130
|
+
// Security Validation
|
|
131
|
+
// =============================================================================
|
|
132
|
+
/**
|
|
133
|
+
* Validates SQL query against security restrictions
|
|
134
|
+
* Delegates to centralized SqlSecurityValidator
|
|
135
|
+
* @param sql - SQL query to validate
|
|
136
|
+
* @param appContext - Request context for logging
|
|
137
|
+
* @throws McpError if query violates security restrictions
|
|
138
|
+
*/
|
|
139
|
+
function validateSqlSecurity(sql, appContext) {
|
|
140
|
+
const config = getExecuteSqlConfig();
|
|
141
|
+
const securityConfig = {
|
|
142
|
+
readOnly: config.security?.readOnly ?? true,
|
|
143
|
+
maxQueryLength: config.security?.maxQueryLength ?? 10000,
|
|
144
|
+
};
|
|
145
|
+
// Use centralized validator
|
|
146
|
+
SqlSecurityValidator.validateQuery(sql, securityConfig, appContext);
|
|
147
|
+
}
|
|
148
|
+
/**
|
|
149
|
+
* Validate SQL query using IBM i PARSE_STATEMENT
|
|
150
|
+
* Verifies statement type matches readOnly configuration
|
|
151
|
+
* Uses IBM i's native SQL parser for authoritative statement type detection
|
|
152
|
+
*
|
|
153
|
+
* @param sql - SQL query to validate (should be pre-sanitized without trailing semicolons)
|
|
154
|
+
* @param readOnly - Whether readonly mode is enabled
|
|
155
|
+
* @param appContext - Request context for logging
|
|
156
|
+
* @throws {McpError} If validation fails (syntax error, non-query in readonly mode, or execution failure)
|
|
157
|
+
*
|
|
158
|
+
* @see https://www.ibm.com/docs/en/i/7.5?topic=services-parse-statement-table-function
|
|
159
|
+
*/
|
|
160
|
+
async function validateWithParseStatement(sql, readOnly, appContext) {
|
|
161
|
+
// Build PARSE_STATEMENT query with named parameters
|
|
162
|
+
const parseQuery = `
|
|
163
|
+
SELECT DISTINCT SQL_STATEMENT_TYPE
|
|
164
|
+
FROM TABLE(QSYS2.PARSE_STATEMENT(
|
|
165
|
+
SQL_STATEMENT => ?,
|
|
166
|
+
NAMING => '*SQL',
|
|
167
|
+
DECIMAL_POINT => '*PERIOD',
|
|
168
|
+
SQL_STRING_DELIMITER => '*APOSTSQL'
|
|
169
|
+
)) AS P
|
|
170
|
+
`.trim();
|
|
171
|
+
try {
|
|
172
|
+
// Execute PARSE_STATEMENT via connection pool
|
|
173
|
+
const result = await IBMiConnectionPool.executeQuery(parseQuery, [sql], appContext);
|
|
174
|
+
// Empty result = syntax error (PARSE_STATEMENT returns no rows on parse failure)
|
|
175
|
+
if (!result.data || result.data.length === 0) {
|
|
176
|
+
throw new McpError(JsonRpcErrorCode.ValidationError, "SQL syntax error: Query could not be parsed by IBM i", {
|
|
177
|
+
query: sql.substring(0, 100) + (sql.length > 100 ? "..." : ""),
|
|
178
|
+
validationMethod: "parse_statement",
|
|
179
|
+
});
|
|
180
|
+
}
|
|
181
|
+
// Extract statement type from first row
|
|
182
|
+
const firstRow = result.data[0];
|
|
183
|
+
const statementType = (firstRow.SQL_STATEMENT_TYPE || "").toUpperCase();
|
|
184
|
+
// Validate statement type against readOnly mode
|
|
185
|
+
if (readOnly && statementType !== "QUERY") {
|
|
186
|
+
throw new McpError(JsonRpcErrorCode.ValidationError, `Non-query statement '${statementType}' not allowed in read-only mode`, {
|
|
187
|
+
query: sql.substring(0, 100) + (sql.length > 100 ? "..." : ""),
|
|
188
|
+
sqlStatementType: statementType,
|
|
189
|
+
readOnly: true,
|
|
190
|
+
validationMethod: "parse_statement",
|
|
191
|
+
});
|
|
192
|
+
}
|
|
193
|
+
logger.debug({
|
|
194
|
+
...appContext,
|
|
195
|
+
sqlStatementType: statementType,
|
|
196
|
+
readOnly,
|
|
197
|
+
}, "PARSE_STATEMENT validation passed");
|
|
198
|
+
}
|
|
199
|
+
catch (error) {
|
|
200
|
+
// Re-throw McpError as-is
|
|
201
|
+
if (error instanceof McpError) {
|
|
202
|
+
throw error;
|
|
203
|
+
}
|
|
204
|
+
// Fail closed on unexpected errors
|
|
205
|
+
throw new McpError(JsonRpcErrorCode.ValidationError, "SQL validation failed: Unable to execute PARSE_STATEMENT", {
|
|
206
|
+
query: sql.substring(0, 100) + (sql.length > 100 ? "..." : ""),
|
|
207
|
+
validationMethod: "parse_statement",
|
|
208
|
+
originalError: error instanceof Error ? error.message : String(error),
|
|
209
|
+
});
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
// =============================================================================
|
|
213
|
+
// Business Logic
|
|
214
|
+
// =============================================================================
|
|
215
|
+
/**
|
|
216
|
+
* Core logic for executing SQL queries
|
|
217
|
+
* Validates security restrictions and executes the query
|
|
218
|
+
*/
|
|
219
|
+
async function executeSqlLogic(params, appContext, _sdkContext) {
|
|
220
|
+
// Sanitize SQL: Remove trailing semicolons (statement terminators)
|
|
221
|
+
// IBM i SQL execution and PARSE_STATEMENT expect pure SQL without terminators
|
|
222
|
+
const sanitizedSql = params.sql.trim().replace(/;+\s*$/, "");
|
|
223
|
+
logger.debug({
|
|
224
|
+
...appContext,
|
|
225
|
+
toolInput: params,
|
|
226
|
+
sanitized: sanitizedSql !== params.sql,
|
|
227
|
+
}, "Processing execute SQL logic.");
|
|
228
|
+
const startTime = Date.now();
|
|
229
|
+
try {
|
|
230
|
+
// Validate security restrictions (AST/Regex - Layer 1)
|
|
231
|
+
validateSqlSecurity(sanitizedSql, appContext);
|
|
232
|
+
// Validate with PARSE_STATEMENT (IBM i native validation - Layer 2)
|
|
233
|
+
const config = getExecuteSqlConfig();
|
|
234
|
+
await validateWithParseStatement(sanitizedSql, config.security?.readOnly ?? true, appContext);
|
|
235
|
+
// Execute the query with sanitized SQL
|
|
236
|
+
const result = await IBMiConnectionPool.executeQueryWithPagination(sanitizedSql, [], appContext, 1000);
|
|
237
|
+
const executionTime = Date.now() - startTime;
|
|
238
|
+
if (!result.success) {
|
|
239
|
+
// Return error response that matches schema
|
|
240
|
+
return {
|
|
241
|
+
success: false,
|
|
242
|
+
executionTime,
|
|
243
|
+
error: {
|
|
244
|
+
code: String(JsonRpcErrorCode.DatabaseError),
|
|
245
|
+
message: "SQL query execution failed",
|
|
246
|
+
details: {
|
|
247
|
+
sql: sanitizedSql,
|
|
248
|
+
sqlReturnCode: result.sql_rc,
|
|
249
|
+
},
|
|
250
|
+
},
|
|
251
|
+
};
|
|
252
|
+
}
|
|
253
|
+
// Type assertion for result data - we know this is an array of records from the database
|
|
254
|
+
const typedData = result.data;
|
|
255
|
+
const response = {
|
|
256
|
+
success: true,
|
|
257
|
+
data: typedData,
|
|
258
|
+
rowCount: typedData?.length ?? 0,
|
|
259
|
+
executionTime,
|
|
260
|
+
metadata: typedData && typedData.length > 0 && typedData[0]
|
|
261
|
+
? {
|
|
262
|
+
columns: Object.keys(typedData[0]).map((key) => ({
|
|
263
|
+
name: key,
|
|
264
|
+
type: typeof typedData[0][key],
|
|
265
|
+
})),
|
|
266
|
+
}
|
|
267
|
+
: undefined,
|
|
268
|
+
};
|
|
269
|
+
logger.debug({
|
|
270
|
+
...appContext,
|
|
271
|
+
rowCount: response.rowCount,
|
|
272
|
+
executionTime,
|
|
273
|
+
hasData: !!response.data,
|
|
274
|
+
}, "SQL query executed successfully.");
|
|
275
|
+
return response;
|
|
276
|
+
}
|
|
277
|
+
catch (error) {
|
|
278
|
+
const executionTime = Date.now() - startTime;
|
|
279
|
+
logger.error({
|
|
280
|
+
...appContext,
|
|
281
|
+
error: error instanceof Error ? error.message : String(error),
|
|
282
|
+
sql: sanitizedSql,
|
|
283
|
+
executionTime,
|
|
284
|
+
}, "SQL query execution failed.");
|
|
285
|
+
// Return error response that matches schema instead of throwing
|
|
286
|
+
if (error instanceof McpError) {
|
|
287
|
+
return {
|
|
288
|
+
success: false,
|
|
289
|
+
executionTime,
|
|
290
|
+
error: {
|
|
291
|
+
code: String(error.code),
|
|
292
|
+
message: error.message,
|
|
293
|
+
details: error.details,
|
|
294
|
+
},
|
|
295
|
+
};
|
|
296
|
+
}
|
|
297
|
+
// Handle unexpected errors
|
|
298
|
+
return {
|
|
299
|
+
success: false,
|
|
300
|
+
executionTime,
|
|
301
|
+
error: {
|
|
302
|
+
code: String(JsonRpcErrorCode.DatabaseError),
|
|
303
|
+
message: `SQL query execution failed: ${error instanceof Error ? error.message : String(error)}`,
|
|
304
|
+
details: {
|
|
305
|
+
sql: sanitizedSql,
|
|
306
|
+
originalError: error instanceof Error ? error.name : "Unknown",
|
|
307
|
+
},
|
|
308
|
+
},
|
|
309
|
+
};
|
|
310
|
+
}
|
|
311
|
+
}
|
|
312
|
+
// =============================================================================
|
|
313
|
+
// Custom Response Formatter
|
|
314
|
+
// =============================================================================
|
|
315
|
+
const executeSqlResponseFormatter = (result) => {
|
|
316
|
+
if (!result.success) {
|
|
317
|
+
// Format error response
|
|
318
|
+
const errorMessage = result.error?.message || "SQL query execution failed";
|
|
319
|
+
const errorDetails = result.error?.details
|
|
320
|
+
? `\n\nDetails:\n${JSON.stringify(result.error.details, null, 2)}`
|
|
321
|
+
: "";
|
|
322
|
+
return [
|
|
323
|
+
{
|
|
324
|
+
type: "text",
|
|
325
|
+
text: `Error: ${errorMessage}${errorDetails}`,
|
|
326
|
+
},
|
|
327
|
+
];
|
|
328
|
+
}
|
|
329
|
+
// Format the result as a table-like JSON representation
|
|
330
|
+
const resultJson = JSON.stringify(result.data, null, 2);
|
|
331
|
+
return [
|
|
332
|
+
{
|
|
333
|
+
type: "text",
|
|
334
|
+
text: `SQL query executed successfully.\n\nRows returned: ${result.rowCount}\nExecution time: ${result.executionTime}ms\n\nResults:\n${resultJson}`,
|
|
335
|
+
},
|
|
336
|
+
];
|
|
337
|
+
};
|
|
338
|
+
// =============================================================================
|
|
339
|
+
// Tool Definition
|
|
340
|
+
// =============================================================================
|
|
341
|
+
export const executeSqlTool = defineTool({
|
|
342
|
+
name: TOOL_NAME,
|
|
343
|
+
title: "Execute SQL",
|
|
344
|
+
description: toolConfig.description || TOOL_DESCRIPTION,
|
|
345
|
+
inputSchema: ExecuteSqlInputSchema,
|
|
346
|
+
outputSchema: ExecuteSqlResponseSchema,
|
|
347
|
+
logic: executeSqlLogic,
|
|
348
|
+
responseFormatter: executeSqlResponseFormatter,
|
|
349
|
+
annotations: {
|
|
350
|
+
readOnlyHint: toolConfig.security?.readOnly ?? true, // Default to true for safety
|
|
351
|
+
destructiveHint: !(toolConfig.security?.readOnly ?? true), // Destructive if not read-only
|
|
352
|
+
openWorldHint: !(toolConfig.security?.readOnly ?? true), // Open world if not read-only
|
|
353
|
+
},
|
|
354
|
+
enabled: () => toolConfig.enabled, // Use function to dynamically check enabled state
|
|
355
|
+
});
|
|
356
|
+
//# sourceMappingURL=executeSql.tool.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"executeSql.tool.js","sourceRoot":"","sources":["../../../src/ibmi-mcp-server/tools/executeSql.tool.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Generate SQL DDL Tool
|
|
3
|
+
*
|
|
4
|
+
* Generates SQL DDL statements for IBM i database objects using the QSYS2.GENERATE_SQL procedure.
|
|
5
|
+
* Migrated from 3-file pattern to factory pattern.
|
|
6
|
+
*
|
|
7
|
+
* @module generateSql.tool
|
|
8
|
+
* @feature 001-tool-factory
|
|
9
|
+
*/
|
|
10
|
+
import { z } from "zod";
|
|
11
|
+
export declare const generateSqlTool: import("../../mcp-server/tools/utils/types.js").ToolDefinition<{
|
|
12
|
+
object_name: z.ZodString;
|
|
13
|
+
object_library: z.ZodDefault<z.ZodString>;
|
|
14
|
+
object_type: z.ZodDefault<z.ZodEnum<["ALIAS", "CONSTRAINT", "FUNCTION", "INDEX", "MASK", "PERMISSION", "PROCEDURE", "SCHEMA", "SEQUENCE", "TABLE", "TRIGGER", "TYPE", "VARIABLE", "VIEW", "XSR"]>>;
|
|
15
|
+
}, {
|
|
16
|
+
success: z.ZodBoolean;
|
|
17
|
+
sql: z.ZodOptional<z.ZodString>;
|
|
18
|
+
object_name: z.ZodString;
|
|
19
|
+
object_library: z.ZodString;
|
|
20
|
+
object_type: z.ZodString;
|
|
21
|
+
executionTime: z.ZodOptional<z.ZodNumber>;
|
|
22
|
+
error: z.ZodOptional<z.ZodObject<{
|
|
23
|
+
code: z.ZodString;
|
|
24
|
+
message: z.ZodString;
|
|
25
|
+
details: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
|
|
26
|
+
}, "strip", z.ZodTypeAny, {
|
|
27
|
+
code: string;
|
|
28
|
+
message: string;
|
|
29
|
+
details?: Record<string, unknown> | undefined;
|
|
30
|
+
}, {
|
|
31
|
+
code: string;
|
|
32
|
+
message: string;
|
|
33
|
+
details?: Record<string, unknown> | undefined;
|
|
34
|
+
}>>;
|
|
35
|
+
}>;
|
|
36
|
+
//# sourceMappingURL=generateSql.tool.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"generateSql.tool.d.ts","sourceRoot":"","sources":["../../../src/ibmi-mcp-server/tools/generateSql.tool.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAoUxB,eAAO,MAAM,eAAe;;;;;;;;;;;;;;;;;;;;;;;;EAc1B,CAAC"}
|