mcp-creatio 0.3.8 → 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (96) hide show
  1. package/Agent.md +4 -1
  2. package/README.md +131 -113
  3. package/dist/creatio/engines/admin-operation/admin-operation-engine.d.ts +13 -0
  4. package/dist/creatio/engines/admin-operation/admin-operation-engine.d.ts.map +1 -0
  5. package/dist/creatio/engines/admin-operation/admin-operation-engine.js +27 -0
  6. package/dist/creatio/engines/admin-operation/admin-operation-engine.js.map +1 -0
  7. package/dist/creatio/engines/configuration/configuration-engine.d.ts +10 -0
  8. package/dist/creatio/engines/configuration/configuration-engine.d.ts.map +1 -0
  9. package/dist/creatio/engines/configuration/configuration-engine.js +18 -0
  10. package/dist/creatio/engines/configuration/configuration-engine.js.map +1 -0
  11. package/dist/creatio/engines/engine-manager.d.ts +13 -1
  12. package/dist/creatio/engines/engine-manager.d.ts.map +1 -1
  13. package/dist/creatio/engines/engine-manager.js +17 -0
  14. package/dist/creatio/engines/engine-manager.js.map +1 -1
  15. package/dist/creatio/engines/engine-registry.d.ts +3 -0
  16. package/dist/creatio/engines/engine-registry.d.ts.map +1 -1
  17. package/dist/creatio/engines/engine-registry.js +3 -0
  18. package/dist/creatio/engines/engine-registry.js.map +1 -1
  19. package/dist/creatio/engines/feature/feature-engine.d.ts +10 -0
  20. package/dist/creatio/engines/feature/feature-engine.d.ts.map +1 -0
  21. package/dist/creatio/engines/feature/feature-engine.js +18 -0
  22. package/dist/creatio/engines/feature/feature-engine.js.map +1 -0
  23. package/dist/creatio/engines/index.d.ts +3 -0
  24. package/dist/creatio/engines/index.d.ts.map +1 -1
  25. package/dist/creatio/engines/index.js +3 -0
  26. package/dist/creatio/engines/index.js.map +1 -1
  27. package/dist/creatio/provider-context.d.ts +4 -1
  28. package/dist/creatio/provider-context.d.ts.map +1 -1
  29. package/dist/creatio/providers/admin-operation-provider.d.ts +27 -0
  30. package/dist/creatio/providers/admin-operation-provider.d.ts.map +1 -0
  31. package/dist/creatio/providers/admin-operation-provider.js +3 -0
  32. package/dist/creatio/providers/admin-operation-provider.js.map +1 -0
  33. package/dist/creatio/providers/configuration-provider.d.ts +19 -0
  34. package/dist/creatio/providers/configuration-provider.d.ts.map +1 -0
  35. package/dist/creatio/providers/configuration-provider.js +3 -0
  36. package/dist/creatio/providers/configuration-provider.js.map +1 -0
  37. package/dist/creatio/providers/feature-provider.d.ts +10 -0
  38. package/dist/creatio/providers/feature-provider.d.ts.map +1 -0
  39. package/dist/creatio/providers/feature-provider.js +3 -0
  40. package/dist/creatio/providers/feature-provider.js.map +1 -0
  41. package/dist/creatio/providers/index.d.ts +3 -0
  42. package/dist/creatio/providers/index.d.ts.map +1 -1
  43. package/dist/creatio/providers/index.js +3 -0
  44. package/dist/creatio/providers/index.js.map +1 -1
  45. package/dist/creatio/services/admin-operation-service-provider.d.ts +15 -0
  46. package/dist/creatio/services/admin-operation-service-provider.d.ts.map +1 -0
  47. package/dist/creatio/services/admin-operation-service-provider.js +69 -0
  48. package/dist/creatio/services/admin-operation-service-provider.js.map +1 -0
  49. package/dist/creatio/services/configuration-service-provider.d.ts +14 -0
  50. package/dist/creatio/services/configuration-service-provider.d.ts.map +1 -0
  51. package/dist/creatio/services/configuration-service-provider.js +90 -0
  52. package/dist/creatio/services/configuration-service-provider.js.map +1 -0
  53. package/dist/creatio/services/creatio-service-context.d.ts +4 -1
  54. package/dist/creatio/services/creatio-service-context.d.ts.map +1 -1
  55. package/dist/creatio/services/creatio-service-context.js +9 -0
  56. package/dist/creatio/services/creatio-service-context.js.map +1 -1
  57. package/dist/creatio/services/feature-service-provider.d.ts +10 -0
  58. package/dist/creatio/services/feature-service-provider.d.ts.map +1 -0
  59. package/dist/creatio/services/feature-service-provider.js +43 -0
  60. package/dist/creatio/services/feature-service-provider.js.map +1 -0
  61. package/dist/creatio/services/index.d.ts +3 -0
  62. package/dist/creatio/services/index.d.ts.map +1 -1
  63. package/dist/creatio/services/index.js +3 -0
  64. package/dist/creatio/services/index.js.map +1 -1
  65. package/dist/server/mcp/prompts-data.d.ts +58 -0
  66. package/dist/server/mcp/prompts-data.d.ts.map +1 -1
  67. package/dist/server/mcp/prompts-data.js +391 -1
  68. package/dist/server/mcp/prompts-data.js.map +1 -1
  69. package/dist/server/mcp/server.d.ts.map +1 -1
  70. package/dist/server/mcp/server.js +69 -0
  71. package/dist/server/mcp/server.js.map +1 -1
  72. package/dist/server/mcp/tools-data.d.ts +63 -0
  73. package/dist/server/mcp/tools-data.d.ts.map +1 -1
  74. package/dist/server/mcp/tools-data.js +110 -5
  75. package/dist/server/mcp/tools-data.js.map +1 -1
  76. package/package.json +23 -10
  77. package/src/creatio/engines/admin-operation/admin-operation-engine.ts +44 -0
  78. package/src/creatio/engines/configuration/configuration-engine.ts +26 -0
  79. package/src/creatio/engines/engine-manager.ts +56 -1
  80. package/src/creatio/engines/engine-registry.ts +3 -0
  81. package/src/creatio/engines/feature/feature-engine.ts +20 -0
  82. package/src/creatio/engines/index.ts +3 -0
  83. package/src/creatio/provider-context.ts +12 -1
  84. package/src/creatio/providers/admin-operation-provider.ts +34 -0
  85. package/src/creatio/providers/configuration-provider.ts +22 -0
  86. package/src/creatio/providers/feature-provider.ts +10 -0
  87. package/src/creatio/providers/index.ts +3 -0
  88. package/src/creatio/services/admin-operation-service-provider.ts +115 -0
  89. package/src/creatio/services/configuration-service-provider.ts +127 -0
  90. package/src/creatio/services/creatio-service-context.ts +18 -1
  91. package/src/creatio/services/feature-service-provider.ts +60 -0
  92. package/src/creatio/services/index.ts +3 -0
  93. package/src/server/mcp/prompts-data.ts +396 -0
  94. package/src/server/mcp/server.ts +111 -0
  95. package/src/server/mcp/tools-data.ts +160 -4
  96. package/ecosystem.config.json +0 -17
