@elastic.io/mcp 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (155) hide show
  1. package/LICENSE +191 -0
  2. package/README.md +171 -0
  3. package/dist/api/client.d.ts +12 -0
  4. package/dist/api/client.d.ts.map +1 -0
  5. package/dist/api/client.js +124 -0
  6. package/dist/api/client.js.map +1 -0
  7. package/dist/api/jsonapi.d.ts +28 -0
  8. package/dist/api/jsonapi.d.ts.map +1 -0
  9. package/dist/api/jsonapi.js +45 -0
  10. package/dist/api/jsonapi.js.map +1 -0
  11. package/dist/api/logger.d.ts +9 -0
  12. package/dist/api/logger.d.ts.map +1 -0
  13. package/dist/api/logger.js +46 -0
  14. package/dist/api/logger.js.map +1 -0
  15. package/dist/api/samples.d.ts +21 -0
  16. package/dist/api/samples.d.ts.map +1 -0
  17. package/dist/api/samples.js +465 -0
  18. package/dist/api/samples.js.map +1 -0
  19. package/dist/config.d.ts +16 -0
  20. package/dist/config.d.ts.map +1 -0
  21. package/dist/config.js +49 -0
  22. package/dist/config.js.map +1 -0
  23. package/dist/embeddings/factory.d.ts +7 -0
  24. package/dist/embeddings/factory.d.ts.map +1 -0
  25. package/dist/embeddings/factory.js +25 -0
  26. package/dist/embeddings/factory.js.map +1 -0
  27. package/dist/embeddings/google.d.ts +19 -0
  28. package/dist/embeddings/google.d.ts.map +1 -0
  29. package/dist/embeddings/google.js +132 -0
  30. package/dist/embeddings/google.js.map +1 -0
  31. package/dist/embeddings/types.d.ts +27 -0
  32. package/dist/embeddings/types.d.ts.map +1 -0
  33. package/dist/embeddings/types.js +2 -0
  34. package/dist/embeddings/types.js.map +1 -0
  35. package/dist/index.d.ts +3 -0
  36. package/dist/index.d.ts.map +1 -0
  37. package/dist/index.js +226 -0
  38. package/dist/index.js.map +1 -0
  39. package/dist/paths.d.ts +3 -0
  40. package/dist/paths.d.ts.map +1 -0
  41. package/dist/paths.js +10 -0
  42. package/dist/paths.js.map +1 -0
  43. package/dist/server.d.ts +29 -0
  44. package/dist/server.d.ts.map +1 -0
  45. package/dist/server.js +361 -0
  46. package/dist/server.js.map +1 -0
  47. package/dist/tools/confirmation.d.ts +41 -0
  48. package/dist/tools/confirmation.d.ts.map +1 -0
  49. package/dist/tools/confirmation.js +120 -0
  50. package/dist/tools/confirmation.js.map +1 -0
  51. package/dist/tools/constants.d.ts +31 -0
  52. package/dist/tools/constants.d.ts.map +1 -0
  53. package/dist/tools/constants.js +85 -0
  54. package/dist/tools/constants.js.map +1 -0
  55. package/dist/tools/definitions.d.ts +3 -0
  56. package/dist/tools/definitions.d.ts.map +1 -0
  57. package/dist/tools/definitions.js +883 -0
  58. package/dist/tools/definitions.js.map +1 -0
  59. package/dist/tools/handlers/auth.d.ts +3 -0
  60. package/dist/tools/handlers/auth.d.ts.map +1 -0
  61. package/dist/tools/handlers/auth.js +540 -0
  62. package/dist/tools/handlers/auth.js.map +1 -0
  63. package/dist/tools/handlers/component.d.ts +3 -0
  64. package/dist/tools/handlers/component.d.ts.map +1 -0
  65. package/dist/tools/handlers/component.js +145 -0
  66. package/dist/tools/handlers/component.js.map +1 -0
  67. package/dist/tools/handlers/data-sample.d.ts +3 -0
  68. package/dist/tools/handlers/data-sample.d.ts.map +1 -0
  69. package/dist/tools/handlers/data-sample.js +51 -0
  70. package/dist/tools/handlers/data-sample.js.map +1 -0
  71. package/dist/tools/handlers/dynamic.d.ts +3 -0
  72. package/dist/tools/handlers/dynamic.d.ts.map +1 -0
  73. package/dist/tools/handlers/dynamic.js +110 -0
  74. package/dist/tools/handlers/dynamic.js.map +1 -0
  75. package/dist/tools/handlers/flow.d.ts +9 -0
  76. package/dist/tools/handlers/flow.d.ts.map +1 -0
  77. package/dist/tools/handlers/flow.js +899 -0
  78. package/dist/tools/handlers/flow.js.map +1 -0
  79. package/dist/tools/handlers/log.d.ts +3 -0
  80. package/dist/tools/handlers/log.d.ts.map +1 -0
  81. package/dist/tools/handlers/log.js +61 -0
  82. package/dist/tools/handlers/log.js.map +1 -0
  83. package/dist/tools/handlers/organization.d.ts +3 -0
  84. package/dist/tools/handlers/organization.d.ts.map +1 -0
  85. package/dist/tools/handlers/organization.js +39 -0
  86. package/dist/tools/handlers/organization.js.map +1 -0
  87. package/dist/tools/handlers/raw.d.ts +3 -0
  88. package/dist/tools/handlers/raw.d.ts.map +1 -0
  89. package/dist/tools/handlers/raw.js +77 -0
  90. package/dist/tools/handlers/raw.js.map +1 -0
  91. package/dist/tools/handlers/search.d.ts +3 -0
  92. package/dist/tools/handlers/search.d.ts.map +1 -0
  93. package/dist/tools/handlers/search.js +82 -0
  94. package/dist/tools/handlers/search.js.map +1 -0
  95. package/dist/tools/handlers/session.d.ts +3 -0
  96. package/dist/tools/handlers/session.d.ts.map +1 -0
  97. package/dist/tools/handlers/session.js +15 -0
  98. package/dist/tools/handlers/session.js.map +1 -0
  99. package/dist/tools/handlers.d.ts +12 -0
  100. package/dist/tools/handlers.d.ts.map +1 -0
  101. package/dist/tools/handlers.js +197 -0
  102. package/dist/tools/handlers.js.map +1 -0
  103. package/dist/tools/helpers.d.ts +45 -0
  104. package/dist/tools/helpers.d.ts.map +1 -0
  105. package/dist/tools/helpers.js +195 -0
  106. package/dist/tools/helpers.js.map +1 -0
  107. package/dist/tools/types.d.ts +32 -0
  108. package/dist/tools/types.d.ts.map +1 -0
  109. package/dist/tools/types.js +2 -0
  110. package/dist/tools/types.js.map +1 -0
  111. package/dist/tools/validation.d.ts +24 -0
  112. package/dist/tools/validation.d.ts.map +1 -0
  113. package/dist/tools/validation.js +748 -0
  114. package/dist/tools/validation.js.map +1 -0
  115. package/dist/types/index.d.ts +47 -0
  116. package/dist/types/index.d.ts.map +1 -0
  117. package/dist/types/index.js +2 -0
  118. package/dist/types/index.js.map +1 -0
  119. package/dist/vectorstore/factory.d.ts +7 -0
  120. package/dist/vectorstore/factory.d.ts.map +1 -0
  121. package/dist/vectorstore/factory.js +25 -0
  122. package/dist/vectorstore/factory.js.map +1 -0
  123. package/dist/vectorstore/qdrant.d.ts +11 -0
  124. package/dist/vectorstore/qdrant.d.ts.map +1 -0
  125. package/dist/vectorstore/qdrant.js +107 -0
  126. package/dist/vectorstore/qdrant.js.map +1 -0
  127. package/dist/vectorstore/types.d.ts +28 -0
  128. package/dist/vectorstore/types.d.ts.map +1 -0
  129. package/dist/vectorstore/types.js +2 -0
  130. package/dist/vectorstore/types.js.map +1 -0
  131. package/package.json +51 -0
  132. package/resources/docs/component-test-scenarios.md +2468 -0
  133. package/resources/docs/credential-validation-gaps.md +35 -0
  134. package/resources/docs/debug-issues.md +71 -0
  135. package/resources/docs/deployment-and-scaling.md +136 -0
  136. package/resources/docs/flow-building-guide.md +565 -0
  137. package/resources/docs/packaging-plan.md +84 -0
  138. package/resources/docs/standardized-components-guide.md +66 -0
  139. package/resources/docs/system-instructions.md +177 -0
  140. package/resources/docs/unique-components.md +60 -0
  141. package/resources/docs/verified-creds-flow-ids.md +193 -0
  142. package/resources/flow-examples/batch-flow-1-collect.json +51 -0
  143. package/resources/flow-examples/batch-flow-2-process.json +70 -0
  144. package/resources/flow-examples/code-component-transform.json +65 -0
  145. package/resources/flow-examples/code-component-trigger.json +52 -0
  146. package/resources/flow-examples/code-component-with-credentials-trigger.json +53 -0
  147. package/resources/flow-examples/code-component-with-credentials.json +67 -0
  148. package/resources/flow-examples/filter-step.json +63 -0
  149. package/resources/flow-examples/polling-sync-trigger.json +50 -0
  150. package/resources/flow-examples/router-branching.json +94 -0
  151. package/resources/flow-examples/splitter-re-assemble.json +72 -0
  152. package/resources/flow-examples/splitter-split.json +68 -0
  153. package/resources/flow-examples/timer-query-action-sync.json +68 -0
  154. package/resources/flow-examples/webhook-async-sync.json +49 -0
  155. package/resources/flow-examples/webhook-request-reply.json +63 -0
