mcp-creatio 0.4.0 → 0.5.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 (215) hide show
  1. package/README.md +252 -212
  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/providers/configuration-provider.d.ts +3 -2
  18. package/dist/creatio/providers/configuration-provider.d.ts.map +1 -1
  19. package/dist/creatio/providers/crud-provider.d.ts +2 -0
  20. package/dist/creatio/providers/crud-provider.d.ts.map +1 -1
  21. package/dist/creatio/services/configuration-service-provider.d.ts.map +1 -1
  22. package/dist/creatio/services/configuration-service-provider.js +11 -3
  23. package/dist/creatio/services/configuration-service-provider.js.map +1 -1
  24. package/dist/creatio/services/http-client.d.ts.map +1 -1
  25. package/dist/creatio/services/http-client.js +0 -1
  26. package/dist/creatio/services/http-client.js.map +1 -1
  27. package/dist/creatio/services/metadata-store.d.ts +5 -0
  28. package/dist/creatio/services/metadata-store.d.ts.map +1 -1
  29. package/dist/creatio/services/metadata-store.js +18 -6
  30. package/dist/creatio/services/metadata-store.js.map +1 -1
  31. package/dist/creatio/services/odata-crud-provider.d.ts +3 -1
  32. package/dist/creatio/services/odata-crud-provider.d.ts.map +1 -1
  33. package/dist/creatio/services/odata-crud-provider.js +31 -8
  34. package/dist/creatio/services/odata-crud-provider.js.map +1 -1
  35. package/dist/server/http/creatio-oauth-handlers.d.ts +0 -1
  36. package/dist/server/http/creatio-oauth-handlers.d.ts.map +1 -1
  37. package/dist/server/http/creatio-oauth-handlers.js +30 -23
  38. package/dist/server/http/creatio-oauth-handlers.js.map +1 -1
  39. package/dist/server/http/httpServer.d.ts +9 -0
  40. package/dist/server/http/httpServer.d.ts.map +1 -1
  41. package/dist/server/http/httpServer.js +34 -11
  42. package/dist/server/http/httpServer.js.map +1 -1
  43. package/dist/server/http/mcp-handlers.d.ts.map +1 -1
  44. package/dist/server/http/mcp-handlers.js +4 -1
  45. package/dist/server/http/mcp-handlers.js.map +1 -1
  46. package/dist/server/http/mcp-oauth-handlers.d.ts.map +1 -1
  47. package/dist/server/http/mcp-oauth-handlers.js +18 -6
  48. package/dist/server/http/mcp-oauth-handlers.js.map +1 -1
  49. package/dist/server/http/middleware.d.ts +7 -0
  50. package/dist/server/http/middleware.d.ts.map +1 -1
  51. package/dist/server/http/middleware.js +23 -0
  52. package/dist/server/http/middleware.js.map +1 -1
  53. package/dist/server/http/rate-limiter.d.ts +24 -0
  54. package/dist/server/http/rate-limiter.d.ts.map +1 -0
  55. package/dist/server/http/rate-limiter.js +42 -0
  56. package/dist/server/http/rate-limiter.js.map +1 -0
  57. package/dist/server/mcp/creatio-rest.d.ts +44 -0
  58. package/dist/server/mcp/creatio-rest.d.ts.map +1 -0
  59. package/dist/server/mcp/creatio-rest.js +26 -0
  60. package/dist/server/mcp/creatio-rest.js.map +1 -0
  61. package/dist/server/mcp/crtmcp/crt-mcp-client.d.ts +55 -0
  62. package/dist/server/mcp/crtmcp/crt-mcp-client.d.ts.map +1 -0
  63. package/dist/server/mcp/crtmcp/crt-mcp-client.js +67 -0
  64. package/dist/server/mcp/crtmcp/crt-mcp-client.js.map +1 -0
  65. package/dist/server/mcp/crtmcp/crt-mcp-tool-preparer.d.ts +20 -0
  66. package/dist/server/mcp/crtmcp/crt-mcp-tool-preparer.d.ts.map +1 -0
  67. package/dist/server/mcp/crtmcp/crt-mcp-tool-preparer.js +74 -0
  68. package/dist/server/mcp/crtmcp/crt-mcp-tool-preparer.js.map +1 -0
  69. package/dist/server/mcp/dataforge/dataforge-client.d.ts +64 -0
  70. package/dist/server/mcp/dataforge/dataforge-client.d.ts.map +1 -0
  71. package/dist/server/mcp/dataforge/dataforge-client.js +130 -0
  72. package/dist/server/mcp/dataforge/dataforge-client.js.map +1 -0
  73. package/dist/server/mcp/dataforge/dataforge-tool-preparer.d.ts +17 -0
  74. package/dist/server/mcp/dataforge/dataforge-tool-preparer.d.ts.map +1 -0
  75. package/dist/server/mcp/dataforge/dataforge-tool-preparer.js +42 -0
  76. package/dist/server/mcp/dataforge/dataforge-tool-preparer.js.map +1 -0
  77. package/dist/server/mcp/filters.d.ts.map +1 -1
  78. package/dist/server/mcp/filters.js +20 -4
  79. package/dist/server/mcp/filters.js.map +1 -1
  80. package/dist/server/mcp/globalsearch/globalsearch-client.d.ts +50 -0
  81. package/dist/server/mcp/globalsearch/globalsearch-client.d.ts.map +1 -0
  82. package/dist/server/mcp/globalsearch/globalsearch-client.js +118 -0
  83. package/dist/server/mcp/globalsearch/globalsearch-client.js.map +1 -0
  84. package/dist/server/mcp/globalsearch/globalsearch-tool-preparer.d.ts +16 -0
  85. package/dist/server/mcp/globalsearch/globalsearch-tool-preparer.d.ts.map +1 -0
  86. package/dist/server/mcp/globalsearch/globalsearch-tool-preparer.js +34 -0
  87. package/dist/server/mcp/globalsearch/globalsearch-tool-preparer.js.map +1 -0
  88. package/dist/server/mcp/json-schema-to-zod.d.ts +3 -0
  89. package/dist/server/mcp/json-schema-to-zod.d.ts.map +1 -0
  90. package/dist/server/mcp/json-schema-to-zod.js +54 -0
  91. package/dist/server/mcp/json-schema-to-zod.js.map +1 -0
  92. package/dist/server/mcp/server.d.ts +18 -0
  93. package/dist/server/mcp/server.d.ts.map +1 -1
  94. package/dist/server/mcp/server.js +93 -25
  95. package/dist/server/mcp/server.js.map +1 -1
  96. package/dist/server/mcp/tool-preparer.d.ts +26 -0
  97. package/dist/server/mcp/tool-preparer.d.ts.map +1 -0
  98. package/dist/server/mcp/tool-preparer.js +11 -0
  99. package/dist/server/mcp/tool-preparer.js.map +1 -0
  100. package/dist/server/mcp/tools-data.d.ts +69 -10
  101. package/dist/server/mcp/tools-data.d.ts.map +1 -1
  102. package/dist/server/mcp/tools-data.js +222 -32
  103. package/dist/server/mcp/tools-data.js.map +1 -1
  104. package/dist/server/oauth/oauth-server.d.ts +0 -1
  105. package/dist/server/oauth/oauth-server.d.ts.map +1 -1
  106. package/dist/server/oauth/oauth-server.js +11 -21
  107. package/dist/server/oauth/oauth-server.js.map +1 -1
  108. package/dist/server/oauth/storage.d.ts +0 -2
  109. package/dist/server/oauth/storage.d.ts.map +1 -1
  110. package/dist/server/oauth/storage.js +0 -6
  111. package/dist/server/oauth/storage.js.map +1 -1
  112. package/dist/server/oauth/validators.d.ts +6 -0
  113. package/dist/server/oauth/validators.d.ts.map +1 -1
  114. package/dist/server/oauth/validators.js +28 -0
  115. package/dist/server/oauth/validators.js.map +1 -1
  116. package/dist/services/session-context.d.ts +8 -7
  117. package/dist/services/session-context.d.ts.map +1 -1
  118. package/dist/services/session-context.js +7 -27
  119. package/dist/services/session-context.js.map +1 -1
  120. package/package.json +18 -9
  121. package/.dockerignore +0 -12
  122. package/.editorconfig +0 -14
  123. package/.eslintrc.cjs +0 -18
  124. package/.gitattributes +0 -8
  125. package/.github/workflows/docker-publish.yml +0 -50
  126. package/.prettierignore +0 -3
  127. package/.prettierrc +0 -9
  128. package/.vscode/launch.json +0 -23
  129. package/.vscode/mcp.json +0 -13
  130. package/.vscode/settings.json +0 -16
  131. package/Agent.md +0 -190
  132. package/Debug.md +0 -32
  133. package/Dockerfile +0 -23
  134. package/docs/coding-style.md +0 -30
  135. package/eslint.config.cjs +0 -95
  136. package/src/cli.ts +0 -162
  137. package/src/config-builder.ts +0 -76
  138. package/src/consts.ts +0 -3
  139. package/src/creatio/auth/auth-manager.ts +0 -27
  140. package/src/creatio/auth/auth.ts +0 -31
  141. package/src/creatio/auth/index.ts +0 -3
  142. package/src/creatio/auth/providers/base-oauth2-provider.ts +0 -62
  143. package/src/creatio/auth/providers/base-provider.ts +0 -42
  144. package/src/creatio/auth/providers/index.ts +0 -4
  145. package/src/creatio/auth/providers/legacy-provider.ts +0 -70
  146. package/src/creatio/auth/providers/oauth2-code-provider.ts +0 -252
  147. package/src/creatio/auth/providers/oauth2-provider.ts +0 -91
  148. package/src/creatio/auth/providers/type.ts +0 -5
  149. package/src/creatio/client-config.ts +0 -34
  150. package/src/creatio/engines/admin-operation/admin-operation-engine.ts +0 -44
  151. package/src/creatio/engines/configuration/configuration-engine.ts +0 -26
  152. package/src/creatio/engines/crud/crud-engine.ts +0 -47
  153. package/src/creatio/engines/engine-manager.ts +0 -157
  154. package/src/creatio/engines/engine-registry.ts +0 -39
  155. package/src/creatio/engines/engine.ts +0 -3
  156. package/src/creatio/engines/feature/feature-engine.ts +0 -20
  157. package/src/creatio/engines/index.ts +0 -10
  158. package/src/creatio/engines/process/process-engine.ts +0 -20
  159. package/src/creatio/engines/sys-settings/sys-settings-engine.ts +0 -41
  160. package/src/creatio/engines/user/user-engine.ts +0 -20
  161. package/src/creatio/index.ts +0 -6
  162. package/src/creatio/provider-context.ts +0 -21
  163. package/src/creatio/providers/admin-operation-provider.ts +0 -34
  164. package/src/creatio/providers/configuration-provider.ts +0 -22
  165. package/src/creatio/providers/crud-provider.ts +0 -45
  166. package/src/creatio/providers/feature-provider.ts +0 -10
  167. package/src/creatio/providers/index.ts +0 -7
  168. package/src/creatio/providers/process-provider.ts +0 -15
  169. package/src/creatio/providers/sys-settings-provider.ts +0 -63
  170. package/src/creatio/providers/user-provider.ts +0 -12
  171. package/src/creatio/services/admin-operation-service-provider.ts +0 -115
  172. package/src/creatio/services/configuration-service-provider.ts +0 -127
  173. package/src/creatio/services/creatio-service-context.ts +0 -55
  174. package/src/creatio/services/feature-service-provider.ts +0 -60
  175. package/src/creatio/services/http-client.ts +0 -174
  176. package/src/creatio/services/index.ts +0 -10
  177. package/src/creatio/services/metadata-store.ts +0 -181
  178. package/src/creatio/services/odata-crud-provider.ts +0 -210
  179. package/src/creatio/services/process-service-provider.ts +0 -76
  180. package/src/creatio/services/sys-settings-service-provider.ts +0 -192
  181. package/src/creatio/services/user-info-provider.ts +0 -41
  182. package/src/index.ts +0 -44
  183. package/src/log.ts +0 -183
  184. package/src/server/http/creatio-oauth-handlers.ts +0 -146
  185. package/src/server/http/httpServer.ts +0 -150
  186. package/src/server/http/index.ts +0 -5
  187. package/src/server/http/mcp-handlers.ts +0 -92
  188. package/src/server/http/mcp-oauth-handlers.ts +0 -108
  189. package/src/server/http/middleware.ts +0 -91
  190. package/src/server/index.ts +0 -2
  191. package/src/server/mcp/filters.ts +0 -97
  192. package/src/server/mcp/index.ts +0 -1
  193. package/src/server/mcp/prompts-data.ts +0 -1292
  194. package/src/server/mcp/server.ts +0 -442
  195. package/src/server/mcp/tools-data.ts +0 -748
  196. package/src/server/oauth/client-manager.ts +0 -47
  197. package/src/server/oauth/index.ts +0 -6
  198. package/src/server/oauth/oauth-server.ts +0 -185
  199. package/src/server/oauth/storage.ts +0 -106
  200. package/src/server/oauth/token-manager.ts +0 -80
  201. package/src/server/oauth/types.ts +0 -55
  202. package/src/server/oauth/validators.ts +0 -56
  203. package/src/services/index.ts +0 -2
  204. package/src/services/session-context.ts +0 -232
  205. package/src/services/token-refresh-scheduler.ts +0 -68
  206. package/src/types/index.ts +0 -1
  207. package/src/types/network.ts +0 -7
  208. package/src/utils/context.ts +0 -49
  209. package/src/utils/env.ts +0 -12
  210. package/src/utils/index.ts +0 -5
  211. package/src/utils/mcp.ts +0 -8
  212. package/src/utils/network.ts +0 -65
  213. package/src/utils/pkce.ts +0 -39
  214. package/src/version.ts +0 -15
  215. package/tsconfig.json +0 -28