@@ -0,0 +1,115 @@
1
+ import { randomUUID } from 'node:crypto';
2
+
3
+ import {
4
+ AdminOperationProvider,
5
+ AdminOperationServiceResult,
6
+ SetAdminOperationGranteeRequest,
7
+ UpsertAdminOperationRequest,
8
+ UpsertAdminOperationResult,
9
+ } from '../providers';
10
+
11
+ import { CreatioHttpClient } from './http-client';
12
+
13
+ const EMPTY_GUID = '00000000-0000-0000-0000-000000000000';
14
+
15
+ interface RightsHelperInner {
16
+ Success: boolean;
17
+ ExMessage?: string;
18
+ }
19
+
20
+ export class AdminOperationServiceProvider implements AdminOperationProvider {
21
+ private readonly _client: CreatioHttpClient;
22
+
23
+ public readonly kind = 'creatio-admin-operation-service';
24
+
25
+ constructor(client: CreatioHttpClient) {
26
+ this._client = client;
27
+ }
28
+
29
+ private _getMethodUrl(method: string): string {
30
+ return `${this._client.normalizedBaseUrl}/0/rest/RightsService/${method}`;
31
+ }
32
+
33
+ private _parseRightsResponse(method: string, body: any): RightsHelperInner {
34
+ const resultKey = `${method}Result`;
35
+ const wrapped = body?.[resultKey];
36
+ if (typeof wrapped !== 'string') {
37
+ throw new Error(
38
+ `creatio_rights_service_unexpected_response:${method}:${JSON.stringify(body)}`,
39
+ );
40
+ }
41
+ return JSON.parse(wrapped) as RightsHelperInner;
42
+ }
43
+
44
+ private async _callRightsService(
45
+ method: string,
46
+ payload: Record<string, unknown>,
47
+ ): Promise<AdminOperationServiceResult> {
48
+ const url = this._getMethodUrl(method);
49
+ return this._client.executeWithTiming(
50
+ method,
51
+ url,
52
+ async () => {
53
+ const requestInit = await this._client.createPostRequest(payload);
54
+ return this._client.fetchWithAuth(url, async () => requestInit);
55
+ },
56
+ async (response, duration) => {
57
+ const body = await response.json();
58
+ const inner = this._parseRightsResponse(method, body);
59
+ const success = Boolean(inner.Success);
60
+ this._client.logSuccess(method, response.status, duration, {
61
+ rightsServiceSuccess: success,
62
+ });
63
+ const result: AdminOperationServiceResult = { success };
64
+ if (inner.ExMessage !== undefined && inner.ExMessage !== '') {
65
+ result.exMessage = inner.ExMessage;
66
+ }
67
+ return result;
68
+ },
69
+ async (response, duration) =>
70
+ this._client.handleErrorResponse(
71
+ method,
72
+ response,
73
+ duration,
74
+ `creatio_${method.toLowerCase()}_failed`,
75
+ { url },
76
+ ),
77
+ { method },
78
+ );
79
+ }
80
+
81
+ public async upsertAdminOperation(
82
+ request: UpsertAdminOperationRequest,
83
+ ): Promise<UpsertAdminOperationResult> {
84
+ const recordId = request.id && request.id !== EMPTY_GUID ? request.id : randomUUID();
85
+ const payload = {
86
+ recordId,
87
+ name: request.name,
88
+ code: request.code,
89
+ description: request.description ?? '',
90
+ };
91
+ const base = await this._callRightsService('UpsertAdminOperation', payload);
92
+ const result: UpsertAdminOperationResult = { ...base, id: recordId };
93
+ return result;
94
+ }
95
+
96
+ public async deleteAdminOperation(recordIds: string[]): Promise<AdminOperationServiceResult> {
97
+ return this._callRightsService('DeleteAdminOperation', { recordIds });
98
+ }
99
+
100
+ public async setAdminOperationGrantee(
101
+ request: SetAdminOperationGranteeRequest,
102
+ ): Promise<AdminOperationServiceResult> {
103
+ return this._callRightsService('SetAdminOperationGrantee', {
104
+ adminOperationId: request.adminOperationId,
105
+ adminUnitIds: request.adminUnitIds,
106
+ canExecute: request.canExecute,
107
+ });
108
+ }
109
+
110
+ public async deleteAdminOperationGrantee(
111
+ recordIds: string[],
112
+ ): Promise<AdminOperationServiceResult> {
113
+ return this._callRightsService('DeleteAdminOperationGrantee', { recordIds });
114
+ }
115
+ }
@@ -0,0 +1,127 @@
1
+ import {
2
+ CallConfigurationServiceRequest,
3
+ CallConfigurationServiceResult,
4
+ ConfigurationProvider,
5
+ ConfigurationServiceHttpMethod,
6
+ ConfigurationServiceQueryValue,
7
+ } from '../providers';
8
+
9
+ import { CreatioHttpClient } from './http-client';
10
+
11
+ const VALID_NAME_PATTERN = /^[A-Za-z][A-Za-z0-9_-]*$/;
12
+ const METHODS_WITHOUT_BODY: ReadonlySet<ConfigurationServiceHttpMethod> = new Set([
13
+ 'GET',
14
+ 'DELETE',
15
+ ]);
16
+
17
+ export class ConfigurationServiceProvider implements ConfigurationProvider {
18
+ private readonly _client: CreatioHttpClient;
19
+
20
+ public readonly kind = 'creatio-configuration-service';
21
+
22
+ constructor(client: CreatioHttpClient) {
23
+ this._client = client;
24
+ }
25
+
26
+ private _validateName(kind: 'service' | 'method', value: string): void {
27
+ if (!VALID_NAME_PATTERN.test(value)) {
28
+ throw new Error(`creatio_configuration_invalid_${kind}_name:${value}`);
29
+ }
30
+ }
31
+
32
+ private _buildQueryString(
33
+ query: Record<string, ConfigurationServiceQueryValue> | undefined,
34
+ ): string {
35
+ if (!query) {
36
+ return '';
37
+ }
38
+ const params = new URLSearchParams();
39
+ for (const [key, value] of Object.entries(query)) {
40
+ params.append(key, String(value));
41
+ }
42
+ const serialized = params.toString();
43
+ return serialized ? `?${serialized}` : '';
44
+ }
45
+
46
+ private _buildUrl(request: CallConfigurationServiceRequest): string {
47
+ this._validateName('service', request.service);
48
+ this._validateName('method', request.method);
49
+ const base = `${this._client.normalizedBaseUrl}/0/rest/${request.service}/${request.method}`;
50
+ return `${base}${this._buildQueryString(request.query)}`;
51
+ }
52
+
53
+ private async _buildRequestInit(
54
+ httpMethod: ConfigurationServiceHttpMethod,
55
+ body: unknown,
56
+ ): Promise<RequestInit> {
57
+ const includeBody = !METHODS_WITHOUT_BODY.has(httpMethod) && body !== undefined;
58
+ const headers = includeBody
59
+ ? await this._client.getPostHeaders()
60
+ : await this._client.getJsonHeaders();
61
+ const init: RequestInit = { method: httpMethod, headers };
62
+ if (includeBody) {
63
+ init.body = JSON.stringify(body);
64
+ }
65
+ return init;
66
+ }
67
+
68
+ private async _parseResponseBody(response: Response): Promise<{
69
+ body: unknown;
70
+ contentType?: string;
71
+ }> {
72
+ const contentType = response.headers.get('content-type') ?? undefined;
73
+ const text = await response.text();
74
+ if (!text) {
75
+ return contentType !== undefined ? { body: null, contentType } : { body: null };
76
+ }
77
+ if (contentType && contentType.toLowerCase().includes('application/json')) {
78
+ try {
79
+ return { body: JSON.parse(text), contentType };
80
+ } catch {
81
+ return { body: text, contentType };
82
+ }
83
+ }
84
+ return contentType !== undefined ? { body: text, contentType } : { body: text };
85
+ }
86
+
87
+ public async call(
88
+ request: CallConfigurationServiceRequest,
89
+ ): Promise<CallConfigurationServiceResult> {
90
+ const httpMethod: ConfigurationServiceHttpMethod = request.httpMethod ?? 'POST';
91
+ const url = this._buildUrl(request);
92
+ const operation = `call-configuration-service:${request.service}.${request.method}`;
93
+ return this._client.executeWithTiming(
94
+ operation,
95
+ url,
96
+ async () => {
97
+ const init = await this._buildRequestInit(httpMethod, request.body);
98
+ return this._client.fetchWithAuth(url, async () => init);
99
+ },
100
+ async (response, duration) => {
101
+ const { body, contentType } = await this._parseResponseBody(response);
102
+ this._client.logSuccess(operation, response.status, duration, {
103
+ httpMethod,
104
+ service: request.service,
105
+ method: request.method,
106
+ });
107
+ const result: CallConfigurationServiceResult = {
108
+ status: response.status,
109
+ body,
110
+ };
111
+ if (contentType !== undefined) {
112
+ result.contentType = contentType;
113
+ }
114
+ return result;
115
+ },
116
+ async (response, duration) =>
117
+ this._client.handleErrorResponse(
118
+ operation,
119
+ response,
120
+ duration,
121
+ 'creatio_configuration_service_failed',
122
+ { url, httpMethod },
123
+ ),
124
+ { httpMethod, service: request.service, method: request.method },
125
+ );
126
+ }
127
+ }
@@ -1,8 +1,19 @@
1
1
  import { CreatioAuthManager, ICreatioAuthProvider } from '../auth';
