mcp-creatio 0.3.10 → 0.4.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (225) hide show
  1. package/README.md +117 -108
  2. package/dist/cli.d.ts +5 -0
  3. package/dist/cli.d.ts.map +1 -1
  4. package/dist/cli.js +18 -11
  5. package/dist/cli.js.map +1 -1
  6. package/dist/creatio/auth/auth.d.ts +2 -0
  7. package/dist/creatio/auth/auth.d.ts.map +1 -1
  8. package/dist/creatio/auth/auth.js.map +1 -1
  9. package/dist/creatio/auth/providers/base-provider.d.ts +1 -0
  10. package/dist/creatio/auth/providers/base-provider.d.ts.map +1 -1
  11. package/dist/creatio/auth/providers/base-provider.js +3 -0
  12. package/dist/creatio/auth/providers/base-provider.js.map +1 -1
  13. package/dist/creatio/auth/providers/oauth2-code-provider.d.ts +3 -0
  14. package/dist/creatio/auth/providers/oauth2-code-provider.d.ts.map +1 -1
  15. package/dist/creatio/auth/providers/oauth2-code-provider.js +30 -24
  16. package/dist/creatio/auth/providers/oauth2-code-provider.js.map +1 -1
  17. package/dist/creatio/engines/admin-operation/admin-operation-engine.d.ts +13 -0
  18. package/dist/creatio/engines/admin-operation/admin-operation-engine.d.ts.map +1 -0
  19. package/dist/creatio/engines/admin-operation/admin-operation-engine.js +27 -0
  20. package/dist/creatio/engines/admin-operation/admin-operation-engine.js.map +1 -0
  21. package/dist/creatio/engines/configuration/configuration-engine.d.ts +10 -0
  22. package/dist/creatio/engines/configuration/configuration-engine.d.ts.map +1 -0
  23. package/dist/creatio/engines/configuration/configuration-engine.js +18 -0
  24. package/dist/creatio/engines/configuration/configuration-engine.js.map +1 -0
  25. package/dist/creatio/engines/engine-manager.d.ts +13 -1
  26. package/dist/creatio/engines/engine-manager.d.ts.map +1 -1
  27. package/dist/creatio/engines/engine-manager.js +17 -0
  28. package/dist/creatio/engines/engine-manager.js.map +1 -1
  29. package/dist/creatio/engines/engine-registry.d.ts +3 -0
  30. package/dist/creatio/engines/engine-registry.d.ts.map +1 -1
  31. package/dist/creatio/engines/engine-registry.js +3 -0
  32. package/dist/creatio/engines/engine-registry.js.map +1 -1
  33. package/dist/creatio/engines/feature/feature-engine.d.ts +10 -0
  34. package/dist/creatio/engines/feature/feature-engine.d.ts.map +1 -0
  35. package/dist/creatio/engines/feature/feature-engine.js +18 -0
  36. package/dist/creatio/engines/feature/feature-engine.js.map +1 -0
  37. package/dist/creatio/engines/index.d.ts +3 -0
  38. package/dist/creatio/engines/index.d.ts.map +1 -1
  39. package/dist/creatio/engines/index.js +3 -0
  40. package/dist/creatio/engines/index.js.map +1 -1
  41. package/dist/creatio/provider-context.d.ts +4 -1
  42. package/dist/creatio/provider-context.d.ts.map +1 -1
  43. package/dist/creatio/providers/admin-operation-provider.d.ts +27 -0
  44. package/dist/creatio/providers/admin-operation-provider.d.ts.map +1 -0
  45. package/dist/creatio/providers/admin-operation-provider.js +3 -0
  46. package/dist/creatio/providers/admin-operation-provider.js.map +1 -0
  47. package/dist/creatio/providers/configuration-provider.d.ts +19 -0
  48. package/dist/creatio/providers/configuration-provider.d.ts.map +1 -0
  49. package/dist/creatio/providers/configuration-provider.js +3 -0
  50. package/dist/creatio/providers/configuration-provider.js.map +1 -0
  51. package/dist/creatio/providers/feature-provider.d.ts +10 -0
  52. package/dist/creatio/providers/feature-provider.d.ts.map +1 -0
  53. package/dist/creatio/providers/feature-provider.js +3 -0
  54. package/dist/creatio/providers/feature-provider.js.map +1 -0
  55. package/dist/creatio/providers/index.d.ts +3 -0
  56. package/dist/creatio/providers/index.d.ts.map +1 -1
  57. package/dist/creatio/providers/index.js +3 -0
  58. package/dist/creatio/providers/index.js.map +1 -1
  59. package/dist/creatio/services/admin-operation-service-provider.d.ts +15 -0
  60. package/dist/creatio/services/admin-operation-service-provider.d.ts.map +1 -0
  61. package/dist/creatio/services/admin-operation-service-provider.js +69 -0
  62. package/dist/creatio/services/admin-operation-service-provider.js.map +1 -0
  63. package/dist/creatio/services/configuration-service-provider.d.ts +14 -0
  64. package/dist/creatio/services/configuration-service-provider.d.ts.map +1 -0
  65. package/dist/creatio/services/configuration-service-provider.js +90 -0
  66. package/dist/creatio/services/configuration-service-provider.js.map +1 -0
  67. package/dist/creatio/services/creatio-service-context.d.ts +4 -1
  68. package/dist/creatio/services/creatio-service-context.d.ts.map +1 -1
  69. package/dist/creatio/services/creatio-service-context.js +9 -0
  70. package/dist/creatio/services/creatio-service-context.js.map +1 -1
  71. package/dist/creatio/services/feature-service-provider.d.ts +10 -0
  72. package/dist/creatio/services/feature-service-provider.d.ts.map +1 -0
  73. package/dist/creatio/services/feature-service-provider.js +43 -0
  74. package/dist/creatio/services/feature-service-provider.js.map +1 -0
  75. package/dist/creatio/services/http-client.d.ts.map +1 -1
  76. package/dist/creatio/services/http-client.js +0 -1
  77. package/dist/creatio/services/http-client.js.map +1 -1
  78. package/dist/creatio/services/index.d.ts +3 -0
  79. package/dist/creatio/services/index.d.ts.map +1 -1
  80. package/dist/creatio/services/index.js +3 -0
  81. package/dist/creatio/services/index.js.map +1 -1
  82. package/dist/creatio/services/metadata-store.d.ts +5 -0
  83. package/dist/creatio/services/metadata-store.d.ts.map +1 -1
  84. package/dist/creatio/services/metadata-store.js +18 -6
  85. package/dist/creatio/services/metadata-store.js.map +1 -1
  86. package/dist/creatio/services/odata-crud-provider.d.ts +2 -0
  87. package/dist/creatio/services/odata-crud-provider.d.ts.map +1 -1
  88. package/dist/creatio/services/odata-crud-provider.js +10 -1
  89. package/dist/creatio/services/odata-crud-provider.js.map +1 -1
  90. package/dist/server/http/creatio-oauth-handlers.d.ts +0 -1
  91. package/dist/server/http/creatio-oauth-handlers.d.ts.map +1 -1
  92. package/dist/server/http/creatio-oauth-handlers.js +30 -23
  93. package/dist/server/http/creatio-oauth-handlers.js.map +1 -1
  94. package/dist/server/http/httpServer.d.ts +9 -0
  95. package/dist/server/http/httpServer.d.ts.map +1 -1
  96. package/dist/server/http/httpServer.js +34 -11
  97. package/dist/server/http/httpServer.js.map +1 -1
  98. package/dist/server/http/mcp-handlers.d.ts.map +1 -1
  99. package/dist/server/http/mcp-handlers.js +4 -1
  100. package/dist/server/http/mcp-handlers.js.map +1 -1
  101. package/dist/server/http/mcp-oauth-handlers.d.ts.map +1 -1
  102. package/dist/server/http/mcp-oauth-handlers.js +18 -6
  103. package/dist/server/http/mcp-oauth-handlers.js.map +1 -1
  104. package/dist/server/http/middleware.d.ts +7 -0
  105. package/dist/server/http/middleware.d.ts.map +1 -1
  106. package/dist/server/http/middleware.js +23 -0
  107. package/dist/server/http/middleware.js.map +1 -1
  108. package/dist/server/http/rate-limiter.d.ts +24 -0
  109. package/dist/server/http/rate-limiter.d.ts.map +1 -0
  110. package/dist/server/http/rate-limiter.js +42 -0
  111. package/dist/server/http/rate-limiter.js.map +1 -0
  112. package/dist/server/mcp/prompts-data.d.ts +58 -0
  113. package/dist/server/mcp/prompts-data.d.ts.map +1 -1
  114. package/dist/server/mcp/prompts-data.js +391 -1
  115. package/dist/server/mcp/prompts-data.js.map +1 -1
  116. package/dist/server/mcp/server.d.ts.map +1 -1
  117. package/dist/server/mcp/server.js +69 -0
  118. package/dist/server/mcp/server.js.map +1 -1
  119. package/dist/server/mcp/tools-data.d.ts +63 -0
  120. package/dist/server/mcp/tools-data.d.ts.map +1 -1
  121. package/dist/server/mcp/tools-data.js +110 -5
  122. package/dist/server/mcp/tools-data.js.map +1 -1
  123. package/dist/server/oauth/oauth-server.d.ts +0 -1
  124. package/dist/server/oauth/oauth-server.d.ts.map +1 -1
  125. package/dist/server/oauth/oauth-server.js +11 -21
  126. package/dist/server/oauth/oauth-server.js.map +1 -1
  127. package/dist/server/oauth/storage.d.ts +0 -2
  128. package/dist/server/oauth/storage.d.ts.map +1 -1
  129. package/dist/server/oauth/storage.js +0 -6
  130. package/dist/server/oauth/storage.js.map +1 -1
  131. package/dist/server/oauth/validators.d.ts +6 -0
  132. package/dist/server/oauth/validators.d.ts.map +1 -1
  133. package/dist/server/oauth/validators.js +28 -0
  134. package/dist/server/oauth/validators.js.map +1 -1
  135. package/dist/services/session-context.d.ts +8 -7
  136. package/dist/services/session-context.d.ts.map +1 -1
  137. package/dist/services/session-context.js +7 -27
  138. package/dist/services/session-context.js.map +1 -1
  139. package/package.json +19 -10
  140. package/.dockerignore +0 -12
  141. package/.editorconfig +0 -14
  142. package/.eslintrc.cjs +0 -18
  143. package/.gitattributes +0 -8
  144. package/.github/workflows/docker-publish.yml +0 -50
  145. package/.prettierignore +0 -3
  146. package/.prettierrc +0 -9
  147. package/.vscode/launch.json +0 -23
  148. package/.vscode/mcp.json +0 -13
  149. package/.vscode/settings.json +0 -16
  150. package/Agent.md +0 -187
  151. package/Debug.md +0 -32
  152. package/Dockerfile +0 -23
  153. package/docs/coding-style.md +0 -30
  154. package/eslint.config.cjs +0 -95
  155. package/src/cli.ts +0 -162
  156. package/src/config-builder.ts +0 -76
  157. package/src/consts.ts +0 -3
  158. package/src/creatio/auth/auth-manager.ts +0 -27
  159. package/src/creatio/auth/auth.ts +0 -31
  160. package/src/creatio/auth/index.ts +0 -3
  161. package/src/creatio/auth/providers/base-oauth2-provider.ts +0 -62
  162. package/src/creatio/auth/providers/base-provider.ts +0 -42
  163. package/src/creatio/auth/providers/index.ts +0 -4
  164. package/src/creatio/auth/providers/legacy-provider.ts +0 -70
  165. package/src/creatio/auth/providers/oauth2-code-provider.ts +0 -252
  166. package/src/creatio/auth/providers/oauth2-provider.ts +0 -91
  167. package/src/creatio/auth/providers/type.ts +0 -5
  168. package/src/creatio/client-config.ts +0 -34
  169. package/src/creatio/engines/crud/crud-engine.ts +0 -47
  170. package/src/creatio/engines/engine-manager.ts +0 -102
  171. package/src/creatio/engines/engine-registry.ts +0 -36
  172. package/src/creatio/engines/engine.ts +0 -3
  173. package/src/creatio/engines/index.ts +0 -7
  174. package/src/creatio/engines/process/process-engine.ts +0 -20
  175. package/src/creatio/engines/sys-settings/sys-settings-engine.ts +0 -41
  176. package/src/creatio/engines/user/user-engine.ts +0 -20
  177. package/src/creatio/index.ts +0 -6
  178. package/src/creatio/provider-context.ts +0 -10
  179. package/src/creatio/providers/crud-provider.ts +0 -45
  180. package/src/creatio/providers/index.ts +0 -4
  181. package/src/creatio/providers/process-provider.ts +0 -15
  182. package/src/creatio/providers/sys-settings-provider.ts +0 -63
  183. package/src/creatio/providers/user-provider.ts +0 -12
  184. package/src/creatio/services/creatio-service-context.ts +0 -38
  185. package/src/creatio/services/http-client.ts +0 -174
  186. package/src/creatio/services/index.ts +0 -7
  187. package/src/creatio/services/metadata-store.ts +0 -181
  188. package/src/creatio/services/odata-crud-provider.ts +0 -210
  189. package/src/creatio/services/process-service-provider.ts +0 -76
  190. package/src/creatio/services/sys-settings-service-provider.ts +0 -192
  191. package/src/creatio/services/user-info-provider.ts +0 -41
  192. package/src/index.ts +0 -44
  193. package/src/log.ts +0 -183
  194. package/src/server/http/creatio-oauth-handlers.ts +0 -146
  195. package/src/server/http/httpServer.ts +0 -150
  196. package/src/server/http/index.ts +0 -5
  197. package/src/server/http/mcp-handlers.ts +0 -92
  198. package/src/server/http/mcp-oauth-handlers.ts +0 -108
  199. package/src/server/http/middleware.ts +0 -91
  200. package/src/server/index.ts +0 -2
  201. package/src/server/mcp/filters.ts +0 -97
  202. package/src/server/mcp/index.ts +0 -1
  203. package/src/server/mcp/prompts-data.ts +0 -896
  204. package/src/server/mcp/server.ts +0 -331
  205. package/src/server/mcp/tools-data.ts +0 -592
  206. package/src/server/oauth/client-manager.ts +0 -47
  207. package/src/server/oauth/index.ts +0 -6
  208. package/src/server/oauth/oauth-server.ts +0 -185
  209. package/src/server/oauth/storage.ts +0 -106
  210. package/src/server/oauth/token-manager.ts +0 -80
  211. package/src/server/oauth/types.ts +0 -55
  212. package/src/server/oauth/validators.ts +0 -56
  213. package/src/services/index.ts +0 -2
  214. package/src/services/session-context.ts +0 -232
  215. package/src/services/token-refresh-scheduler.ts +0 -68
  216. package/src/types/index.ts +0 -1
  217. package/src/types/network.ts +0 -7
  218. package/src/utils/context.ts +0 -49
  219. package/src/utils/env.ts +0 -12
  220. package/src/utils/index.ts +0 -5
  221. package/src/utils/mcp.ts +0 -8
  222. package/src/utils/network.ts +0 -65
  223. package/src/utils/pkce.ts +0 -39
  224. package/src/version.ts +0 -15
  225. package/tsconfig.json +0 -28