@@ -0,0 +1,26 @@
1
+ "use strict";
2
+ /**
3
+ * Shared narrow contracts for talking to Creatio configuration REST services and
4
+ * reading system settings. Capability clients (DataForge, Global Search, …) depend
5
+ * on these interfaces rather than the concrete engines (Dependency Inversion).
6
+ */
7
+ Object.defineProperty(exports, "__esModule", { value: true });
8
+ exports.getSettingValue = getSettingValue;
9
+ exports.hasNonEmptySetting = hasNonEmptySetting;
10
+ /**
11
+ * Extract a system setting's value from a QuerySysSettings response. Creatio
12
+ * returns each setting as an object `{ code, value, ... }`; a bare value is also
13
+ * tolerated. Returns `undefined` when absent.
14
+ */
15
+ function getSettingValue(response, code) {
16
+ const entry = response?.values?.[code];
17
+ return entry && typeof entry === 'object'
18
+ ? entry.value
19
+ : entry;
20
+ }
21
+ /** True when the named setting holds a non-empty string value. */
22
+ function hasNonEmptySetting(response, code) {
23
+ const value = getSettingValue(response, code);
24
+ return typeof value === 'string' && value.trim().length > 0;
25
+ }
26
+ //# sourceMappingURL=creatio-rest.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"creatio-rest.js","sourceRoot":"","sources":["../../../src/server/mcp/creatio-rest.ts"],"names":[],"mappings":";AAAA;;;;GAIG;;AAoCH,0CAQC;AAGD,gDAMC;AAtBD;;;;GAIG;AACH,SAAgB,eAAe,CAC9B,QAA0D,EAC1D,IAAY;IAEZ,MAAM,KAAK,GAAG,QAAQ,EAAE,MAAM,EAAE,CAAC,IAAI,CAAC,CAAC;IACvC,OAAO,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ;QACxC,CAAC,CAAE,KAA6B,CAAC,KAAK;QACtC,CAAC,CAAC,KAAK,CAAC;AACV,CAAC;AAED,kEAAkE;AAClE,SAAgB,kBAAkB,CACjC,QAA0D,EAC1D,IAAY;IAEZ,MAAM,KAAK,GAAG,eAAe,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;IAC9C,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC;AAC7D,CAAC"}
@@ -0,0 +1,55 @@
1
+ import { ConfigurationCaller } from '../creatio-rest';
2
+ /**
3
+ * Access layer for the Creatio "MCP Publishing" composable app (CrtMCPPublishingApp).
4
+ *
5
+ * That app is itself an MCP server hosted inside Creatio: admins publish `McpServer`
6
+ * records (each a set of `McpTool`s backed by business processes) and it speaks
7
+ * JSON-RPC 2.0 at `/0/rest/ToolServiceMcp/{code}/v1/mcp` (initialize / tools/list /
8
+ * tools/call / ping).
9
+ *
10
+ * This client is a thin proxy front-end: it enumerates online servers, lists their
11
+ * tools, and forwards tool calls — letting the app keep ownership of schema
12
+ * derivation, RBAC, argument validation, output shaping and execution. It knows
13
+ * nothing about MCP tool registration (that is the preparer's job).
14
+ *
15
+ * Both publication gates are honoured for free: `tools/list` only returns ENABLED
16
+ * tools of ONLINE servers, and an offline server's endpoint fails closed.
17
+ */
18
+ export interface PublishedServer {
19
+ code: string;
20
+ title: string;
21
+ }
22
+ export interface PublishedTool {
23
+ name: string;
24
+ description?: string;
25
+ inputSchema?: unknown;
26
+ outputSchema?: unknown;
27
+ annotations?: unknown;
28
+ }
29
+ /** Narrow capability needed to enumerate published servers (DIP over the CRUD engine). */
30
+ export interface EntityReader {
31
+ read(params: {
32
+ entity: string;
33
+ select?: string[];
34
+ top?: number;
35
+ }): Promise<unknown>;
36
+ }
37
+ export declare class CrtMcpPublishingClient {
38
+ private readonly _configuration;
39
+ private readonly _crud;
40
+ constructor(configuration: ConfigurationCaller, crud: EntityReader);
41
+ /** Whether the publishing app is installed on this environment (its `McpServer` entity exists). */
42
+ isInstalled(): Promise<boolean>;
43
+ /** Online published servers (the app filters offline ones out of routing anyway). */
44
+ listOnlineServers(): Promise<PublishedServer[]>;
45
+ /** Tool definitions advertised by a server's MCP `tools/list`. */
46
+ listTools(serverCode: string): Promise<PublishedTool[]>;
47
+ /**
48
+ * Execute a published tool, returning the MCP CallToolResult as-is
49
+ * (`{ content, structuredContent?, isError? }`) so the proxied output reaches the
50
+ * caller unchanged.
51
+ */
52
+ callTool(serverCode: string, name: string, args: Record<string, unknown>): Promise<unknown>;
53
+ private _rpc;
54
+ }
55
+ //# sourceMappingURL=crt-mcp-client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"crt-mcp-client.d.ts","sourceRoot":"","sources":["../../../../src/server/mcp/crtmcp/crt-mcp-client.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;AAEtD;;;;;;;;;;;;;;;GAeG;AAEH,MAAM,WAAW,eAAe;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,aAAa;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,WAAW,CAAC,EAAE,OAAO,CAAC;CACtB;AAED,0FAA0F;AAC1F,MAAM,WAAW,YAAY;IAC5B,IAAI,CAAC,MAAM,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;QAAC,GAAG,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;CACpF;AAID,qBAAa,sBAAsB;IAClC,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAsB;IACrD,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAe;gBAEzB,aAAa,EAAE,mBAAmB,EAAE,IAAI,EAAE,YAAY;IAKlE,mGAAmG;IACtF,WAAW,IAAI,OAAO,CAAC,OAAO,CAAC;IAU5C,qFAAqF;IACxE,iBAAiB,IAAI,OAAO,CAAC,eAAe,EAAE,CAAC;IAY5D,kEAAkE;IACrD,SAAS,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC;IAMpE;;;;OAIG;IACI,QAAQ,CACd,UAAU,EAAE,MAAM,EAClB,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC3B,OAAO,CAAC,OAAO,CAAC;YAIL,IAAI;CAiBlB"}
@@ -0,0 +1,67 @@
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.CrtMcpPublishingClient = void 0;
7
+ const log_1 = __importDefault(require("../../../log"));
8
+ const SERVER_ENTITY = 'McpServer';
9
+ class CrtMcpPublishingClient {
10
+ _configuration;
11
+ _crud;
12
+ constructor(configuration, crud) {
13
+ this._configuration = configuration;
14
+ this._crud = crud;
15
+ }
16
+ /** Whether the publishing app is installed on this environment (its `McpServer` entity exists). */
17
+ async isInstalled() {
18
+ try {
19
+ await this._crud.read({ entity: SERVER_ENTITY, select: ['Id'], top: 1 });
20
+ return true;
21
+ }
22
+ catch (err) {
23
+ log_1.default.info('crtmcp.probe.not-installed', { error: String(err) });
24
+ return false;
25
+ }
26
+ }
27
+ /** Online published servers (the app filters offline ones out of routing anyway). */
28
+ async listOnlineServers() {
29
+ const rows = await this._crud.read({
30
+ entity: SERVER_ENTITY,
31
+ select: ['Id', 'Name', 'Code', 'IsOnline'],
32
+ top: 200,
33
+ });
34
+ const list = Array.isArray(rows) ? rows : [];
35
+ return list
36
+ .filter((r) => r?.IsOnline === true && typeof r.Code === 'string' && r.Code.length > 0)
37
+ .map((r) => ({ code: r.Code, title: r.Name ?? r.Code }));
38
+ }
39
+ /** Tool definitions advertised by a server's MCP `tools/list`. */
40
+ async listTools(serverCode) {
41
+ const result = await this._rpc(serverCode, 'tools/list', {});
42
+ const tools = result?.tools;
43
+ return Array.isArray(tools) ? tools : [];
44
+ }
45
+ /**
46
+ * Execute a published tool, returning the MCP CallToolResult as-is
47
+ * (`{ content, structuredContent?, isError? }`) so the proxied output reaches the
48
+ * caller unchanged.
49
+ */
50
+ callTool(serverCode, name, args) {
51
+ return this._rpc(serverCode, 'tools/call', { name, arguments: args ?? {} });
52
+ }
53
+ async _rpc(serverCode, method, params) {
54
+ const response = await this._configuration.call({
55
+ rawPath: `/0/rest/ToolServiceMcp/${encodeURIComponent(serverCode)}/v1/mcp`,
56
+ httpMethod: 'POST',
57
+ body: { jsonrpc: '2.0', id: 1, method, params },
58
+ });
59
+ const body = response.body;
60
+ if (body && body.error) {
61
+ throw new Error(`crtmcp_rpc_error:${method}:${body.error.code ?? ''} ${body.error.message ?? ''}`.trim());
62
+ }
63
+ return body?.result;
64
+ }
65
+ }
66
+ exports.CrtMcpPublishingClient = CrtMcpPublishingClient;
67
+ //# sourceMappingURL=crt-mcp-client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"crt-mcp-client.js","sourceRoot":"","sources":["../../../../src/server/mcp/crtmcp/crt-mcp-client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ import { ToolPreparer, ToolRegistrar } from '../tool-preparer';
2
+ import { CrtMcpPublishingClient } from './crt-mcp-client';
3
+ /** Stable capability key. */
4
+ export declare const PUBLISHED_TOOLS_CAPABILITY = "published-tools";
5
+ /**
6
+ * Registers tools published in the Creatio "MCP Publishing" composable app, but only
7
+ * when explicitly enabled (a hidden, opt-in feature) AND the app is installed. Each
8
+ * published tool is re-exposed under a namespaced name and proxied back to the app's
9
+ * JSON-RPC endpoint, so the app keeps ownership of validation/RBAC/execution.
10
+ */
11
+ export declare class CrtMcpPublishingToolPreparer implements ToolPreparer {
12
+ readonly name = "published-tools";
13
+ private readonly _client;
14
+ private readonly _enabled;
15
+ constructor(client: CrtMcpPublishingClient, enabled: boolean);
16
+ prepare(registrar: ToolRegistrar): Promise<boolean>;
17
+ private _registerTool;
18
+ private _toolName;
19
+ }
20
+ //# sourceMappingURL=crt-mcp-tool-preparer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"crt-mcp-tool-preparer.d.ts","sourceRoot":"","sources":["../../../../src/server/mcp/crtmcp/crt-mcp-tool-preparer.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAE/D,OAAO,EAAE,sBAAsB,EAAiB,MAAM,kBAAkB,CAAC;AAEzE,6BAA6B;AAC7B,eAAO,MAAM,0BAA0B,oBAAoB,CAAC;AAI5D;;;;;GAKG;AACH,qBAAa,4BAA6B,YAAW,YAAY;IAChE,SAAgB,IAAI,qBAA8B;IAElD,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAyB;IACjD,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAU;gBAEvB,MAAM,EAAE,sBAAsB,EAAE,OAAO,EAAE,OAAO;IAK/C,OAAO,CAAC,SAAS,EAAE,aAAa,GAAG,OAAO,CAAC,OAAO,CAAC;IA8BhE,OAAO,CAAC,aAAa;IAerB,OAAO,CAAC,SAAS;CAIjB"}
@@ -0,0 +1,74 @@
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.CrtMcpPublishingToolPreparer = exports.PUBLISHED_TOOLS_CAPABILITY = void 0;
7
+ const log_1 = __importDefault(require("../../../log"));
8
+ const json_schema_to_zod_1 = require("../json-schema-to-zod");
9
+ /** Stable capability key. */
10
+ exports.PUBLISHED_TOOLS_CAPABILITY = 'published-tools';
11
+ const NAME_PREFIX = 'pub';
12
+ /**
13
+ * Registers tools published in the Creatio "MCP Publishing" composable app, but only
14
+ * when explicitly enabled (a hidden, opt-in feature) AND the app is installed. Each
15
+ * published tool is re-exposed under a namespaced name and proxied back to the app's
16
+ * JSON-RPC endpoint, so the app keeps ownership of validation/RBAC/execution.
17
+ */
18
+ class CrtMcpPublishingToolPreparer {
19
+ name = exports.PUBLISHED_TOOLS_CAPABILITY;
20
+ _client;
21
+ _enabled;
22
+ constructor(client, enabled) {
23
+ this._client = client;
24
+ this._enabled = enabled;
25
+ }
26
+ async prepare(registrar) {
27
+ if (!this._enabled) {
28
+ return false;
29
+ }
30
+ if (!(await this._client.isInstalled())) {
31
+ log_1.default.info('crtmcp.skipped', { reason: 'app-not-installed' });
32
+ return false;
33
+ }
34
+ const servers = await this._client.listOnlineServers();
35
+ let registered = 0;
36
+ for (const server of servers) {
37
+ let tools;
38
+ try {
39
+ tools = await this._client.listTools(server.code);
40
+ }
41
+ catch (err) {
42
+ log_1.default.warn('crtmcp.list-failed', { server: server.code, error: String(err) });
43
+ continue;
44
+ }
45
+ for (const tool of tools) {
46
+ if (!tool?.name) {
47
+ continue;
48
+ }
49
+ this._registerTool(registrar, server.code, tool);
50
+ registered++;
51
+ }
52
+ }
53
+ log_1.default.info('crtmcp.prepared', { servers: servers.length, tools: registered });
54
+ return registered > 0;
55
+ }
56
+ _registerTool(registrar, serverCode, tool) {
57
+ const descriptor = {
58
+ title: tool.name,
59
+ description: tool.description ??
60
+ `Published tool "${tool.name}" from Creatio MCP server "${serverCode}".`,
61
+ inputSchema: (0, json_schema_to_zod_1.jsonSchemaToZodShape)(tool.inputSchema),
62
+ };
63
+ // Proxy the call straight through; the app validates args and shapes the result.
64
+ const handler = (args) => this._client.callTool(serverCode, tool.name, args ?? {});
65
+ registrar.register(this._toolName(serverCode, tool.name), descriptor, handler);
66
+ }
67
+ // Namespace by server + tool so names never collide across servers or with built-in tools.
68
+ _toolName(serverCode, toolName) {
69
+ const sanitize = (value) => value.replace(/[^A-Za-z0-9_-]/g, '_');
70
+ return `${NAME_PREFIX}-${sanitize(serverCode)}-${sanitize(toolName)}`;
71
+ }
72
+ }
73
+ exports.CrtMcpPublishingToolPreparer = CrtMcpPublishingToolPreparer;
74
+ //# sourceMappingURL=crt-mcp-tool-preparer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"crt-mcp-tool-preparer.js","sourceRoot":"","sources":["../../../../src/server/mcp/crtmcp/crt-mcp-tool-preparer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,64 @@
1
+ import { ConfigurationCaller, ConfigurationCallResult, SysSettingReader } from '../creatio-rest';
2
+ export type { ConfigurationCaller, ConfigurationCallRequest, ConfigurationCallResult, ConfigurationHttpMethod, SysSettingReader, } from '../creatio-rest';
3
+ /**
4
+ * DataForge access layer.
5
+ *
6
+ * Single responsibility: build correct requests against the Creatio-hosted
7
+ * DataForge REST services and expose the read/maintenance operations plus an
8
+ * availability probe. It knows nothing about MCP tool registration.
9
+ *
10
+ * The DataForge WCF services use `[WebInvoke(BodyStyle = Wrapped)]`, so each
11
+ * single-parameter method expects its DTO wrapped under a top-level `request`.
12
+ */
13
+ export interface SimilarTablesQuery {
14
+ query: string;
15
+ limit?: number | undefined;
16
+ }
17
+ export interface TableRelationshipsQuery {
18
+ sourceTable: string;
19
+ targetTable: string;
20
+ limit?: number | undefined;
21
+ bidirectional?: boolean | undefined;
22
+ skipDetails?: boolean | undefined;
23
+ }
24
+ export interface LookupValuesQuery {
25
+ query: string;
26
+ schemaName?: string | undefined;
27
+ limit?: number | undefined;
28
+ }
29
+ export declare class DataForgeClient {
30
+ private readonly _configuration;
31
+ private readonly _sysSettings;
32
+ constructor(configuration: ConfigurationCaller, sysSettings: SysSettingReader);
33
+ /**
34
+ * Whether DataForge is configured on this environment. Gated on a non-empty
35
+ * `DataForgeServiceUrl`, mirroring the server-side `IsDataForgeEnabled` check.
36
+ * Probe failures are treated as "disabled" so callers degrade gracefully.
37
+ */
38
+ isEnabled(): Promise<boolean>;
39
+ getSimilarTableNames(q: SimilarTablesQuery): Promise<ConfigurationCallResult>;
40
+ getTableDetails(q: SimilarTablesQuery): Promise<ConfigurationCallResult>;
41
+ getTableRelationships(q: TableRelationshipsQuery): Promise<ConfigurationCallResult>;
42
+ getLookupValues(q: LookupValuesQuery): Promise<ConfigurationCallResult>;
43
+ getTableColumns(tableName: string): Promise<ConfigurationCallResult>;
44
+ getServiceStatus(): Promise<ConfigurationCallResult>;
45
+ /**
46
+ * Column details for `describe-entity` routing: returns the response body when
47
+ * DataForge answers successfully, or `null` so the caller can fall back to
48
+ * OData metadata. Per-call resilience only — a single miss or error never
49
+ * disables DataForge globally (that verdict is owned by {@link isEnabled}).
50
+ */
51
+ getColumnsOrNull(tableName: string): Promise<unknown | null>;
52
+ private _read;
53
+ /**
54
+ * The configuration REST services use WCF `BodyStyle = Wrapped`, so a response
55
+ * is nested under a single `<Method>Result` key (e.g. `GetTableColumnsDetailsResult`).
56
+ * Unwrap it so failure detection and the returned payload see the actual response.
57
+ */
58
+ private _unwrapResult;
59
+ /** Creatio serializes `BaseResponse.Success` as camelCase `success`; tolerate both. */
60
+ private _isFailure;
61
+ private _errorCode;
62
+ private _omitUndefined;
63
+ }
64
+ //# sourceMappingURL=dataforge-client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dataforge-client.d.ts","sourceRoot":"","sources":["../../../../src/server/mcp/dataforge/dataforge-client.ts"],"names":[],"mappings":"AACA,OAAO,EACN,mBAAmB,EACnB,uBAAuB,EACvB,gBAAgB,EAEhB,MAAM,iBAAiB,CAAC;AAGzB,YAAY,EACX,mBAAmB,EACnB,wBAAwB,EACxB,uBAAuB,EACvB,uBAAuB,EACvB,gBAAgB,GAChB,MAAM,iBAAiB,CAAC;AAEzB;;;;;;;;;GASG;AAEH,MAAM,WAAW,kBAAkB;IAClC,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CAC3B;AAED,MAAM,WAAW,uBAAuB;IACvC,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC3B,aAAa,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IACpC,WAAW,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;CAClC;AAED,MAAM,WAAW,iBAAiB;IACjC,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAChC,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CAC3B;AAMD,qBAAa,eAAe;IAC3B,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAsB;IACrD,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAmB;gBAEpC,aAAa,EAAE,mBAAmB,EAAE,WAAW,EAAE,gBAAgB;IAK7E;;;;OAIG;IACU,SAAS,IAAI,OAAO,CAAC,OAAO,CAAC;IAUnC,oBAAoB,CAAC,CAAC,EAAE,kBAAkB,GAAG,OAAO,CAAC,uBAAuB,CAAC;IAI7E,eAAe,CAAC,CAAC,EAAE,kBAAkB,GAAG,OAAO,CAAC,uBAAuB,CAAC;IAIxE,qBAAqB,CAAC,CAAC,EAAE,uBAAuB,GAAG,OAAO,CAAC,uBAAuB,CAAC;IAUnF,eAAe,CAAC,CAAC,EAAE,iBAAiB,GAAG,OAAO,CAAC,uBAAuB,CAAC;IAQvE,eAAe,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,uBAAuB,CAAC;IAIpE,gBAAgB,IAAI,OAAO,CAAC,uBAAuB,CAAC;IAS3D;;;;;OAKG;IACU,gBAAgB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC;IAiBzE,OAAO,CAAC,KAAK;IAYb;;;;OAIG;IACH,OAAO,CAAC,aAAa;IAUrB,uFAAuF;IACvF,OAAO,CAAC,UAAU;IAQlB,OAAO,CAAC,UAAU;IASlB,OAAO,CAAC,cAAc;CAGtB"}
@@ -0,0 +1,130 @@
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.DataForgeClient = void 0;
7
+ const log_1 = __importDefault(require("../../../log"));
8
+ const creatio_rest_1 = require("../creatio-rest");
9
+ const READ_SERVICE = 'DataForgeSchemaReadService';
10
+ const MAINTENANCE_SERVICE = 'DataForgeMaintenanceService';
11
+ const SERVICE_URL_SETTING = 'DataForgeServiceUrl';
12
+ class DataForgeClient {
13
+ _configuration;
14
+ _sysSettings;
15
+ constructor(configuration, sysSettings) {
16
+ this._configuration = configuration;
17
+ this._sysSettings = sysSettings;
18
+ }
19
+ /**
20
+ * Whether DataForge is configured on this environment. Gated on a non-empty
21
+ * `DataForgeServiceUrl`, mirroring the server-side `IsDataForgeEnabled` check.
22
+ * Probe failures are treated as "disabled" so callers degrade gracefully.
23
+ */
24
+ async isEnabled() {
25
+ try {
26
+ const response = await this._sysSettings.queryValues([SERVICE_URL_SETTING]);
27
+ return (0, creatio_rest_1.hasNonEmptySetting)(response, SERVICE_URL_SETTING);
28
+ }
29
+ catch (err) {
30
+ log_1.default.warn('dataforge.probe.failed', { error: String(err) });
31
+ return false;
32
+ }
33
+ }
34
+ getSimilarTableNames(q) {
35
+ return this._read('GetSimilarTableNames', { query: q.query, limit: q.limit });
36
+ }
37
+ getTableDetails(q) {
38
+ return this._read('GetTableDetails', { query: q.query, limit: q.limit });
39
+ }
40
+ getTableRelationships(q) {
41
+ return this._read('GetTableRelationships', {
42
+ sourceTable: q.sourceTable,
43
+ targetTable: q.targetTable,
44
+ limit: q.limit,
45
+ bidirectional: q.bidirectional,
46
+ skipDetails: q.skipDetails,
47
+ });
48
+ }
49
+ getLookupValues(q) {
50
+ return this._read('GetLookupValues', {
51
+ query: q.query,
52
+ schemaName: q.schemaName,
53
+ limit: q.limit,
54
+ });
55
+ }
56
+ getTableColumns(tableName) {
57
+ return this._read('GetTableColumnsDetails', { tableName });
58
+ }
59
+ getServiceStatus() {
60
+ return this._configuration.call({
61
+ service: MAINTENANCE_SERVICE,
62
+ method: 'GetServiceStatus',
63
+ httpMethod: 'POST',
64
+ body: {},
65
+ });
66
+ }
67
+ /**
68
+ * Column details for `describe-entity` routing: returns the response body when
69
+ * DataForge answers successfully, or `null` so the caller can fall back to
70
+ * OData metadata. Per-call resilience only — a single miss or error never
71
+ * disables DataForge globally (that verdict is owned by {@link isEnabled}).
72
+ */
73
+ async getColumnsOrNull(tableName) {
74
+ try {
75
+ const { body } = await this.getTableColumns(tableName);
76
+ const result = this._unwrapResult(body);
77
+ if (this._isFailure(result)) {
78
+ log_1.default.info('dataforge.describe-entity.fallback', {
79
+ reason: this._errorCode(result) ?? 'success_false',
80
+ });
81
+ return null;
82
+ }
83
+ return result ?? null;
84
+ }
85
+ catch (err) {
86
+ log_1.default.warn('dataforge.describe-entity.error', { error: String(err) });
87
+ return null;
88
+ }
89
+ }
90
+ _read(method, request) {
91
+ return this._configuration.call({
92
+ service: READ_SERVICE,
93
+ method,
94
+ httpMethod: 'POST',
95
+ body: { request: this._omitUndefined(request) },
96
+ });
97
+ }
98
+ /**
99
+ * The configuration REST services use WCF `BodyStyle = Wrapped`, so a response
100
+ * is nested under a single `<Method>Result` key (e.g. `GetTableColumnsDetailsResult`).
101
+ * Unwrap it so failure detection and the returned payload see the actual response.
102
+ */
103
+ _unwrapResult(body) {
104
+ if (body && typeof body === 'object' && !Array.isArray(body)) {
105
+ const keys = Object.keys(body);
106
+ if (keys.length === 1 && keys[0].endsWith('Result')) {
107
+ return body[keys[0]];
108
+ }
109
+ }
110
+ return body;
111
+ }
112
+ /** Creatio serializes `BaseResponse.Success` as camelCase `success`; tolerate both. */
113
+ _isFailure(result) {
114
+ if (!result || typeof result !== 'object') {
115
+ return false;
116
+ }
117
+ const r = result;
118
+ return r.success === false || r.Success === false;
119
+ }
120
+ _errorCode(result) {
121
+ const r = result;
122
+ const info = r?.errorInfo ?? r?.ErrorInfo;
123
+ return info?.errorCode ?? info?.ErrorCode;
124
+ }
125
+ _omitUndefined(obj) {
126
+ return Object.fromEntries(Object.entries(obj).filter(([, value]) => value !== undefined));
127
+ }
128
+ }
129
+ exports.DataForgeClient = DataForgeClient;
130
+ //# sourceMappingURL=dataforge-client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dataforge-client.js","sourceRoot":"","sources":["../../../../src/server/mcp/dataforge/dataforge-client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ import { ToolPreparer, ToolRegistrar } from '../tool-preparer';
2
+ import { DataForgeClient } from './dataforge-client';
3
+ /** Stable capability key; also used by the Server to gate describe-entity routing. */
4
+ export declare const DATAFORGE_CAPABILITY = "dataforge";
5
+ /**
6
+ * Registers the DataForge MCP tools, but only when DataForge is enabled on the
7
+ * environment. Encapsulates everything DataForge-specific so the Server remains
8
+ * agnostic of how the capability is probed or wired.
9
+ */
10
+ export declare class DataForgeToolPreparer implements ToolPreparer {
11
+ readonly name = "dataforge";
12
+ private readonly _client;
13
+ constructor(client: DataForgeClient);
14
+ prepare(registrar: ToolRegistrar): Promise<boolean>;
15
+ private _registerTools;
16
+ }
17
+ //# sourceMappingURL=dataforge-tool-preparer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dataforge-tool-preparer.d.ts","sourceRoot":"","sources":["../../../../src/server/mcp/dataforge/dataforge-tool-preparer.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAc/D,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAErD,sFAAsF;AACtF,eAAO,MAAM,oBAAoB,cAAc,CAAC;AAEhD;;;;GAIG;AACH,qBAAa,qBAAsB,YAAW,YAAY;IACzD,SAAgB,IAAI,eAAwB;IAE5C,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAkB;gBAE9B,MAAM,EAAE,eAAe;IAItB,OAAO,CAAC,SAAS,EAAE,aAAa,GAAG,OAAO,CAAC,OAAO,CAAC;IAShE,OAAO,CAAC,cAAc;CA2CtB"}
@@ -0,0 +1,42 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.DataForgeToolPreparer = exports.DATAFORGE_CAPABILITY = void 0;
4
+ const utils_1 = require("../../../utils");
5
+ const tools_data_1 = require("../tools-data");
6
+ /** Stable capability key; also used by the Server to gate describe-entity routing. */
7
+ exports.DATAFORGE_CAPABILITY = 'dataforge';
8
+ /**
9
+ * Registers the DataForge MCP tools, but only when DataForge is enabled on the
10
+ * environment. Encapsulates everything DataForge-specific so the Server remains
11
+ * agnostic of how the capability is probed or wired.
12
+ */
13
+ class DataForgeToolPreparer {
14
+ name = exports.DATAFORGE_CAPABILITY;
15
+ _client;
16
+ constructor(client) {
17
+ this._client = client;
18
+ }
19
+ async prepare(registrar) {
20
+ const enabled = await this._client.isEnabled();
21
+ if (!enabled) {
22
+ return false;
23
+ }
24
+ this._registerTools(registrar);
25
+ return true;
26
+ }
27
+ _registerTools(registrar) {
28
+ registrar.register('dataforge-similar-tables', tools_data_1.dataforgeSimilarTablesDescriptor, (0, utils_1.withValidation)(tools_data_1.dataforgeSimilarTablesInput, ({ query, limit }) => this._client.getSimilarTableNames({ query, limit })));
29
+ registrar.register('dataforge-table-details', tools_data_1.dataforgeTableDetailsDescriptor, (0, utils_1.withValidation)(tools_data_1.dataforgeTableDetailsInput, ({ query, limit }) => this._client.getTableDetails({ query, limit })));
30
+ registrar.register('dataforge-table-relationships', tools_data_1.dataforgeTableRelationshipsDescriptor, (0, utils_1.withValidation)(tools_data_1.dataforgeTableRelationshipsInput, ({ sourceTable, targetTable, limit, bidirectional, skipDetails }) => this._client.getTableRelationships({
31
+ sourceTable,
32
+ targetTable,
33
+ limit,
34
+ bidirectional,
35
+ skipDetails,
36
+ })));
37
+ registrar.register('dataforge-lookup-values', tools_data_1.dataforgeLookupValuesDescriptor, (0, utils_1.withValidation)(tools_data_1.dataforgeLookupValuesInput, ({ query, schemaName, limit }) => this._client.getLookupValues({ query, schemaName, limit })));
38
+ registrar.register('dataforge-status', tools_data_1.dataforgeStatusDescriptor, (0, utils_1.withValidation)(tools_data_1.dataforgeStatusInput, () => this._client.getServiceStatus()));
39
+ }
40
+ }
41
+ exports.DataForgeToolPreparer = DataForgeToolPreparer;
42
+ //# sourceMappingURL=dataforge-tool-preparer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dataforge-tool-preparer.js","sourceRoot":"","sources":["../../../../src/server/mcp/dataforge/dataforge-tool-preparer.ts"],"names":[],"mappings":";;;AAAA,0CAAgD;AAEhD,8CAWuB;AAIvB,sFAAsF;AACzE,QAAA,oBAAoB,GAAG,WAAW,CAAC;AAEhD;;;;GAIG;AACH,MAAa,qBAAqB;IACjB,IAAI,GAAG,4BAAoB,CAAC;IAE3B,OAAO,CAAkB;IAE1C,YAAY,MAAuB;QAClC,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC;IACvB,CAAC;IAEM,KAAK,CAAC,OAAO,CAAC,SAAwB;QAC5C,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,CAAC;QAC/C,IAAI,CAAC,OAAO,EAAE,CAAC;YACd,OAAO,KAAK,CAAC;QACd,CAAC;QACD,IAAI,CAAC,cAAc,CAAC,SAAS,CAAC,CAAC;QAC/B,OAAO,IAAI,CAAC;IACb,CAAC;IAEO,cAAc,CAAC,SAAwB;QAC9C,SAAS,CAAC,QAAQ,CACjB,0BAA0B,EAC1B,6CAAgC,EAChC,IAAA,sBAAc,EAAC,wCAA2B,EAAE,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,EAAE,CAChE,IAAI,CAAC,OAAO,CAAC,oBAAoB,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CACnD,CACD,CAAC;QACF,SAAS,CAAC,QAAQ,CACjB,yBAAyB,EACzB,4CAA+B,EAC/B,IAAA,sBAAc,EAAC,uCAA0B,EAAE,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,EAAE,CAC/D,IAAI,CAAC,OAAO,CAAC,eAAe,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAC9C,CACD,CAAC;QACF,SAAS,CAAC,QAAQ,CACjB,+BAA+B,EAC/B,kDAAqC,EACrC,IAAA,sBAAc,EACb,6CAAgC,EAChC,CAAC,EAAE,WAAW,EAAE,WAAW,EAAE,KAAK,EAAE,aAAa,EAAE,WAAW,EAAE,EAAE,EAAE,CACnE,IAAI,CAAC,OAAO,CAAC,qBAAqB,CAAC;YAClC,WAAW;YACX,WAAW;YACX,KAAK;YACL,aAAa;YACb,WAAW;SACX,CAAC,CACH,CACD,CAAC;QACF,SAAS,CAAC,QAAQ,CACjB,yBAAyB,EACzB,4CAA+B,EAC/B,IAAA,sBAAc,EAAC,uCAA0B,EAAE,CAAC,EAAE,KAAK,EAAE,UAAU,EAAE,KAAK,EAAE,EAAE,EAAE,CAC3E,IAAI,CAAC,OAAO,CAAC,eAAe,CAAC,EAAE,KAAK,EAAE,UAAU,EAAE,KAAK,EAAE,CAAC,CAC1D,CACD,CAAC;QACF,SAAS,CAAC,QAAQ,CACjB,kBAAkB,EAClB,sCAAyB,EACzB,IAAA,sBAAc,EAAC,iCAAoB,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,gBAAgB,EAAE,CAAC,CAC3E,CAAC;IACH,CAAC;CACD;AA7DD,sDA6DC"}
@@ -1 +1 @@
1
- {"version":3,"file":"filters.d.ts","sourceRoot":"","sources":["../../../src/server/mcp/filters.ts"],"names":[],"mappings":"AA6DA,wBAAgB,yBAAyB,CAAC,OAAO,EAAE,GAAG,GAAG,SAAS,GAAG,MAAM,GAAG,SAAS,CAmCtF"}
1
+ {"version":3,"file":"filters.d.ts","sourceRoot":"","sources":["../../../src/server/mcp/filters.ts"],"names":[],"mappings":"AA8EA,wBAAgB,yBAAyB,CAAC,OAAO,EAAE,GAAG,GAAG,SAAS,GAAG,MAAM,GAAG,SAAS,CAmCtF"}
@@ -24,14 +24,26 @@ function literalFor(field, value) {
24
24
  }