@@ -0,0 +1,197 @@
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
+ let sessionLlmTokens = 0;
16
+ let sessionEmbeddingTokens = 0;
17
+ export function getDiscoveryState(client) {
18
+ const customClient = client;
19
+ if (!customClient.discoveryState) {
20
+ customClient.discoveryState = {
21
+ components: new Set(),
22
+ credentials: new Set(),
23
+ secrets: new Map(),
24
+ componentsRequiringAuth: new Set(),
25
+ componentVersions: new Map(),
26
+ inspectedFlows: new Set(),
27
+ credentialVerifications: new Map(),
28
+ flowBuildingGuideRead: false
29
+ };
30
+ }
31
+ return customClient.discoveryState;
32
+ }
33
+ function estimateTokens(text) {
34
+ if (!text)
35
+ return 0;
36
+ return Math.ceil(text.length / 4);
37
+ }
38
+ const TOOL_HANDLERS = {
39
+ ...flowHandlers,
40
+ ...authHandlers,
41
+ ...dynamicHandlers,
42
+ ...componentHandlers,
43
+ ...searchHandlers,
44
+ ...rawHandlers,
45
+ ...organizationHandlers,
46
+ ...logHandlers,
47
+ ...sessionHandlers,
48
+ ...dataSampleHandlers
49
+ };
50
+ async function executeTool(name, args, client) {
51
+ // update_flow and update_flow_draft handle their own confirmation with impact analysis
52
+ if (requiresConfirmation(name, args) && args?.confirmed !== true && name !== 'update_flow_draft' && name !== 'update_flow') {
53
+ logger.info(`[Confirmation] Tool "${name}" requires confirmation — returning preview`);
54
+ return confirmationResult(name, args);
55
+ }
56
+ const discoveryState = getDiscoveryState(client);
57
+ const handler = TOOL_HANDLERS[name];
58
+ if (!handler) {
59
+ throw new Error(`Unknown tool name: ${name}`);
60
+ }
61
+ return await handler(args, { client, discoveryState });
62
+ }
63
+ export async function handleToolCall(name, args, client) {
64
+ args = sanitizeInput(args);
65
+ validateIdParams(args);
66
+ logger.info(`[Tool Call] Name: ${name} - Arguments: ${JSON.stringify(maskSensitiveData(args))}`);
67
+ if (args && typeof args === 'object') {
68
+ // Auto-parse stringified JSON in 'body' parameter (LLMs sometimes send objects as strings)
69
+ if (typeof args.body === 'string') {
70
+ try {
71
+ args.body = JSON.parse(args.body);
72
+ }
73
+ catch (err) {
74
+ logger.warn(`Failed to auto-parse stringified 'body' parameter: ${err instanceof Error ? err.message : String(err)}`);
75
+ }
76
+ }
77
+ for (const key of Object.keys(args)) {
78
+ if (key.endsWith('CustomObjectJSON')) {
79
+ const targetKey = key.substring(0, key.length - 'CustomObjectJSON'.length);
80
+ try {
81
+ if (typeof args[key] === 'string') {
82
+ args[targetKey] = JSON.parse(args[key]);
83
+ }
84
+ else {
85
+ args[targetKey] = args[key];
86
+ }
87
+ }
88
+ catch (err) {
89
+ logger.warn(`Failed to parse ${key}: ${err instanceof Error ? err.message : String(err)}`);
90
+ }
91
+ }
92
+ }
93
+ }
94
+ const inputStr = JSON.stringify(args);
95
+ const inputTokens = estimateTokens(inputStr);
96
+ try {
97
+ const tool = TOOLS.find((t) => t.name === name);
98
+ if (tool && tool.inputSchema && tool.inputSchema.required) {
99
+ for (const req of tool.inputSchema.required) {
100
+ if (args[req] === undefined || args[req] === null || args[req] === '') {
101
+ throw new Error(`Missing required parameter: '${req}' for tool '${name}'`);
102
+ }
103
+ }
104
+ }
105
+ const result = await executeTool(name, args, client);
106
+ const outputStr = JSON.stringify(result.content);
107
+ const outputTokens = estimateTokens(outputStr);
108
+ let embeddingTokens = 0;
109
+ if (name === 'search_documentation' && args.query) {
110
+ embeddingTokens = estimateTokens(args.query);
111
+ }
112
+ sessionLlmTokens += inputTokens + outputTokens;
113
+ sessionEmbeddingTokens += embeddingTokens;
114
+ logger.info(`[Token Usage] Interaction: LLM (Input: ${inputTokens}, Output: ${outputTokens})${embeddingTokens > 0 ? `, Embedding: ${embeddingTokens}` : ''} | ` +
115
+ `Session Total: LLM: ${sessionLlmTokens}, Embedding: ${sessionEmbeddingTokens}`);
116
+ return result;
117
+ }
118
+ catch (error) {
119
+ logger.error(`[Tool Exception] Name: ${name} - Error: ${error.message || String(error)}`);
120
+ sessionLlmTokens += inputTokens;
121
+ logger.info(`[Token Usage] Interaction: LLM (Input: ${inputTokens}, Output: 0) | Session Total: LLM: ${sessionLlmTokens}, Embedding: ${sessionEmbeddingTokens}`);
122
+ const errorMsg = error.message || String(error);
123
+ const hint = resolveErrorHint(name, errorMsg);
124
+ if (hint) {
125
+ return structuredError(errorMsg, hint.hint, hint.requiredTool);
126
+ }
127
+ return {
128
+ isError: true,
129
+ content: [{ type: 'text', text: formatResult(errorMsg) }]
130
+ };
131
+ }
132
+ }
133
+ function resolveErrorHint(toolName, errorMsg) {
134
+ const lower = errorMsg.toLowerCase();
135
+ if (lower.includes('playbook state machine check failed')) {
136
+ if (lower.includes('flow-building-guide')) {
137
+ return {
138
+ hint: 'Read the resource elasticio://docs/flow-building-guide before creating or updating flows.',
139
+ requiredTool: 'ReadResource(elasticio://docs/flow-building-guide)'
140
+ };
141
+ }
142
+ if (lower.includes('get_component')) {
143
+ return {
144
+ hint: 'Call get_component for each component used in the flow before creating or updating it.',
145
+ requiredTool: 'get_component'
146
+ };
147
+ }
148
+ if (lower.includes('list_credentials')) {
149
+ return {
150
+ hint: 'Call list_credentials to discover credentials for the component before using them in a flow.',
151
+ requiredTool: 'list_credentials'
152
+ };
153
+ }
154
+ if (lower.includes('list_secrets')) {
155
+ return {
156
+ hint: 'Call list_secrets to discover secrets for the component before using them in a flow.',
157
+ requiredTool: 'list_secrets'
158
+ };
159
+ }
160
+ }
161
+ if (lower.includes('flow lifecycle check failed')) {
162
+ if (lower.includes('not inspected')) {
163
+ return {
164
+ hint: 'Call get_flow first to inspect the current flow configuration before modifying it (Playbook B).',
165
+ requiredTool: 'get_flow'
166
+ };
167
+ }
168
+ if (lower.includes('active')) {
169
+ return {
170
+ hint: 'Call stop_flow first and wait until the flow is inactive before modifying it (Playbook B).',
171
+ requiredTool: 'stop_flow'
172
+ };
173
+ }
174
+ }
175
+ if (lower.includes('flow graph validation failed')) {
176
+ if (lower.includes('command format')) {
177
+ return {
178
+ hint: 'The node command must be formatted as "team/repo:action@versionId". Call get_component to retrieve the correct commandPrefix and latestVersionId.',
179
+ requiredTool: 'get_component'
180
+ };
181
+ }
182
+ if (lower.includes('mapper') || lower.includes('passthrough')) {
183
+ return {
184
+ hint: 'JSONata mappers must use $getPassthrough().step_id.body.field format. Read elasticio://docs/flow-building-guide for correct syntax.',
185
+ requiredTool: 'ReadResource(elasticio://docs/flow-building-guide)'
186
+ };
187
+ }
188
+ }
189
+ if (lower.includes('missing required parameter')) {
190
+ return {
191
+ hint: `The tool "${toolName}" is missing a required parameter. Check the tool\'s inputSchema for required fields.`,
192
+ requiredTool: toolName
193
+ };
194
+ }
195
+ return null;
196
+ }
197
+ //# 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,45 @@
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 assertSafeId(value: string, name: string): void;
8
+ export declare function validateIdParams(args: any): void;
9
+ export declare function sanitizeInput(args: any): any;
10
+ export declare function formatResult(data: any): string;
11
+ export declare function textResult(data: any): {
12
+ content: Array<{
13
+ type: 'text';
14
+ text: string;
15
+ }>;
16
+ isError?: boolean;
17
+ };
18
+ export declare function structuredError(error: string, hint: string, requiredTool?: string): {
19
+ content: Array<{
20
+ type: 'text';
21
+ text: string;
22
+ }>;
23
+ isError: boolean;
24
+ };
25
+ export declare function listResult(data: any): {
26
+ content: Array<{
27
+ type: 'text';
28
+ text: string;
29
+ }>;
30
+ isError?: boolean;
31
+ };
32
+ export declare function paginatedResult(data: any, meta?: {
33
+ page: number;
34
+ perPage: number;
35
+ totalPages: number;
36
+ total: number;
37
+ }, pageSize?: number): {
38
+ content: Array<{
39
+ type: 'text';
40
+ text: string;
41
+ }>;
42
+ isError?: boolean;
43
+ };
44
+ export declare function pruneMetadataResult(data: any): any;
45
+ //# 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;AAED,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI,CAI9D;AAED,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"}
@@ -0,0 +1,195 @@
1
+ import { randomBytes } from 'crypto';
2
+ import { MAX_RESPONSE_LENGTH, ENUM_PRUNE_THRESHOLD, ENUM_PRUNE_KEEP } from './constants.js';
3
+ const INVISIBLE_CHARS_RE = /[\u200B-\u200F\u2028-\u202F\u2060-\u206F\uFEFF\u0300-\u036F\u0489\u1AB0-\u1AFF\u1DC0-\u1DFF\u20D0-\u20FF\uFE00-\uFE0F\uFE20-\uFE2F]|\uDB40[\uDC01-\uDC7F]|\uD834[\uDD67-\uDD69\uDD6D-\uDD72\uDD7B-\uDD82\uDD85-\uDD8B\uDD90\uDD91\uDDA0-\uDDA6]/g;
4
+ const SAFE_ID_RE = /^[a-zA-Z0-9_-]{1,128}$/;
5
+ const SENSITIVE_KEYS = ['password', 'apikey', 'api_key', 'accesskey', 'privatekey', 'token', 'secret', 'auth', 'credentials', 'passphrase', 'authorization'];
6
+ /**
7
+ * Extract the plain ID string from a credential/secret reference,
8
+ * which may be a plain string or an object like { secretId: "..." } / { credentialId: "..." }.
9
+ */
10
+ export function resolveCredentialId(value) {
11
+ if (!value)
12
+ return null;
13
+ if (typeof value === 'string')
14
+ return value;
15
+ if (typeof value === 'object') {
16
+ return value.secretId || value.credentialId || null;
17
+ }
18
+ return null;
19
+ }
20
+ export function maskSensitiveData(obj) {
21
+ if (obj === null || typeof obj !== 'object') {
22
+ return obj;
23
+ }
24
+ if (Array.isArray(obj)) {
25
+ return obj.map(item => maskSensitiveData(item));
26
+ }
27
+ const masked = {};
28
+ for (const k of Object.keys(obj)) {
29
+ const isSensitive = SENSITIVE_KEYS.some(sKey => k.toLowerCase().includes(sKey));
30
+ if (isSensitive) {
31
+ masked[k] = '*** REDACTED ***';
32
+ }
33
+ else {
34
+ masked[k] = maskSensitiveData(obj[k]);
35
+ }
36
+ }
37
+ return masked;
38
+ }
39
+ export function assertSafeId(value, name) {
40
+ if (!SAFE_ID_RE.test(value)) {
41
+ throw new Error(`Invalid ${name}: must contain only alphanumeric characters, hyphens, or underscores.`);
42
+ }
43
+ }
44
+ export function validateIdParams(args) {
45
+ if (!args || typeof args !== 'object')
46
+ return;
47
+ for (const key of Object.keys(args)) {
48
+ if (key.endsWith('Id') && typeof args[key] === 'string') {
49
+ assertSafeId(args[key], key);
50
+ }
51
+ }
52
+ }
53
+ export function sanitizeInput(args) {
54
+ if (typeof args === 'string') {
55
+ return args.replace(INVISIBLE_CHARS_RE, '');
56
+ }
57
+ if (Array.isArray(args)) {
58
+ return args.map(sanitizeInput);
59
+ }
60
+ if (args !== null && typeof args === 'object') {
61
+ const cleaned = {};
62
+ for (const key of Object.keys(args)) {
63
+ cleaned[key] = sanitizeInput(args[key]);
64
+ }
65
+ return cleaned;
66
+ }
67
+ return args;
68
+ }
69
+ export function formatResult(data) {
70
+ if (data === undefined || data === null) {
71
+ return '';
72
+ }
73
+ let text;
74
+ if (typeof data === 'string') {
75
+ text = data;
76
+ }
77
+ else {
78
+ try {
79
+ text = JSON.stringify(data);
80
+ }
81
+ catch {
82
+ // Handle circular references from kitsu-core deserialization
83
+ const seen = new WeakSet();
84
+ text = JSON.stringify(data, (_key, value) => {
85
+ if (typeof value === 'object' && value !== null) {
86
+ if (seen.has(value))
87
+ return '[Circular]';
88
+ seen.add(value);
89
+ }
90
+ return value;
91
+ });
92
+ }
93
+ }
94
+ text = text.replace(INVISIBLE_CHARS_RE, '');
95
+ if (text.length > MAX_RESPONSE_LENGTH) {
96
+ text = text.slice(0, MAX_RESPONSE_LENGTH) + `\n... [TRUNCATED: response exceeded ${MAX_RESPONSE_LENGTH} characters. Use filters or pagination to narrow results.]`;
97
+ }
98
+ const nonce = randomBytes(8).toString('hex');
99
+ const beginMarker = `[BEGIN EXTERNAL DATA ${nonce}]`;
100
+ const endMarker = `[END EXTERNAL DATA ${nonce}]`;
101
+ text = text
102
+ .replace(/\[BEGIN EXTERNAL DATA/g, '[BEGIN EXTERNAL DATA (escaped)')
103
+ .replace(/\[END EXTERNAL DATA/g, '[END EXTERNAL DATA (escaped)');
104
+ return `${beginMarker}\n${text}\n${endMarker}`;
105
+ }
106
+ export function textResult(data) {
107
+ return { content: [{ type: 'text', text: formatResult(data) }] };
108
+ }
109
+ export function structuredError(error, hint, requiredTool) {
110
+ const payload = { error, hint };
111
+ if (requiredTool) {
112
+ payload.required_tool = requiredTool;
113
+ }
114
+ return { isError: true, content: [{ type: 'text', text: formatResult(payload) }] };
115
+ }
116
+ export function listResult(data) {
117
+ const count = Array.isArray(data) ? data.length : (data && typeof data === 'object' && Array.isArray(data.credentials)) ? data.credentials.length : (data && typeof data === 'object' && Array.isArray(data.secrets)) ? data.secrets.length : (data && typeof data === 'object' && Array.isArray(data.components)) ? data.components.length : 0;
118
+ const header = `Showing ${count} result${count !== 1 ? 's' : ''}. Note: this endpoint does not support pagination — all available results are shown.\n\n`;
119
+ return { content: [{ type: 'text', text: formatResult(header + JSON.stringify(data)) }] };
120
+ }
121
+ export function paginatedResult(data, meta, pageSize) {
122
+ const count = Array.isArray(data) ? data.length : 0;
123
+ if (meta && meta.totalPages > 1) {
124
+ const paginationHeader = `Page ${meta.page} of ${meta.totalPages} (showing ${count} of ${meta.total} total results). Use pageNumber to load other pages.\n\n`;
125
+ return { content: [{ type: 'text', text: formatResult(paginationHeader + JSON.stringify(data)) }] };
126
+ }
127
+ // Fallback: if returned exactly pageSize items, there are likely more pages
128
+ if (Array.isArray(data) && pageSize && count >= pageSize) {
129
+ const page = meta?.page || 1;
130
+ const paginationHeader = `Page ${page} (showing ${count} results — there may be more pages available, use pageNumber to load next pages)\n\n`;
131
+ return { content: [{ type: 'text', text: formatResult(paginationHeader + JSON.stringify(data)) }] };
132
+ }
133
+ return textResult(data);
134
+ }
135
+ export function pruneMetadataResult(data) {
136
+ if (!data || typeof data !== 'object') {
137
+ return data;
138
+ }
139
+ const pruneSchema = (schema) => {
140
+ if (!schema || typeof schema !== 'object') {
141
+ return schema;
142
+ }
143
+ if (Array.isArray(schema)) {
144
+ return schema.map(pruneSchema);
145
+ }
146
+ const pruned = {};
147
+ for (const key of Object.keys(schema)) {
148
+ const val = schema[key];
149
+ if (key === 'enum' && Array.isArray(val)) {
150
+ if (val.length > ENUM_PRUNE_THRESHOLD) {
151
+ pruned[key] = [
152
+ ...val.slice(0, ENUM_PRUNE_KEEP),
153
+ `... and ${val.length - ENUM_PRUNE_KEEP} more items`
154
+ ];
155
+ }
156
+ else {
157
+ pruned[key] = val;
158
+ }
159
+ }
160
+ else if (typeof val === 'object' && val !== null) {
161
+ pruned[key] = pruneSchema(val);
162
+ }
163
+ else {
164
+ pruned[key] = val;
165
+ }
166
+ }
167
+ return pruned;
168
+ };
169
+ if (data.result && data.result.data) {
170
+ if (data.result.data.in) {
171
+ data.result.data.in = pruneSchema(data.result.data.in);
172
+ }
173
+ if (data.result.data.out) {
174
+ data.result.data.out = pruneSchema(data.result.data.out);
175
+ }
176
+ }
177
+ else if (data.result) {
178
+ if (data.result.in) {
179
+ data.result.in = pruneSchema(data.result.in);
180
+ }
181
+ if (data.result.out) {
182
+ data.result.out = pruneSchema(data.result.out);
183
+ }
184
+ }
185
+ else if (data.in || data.out) {
186
+ if (data.in) {
187
+ data.in = pruneSchema(data.in);
188
+ }
189
+ if (data.out) {
190
+ data.out = pruneSchema(data.out);
191
+ }
192
+ }
193
+ return data;
194
+ }
195
+ //# sourceMappingURL=helpers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"helpers.js","sourceRoot":"","sources":["../../src/tools/helpers.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,32 @@
1
+ import { AxiosInstance } from 'axios';
2
+ export interface DiscoveryState {
3
+ components: Set<string>;
4
+ credentials: Set<string>;
5
+ /** Maps secret ID to its state (e.g. 'ready', 'error') */
6
+ secrets: Map<string, string>;
7
+ /** Component IDs that require credentials/secrets (have non-empty credentials.fields) */
8
+ componentsRequiringAuth: Set<string>;
9
+ /** Maps component ID to its latestVersionId for data sample creation */
10
+ componentVersions: Map<string, string>;
11
+ /** Flow IDs that have been inspected via get_flow (Playbook B: inspect before update) */
12
+ inspectedFlows: Set<string>;
13
+ /** Tracks credential/secret verification results: id → { ok, error? } */
14
+ credentialVerifications: Map<string, {
15
+ ok: boolean;
16
+ error?: string;
17
+ }>;
18
+ /** Whether the flow-building-guide resource has been read this session */
19
+ flowBuildingGuideRead: boolean;
20
+ }
21
+ export interface ToolContext {
22
+ client: AxiosInstance;
23
+ discoveryState: DiscoveryState;
24
+ }
25
+ export type ToolHandler = (args: any, context: ToolContext) => Promise<{
26
+ content: Array<{
27
+ type: 'text';
28
+ text: string;
29
+ }>;
30
+ isError?: boolean;
31
+ }>;
32
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/tools/types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;AAEtC,MAAM,WAAW,cAAc;IAC7B,UAAU,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IACxB,WAAW,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IACzB,0DAA0D;IAC1D,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC7B,yFAAyF;IACzF,uBAAuB,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IACrC,wEAAwE;IACxE,iBAAiB,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACvC,yFAAyF;IACzF,cAAc,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IAC5B,yEAAyE;IACzE,uBAAuB,EAAE,GAAG,CAAC,MAAM,EAAE;QAAE,EAAE,EAAE,OAAO,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACtE,0EAA0E;IAC1E,qBAAqB,EAAE,OAAO,CAAC;CAChC;AAED,MAAM,WAAW,WAAW;IAC1B,MAAM,EAAE,aAAa,CAAC;IACtB,cAAc,EAAE,cAAc,CAAC;CAChC;AAED,MAAM,MAAM,WAAW,GAAG,CACxB,IAAI,EAAE,GAAG,EACT,OAAO,EAAE,WAAW,KACjB,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,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/tools/types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,24 @@
1
+ import { AxiosInstance } from 'axios';
2
+ import { DiscoveryState } from './types.js';
3
+ export { DEPRECATED_COMPONENTS, DEPRECATED_ACTIONS } from './constants.js';
4
+ export interface HealthCheckResult {
5
+ errors: string[];
6
+ warnings: string[];
7
+ }
8
+ export declare function checkFlowLifecycle(flowId: string, discoveryState: DiscoveryState, existingFlow: any | null, operation: 'update_flow' | 'update_flow_draft'): string[];
9
+ export declare function checkFlowBuildingGuideRead(discoveryState: DiscoveryState): string[];
10
+ export declare function stripStringLiterals(str: string): string;
11
+ export declare function validateFlowGraph(body: any): {
12
+ errors: string[];
13
+ warnings: string[];
14
+ };
15
+ export declare function checkDiscoveryState(body: any, discoveryState: DiscoveryState, existingFlow?: any): string[];
16
+ /**
17
+ * Runtime health check for a flow — validates credentials, required fields, URLs, and field values.
18
+ * Runs after create_flow/update_flow and before start_flow to catch config issues
19
+ * that would show as red indicators in the UI.
20
+ */
21
+ export declare function healthCheckFlow(flow: any, client: AxiosInstance): Promise<HealthCheckResult>;
22
+ /** Format health check results as a readable string to append to tool response */
23
+ export declare function formatHealthCheck(result: HealthCheckResult): string;
24
+ //# sourceMappingURL=validation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validation.d.ts","sourceRoot":"","sources":["../../src/tools/validation.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;AACtC,OAAO,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAY5C,OAAO,EAAE,qBAAqB,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AAE3E,MAAM,WAAW,iBAAiB;IAChC,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB;AAED,wBAAgB,kBAAkB,CAChC,MAAM,EAAE,MAAM,EACd,cAAc,EAAE,cAAc,EAC9B,YAAY,EAAE,GAAG,GAAG,IAAI,EACxB,SAAS,EAAE,aAAa,GAAG,mBAAmB,GAC7C,MAAM,EAAE,CAuBV;AAED,wBAAgB,0BAA0B,CAAC,cAAc,EAAE,cAAc,GAAG,MAAM,EAAE,CASnF;AAED,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CA6BvD;AA+VD,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,GAAG,GAAG;IAAE,MAAM,EAAE,MAAM,EAAE,CAAC;IAAC,QAAQ,EAAE,MAAM,EAAE,CAAA;CAAE,CAiBrF;AAED,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,GAAG,EAAE,cAAc,EAAE,cAAc,EAAE,YAAY,CAAC,EAAE,GAAG,GAAG,MAAM,EAAE,CAgH3G;AAgFD;;;;GAIG;AACH,wBAAsB,eAAe,CACnC,IAAI,EAAE,GAAG,EACT,MAAM,EAAE,aAAa,GACpB,OAAO,CAAC,iBAAiB,CAAC,CAkP5B;AAWD,kFAAkF;AAClF,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,iBAAiB,GAAG,MAAM,CA0BnE"}