@elastic.io/mcp 1.0.0-beta

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 (174) hide show
  1. package/LICENSE +191 -0
  2. package/README.md +173 -0
  3. package/README.npm.md +173 -0
  4. package/dist/api/client.d.ts +12 -0
  5. package/dist/api/client.d.ts.map +1 -0
  6. package/dist/api/client.js +129 -0
  7. package/dist/api/client.js.map +1 -0
  8. package/dist/api/jsonapi.d.ts +21 -0
  9. package/dist/api/jsonapi.d.ts.map +1 -0
  10. package/dist/api/jsonapi.js +32 -0
  11. package/dist/api/jsonapi.js.map +1 -0
  12. package/dist/api/logger.d.ts +8 -0
  13. package/dist/api/logger.d.ts.map +1 -0
  14. package/dist/api/logger.js +43 -0
  15. package/dist/api/logger.js.map +1 -0
  16. package/dist/api/samples.d.ts +15 -0
  17. package/dist/api/samples.d.ts.map +1 -0
  18. package/dist/api/samples.js +465 -0
  19. package/dist/api/samples.js.map +1 -0
  20. package/dist/api/verification.d.ts +6 -0
  21. package/dist/api/verification.d.ts.map +1 -0
  22. package/dist/api/verification.js +71 -0
  23. package/dist/api/verification.js.map +1 -0
  24. package/dist/cli.d.ts +3 -0
  25. package/dist/cli.d.ts.map +1 -0
  26. package/dist/cli.js +9 -0
  27. package/dist/cli.js.map +1 -0
  28. package/dist/config.d.ts +15 -0
  29. package/dist/config.d.ts.map +1 -0
  30. package/dist/config.js +44 -0
  31. package/dist/config.js.map +1 -0
  32. package/dist/embeddings/factory.d.ts +7 -0
  33. package/dist/embeddings/factory.d.ts.map +1 -0
  34. package/dist/embeddings/factory.js +25 -0
  35. package/dist/embeddings/factory.js.map +1 -0
  36. package/dist/embeddings/google.d.ts +19 -0
  37. package/dist/embeddings/google.d.ts.map +1 -0
  38. package/dist/embeddings/google.js +132 -0
  39. package/dist/embeddings/google.js.map +1 -0
  40. package/dist/embeddings/types.d.ts +27 -0
  41. package/dist/embeddings/types.d.ts.map +1 -0
  42. package/dist/embeddings/types.js +2 -0
  43. package/dist/embeddings/types.js.map +1 -0
  44. package/dist/index.d.ts +3 -0
  45. package/dist/index.d.ts.map +1 -0
  46. package/dist/index.js +227 -0
  47. package/dist/index.js.map +1 -0
  48. package/dist/paths.d.ts +2 -0
  49. package/dist/paths.d.ts.map +1 -0
  50. package/dist/paths.js +10 -0
  51. package/dist/paths.js.map +1 -0
  52. package/dist/server.d.ts +29 -0
  53. package/dist/server.d.ts.map +1 -0
  54. package/dist/server.js +385 -0
  55. package/dist/server.js.map +1 -0
  56. package/dist/setup.d.ts +3 -0
  57. package/dist/setup.d.ts.map +1 -0
  58. package/dist/setup.js +338 -0
  59. package/dist/setup.js.map +1 -0
  60. package/dist/tools/confirmation.d.ts +37 -0
  61. package/dist/tools/confirmation.d.ts.map +1 -0
  62. package/dist/tools/confirmation.js +120 -0
  63. package/dist/tools/confirmation.js.map +1 -0
  64. package/dist/tools/constants.d.ts +28 -0
  65. package/dist/tools/constants.d.ts.map +1 -0
  66. package/dist/tools/constants.js +92 -0
  67. package/dist/tools/constants.js.map +1 -0
  68. package/dist/tools/definitions.d.ts +3 -0
  69. package/dist/tools/definitions.d.ts.map +1 -0
  70. package/dist/tools/definitions.js +915 -0
  71. package/dist/tools/definitions.js.map +1 -0
  72. package/dist/tools/flow-build.d.ts +18 -0
  73. package/dist/tools/flow-build.d.ts.map +1 -0
  74. package/dist/tools/flow-build.js +295 -0
  75. package/dist/tools/flow-build.js.map +1 -0
  76. package/dist/tools/flow-evidence.d.ts +62 -0
  77. package/dist/tools/flow-evidence.d.ts.map +1 -0
  78. package/dist/tools/flow-evidence.js +128 -0
  79. package/dist/tools/flow-evidence.js.map +1 -0
  80. package/dist/tools/flow-state-machine.d.ts +69 -0
  81. package/dist/tools/flow-state-machine.d.ts.map +1 -0
  82. package/dist/tools/flow-state-machine.js +292 -0
  83. package/dist/tools/flow-state-machine.js.map +1 -0
  84. package/dist/tools/handlers/auth.d.ts +3 -0
  85. package/dist/tools/handlers/auth.d.ts.map +1 -0
  86. package/dist/tools/handlers/auth.js +410 -0
  87. package/dist/tools/handlers/auth.js.map +1 -0
  88. package/dist/tools/handlers/component.d.ts +3 -0
  89. package/dist/tools/handlers/component.d.ts.map +1 -0
  90. package/dist/tools/handlers/component.js +165 -0
  91. package/dist/tools/handlers/component.js.map +1 -0
  92. package/dist/tools/handlers/data-sample.d.ts +3 -0
  93. package/dist/tools/handlers/data-sample.d.ts.map +1 -0
  94. package/dist/tools/handlers/data-sample.js +83 -0
  95. package/dist/tools/handlers/data-sample.js.map +1 -0
  96. package/dist/tools/handlers/dynamic.d.ts +3 -0
  97. package/dist/tools/handlers/dynamic.d.ts.map +1 -0
  98. package/dist/tools/handlers/dynamic.js +139 -0
  99. package/dist/tools/handlers/dynamic.js.map +1 -0
  100. package/dist/tools/handlers/flow.d.ts +9 -0
  101. package/dist/tools/handlers/flow.d.ts.map +1 -0
  102. package/dist/tools/handlers/flow.js +427 -0
  103. package/dist/tools/handlers/flow.js.map +1 -0
  104. package/dist/tools/handlers/log.d.ts +3 -0
  105. package/dist/tools/handlers/log.d.ts.map +1 -0
  106. package/dist/tools/handlers/log.js +92 -0
  107. package/dist/tools/handlers/log.js.map +1 -0
  108. package/dist/tools/handlers/organization.d.ts +3 -0
  109. package/dist/tools/handlers/organization.d.ts.map +1 -0
  110. package/dist/tools/handlers/organization.js +39 -0
  111. package/dist/tools/handlers/organization.js.map +1 -0
  112. package/dist/tools/handlers/raw.d.ts +3 -0
  113. package/dist/tools/handlers/raw.d.ts.map +1 -0
  114. package/dist/tools/handlers/raw.js +80 -0
  115. package/dist/tools/handlers/raw.js.map +1 -0
  116. package/dist/tools/handlers/search.d.ts +3 -0
  117. package/dist/tools/handlers/search.d.ts.map +1 -0
  118. package/dist/tools/handlers/search.js +105 -0
  119. package/dist/tools/handlers/search.js.map +1 -0
  120. package/dist/tools/handlers/session.d.ts +3 -0
  121. package/dist/tools/handlers/session.d.ts.map +1 -0
  122. package/dist/tools/handlers/session.js +22 -0
  123. package/dist/tools/handlers/session.js.map +1 -0
  124. package/dist/tools/handlers.d.ts +12 -0
  125. package/dist/tools/handlers.d.ts.map +1 -0
  126. package/dist/tools/handlers.js +202 -0
  127. package/dist/tools/handlers.js.map +1 -0
  128. package/dist/tools/helpers.d.ts +44 -0
  129. package/dist/tools/helpers.d.ts.map +1 -0
  130. package/dist/tools/helpers.js +195 -0
  131. package/dist/tools/helpers.js.map +1 -0
  132. package/dist/tools/types.d.ts +39 -0
  133. package/dist/tools/types.d.ts.map +1 -0
  134. package/dist/tools/types.js +2 -0
  135. package/dist/tools/types.js.map +1 -0
  136. package/dist/tools/validation.d.ts +35 -0
  137. package/dist/tools/validation.d.ts.map +1 -0
  138. package/dist/tools/validation.js +800 -0
  139. package/dist/tools/validation.js.map +1 -0
  140. package/dist/types/index.d.ts +47 -0
  141. package/dist/types/index.d.ts.map +1 -0
  142. package/dist/types/index.js +2 -0
  143. package/dist/types/index.js.map +1 -0
  144. package/dist/vectorstore/factory.d.ts +7 -0
  145. package/dist/vectorstore/factory.d.ts.map +1 -0
  146. package/dist/vectorstore/factory.js +25 -0
  147. package/dist/vectorstore/factory.js.map +1 -0
  148. package/dist/vectorstore/qdrant.d.ts +11 -0
  149. package/dist/vectorstore/qdrant.d.ts.map +1 -0
  150. package/dist/vectorstore/qdrant.js +107 -0
  151. package/dist/vectorstore/qdrant.js.map +1 -0
  152. package/dist/vectorstore/types.d.ts +28 -0
  153. package/dist/vectorstore/types.d.ts.map +1 -0
  154. package/dist/vectorstore/types.js +2 -0
  155. package/dist/vectorstore/types.js.map +1 -0
  156. package/package.json +66 -0
  157. package/resources/docs/flow-building-guide.md +581 -0
  158. package/resources/docs/rest-api-pagination.md +58 -0
  159. package/resources/docs/standardized-components-guide.md +66 -0
  160. package/resources/docs/system-instructions.md +207 -0
  161. package/resources/flow-examples/batch-flow-1-collect.json +51 -0
  162. package/resources/flow-examples/batch-flow-2-process.json +70 -0
  163. package/resources/flow-examples/code-component-transform.json +65 -0
  164. package/resources/flow-examples/code-component-trigger.json +52 -0
  165. package/resources/flow-examples/code-component-with-credentials-trigger.json +53 -0
  166. package/resources/flow-examples/code-component-with-credentials.json +67 -0
  167. package/resources/flow-examples/filter-step.json +63 -0
  168. package/resources/flow-examples/polling-sync-trigger.json +50 -0
  169. package/resources/flow-examples/router-branching.json +94 -0
  170. package/resources/flow-examples/splitter-re-assemble.json +72 -0
  171. package/resources/flow-examples/splitter-split.json +68 -0
  172. package/resources/flow-examples/timer-query-action-sync.json +68 -0
  173. package/resources/flow-examples/webhook-async-sync.json +49 -0
  174. package/resources/flow-examples/webhook-request-reply.json +63 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"raw.d.ts","sourceRoot":"","sources":["../../../src/tools/handlers/raw.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAmC1C,eAAO,MAAM,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,WAAW,CAyDnD,CAAC"}