package/eslint.config.cjs DELETED
@@ -1,95 +0,0 @@
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/src/cli.ts DELETED
@@ -1,162 +0,0 @@
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
- --log-level <silent|error|warn|info>
34
- Log verbosity (default: silent)
35
- -h, --help Show this help
36
-
37
- Examples:
38
- mcp-creatio --base-url https://tenant.creatio.com --login your_login --password your_password
39
- `.trim();
40
- process.stdout.write(text + '\n');
41
- }
42
-
43
- function parseArgs(argv: string[]): CliOptions {
44
- const opts: CliOptions = {};
45
- for (let i = 0; i < argv.length; i++) {
46
- const token = argv[i];
47
- if (!token || !token.startsWith('-')) {
48
- continue;
49
- }
50
-
51
- if (token === '--help' || token === '-h') {
52
- opts.help = 'true';
53
- continue;
54
- }
55
-
56
- if (!token.startsWith('--')) {
57
- continue;
58
- }
59
-
60
- const eqIndex = token.indexOf('=');
61
- if (eqIndex > 2) {
62
- const key = token.slice(2, eqIndex);
63
- const value = token.slice(eqIndex + 1);
64
- opts[key] = value;
65
- continue;
66
- }
67
-
68
- const key = token.slice(2);
69
- const next = argv[i + 1];
70
- if (next && !next.startsWith('-')) {
71
- opts[key] = next;
72
- i++;
73
- continue;
74
- }
75
-
76
- opts[key] = 'true';
77
- }
78
- return opts;
79
- }
80
-
81
- function setEnvIfDefined(name: string, value?: string): void {
82
- if (typeof value === 'string' && value.length > 0) {
83
- process.env[name] = value;
84
- }
85
- }
86
-
87
- function applyCliEnv(opts: CliOptions): void {
88
- setEnvIfDefined('CREATIO_BASE_URL', opts['base-url'] || opts.url);
89
- setEnvIfDefined('CREATIO_LOGIN', opts.login);
90
- setEnvIfDefined('CREATIO_PASSWORD', opts.password);
91
- setEnvIfDefined('CREATIO_CLIENT_ID', opts['client-id']);
92
- setEnvIfDefined('CREATIO_CLIENT_SECRET', opts['client-secret']);
93
- setEnvIfDefined('CREATIO_ID_BASE_URL', opts['id-base-url']);
94
- setEnvIfDefined('READONLY_MODE', opts.readonly);
95
- setEnvIfDefined('MCP_CREATIO_LOG_LEVEL', opts['log-level']);
96
- }
97
-
98
- async function startStdio(server: Server): Promise<void> {
99
- const mcp = await server.startMcp();
100
- const transport = new StdioServerTransport();
101
- await mcp.connect(transport);
102
- log.info('stdio.server.start');
103
- }
104
-
105
- let shuttingDown = false;
106
-
107
- async function shutdown(signal: string, state: RuntimeState): Promise<void> {
108
- if (shuttingDown) {
109
- return;
110
- }
111
- shuttingDown = true;
112
- log.appStop({ reason: signal || 'shutdown' });
113
- try {
114
- await state.server?.stopMcp();
115
- } catch (err) {
116
- log.error('shutdown.error', { error: String(err) });
117
- }
118
- }
119
-
120
- async function main(): Promise<void> {
121
- const opts = parseArgs(process.argv.slice(2));
122
- if (opts.help === 'true') {
123
- printHelp();
124
- return;
125
- }
126
-
127
- log.useStderrOnlyLogs();
128
- applyCliEnv(opts);
129
- const cfg = getCreatioClientConfig();
130
-
131
- if (cfg.auth.kind === AuthProviderType.OAuth2Code) {
132
- throw new Error(
133
- 'oauth2_code_requires_http_server: use "npm start" (HTTP /mcp mode) for OAuth2 authorization-code flow',
134
- );
135
- }
136
-
137
- const provider = new CreatioServiceContext(cfg);
138
- const engines = new CreatioEngineManager(provider);
139
- const server = new Server(engines, { readonlyMode: envBool('READONLY_MODE', false) });
140
- const state: RuntimeState = { server };
141
-
142
- process.on('SIGINT', () => {
143
- void shutdown('SIGINT', state).finally(() => process.exit(0));
144
- });
145
- process.on('SIGTERM', () => {
146
- void shutdown('SIGTERM', state).finally(() => process.exit(0));
147
- });
148
-
149
- log.appStart({
150
- env: {
151
- node: process.version,
152
- transport: 'stdio',
153
- },
154
- });
155
-
156
- await startStdio(server);
157
- }
158
-
159
- main().catch((err) => {
160
- log.error('startup.error', { error: String(err) });
161
- process.exit(1);
162
- });
@@ -1,76 +0,0 @@
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 DELETED
@@ -1,3 +0,0 @@
1
- import { env } from './utils';
2
-
3
- export const HTTP_MCP_PORT = Number(env('PORT')) || 3000;
@@ -1,27 +0,0 @@
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
- }
@@ -1,31 +0,0 @@
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;
@@ -1,3 +0,0 @@
1
- export * from './auth-manager';
2
- export type { ICreatioAuthProvider } from './auth';
3
- export { AuthProviderType } from './providers/type';
@@ -1,62 +0,0 @@
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
- }
@@ -1,42 +0,0 @@
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
- }
@@ -1,4 +0,0 @@
1
- export * from './legacy-provider';
2
- export * from './oauth2-provider';
3
- export * from './oauth2-code-provider';
4
- export * from './type';
@@ -1,70 +0,0 @@
1
- import log from '../../../log';
2
- import { JSON_ACCEPT } from '../../../types';
3
- import { parseSetCookie } from '../../../utils';
4
- import { LegacyAuthConfig } from '../../client-config';
5
- import { buildHeaders } from '../auth';
6
-
7
- import { BaseProvider } from './base-provider';
8
-
9
- export class LegacyProvider extends BaseProvider<LegacyAuthConfig> {
10
- private _bpmCsrf: string | undefined;
11
-
12
- private _cookieHeader: string | undefined;
13
-
14
- private async _ensureSession() {
15
- if (this._cookieHeader) {
16
- return;
17
- }
18
- const url = `${this.config.baseUrl.replace(/\/$/, '')}/ServiceModel/AuthService.svc/Login`;
19
- const body = JSON.stringify({
20
- UserName: this.authConfig.login,
21
- UserPassword: this.authConfig.password,
22
- });
23
- log.creatioAuthStart(this.config.baseUrl, 'legacy');
24
- const res = await fetch(url, {
25
- method: 'POST',
26
- headers: buildHeaders(JSON_ACCEPT, true),
27
- body,
28
- redirect: 'manual',
29
- });
30
- if (!res.ok) {
31
- const responseText = await res.text().catch(() => '');
32
- log.creatioAuthFailed(this.config.baseUrl, `${res.status} ${responseText}`, 'legacy');
33
- throw new Error(`auth_failed:${res.status} ${responseText}`);
34
- }
35
- log.creatioAuthOk(this.config.baseUrl, 'legacy');
36
- let setCookie: string[] = [];
37
- if (typeof (res.headers as any).getSetCookie === 'function') {
38
- setCookie = (res.headers as any).getSetCookie();
39
- } else if ((res.headers as any).raw && (res.headers as any).raw()['set-cookie']) {
40
- setCookie = (res.headers as any).raw()['set-cookie'];
41
- } else {
42
- setCookie = [];
43
- }
44
- const pairs = parseSetCookie(setCookie);
45
- if (!pairs.length) {
46
- throw new Error('auth_failed:no_set_cookie');
47
- }
48
- this._cookieHeader = pairs.map((c) => `${c.name}=${c.value}`).join('; ');
49
- const csrf = pairs.find((c) => c.name.toUpperCase() === 'BPMCSRF')?.value;
50
- if (csrf) {
51
- this._bpmCsrf = csrf;
52
- }
53
- }
54
-
55
- public async getHeaders(accept: string, isJson?: boolean): Promise<Record<string, string>> {
56
- await this._ensureSession();
57
- const h = buildHeaders(accept, Boolean(isJson));
58
- h['ForceUseSession'] = 'true';
59
- h['Cookie'] = this._cookieHeader!;
60
- if (this._bpmCsrf) {
61
- h['BPMCSRF'] = this._bpmCsrf;
62
- }
63
- return h;
64
- }
65
-
66
- public async refresh(): Promise<void> {
67
- this._cookieHeader = undefined;
68
- await this._ensureSession();
69
- }
70
- }