@ibm/ibmi-mcp-server 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.
- package/README.md +88 -0
- package/dist/config/index.d.ts +100 -0
- package/dist/config/index.d.ts.map +1 -0
- package/dist/config/index.js +463 -0
- package/dist/config/index.js.map +1 -0
- package/dist/config/resolver.d.ts +32 -0
- package/dist/config/resolver.d.ts.map +1 -0
- package/dist/config/resolver.js +60 -0
- package/dist/config/resolver.js.map +1 -0
- package/dist/ibmi-mcp-server/auth/crypto.d.ts +11 -0
- package/dist/ibmi-mcp-server/auth/crypto.d.ts.map +1 -0
- package/dist/ibmi-mcp-server/auth/crypto.js +100 -0
- package/dist/ibmi-mcp-server/auth/crypto.js.map +1 -0
- package/dist/ibmi-mcp-server/auth/httpAuthEndpoint.d.ts +28 -0
- package/dist/ibmi-mcp-server/auth/httpAuthEndpoint.d.ts.map +1 -0
- package/dist/ibmi-mcp-server/auth/httpAuthEndpoint.js +243 -0
- package/dist/ibmi-mcp-server/auth/httpAuthEndpoint.js.map +1 -0
- package/dist/ibmi-mcp-server/auth/index.d.ts +9 -0
- package/dist/ibmi-mcp-server/auth/index.d.ts.map +1 -0
- package/dist/ibmi-mcp-server/auth/index.js +8 -0
- package/dist/ibmi-mcp-server/auth/index.js.map +1 -0
- package/dist/ibmi-mcp-server/auth/tokenManager.d.ts +86 -0
- package/dist/ibmi-mcp-server/auth/tokenManager.d.ts.map +1 -0
- package/dist/ibmi-mcp-server/auth/tokenManager.js +214 -0
- package/dist/ibmi-mcp-server/auth/tokenManager.js.map +1 -0
- package/dist/ibmi-mcp-server/auth/types.d.ts +31 -0
- package/dist/ibmi-mcp-server/auth/types.d.ts.map +1 -0
- package/dist/ibmi-mcp-server/auth/types.js +5 -0
- package/dist/ibmi-mcp-server/auth/types.js.map +1 -0
- package/dist/ibmi-mcp-server/index.d.ts +8 -0
- package/dist/ibmi-mcp-server/index.d.ts.map +1 -0
- package/dist/ibmi-mcp-server/index.js +126 -0
- package/dist/ibmi-mcp-server/index.js.map +1 -0
- package/dist/ibmi-mcp-server/resources/toolsetsResource/index.d.ts +7 -0
- package/dist/ibmi-mcp-server/resources/toolsetsResource/index.d.ts.map +1 -0
- package/dist/ibmi-mcp-server/resources/toolsetsResource/index.js +7 -0
- package/dist/ibmi-mcp-server/resources/toolsetsResource/index.js.map +1 -0
- package/dist/ibmi-mcp-server/resources/toolsetsResource/logic.d.ts +106 -0
- package/dist/ibmi-mcp-server/resources/toolsetsResource/logic.d.ts.map +1 -0
- package/dist/ibmi-mcp-server/resources/toolsetsResource/logic.js +145 -0
- package/dist/ibmi-mcp-server/resources/toolsetsResource/logic.js.map +1 -0
- package/dist/ibmi-mcp-server/resources/toolsetsResource/registration.d.ts +16 -0
- package/dist/ibmi-mcp-server/resources/toolsetsResource/registration.d.ts.map +1 -0
- package/dist/ibmi-mcp-server/resources/toolsetsResource/registration.js +110 -0
- package/dist/ibmi-mcp-server/resources/toolsetsResource/registration.js.map +1 -0
- package/dist/ibmi-mcp-server/schemas/common.d.ts +174 -0
- package/dist/ibmi-mcp-server/schemas/common.d.ts.map +1 -0
- package/dist/ibmi-mcp-server/schemas/common.js +119 -0
- package/dist/ibmi-mcp-server/schemas/common.js.map +1 -0
- package/dist/ibmi-mcp-server/schemas/config.d.ts +858 -0
- package/dist/ibmi-mcp-server/schemas/config.d.ts.map +1 -0
- package/dist/ibmi-mcp-server/schemas/config.js +248 -0
- package/dist/ibmi-mcp-server/schemas/config.js.map +1 -0
- package/dist/ibmi-mcp-server/schemas/index.d.ts +12 -0
- package/dist/ibmi-mcp-server/schemas/index.d.ts.map +1 -0
- package/dist/ibmi-mcp-server/schemas/index.js +20 -0
- package/dist/ibmi-mcp-server/schemas/index.js.map +1 -0
- package/dist/ibmi-mcp-server/schemas/tools.d.ts +287 -0
- package/dist/ibmi-mcp-server/schemas/tools.d.ts.map +1 -0
- package/dist/ibmi-mcp-server/schemas/tools.js +167 -0
- package/dist/ibmi-mcp-server/schemas/tools.js.map +1 -0
- package/dist/ibmi-mcp-server/services/authenticatedPoolManager.d.ts +82 -0
- package/dist/ibmi-mcp-server/services/authenticatedPoolManager.d.ts.map +1 -0
- package/dist/ibmi-mcp-server/services/authenticatedPoolManager.js +262 -0
- package/dist/ibmi-mcp-server/services/authenticatedPoolManager.js.map +1 -0
- package/dist/ibmi-mcp-server/services/baseConnectionPool.d.ts +130 -0
- package/dist/ibmi-mcp-server/services/baseConnectionPool.d.ts.map +1 -0
- package/dist/ibmi-mcp-server/services/baseConnectionPool.js +431 -0
- package/dist/ibmi-mcp-server/services/baseConnectionPool.js.map +1 -0
- package/dist/ibmi-mcp-server/services/connectionPool.d.ts +60 -0
- package/dist/ibmi-mcp-server/services/connectionPool.d.ts.map +1 -0
- package/dist/ibmi-mcp-server/services/connectionPool.js +153 -0
- package/dist/ibmi-mcp-server/services/connectionPool.js.map +1 -0
- package/dist/ibmi-mcp-server/services/securityValidation.d.ts +35 -0
- package/dist/ibmi-mcp-server/services/securityValidation.d.ts.map +1 -0
- package/dist/ibmi-mcp-server/services/securityValidation.js +93 -0
- package/dist/ibmi-mcp-server/services/securityValidation.js.map +1 -0
- package/dist/ibmi-mcp-server/services/sourceManager.d.ts +82 -0
- package/dist/ibmi-mcp-server/services/sourceManager.d.ts.map +1 -0
- package/dist/ibmi-mcp-server/services/sourceManager.js +151 -0
- package/dist/ibmi-mcp-server/services/sourceManager.js.map +1 -0
- package/dist/ibmi-mcp-server/tools/executeSql/index.d.ts +9 -0
- package/dist/ibmi-mcp-server/tools/executeSql/index.d.ts.map +1 -0
- package/dist/ibmi-mcp-server/tools/executeSql/index.js +9 -0
- package/dist/ibmi-mcp-server/tools/executeSql/index.js.map +1 -0
- package/dist/ibmi-mcp-server/tools/executeSql/logic.d.ts +51 -0
- package/dist/ibmi-mcp-server/tools/executeSql/logic.d.ts.map +1 -0
- package/dist/ibmi-mcp-server/tools/executeSql/logic.js +179 -0
- package/dist/ibmi-mcp-server/tools/executeSql/logic.js.map +1 -0
- package/dist/ibmi-mcp-server/tools/executeSql/registration.d.ts +52 -0
- package/dist/ibmi-mcp-server/tools/executeSql/registration.d.ts.map +1 -0
- package/dist/ibmi-mcp-server/tools/executeSql/registration.js +161 -0
- package/dist/ibmi-mcp-server/tools/executeSql/registration.js.map +1 -0
- package/dist/ibmi-mcp-server/tools/generateSql/index.d.ts +13 -0
- package/dist/ibmi-mcp-server/tools/generateSql/index.d.ts.map +1 -0
- package/dist/ibmi-mcp-server/tools/generateSql/index.js +13 -0
- package/dist/ibmi-mcp-server/tools/generateSql/index.js.map +1 -0
- package/dist/ibmi-mcp-server/tools/generateSql/logic.d.ts +64 -0
- package/dist/ibmi-mcp-server/tools/generateSql/logic.d.ts.map +1 -0
- package/dist/ibmi-mcp-server/tools/generateSql/logic.js +190 -0
- package/dist/ibmi-mcp-server/tools/generateSql/logic.js.map +1 -0
- package/dist/ibmi-mcp-server/tools/generateSql/registration.d.ts +18 -0
- package/dist/ibmi-mcp-server/tools/generateSql/registration.d.ts.map +1 -0
- package/dist/ibmi-mcp-server/tools/generateSql/registration.js +64 -0
- package/dist/ibmi-mcp-server/tools/generateSql/registration.js.map +1 -0
- package/dist/ibmi-mcp-server/utils/cli/argumentParser.d.ts +42 -0
- package/dist/ibmi-mcp-server/utils/cli/argumentParser.d.ts.map +1 -0
- package/dist/ibmi-mcp-server/utils/cli/argumentParser.js +156 -0
- package/dist/ibmi-mcp-server/utils/cli/argumentParser.js.map +1 -0
- package/dist/ibmi-mcp-server/utils/cli/index.d.ts +6 -0
- package/dist/ibmi-mcp-server/utils/cli/index.d.ts.map +1 -0
- package/dist/ibmi-mcp-server/utils/cli/index.js +6 -0
- package/dist/ibmi-mcp-server/utils/cli/index.js.map +1 -0
- package/dist/ibmi-mcp-server/utils/config/configParser.d.ts +77 -0
- package/dist/ibmi-mcp-server/utils/config/configParser.d.ts.map +1 -0
- package/dist/ibmi-mcp-server/utils/config/configParser.js +309 -0
- package/dist/ibmi-mcp-server/utils/config/configParser.js.map +1 -0
- package/dist/ibmi-mcp-server/utils/config/toolConfigBuilder.d.ts +143 -0
- package/dist/ibmi-mcp-server/utils/config/toolConfigBuilder.d.ts.map +1 -0
- package/dist/ibmi-mcp-server/utils/config/toolConfigBuilder.js +665 -0
- package/dist/ibmi-mcp-server/utils/config/toolConfigBuilder.js.map +1 -0
- package/dist/ibmi-mcp-server/utils/config/toolConfigCache.d.ts +71 -0
- package/dist/ibmi-mcp-server/utils/config/toolConfigCache.d.ts.map +1 -0
- package/dist/ibmi-mcp-server/utils/config/toolConfigCache.js +158 -0
- package/dist/ibmi-mcp-server/utils/config/toolConfigCache.js.map +1 -0
- package/dist/ibmi-mcp-server/utils/config/toolDefinitions.d.ts +206 -0
- package/dist/ibmi-mcp-server/utils/config/toolDefinitions.d.ts.map +1 -0
- package/dist/ibmi-mcp-server/utils/config/toolDefinitions.js +236 -0
- package/dist/ibmi-mcp-server/utils/config/toolDefinitions.js.map +1 -0
- package/dist/ibmi-mcp-server/utils/config/toolFactory.d.ts +65 -0
- package/dist/ibmi-mcp-server/utils/config/toolFactory.d.ts.map +1 -0
- package/dist/ibmi-mcp-server/utils/config/toolFactory.js +236 -0
- package/dist/ibmi-mcp-server/utils/config/toolFactory.js.map +1 -0
- package/dist/ibmi-mcp-server/utils/config/toolProcessor.d.ts +175 -0
- package/dist/ibmi-mcp-server/utils/config/toolProcessor.d.ts.map +1 -0
- package/dist/ibmi-mcp-server/utils/config/toolProcessor.js +460 -0
- package/dist/ibmi-mcp-server/utils/config/toolProcessor.js.map +1 -0
- package/dist/ibmi-mcp-server/utils/config/toolsetManager.d.ts +126 -0
- package/dist/ibmi-mcp-server/utils/config/toolsetManager.d.ts.map +1 -0
- package/dist/ibmi-mcp-server/utils/config/toolsetManager.js +240 -0
- package/dist/ibmi-mcp-server/utils/config/toolsetManager.js.map +1 -0
- package/dist/ibmi-mcp-server/utils/config/types.d.ts +74 -0
- package/dist/ibmi-mcp-server/utils/config/types.d.ts.map +1 -0
- package/dist/ibmi-mcp-server/utils/config/types.js +8 -0
- package/dist/ibmi-mcp-server/utils/config/types.js.map +1 -0
- package/dist/ibmi-mcp-server/utils/security/sqlSecurityValidator.d.ts +116 -0
- package/dist/ibmi-mcp-server/utils/security/sqlSecurityValidator.d.ts.map +1 -0
- package/dist/ibmi-mcp-server/utils/security/sqlSecurityValidator.js +426 -0
- package/dist/ibmi-mcp-server/utils/security/sqlSecurityValidator.js.map +1 -0
- package/dist/ibmi-mcp-server/utils/sql/parameterProcessor.d.ts +182 -0
- package/dist/ibmi-mcp-server/utils/sql/parameterProcessor.d.ts.map +1 -0
- package/dist/ibmi-mcp-server/utils/sql/parameterProcessor.js +726 -0
- package/dist/ibmi-mcp-server/utils/sql/parameterProcessor.js.map +1 -0
- package/dist/ibmi-mcp-server/utils/sql/sqlTemplateProcessor.d.ts +90 -0
- package/dist/ibmi-mcp-server/utils/sql/sqlTemplateProcessor.d.ts.map +1 -0
- package/dist/ibmi-mcp-server/utils/sql/sqlTemplateProcessor.js +187 -0
- package/dist/ibmi-mcp-server/utils/sql/sqlTemplateProcessor.js.map +1 -0
- package/dist/index.d.ts +10 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +270 -0
- package/dist/index.js.map +1 -0
- package/dist/mcp-server/constants.d.ts +13 -0
- package/dist/mcp-server/constants.d.ts.map +1 -0
- package/dist/mcp-server/constants.js +13 -0
- package/dist/mcp-server/constants.js.map +1 -0
- package/dist/mcp-server/logging/index.d.ts +8 -0
- package/dist/mcp-server/logging/index.d.ts.map +1 -0
- package/dist/mcp-server/logging/index.js +8 -0
- package/dist/mcp-server/logging/index.js.map +1 -0
- package/dist/mcp-server/logging/setLevelHandler.d.ts +38 -0
- package/dist/mcp-server/logging/setLevelHandler.d.ts.map +1 -0
- package/dist/mcp-server/logging/setLevelHandler.js +83 -0
- package/dist/mcp-server/logging/setLevelHandler.js.map +1 -0
- package/dist/mcp-server/resources/echoResource/index.d.ts +14 -0
- package/dist/mcp-server/resources/echoResource/index.d.ts.map +1 -0
- package/dist/mcp-server/resources/echoResource/index.js +14 -0
- package/dist/mcp-server/resources/echoResource/index.js.map +1 -0
- package/dist/mcp-server/resources/echoResource/logic.d.ts +37 -0
- package/dist/mcp-server/resources/echoResource/logic.d.ts.map +1 -0
- package/dist/mcp-server/resources/echoResource/logic.js +46 -0
- package/dist/mcp-server/resources/echoResource/logic.js.map +1 -0
- package/dist/mcp-server/resources/echoResource/registration.d.ts +7 -0
- package/dist/mcp-server/resources/echoResource/registration.d.ts.map +1 -0
- package/dist/mcp-server/resources/echoResource/registration.js +51 -0
- package/dist/mcp-server/resources/echoResource/registration.js.map +1 -0
- package/dist/mcp-server/resources/index.d.ts +10 -0
- package/dist/mcp-server/resources/index.d.ts.map +1 -0
- package/dist/mcp-server/resources/index.js +19 -0
- package/dist/mcp-server/resources/index.js.map +1 -0
- package/dist/mcp-server/resources/utils/resource-utils.d.ts +43 -0
- package/dist/mcp-server/resources/utils/resource-utils.d.ts.map +1 -0
- package/dist/mcp-server/resources/utils/resource-utils.js +44 -0
- package/dist/mcp-server/resources/utils/resource-utils.js.map +1 -0
- package/dist/mcp-server/server.d.ts +23 -0
- package/dist/mcp-server/server.d.ts.map +1 -0
- package/dist/mcp-server/server.js +114 -0
- package/dist/mcp-server/server.js.map +1 -0
- package/dist/mcp-server/tools/catFactFetcher/index.d.ts +8 -0
- package/dist/mcp-server/tools/catFactFetcher/index.d.ts.map +1 -0
- package/dist/mcp-server/tools/catFactFetcher/index.js +8 -0
- package/dist/mcp-server/tools/catFactFetcher/index.js.map +1 -0
- package/dist/mcp-server/tools/catFactFetcher/logic.d.ts +52 -0
- package/dist/mcp-server/tools/catFactFetcher/logic.d.ts.map +1 -0
- package/dist/mcp-server/tools/catFactFetcher/logic.js +95 -0
- package/dist/mcp-server/tools/catFactFetcher/logic.js.map +1 -0
- package/dist/mcp-server/tools/catFactFetcher/registration.d.ts +9 -0
- package/dist/mcp-server/tools/catFactFetcher/registration.d.ts.map +1 -0
- package/dist/mcp-server/tools/catFactFetcher/registration.js +43 -0
- package/dist/mcp-server/tools/catFactFetcher/registration.js.map +1 -0
- package/dist/mcp-server/tools/echoTool/index.d.ts +13 -0
- package/dist/mcp-server/tools/echoTool/index.d.ts.map +1 -0
- package/dist/mcp-server/tools/echoTool/index.js +13 -0
- package/dist/mcp-server/tools/echoTool/index.js.map +1 -0
- package/dist/mcp-server/tools/echoTool/logic.d.ts +69 -0
- package/dist/mcp-server/tools/echoTool/logic.d.ts.map +1 -0
- package/dist/mcp-server/tools/echoTool/logic.js +119 -0
- package/dist/mcp-server/tools/echoTool/logic.js.map +1 -0
- package/dist/mcp-server/tools/echoTool/registration.d.ts +9 -0
- package/dist/mcp-server/tools/echoTool/registration.d.ts.map +1 -0
- package/dist/mcp-server/tools/echoTool/registration.js +45 -0
- package/dist/mcp-server/tools/echoTool/registration.js.map +1 -0
- package/dist/mcp-server/tools/imageTest/index.d.ts +7 -0
- package/dist/mcp-server/tools/imageTest/index.d.ts.map +1 -0
- package/dist/mcp-server/tools/imageTest/index.js +7 -0
- package/dist/mcp-server/tools/imageTest/index.js.map +1 -0
- package/dist/mcp-server/tools/imageTest/logic.d.ts +27 -0
- package/dist/mcp-server/tools/imageTest/logic.d.ts.map +1 -0
- package/dist/mcp-server/tools/imageTest/logic.js +44 -0
- package/dist/mcp-server/tools/imageTest/logic.js.map +1 -0
- package/dist/mcp-server/tools/imageTest/registration.d.ts +9 -0
- package/dist/mcp-server/tools/imageTest/registration.d.ts.map +1 -0
- package/dist/mcp-server/tools/imageTest/registration.js +49 -0
- package/dist/mcp-server/tools/imageTest/registration.js.map +1 -0
- package/dist/mcp-server/tools/index.d.ts +4 -0
- package/dist/mcp-server/tools/index.d.ts.map +1 -0
- package/dist/mcp-server/tools/index.js +13 -0
- package/dist/mcp-server/tools/index.js.map +1 -0
- package/dist/mcp-server/tools/utils/tool-utils.d.ts +43 -0
- package/dist/mcp-server/tools/utils/tool-utils.d.ts.map +1 -0
- package/dist/mcp-server/tools/utils/tool-utils.js +44 -0
- package/dist/mcp-server/tools/utils/tool-utils.js.map +1 -0
- package/dist/mcp-server/transports/auth/authFactory.d.ts +11 -0
- package/dist/mcp-server/transports/auth/authFactory.d.ts.map +1 -0
- package/dist/mcp-server/transports/auth/authFactory.js +46 -0
- package/dist/mcp-server/transports/auth/authFactory.js.map +1 -0
- package/dist/mcp-server/transports/auth/authMiddleware.d.ts +20 -0
- package/dist/mcp-server/transports/auth/authMiddleware.d.ts.map +1 -0
- package/dist/mcp-server/transports/auth/authMiddleware.js +58 -0
- package/dist/mcp-server/transports/auth/authMiddleware.js.map +1 -0
- package/dist/mcp-server/transports/auth/index.d.ts +14 -0
- package/dist/mcp-server/transports/auth/index.d.ts.map +1 -0
- package/dist/mcp-server/transports/auth/index.js +12 -0
- package/dist/mcp-server/transports/auth/index.js.map +1 -0
- package/dist/mcp-server/transports/auth/lib/authContext.d.ts +34 -0
- package/dist/mcp-server/transports/auth/lib/authContext.d.ts.map +1 -0
- package/dist/mcp-server/transports/auth/lib/authContext.js +25 -0
- package/dist/mcp-server/transports/auth/lib/authContext.js.map +1 -0
- package/dist/mcp-server/transports/auth/lib/authTypes.d.ts +15 -0
- package/dist/mcp-server/transports/auth/lib/authTypes.d.ts.map +1 -0
- package/dist/mcp-server/transports/auth/lib/authTypes.js +9 -0
- package/dist/mcp-server/transports/auth/lib/authTypes.js.map +1 -0
- package/dist/mcp-server/transports/auth/lib/authUtils.d.ts +19 -0
- package/dist/mcp-server/transports/auth/lib/authUtils.d.ts.map +1 -0
- package/dist/mcp-server/transports/auth/lib/authUtils.js +53 -0
- package/dist/mcp-server/transports/auth/lib/authUtils.js.map +1 -0
- package/dist/mcp-server/transports/auth/strategies/authStrategy.d.ts +18 -0
- package/dist/mcp-server/transports/auth/strategies/authStrategy.d.ts.map +1 -0
- package/dist/mcp-server/transports/auth/strategies/authStrategy.js +2 -0
- package/dist/mcp-server/transports/auth/strategies/authStrategy.js.map +1 -0
- package/dist/mcp-server/transports/auth/strategies/ibmiTokenStrategy.d.ts +21 -0
- package/dist/mcp-server/transports/auth/strategies/ibmiTokenStrategy.d.ts.map +1 -0
- package/dist/mcp-server/transports/auth/strategies/ibmiTokenStrategy.js +64 -0
- package/dist/mcp-server/transports/auth/strategies/ibmiTokenStrategy.js.map +1 -0
- package/dist/mcp-server/transports/auth/strategies/jwtStrategy.d.ts +8 -0
- package/dist/mcp-server/transports/auth/strategies/jwtStrategy.d.ts.map +1 -0
- package/dist/mcp-server/transports/auth/strategies/jwtStrategy.js +118 -0
- package/dist/mcp-server/transports/auth/strategies/jwtStrategy.js.map +1 -0
- package/dist/mcp-server/transports/auth/strategies/oauthStrategy.d.ts +8 -0
- package/dist/mcp-server/transports/auth/strategies/oauthStrategy.d.ts.map +1 -0
- package/dist/mcp-server/transports/auth/strategies/oauthStrategy.js +118 -0
- package/dist/mcp-server/transports/auth/strategies/oauthStrategy.js.map +1 -0
- package/dist/mcp-server/transports/core/autoTransportManager.d.ts +48 -0
- package/dist/mcp-server/transports/core/autoTransportManager.d.ts.map +1 -0
- package/dist/mcp-server/transports/core/autoTransportManager.js +57 -0
- package/dist/mcp-server/transports/core/autoTransportManager.js.map +1 -0
- package/dist/mcp-server/transports/core/baseTransportManager.d.ts +17 -0
- package/dist/mcp-server/transports/core/baseTransportManager.d.ts.map +1 -0
- package/dist/mcp-server/transports/core/baseTransportManager.js +20 -0
- package/dist/mcp-server/transports/core/baseTransportManager.js.map +1 -0
- package/dist/mcp-server/transports/core/headerUtils.d.ts +27 -0
- package/dist/mcp-server/transports/core/headerUtils.d.ts.map +1 -0
- package/dist/mcp-server/transports/core/headerUtils.js +53 -0
- package/dist/mcp-server/transports/core/headerUtils.js.map +1 -0
- package/dist/mcp-server/transports/core/honoNodeBridge.d.ts +77 -0
- package/dist/mcp-server/transports/core/honoNodeBridge.d.ts.map +1 -0
- package/dist/mcp-server/transports/core/honoNodeBridge.js +150 -0
- package/dist/mcp-server/transports/core/honoNodeBridge.js.map +1 -0
- package/dist/mcp-server/transports/core/statefulTransportManager.d.ts +81 -0
- package/dist/mcp-server/transports/core/statefulTransportManager.d.ts.map +1 -0
- package/dist/mcp-server/transports/core/statefulTransportManager.js +326 -0
- package/dist/mcp-server/transports/core/statefulTransportManager.js.map +1 -0
- package/dist/mcp-server/transports/core/statelessTransportManager.d.ts +57 -0
- package/dist/mcp-server/transports/core/statelessTransportManager.d.ts.map +1 -0
- package/dist/mcp-server/transports/core/statelessTransportManager.js +151 -0
- package/dist/mcp-server/transports/core/statelessTransportManager.js.map +1 -0
- package/dist/mcp-server/transports/core/transportRequest.d.ts +9 -0
- package/dist/mcp-server/transports/core/transportRequest.d.ts.map +1 -0
- package/dist/mcp-server/transports/core/transportRequest.js +2 -0
- package/dist/mcp-server/transports/core/transportRequest.js.map +1 -0
- package/dist/mcp-server/transports/core/transportTypes.d.ts +112 -0
- package/dist/mcp-server/transports/core/transportTypes.d.ts.map +1 -0
- package/dist/mcp-server/transports/core/transportTypes.js +15 -0
- package/dist/mcp-server/transports/core/transportTypes.js.map +1 -0
- package/dist/mcp-server/transports/http/httpErrorHandler.d.ts +25 -0
- package/dist/mcp-server/transports/http/httpErrorHandler.d.ts.map +1 -0
- package/dist/mcp-server/transports/http/httpErrorHandler.js +86 -0
- package/dist/mcp-server/transports/http/httpErrorHandler.js.map +1 -0
- package/dist/mcp-server/transports/http/httpTransport.d.ts +27 -0
- package/dist/mcp-server/transports/http/httpTransport.d.ts.map +1 -0
- package/dist/mcp-server/transports/http/httpTransport.js +407 -0
- package/dist/mcp-server/transports/http/httpTransport.js.map +1 -0
- package/dist/mcp-server/transports/http/httpTypes.d.ts +17 -0
- package/dist/mcp-server/transports/http/httpTypes.d.ts.map +1 -0
- package/dist/mcp-server/transports/http/httpTypes.js +6 -0
- package/dist/mcp-server/transports/http/httpTypes.js.map +1 -0
- package/dist/mcp-server/transports/http/index.d.ts +8 -0
- package/dist/mcp-server/transports/http/index.d.ts.map +1 -0
- package/dist/mcp-server/transports/http/index.js +7 -0
- package/dist/mcp-server/transports/http/index.js.map +1 -0
- package/dist/mcp-server/transports/http/mcpTransportMiddleware.d.ts +21 -0
- package/dist/mcp-server/transports/http/mcpTransportMiddleware.d.ts.map +1 -0
- package/dist/mcp-server/transports/http/mcpTransportMiddleware.js +54 -0
- package/dist/mcp-server/transports/http/mcpTransportMiddleware.js.map +1 -0
- package/dist/mcp-server/transports/stdio/index.d.ts +6 -0
- package/dist/mcp-server/transports/stdio/index.d.ts.map +1 -0
- package/dist/mcp-server/transports/stdio/index.js +6 -0
- package/dist/mcp-server/transports/stdio/index.js.map +1 -0
- package/dist/mcp-server/transports/stdio/stdioTransport.d.ts +43 -0
- package/dist/mcp-server/transports/stdio/stdioTransport.d.ts.map +1 -0
- package/dist/mcp-server/transports/stdio/stdioTransport.js +71 -0
- package/dist/mcp-server/transports/stdio/stdioTransport.js.map +1 -0
- package/dist/services/duck-db/duckDBConnectionManager.d.ts +55 -0
- package/dist/services/duck-db/duckDBConnectionManager.d.ts.map +1 -0
- package/dist/services/duck-db/duckDBConnectionManager.js +184 -0
- package/dist/services/duck-db/duckDBConnectionManager.js.map +1 -0
- package/dist/services/duck-db/duckDBQueryExecutor.d.ts +18 -0
- package/dist/services/duck-db/duckDBQueryExecutor.d.ts.map +1 -0
- package/dist/services/duck-db/duckDBQueryExecutor.js +115 -0
- package/dist/services/duck-db/duckDBQueryExecutor.js.map +1 -0
- package/dist/services/duck-db/duckDBService.d.ts +27 -0
- package/dist/services/duck-db/duckDBService.d.ts.map +1 -0
- package/dist/services/duck-db/duckDBService.js +151 -0
- package/dist/services/duck-db/duckDBService.js.map +1 -0
- package/dist/services/duck-db/types.d.ts +135 -0
- package/dist/services/duck-db/types.d.ts.map +1 -0
- package/dist/services/duck-db/types.js +6 -0
- package/dist/services/duck-db/types.js.map +1 -0
- package/dist/services/llm-providers/openRouterProvider.d.ts +36 -0
- package/dist/services/llm-providers/openRouterProvider.d.ts.map +1 -0
- package/dist/services/llm-providers/openRouterProvider.js +235 -0
- package/dist/services/llm-providers/openRouterProvider.js.map +1 -0
- package/dist/services/supabase/supabaseClient.d.ts +25 -0
- package/dist/services/supabase/supabaseClient.d.ts.map +1 -0
- package/dist/services/supabase/supabaseClient.js +68 -0
- package/dist/services/supabase/supabaseClient.js.map +1 -0
- package/dist/storage/duckdbExample.d.ts +8 -0
- package/dist/storage/duckdbExample.d.ts.map +1 -0
- package/dist/storage/duckdbExample.js +197 -0
- package/dist/storage/duckdbExample.js.map +1 -0
- package/dist/types-global/errors.d.ts +101 -0
- package/dist/types-global/errors.d.ts.map +1 -0
- package/dist/types-global/errors.js +109 -0
- package/dist/types-global/errors.js.map +1 -0
- package/dist/utils/formatting/index.d.ts +10 -0
- package/dist/utils/formatting/index.d.ts.map +1 -0
- package/dist/utils/formatting/index.js +10 -0
- package/dist/utils/formatting/index.js.map +1 -0
- package/dist/utils/formatting/markdownBuilder.d.ts +348 -0
- package/dist/utils/formatting/markdownBuilder.d.ts.map +1 -0
- package/dist/utils/formatting/markdownBuilder.js +501 -0
- package/dist/utils/formatting/markdownBuilder.js.map +1 -0
- package/dist/utils/formatting/sqlFormattingUtils.d.ts +69 -0
- package/dist/utils/formatting/sqlFormattingUtils.d.ts.map +1 -0
- package/dist/utils/formatting/sqlFormattingUtils.js +131 -0
- package/dist/utils/formatting/sqlFormattingUtils.js.map +1 -0
- package/dist/utils/formatting/tableFormatter.d.ts +268 -0
- package/dist/utils/formatting/tableFormatter.d.ts.map +1 -0
- package/dist/utils/formatting/tableFormatter.js +550 -0
- package/dist/utils/formatting/tableFormatter.js.map +1 -0
- package/dist/utils/index.d.ts +13 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/index.js +21 -0
- package/dist/utils/index.js.map +1 -0
- package/dist/utils/internal/asyncContext.d.ts +35 -0
- package/dist/utils/internal/asyncContext.d.ts.map +1 -0
- package/dist/utils/internal/asyncContext.js +38 -0
- package/dist/utils/internal/asyncContext.js.map +1 -0
- package/dist/utils/internal/errorHandler.d.ts +95 -0
- package/dist/utils/internal/errorHandler.d.ts.map +1 -0
- package/dist/utils/internal/errorHandler.js +210 -0
- package/dist/utils/internal/errorHandler.js.map +1 -0
- package/dist/utils/internal/index.d.ts +12 -0
- package/dist/utils/internal/index.d.ts.map +1 -0
- package/dist/utils/internal/index.js +12 -0
- package/dist/utils/internal/index.js.map +1 -0
- package/dist/utils/internal/logger.d.ts +30 -0
- package/dist/utils/internal/logger.d.ts.map +1 -0
- package/dist/utils/internal/logger.js +228 -0
- package/dist/utils/internal/logger.js.map +1 -0
- package/dist/utils/internal/logging-helpers.d.ts +49 -0
- package/dist/utils/internal/logging-helpers.d.ts.map +1 -0
- package/dist/utils/internal/logging-helpers.js +60 -0
- package/dist/utils/internal/logging-helpers.js.map +1 -0
- package/dist/utils/internal/performance.d.ts +19 -0
- package/dist/utils/internal/performance.d.ts.map +1 -0
- package/dist/utils/internal/performance.js +110 -0
- package/dist/utils/internal/performance.js.map +1 -0
- package/dist/utils/internal/requestContext.d.ts +41 -0
- package/dist/utils/internal/requestContext.d.ts.map +1 -0
- package/dist/utils/internal/requestContext.js +47 -0
- package/dist/utils/internal/requestContext.js.map +1 -0
- package/dist/utils/metrics/index.d.ts +8 -0
- package/dist/utils/metrics/index.d.ts.map +1 -0
- package/dist/utils/metrics/index.js +8 -0
- package/dist/utils/metrics/index.js.map +1 -0
- package/dist/utils/metrics/tokenCounter.d.ts +36 -0
- package/dist/utils/metrics/tokenCounter.d.ts.map +1 -0
- package/dist/utils/metrics/tokenCounter.js +115 -0
- package/dist/utils/metrics/tokenCounter.js.map +1 -0
- package/dist/utils/network/fetchWithTimeout.d.ts +22 -0
- package/dist/utils/network/fetchWithTimeout.d.ts.map +1 -0
- package/dist/utils/network/fetchWithTimeout.js +78 -0
- package/dist/utils/network/fetchWithTimeout.js.map +1 -0
- package/dist/utils/network/index.d.ts +7 -0
- package/dist/utils/network/index.d.ts.map +1 -0
- package/dist/utils/network/index.js +6 -0
- package/dist/utils/network/index.js.map +1 -0
- package/dist/utils/parsing/dateParser.d.ts +73 -0
- package/dist/utils/parsing/dateParser.d.ts.map +1 -0
- package/dist/utils/parsing/dateParser.js +108 -0
- package/dist/utils/parsing/dateParser.js.map +1 -0
- package/dist/utils/parsing/index.d.ts +9 -0
- package/dist/utils/parsing/index.d.ts.map +1 -0
- package/dist/utils/parsing/index.js +9 -0
- package/dist/utils/parsing/index.js.map +1 -0
- package/dist/utils/parsing/jsonParser.d.ts +83 -0
- package/dist/utils/parsing/jsonParser.d.ts.map +1 -0
- package/dist/utils/parsing/jsonParser.js +128 -0
- package/dist/utils/parsing/jsonParser.js.map +1 -0
- package/dist/utils/scheduling/index.d.ts +7 -0
- package/dist/utils/scheduling/index.d.ts.map +1 -0
- package/dist/utils/scheduling/index.js +7 -0
- package/dist/utils/scheduling/index.js.map +1 -0
- package/dist/utils/scheduling/scheduler.d.ts +73 -0
- package/dist/utils/scheduling/scheduler.d.ts.map +1 -0
- package/dist/utils/scheduling/scheduler.js +155 -0
- package/dist/utils/scheduling/scheduler.js.map +1 -0
- package/dist/utils/security/idGenerator.d.ts +144 -0
- package/dist/utils/security/idGenerator.d.ts.map +1 -0
- package/dist/utils/security/idGenerator.js +232 -0
- package/dist/utils/security/idGenerator.js.map +1 -0
- package/dist/utils/security/index.d.ts +10 -0
- package/dist/utils/security/index.d.ts.map +1 -0
- package/dist/utils/security/index.js +10 -0
- package/dist/utils/security/index.js.map +1 -0
- package/dist/utils/security/rateLimiter.d.ts +109 -0
- package/dist/utils/security/rateLimiter.d.ts.map +1 -0
- package/dist/utils/security/rateLimiter.js +202 -0
- package/dist/utils/security/rateLimiter.js.map +1 -0
- package/dist/utils/security/sanitization.d.ts +185 -0
- package/dist/utils/security/sanitization.d.ts.map +1 -0
- package/dist/utils/security/sanitization.js +472 -0
- package/dist/utils/security/sanitization.js.map +1 -0
- package/dist/utils/telemetry/instrumentation.d.ts +8 -0
- package/dist/utils/telemetry/instrumentation.d.ts.map +1 -0
- package/dist/utils/telemetry/instrumentation.js +121 -0
- package/dist/utils/telemetry/instrumentation.js.map +1 -0
- package/dist/utils/telemetry/semconv.d.ts +16 -0
- package/dist/utils/telemetry/semconv.d.ts.map +1 -0
- package/dist/utils/telemetry/semconv.js +16 -0
- package/dist/utils/telemetry/semconv.js.map +1 -0
- package/package.json +161 -0
|
@@ -0,0 +1,726 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Unified parameter processor for SQL parameter validation and binding
|
|
3
|
+
* Combines validation, type conversion, and SQL parameter binding in a single streamlined interface
|
|
4
|
+
*
|
|
5
|
+
* @module src/utils/sql/parameterProcessor
|
|
6
|
+
*/
|
|
7
|
+
import { logger } from "../../../utils/internal/logger.js";
|
|
8
|
+
import { requestContextService, } from "../../../utils/internal/requestContext.js";
|
|
9
|
+
import { ErrorHandler } from "../../../utils/internal/errorHandler.js";
|
|
10
|
+
import { JsonRpcErrorCode, McpError } from "../../../types-global/errors.js";
|
|
11
|
+
/**
|
|
12
|
+
* Unified parameter processor for SQL parameter validation and binding
|
|
13
|
+
* Handles validation, type conversion, and SQL parameter binding in one streamlined interface
|
|
14
|
+
*/
|
|
15
|
+
export class ParameterProcessor {
|
|
16
|
+
/**
|
|
17
|
+
* Process SQL statement with parameter validation and binding
|
|
18
|
+
* @param sql - SQL statement with parameter placeholders
|
|
19
|
+
* @param parameterValues - Parameter values by name
|
|
20
|
+
* @param parameterDefinitions - YAML parameter definitions for validation
|
|
21
|
+
* @param options - Processing options
|
|
22
|
+
* @returns Processed SQL and parameter array with validation results
|
|
23
|
+
*/
|
|
24
|
+
static async process(sql, parameterValues, parameterDefinitions = [], options = {}) {
|
|
25
|
+
const context = options.context ||
|
|
26
|
+
requestContextService.createRequestContext({
|
|
27
|
+
operation: "ProcessParameters",
|
|
28
|
+
});
|
|
29
|
+
const { detailedLogging = false, validateSyntax = true, strictTypeValidation = true, } = options;
|
|
30
|
+
return ErrorHandler.tryCatch(async () => {
|
|
31
|
+
// Validate SQL syntax if requested
|
|
32
|
+
if (validateSyntax) {
|
|
33
|
+
this.validateSqlSyntax(sql);
|
|
34
|
+
}
|
|
35
|
+
// Step 1: Apply parameter validation and defaults
|
|
36
|
+
const processedParameters = await this.validateAndProcessParameters(parameterValues, parameterDefinitions, context);
|
|
37
|
+
// Step 2: Detect parameter mode and process SQL
|
|
38
|
+
const mode = this.detectParameterMode(sql);
|
|
39
|
+
if (mode === "template") {
|
|
40
|
+
throw new McpError(JsonRpcErrorCode.ValidationError, "Template mode ({{param}}) is deprecated. Use named parameters (:param) or positional parameters (?) instead.", { sql: sql.substring(0, 100) + "..." });
|
|
41
|
+
}
|
|
42
|
+
let result;
|
|
43
|
+
switch (mode) {
|
|
44
|
+
case "named":
|
|
45
|
+
result = await this.processNamedParameters(sql, processedParameters, context, strictTypeValidation);
|
|
46
|
+
break;
|
|
47
|
+
case "positional":
|
|
48
|
+
result = await this.processPositionalParameters(sql, processedParameters, context, strictTypeValidation);
|
|
49
|
+
break;
|
|
50
|
+
case "hybrid":
|
|
51
|
+
result = await this.processHybridParameters(sql, processedParameters, context, strictTypeValidation);
|
|
52
|
+
break;
|
|
53
|
+
default:
|
|
54
|
+
// No parameters found
|
|
55
|
+
result = {
|
|
56
|
+
sql,
|
|
57
|
+
parameters: [],
|
|
58
|
+
parameterNames: [],
|
|
59
|
+
missingParameters: [],
|
|
60
|
+
mode: "positional",
|
|
61
|
+
stats: {
|
|
62
|
+
originalLength: sql.length,
|
|
63
|
+
processedLength: sql.length,
|
|
64
|
+
namedParametersFound: 0,
|
|
65
|
+
positionalParametersFound: 0,
|
|
66
|
+
parametersConverted: 0,
|
|
67
|
+
},
|
|
68
|
+
};
|
|
69
|
+
}
|
|
70
|
+
// Log processing details
|
|
71
|
+
if (detailedLogging) {
|
|
72
|
+
logger.debug({
|
|
73
|
+
...context,
|
|
74
|
+
...result.stats,
|
|
75
|
+
mode: result.mode,
|
|
76
|
+
parameterNames: result.parameterNames,
|
|
77
|
+
missingParameters: result.missingParameters.length > 0
|
|
78
|
+
? result.missingParameters
|
|
79
|
+
: undefined,
|
|
80
|
+
}, "SQL parameters processed with detailed stats");
|
|
81
|
+
}
|
|
82
|
+
else {
|
|
83
|
+
logger.debug({
|
|
84
|
+
...context,
|
|
85
|
+
mode: result.mode,
|
|
86
|
+
parameterCount: result.parameters.length,
|
|
87
|
+
parameterNames: result.parameterNames,
|
|
88
|
+
}, "SQL parameters processed");
|
|
89
|
+
}
|
|
90
|
+
return result;
|
|
91
|
+
}, {
|
|
92
|
+
operation: "ProcessParameters",
|
|
93
|
+
context,
|
|
94
|
+
errorCode: JsonRpcErrorCode.ValidationError,
|
|
95
|
+
});
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* Validate parameters and apply defaults according to YAML definitions
|
|
99
|
+
* @param parameterValues - Raw parameter values
|
|
100
|
+
* @param parameterDefinitions - YAML parameter definitions
|
|
101
|
+
* @param context - Request context
|
|
102
|
+
* @returns Validated and processed parameters
|
|
103
|
+
*/
|
|
104
|
+
static async validateAndProcessParameters(parameterValues, parameterDefinitions, context) {
|
|
105
|
+
if (parameterDefinitions.length === 0) {
|
|
106
|
+
return parameterValues;
|
|
107
|
+
}
|
|
108
|
+
const processedParameters = { ...parameterValues };
|
|
109
|
+
const allErrors = [];
|
|
110
|
+
const allWarnings = [];
|
|
111
|
+
// Process each parameter definition
|
|
112
|
+
for (const definition of parameterDefinitions) {
|
|
113
|
+
const value = parameterValues[definition.name];
|
|
114
|
+
const validationResult = this.validateParameter(value, definition);
|
|
115
|
+
if (!validationResult.valid) {
|
|
116
|
+
allErrors.push(...validationResult.errors);
|
|
117
|
+
}
|
|
118
|
+
else {
|
|
119
|
+
allWarnings.push(...validationResult.warnings);
|
|
120
|
+
// Use the validated and converted value
|
|
121
|
+
if (validationResult.value !== undefined) {
|
|
122
|
+
processedParameters[definition.name] = validationResult.value;
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
// Report validation errors
|
|
127
|
+
if (allErrors.length > 0) {
|
|
128
|
+
throw new McpError(JsonRpcErrorCode.ValidationError, `Parameter validation failed: ${allErrors.join(", ")}`, { errors: allErrors });
|
|
129
|
+
}
|
|
130
|
+
// Log warnings
|
|
131
|
+
if (allWarnings.length > 0) {
|
|
132
|
+
logger.warning({
|
|
133
|
+
...context,
|
|
134
|
+
warnings: allWarnings,
|
|
135
|
+
}, "Parameter validation warnings");
|
|
136
|
+
}
|
|
137
|
+
return processedParameters;
|
|
138
|
+
}
|
|
139
|
+
/**
|
|
140
|
+
* Validate and convert parameter value according to YAML definition
|
|
141
|
+
* @param value - Input value to validate
|
|
142
|
+
* @param definition - YAML parameter definition
|
|
143
|
+
* @returns Validation result with converted value
|
|
144
|
+
*/
|
|
145
|
+
static validateParameter(value, definition) {
|
|
146
|
+
const result = {
|
|
147
|
+
valid: true,
|
|
148
|
+
errors: [],
|
|
149
|
+
warnings: [],
|
|
150
|
+
};
|
|
151
|
+
try {
|
|
152
|
+
// Handle null/undefined values
|
|
153
|
+
if (value === null || value === undefined) {
|
|
154
|
+
if (definition.required && definition.default === undefined) {
|
|
155
|
+
result.errors.push(`Parameter '${definition.name}' is required but not provided`);
|
|
156
|
+
result.valid = false;
|
|
157
|
+
return result;
|
|
158
|
+
}
|
|
159
|
+
if (definition.default !== undefined) {
|
|
160
|
+
return this.validateParameter(definition.default, {
|
|
161
|
+
...definition,
|
|
162
|
+
required: false,
|
|
163
|
+
});
|
|
164
|
+
}
|
|
165
|
+
// Allow null/undefined for non-required parameters
|
|
166
|
+
result.value = "";
|
|
167
|
+
return result;
|
|
168
|
+
}
|
|
169
|
+
// Type-specific validation
|
|
170
|
+
switch (definition.type) {
|
|
171
|
+
case "string":
|
|
172
|
+
result.value = this.validateStringParameter(value, definition, result);
|
|
173
|
+
break;
|
|
174
|
+
case "integer":
|
|
175
|
+
result.value = this.validateIntegerParameter(value, definition, result);
|
|
176
|
+
break;
|
|
177
|
+
case "float":
|
|
178
|
+
result.value = this.validateFloatParameter(value, definition, result);
|
|
179
|
+
break;
|
|
180
|
+
case "boolean":
|
|
181
|
+
result.value = this.validateBooleanParameter(value, definition, result);
|
|
182
|
+
break;
|
|
183
|
+
case "array":
|
|
184
|
+
result.value = this.validateArrayParameter(value, definition, result);
|
|
185
|
+
break;
|
|
186
|
+
default:
|
|
187
|
+
result.errors.push(`Unsupported parameter type: ${definition.type}`);
|
|
188
|
+
result.valid = false;
|
|
189
|
+
}
|
|
190
|
+
// Enum validation
|
|
191
|
+
if (result.valid && definition.enum && definition.enum.length > 0) {
|
|
192
|
+
this.validateEnumConstraint(result.value, definition, result);
|
|
193
|
+
}
|
|
194
|
+
result.valid = result.errors.length === 0;
|
|
195
|
+
return result;
|
|
196
|
+
}
|
|
197
|
+
catch (error) {
|
|
198
|
+
result.errors.push(error instanceof Error ? error.message : String(error));
|
|
199
|
+
result.valid = false;
|
|
200
|
+
return result;
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
/**
|
|
204
|
+
* Validate string parameter
|
|
205
|
+
*/
|
|
206
|
+
static validateStringParameter(value, definition, result) {
|
|
207
|
+
let stringValue;
|
|
208
|
+
if (typeof value === "string") {
|
|
209
|
+
stringValue = value;
|
|
210
|
+
}
|
|
211
|
+
else if (typeof value === "number" || typeof value === "boolean") {
|
|
212
|
+
stringValue = String(value);
|
|
213
|
+
result.warnings.push(`Parameter '${definition.name}' converted from ${typeof value} to string`);
|
|
214
|
+
}
|
|
215
|
+
else {
|
|
216
|
+
result.errors.push(`Parameter '${definition.name}' must be a string, got ${typeof value}`);
|
|
217
|
+
return "";
|
|
218
|
+
}
|
|
219
|
+
// Length validation
|
|
220
|
+
if (definition.minLength !== undefined &&
|
|
221
|
+
stringValue.length < definition.minLength) {
|
|
222
|
+
result.errors.push(`Parameter '${definition.name}' must be at least ${definition.minLength} characters long`);
|
|
223
|
+
}
|
|
224
|
+
if (definition.maxLength !== undefined &&
|
|
225
|
+
stringValue.length > definition.maxLength) {
|
|
226
|
+
result.errors.push(`Parameter '${definition.name}' must be at most ${definition.maxLength} characters long`);
|
|
227
|
+
}
|
|
228
|
+
// Pattern validation
|
|
229
|
+
if (definition.pattern) {
|
|
230
|
+
try {
|
|
231
|
+
const regex = new RegExp(definition.pattern);
|
|
232
|
+
if (!regex.test(stringValue)) {
|
|
233
|
+
result.errors.push(`Parameter '${definition.name}' does not match required pattern: ${definition.pattern}`);
|
|
234
|
+
}
|
|
235
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
236
|
+
}
|
|
237
|
+
catch (error) {
|
|
238
|
+
result.warnings.push(`Invalid pattern for parameter '${definition.name}': ${definition.pattern}`);
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
return stringValue;
|
|
242
|
+
}
|
|
243
|
+
/**
|
|
244
|
+
* Validate integer parameter
|
|
245
|
+
*/
|
|
246
|
+
static validateIntegerParameter(value, definition, result) {
|
|
247
|
+
let numericValue;
|
|
248
|
+
if (typeof value === "number") {
|
|
249
|
+
if (!Number.isInteger(value)) {
|
|
250
|
+
result.warnings.push(`Parameter '${definition.name}' is a float, converting to integer`);
|
|
251
|
+
numericValue = Math.floor(value);
|
|
252
|
+
}
|
|
253
|
+
else {
|
|
254
|
+
numericValue = value;
|
|
255
|
+
}
|
|
256
|
+
}
|
|
257
|
+
else if (typeof value === "string") {
|
|
258
|
+
const parsed = parseInt(value, 10);
|
|
259
|
+
if (isNaN(parsed)) {
|
|
260
|
+
result.errors.push(`Parameter '${definition.name}' must be a valid integer, got '${value}'`);
|
|
261
|
+
return 0;
|
|
262
|
+
}
|
|
263
|
+
numericValue = parsed;
|
|
264
|
+
result.warnings.push(`Parameter '${definition.name}' converted from string '${value}' to integer ${parsed}`);
|
|
265
|
+
}
|
|
266
|
+
else if (typeof value === "boolean") {
|
|
267
|
+
numericValue = value ? 1 : 0;
|
|
268
|
+
result.warnings.push(`Parameter '${definition.name}' converted from boolean to integer`);
|
|
269
|
+
}
|
|
270
|
+
else {
|
|
271
|
+
result.errors.push(`Parameter '${definition.name}' must be an integer, got ${typeof value}`);
|
|
272
|
+
return 0;
|
|
273
|
+
}
|
|
274
|
+
// Range validation
|
|
275
|
+
if (definition.min !== undefined && numericValue < definition.min) {
|
|
276
|
+
result.errors.push(`Parameter '${definition.name}' must be at least ${definition.min}`);
|
|
277
|
+
}
|
|
278
|
+
if (definition.max !== undefined && numericValue > definition.max) {
|
|
279
|
+
result.errors.push(`Parameter '${definition.name}' must be at most ${definition.max}`);
|
|
280
|
+
}
|
|
281
|
+
return numericValue;
|
|
282
|
+
}
|
|
283
|
+
/**
|
|
284
|
+
* Validate float parameter
|
|
285
|
+
*/
|
|
286
|
+
static validateFloatParameter(value, definition, result) {
|
|
287
|
+
let numericValue;
|
|
288
|
+
if (typeof value === "number") {
|
|
289
|
+
numericValue = value;
|
|
290
|
+
}
|
|
291
|
+
else if (typeof value === "string") {
|
|
292
|
+
const parsed = parseFloat(value);
|
|
293
|
+
if (isNaN(parsed)) {
|
|
294
|
+
result.errors.push(`Parameter '${definition.name}' must be a valid number, got '${value}'`);
|
|
295
|
+
return 0;
|
|
296
|
+
}
|
|
297
|
+
numericValue = parsed;
|
|
298
|
+
result.warnings.push(`Parameter '${definition.name}' converted from string '${value}' to float ${parsed}`);
|
|
299
|
+
}
|
|
300
|
+
else if (typeof value === "boolean") {
|
|
301
|
+
numericValue = value ? 1.0 : 0.0;
|
|
302
|
+
result.warnings.push(`Parameter '${definition.name}' converted from boolean to float`);
|
|
303
|
+
}
|
|
304
|
+
else {
|
|
305
|
+
result.errors.push(`Parameter '${definition.name}' must be a number, got ${typeof value}`);
|
|
306
|
+
return 0;
|
|
307
|
+
}
|
|
308
|
+
// Range validation
|
|
309
|
+
if (definition.min !== undefined && numericValue < definition.min) {
|
|
310
|
+
result.errors.push(`Parameter '${definition.name}' must be at least ${definition.min}`);
|
|
311
|
+
}
|
|
312
|
+
if (definition.max !== undefined && numericValue > definition.max) {
|
|
313
|
+
result.errors.push(`Parameter '${definition.name}' must be at most ${definition.max}`);
|
|
314
|
+
}
|
|
315
|
+
return numericValue;
|
|
316
|
+
}
|
|
317
|
+
/**
|
|
318
|
+
* Validate boolean parameter
|
|
319
|
+
*/
|
|
320
|
+
static validateBooleanParameter(value, definition, result) {
|
|
321
|
+
let booleanValue;
|
|
322
|
+
if (typeof value === "boolean") {
|
|
323
|
+
booleanValue = value;
|
|
324
|
+
}
|
|
325
|
+
else if (typeof value === "string") {
|
|
326
|
+
const lowerValue = value.toLowerCase();
|
|
327
|
+
if (lowerValue === "true" ||
|
|
328
|
+
lowerValue === "1" ||
|
|
329
|
+
lowerValue === "yes" ||
|
|
330
|
+
lowerValue === "on") {
|
|
331
|
+
booleanValue = true;
|
|
332
|
+
}
|
|
333
|
+
else if (lowerValue === "false" ||
|
|
334
|
+
lowerValue === "0" ||
|
|
335
|
+
lowerValue === "no" ||
|
|
336
|
+
lowerValue === "off") {
|
|
337
|
+
booleanValue = false;
|
|
338
|
+
}
|
|
339
|
+
else {
|
|
340
|
+
result.errors.push(`Parameter '${definition.name}' must be a valid boolean, got '${value}'`);
|
|
341
|
+
return 0;
|
|
342
|
+
}
|
|
343
|
+
result.warnings.push(`Parameter '${definition.name}' converted from string '${value}' to boolean`);
|
|
344
|
+
}
|
|
345
|
+
else if (typeof value === "number") {
|
|
346
|
+
booleanValue = value !== 0;
|
|
347
|
+
result.warnings.push(`Parameter '${definition.name}' converted from number ${value} to boolean`);
|
|
348
|
+
}
|
|
349
|
+
else {
|
|
350
|
+
result.errors.push(`Parameter '${definition.name}' must be a boolean, got ${typeof value}`);
|
|
351
|
+
return 0;
|
|
352
|
+
}
|
|
353
|
+
// Convert boolean to number for DB2 compatibility
|
|
354
|
+
return booleanValue ? 1 : 0;
|
|
355
|
+
}
|
|
356
|
+
/**
|
|
357
|
+
* Validate array parameter
|
|
358
|
+
*/
|
|
359
|
+
static validateArrayParameter(value, definition, result) {
|
|
360
|
+
if (!Array.isArray(value)) {
|
|
361
|
+
result.errors.push(`Parameter '${definition.name}' must be an array, got ${typeof value}`);
|
|
362
|
+
return [];
|
|
363
|
+
}
|
|
364
|
+
// Length validation
|
|
365
|
+
if (definition.minLength !== undefined &&
|
|
366
|
+
value.length < definition.minLength) {
|
|
367
|
+
result.errors.push(`Parameter '${definition.name}' must have at least ${definition.minLength} items`);
|
|
368
|
+
}
|
|
369
|
+
if (definition.maxLength !== undefined &&
|
|
370
|
+
value.length > definition.maxLength) {
|
|
371
|
+
result.errors.push(`Parameter '${definition.name}' must have at most ${definition.maxLength} items`);
|
|
372
|
+
}
|
|
373
|
+
// Validate each array item
|
|
374
|
+
const itemType = definition.itemType || "string";
|
|
375
|
+
const convertedArray = [];
|
|
376
|
+
for (let i = 0; i < value.length; i++) {
|
|
377
|
+
const item = value[i];
|
|
378
|
+
const itemDefinition = {
|
|
379
|
+
name: `${definition.name}[${i}]`,
|
|
380
|
+
type: itemType,
|
|
381
|
+
required: true,
|
|
382
|
+
};
|
|
383
|
+
const itemResult = this.validateParameter(item, itemDefinition);
|
|
384
|
+
if (!itemResult.valid) {
|
|
385
|
+
result.errors.push(...itemResult.errors);
|
|
386
|
+
}
|
|
387
|
+
else {
|
|
388
|
+
result.warnings.push(...itemResult.warnings);
|
|
389
|
+
convertedArray.push(itemResult.value);
|
|
390
|
+
}
|
|
391
|
+
}
|
|
392
|
+
return convertedArray;
|
|
393
|
+
}
|
|
394
|
+
/**
|
|
395
|
+
* Validate enum constraint
|
|
396
|
+
*/
|
|
397
|
+
static validateEnumConstraint(value, definition, result) {
|
|
398
|
+
if (!definition.enum || definition.enum.length === 0) {
|
|
399
|
+
return;
|
|
400
|
+
}
|
|
401
|
+
// Handle array values
|
|
402
|
+
if (Array.isArray(value)) {
|
|
403
|
+
for (const item of value) {
|
|
404
|
+
if (!definition.enum.includes(item)) {
|
|
405
|
+
result.errors.push(`Parameter '${definition.name}' array item '${item}' is not one of allowed values: ${definition.enum.join(", ")}`);
|
|
406
|
+
}
|
|
407
|
+
}
|
|
408
|
+
}
|
|
409
|
+
else {
|
|
410
|
+
if (!definition.enum.includes(value)) {
|
|
411
|
+
result.errors.push(`Parameter '${definition.name}' value '${value}' is not one of allowed values: ${definition.enum.join(", ")}`);
|
|
412
|
+
}
|
|
413
|
+
}
|
|
414
|
+
}
|
|
415
|
+
/**
|
|
416
|
+
* Detect the parameter mode used in the SQL statement
|
|
417
|
+
* @param sql - SQL statement to analyze
|
|
418
|
+
* @returns Detected parameter mode
|
|
419
|
+
*/
|
|
420
|
+
static detectParameterMode(sql) {
|
|
421
|
+
const hasNamedParams = /:(\w+)/g.test(sql);
|
|
422
|
+
const hasPositionalParams = /\?/g.test(sql);
|
|
423
|
+
const hasTemplateParams = /\{\{(\w+)\}\}/g.test(sql);
|
|
424
|
+
if (hasTemplateParams) {
|
|
425
|
+
return "template";
|
|
426
|
+
}
|
|
427
|
+
if (hasNamedParams && hasPositionalParams) {
|
|
428
|
+
return "hybrid";
|
|
429
|
+
}
|
|
430
|
+
if (hasNamedParams) {
|
|
431
|
+
return "named";
|
|
432
|
+
}
|
|
433
|
+
if (hasPositionalParams) {
|
|
434
|
+
return "positional";
|
|
435
|
+
}
|
|
436
|
+
return "positional"; // Default mode
|
|
437
|
+
}
|
|
438
|
+
/**
|
|
439
|
+
* Process named parameters (:param)
|
|
440
|
+
* @param sql - SQL statement with named parameters
|
|
441
|
+
* @param parameterValues - Parameter values by name
|
|
442
|
+
* @param context - Request context
|
|
443
|
+
* @param strictTypeValidation - Whether to enforce strict type validation
|
|
444
|
+
* @returns Processing result
|
|
445
|
+
*/
|
|
446
|
+
static async processNamedParameters(sql, parameterValues, context, strictTypeValidation) {
|
|
447
|
+
const namedParamRegex = /:(\w+)/g;
|
|
448
|
+
const matches = [];
|
|
449
|
+
const parameterNames = [];
|
|
450
|
+
const missingParameters = [];
|
|
451
|
+
let match;
|
|
452
|
+
// Find all named parameter matches
|
|
453
|
+
while ((match = namedParamRegex.exec(sql)) !== null) {
|
|
454
|
+
matches.push({
|
|
455
|
+
fullMatch: match[0],
|
|
456
|
+
paramName: match[1],
|
|
457
|
+
position: match.index,
|
|
458
|
+
});
|
|
459
|
+
if (!parameterNames.includes(match[1])) {
|
|
460
|
+
parameterNames.push(match[1]);
|
|
461
|
+
}
|
|
462
|
+
}
|
|
463
|
+
// Convert parameters to BindingValue array in order of appearance
|
|
464
|
+
const parameters = [];
|
|
465
|
+
let processedSql = sql;
|
|
466
|
+
let offset = 0;
|
|
467
|
+
for (const paramMatch of matches) {
|
|
468
|
+
const paramName = paramMatch.paramName;
|
|
469
|
+
// Check if parameter exists in the parameter values
|
|
470
|
+
if (!(paramName in parameterValues)) {
|
|
471
|
+
missingParameters.push(paramName);
|
|
472
|
+
logger.warning({
|
|
473
|
+
...context,
|
|
474
|
+
availableParams: Object.keys(parameterValues),
|
|
475
|
+
missingParam: paramName,
|
|
476
|
+
}, `Named parameter ':${paramName}' not found in parameter values`);
|
|
477
|
+
continue;
|
|
478
|
+
}
|
|
479
|
+
const paramValue = parameterValues[paramName];
|
|
480
|
+
// Convert and validate parameter value
|
|
481
|
+
const bindingValue = this.convertToBindingValue(paramValue, paramName, strictTypeValidation);
|
|
482
|
+
// Handle array parameters - expand to multiple placeholders
|
|
483
|
+
if (Array.isArray(bindingValue)) {
|
|
484
|
+
// Add each array element as individual parameters
|
|
485
|
+
for (const item of bindingValue) {
|
|
486
|
+
parameters.push(item);
|
|
487
|
+
}
|
|
488
|
+
// Generate multiple ? placeholders for array (?, ?, ?)
|
|
489
|
+
const placeholders = bindingValue.map(() => "?").join(", ");
|
|
490
|
+
// Replace :param with (?, ?, ?)
|
|
491
|
+
const replacePosition = paramMatch.position + offset;
|
|
492
|
+
const beforeReplacement = processedSql.substring(0, replacePosition);
|
|
493
|
+
const afterReplacement = processedSql.substring(replacePosition + paramMatch.fullMatch.length);
|
|
494
|
+
processedSql = beforeReplacement + placeholders + afterReplacement;
|
|
495
|
+
// Update offset for subsequent replacements
|
|
496
|
+
offset += placeholders.length - paramMatch.fullMatch.length;
|
|
497
|
+
logger.debug({
|
|
498
|
+
...context,
|
|
499
|
+
paramName,
|
|
500
|
+
arrayLength: bindingValue.length,
|
|
501
|
+
placeholders,
|
|
502
|
+
}, `Expanded array parameter to ${bindingValue.length} placeholders`);
|
|
503
|
+
}
|
|
504
|
+
else {
|
|
505
|
+
// Non-array parameter - standard single placeholder
|
|
506
|
+
parameters.push(bindingValue);
|
|
507
|
+
// Replace :param with ? placeholder
|
|
508
|
+
const replacePosition = paramMatch.position + offset;
|
|
509
|
+
const beforeReplacement = processedSql.substring(0, replacePosition);
|
|
510
|
+
const afterReplacement = processedSql.substring(replacePosition + paramMatch.fullMatch.length);
|
|
511
|
+
processedSql = beforeReplacement + "?" + afterReplacement;
|
|
512
|
+
// Update offset for subsequent replacements
|
|
513
|
+
offset += 1 - paramMatch.fullMatch.length;
|
|
514
|
+
}
|
|
515
|
+
}
|
|
516
|
+
return {
|
|
517
|
+
sql: processedSql,
|
|
518
|
+
parameters,
|
|
519
|
+
parameterNames,
|
|
520
|
+
missingParameters,
|
|
521
|
+
mode: "named",
|
|
522
|
+
stats: {
|
|
523
|
+
originalLength: sql.length,
|
|
524
|
+
processedLength: processedSql.length,
|
|
525
|
+
namedParametersFound: matches.length,
|
|
526
|
+
positionalParametersFound: 0,
|
|
527
|
+
parametersConverted: parameters.length,
|
|
528
|
+
},
|
|
529
|
+
};
|
|
530
|
+
}
|
|
531
|
+
/**
|
|
532
|
+
* Process positional parameters (?)
|
|
533
|
+
* @param sql - SQL statement with positional parameters
|
|
534
|
+
* @param parameterValues - Parameter values by name or index
|
|
535
|
+
* @param context - Request context
|
|
536
|
+
* @param strictTypeValidation - Whether to enforce strict type validation
|
|
537
|
+
* @returns Processing result
|
|
538
|
+
*/
|
|
539
|
+
static async processPositionalParameters(sql, parameterValues, context, strictTypeValidation) {
|
|
540
|
+
const positionalParamRegex = /\?/g;
|
|
541
|
+
const parameterCount = (sql.match(positionalParamRegex) || []).length;
|
|
542
|
+
// Convert parameters to array in order
|
|
543
|
+
const parameters = [];
|
|
544
|
+
const parameterNames = [];
|
|
545
|
+
const missingParameters = [];
|
|
546
|
+
// Extract parameters using zero-based indexing
|
|
547
|
+
for (let i = 0; i < parameterCount; i++) {
|
|
548
|
+
let paramValue;
|
|
549
|
+
let paramName;
|
|
550
|
+
// Try zero-based index parameter (0, 1, 2, ...)
|
|
551
|
+
if (parameterValues[i.toString()] !== undefined) {
|
|
552
|
+
paramValue = parameterValues[i.toString()];
|
|
553
|
+
paramName = i.toString();
|
|
554
|
+
}
|
|
555
|
+
// Take parameters in order of Object.keys
|
|
556
|
+
else {
|
|
557
|
+
const keys = Object.keys(parameterValues);
|
|
558
|
+
if (i < keys.length) {
|
|
559
|
+
paramName = keys[i];
|
|
560
|
+
paramValue = parameterValues[paramName];
|
|
561
|
+
}
|
|
562
|
+
else {
|
|
563
|
+
paramName = `param_${i}`;
|
|
564
|
+
paramValue = undefined;
|
|
565
|
+
}
|
|
566
|
+
}
|
|
567
|
+
parameterNames.push(paramName);
|
|
568
|
+
if (paramValue === undefined || paramValue === null) {
|
|
569
|
+
missingParameters.push(paramName);
|
|
570
|
+
logger.warning({
|
|
571
|
+
...context,
|
|
572
|
+
availableParams: Object.keys(parameterValues),
|
|
573
|
+
missingIndex: i,
|
|
574
|
+
}, `Positional parameter at index ${i} not found`);
|
|
575
|
+
continue;
|
|
576
|
+
}
|
|
577
|
+
// Convert and validate parameter value
|
|
578
|
+
const bindingValue = this.convertToBindingValue(paramValue, paramName, strictTypeValidation);
|
|
579
|
+
parameters.push(bindingValue);
|
|
580
|
+
}
|
|
581
|
+
return {
|
|
582
|
+
sql,
|
|
583
|
+
parameters,
|
|
584
|
+
parameterNames,
|
|
585
|
+
missingParameters,
|
|
586
|
+
mode: "positional",
|
|
587
|
+
stats: {
|
|
588
|
+
originalLength: sql.length,
|
|
589
|
+
processedLength: sql.length,
|
|
590
|
+
namedParametersFound: 0,
|
|
591
|
+
positionalParametersFound: parameterCount,
|
|
592
|
+
parametersConverted: parameters.length,
|
|
593
|
+
},
|
|
594
|
+
};
|
|
595
|
+
}
|
|
596
|
+
/**
|
|
597
|
+
* Process hybrid parameters (mix of named and positional)
|
|
598
|
+
* @param sql - SQL statement with mixed parameters
|
|
599
|
+
* @param parameterValues - Parameter values by name
|
|
600
|
+
* @param context - Request context
|
|
601
|
+
* @param strictTypeValidation - Whether to enforce strict type validation
|
|
602
|
+
* @returns Processing result
|
|
603
|
+
*/
|
|
604
|
+
static async processHybridParameters(sql, parameterValues, context, strictTypeValidation) {
|
|
605
|
+
logger.warning({
|
|
606
|
+
...context,
|
|
607
|
+
sql: sql.substring(0, 100) + "...",
|
|
608
|
+
}, "Hybrid parameter mode detected - processing named parameters first");
|
|
609
|
+
// Process named parameters first, then handle any remaining positional ones
|
|
610
|
+
const namedResult = await this.processNamedParameters(sql, parameterValues, context, strictTypeValidation);
|
|
611
|
+
// If there are still ? placeholders, process them as positional
|
|
612
|
+
const positionalParamCount = (namedResult.sql.match(/\?/g) || []).length;
|
|
613
|
+
if (positionalParamCount > namedResult.parameters.length) {
|
|
614
|
+
logger.debug({
|
|
615
|
+
...context,
|
|
616
|
+
remainingPositional: positionalParamCount - namedResult.parameters.length,
|
|
617
|
+
}, "Processing remaining positional parameters in hybrid mode");
|
|
618
|
+
}
|
|
619
|
+
return {
|
|
620
|
+
...namedResult,
|
|
621
|
+
mode: "hybrid",
|
|
622
|
+
stats: {
|
|
623
|
+
...namedResult.stats,
|
|
624
|
+
positionalParametersFound: positionalParamCount,
|
|
625
|
+
},
|
|
626
|
+
};
|
|
627
|
+
}
|
|
628
|
+
/**
|
|
629
|
+
* Convert a parameter value to BindingValue
|
|
630
|
+
* @param value - Parameter value to convert
|
|
631
|
+
* @param paramName - Parameter name for error messages
|
|
632
|
+
* @param strictTypeValidation - Whether to enforce strict type validation
|
|
633
|
+
* @returns Converted BindingValue
|
|
634
|
+
*/
|
|
635
|
+
static convertToBindingValue(value, paramName, strictTypeValidation) {
|
|
636
|
+
// BindingValue = string | number | (string | number)[]
|
|
637
|
+
if (value === null || value === undefined) {
|
|
638
|
+
if (strictTypeValidation) {
|
|
639
|
+
throw new McpError(JsonRpcErrorCode.ValidationError, `Parameter '${paramName}' cannot be null or undefined`, { paramName, value });
|
|
640
|
+
}
|
|
641
|
+
return "";
|
|
642
|
+
}
|
|
643
|
+
// Handle arrays
|
|
644
|
+
if (Array.isArray(value)) {
|
|
645
|
+
const convertedArray = value.map((item, index) => {
|
|
646
|
+
if (typeof item === "string" || typeof item === "number") {
|
|
647
|
+
return item;
|
|
648
|
+
}
|
|
649
|
+
if (strictTypeValidation) {
|
|
650
|
+
throw new McpError(JsonRpcErrorCode.ValidationError, `Array parameter '${paramName}[${index}]' must contain only strings or numbers`, { paramName, index, itemType: typeof item, itemValue: item });
|
|
651
|
+
}
|
|
652
|
+
return String(item);
|
|
653
|
+
});
|
|
654
|
+
return convertedArray;
|
|
655
|
+
}
|
|
656
|
+
// Handle primitives
|
|
657
|
+
if (typeof value === "string" || typeof value === "number") {
|
|
658
|
+
return value;
|
|
659
|
+
}
|
|
660
|
+
// Handle booleans
|
|
661
|
+
if (typeof value === "boolean") {
|
|
662
|
+
return value ? 1 : 0; // Convert boolean to number for DB2
|
|
663
|
+
}
|
|
664
|
+
// Handle other types
|
|
665
|
+
if (strictTypeValidation) {
|
|
666
|
+
throw new McpError(JsonRpcErrorCode.ValidationError, `Parameter '${paramName}' must be string, number, boolean, or array of strings/numbers`, { paramName, type: typeof value, value });
|
|
667
|
+
}
|
|
668
|
+
// Convert to string as fallback
|
|
669
|
+
return String(value);
|
|
670
|
+
}
|
|
671
|
+
/**
|
|
672
|
+
* Validate SQL statement syntax for parameter processing
|
|
673
|
+
* @param sql - SQL statement to validate
|
|
674
|
+
* @throws McpError if syntax is invalid
|
|
675
|
+
*/
|
|
676
|
+
static validateSqlSyntax(sql) {
|
|
677
|
+
// Check for malformed named parameters
|
|
678
|
+
const malformedNamedParams = sql.match(/:(\d)/g);
|
|
679
|
+
if (malformedNamedParams) {
|
|
680
|
+
throw new McpError(JsonRpcErrorCode.ValidationError, `Invalid named parameter syntax found: ${malformedNamedParams.join(", ")}. Named parameters must start with a letter.`, { malformedParams: malformedNamedParams });
|
|
681
|
+
}
|
|
682
|
+
// Check for unmatched quotes that could affect parameter parsing
|
|
683
|
+
const singleQuotes = (sql.match(/'/g) || []).length;
|
|
684
|
+
const doubleQuotes = (sql.match(/"/g) || []).length;
|
|
685
|
+
if (singleQuotes % 2 !== 0) {
|
|
686
|
+
throw new McpError(JsonRpcErrorCode.ValidationError, "Unmatched single quotes in SQL statement", { singleQuoteCount: singleQuotes });
|
|
687
|
+
}
|
|
688
|
+
if (doubleQuotes % 2 !== 0) {
|
|
689
|
+
throw new McpError(JsonRpcErrorCode.ValidationError, "Unmatched double quotes in SQL statement", { doubleQuoteCount: doubleQuotes });
|
|
690
|
+
}
|
|
691
|
+
}
|
|
692
|
+
/**
|
|
693
|
+
* Extract parameter names from SQL statement
|
|
694
|
+
* @param sql - SQL statement to analyze
|
|
695
|
+
* @returns Array of unique parameter names
|
|
696
|
+
*/
|
|
697
|
+
static extractParameterNames(sql) {
|
|
698
|
+
const namedParamRegex = /:(\w+)/g;
|
|
699
|
+
const parameterNames = [];
|
|
700
|
+
let match;
|
|
701
|
+
while ((match = namedParamRegex.exec(sql)) !== null) {
|
|
702
|
+
if (!parameterNames.includes(match[1])) {
|
|
703
|
+
parameterNames.push(match[1]);
|
|
704
|
+
}
|
|
705
|
+
}
|
|
706
|
+
return parameterNames;
|
|
707
|
+
}
|
|
708
|
+
/**
|
|
709
|
+
* Count positional parameters in SQL statement
|
|
710
|
+
* @param sql - SQL statement to analyze
|
|
711
|
+
* @returns Number of ? placeholders
|
|
712
|
+
*/
|
|
713
|
+
static countPositionalParameters(sql) {
|
|
714
|
+
return (sql.match(/\?/g) || []).length;
|
|
715
|
+
}
|
|
716
|
+
/**
|
|
717
|
+
* Check if SQL statement has any parameters
|
|
718
|
+
* @param sql - SQL statement to check
|
|
719
|
+
* @returns True if statement contains parameters
|
|
720
|
+
*/
|
|
721
|
+
static hasParameters(sql) {
|
|
722
|
+
return (this.detectParameterMode(sql) !== "positional" ||
|
|
723
|
+
this.countPositionalParameters(sql) > 0);
|
|
724
|
+
}
|
|
725
|
+
}
|
|
726
|
+
//# sourceMappingURL=parameterProcessor.js.map
|