@@ -0,0 +1,80 @@
1
+ import { deserializeJsonApi } from '../../api/jsonapi.js';
2
+ import { textResult } from '../helpers.js';
3
+ const BLOCKED_PATH_PREFIXES = [
4
+ '/sidedoor',
5
+ '/v1',
6
+ '/sailor-support'
7
+ ];
8
+ const BLOCKED_V2_PREFIXES = [
9
+ '/users',
10
+ '/tenants'
11
+ ];
12
+ function isBlockedPath(normalizedPath) {
13
+ if (BLOCKED_PATH_PREFIXES.some(p => normalizedPath.startsWith(p))) {
14
+ return true;
15
+ }
16
+ const v2Path = normalizedPath.startsWith('/v2/')
17
+ ? normalizedPath.slice(3) // '/v2/users' → '/users'
18
+ : normalizedPath.startsWith('/') ? null : `/${normalizedPath}`;
19
+ if (v2Path && BLOCKED_V2_PREFIXES.some(p => v2Path.startsWith(p))) {
20
+ return true;
21
+ }
22
+ if (!normalizedPath.startsWith('/')) {
23
+ const asAbsolute = `/${normalizedPath}`;
24
+ if (BLOCKED_V2_PREFIXES.some(p => asAbsolute.startsWith(p))) {
25
+ return true;
26
+ }
27
+ }
28
+ return false;
29
+ }
30
+ export const rawHandlers = {
31
+ execute_raw_api_request: async (args, { client }) => {
32
+ const { method, path, body } = args;
33
+ const decoded = decodeURIComponent(path);
34
+ if (/^[a-z][a-z0-9+.-]*:\/\//i.test(decoded) || decoded.startsWith('//')) {
35
+ throw new Error('Absolute URLs are not allowed. Use a relative path (e.g. /v2/flows).');
36
+ }
37
+ if (/^(data|javascript|vbscript):/i.test(decoded)) {
38
+ throw new Error('This URL scheme is not allowed.');
39
+ }
40
+ if (/\.\./.test(decoded) || /\\/.test(decoded)) {
41
+ throw new Error('Path traversal is not allowed.');
42
+ }
43
+ const normalized = decoded.replace(/\/+/g, '/').toLowerCase();
44
+ if (isBlockedPath(normalized)) {
45
+ throw new Error('This API path is restricted and cannot be accessed via the raw request tool. ' +
46
+ 'Use dedicated tools or the platform UI instead.');
47
+ }
48
+ if (/[?&](api_key|apiKey|access_token|password|authorization)=/i.test(decoded)) {
49
+ throw new Error('Passing credentials in query parameters is not allowed.');
50
+ }
51
+ // Strip leading /v2 prefix — the client's baseURL already includes /v2,
52
+ // so passing /v2/flows would result in /v2/v2/flows
53
+ const sanitizedPath = decoded.replace(/^\/v2\//, '/');
54
+ if (!['GET', 'HEAD', 'OPTIONS'].includes(String(method).toUpperCase()) && /^\/(flows|data-samples)(?:[/?]|$)/i.test(sanitizedPath.startsWith('/') ? sanitizedPath : `/${sanitizedPath}`)) {
55
+ throw new Error('Flow and sample mutations must use dedicated tools so revision, readiness and sample checks cannot be bypassed.');
56
+ }
57
+ const response = await client.request({
58
+ method,
59
+ url: sanitizedPath,
60
+ data: body
61
+ });
62
+ let data;
63
+ if (typeof response.data === 'object') {
64
+ try {
65
+ data = deserializeJsonApi(response.data);
66
+ if ((data === undefined || data === null) && response.data !== null) {
67
+ data = response.data;
68
+ }
69
+ }
70
+ catch {
71
+ data = response.data;
72
+ }
73
+ }
74
+ else {
75
+ data = response.data;
76
+ }
77
+ return textResult(data);
78
+ }
79
+ };
80
+ //# sourceMappingURL=raw.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"raw.js","sourceRoot":"","sources":["../../../src/tools/handlers/raw.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { ToolHandler } from '../types.js';
2
+ export declare const searchHandlers: Record<string, ToolHandler>;
3
+ //# sourceMappingURL=search.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"search.d.ts","sourceRoot":"","sources":["../../../src/tools/handlers/search.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAc1C,eAAO,MAAM,cAAc,EAAE,MAAM,CAAC,MAAM,EAAE,WAAW,CAyFtD,CAAC"}
@@ -0,0 +1,105 @@
1
+ import { getEmbeddingProvider } from '../../embeddings/factory.js';
2
+ import { getVectorStore } from '../../vectorstore/factory.js';
3
+ import { textResult } from '../helpers.js';
4
+ import { logger } from '../../api/logger.js';
5
+ import { SEARCH_RESULTS_DEFAULT_LIMIT } from '../constants.js';
6
+ const useLocalSearch = !!process.env.ELASTICIO_MCP_LOCAL_SEARCH;
7
+ function isCollectionNotFoundError(err) {
8
+ const status = err?.response?.status || err?.statusCode;
9
+ const errStr = String(err);
10
+ return status === 404
11
+ || errStr.toLowerCase().includes('not found')
12
+ || errStr.toLowerCase().includes('collection');
13
+ }
14
+ export const searchHandlers = {
15
+ search_documentation: async (args, { client }) => {
16
+ const { query } = args;
17
+ try {
18
+ if (useLocalSearch) {
19
+ const provider = getEmbeddingProvider();
20
+ const vectorStore = getVectorStore();
21
+ const queryVector = await provider.embedText(query);
22
+ const searchResults = await vectorStore.search(queryVector, SEARCH_RESULTS_DEFAULT_LIMIT);
23
+ return textResult(searchResults);
24
+ }
25
+ const response = await client.post('/mcp/search', {
26
+ query,
27
+ collection: 'documentation',
28
+ limit: SEARCH_RESULTS_DEFAULT_LIMIT,
29
+ });
30
+ return textResult(response.data.data);
31
+ }
32
+ catch (err) {
33
+ if (isCollectionNotFoundError(err)) {
34
+ logger.warn(`[search_documentation] Collection 'documentation' does not exist yet. Returning empty search results.`);
35
+ return textResult([]);
36
+ }
37
+ throw err;
38
+ }
39
+ },
40
+ search_flow_samples: async (args, { client }) => {
41
+ const { query, limit = SEARCH_RESULTS_DEFAULT_LIMIT } = args;
42
+ try {
43
+ if (useLocalSearch) {
44
+ const provider = getEmbeddingProvider();
45
+ const vectorStore = getVectorStore();
46
+ const queryVector = await provider.embedText(query);
47
+ const filter = { must: [{ key: 'type', match: { value: 'flow_sample' } }] };
48
+ const searchResults = await vectorStore.search(queryVector, limit, filter, 'flow_samples');
49
+ return textResult(searchResults);
50
+ }
51
+ const response = await client.post('/mcp/search', {
52
+ query,
53
+ collection: 'flow_samples',
54
+ limit,
55
+ filter: { must: [{ key: 'type', match: { value: 'flow_sample' } }] },
56
+ });
57
+ return textResult(response.data.data);
58
+ }
59
+ catch (err) {
60
+ if (isCollectionNotFoundError(err)) {
61
+ logger.warn(`[search_flow_samples] Collection 'flow_samples' does not exist yet. Returning empty search results.`);
62
+ return textResult([]);
63
+ }
64
+ throw err;
65
+ }
66
+ },
67
+ search_flow_steps: async (args, { client }) => {
68
+ const { query, limit = SEARCH_RESULTS_DEFAULT_LIMIT } = args;
69
+ try {
70
+ if (useLocalSearch) {
71
+ const provider = getEmbeddingProvider();
72
+ const vectorStore = getVectorStore();
73
+ const queryVector = await provider.embedText(query);
74
+ const filter = {
75
+ should: [
76
+ { key: 'type', match: { value: 'flow_step' } },
77
+ { key: 'type', match: { value: 'flow_edge' } },
78
+ ],
79
+ };
80
+ const searchResults = await vectorStore.search(queryVector, limit, filter, 'flow_samples');
81
+ return textResult(searchResults);
82
+ }
83
+ const response = await client.post('/mcp/search', {
84
+ query,
85
+ collection: 'flow_samples',
86
+ limit,
87
+ filter: {
88
+ should: [
89
+ { key: 'type', match: { value: 'flow_step' } },
90
+ { key: 'type', match: { value: 'flow_edge' } },
91
+ ],
92
+ },
93
+ });
94
+ return textResult(response.data.data);
95
+ }
96
+ catch (err) {
97
+ if (isCollectionNotFoundError(err)) {
98
+ logger.warn(`[search_flow_steps] Collection 'flow_samples' does not exist yet. Returning empty search results.`);
99
+ return textResult([]);
100
+ }
101
+ throw err;
102
+ }
103
+ },
104
+ };
105
+ //# sourceMappingURL=search.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"search.js","sourceRoot":"","sources":["../../../src/tools/handlers/search.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { ToolHandler } from '../types.js';
2
+ export declare const sessionHandlers: Record<string, ToolHandler>;
3
+ //# sourceMappingURL=session.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session.d.ts","sourceRoot":"","sources":["../../../src/tools/handlers/session.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAG1C,eAAO,MAAM,eAAe,EAAE,MAAM,CAAC,MAAM,EAAE,WAAW,CAkBvD,CAAC"}
@@ -0,0 +1,22 @@
1
+ import { textResult } from '../helpers.js';
2
+ import { getFlowStatesReport } from '../flow-state-machine.js';
3
+ export const sessionHandlers = {
4
+ // eslint-disable-next-line @typescript-eslint/require-await
5
+ get_session_state: async (_args, { discoveryState }) => {
6
+ const stateReport = getFlowStatesReport(discoveryState);
7
+ return textResult({
8
+ discoveredComponents: Array.from(discoveryState.components),
9
+ discoveredCredentials: Array.from(discoveryState.credentials),
10
+ discoveredSecrets: Array.from(discoveryState.secrets),
11
+ componentsRequiringAuth: Array.from(discoveryState.componentsRequiringAuth),
12
+ componentVersions: Object.fromEntries(discoveryState.componentVersions),
13
+ inspectedFlows: Array.from(discoveryState.inspectedFlows),
14
+ flowBuildingGuideRead: discoveryState.flowBuildingGuideRead,
15
+ staticMetadataAvailable: Array.from(discoveryState.staticMetadataAvailable),
16
+ dynamicMetadataComponents: Array.from(discoveryState.dynamicMetadataComponents),
17
+ dynamicMetadataRetrieved: Array.from(discoveryState.dynamicMetadataRetrieved),
18
+ flowStateMachine: stateReport
19
+ });
20
+ }
21
+ };
22
+ //# sourceMappingURL=session.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session.js","sourceRoot":"","sources":["../../../src/tools/handlers/session.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAE3C,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAE/D,MAAM,CAAC,MAAM,eAAe,GAAgC;IAC1D,4DAA4D;IAC5D,iBAAiB,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,cAAc,EAAE,EAAE,EAAE;QACrD,MAAM,WAAW,GAAG,mBAAmB,CAAC,cAAc,CAAC,CAAC;QACxD,OAAO,UAAU,CAAC;YAChB,oBAAoB,EAAE,KAAK,CAAC,IAAI,CAAC,cAAc,CAAC,UAAU,CAAC;YAC3D,qBAAqB,EAAE,KAAK,CAAC,IAAI,CAAC,cAAc,CAAC,WAAW,CAAC;YAC7D,iBAAiB,EAAE,KAAK,CAAC,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC;YACrD,uBAAuB,EAAE,KAAK,CAAC,IAAI,CAAC,cAAc,CAAC,uBAAuB,CAAC;YAC3E,iBAAiB,EAAE,MAAM,CAAC,WAAW,CAAC,cAAc,CAAC,iBAAiB,CAAC;YACvE,cAAc,EAAE,KAAK,CAAC,IAAI,CAAC,cAAc,CAAC,cAAc,CAAC;YACzD,qBAAqB,EAAE,cAAc,CAAC,qBAAqB;YAC3D,uBAAuB,EAAE,KAAK,CAAC,IAAI,CAAC,cAAc,CAAC,uBAAuB,CAAC;YAC3E,yBAAyB,EAAE,KAAK,CAAC,IAAI,CAAC,cAAc,CAAC,yBAAyB,CAAC;YAC/E,wBAAwB,EAAE,KAAK,CAAC,IAAI,CAAC,cAAc,CAAC,wBAAwB,CAAC;YAC7E,gBAAgB,EAAE,WAAW;SAC9B,CAAC,CAAC;IACL,CAAC;CACF,CAAC"}
@@ -0,0 +1,12 @@
1
+ import { AxiosInstance } from 'axios';
2
+ import { DiscoveryState } from './types.js';
3
+ export { DiscoveryState } from './types.js';
4
+ export declare function getDiscoveryState(client: AxiosInstance): DiscoveryState;
5
+ export declare function handleToolCall(name: string, args: any, client: AxiosInstance): Promise<{
6
+ content: Array<{
7
+ type: 'text';
8
+ text: string;
9
+ }>;
10
+ isError?: boolean;
11
+ }>;
12
+ //# sourceMappingURL=handlers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"handlers.d.ts","sourceRoot":"","sources":["../../src/tools/handlers.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;AAKtC,OAAO,EAAE,cAAc,EAAe,MAAM,YAAY,CAAC;AAgBzD,OAAO,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAE5C,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,aAAa,GAAG,cAAc,CAkBvE;AAwCD,wBAAsB,cAAc,CAClC,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,GAAG,EACT,MAAM,EAAE,aAAa,GACpB,OAAO,CAAC;IAAE,OAAO,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAAC,OAAO,CAAC,EAAE,OAAO,CAAA;CAAE,CAAC,CAiFhF"}
@@ -0,0 +1,202 @@
1
+ import { logger } from '../api/logger.js';
2
+ import { TOOLS } from './definitions.js';
3
+ import { sanitizeInput, formatResult, structuredError, validateIdParams, maskSensitiveData } from './helpers.js';
4
+ import { requiresConfirmation, confirmationResult } from './confirmation.js';
5
+ import { flowHandlers } from './handlers/flow.js';
6
+ import { authHandlers } from './handlers/auth.js';
7
+ import { dynamicHandlers } from './handlers/dynamic.js';
8
+ import { componentHandlers } from './handlers/component.js';
9
+ import { searchHandlers } from './handlers/search.js';
10
+ import { rawHandlers } from './handlers/raw.js';
11
+ import { organizationHandlers } from './handlers/organization.js';
12
+ import { logHandlers } from './handlers/log.js';
13
+ import { sessionHandlers } from './handlers/session.js';
14
+ import { dataSampleHandlers } from './handlers/data-sample.js';
15
+ import { withFlowLock } from './flow-build.js';
16
+ let sessionLlmTokens = 0;
17
+ let sessionEmbeddingTokens = 0;
18
+ export function getDiscoveryState(client) {
19
+ const customClient = client;
20
+ if (!customClient.discoveryState) {
21
+ customClient.discoveryState = {
22
+ components: new Set(),
23
+ credentials: new Set(),
24
+ secrets: new Map(),
25
+ componentsRequiringAuth: new Set(),
26
+ componentVersions: new Map(),
27
+ inspectedFlows: new Set(),
28
+ credentialVerifications: new Map(),
29
+ flowBuildingGuideRead: false,
30
+ dynamicMetadataRetrieved: new Set(),
31
+ dynamicMetadataComponents: new Set(),
32
+ staticMetadataAvailable: new Set()
33
+ };
34
+ }
35
+ return customClient.discoveryState;
36
+ }
37
+ function estimateTokens(text) {
38
+ if (!text)
39
+ return 0;
40
+ return Math.ceil(text.length / 4);
41
+ }
42
+ const TOOL_HANDLERS = {
43
+ ...flowHandlers,
44
+ ...authHandlers,
45
+ ...dynamicHandlers,
46
+ ...componentHandlers,
47
+ ...searchHandlers,
48
+ ...rawHandlers,
49
+ ...organizationHandlers,
50
+ ...logHandlers,
51
+ ...sessionHandlers,
52
+ ...dataSampleHandlers
53
+ };
54
+ async function executeTool(name, args, client) {
55
+ // update_flow and update_flow_draft handle their own confirmation with impact analysis
56
+ if (requiresConfirmation(name, args) && args?.confirmed !== true && name !== 'update_flow_draft' && name !== 'update_flow') {
57
+ logger.info(`[Confirmation] Tool "${name}" requires confirmation — returning preview`);
58
+ return confirmationResult(name, args);
59
+ }
60
+ const discoveryState = getDiscoveryState(client);
61
+ const handler = TOOL_HANDLERS[name];
62
+ if (!handler) {
63
+ throw new Error(`Unknown tool name: ${name}`);
64
+ }
65
+ const execute = () => handler(args, { client, discoveryState });
66
+ return args.flowId ? await withFlowLock(client, args.flowId, execute) : await execute();
67
+ }
68
+ export async function handleToolCall(name, args, client) {
69
+ args = sanitizeInput(args);
70
+ validateIdParams(args);
71
+ logger.info(`[Tool Call] Name: ${name} - Arguments: ${JSON.stringify(maskSensitiveData(args))}`);
72
+ if (args && typeof args === 'object') {
73
+ // Auto-parse stringified JSON in 'body' parameter (LLMs sometimes send objects as strings)
74
+ if (typeof args.body === 'string') {
75
+ try {
76
+ args.body = JSON.parse(args.body);
77
+ }
78
+ catch (err) {
79
+ logger.warn(`Failed to auto-parse stringified 'body' parameter: ${err instanceof Error ? err.message : String(err)}`);
80
+ }
81
+ }
82
+ for (const key of Object.keys(args)) {
83
+ if (key.endsWith('CustomObjectJSON')) {
84
+ const targetKey = key.substring(0, key.length - 'CustomObjectJSON'.length);
85
+ try {
86
+ if (typeof args[key] === 'string') {
87
+ args[targetKey] = JSON.parse(args[key]);
88
+ }
89
+ else {
90
+ args[targetKey] = args[key];
91
+ }
92
+ }
93
+ catch (err) {
94
+ logger.warn(`Failed to parse ${key}: ${err instanceof Error ? err.message : String(err)}`);
95
+ }
96
+ }
97
+ }
98
+ }
99
+ const inputStr = JSON.stringify(args);
100
+ const inputTokens = estimateTokens(inputStr);
101
+ try {
102
+ const tool = TOOLS.find((t) => t.name === name);
103
+ if (tool && tool.inputSchema && tool.inputSchema.required) {
104
+ for (const req of tool.inputSchema.required) {
105
+ if (args[req] === undefined || args[req] === null || args[req] === '') {
106
+ throw new Error(`Missing required parameter: '${req}' for tool '${name}'`);
107
+ }
108
+ }
109
+ }
110
+ const result = await executeTool(name, args, client);
111
+ const outputStr = JSON.stringify(result.content);
112
+ const outputTokens = estimateTokens(outputStr);
113
+ let embeddingTokens = 0;
114
+ if (name === 'search_documentation' && args.query) {
115
+ embeddingTokens = estimateTokens(args.query);
116
+ }
117
+ sessionLlmTokens += inputTokens + outputTokens;
118
+ sessionEmbeddingTokens += embeddingTokens;
119
+ logger.info(`[Token Usage] Interaction: LLM (Input: ${inputTokens}, Output: ${outputTokens})${embeddingTokens > 0 ? `, Embedding: ${embeddingTokens}` : ''} | ` +
120
+ `Session Total: LLM: ${sessionLlmTokens}, Embedding: ${sessionEmbeddingTokens}`);
121
+ return result;
122
+ }
123
+ catch (error) {
124
+ logger.error(`[Tool Exception] Name: ${name} - Error: ${error.message || String(error)}`);
125
+ sessionLlmTokens += inputTokens;
126
+ logger.info(`[Token Usage] Interaction: LLM (Input: ${inputTokens}, Output: 0) | Session Total: LLM: ${sessionLlmTokens}, Embedding: ${sessionEmbeddingTokens}`);
127
+ const errorMsg = error.message || String(error);
128
+ const hint = resolveErrorHint(name, errorMsg);
129
+ if (hint) {
130
+ return structuredError(errorMsg, hint.hint, hint.requiredTool);
131
+ }
132
+ return {
133
+ isError: true,
134
+ content: [{ type: 'text', text: formatResult(errorMsg) }]
135
+ };
136
+ }
137
+ }
138
+ function resolveErrorHint(toolName, errorMsg) {
139
+ const lower = errorMsg.toLowerCase();
140
+ if (lower.includes('playbook state machine check failed')) {
141
+ if (lower.includes('flow-building-guide')) {
142
+ return {
143
+ hint: 'Read the resource elasticio://docs/flow-building-guide before creating or updating flows.',
144
+ requiredTool: 'ReadResource(elasticio://docs/flow-building-guide)'
145
+ };
146
+ }
147
+ if (lower.includes('get_component')) {
148
+ return {
149
+ hint: 'Call get_component for each component used in the flow before creating or updating it.',
150
+ requiredTool: 'get_component'
151
+ };
152
+ }
153
+ if (lower.includes('list_credentials')) {
154
+ return {
155
+ hint: 'Call list_credentials to discover credentials for the component before using them in a flow.',
156
+ requiredTool: 'list_credentials'
157
+ };
158
+ }
159
+ if (lower.includes('list_secrets')) {
160
+ return {
161
+ hint: 'Call list_secrets to discover secrets for the component before using them in a flow.',
162
+ requiredTool: 'list_secrets'
163
+ };
164
+ }
165
+ }
166
+ if (lower.includes('flow lifecycle check failed')) {
167
+ if (lower.includes('not inspected')) {
168
+ return {
169
+ hint: 'Call get_flow first to inspect the current flow configuration before modifying it (Playbook B).',
170
+ requiredTool: 'get_flow'
171
+ };
172
+ }
173
+ if (lower.includes('active')) {
174
+ return {
175
+ hint: 'Call stop_flow first and wait until the flow is inactive before modifying it (Playbook B).',
176
+ requiredTool: 'stop_flow'
177
+ };
178
+ }
179
+ }
180
+ if (lower.includes('flow graph validation failed')) {
181
+ if (lower.includes('command format')) {
182
+ return {
183
+ hint: 'The node command must be formatted as "team/repo:action@versionId". Call get_component to retrieve the correct commandPrefix and latestVersionId.',
184
+ requiredTool: 'get_component'
185
+ };
186
+ }
187
+ if (lower.includes('mapper') || lower.includes('passthrough')) {
188
+ return {
189
+ hint: 'JSONata mappers must use $getPassthrough().step_id.body.field format. Read elasticio://docs/flow-building-guide for correct syntax.',
190
+ requiredTool: 'ReadResource(elasticio://docs/flow-building-guide)'
191
+ };
192
+ }
193
+ }
194
+ if (lower.includes('missing required parameter')) {
195
+ return {
196
+ hint: `The tool "${toolName}" is missing a required parameter. Check the tool\'s inputSchema for required fields.`,
197
+ requiredTool: toolName
198
+ };
199
+ }
200
+ return null;
201
+ }
202
+ //# sourceMappingURL=handlers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"handlers.js","sourceRoot":"","sources":["../../src/tools/handlers.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,44 @@
1
+ /**
2
+ * Extract the plain ID string from a credential/secret reference,
3
+ * which may be a plain string or an object like { secretId: "..." } / { credentialId: "..." }.
4
+ */
5
+ export declare function resolveCredentialId(value: any): string | null;
6
+ export declare function maskSensitiveData(obj: any): any;
7
+ export declare function validateIdParams(args: any): void;
8
+ export declare function sanitizeInput(args: any): any;
9
+ export declare function formatResult(data: any): string;
10
+ export declare function textResult(data: any): {
11
+ content: Array<{
12
+ type: 'text';
13
+ text: string;
14
+ }>;
15
+ isError?: boolean;
16
+ };
17
+ export declare function structuredError(error: string, hint: string, requiredTool?: string): {
18
+ content: Array<{
19
+ type: 'text';
20
+ text: string;
21
+ }>;
22
+ isError: boolean;
23
+ };
24
+ export declare function listResult(data: any): {
25
+ content: Array<{
26
+ type: 'text';
27
+ text: string;
28
+ }>;
29
+ isError?: boolean;
30
+ };
31
+ export declare function paginatedResult(data: any, meta?: {
32
+ page: number;
33
+ perPage: number;
34
+ totalPages: number;
35
+ total: number;
36
+ }, pageSize?: number): {
37
+ content: Array<{
38
+ type: 'text';
39
+ text: string;
40
+ }>;
41
+ isError?: boolean;
42
+ };
43
+ export declare function pruneMetadataResult(data: any): any;
44
+ //# sourceMappingURL=helpers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"helpers.d.ts","sourceRoot":"","sources":["../../src/tools/helpers.ts"],"names":[],"mappings":"AASA;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,GAAG,GAAG,MAAM,GAAG,IAAI,CAO7D;AAED,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,GAAG,GAAG,GAAG,CAiB/C;AAQD,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,GAAG,GAAG,IAAI,CAOhD;AAED,wBAAgB,aAAa,CAAC,IAAI,EAAE,GAAG,GAAG,GAAG,CAe5C;AAED,wBAAgB,YAAY,CAAC,IAAI,EAAE,GAAG,GAAG,MAAM,CAuC9C;AAED,wBAAgB,UAAU,CAAC,IAAI,EAAE,GAAG,GAAG;IAAE,OAAO,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAAC,OAAO,CAAC,EAAE,OAAO,CAAA;CAAE,CAE3G;AAED,wBAAgB,eAAe,CAC7B,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,MAAM,EACZ,YAAY,CAAC,EAAE,MAAM,GACpB;IAAE,OAAO,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAAC,OAAO,EAAE,OAAO,CAAA;CAAE,CAMtE;AAED,wBAAgB,UAAU,CAAC,IAAI,EAAE,GAAG,GAAG;IAAE,OAAO,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAAC,OAAO,CAAC,EAAE,OAAO,CAAA;CAAE,CAI3G;AAED,wBAAgB,eAAe,CAAC,IAAI,EAAE,GAAG,EAAE,IAAI,CAAC,EAAE;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG;IAAE,OAAO,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAAC,OAAO,CAAC,EAAE,OAAO,CAAA;CAAE,CAahN;AAED,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,GAAG,GAAG,GAAG,CAyDlD"}