mcp-creatio 0.6.4 → 0.6.5

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 CHANGED
@@ -239,6 +239,16 @@ curl -sS http://localhost:3000/mcp \
239
239
  > the MCP. (Injecting other credential shapes, e.g. cookie/basic per tenant, is intentionally out of
240
240
  > scope for now.)
241
241
 
242
+ > **Per-tenant tool isolation.** A single MCP deployment serving many instances keeps each tenant's
243
+ > tool surface separate, keyed by the effective base URL (`X-Creatio-Base-Url`, else `CREATIO_BASE_URL`).
244
+ > Optional capabilities are **probed per tenant** and the tools they expose (DataForge, Global Search,
245
+ > and any dynamically discovered per-instance tools) are registered only for the tenant they were
246
+ > discovered on. Tenant A's tools or DataForge verdict never leak into tenant B's session, even though
247
+ > both share one process. The
248
+ > per-tenant state is pooled with idle-TTL + LRU eviction, so memory stays bounded as the number of
249
+ > distinct instances grows. Single-tenant modes (everything except `gateway` with an override) all map
250
+ > to one bucket, so their behavior is unchanged.
251
+
242
252
  ### `client_credentials` / `legacy`
243
253
 
244
254
  ```bash
@@ -1 +1 @@
1
- {"version":3,"file":"mcp-handlers.d.ts","sourceRoot":"","sources":["../../../src/server/http/mcp-handlers.ts"],"names":[],"mappings":"AAcA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AACrC,OAAO,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAEjD,qBAAa,WAAW;IACvB,OAAO,CAAC,QAAQ,CAAC,eAAe,CAA2B;IAC3D,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;gBAErB,MAAM,EAAE,MAAM;IAIb,aAAa,CAAC,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC;IA4DzD,oBAAoB,CAAC,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC;CAuB7E"}
1
+ {"version":3,"file":"mcp-handlers.d.ts","sourceRoot":"","sources":["../../../src/server/http/mcp-handlers.ts"],"names":[],"mappings":"AAcA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AACrC,OAAO,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAEjD,qBAAa,WAAW;IACvB,OAAO,CAAC,QAAQ,CAAC,eAAe,CAA2B;IAC3D,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;gBAErB,MAAM,EAAE,MAAM;IAIb,aAAa,CAAC,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC;IA8DzD,oBAAoB,CAAC,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC;CAuB7E"}
@@ -19,6 +19,9 @@ class McpHandlers {
19
19
  async handleMcpPost(req, res) {
20
20
  const sessionId = (0, utils_1.getSessionIdFromRequest)(req);
21
21
  const bearerUserKey = req.userKey;
22
+ // Gateway multi-tenant routing key — selects which tenant the session server and capability
23
+ // probe bind to (absent in single-tenant modes ⇒ the default tenant).
24
+ const baseUrlOverride = req.baseUrlOverride;
22
25
  let transport;
23
26
  const remoteIp = (0, utils_1.getClientIp)(req);
24
27
  if (sessionId && this._sessionContext.hasSession(sessionId)) {
@@ -42,9 +45,9 @@ class McpHandlers {
42
45
  },
43
46
  });
44
47
  // Each session gets its own McpServer (a single McpServer connects to one transport
45
- // only). Release it when the transport closes so we don't leak servers or register
46
- // late-probed tools into dead sessions.
47
- const mcp = this._server.createSessionServer();
48
+ // only), bound to the request's tenant. Release it when the transport closes so we
49
+ // don't leak servers or register late-probed tools into dead sessions.
50
+ const mcp = this._server.createSessionServer(baseUrlOverride);
48
51
  transport.onclose = () => {
49
52
  this._server.releaseSessionServer(mcp);
50
53
  if (transport?.sessionId) {
@@ -65,11 +68,10 @@ class McpHandlers {
65
68
  const session = this._sessionContext.getSession(sessionId);
66
69
  const userKey = bearerUserKey || session?.userKey;
67
70
  const bearerToken = req.bearerToken;
68
- const baseUrlOverride = req.baseUrlOverride;
69
71
  await (0, utils_1.runWithContext)({ userKey, sessionId, bearerToken, baseUrlOverride }, async () => {
70
- // Kick the one-time capability probe from inside the request context so its Creatio
72
+ // Kick the per-tenant capability probe from inside the request context so its Creatio
71
73
  // calls carry this caller's identity (broker mode has no user otherwise). Non-blocking.
72
- this._server.ensureCapabilitiesProbed();
74
+ this._server.ensureCapabilitiesProbed(baseUrlOverride);
73
75
  return transport.handleRequest(req, res, req.body);
74
76
  });
75
77
  }
@@ -1 +1 @@
1
- {"version":3,"file":"mcp-handlers.js","sourceRoot":"","sources":["../../../src/server/http/mcp-handlers.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"mcp-handlers.js","sourceRoot":"","sources":["../../../src/server/http/mcp-handlers.ts"],"names":[],"mappings":"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"}
@@ -13,39 +13,46 @@ export declare class Server {
13
13
  private readonly _engines;
14
14
  private readonly _descriptors;
15
15
  private readonly _handlers;
16
- private readonly _sessionServers;
17
- private _probeComplete;
18
- private _probeInFlight;
19
- private _readonly;
20
- private _serverName;
21
- private _serverVersion;
16
+ private readonly _registry;
22
17
  private readonly _dataForge;
23
18
  private readonly _dataForgePreparer;
24
19
  private readonly _globalSearchPreparer;
25
20
  private readonly _publishedToolsPreparer;
26
21
  private readonly _preparers;
27
- private readonly _capabilities;
28
- private readonly _probeCooldownUntil;
22
+ private _readonly;
23
+ private _serverName;
24
+ private _serverVersion;
29
25
  get authProvider(): ICreatioAuthProvider;
30
26
  constructor(engines: CreatioEngineManager, config: ServerConfig);
27
+ /** Register the static, tenant-agnostic surface (core/mutating tools + prompts) into a session. */
31
28
  private _registerAllInto;
32
- private _registerHandlerWithDescriptor;
29
+ /** Record a static tool in the shared maps. Registered into each session by {@link
30
+ * _registerAllInto}; called only at construction, before any session exists. */
31
+ private _registerStaticTool;
33
32
  private _normalizeToToolHandler;
34
33
  private _registerAsTool;
35
34
  private _registerPrompts;
36
- /** Adapter exposing handler registration to {@link ToolPreparer}s. */
35
+ /** The tenant bucket key for a request's base-URL override: the normalized override (gateway
36
+ * multi-tenant) or {@link DEFAULT_TENANT_KEY} for every single-tenant mode. Mirrors how the
37
+ * HTTP client resolves the effective base URL, so tools and caches key on the same tenant. */
38
+ private _tenantKey;
39
+ /** The current request's tenant state (resolved from the per-request base-URL override). Falls
40
+ * back to the default tenant when there is no active request context (e.g. stdio, tests). */
41
+ private _currentTenantState;
42
+ /** Adapter exposing handler registration to {@link ToolPreparer}s — scoped to ONE tenant: a
43
+ * discovered tool is recorded in that tenant's state and pushed into its live sessions only. */
37
44
  private _toolRegistrar;
38
45
  /**
39
- * Probe each optional-capability preparer that has no verdict yet and let it register its tools
40
- * when available. A preparer that returns cleanly (true/false) gets a recorded verdict and is
41
- * never re-probed; one that THROWS (e.g. the caller's identity isn't usable yet) records nothing
42
- * so a later authenticated connect can retry it — which also makes registration idempotent (an
43
- * already-enabled preparer is skipped, so its tools are never registered twice). Invoked from
44
- * {@link ensureCapabilitiesProbed} within a request context so probe calls carry the caller's
45
- * identity. Returns whether EVERY preparer now has a verdict (the probe is complete).
46
+ * Probe each optional-capability preparer that has no verdict yet FOR THIS TENANT and let it
47
+ * register its tools when available. A preparer that returns cleanly (true/false) gets a recorded
48
+ * verdict and is never re-probed; one that THROWS (e.g. the caller's identity isn't usable yet)
49
+ * records nothing so a later authenticated connect can retry it — which also makes registration
50
+ * idempotent (an already-enabled preparer is skipped, so its tools are never registered twice).
51
+ * Invoked from {@link ensureCapabilitiesProbed} within a request context so probe calls carry the
52
+ * caller's identity. Returns whether EVERY preparer now has a verdict (the probe is complete).
46
53
  */
47
54
  private _prepareTools;
48
- /** Whether DataForge was probed as enabled at startup. */
55
+ /** Whether DataForge was probed as enabled for the given tenant (defaults to the current one). */
49
56
  private _isDataForgeReady;
50
57
  /** Compile the `read` tool args into a neutral {@link ReadQuery}: structured `filters`
51
58
  * become a {@link FilterNode}; a raw `$filter` string and `expand` are carried as
@@ -65,26 +72,28 @@ export declare class Server {
65
72
  private _clientToolDefs;
66
73
  private _registerClientTools;
67
74
  /**
68
- * Build a fresh {@link McpServer} for one transport/session, with the full known tool +
69
- * prompt surface registered, and track it so the capability probe can later push
70
- * late-discovered tools into it. Each session MUST get its own server (a single McpServer
71
- * connects to only one transport).
75
+ * Build a fresh {@link McpServer} for one transport/session, registering the static surface plus
76
+ * the calling tenant's already-discovered dynamic tools, and track it under that tenant so the
77
+ * capability probe can later push late-discovered tools into it. Each session MUST get its own
78
+ * server (a single McpServer connects to only one transport). `baseUrlOverride` (gateway
79
+ * `X-Creatio-Base-Url`) selects the tenant; absent ⇒ the single default tenant.
72
80
  */
73
- createSessionServer(): McpServer;
81
+ createSessionServer(baseUrlOverride?: string): McpServer;
74
82
  /**
75
- * Probe optional capabilities once per process, WITHOUT blocking the MCP handshake. These do
83
+ * Probe optional capabilities once per tenant, WITHOUT blocking the MCP handshake. These do
76
84
  * network I/O (DataForge/Global Search probes, and the publishing app's tools/list, which can
77
85
  * be slow) — awaiting would delay connect past the client's init timeout. Discovered tools
78
- * register into every live session server as they resolve (the SDK emits
79
- * notifications/tools/list_changed) and into the maps for future sessions.
86
+ * register into the tenant's live session servers as they resolve (the SDK emits
87
+ * notifications/tools/list_changed) and into the tenant state for its future sessions.
80
88
  *
81
89
  * MUST be called from within the per-request context ({@link runWithContext}) so the probe's
82
90
  * Creatio calls carry the caller's identity/token — otherwise broker mode resolves no user.
91
+ * `baseUrlOverride` selects the tenant; absent ⇒ the single default tenant.
83
92
  */
84
- ensureCapabilitiesProbed(): void;
93
+ ensureCapabilitiesProbed(baseUrlOverride?: string): void;
85
94
  /** Untrack and close one session's server (call when its transport closes). */
86
95
  releaseSessionServer(mcp: McpServer): void;
87
- /** Close every live session server (process shutdown). */
96
+ /** Close every live session server across all tenants (process shutdown). */
88
97
  stopAll(): Promise<void>;
89
98
  }
90
99
  //# sourceMappingURL=server.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../../src/server/mcp/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAEpE,OAAO,EACN,oBAAoB,EACpB,oBAAoB,EAGpB,MAAM,eAAe,CAAC;AA0DvB,MAAM,WAAW,YAAY;IAC5B,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB;0FACsF;IACtF,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,sFAAsF;IACtF,mBAAmB,CAAC,EAAE,OAAO,CAAC;CAC9B;AAWD,qBAAa,MAAM;IAGlB,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,uBAAuB,CAAU;IAEzD,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAuB;IAChD,OAAO,CAAC,QAAQ,CAAC,YAAY,CAA0B;IACvD,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAkC;IAK5D,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAwB;IAMxD,OAAO,CAAC,cAAc,CAAS;IAC/B,OAAO,CAAC,cAAc,CAAS;IAC/B,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,WAAW,CAAQ;IAC3B,OAAO,CAAC,cAAc,CAAW;IAIjC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAkB;IAC7C,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAAwB;IAC3D,OAAO,CAAC,QAAQ,CAAC,qBAAqB,CAA2B;IACjE,OAAO,CAAC,QAAQ,CAAC,uBAAuB,CAA+B;IACvE,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAiB;IAC5C,OAAO,CAAC,QAAQ,CAAC,aAAa,CAA8B;IAC5D,OAAO,CAAC,QAAQ,CAAC,mBAAmB,CAA6B;IAEjE,IAAW,YAAY,IAAI,oBAAoB,CAE9C;gBAEW,OAAO,EAAE,oBAAoB,EAAE,MAAM,EAAE,YAAY;IAsB/D,OAAO,CAAC,gBAAgB;IAOxB,OAAO,CAAC,8BAA8B;IAWtC,OAAO,CAAC,uBAAuB;IAmC/B,OAAO,CAAC,eAAe;IAkBvB,OAAO,CAAC,gBAAgB;IAmBxB,sEAAsE;IACtE,OAAO,CAAC,cAAc;IAOtB;;;;;;;;OAQG;YACW,aAAa;IA2B3B,0DAA0D;IAC1D,OAAO,CAAC,iBAAiB;IAIzB;;;+FAG2F;YAC7E,KAAK;IAyBnB;;iFAE6E;YAC/D,eAAe;IAY7B;;;;;OAKG;IACH,OAAO,CAAC,eAAe;IA8IvB,OAAO,CAAC,oBAAoB;IAY5B;;;;;OAKG;IACI,mBAAmB,IAAI,SAAS;IAWvC;;;;;;;;;OASG;IACI,wBAAwB,IAAI,IAAI;IAevC,+EAA+E;IACxE,oBAAoB,CAAC,GAAG,EAAE,SAAS,GAAG,IAAI;IASjD,0DAA0D;IAC7C,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;CAWrC"}
1
+ {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../../src/server/mcp/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAEpE,OAAO,EACN,oBAAoB,EACpB,oBAAoB,EAGpB,MAAM,eAAe,CAAC;AAiEvB,MAAM,WAAW,YAAY;IAC5B,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB;0FACsF;IACtF,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,sFAAsF;IACtF,mBAAmB,CAAC,EAAE,OAAO,CAAC;CAC9B;AAWD,qBAAa,MAAM;IAGlB,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,uBAAuB,CAAU;IAEzD,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAuB;IAKhD,OAAO,CAAC,QAAQ,CAAC,YAAY,CAA0B;IACvD,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAkC;IAM5D,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAqB;IAI/C,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAkB;IAC7C,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAAwB;IAC3D,OAAO,CAAC,QAAQ,CAAC,qBAAqB,CAA2B;IACjE,OAAO,CAAC,QAAQ,CAAC,uBAAuB,CAA+B;IACvE,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAiB;IAC5C,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,WAAW,CAAQ;IAC3B,OAAO,CAAC,cAAc,CAAW;IAEjC,IAAW,YAAY,IAAI,oBAAoB,CAE9C;gBAEW,OAAO,EAAE,oBAAoB,EAAE,MAAM,EAAE,YAAY;IAuB/D,mGAAmG;IACnG,OAAO,CAAC,gBAAgB;IAOxB;qFACiF;IACjF,OAAO,CAAC,mBAAmB;IAK3B,OAAO,CAAC,uBAAuB;IAqC/B,OAAO,CAAC,eAAe;IAkBvB,OAAO,CAAC,gBAAgB;IAmBxB;;mGAE+F;IAC/F,OAAO,CAAC,UAAU;IAKlB;kGAC8F;IAC9F,OAAO,CAAC,mBAAmB;IAI3B;qGACiG;IACjG,OAAO,CAAC,cAAc;IActB;;;;;;;;OAQG;YACW,aAAa;IAwB3B,kGAAkG;IAClG,OAAO,CAAC,iBAAiB;IAIzB;;;+FAG2F;YAC7E,KAAK;IAyBnB;;iFAE6E;YAC/D,eAAe;IAY7B;;;;;OAKG;IACH,OAAO,CAAC,eAAe;IA8IvB,OAAO,CAAC,oBAAoB;IAQ5B;;;;;;OAMG;IACI,mBAAmB,CAAC,eAAe,CAAC,EAAE,MAAM,GAAG,SAAS;IAe/D;;;;;;;;;;OAUG;IACI,wBAAwB,CAAC,eAAe,CAAC,EAAE,MAAM,GAAG,IAAI;IAgB/D,+EAA+E;IACxE,oBAAoB,CAAC,GAAG,EAAE,SAAS,GAAG,IAAI;IASjD,6EAA6E;IAChE,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;CAWrC"}
@@ -16,6 +16,7 @@ const filters_1 = require("./filters");
16
16
  const globalsearch_client_1 = require("./globalsearch/globalsearch-client");
17
17
  const globalsearch_tool_preparer_1 = require("./globalsearch/globalsearch-tool-preparer");
18
18
  const prompts_data_1 = require("./prompts-data");
19
+ const tenant_tool_registry_1 = require("./tenant-tool-registry");
19
20
  const tools_data_1 = require("./tools-data");
20
21
  /** Default page size for `read` when the caller omits `top`, so we never dump an
21
22
  * unbounded result set into the model. Explicit `top` (incl. `0` for count-only)
@@ -26,39 +27,36 @@ class Server {
26
27
  // persistently-failing capability doesn't fire its network probe on every new session connect.
27
28
  static PROBE_RETRY_COOLDOWN_MS = 30_000;
28
29
  _engines;
30
+ // Static tool surface, shared across every session and tenant: these handlers are user-agnostic
31
+ // (they read identity from the per-request context at call time) and identical for every Creatio
32
+ // instance. Each new session server gets the full set; capability/dynamic tools are NOT here —
33
+ // they live per-tenant in `_registry` so one tenant's verdict/tools never leak to another.
29
34
  _descriptors = new Map();
30
35
  _handlers = new Map();
31
- // One McpServer per live transport/session. A single McpServer can be connected to only one
32
- // transport, so a shared singleton would reject the second concurrent session's connect()
33
- // ("Already connected to a transport"). The handler/descriptor maps below are user-agnostic
34
- // (they read identity from the per-request context at call time) and so are shared across all.
35
- _sessionServers = new Set();
36
- // The optional-capability probe runs until every preparer yields a DEFINITIVE verdict
37
- // (enabled/disabled). Capabilities are instance-level, so one good round serves all sessions.
38
- // A round where a Creatio-backed probe only errored (e.g. the first caller's identity wasn't
39
- // usable yet) is NOT memoized a later authenticated connect retries. `_probeInFlight` guards
40
- // against concurrent connects each kicking a probe.
41
- _probeComplete = false;
42
- _probeInFlight = false;
43
- _readonly = false;
44
- _serverName = version_1.NAME;
45
- _serverVersion = version_1.VERSION;
46
- // DataForge access layer + optional-capability preparers. `_capabilities`
47
- // records each preparer's startup verdict so core tools (describe-entity)
48
- // can route through a capability only when it is actually enabled.
36
+ // Per-tenant capability + dynamic-tool + live-session state, keyed by effective Creatio base URL.
37
+ // One McpServer per live transport/session (a single McpServer connects to only one transport,
38
+ // so a shared singleton would reject a 2nd concurrent connect() with "Already connected"); the
39
+ // registry tracks those session servers per tenant so a late-probed tool is pushed only into the
40
+ // sessions of the tenant it was discovered for.
41
+ _registry;
42
+ // DataForge access layer + optional-capability preparers. The probe verdict is recorded PER
43
+ // TENANT (in `_registry`) so core tools (describe-entity) route through a capability only when it
44
+ // is actually enabled for the calling tenant's instance.
49
45
  _dataForge;
50
46
  _dataForgePreparer;
51
47
  _globalSearchPreparer;
52
48
  _publishedToolsPreparer;
53
49
  _preparers;
54
- _capabilities = new Map();
55
- _probeCooldownUntil = new Map();
50
+ _readonly = false;
51
+ _serverName = version_1.NAME;
52
+ _serverVersion = version_1.VERSION;
56
53
  get authProvider() {
57
54
  return this._engines.authProvider;
58
55
  }
59
56
  constructor(engines, config) {
60
57
  this._engines = engines;
61
58
  this._readonly = config.readonlyMode ?? false;
59
+ this._registry = new tenant_tool_registry_1.TenantToolRegistry();
62
60
  this._dataForge = new dataforge_client_1.DataForgeClient(engines.configuration, engines.sysSettings);
63
61
  this._dataForgePreparer = new dataforge_tool_preparer_1.DataForgeToolPreparer(this._dataForge);
64
62
  this._globalSearchPreparer = new globalsearch_tool_preparer_1.GlobalSearchToolPreparer(new globalsearch_client_1.GlobalSearchClient(engines.configuration, engines.sysSettings));
@@ -72,21 +70,18 @@ class Server {
72
70
  ];
73
71
  this._registerClientTools();
74
72
  }
73
+ /** Register the static, tenant-agnostic surface (core/mutating tools + prompts) into a session. */
75
74
  _registerAllInto(mcp) {
76
75
  for (const [name, handler] of this._handlers.entries()) {
77
- this._registerAsTool(mcp, name, handler);
76
+ this._registerAsTool(mcp, name, this._descriptors.get(name), handler);
78
77
  }
79
78
  this._registerPrompts(mcp);
80
79
  }
81
- _registerHandlerWithDescriptor(name, descriptor, handler) {
80
+ /** Record a static tool in the shared maps. Registered into each session by {@link
81
+ * _registerAllInto}; called only at construction, before any session exists. */
82
+ _registerStaticTool(name, descriptor, handler) {
82
83
  this._handlers.set(name, handler);
83
84
  this._descriptors.set(name, descriptor);
84
- // Late registration (the capability probe runs after sessions may already be connected):
85
- // push the tool into every live session server so already-connected clients see it — the
86
- // SDK emits notifications/tools/list_changed. New sessions pick it up from the maps above.
87
- for (const mcp of this._sessionServers) {
88
- this._registerAsTool(mcp, name, handler);
89
- }
90
85
  }
91
86
  _normalizeToToolHandler(handler) {
92
87
  return async (args) => {
@@ -120,15 +115,15 @@ class Server {
120
115
  };
121
116
  };
122
117
  }
123
- _registerAsTool(mcp, name, handler) {
118
+ _registerAsTool(mcp, name, descriptor, handler) {
124
119
  try {
125
- const descriptor = this._descriptors.get(name) ||
120
+ const toolDescriptor = descriptor ||
126
121
  {
127
122
  title: name,
128
123
  description: `Tool ${name}`,
129
124
  inputSchema: {},
130
125
  };
131
- mcp.registerTool(name, descriptor, async (args) => {
126
+ mcp.registerTool(name, toolDescriptor, async (args) => {
132
127
  return this._normalizeToToolHandler(handler)(args);
133
128
  });
134
129
  log_1.default.info('mcp.tool.register', { tool: name });
@@ -152,48 +147,69 @@ class Server {
152
147
  log_1.default.warn('mcp.prompts.register.failed', { error: String(err) });
153
148
  }
154
149
  }
155
- /** Adapter exposing handler registration to {@link ToolPreparer}s. */
156
- _toolRegistrar() {
150
+ /** The tenant bucket key for a request's base-URL override: the normalized override (gateway
151
+ * multi-tenant) or {@link DEFAULT_TENANT_KEY} for every single-tenant mode. Mirrors how the
152
+ * HTTP client resolves the effective base URL, so tools and caches key on the same tenant. */
153
+ _tenantKey(baseUrlOverride) {
154
+ const trimmed = baseUrlOverride?.trim();
155
+ return trimmed ? trimmed.replace(/\/$/, '') : tenant_tool_registry_1.DEFAULT_TENANT_KEY;
156
+ }
157
+ /** The current request's tenant state (resolved from the per-request base-URL override). Falls
158
+ * back to the default tenant when there is no active request context (e.g. stdio, tests). */
159
+ _currentTenantState() {
160
+ return this._registry.getState(this._tenantKey((0, utils_1.getBaseUrlOverride)()));
161
+ }
162
+ /** Adapter exposing handler registration to {@link ToolPreparer}s — scoped to ONE tenant: a
163
+ * discovered tool is recorded in that tenant's state and pushed into its live sessions only. */
164
+ _toolRegistrar(state) {
157
165
  return {
158
- register: (name, descriptor, handler) => this._registerHandlerWithDescriptor(name, descriptor, handler),
166
+ register: (name, descriptor, handler) => {
167
+ state.dynamicTools.set(name, { descriptor, handler });
168
+ // Late registration (the probe runs after sessions may already be connected): push
169
+ // the tool into the tenant's live session servers so connected clients see it — the
170
+ // SDK emits notifications/tools/list_changed. New sessions pick it up on connect.
171
+ for (const mcp of state.sessionServers) {
172
+ this._registerAsTool(mcp, name, descriptor, handler);
173
+ }
174
+ },
159
175
  };
160
176
  }
161
177
  /**
162
- * Probe each optional-capability preparer that has no verdict yet and let it register its tools
163
- * when available. A preparer that returns cleanly (true/false) gets a recorded verdict and is
164
- * never re-probed; one that THROWS (e.g. the caller's identity isn't usable yet) records nothing
165
- * so a later authenticated connect can retry it — which also makes registration idempotent (an
166
- * already-enabled preparer is skipped, so its tools are never registered twice). Invoked from
167
- * {@link ensureCapabilitiesProbed} within a request context so probe calls carry the caller's
168
- * identity. Returns whether EVERY preparer now has a verdict (the probe is complete).
178
+ * Probe each optional-capability preparer that has no verdict yet FOR THIS TENANT and let it
179
+ * register its tools when available. A preparer that returns cleanly (true/false) gets a recorded
180
+ * verdict and is never re-probed; one that THROWS (e.g. the caller's identity isn't usable yet)
181
+ * records nothing so a later authenticated connect can retry it — which also makes registration
182
+ * idempotent (an already-enabled preparer is skipped, so its tools are never registered twice).
183
+ * Invoked from {@link ensureCapabilitiesProbed} within a request context so probe calls carry the
184
+ * caller's identity. Returns whether EVERY preparer now has a verdict (the probe is complete).
169
185
  */
170
- async _prepareTools() {
171
- const registrar = this._toolRegistrar();
186
+ async _prepareTools(state) {
187
+ const registrar = this._toolRegistrar(state);
172
188
  const now = Date.now();
173
189
  for (const preparer of this._preparers) {
174
- if (this._capabilities.has(preparer.name)) {
190
+ if (state.capabilities.has(preparer.name)) {
175
191
  continue; // definitive verdict already recorded — don't re-probe or re-register
176
192
  }
177
- if (now < (this._probeCooldownUntil.get(preparer.name) ?? 0)) {
193
+ if (now < (state.cooldownUntil.get(preparer.name) ?? 0)) {
178
194
  continue; // recently failed — back off rather than re-probe on every connect
179
195
  }
180
196
  try {
181
197
  const enabled = await preparer.prepare(registrar);
182
- this._capabilities.set(preparer.name, enabled);
198
+ state.capabilities.set(preparer.name, enabled);
183
199
  log_1.default.info('mcp.prepare', { preparer: preparer.name, enabled });
184
200
  }
185
201
  catch (err) {
186
202
  // No verdict — leave unrecorded so a later authenticated connect retries, but not
187
203
  // before the cooldown elapses.
188
- this._probeCooldownUntil.set(preparer.name, Date.now() + Server.PROBE_RETRY_COOLDOWN_MS);
204
+ state.cooldownUntil.set(preparer.name, Date.now() + Server.PROBE_RETRY_COOLDOWN_MS);
189
205
  log_1.default.warn('mcp.prepare.failed', { preparer: preparer.name, error: String(err) });
190
206
  }
191
207
  }
192
- return this._preparers.every((p) => this._capabilities.has(p.name));
208
+ return this._preparers.every((p) => state.capabilities.has(p.name));
193
209
  }
194
- /** Whether DataForge was probed as enabled at startup. */
195
- _isDataForgeReady() {
196
- return this._capabilities.get(this._dataForgePreparer.name) === true;
210
+ /** Whether DataForge was probed as enabled for the given tenant (defaults to the current one). */
211
+ _isDataForgeReady(state = this._currentTenantState()) {
212
+ return state.capabilities.get(this._dataForgePreparer.name) === true;
197
213
  }
198
214
  /** Compile the `read` tool args into a neutral {@link ReadQuery}: structured `filters`
199
215
  * become a {@link FilterNode}; a raw `$filter` string and `expand` are carried as
@@ -227,7 +243,7 @@ class Server {
227
243
  * CRUD backend's schema on a per-call miss. The `source` discriminator is part of the
228
244
  * public tool contract and reflects where the schema actually came from. */
229
245
  async _describeEntity(entitySet) {
230
- if (this._isDataForgeReady()) {
246
+ if (this._isDataForgeReady(this._currentTenantState())) {
231
247
  const dataForge = await this._dataForge.getColumnsOrNull(entitySet);
232
248
  if (dataForge !== null) {
233
249
  return { source: 'dataforge', entitySet, dataForge };
@@ -381,52 +397,59 @@ class Server {
381
397
  const { core, mutating } = this._clientToolDefs();
382
398
  const defs = this._readonly ? core : [...core, ...mutating];
383
399
  for (const def of defs) {
384
- this._registerHandlerWithDescriptor(def.name, def.descriptor, (0, utils_1.withValidation)(def.input, def.run));
400
+ this._registerStaticTool(def.name, def.descriptor, (0, utils_1.withValidation)(def.input, def.run));
385
401
  }
386
402
  }
387
403
  /**
388
- * Build a fresh {@link McpServer} for one transport/session, with the full known tool +
389
- * prompt surface registered, and track it so the capability probe can later push
390
- * late-discovered tools into it. Each session MUST get its own server (a single McpServer
391
- * connects to only one transport).
404
+ * Build a fresh {@link McpServer} for one transport/session, registering the static surface plus
405
+ * the calling tenant's already-discovered dynamic tools, and track it under that tenant so the
406
+ * capability probe can later push late-discovered tools into it. Each session MUST get its own
407
+ * server (a single McpServer connects to only one transport). `baseUrlOverride` (gateway
408
+ * `X-Creatio-Base-Url`) selects the tenant; absent ⇒ the single default tenant.
392
409
  */
393
- createSessionServer() {
410
+ createSessionServer(baseUrlOverride) {
394
411
  const mcp = new mcp_js_1.McpServer({ name: this._serverName, version: this._serverVersion });
395
412
  this._registerAllInto(mcp);
396
- this._sessionServers.add(mcp);
413
+ const state = this._registry.getState(this._tenantKey(baseUrlOverride));
414
+ for (const [name, tool] of state.dynamicTools) {
415
+ this._registerAsTool(mcp, name, tool.descriptor, tool.handler);
416
+ }
417
+ state.sessionServers.add(mcp);
397
418
  log_1.default.serverStart(this._serverName, this._serverVersion, {
398
- tools: Array.from(this._handlers.keys()),
419
+ tools: [...this._handlers.keys(), ...state.dynamicTools.keys()],
399
420
  prompts: prompts_data_1.ALL_PROMPTS.length,
400
421
  });
401
422
  return mcp;
402
423
  }
403
424
  /**
404
- * Probe optional capabilities once per process, WITHOUT blocking the MCP handshake. These do
425
+ * Probe optional capabilities once per tenant, WITHOUT blocking the MCP handshake. These do
405
426
  * network I/O (DataForge/Global Search probes, and the publishing app's tools/list, which can
406
427
  * be slow) — awaiting would delay connect past the client's init timeout. Discovered tools
407
- * register into every live session server as they resolve (the SDK emits
408
- * notifications/tools/list_changed) and into the maps for future sessions.
428
+ * register into the tenant's live session servers as they resolve (the SDK emits
429
+ * notifications/tools/list_changed) and into the tenant state for its future sessions.
409
430
  *
410
431
  * MUST be called from within the per-request context ({@link runWithContext}) so the probe's
411
432
  * Creatio calls carry the caller's identity/token — otherwise broker mode resolves no user.
433
+ * `baseUrlOverride` selects the tenant; absent ⇒ the single default tenant.
412
434
  */
413
- ensureCapabilitiesProbed() {
414
- if (this._probeComplete || this._probeInFlight) {
435
+ ensureCapabilitiesProbed(baseUrlOverride) {
436
+ const state = this._registry.getState(this._tenantKey(baseUrlOverride));
437
+ if (state.probeComplete || state.probeInFlight) {
415
438
  return;
416
439
  }
417
- this._probeInFlight = true;
418
- void this._prepareTools()
440
+ state.probeInFlight = true;
441
+ void this._prepareTools(state)
419
442
  .then((complete) => {
420
- this._probeComplete = complete;
443
+ state.probeComplete = complete;
421
444
  })
422
445
  .catch((err) => log_1.default.warn('mcp.prepare.error', { error: String(err) }))
423
446
  .finally(() => {
424
- this._probeInFlight = false;
447
+ state.probeInFlight = false;
425
448
  });
426
449
  }
427
450
  /** Untrack and close one session's server (call when its transport closes). */
428
451
  releaseSessionServer(mcp) {
429
- this._sessionServers.delete(mcp);
452
+ this._registry.findBySession(mcp)?.sessionServers.delete(mcp);
430
453
  try {
431
454
  mcp.close();
432
455
  }
@@ -434,9 +457,9 @@ class Server {
434
457
  log_1.default.warn('mcp.stop.failed', { error: String(err) });
435
458
  }
436
459
  }
437
- /** Close every live session server (process shutdown). */
460
+ /** Close every live session server across all tenants (process shutdown). */
438
461
  async stopAll() {
439
- for (const mcp of this._sessionServers) {
462
+ for (const mcp of this._registry.allSessionServers()) {
440
463
  try {
441
464
  mcp.close();
442
465
  }
@@ -444,7 +467,7 @@ class Server {
444
467
  log_1.default.warn('mcp.stop.failed', { error: String(err) });
445
468
  }
446
469
  }
447
- this._sessionServers.clear();
470
+ this._registry.clear();
448
471
  log_1.default.serverStop(this._serverName, this._serverVersion);
449
472
  }
450
473
  }
@@ -1 +1 @@
1
- {"version":3,"file":"server.js","sourceRoot":"","sources":["../../../src/server/mcp/server.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../../../src/server/mcp/server.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,66 @@
1
+ import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
+ import { ToolHandler } from './tool-preparer';
3
+ /**
4
+ * Tenant bucket for every single-tenant auth mode (legacy / client-credentials / delegated /
5
+ * broker) and any gateway request that does NOT override the base URL. In those modes there is
6
+ * exactly one Creatio instance, so one shared bucket is correct and the behaviour is identical to
7
+ * the pre-multitenant server. Only a gateway request carrying `X-Creatio-Base-Url` gets its own
8
+ * per-instance bucket — that is where cross-tenant isolation actually matters.
9
+ */
10
+ export declare const DEFAULT_TENANT_KEY = "__default__";
11
+ /** A capability tool discovered for one tenant: its MCP descriptor + the handler that runs it. */
12
+ export interface DynamicTool {
13
+ descriptor: unknown;
14
+ handler: ToolHandler;
15
+ }
16
+ /**
17
+ * Per-tenant capability + dynamic-tool state — one entry per effective Creatio base URL. Each
18
+ * tenant carries its OWN optional-capability probe verdicts, the tools those capabilities
19
+ * registered, and the live session servers to push late-discovered tools into. Keeping all of this
20
+ * per-tenant is what stops tenant A's capability verdict (DataForge on/off) or A's published tools
21
+ * from leaking to tenant B on a shared multi-tenant (gateway) deployment — the previous design
22
+ * probed once from the first caller and applied that verdict to everyone.
23
+ */
24
+ export declare class TenantToolState {
25
+ readonly capabilities: Map<string, boolean>;
26
+ readonly cooldownUntil: Map<string, number>;
27
+ readonly dynamicTools: Map<string, DynamicTool>;
28
+ readonly sessionServers: Set<McpServer>;
29
+ probeComplete: boolean;
30
+ probeInFlight: boolean;
31
+ lastAccessMs: number;
32
+ constructor(now: number);
33
+ }
34
+ export interface TenantToolRegistryOptions {
35
+ /** Max distinct tenants retained; idle, session-less tenants are evicted LRU past this. */
36
+ maxTenants?: number;
37
+ /** Idle TTL (ms): a tenant with NO live sessions is dropped after this long untouched. */
38
+ ttlMs?: number;
39
+ }
40
+ /**
41
+ * Holds {@link TenantToolState} per tenant with TTL + LRU eviction — the tool-surface analog of a
42
+ * tenant client pool. A tenant with live session servers is NEVER evicted (its dynamic tools back
43
+ * those live sessions); only idle, session-less tenants are pruned, so memory stays bounded as the
44
+ * number of distinct Creatio instances seen by a gateway deployment grows.
45
+ */
46
+ export declare class TenantToolRegistry {
47
+ private readonly _maxTenants;
48
+ private readonly _ttlMs;
49
+ private readonly _tenants;
50
+ get size(): number;
51
+ constructor(options?: TenantToolRegistryOptions);
52
+ /** Evict idle, session-less tenants past the TTL, then enforce the LRU cap (still only over
53
+ * session-less tenants — an active tenant whose dynamic tools back a live session is kept). */
54
+ private _prune;
55
+ /** The state for a tenant, creating it on first use. Touches recency, then prunes stale peers —
56
+ * pruning AFTER the insert/touch so the cap is enforced on the resulting set (never left over
57
+ * by one) and the just-accessed tenant is the most-recently-used, so never the one evicted. */
58
+ getState(tenantKey: string, now?: number): TenantToolState;
59
+ /** The tenant state owning a given session server (to release it when its transport closes). */
60
+ findBySession(mcp: McpServer): TenantToolState | undefined;
61
+ /** Every live session server across all tenants (process shutdown). */
62
+ allSessionServers(): McpServer[];
63
+ /** Drop all tenant state (process shutdown). */
64
+ clear(): void;
65
+ }
66
+ //# sourceMappingURL=tenant-tool-registry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tenant-tool-registry.d.ts","sourceRoot":"","sources":["../../../src/server/mcp/tenant-tool-registry.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAEpE,OAAO,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAE9C;;;;;;GAMG;AACH,eAAO,MAAM,kBAAkB,gBAAgB,CAAC;AAEhD,kGAAkG;AAClG,MAAM,WAAW,WAAW;IAC3B,UAAU,EAAE,OAAO,CAAC;IACpB,OAAO,EAAE,WAAW,CAAC;CACrB;AAED;;;;;;;GAOG;AACH,qBAAa,eAAe;IAC3B,SAAgB,YAAY,uBAA8B;IAC1D,SAAgB,aAAa,sBAA6B;IAC1D,SAAgB,YAAY,2BAAkC;IAC9D,SAAgB,cAAc,iBAAwB;IAC/C,aAAa,UAAS;IACtB,aAAa,UAAS;IACtB,YAAY,EAAE,MAAM,CAAC;gBAEhB,GAAG,EAAE,MAAM;CAGvB;AAED,MAAM,WAAW,yBAAyB;IACzC,2FAA2F;IAC3F,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,0FAA0F;IAC1F,KAAK,CAAC,EAAE,MAAM,CAAC;CACf;AAED;;;;;GAKG;AACH,qBAAa,kBAAkB;IAC9B,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAS;IACrC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;IAChC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAsC;IAE/D,IAAW,IAAI,IAAI,MAAM,CAExB;gBAEW,OAAO,GAAE,yBAA8B;IAKnD;oGACgG;IAChG,OAAO,CAAC,MAAM;IAsBd;;oGAEgG;IACzF,QAAQ,CAAC,SAAS,EAAE,MAAM,EAAE,GAAG,GAAE,MAAmB,GAAG,eAAe;IAa7E,gGAAgG;IACzF,aAAa,CAAC,GAAG,EAAE,SAAS,GAAG,eAAe,GAAG,SAAS;IASjE,uEAAuE;IAChE,iBAAiB,IAAI,SAAS,EAAE;IAUvC,gDAAgD;IACzC,KAAK,IAAI,IAAI;CAGpB"}
@@ -0,0 +1,113 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.TenantToolRegistry = exports.TenantToolState = exports.DEFAULT_TENANT_KEY = void 0;
4
+ /**
5
+ * Tenant bucket for every single-tenant auth mode (legacy / client-credentials / delegated /
6
+ * broker) and any gateway request that does NOT override the base URL. In those modes there is
7
+ * exactly one Creatio instance, so one shared bucket is correct and the behaviour is identical to
8
+ * the pre-multitenant server. Only a gateway request carrying `X-Creatio-Base-Url` gets its own
9
+ * per-instance bucket — that is where cross-tenant isolation actually matters.
10
+ */
11
+ exports.DEFAULT_TENANT_KEY = '__default__';
12
+ /**
13
+ * Per-tenant capability + dynamic-tool state — one entry per effective Creatio base URL. Each
14
+ * tenant carries its OWN optional-capability probe verdicts, the tools those capabilities
15
+ * registered, and the live session servers to push late-discovered tools into. Keeping all of this
16
+ * per-tenant is what stops tenant A's capability verdict (DataForge on/off) or A's published tools
17
+ * from leaking to tenant B on a shared multi-tenant (gateway) deployment — the previous design
18
+ * probed once from the first caller and applied that verdict to everyone.
19
+ */
20
+ class TenantToolState {
21
+ capabilities = new Map();
22
+ cooldownUntil = new Map();
23
+ dynamicTools = new Map();
24
+ sessionServers = new Set();
25
+ probeComplete = false;
26
+ probeInFlight = false;
27
+ lastAccessMs;
28
+ constructor(now) {
29
+ this.lastAccessMs = now;
30
+ }
31
+ }
32
+ exports.TenantToolState = TenantToolState;
33
+ /**
34
+ * Holds {@link TenantToolState} per tenant with TTL + LRU eviction — the tool-surface analog of a
35
+ * tenant client pool. A tenant with live session servers is NEVER evicted (its dynamic tools back
36
+ * those live sessions); only idle, session-less tenants are pruned, so memory stays bounded as the
37
+ * number of distinct Creatio instances seen by a gateway deployment grows.
38
+ */
39
+ class TenantToolRegistry {
40
+ _maxTenants;
41
+ _ttlMs;
42
+ _tenants = new Map();
43
+ get size() {
44
+ return this._tenants.size;
45
+ }
46
+ constructor(options = {}) {
47
+ this._maxTenants = options.maxTenants ?? 100;
48
+ this._ttlMs = options.ttlMs ?? 30 * 60_000;
49
+ }
50
+ /** Evict idle, session-less tenants past the TTL, then enforce the LRU cap (still only over
51
+ * session-less tenants — an active tenant whose dynamic tools back a live session is kept). */
52
+ _prune(now) {
53
+ for (const [key, state] of this._tenants) {
54
+ if (state.sessionServers.size === 0 && now - state.lastAccessMs > this._ttlMs) {
55
+ this._tenants.delete(key);
56
+ }
57
+ }
58
+ if (this._tenants.size <= this._maxTenants) {
59
+ return;
60
+ }
61
+ const evictable = Array.from(this._tenants.entries())
62
+ .filter(([, state]) => state.sessionServers.size === 0)
63
+ .sort((a, b) => a[1].lastAccessMs - b[1].lastAccessMs);
64
+ let over = this._tenants.size - this._maxTenants;
65
+ for (const [key] of evictable) {
66
+ if (over <= 0) {
67
+ break;
68
+ }
69
+ this._tenants.delete(key);
70
+ over--;
71
+ }
72
+ }
73
+ /** The state for a tenant, creating it on first use. Touches recency, then prunes stale peers —
74
+ * pruning AFTER the insert/touch so the cap is enforced on the resulting set (never left over
75
+ * by one) and the just-accessed tenant is the most-recently-used, so never the one evicted. */
76
+ getState(tenantKey, now = Date.now()) {
77
+ const existing = this._tenants.get(tenantKey);
78
+ if (existing) {
79
+ existing.lastAccessMs = now;
80
+ this._prune(now);
81
+ return existing;
82
+ }
83
+ const state = new TenantToolState(now);
84
+ this._tenants.set(tenantKey, state);
85
+ this._prune(now);
86
+ return state;
87
+ }
88
+ /** The tenant state owning a given session server (to release it when its transport closes). */
89
+ findBySession(mcp) {
90
+ for (const state of this._tenants.values()) {
91
+ if (state.sessionServers.has(mcp)) {
92
+ return state;
93
+ }
94
+ }
95
+ return undefined;
96
+ }
97
+ /** Every live session server across all tenants (process shutdown). */
98
+ allSessionServers() {
99
+ const servers = [];
100
+ for (const state of this._tenants.values()) {
101
+ for (const mcp of state.sessionServers) {
102
+ servers.push(mcp);
103
+ }
104
+ }
105
+ return servers;
106
+ }
107
+ /** Drop all tenant state (process shutdown). */
108
+ clear() {
109
+ this._tenants.clear();
110
+ }
111
+ }
112
+ exports.TenantToolRegistry = TenantToolRegistry;
113
+ //# sourceMappingURL=tenant-tool-registry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tenant-tool-registry.js","sourceRoot":"","sources":["../../../src/server/mcp/tenant-tool-registry.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "mcp-creatio",
3
- "version": "0.6.4",
3
+ "version": "0.6.5",
4
4
  "main": "dist/index.js",
5
5
  "bin": {
6
6
  "mcp-creatio": "dist/cli.js"