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.
- package/README.md +117 -108
- package/dist/cli.d.ts +5 -0
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +18 -11
- package/dist/cli.js.map +1 -1
- package/dist/creatio/auth/auth.d.ts +2 -0
- package/dist/creatio/auth/auth.d.ts.map +1 -1
- package/dist/creatio/auth/auth.js.map +1 -1
- package/dist/creatio/auth/providers/base-provider.d.ts +1 -0
- package/dist/creatio/auth/providers/base-provider.d.ts.map +1 -1
- package/dist/creatio/auth/providers/base-provider.js +3 -0
- package/dist/creatio/auth/providers/base-provider.js.map +1 -1
- package/dist/creatio/auth/providers/oauth2-code-provider.d.ts +3 -0
- package/dist/creatio/auth/providers/oauth2-code-provider.d.ts.map +1 -1
- package/dist/creatio/auth/providers/oauth2-code-provider.js +30 -24
- package/dist/creatio/auth/providers/oauth2-code-provider.js.map +1 -1
- package/dist/creatio/engines/admin-operation/admin-operation-engine.d.ts +13 -0
- package/dist/creatio/engines/admin-operation/admin-operation-engine.d.ts.map +1 -0
- package/dist/creatio/engines/admin-operation/admin-operation-engine.js +27 -0
- package/dist/creatio/engines/admin-operation/admin-operation-engine.js.map +1 -0
- package/dist/creatio/engines/configuration/configuration-engine.d.ts +10 -0
- package/dist/creatio/engines/configuration/configuration-engine.d.ts.map +1 -0
- package/dist/creatio/engines/configuration/configuration-engine.js +18 -0
- package/dist/creatio/engines/configuration/configuration-engine.js.map +1 -0
- package/dist/creatio/engines/engine-manager.d.ts +13 -1
- package/dist/creatio/engines/engine-manager.d.ts.map +1 -1
- package/dist/creatio/engines/engine-manager.js +17 -0
- package/dist/creatio/engines/engine-manager.js.map +1 -1
- package/dist/creatio/engines/engine-registry.d.ts +3 -0
- package/dist/creatio/engines/engine-registry.d.ts.map +1 -1
- package/dist/creatio/engines/engine-registry.js +3 -0
- package/dist/creatio/engines/engine-registry.js.map +1 -1
- package/dist/creatio/engines/feature/feature-engine.d.ts +10 -0
- package/dist/creatio/engines/feature/feature-engine.d.ts.map +1 -0
- package/dist/creatio/engines/feature/feature-engine.js +18 -0
- package/dist/creatio/engines/feature/feature-engine.js.map +1 -0
- package/dist/creatio/engines/index.d.ts +3 -0
- package/dist/creatio/engines/index.d.ts.map +1 -1
- package/dist/creatio/engines/index.js +3 -0
- package/dist/creatio/engines/index.js.map +1 -1
- package/dist/creatio/provider-context.d.ts +4 -1
- package/dist/creatio/provider-context.d.ts.map +1 -1
- package/dist/creatio/providers/admin-operation-provider.d.ts +27 -0
- package/dist/creatio/providers/admin-operation-provider.d.ts.map +1 -0
- package/dist/creatio/providers/admin-operation-provider.js +3 -0
- package/dist/creatio/providers/admin-operation-provider.js.map +1 -0
- package/dist/creatio/providers/configuration-provider.d.ts +19 -0
- package/dist/creatio/providers/configuration-provider.d.ts.map +1 -0
- package/dist/creatio/providers/configuration-provider.js +3 -0
- package/dist/creatio/providers/configuration-provider.js.map +1 -0
- package/dist/creatio/providers/feature-provider.d.ts +10 -0
- package/dist/creatio/providers/feature-provider.d.ts.map +1 -0
- package/dist/creatio/providers/feature-provider.js +3 -0
- package/dist/creatio/providers/feature-provider.js.map +1 -0
- package/dist/creatio/providers/index.d.ts +3 -0
- package/dist/creatio/providers/index.d.ts.map +1 -1
- package/dist/creatio/providers/index.js +3 -0
- package/dist/creatio/providers/index.js.map +1 -1
- package/dist/creatio/services/admin-operation-service-provider.d.ts +15 -0
- package/dist/creatio/services/admin-operation-service-provider.d.ts.map +1 -0
- package/dist/creatio/services/admin-operation-service-provider.js +69 -0
- package/dist/creatio/services/admin-operation-service-provider.js.map +1 -0
- package/dist/creatio/services/configuration-service-provider.d.ts +14 -0
- package/dist/creatio/services/configuration-service-provider.d.ts.map +1 -0
- package/dist/creatio/services/configuration-service-provider.js +90 -0
- package/dist/creatio/services/configuration-service-provider.js.map +1 -0
- package/dist/creatio/services/creatio-service-context.d.ts +4 -1
- package/dist/creatio/services/creatio-service-context.d.ts.map +1 -1
- package/dist/creatio/services/creatio-service-context.js +9 -0
- package/dist/creatio/services/creatio-service-context.js.map +1 -1
- package/dist/creatio/services/feature-service-provider.d.ts +10 -0
- package/dist/creatio/services/feature-service-provider.d.ts.map +1 -0
- package/dist/creatio/services/feature-service-provider.js +43 -0
- package/dist/creatio/services/feature-service-provider.js.map +1 -0
- package/dist/creatio/services/http-client.d.ts.map +1 -1
- package/dist/creatio/services/http-client.js +0 -1
- package/dist/creatio/services/http-client.js.map +1 -1
- package/dist/creatio/services/index.d.ts +3 -0
- package/dist/creatio/services/index.d.ts.map +1 -1
- package/dist/creatio/services/index.js +3 -0
- package/dist/creatio/services/index.js.map +1 -1
- package/dist/creatio/services/metadata-store.d.ts +5 -0
- package/dist/creatio/services/metadata-store.d.ts.map +1 -1
- package/dist/creatio/services/metadata-store.js +18 -6
- package/dist/creatio/services/metadata-store.js.map +1 -1
- package/dist/creatio/services/odata-crud-provider.d.ts +2 -0
- package/dist/creatio/services/odata-crud-provider.d.ts.map +1 -1
- package/dist/creatio/services/odata-crud-provider.js +10 -1
- package/dist/creatio/services/odata-crud-provider.js.map +1 -1
- package/dist/server/http/creatio-oauth-handlers.d.ts +0 -1
- package/dist/server/http/creatio-oauth-handlers.d.ts.map +1 -1
- package/dist/server/http/creatio-oauth-handlers.js +30 -23
- package/dist/server/http/creatio-oauth-handlers.js.map +1 -1
- package/dist/server/http/httpServer.d.ts +9 -0
- package/dist/server/http/httpServer.d.ts.map +1 -1
- package/dist/server/http/httpServer.js +34 -11
- package/dist/server/http/httpServer.js.map +1 -1
- package/dist/server/http/mcp-handlers.d.ts.map +1 -1
- package/dist/server/http/mcp-handlers.js +4 -1
- package/dist/server/http/mcp-handlers.js.map +1 -1
- package/dist/server/http/mcp-oauth-handlers.d.ts.map +1 -1
- package/dist/server/http/mcp-oauth-handlers.js +18 -6
- package/dist/server/http/mcp-oauth-handlers.js.map +1 -1
- package/dist/server/http/middleware.d.ts +7 -0
- package/dist/server/http/middleware.d.ts.map +1 -1
- package/dist/server/http/middleware.js +23 -0
- package/dist/server/http/middleware.js.map +1 -1
- package/dist/server/http/rate-limiter.d.ts +24 -0
- package/dist/server/http/rate-limiter.d.ts.map +1 -0
- package/dist/server/http/rate-limiter.js +42 -0
- package/dist/server/http/rate-limiter.js.map +1 -0
- package/dist/server/mcp/prompts-data.d.ts +58 -0
- package/dist/server/mcp/prompts-data.d.ts.map +1 -1
- package/dist/server/mcp/prompts-data.js +391 -1
- package/dist/server/mcp/prompts-data.js.map +1 -1
- package/dist/server/mcp/server.d.ts.map +1 -1
- package/dist/server/mcp/server.js +69 -0
- package/dist/server/mcp/server.js.map +1 -1
- package/dist/server/mcp/tools-data.d.ts +63 -0
- package/dist/server/mcp/tools-data.d.ts.map +1 -1
- package/dist/server/mcp/tools-data.js +110 -5
- package/dist/server/mcp/tools-data.js.map +1 -1
- package/dist/server/oauth/oauth-server.d.ts +0 -1
- package/dist/server/oauth/oauth-server.d.ts.map +1 -1
- package/dist/server/oauth/oauth-server.js +11 -21
- package/dist/server/oauth/oauth-server.js.map +1 -1
- package/dist/server/oauth/storage.d.ts +0 -2
- package/dist/server/oauth/storage.d.ts.map +1 -1
- package/dist/server/oauth/storage.js +0 -6
- package/dist/server/oauth/storage.js.map +1 -1
- package/dist/server/oauth/validators.d.ts +6 -0
- package/dist/server/oauth/validators.d.ts.map +1 -1
- package/dist/server/oauth/validators.js +28 -0
- package/dist/server/oauth/validators.js.map +1 -1
- package/dist/services/session-context.d.ts +8 -7
- package/dist/services/session-context.d.ts.map +1 -1
- package/dist/services/session-context.js +7 -27
- package/dist/services/session-context.js.map +1 -1
- package/package.json +19 -10
- package/.dockerignore +0 -12
- package/.editorconfig +0 -14
- package/.eslintrc.cjs +0 -18
- package/.gitattributes +0 -8
- package/.github/workflows/docker-publish.yml +0 -50
- package/.prettierignore +0 -3
- package/.prettierrc +0 -9
- package/.vscode/launch.json +0 -23
- package/.vscode/mcp.json +0 -13
- package/.vscode/settings.json +0 -16
- package/Agent.md +0 -187
- package/Debug.md +0 -32
- package/Dockerfile +0 -23
- package/docs/coding-style.md +0 -30
- package/eslint.config.cjs +0 -95
- package/src/cli.ts +0 -162
- package/src/config-builder.ts +0 -76
- package/src/consts.ts +0 -3
- package/src/creatio/auth/auth-manager.ts +0 -27
- package/src/creatio/auth/auth.ts +0 -31
- package/src/creatio/auth/index.ts +0 -3
- package/src/creatio/auth/providers/base-oauth2-provider.ts +0 -62
- package/src/creatio/auth/providers/base-provider.ts +0 -42
- package/src/creatio/auth/providers/index.ts +0 -4
- package/src/creatio/auth/providers/legacy-provider.ts +0 -70
- package/src/creatio/auth/providers/oauth2-code-provider.ts +0 -252
- package/src/creatio/auth/providers/oauth2-provider.ts +0 -91
- package/src/creatio/auth/providers/type.ts +0 -5
- package/src/creatio/client-config.ts +0 -34
- package/src/creatio/engines/crud/crud-engine.ts +0 -47
- package/src/creatio/engines/engine-manager.ts +0 -102
- package/src/creatio/engines/engine-registry.ts +0 -36
- package/src/creatio/engines/engine.ts +0 -3
- package/src/creatio/engines/index.ts +0 -7
- package/src/creatio/engines/process/process-engine.ts +0 -20
- package/src/creatio/engines/sys-settings/sys-settings-engine.ts +0 -41
- package/src/creatio/engines/user/user-engine.ts +0 -20
- package/src/creatio/index.ts +0 -6
- package/src/creatio/provider-context.ts +0 -10
- package/src/creatio/providers/crud-provider.ts +0 -45
- package/src/creatio/providers/index.ts +0 -4
- package/src/creatio/providers/process-provider.ts +0 -15
- package/src/creatio/providers/sys-settings-provider.ts +0 -63
- package/src/creatio/providers/user-provider.ts +0 -12
- package/src/creatio/services/creatio-service-context.ts +0 -38
- package/src/creatio/services/http-client.ts +0 -174
- package/src/creatio/services/index.ts +0 -7
- package/src/creatio/services/metadata-store.ts +0 -181
- package/src/creatio/services/odata-crud-provider.ts +0 -210
- package/src/creatio/services/process-service-provider.ts +0 -76
- package/src/creatio/services/sys-settings-service-provider.ts +0 -192
- package/src/creatio/services/user-info-provider.ts +0 -41
- package/src/index.ts +0 -44
- package/src/log.ts +0 -183
- package/src/server/http/creatio-oauth-handlers.ts +0 -146
- package/src/server/http/httpServer.ts +0 -150
- package/src/server/http/index.ts +0 -5
- package/src/server/http/mcp-handlers.ts +0 -92
- package/src/server/http/mcp-oauth-handlers.ts +0 -108
- package/src/server/http/middleware.ts +0 -91
- package/src/server/index.ts +0 -2
- package/src/server/mcp/filters.ts +0 -97
- package/src/server/mcp/index.ts +0 -1
- package/src/server/mcp/prompts-data.ts +0 -896
- package/src/server/mcp/server.ts +0 -331
- package/src/server/mcp/tools-data.ts +0 -592
- package/src/server/oauth/client-manager.ts +0 -47
- package/src/server/oauth/index.ts +0 -6
- package/src/server/oauth/oauth-server.ts +0 -185
- package/src/server/oauth/storage.ts +0 -106
- package/src/server/oauth/token-manager.ts +0 -80
- package/src/server/oauth/types.ts +0 -55
- package/src/server/oauth/validators.ts +0 -56
- package/src/services/index.ts +0 -2
- package/src/services/session-context.ts +0 -232
- package/src/services/token-refresh-scheduler.ts +0 -68
- package/src/types/index.ts +0 -1
- package/src/types/network.ts +0 -7
- package/src/utils/context.ts +0 -49
- package/src/utils/env.ts +0 -12
- package/src/utils/index.ts +0 -5
- package/src/utils/mcp.ts +0 -8
- package/src/utils/network.ts +0 -65
- package/src/utils/pkce.ts +0 -39
- package/src/version.ts +0 -15
- 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
|
-
});
|
package/src/config-builder.ts
DELETED
|
@@ -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,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
|
-
}
|
package/src/creatio/auth/auth.ts
DELETED
|
@@ -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,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,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
|
-
}
|