25
25
  if (t === 'string') {
26
26
  const v = String(value);
27
- const isNavigationProperty = field.includes('/');
28
- if (isGuid(v) && isIdish(field) && !isNavigationProperty) {
27
+ // Bare (unquoted) GUID for any Id-typed path — the scalar key `Id`, a lookup
28
+ // FK `XxxId`, or a navigation `Xxx/Id`. Other strings (incl. `Xxx/Name`) are quoted.
29
+ if (isGuid(v) && isIdish(field)) {
29
30
  return v;
30
31
  }
31
32
  return `'${escapeStr(v)}'`;
32
33
  }
33
34
  return `'${escapeStr(JSON.stringify(value))}'`;
34
35
  }
36
+ // Creatio OData cannot filter a lookup by its scalar FK column (`ContactId eq <guid>`
37
+ // 500s "Column by path ContactId not found"); it must be filtered through the
38
+ // navigation property (`Contact/Id eq <guid>`), per the official docs and verified
39
+ // live. Rewrite `<Lookup>Id` -> `<Lookup>/Id` for equality against a GUID. The
40
+ // primary key `Id` and already-navigated paths are left untouched.
41
+ function lookupNavField(field, value) {
42
+ if (isGuid(value) && field !== 'Id' && !field.includes('/') && /Id$/.test(field)) {
43
+ return `${field.slice(0, -2)}/Id`;
44
+ }
45
+ return field;
46
+ }
35
47
  function buildCondition(c) {
36
48
  if (!c || !c.field) {
37
49
  return undefined;
@@ -42,7 +54,10 @@ function buildCondition(c) {
42
54
  if (!values.length) {
43
55
  return undefined;
44
56
  }
45
- const parts = values.map((v) => `${field} eq ${literalFor(field, v)}`);
57
+ const parts = values.map((v) => {
58
+ const f = lookupNavField(field, v);
59
+ return `${f} eq ${literalFor(f, v)}`;
60
+ });
46
61
  return parts.length === 1 ? parts[0] : `(${parts.join(' or ')})`;
47
62
  }
48
63
  const op = String(c.op || 'eq');
@@ -53,7 +68,8 @@ function buildCondition(c) {
53
68
  if (value == null && (op === 'eq' || op === 'ne')) {
54
69
  return `${field} ${op} null`;
55
70
  }
56
- return `${field} ${op} ${literalFor(field, value)}`;
71
+ const f = op === 'eq' || op === 'ne' ? lookupNavField(field, value) : field;
72
+ return `${f} ${op} ${literalFor(f, value)}`;
57
73
  }
58
74
  function buildFilterFromStructured(filters) {
59
75
  if (!filters || typeof filters !== 'object') {
@@ -1 +1 @@
1
- {"version":3,"file":"filters.js","sourceRoot":"","sources":["../../../src/server/mcp/filters.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"filters.js","sourceRoot":"","sources":["../../../src/server/mcp/filters.ts"],"names":[],"mappings":"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"}