mcp-creatio 0.3.6
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/.dockerignore +12 -0
- package/.editorconfig +14 -0
- package/.eslintrc.cjs +18 -0
- package/.gitattributes +8 -0
- package/.github/workflows/docker-publish.yml +50 -0
- package/.prettierignore +3 -0
- package/.prettierrc +9 -0
- package/.vscode/launch.json +23 -0
- package/.vscode/mcp.json +13 -0
- package/.vscode/settings.json +16 -0
- package/Agent.md +187 -0
- package/Debug.md +32 -0
- package/Dockerfile +23 -0
- package/LICENSE +21 -0
- package/README.md +162 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +135 -0
- package/dist/cli.js.map +1 -0
- package/dist/config-builder.d.ts +3 -0
- package/dist/config-builder.d.ts.map +1 -0
- package/dist/config-builder.js +66 -0
- package/dist/config-builder.js.map +1 -0
- package/dist/consts.d.ts +2 -0
- package/dist/consts.d.ts.map +1 -0
- package/dist/consts.js +6 -0
- package/dist/consts.js.map +1 -0
- package/dist/creatio/auth/auth-manager.d.ts +9 -0
- package/dist/creatio/auth/auth-manager.d.ts.map +1 -0
- package/dist/creatio/auth/auth-manager.js +29 -0
- package/dist/creatio/auth/auth-manager.js.map +1 -0
- package/dist/creatio/auth/auth.d.ts +16 -0
- package/dist/creatio/auth/auth.d.ts.map +1 -0
- package/dist/creatio/auth/auth.js +20 -0
- package/dist/creatio/auth/auth.js.map +1 -0
- package/dist/creatio/auth/index.d.ts +4 -0
- package/dist/creatio/auth/index.d.ts.map +1 -0
- package/dist/creatio/auth/index.js +21 -0
- package/dist/creatio/auth/index.js.map +1 -0
- package/dist/creatio/auth/providers/base-oauth2-provider.d.ts +17 -0
- package/dist/creatio/auth/providers/base-oauth2-provider.d.ts.map +1 -0
- package/dist/creatio/auth/providers/base-oauth2-provider.js +49 -0
- package/dist/creatio/auth/providers/base-oauth2-provider.js.map +1 -0
- package/dist/creatio/auth/providers/base-provider.d.ts +15 -0
- package/dist/creatio/auth/providers/base-provider.d.ts.map +1 -0
- package/dist/creatio/auth/providers/base-provider.js +32 -0
- package/dist/creatio/auth/providers/base-provider.js.map +1 -0
- package/dist/creatio/auth/providers/index.d.ts +5 -0
- package/dist/creatio/auth/providers/index.d.ts.map +1 -0
- package/dist/creatio/auth/providers/index.js +21 -0
- package/dist/creatio/auth/providers/index.js.map +1 -0
- package/dist/creatio/auth/providers/legacy-provider.d.ts +10 -0
- package/dist/creatio/auth/providers/legacy-provider.d.ts.map +1 -0
- package/dist/creatio/auth/providers/legacy-provider.js +73 -0
- package/dist/creatio/auth/providers/legacy-provider.js.map +1 -0
- package/dist/creatio/auth/providers/oauth2-code-provider.d.ts +18 -0
- package/dist/creatio/auth/providers/oauth2-code-provider.d.ts.map +1 -0
- package/dist/creatio/auth/providers/oauth2-code-provider.js +245 -0
- package/dist/creatio/auth/providers/oauth2-code-provider.js.map +1 -0
- package/dist/creatio/auth/providers/oauth2-provider.d.ts +9 -0
- package/dist/creatio/auth/providers/oauth2-provider.d.ts.map +1 -0
- package/dist/creatio/auth/providers/oauth2-provider.js +86 -0
- package/dist/creatio/auth/providers/oauth2-provider.js.map +1 -0
- package/dist/creatio/auth/providers/type.d.ts +6 -0
- package/dist/creatio/auth/providers/type.d.ts.map +1 -0
- package/dist/creatio/auth/providers/type.js +10 -0
- package/dist/creatio/auth/providers/type.js.map +1 -0
- package/dist/creatio/client-config.d.ts +29 -0
- package/dist/creatio/client-config.d.ts.map +1 -0
- package/dist/creatio/client-config.js +3 -0
- package/dist/creatio/client-config.js.map +1 -0
- package/dist/creatio/engines/crud/crud-engine.d.ts +15 -0
- package/dist/creatio/engines/crud/crud-engine.d.ts.map +1 -0
- package/dist/creatio/engines/crud/crud-engine.js +33 -0
- package/dist/creatio/engines/crud/crud-engine.js.map +1 -0
- package/dist/creatio/engines/engine-manager.d.ts +33 -0
- package/dist/creatio/engines/engine-manager.d.ts.map +1 -0
- package/dist/creatio/engines/engine-manager.js +54 -0
- package/dist/creatio/engines/engine-manager.js.map +1 -0
- package/dist/creatio/engines/engine-registry.d.ts +15 -0
- package/dist/creatio/engines/engine-registry.d.ts.map +1 -0
- package/dist/creatio/engines/engine-registry.js +35 -0
- package/dist/creatio/engines/engine-registry.js.map +1 -0
- package/dist/creatio/engines/engine.d.ts +4 -0
- package/dist/creatio/engines/engine.d.ts.map +1 -0
- package/dist/creatio/engines/engine.js +3 -0
- package/dist/creatio/engines/engine.js.map +1 -0
- package/dist/creatio/engines/index.d.ts +8 -0
- package/dist/creatio/engines/index.d.ts.map +1 -0
- package/dist/creatio/engines/index.js +24 -0
- package/dist/creatio/engines/index.js.map +1 -0
- package/dist/creatio/engines/process/process-engine.d.ts +10 -0
- package/dist/creatio/engines/process/process-engine.d.ts.map +1 -0
- package/dist/creatio/engines/process/process-engine.js +18 -0
- package/dist/creatio/engines/process/process-engine.js.map +1 -0
- package/dist/creatio/engines/sys-settings/sys-settings-engine.d.ts +13 -0
- package/dist/creatio/engines/sys-settings/sys-settings-engine.d.ts.map +1 -0
- package/dist/creatio/engines/sys-settings/sys-settings-engine.js +27 -0
- package/dist/creatio/engines/sys-settings/sys-settings-engine.js.map +1 -0
- package/dist/creatio/engines/user/user-engine.d.ts +10 -0
- package/dist/creatio/engines/user/user-engine.d.ts.map +1 -0
- package/dist/creatio/engines/user/user-engine.js +18 -0
- package/dist/creatio/engines/user/user-engine.js.map +1 -0
- package/dist/creatio/index.d.ts +7 -0
- package/dist/creatio/index.d.ts.map +1 -0
- package/dist/creatio/index.js +23 -0
- package/dist/creatio/index.js.map +1 -0
- package/dist/creatio/provider-context.d.ts +10 -0
- package/dist/creatio/provider-context.d.ts.map +1 -0
- package/dist/creatio/provider-context.js +3 -0
- package/dist/creatio/provider-context.js.map +1 -0
- package/dist/creatio/providers/crud-provider.d.ts +40 -0
- package/dist/creatio/providers/crud-provider.d.ts.map +1 -0
- package/dist/creatio/providers/crud-provider.js +3 -0
- package/dist/creatio/providers/crud-provider.js.map +1 -0
- package/dist/creatio/providers/index.d.ts +5 -0
- package/dist/creatio/providers/index.d.ts.map +1 -0
- package/dist/creatio/providers/index.js +21 -0
- package/dist/creatio/providers/index.js.map +1 -0
- package/dist/creatio/providers/process-provider.d.ts +14 -0
- package/dist/creatio/providers/process-provider.d.ts.map +1 -0
- package/dist/creatio/providers/process-provider.js +3 -0
- package/dist/creatio/providers/process-provider.js.map +1 -0
- package/dist/creatio/providers/sys-settings-provider.d.ts +58 -0
- package/dist/creatio/providers/sys-settings-provider.d.ts.map +1 -0
- package/dist/creatio/providers/sys-settings-provider.js +3 -0
- package/dist/creatio/providers/sys-settings-provider.js.map +1 -0
- package/dist/creatio/providers/user-provider.d.ts +12 -0
- package/dist/creatio/providers/user-provider.d.ts.map +1 -0
- package/dist/creatio/providers/user-provider.js +3 -0
- package/dist/creatio/providers/user-provider.js.map +1 -0
- package/dist/creatio/services/creatio-service-context.d.ts +17 -0
- package/dist/creatio/services/creatio-service-context.d.ts.map +1 -0
- package/dist/creatio/services/creatio-service-context.js +35 -0
- package/dist/creatio/services/creatio-service-context.js.map +1 -0
- package/dist/creatio/services/http-client.d.ts +29 -0
- package/dist/creatio/services/http-client.d.ts.map +1 -0
- package/dist/creatio/services/http-client.js +136 -0
- package/dist/creatio/services/http-client.js.map +1 -0
- package/dist/creatio/services/index.d.ts +8 -0
- package/dist/creatio/services/index.d.ts.map +1 -0
- package/dist/creatio/services/index.js +24 -0
- package/dist/creatio/services/index.js.map +1 -0
- package/dist/creatio/services/metadata-store.d.ts +20 -0
- package/dist/creatio/services/metadata-store.d.ts.map +1 -0
- package/dist/creatio/services/metadata-store.js +162 -0
- package/dist/creatio/services/metadata-store.js.map +1 -0
- package/dist/creatio/services/odata-crud-provider.d.ts +21 -0
- package/dist/creatio/services/odata-crud-provider.d.ts.map +1 -0
- package/dist/creatio/services/odata-crud-provider.js +145 -0
- package/dist/creatio/services/odata-crud-provider.js.map +1 -0
- package/dist/creatio/services/process-service-provider.d.ts +11 -0
- package/dist/creatio/services/process-service-provider.d.ts.map +1 -0
- package/dist/creatio/services/process-service-provider.js +52 -0
- package/dist/creatio/services/process-service-provider.js.map +1 -0
- package/dist/creatio/services/sys-settings-service-provider.d.ts +19 -0
- package/dist/creatio/services/sys-settings-service-provider.d.ts.map +1 -0
- package/dist/creatio/services/sys-settings-service-provider.js +107 -0
- package/dist/creatio/services/sys-settings-service-provider.js.map +1 -0
- package/dist/creatio/services/user-info-provider.d.ts +10 -0
- package/dist/creatio/services/user-info-provider.d.ts.map +1 -0
- package/dist/creatio/services/user-info-provider.js +26 -0
- package/dist/creatio/services/user-info-provider.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +46 -0
- package/dist/index.js.map +1 -0
- package/dist/log.d.ts +51 -0
- package/dist/log.d.ts.map +1 -0
- package/dist/log.js +137 -0
- package/dist/log.js.map +1 -0
- package/dist/server/http/creatio-oauth-handlers.d.ts +14 -0
- package/dist/server/http/creatio-oauth-handlers.d.ts.map +1 -0
- package/dist/server/http/creatio-oauth-handlers.js +137 -0
- package/dist/server/http/creatio-oauth-handlers.js.map +1 -0
- package/dist/server/http/httpServer.d.ts +23 -0
- package/dist/server/http/httpServer.d.ts.map +1 -0
- package/dist/server/http/httpServer.js +131 -0
- package/dist/server/http/httpServer.js.map +1 -0
- package/dist/server/http/index.d.ts +6 -0
- package/dist/server/http/index.d.ts.map +1 -0
- package/dist/server/http/index.js +22 -0
- package/dist/server/http/index.js.map +1 -0
- package/dist/server/http/mcp-handlers.d.ts +10 -0
- package/dist/server/http/mcp-handlers.d.ts.map +1 -0
- package/dist/server/http/mcp-handlers.js +82 -0
- package/dist/server/http/mcp-handlers.js.map +1 -0
- package/dist/server/http/mcp-oauth-handlers.d.ts +11 -0
- package/dist/server/http/mcp-oauth-handlers.d.ts.map +1 -0
- package/dist/server/http/mcp-oauth-handlers.js +106 -0
- package/dist/server/http/mcp-oauth-handlers.js.map +1 -0
- package/dist/server/http/middleware.d.ts +11 -0
- package/dist/server/http/middleware.d.ts.map +1 -0
- package/dist/server/http/middleware.js +88 -0
- package/dist/server/http/middleware.js.map +1 -0
- package/dist/server/index.d.ts +3 -0
- package/dist/server/index.d.ts.map +1 -0
- package/dist/server/index.js +19 -0
- package/dist/server/index.js.map +1 -0
- package/dist/server/mcp/filters.d.ts +2 -0
- package/dist/server/mcp/filters.d.ts.map +1 -0
- package/dist/server/mcp/filters.js +94 -0
- package/dist/server/mcp/filters.js.map +1 -0
- package/dist/server/mcp/index.d.ts +2 -0
- package/dist/server/mcp/index.d.ts.map +1 -0
- package/dist/server/mcp/index.js +18 -0
- package/dist/server/mcp/index.js.map +1 -0
- package/dist/server/mcp/prompts-data.d.ts +147 -0
- package/dist/server/mcp/prompts-data.d.ts.map +1 -0
- package/dist/server/mcp/prompts-data.js +884 -0
- package/dist/server/mcp/prompts-data.js.map +1 -0
- package/dist/server/mcp/server.d.ts +25 -0
- package/dist/server/mcp/server.d.ts.map +1 -0
- package/dist/server/mcp/server.js +233 -0
- package/dist/server/mcp/server.js.map +1 -0
- package/dist/server/mcp/tools-data.d.ts +165 -0
- package/dist/server/mcp/tools-data.d.ts.map +1 -0
- package/dist/server/mcp/tools-data.js +466 -0
- package/dist/server/mcp/tools-data.js.map +1 -0
- package/dist/server/oauth/client-manager.d.ts +6 -0
- package/dist/server/oauth/client-manager.d.ts.map +1 -0
- package/dist/server/oauth/client-manager.js +52 -0
- package/dist/server/oauth/client-manager.js.map +1 -0
- package/dist/server/oauth/index.d.ts +7 -0
- package/dist/server/oauth/index.d.ts.map +1 -0
- package/dist/server/oauth/index.js +23 -0
- package/dist/server/oauth/index.js.map +1 -0
- package/dist/server/oauth/oauth-server.d.ts +21 -0
- package/dist/server/oauth/oauth-server.d.ts.map +1 -0
- package/dist/server/oauth/oauth-server.js +146 -0
- package/dist/server/oauth/oauth-server.js.map +1 -0
- package/dist/server/oauth/storage.d.ts +31 -0
- package/dist/server/oauth/storage.d.ts.map +1 -0
- package/dist/server/oauth/storage.js +73 -0
- package/dist/server/oauth/storage.js.map +1 -0
- package/dist/server/oauth/token-manager.d.ts +13 -0
- package/dist/server/oauth/token-manager.d.ts.map +1 -0
- package/dist/server/oauth/token-manager.js +69 -0
- package/dist/server/oauth/token-manager.js.map +1 -0
- package/dist/server/oauth/types.d.ts +51 -0
- package/dist/server/oauth/types.d.ts.map +1 -0
- package/dist/server/oauth/types.js +3 -0
- package/dist/server/oauth/types.js.map +1 -0
- package/dist/server/oauth/validators.d.ts +7 -0
- package/dist/server/oauth/validators.d.ts.map +1 -0
- package/dist/server/oauth/validators.js +51 -0
- package/dist/server/oauth/validators.js.map +1 -0
- package/dist/services/index.d.ts +3 -0
- package/dist/services/index.d.ts.map +1 -0
- package/dist/services/index.js +19 -0
- package/dist/services/index.js.map +1 -0
- package/dist/services/session-context.d.ts +57 -0
- package/dist/services/session-context.d.ts.map +1 -0
- package/dist/services/session-context.js +182 -0
- package/dist/services/session-context.js.map +1 -0
- package/dist/services/token-refresh-scheduler.d.ts +16 -0
- package/dist/services/token-refresh-scheduler.d.ts.map +1 -0
- package/dist/services/token-refresh-scheduler.js +66 -0
- package/dist/services/token-refresh-scheduler.js.map +1 -0
- package/dist/types/index.d.ts +2 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +18 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/network.d.ts +7 -0
- package/dist/types/network.d.ts.map +1 -0
- package/dist/types/network.js +6 -0
- package/dist/types/network.js.map +1 -0
- package/dist/utils/context.d.ts +10 -0
- package/dist/utils/context.d.ts.map +1 -0
- package/dist/utils/context.js +44 -0
- package/dist/utils/context.js.map +1 -0
- package/dist/utils/env.d.ts +3 -0
- package/dist/utils/env.d.ts.map +1 -0
- package/dist/utils/env.js +16 -0
- package/dist/utils/env.js.map +1 -0
- package/dist/utils/index.d.ts +6 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/index.js +22 -0
- package/dist/utils/index.js.map +1 -0
- package/dist/utils/mcp.d.ts +3 -0
- package/dist/utils/mcp.d.ts.map +1 -0
- package/dist/utils/mcp.js +7 -0
- package/dist/utils/mcp.js.map +1 -0
- package/dist/utils/network.d.ts +7 -0
- package/dist/utils/network.d.ts.map +1 -0
- package/dist/utils/network.js +63 -0
- package/dist/utils/network.js.map +1 -0
- package/dist/utils/pkce.d.ts +7 -0
- package/dist/utils/pkce.d.ts.map +1 -0
- package/dist/utils/pkce.js +43 -0
- package/dist/utils/pkce.js.map +1 -0
- package/dist/version.d.ts +3 -0
- package/dist/version.d.ts.map +1 -0
- package/dist/version.js +10 -0
- package/dist/version.js.map +1 -0
- package/docs/coding-style.md +30 -0
- package/ecosystem.config.json +17 -0
- package/eslint.config.cjs +95 -0
- package/package.json +54 -0
- package/src/cli.ts +158 -0
- package/src/config-builder.ts +76 -0
- package/src/consts.ts +3 -0
- package/src/creatio/auth/auth-manager.ts +27 -0
- package/src/creatio/auth/auth.ts +31 -0
- package/src/creatio/auth/index.ts +3 -0
- package/src/creatio/auth/providers/base-oauth2-provider.ts +62 -0
- package/src/creatio/auth/providers/base-provider.ts +42 -0
- package/src/creatio/auth/providers/index.ts +4 -0
- package/src/creatio/auth/providers/legacy-provider.ts +70 -0
- package/src/creatio/auth/providers/oauth2-code-provider.ts +252 -0
- package/src/creatio/auth/providers/oauth2-provider.ts +91 -0
- package/src/creatio/auth/providers/type.ts +5 -0
- package/src/creatio/client-config.ts +34 -0
- package/src/creatio/engines/crud/crud-engine.ts +47 -0
- package/src/creatio/engines/engine-manager.ts +102 -0
- package/src/creatio/engines/engine-registry.ts +36 -0
- package/src/creatio/engines/engine.ts +3 -0
- package/src/creatio/engines/index.ts +7 -0
- package/src/creatio/engines/process/process-engine.ts +20 -0
- package/src/creatio/engines/sys-settings/sys-settings-engine.ts +41 -0
- package/src/creatio/engines/user/user-engine.ts +20 -0
- package/src/creatio/index.ts +6 -0
- package/src/creatio/provider-context.ts +10 -0
- package/src/creatio/providers/crud-provider.ts +45 -0
- package/src/creatio/providers/index.ts +4 -0
- package/src/creatio/providers/process-provider.ts +15 -0
- package/src/creatio/providers/sys-settings-provider.ts +63 -0
- package/src/creatio/providers/user-provider.ts +12 -0
- package/src/creatio/services/creatio-service-context.ts +38 -0
- package/src/creatio/services/http-client.ts +174 -0
- package/src/creatio/services/index.ts +7 -0
- package/src/creatio/services/metadata-store.ts +181 -0
- package/src/creatio/services/odata-crud-provider.ts +210 -0
- package/src/creatio/services/process-service-provider.ts +76 -0
- package/src/creatio/services/sys-settings-service-provider.ts +192 -0
- package/src/creatio/services/user-info-provider.ts +41 -0
- package/src/index.ts +44 -0
- package/src/log.ts +141 -0
- package/src/server/http/creatio-oauth-handlers.ts +146 -0
- package/src/server/http/httpServer.ts +150 -0
- package/src/server/http/index.ts +5 -0
- package/src/server/http/mcp-handlers.ts +92 -0
- package/src/server/http/mcp-oauth-handlers.ts +108 -0
- package/src/server/http/middleware.ts +91 -0
- package/src/server/index.ts +2 -0
- package/src/server/mcp/filters.ts +97 -0
- package/src/server/mcp/index.ts +1 -0
- package/src/server/mcp/prompts-data.ts +896 -0
- package/src/server/mcp/server.ts +331 -0
- package/src/server/mcp/tools-data.ts +592 -0
- package/src/server/oauth/client-manager.ts +47 -0
- package/src/server/oauth/index.ts +6 -0
- package/src/server/oauth/oauth-server.ts +185 -0
- package/src/server/oauth/storage.ts +106 -0
- package/src/server/oauth/token-manager.ts +80 -0
- package/src/server/oauth/types.ts +55 -0
- package/src/server/oauth/validators.ts +56 -0
- package/src/services/index.ts +2 -0
- package/src/services/session-context.ts +232 -0
- package/src/services/token-refresh-scheduler.ts +68 -0
- package/src/types/index.ts +1 -0
- package/src/types/network.ts +7 -0
- package/src/utils/context.ts +49 -0
- package/src/utils/env.ts +12 -0
- package/src/utils/index.ts +5 -0
- package/src/utils/mcp.ts +8 -0
- package/src/utils/network.ts +65 -0
- package/src/utils/pkce.ts +39 -0
- package/src/version.ts +15 -0
- package/tsconfig.json +28 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"version.d.ts","sourceRoot":"","sources":["../src/version.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,IAAI,EAAE,MAKK,CAAC;AAEzB,eAAO,MAAM,OAAO,EAAE,MAKD,CAAC"}
|
package/dist/version.js
ADDED
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.VERSION = exports.NAME = void 0;
|
|
7
|
+
const package_json_1 = __importDefault(require("../package.json"));
|
|
8
|
+
exports.NAME = package_json_1.default.name || 'creatio-mcp';
|
|
9
|
+
exports.VERSION = package_json_1.default.version || '0.0.0';
|
|
10
|
+
//# sourceMappingURL=version.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"version.js","sourceRoot":"","sources":["../src/version.ts"],"names":[],"mappings":";;;;;;AAAA,mEAAkC;AAErB,QAAA,IAAI,GAEf,sBAGA,CAAC,IAAI,IAAI,aAAa,CAAC;AAEZ,QAAA,OAAO,GAElB,sBAGA,CAAC,OAAO,IAAI,OAAO,CAAC"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
# Coding Style Guide
|
|
2
|
+
|
|
3
|
+
This guide defines the class/member layout used across the project so every contributor (human or LLM) can keep the codebase consistent and easy to read.
|
|
4
|
+
|
|
5
|
+
## Class Member Ordering
|
|
6
|
+
|
|
7
|
+
Group class members in the following order. Within each group sort by access level: `private` → `protected` → `public`.
|
|
8
|
+
|
|
9
|
+
1. **Fields (readonly)** – immutable state declared with `readonly`.
|
|
10
|
+
2. **Fields** – mutable fields.
|
|
11
|
+
3. **Properties (getters only)**.
|
|
12
|
+
4. **Properties with setters** – getter/setter pairs.
|
|
13
|
+
5. **Constructors**.
|
|
14
|
+
6. **Methods** – regular functions (again `private`, `protected`, `public`).
|
|
15
|
+
|
|
16
|
+
Additional rules:
|
|
17
|
+
|
|
18
|
+
- Prefix all private fields and methods with `_` (e.g., `_cache`, `_buildRequest`).
|
|
19
|
+
- Prefer `protected` for members intended for subclasses, otherwise keep them `private` or `public`.
|
|
20
|
+
- Avoid interleaving unrelated helper functions; keep the order strict even when a method depends on another declared later.
|
|
21
|
+
- Use whitespace between groups to keep sections visually distinct.
|
|
22
|
+
|
|
23
|
+
## Clean Code Expectations
|
|
24
|
+
|
|
25
|
+
- Keep methods small and single-purpose. Extract helpers rather than nesting complex logic.
|
|
26
|
+
- Use descriptive names; avoid abbreviations unless they are domain-specific and already established.
|
|
27
|
+
- Log through the shared `log` helper. Never swallow errors silently.
|
|
28
|
+
- Adhere to existing TypeScript strictness (no implicit `any`).
|
|
29
|
+
|
|
30
|
+
When updating or creating a class, run through this list to ensure the structure matches before submitting changes.
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
{
|
|
2
|
+
"apps": [
|
|
3
|
+
{
|
|
4
|
+
"name": "mcp-creatio",
|
|
5
|
+
"cwd": "C:/Projects/mcp-creatio",
|
|
6
|
+
"script": "dist/index.js",
|
|
7
|
+
"node_args": "",
|
|
8
|
+
"env": {
|
|
9
|
+
"CREATIO_BASE_URL": "http://tscore-dev-18:88/sae_m_seeenu_12458081_1106",
|
|
10
|
+
"CREATIO_LOGIN": "your_login",
|
|
11
|
+
"CREATIO_PASSWORD": "your_password",
|
|
12
|
+
"PORT": "7700",
|
|
13
|
+
"HOST": "0.0.0.0"
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
]
|
|
17
|
+
}
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
module.exports = [
|
|
2
|
+
{
|
|
3
|
+
ignores: ['node_modules/**', 'dist/**', 'coverage/**'],
|
|
4
|
+
},
|
|
5
|
+
{
|
|
6
|
+
files: ['**/*.{ts,tsx,js,jsx}'],
|
|
7
|
+
languageOptions: {
|
|
8
|
+
parser: require('@typescript-eslint/parser'),
|
|
9
|
+
parserOptions: {
|
|
10
|
+
project: ['./tsconfig.json'],
|
|
11
|
+
tsconfigRootDir: __dirname,
|
|
12
|
+
sourceType: 'module'
|
|
13
|
+
}
|
|
14
|
+
},
|
|
15
|
+
plugins: {
|
|
16
|
+
prettier: require('eslint-plugin-prettier'),
|
|
17
|
+
'@typescript-eslint': require('@typescript-eslint/eslint-plugin'),
|
|
18
|
+
import: require('eslint-plugin-import')
|
|
19
|
+
},
|
|
20
|
+
rules: {
|
|
21
|
+
'prettier/prettier': [
|
|
22
|
+
'error',
|
|
23
|
+
{
|
|
24
|
+
singleQuote: true,
|
|
25
|
+
trailingComma: 'all',
|
|
26
|
+
semi: true,
|
|
27
|
+
printWidth: 100,
|
|
28
|
+
useTabs: true,
|
|
29
|
+
tabWidth: 4,
|
|
30
|
+
endOfLine: 'crlf'
|
|
31
|
+
}
|
|
32
|
+
],
|
|
33
|
+
// Sort imported members while declaration order is handled by import/order
|
|
34
|
+
'sort-imports': [
|
|
35
|
+
'error',
|
|
36
|
+
{
|
|
37
|
+
ignoreCase: false,
|
|
38
|
+
ignoreDeclarationSort: true,
|
|
39
|
+
ignoreMemberSort: false,
|
|
40
|
+
memberSyntaxSortOrder: ['none', 'all', 'multiple', 'single'],
|
|
41
|
+
allowSeparatedGroups: true
|
|
42
|
+
}
|
|
43
|
+
],
|
|
44
|
+
// Group and alphabetize import declarations: external first, then project/relative
|
|
45
|
+
'import/order': [
|
|
46
|
+
'error',
|
|
47
|
+
{
|
|
48
|
+
groups: [
|
|
49
|
+
'builtin',
|
|
50
|
+
'external',
|
|
51
|
+
'internal',
|
|
52
|
+
'parent',
|
|
53
|
+
'sibling',
|
|
54
|
+
'index',
|
|
55
|
+
'object',
|
|
56
|
+
'type'
|
|
57
|
+
],
|
|
58
|
+
pathGroupsExcludedImportTypes: ['builtin'],
|
|
59
|
+
'newlines-between': 'always',
|
|
60
|
+
alphabetize: { order: 'asc', caseInsensitive: false }
|
|
61
|
+
}
|
|
62
|
+
],
|
|
63
|
+
// Enforce curly braces for all control statements and a consistent brace style
|
|
64
|
+
curly: ['warn', 'all'],
|
|
65
|
+
'brace-style': ['error', '1tbs', { allowSingleLine: false }],
|
|
66
|
+
indent: ['error', 'tab', { SwitchCase: 1, VariableDeclarator: { var: 1, let: 1, const: 1 } }],
|
|
67
|
+
'linebreak-style': ['error', 'windows']
|
|
68
|
+
,
|
|
69
|
+
'@typescript-eslint/explicit-member-accessibility': [
|
|
70
|
+
'error',
|
|
71
|
+
{
|
|
72
|
+
accessibility: 'explicit',
|
|
73
|
+
overrides: {
|
|
74
|
+
constructors: 'no-public'
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
],
|
|
78
|
+
'@typescript-eslint/naming-convention': [
|
|
79
|
+
'error',
|
|
80
|
+
{
|
|
81
|
+
selector: 'method',
|
|
82
|
+
modifiers: ['private'],
|
|
83
|
+
format: ['camelCase'],
|
|
84
|
+
leadingUnderscore: 'require'
|
|
85
|
+
},
|
|
86
|
+
{
|
|
87
|
+
selector: 'method',
|
|
88
|
+
modifiers: ['public'],
|
|
89
|
+
format: ['camelCase'],
|
|
90
|
+
leadingUnderscore: 'forbid'
|
|
91
|
+
}
|
|
92
|
+
]
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
];
|
package/package.json
ADDED
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "mcp-creatio",
|
|
3
|
+
"version": "0.3.6",
|
|
4
|
+
"main": "dist/index.js",
|
|
5
|
+
"bin": {
|
|
6
|
+
"mcp-creatio": "dist/cli.js"
|
|
7
|
+
},
|
|
8
|
+
"scripts": {
|
|
9
|
+
"test": "echo \"Error: no test specified\" && exit 1",
|
|
10
|
+
"clean": "rimraf ./dist",
|
|
11
|
+
"prebuild": "npm run clean",
|
|
12
|
+
"build": "tsc",
|
|
13
|
+
"start": "ts-node src/index.ts",
|
|
14
|
+
"start:cli": "ts-node src/cli.ts",
|
|
15
|
+
"start:stdio": "ts-node src/cli.ts",
|
|
16
|
+
"prepack": "npm run build",
|
|
17
|
+
"lint": "eslint --ext .ts src",
|
|
18
|
+
"lint:fix": "eslint --ext .ts src --fix",
|
|
19
|
+
"format": "prettier --write \"src/**/*.{ts,js,json,md}\"",
|
|
20
|
+
"format:check": "prettier --check \"src/**/*.{ts,js,json,md}\""
|
|
21
|
+
},
|
|
22
|
+
"repository": {
|
|
23
|
+
"type": "git",
|
|
24
|
+
"url": "git+https://github.com/CRACKISH/mcp-creatio.git"
|
|
25
|
+
},
|
|
26
|
+
"keywords": [],
|
|
27
|
+
"author": "",
|
|
28
|
+
"license": "MIT",
|
|
29
|
+
"bugs": {
|
|
30
|
+
"url": "https://github.com/CRACKISH/mcp-creatio/issues"
|
|
31
|
+
},
|
|
32
|
+
"homepage": "https://github.com/CRACKISH/mcp-creatio#readme",
|
|
33
|
+
"description": "",
|
|
34
|
+
"devDependencies": {
|
|
35
|
+
"@types/express": "5.0.6",
|
|
36
|
+
"@types/node": "^25.3.0",
|
|
37
|
+
"@typescript-eslint/eslint-plugin": "^8.56.0",
|
|
38
|
+
"@typescript-eslint/parser": "^8.56.0",
|
|
39
|
+
"eslint": "^9.39.3",
|
|
40
|
+
"eslint-config-prettier": "^10.1.8",
|
|
41
|
+
"eslint-plugin-import": "^2.32.0",
|
|
42
|
+
"eslint-plugin-prettier": "^5.5.5",
|
|
43
|
+
"prettier": "^3.8.1",
|
|
44
|
+
"rimraf": "^6.1.3",
|
|
45
|
+
"ts-node": "^10.9.2",
|
|
46
|
+
"typescript": "^5.9.3"
|
|
47
|
+
},
|
|
48
|
+
"dependencies": {
|
|
49
|
+
"@modelcontextprotocol/sdk": "^1.26.0",
|
|
50
|
+
"@types/jsonwebtoken": "^9.0.10",
|
|
51
|
+
"fast-xml-parser": "^5.3.7",
|
|
52
|
+
"jsonwebtoken": "^9.0.3"
|
|
53
|
+
}
|
|
54
|
+
}
|
package/src/cli.ts
ADDED
|
@@ -0,0 +1,158 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
|
|
4
|
+
|
|
5
|
+
import { getCreatioClientConfig } from './config-builder';
|
|
6
|
+
import { AuthProviderType, CreatioEngineManager, CreatioServiceContext } from './creatio';
|
|
7
|
+
import log from './log';
|
|
8
|
+
import { Server } from './server';
|
|
9
|
+
import { envBool } from './utils';
|
|
10
|
+
|
|
11
|
+
type CliOptions = Record<string, string>;
|
|
12
|
+
|
|
13
|
+
interface RuntimeState {
|
|
14
|
+
server?: Server;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
function printHelp(): void {
|
|
18
|
+
const text = `
|
|
19
|
+
MCP Creatio CLI
|
|
20
|
+
|
|
21
|
+
Usage:
|
|
22
|
+
mcp-creatio [options]
|
|
23
|
+
|
|
24
|
+
Options:
|
|
25
|
+
--base-url <url> Creatio base URL
|
|
26
|
+
--url <url> Alias for --base-url
|
|
27
|
+
--login <value> Creatio login (legacy auth)
|
|
28
|
+
--password <value> Creatio password (legacy auth)
|
|
29
|
+
--client-id <value> OAuth2 client credentials client_id
|
|
30
|
+
--client-secret <value> OAuth2 client credentials client_secret
|
|
31
|
+
--id-base-url <url> Creatio Identity base URL
|
|
32
|
+
--readonly <true|false> Enable readonly mode
|
|
33
|
+
-h, --help Show this help
|
|
34
|
+
|
|
35
|
+
Examples:
|
|
36
|
+
mcp-creatio --base-url https://tenant.creatio.com --login your_login --password your_password
|
|
37
|
+
`.trim();
|
|
38
|
+
process.stdout.write(text + '\n');
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
function parseArgs(argv: string[]): CliOptions {
|
|
42
|
+
const opts: CliOptions = {};
|
|
43
|
+
for (let i = 0; i < argv.length; i++) {
|
|
44
|
+
const token = argv[i];
|
|
45
|
+
if (!token || !token.startsWith('-')) {
|
|
46
|
+
continue;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
if (token === '--help' || token === '-h') {
|
|
50
|
+
opts.help = 'true';
|
|
51
|
+
continue;
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
if (!token.startsWith('--')) {
|
|
55
|
+
continue;
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
const eqIndex = token.indexOf('=');
|
|
59
|
+
if (eqIndex > 2) {
|
|
60
|
+
const key = token.slice(2, eqIndex);
|
|
61
|
+
const value = token.slice(eqIndex + 1);
|
|
62
|
+
opts[key] = value;
|
|
63
|
+
continue;
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
const key = token.slice(2);
|
|
67
|
+
const next = argv[i + 1];
|
|
68
|
+
if (next && !next.startsWith('-')) {
|
|
69
|
+
opts[key] = next;
|
|
70
|
+
i++;
|
|
71
|
+
continue;
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
opts[key] = 'true';
|
|
75
|
+
}
|
|
76
|
+
return opts;
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
function setEnvIfDefined(name: string, value?: string): void {
|
|
80
|
+
if (typeof value === 'string' && value.length > 0) {
|
|
81
|
+
process.env[name] = value;
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
function applyCliEnv(opts: CliOptions): void {
|
|
86
|
+
setEnvIfDefined('CREATIO_BASE_URL', opts['base-url'] || opts.url);
|
|
87
|
+
setEnvIfDefined('CREATIO_LOGIN', opts.login);
|
|
88
|
+
setEnvIfDefined('CREATIO_PASSWORD', opts.password);
|
|
89
|
+
setEnvIfDefined('CREATIO_CLIENT_ID', opts['client-id']);
|
|
90
|
+
setEnvIfDefined('CREATIO_CLIENT_SECRET', opts['client-secret']);
|
|
91
|
+
setEnvIfDefined('CREATIO_ID_BASE_URL', opts['id-base-url']);
|
|
92
|
+
setEnvIfDefined('READONLY_MODE', opts.readonly);
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
async function startStdio(server: Server): Promise<void> {
|
|
96
|
+
const mcp = await server.startMcp();
|
|
97
|
+
const transport = new StdioServerTransport();
|
|
98
|
+
await mcp.connect(transport);
|
|
99
|
+
log.info('stdio.server.start');
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
let shuttingDown = false;
|
|
103
|
+
|
|
104
|
+
async function shutdown(signal: string, state: RuntimeState): Promise<void> {
|
|
105
|
+
if (shuttingDown) {
|
|
106
|
+
return;
|
|
107
|
+
}
|
|
108
|
+
shuttingDown = true;
|
|
109
|
+
log.appStop({ reason: signal || 'shutdown' });
|
|
110
|
+
try {
|
|
111
|
+
await state.server?.stopMcp();
|
|
112
|
+
} catch (err) {
|
|
113
|
+
log.error('shutdown.error', { error: String(err) });
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
async function main(): Promise<void> {
|
|
118
|
+
const opts = parseArgs(process.argv.slice(2));
|
|
119
|
+
if (opts.help === 'true') {
|
|
120
|
+
printHelp();
|
|
121
|
+
return;
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
applyCliEnv(opts);
|
|
125
|
+
const cfg = getCreatioClientConfig();
|
|
126
|
+
|
|
127
|
+
if (cfg.auth.kind === AuthProviderType.OAuth2Code) {
|
|
128
|
+
throw new Error(
|
|
129
|
+
'oauth2_code_requires_http_server: use "npm start" (HTTP /mcp mode) for OAuth2 authorization-code flow',
|
|
130
|
+
);
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
const provider = new CreatioServiceContext(cfg);
|
|
134
|
+
const engines = new CreatioEngineManager(provider);
|
|
135
|
+
const server = new Server(engines, { readonlyMode: envBool('READONLY_MODE', false) });
|
|
136
|
+
const state: RuntimeState = { server };
|
|
137
|
+
|
|
138
|
+
process.on('SIGINT', () => {
|
|
139
|
+
void shutdown('SIGINT', state).finally(() => process.exit(0));
|
|
140
|
+
});
|
|
141
|
+
process.on('SIGTERM', () => {
|
|
142
|
+
void shutdown('SIGTERM', state).finally(() => process.exit(0));
|
|
143
|
+
});
|
|
144
|
+
|
|
145
|
+
log.appStart({
|
|
146
|
+
env: {
|
|
147
|
+
node: process.version,
|
|
148
|
+
transport: 'stdio',
|
|
149
|
+
},
|
|
150
|
+
});
|
|
151
|
+
|
|
152
|
+
await startStdio(server);
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
main().catch((err) => {
|
|
156
|
+
log.error('startup.error', { error: String(err) });
|
|
157
|
+
process.exit(1);
|
|
158
|
+
});
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
import {
|
|
2
|
+
AuthProviderType,
|
|
3
|
+
CreatioClientAuthConfig,
|
|
4
|
+
CreatioClientConfig,
|
|
5
|
+
LegacyAuthConfig,
|
|
6
|
+
OAuth2AuthConfig,
|
|
7
|
+
OAuth2CodeAuthConfig,
|
|
8
|
+
} from './creatio';
|
|
9
|
+
import { env } from './utils';
|
|
10
|
+
|
|
11
|
+
function getCreatioClientAuthConfig(): CreatioClientAuthConfig {
|
|
12
|
+
const codeConf = _getOAuth2CodeAuthConfig();
|
|
13
|
+
if (codeConf) {
|
|
14
|
+
return codeConf;
|
|
15
|
+
}
|
|
16
|
+
const oauth2Conf = _getOAuth2AuthConfig();
|
|
17
|
+
if (oauth2Conf) {
|
|
18
|
+
return oauth2Conf;
|
|
19
|
+
}
|
|
20
|
+
const legacyConf = _getLegacyAuthConfig();
|
|
21
|
+
if (legacyConf) {
|
|
22
|
+
return legacyConf;
|
|
23
|
+
}
|
|
24
|
+
throw new Error(
|
|
25
|
+
'You must set either CREATIO_CODE_* (client id, client secret, redirect, scope) or CREATIO_CLIENT_ID/CREATIO_CLIENT_SECRET, or both CREATIO_LOGIN and CREATIO_PASSWORD',
|
|
26
|
+
);
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
function _getOAuth2CodeAuthConfig(): OAuth2CodeAuthConfig | null {
|
|
30
|
+
const codeClientId = env('CREATIO_CODE_CLIENT_ID');
|
|
31
|
+
const codeClientSecret = env('CREATIO_CODE_CLIENT_SECRET');
|
|
32
|
+
const codeRedirectUri = env('CREATIO_CODE_REDIRECT_URI');
|
|
33
|
+
const codeScope = env('CREATIO_CODE_SCOPE');
|
|
34
|
+
if (codeClientId && codeClientSecret && codeRedirectUri && codeScope) {
|
|
35
|
+
return {
|
|
36
|
+
kind: AuthProviderType.OAuth2Code,
|
|
37
|
+
clientId: codeClientId,
|
|
38
|
+
clientSecret: codeClientSecret,
|
|
39
|
+
redirectUri: codeRedirectUri,
|
|
40
|
+
scope: codeScope,
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
return null;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
function _getOAuth2AuthConfig(): OAuth2AuthConfig | null {
|
|
47
|
+
const clientId = env('CREATIO_CLIENT_ID');
|
|
48
|
+
const clientSecret = env('CREATIO_CLIENT_SECRET');
|
|
49
|
+
if (clientId && clientSecret) {
|
|
50
|
+
const conf: OAuth2AuthConfig = { kind: AuthProviderType.OAuth2, clientId, clientSecret };
|
|
51
|
+
const idb = env('CREATIO_ID_BASE_URL');
|
|
52
|
+
if (idb) {
|
|
53
|
+
conf.idBaseUrl = idb;
|
|
54
|
+
}
|
|
55
|
+
return conf;
|
|
56
|
+
}
|
|
57
|
+
return null;
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
function _getLegacyAuthConfig(): LegacyAuthConfig | null {
|
|
61
|
+
const login = env('CREATIO_LOGIN');
|
|
62
|
+
const password = env('CREATIO_PASSWORD');
|
|
63
|
+
if (login && password) {
|
|
64
|
+
return { kind: AuthProviderType.Legacy, login, password };
|
|
65
|
+
}
|
|
66
|
+
return null;
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
export function getCreatioClientConfig(): CreatioClientConfig {
|
|
70
|
+
const baseUrl = env('CREATIO_BASE_URL');
|
|
71
|
+
if (!baseUrl) {
|
|
72
|
+
throw new Error('Environment variable CREATIO_BASE_URL is required but not set');
|
|
73
|
+
}
|
|
74
|
+
const auth = getCreatioClientAuthConfig();
|
|
75
|
+
return { baseUrl, auth };
|
|
76
|
+
}
|
package/src/consts.ts
ADDED
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { CreatioClientConfig } from '../client-config';
|
|
2
|
+
|
|
3
|
+
import { ICreatioAuthProvider } from './auth';
|
|
4
|
+
import { AuthProviderType, LegacyProvider, OAuth2CodeProvider, OAuth2Provider } from './providers';
|
|
5
|
+
|
|
6
|
+
export class CreatioAuthManager {
|
|
7
|
+
private readonly _config: CreatioClientConfig;
|
|
8
|
+
private readonly _provider: ICreatioAuthProvider;
|
|
9
|
+
|
|
10
|
+
constructor(config: CreatioClientConfig) {
|
|
11
|
+
this._config = config;
|
|
12
|
+
const authKind = this._config.auth.kind;
|
|
13
|
+
if (authKind === AuthProviderType.OAuth2) {
|
|
14
|
+
this._provider = new OAuth2Provider(this._config);
|
|
15
|
+
} else if (authKind === AuthProviderType.OAuth2Code) {
|
|
16
|
+
this._provider = new OAuth2CodeProvider(this._config);
|
|
17
|
+
} else if (authKind === AuthProviderType.Legacy) {
|
|
18
|
+
this._provider = new LegacyProvider(this._config);
|
|
19
|
+
} else {
|
|
20
|
+
throw new Error('unsupported_auth_config');
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
public getProvider(): ICreatioAuthProvider {
|
|
25
|
+
return this._provider;
|
|
26
|
+
}
|
|
27
|
+
}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { AuthProviderType } from './providers';
|
|
2
|
+
|
|
3
|
+
export interface ICreatioAuthProvider {
|
|
4
|
+
type: AuthProviderType;
|
|
5
|
+
getHeaders(accept: string, isJson?: boolean): Promise<Record<string, string>>;
|
|
6
|
+
refresh(): Promise<void>;
|
|
7
|
+
revoke(): Promise<void>;
|
|
8
|
+
getAuthorizeUrl(state: string): Promise<string>;
|
|
9
|
+
finishAuthorization(code: string): Promise<void>;
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
export function buildHeaders(
|
|
13
|
+
accept: string,
|
|
14
|
+
isJson?: boolean,
|
|
15
|
+
token?: string,
|
|
16
|
+
): Record<string, string> {
|
|
17
|
+
const headers: Record<string, string> = { Accept: accept };
|
|
18
|
+
if (isJson) {
|
|
19
|
+
headers['Content-Type'] = 'application/json';
|
|
20
|
+
}
|
|
21
|
+
if (token) {
|
|
22
|
+
headers['Authorization'] = `Bearer ${token}`;
|
|
23
|
+
}
|
|
24
|
+
return headers;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
export const TOKEN_ENDPOINT = '/connect/token';
|
|
28
|
+
export const AUTHORIZE_ENDPOINT = '/connect/authorize';
|
|
29
|
+
export const REVOCATION_ENDPOINT = '/connect/revocation';
|
|
30
|
+
export const TOKEN_BODY_SNIPPET_MAX = 1024;
|
|
31
|
+
export const EXPIRES_MARGIN_SECONDS = 30;
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import { OAuth2AuthConfig, OAuth2CodeAuthConfig } from '../../client-config';
|
|
2
|
+
import { EXPIRES_MARGIN_SECONDS, buildHeaders } from '../auth';
|
|
3
|
+
|
|
4
|
+
import { BaseProvider } from './base-provider';
|
|
5
|
+
|
|
6
|
+
type OAuthConfig = OAuth2AuthConfig | OAuth2CodeAuthConfig;
|
|
7
|
+
|
|
8
|
+
export abstract class BaseOAuth2Provider<
|
|
9
|
+
T extends OAuthConfig = OAuthConfig,
|
|
10
|
+
> extends BaseProvider<T> {
|
|
11
|
+
protected abstract readonly authErrorCode: string;
|
|
12
|
+
|
|
13
|
+
protected accessToken: string | undefined;
|
|
14
|
+
|
|
15
|
+
protected accessTokenExpiryMs: number | undefined;
|
|
16
|
+
|
|
17
|
+
protected abstract ensureAccessToken(force?: boolean): Promise<string | undefined>;
|
|
18
|
+
|
|
19
|
+
protected computeExpiryMs(expiresInSeconds: number, minSeconds: number = 1): number {
|
|
20
|
+
return Date.now() + Math.max(minSeconds, expiresInSeconds - EXPIRES_MARGIN_SECONDS) * 1000;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
protected getIdentityBase(): string {
|
|
24
|
+
if (this.authConfig.idBaseUrl) {
|
|
25
|
+
let base = String(this.authConfig.idBaseUrl).replace(/\/$/, '');
|
|
26
|
+
if (!/\/0$/.test(base)) {
|
|
27
|
+
base = base + '/0';
|
|
28
|
+
}
|
|
29
|
+
return base;
|
|
30
|
+
}
|
|
31
|
+
let base = this.config.baseUrl.replace(/\/$/, '');
|
|
32
|
+
if (!/\/0$/.test(base)) {
|
|
33
|
+
base = base + '/0';
|
|
34
|
+
}
|
|
35
|
+
return base;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
protected storageKey(userKey: string): string {
|
|
39
|
+
const base = this.getIdentityBase();
|
|
40
|
+
const kind = (this.config as any)?.auth?.kind ?? 'unknown';
|
|
41
|
+
const clientId = (this.config as any)?.auth?.clientId ?? 'noclient';
|
|
42
|
+
return `${kind}|${base}|${clientId}|${userKey}`;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
protected throwNoTokenError(): void {
|
|
46
|
+
throw new Error(this.authErrorCode);
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
public async getHeaders(accept: string, isJson?: boolean): Promise<Record<string, string>> {
|
|
50
|
+
const token = await this.ensureAccessToken(false);
|
|
51
|
+
if (!token) {
|
|
52
|
+
this.throwNoTokenError();
|
|
53
|
+
}
|
|
54
|
+
return buildHeaders(accept, Boolean(isJson), token);
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
public async refresh(): Promise<void> {
|
|
58
|
+
this.accessToken = undefined;
|
|
59
|
+
this.accessTokenExpiryMs = undefined;
|
|
60
|
+
await this.ensureAccessToken(true);
|
|
61
|
+
}
|
|
62
|
+
}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { CreatioClientAuthConfig, CreatioClientConfig } from '../../client-config';
|
|
2
|
+
import { ICreatioAuthProvider } from '../auth';
|
|
3
|
+
|
|
4
|
+
import { AuthProviderType } from './type';
|
|
5
|
+
|
|
6
|
+
export abstract class BaseProvider<
|
|
7
|
+
T extends CreatioClientAuthConfig = CreatioClientAuthConfig,
|
|
8
|
+
> implements ICreatioAuthProvider {
|
|
9
|
+
protected readonly config: CreatioClientConfig;
|
|
10
|
+
|
|
11
|
+
protected get authConfig(): T {
|
|
12
|
+
return this.config.auth as T;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
public get type(): AuthProviderType {
|
|
16
|
+
return this.authConfig.kind;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
constructor(config: CreatioClientConfig) {
|
|
20
|
+
this.config = config;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
public getHeaders(accept: string, isJson?: boolean): Promise<Record<string, string>> {
|
|
24
|
+
throw new Error('Method not implemented.');
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
public refresh(): Promise<void> {
|
|
28
|
+
throw new Error('Method not implemented.');
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
public revoke(): Promise<void> {
|
|
32
|
+
throw new Error('Method not implemented.');
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
public getAuthorizeUrl(state: string): Promise<string> {
|
|
36
|
+
throw new Error('Method not implemented.');
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
public finishAuthorization(code: string): Promise<void> {
|
|
40
|
+
throw new Error('Method not implemented.');
|
|
41
|
+
}
|
|
42
|
+
}
|