2
2
  import { CreatioClientConfig } from '../client-config';
3
3
  import { CreatioProviderContext } from '../provider-context';
4
- import { CrudProvider, ProcessProvider, SysSettingsProvider, UserProvider } from '../providers';
4
+ import {
5
+ AdminOperationProvider,
6
+ ConfigurationProvider,
7
+ CrudProvider,
8
+ FeatureProvider,
9
+ ProcessProvider,
10
+ SysSettingsProvider,
11
+ UserProvider,
12
+ } from '../providers';
5
13
 
14
+ import { AdminOperationServiceProvider } from './admin-operation-service-provider';
15
+ import { ConfigurationServiceProvider } from './configuration-service-provider';
16
+ import { FeatureServiceProvider } from './feature-service-provider';
6
17
  import { CreatioHttpClient } from './http-client';
7
18
  import { ODataMetadataStore } from './metadata-store';
8
19
  import { ODataCrudProvider } from './odata-crud-provider';
@@ -16,7 +27,10 @@ export class CreatioServiceContext implements CreatioProviderContext {
16
27
  private readonly _httpClient: CreatioHttpClient;
17
28
 
18
29
  public readonly kind = 'creatio-services';
30
+ public readonly adminOperation: AdminOperationProvider;
31
+ public readonly configuration: ConfigurationProvider;
19
32
  public readonly crud: CrudProvider;
33
+ public readonly feature: FeatureProvider;
20
34
  public readonly process: ProcessProvider;
21
35
  public readonly sysSettings: SysSettingsProvider;
22
36
  public readonly user: UserProvider;
@@ -30,7 +44,10 @@ export class CreatioServiceContext implements CreatioProviderContext {
30
44
  this._authManager = new CreatioAuthManager(this._config);
31
45
  this._httpClient = new CreatioHttpClient(this._config, this._authManager);
32
46
  const metadataStore = new ODataMetadataStore(this._httpClient);
47
+ this.adminOperation = new AdminOperationServiceProvider(this._httpClient);
48
+ this.configuration = new ConfigurationServiceProvider(this._httpClient);
33
49
  this.crud = new ODataCrudProvider(this._httpClient, metadataStore);
50
+ this.feature = new FeatureServiceProvider(this._httpClient);
34
51
  this.process = new ProcessServiceProvider(this._httpClient);
35
52
  this.sysSettings = new SysSettingsServiceProvider(this._httpClient);
36
53
  this.user = new UserInfoProvider(this._httpClient);
@@ -0,0 +1,60 @@
1
+ import { ClearFeatureCacheResult, FeatureProvider } from '../providers';
2
+
3
+ import { CreatioHttpClient } from './http-client';
4
+
5
+ export class FeatureServiceProvider implements FeatureProvider {
6
+ private readonly _client: CreatioHttpClient;
7
+
8
+ public readonly kind = 'creatio-feature-service';
9
+
10
+ constructor(client: CreatioHttpClient) {
11
+ this._client = client;
12
+ }
13
+
14
+ private _getClearCacheUrl(featureCode?: string): string {
15
+ const base = `${this._client.normalizedBaseUrl}/0/rest/FeatureService/ClearFeaturesCacheForAllUsers`;
16
+ if (!featureCode) {
17
+ return `${base}/`;
18
+ }
19
+ const encoded = Buffer.from(featureCode, 'utf8').toString('base64');
20
+ return `${base}/${encoded}`;
21
+ }
22
+
23
+ public async clearFeaturesCache(featureCode?: string): Promise<ClearFeatureCacheResult> {
24
+ const url = this._getClearCacheUrl(featureCode);
25
+ return this._client.executeWithTiming(
26
+ 'clear-features-cache',
27
+ url,
28
+ async () => {
29
+ const headers = await this._client.getJsonHeaders();
30
+ return this._client.fetchWithAuth(url, async () => ({
31
+ method: 'GET',
32
+ headers,
33
+ }));
34
+ },
35
+ async (response, duration) => {
36
+ const message = await response.text();
37
+ this._client.logSuccess('clear-features-cache', response.status, duration, {
38
+ featureCode: featureCode ?? '(all)',
39
+ });
40
+ const result: ClearFeatureCacheResult = { success: true, message };
41
+ if (featureCode !== undefined) {
42
+ result.featureCode = featureCode;
43
+ }
44
+ return result;
45
+ },
46
+ async (response, duration) =>
47
+ this._client.handleErrorResponse(
48
+ 'clear-features-cache',
49
+ response,
50
+ duration,
51
+ 'creatio_clear_features_cache_failed',
52
+ {
53
+ featureCode: featureCode ?? '(all)',
54
+ url,
55
+ },
56
+ ),
57
+ { featureCode: featureCode ?? '(all)' },
58
+ );
59
+ }
60
+ }
@@ -1,4 +1,7 @@
1
+ export * from './admin-operation-service-provider';
2
+ export * from './configuration-service-provider';
1
3
  export * from './creatio-service-context';
4
+ export * from './feature-service-provider';
2
5
  export * from './http-client';
3
6
  export * from './metadata-store';
4
7
  export * from './odata-crud-provider';