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.
- package/README.md +252 -212
- 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/providers/configuration-provider.d.ts +3 -2
- package/dist/creatio/providers/configuration-provider.d.ts.map +1 -1
- package/dist/creatio/providers/crud-provider.d.ts +2 -0
- package/dist/creatio/providers/crud-provider.d.ts.map +1 -1
- package/dist/creatio/services/configuration-service-provider.d.ts.map +1 -1
- package/dist/creatio/services/configuration-service-provider.js +11 -3
- package/dist/creatio/services/configuration-service-provider.js.map +1 -1
- 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/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 +3 -1
- package/dist/creatio/services/odata-crud-provider.d.ts.map +1 -1
- package/dist/creatio/services/odata-crud-provider.js +31 -8
- 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/creatio-rest.d.ts +44 -0
- package/dist/server/mcp/creatio-rest.d.ts.map +1 -0
- package/dist/server/mcp/creatio-rest.js +26 -0
- package/dist/server/mcp/creatio-rest.js.map +1 -0
- package/dist/server/mcp/crtmcp/crt-mcp-client.d.ts +55 -0
- package/dist/server/mcp/crtmcp/crt-mcp-client.d.ts.map +1 -0
- package/dist/server/mcp/crtmcp/crt-mcp-client.js +67 -0
- package/dist/server/mcp/crtmcp/crt-mcp-client.js.map +1 -0
- package/dist/server/mcp/crtmcp/crt-mcp-tool-preparer.d.ts +20 -0
- package/dist/server/mcp/crtmcp/crt-mcp-tool-preparer.d.ts.map +1 -0
- package/dist/server/mcp/crtmcp/crt-mcp-tool-preparer.js +74 -0
- package/dist/server/mcp/crtmcp/crt-mcp-tool-preparer.js.map +1 -0
- package/dist/server/mcp/dataforge/dataforge-client.d.ts +64 -0
- package/dist/server/mcp/dataforge/dataforge-client.d.ts.map +1 -0
- package/dist/server/mcp/dataforge/dataforge-client.js +130 -0
- package/dist/server/mcp/dataforge/dataforge-client.js.map +1 -0
- package/dist/server/mcp/dataforge/dataforge-tool-preparer.d.ts +17 -0
- package/dist/server/mcp/dataforge/dataforge-tool-preparer.d.ts.map +1 -0
- package/dist/server/mcp/dataforge/dataforge-tool-preparer.js +42 -0
- package/dist/server/mcp/dataforge/dataforge-tool-preparer.js.map +1 -0
- package/dist/server/mcp/filters.d.ts.map +1 -1
- package/dist/server/mcp/filters.js +20 -4
- package/dist/server/mcp/filters.js.map +1 -1
- package/dist/server/mcp/globalsearch/globalsearch-client.d.ts +50 -0
- package/dist/server/mcp/globalsearch/globalsearch-client.d.ts.map +1 -0
- package/dist/server/mcp/globalsearch/globalsearch-client.js +118 -0
- package/dist/server/mcp/globalsearch/globalsearch-client.js.map +1 -0
- package/dist/server/mcp/globalsearch/globalsearch-tool-preparer.d.ts +16 -0
- package/dist/server/mcp/globalsearch/globalsearch-tool-preparer.d.ts.map +1 -0
- package/dist/server/mcp/globalsearch/globalsearch-tool-preparer.js +34 -0
- package/dist/server/mcp/globalsearch/globalsearch-tool-preparer.js.map +1 -0
- package/dist/server/mcp/json-schema-to-zod.d.ts +3 -0
- package/dist/server/mcp/json-schema-to-zod.d.ts.map +1 -0
- package/dist/server/mcp/json-schema-to-zod.js +54 -0
- package/dist/server/mcp/json-schema-to-zod.js.map +1 -0
- package/dist/server/mcp/server.d.ts +18 -0
- package/dist/server/mcp/server.d.ts.map +1 -1
- package/dist/server/mcp/server.js +93 -25
- package/dist/server/mcp/server.js.map +1 -1
- package/dist/server/mcp/tool-preparer.d.ts +26 -0
- package/dist/server/mcp/tool-preparer.d.ts.map +1 -0
- package/dist/server/mcp/tool-preparer.js +11 -0
- package/dist/server/mcp/tool-preparer.js.map +1 -0
- package/dist/server/mcp/tools-data.d.ts +69 -10
- package/dist/server/mcp/tools-data.d.ts.map +1 -1
- package/dist/server/mcp/tools-data.js +222 -32
- 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 +18 -9
- 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 -190
- 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/admin-operation/admin-operation-engine.ts +0 -44
- package/src/creatio/engines/configuration/configuration-engine.ts +0 -26
- package/src/creatio/engines/crud/crud-engine.ts +0 -47
- package/src/creatio/engines/engine-manager.ts +0 -157
- package/src/creatio/engines/engine-registry.ts +0 -39
- package/src/creatio/engines/engine.ts +0 -3
- package/src/creatio/engines/feature/feature-engine.ts +0 -20
- package/src/creatio/engines/index.ts +0 -10
- 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 -21
- package/src/creatio/providers/admin-operation-provider.ts +0 -34
- package/src/creatio/providers/configuration-provider.ts +0 -22
- package/src/creatio/providers/crud-provider.ts +0 -45
- package/src/creatio/providers/feature-provider.ts +0 -10
- package/src/creatio/providers/index.ts +0 -7
- 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/admin-operation-service-provider.ts +0 -115
- package/src/creatio/services/configuration-service-provider.ts +0 -127
- package/src/creatio/services/creatio-service-context.ts +0 -55
- package/src/creatio/services/feature-service-provider.ts +0 -60
- package/src/creatio/services/http-client.ts +0 -174
- package/src/creatio/services/index.ts +0 -10
- 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 -1292
- package/src/server/mcp/server.ts +0 -442
- package/src/server/mcp/tools-data.ts +0 -748
- 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
|
@@ -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":"
|
|
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
|
-
|
|
28
|
-
|
|
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) =>
|
|
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
|
-
|
|
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":";;
|
|
1
|
+
{"version":3,"file":"filters.js","sourceRoot":"","sources":["../../../src/server/mcp/filters.ts"],"names":[],"mappings":"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"}
|