@kadoa/mcp 0.5.21 → 0.5.23

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 (3) hide show
  1. package/README.md +14 -11
  2. package/dist/index.js +235 -16
  3. package/package.json +2 -2
package/README.md CHANGED
@@ -63,14 +63,15 @@ Point your client to `https://mcp.kadoa.com/mcp` with OAuth authentication.
63
63
  |------|-------------|
64
64
  | `scrape` | Immediately fetch one URL as markdown or raw HTML (shown only for enabled workspaces) |
65
65
  | `create_workflow` | Create an agentic navigation workflow from a prompt |
66
- | `create_realtime_monitor` | Create an asynchronous Julie realtime monitor after persisting notification channels; returns workflow/session/thread/job IDs |
66
+ | `create_realtime_monitor` | Create an asynchronous realtime monitoring workflow after persisting notification channels; returns workflow/session/thread/job IDs |
67
67
  | `list_workflows` | List all workflows with status |
68
68
  | `get_workflow` | Get canonical intent, Assistant/session, template ownership, run health, schedule, location, monitoring, and validation details |
69
69
  | `request_workflow_update` | Ask the workflow Assistant to change extraction intent, navigation, sourcing, pagination, or generated behavior without changing the workflow ID |
70
70
  | `get_workflow_assistant` | Get the workflow Assistant's current activity and any pending clarification question |
71
+ | `get_workflow_assistant_timeline` | Read paginated customer-visible Assistant messages and questions for one-time, scheduled, or realtime workflows |
71
72
  | `answer_workflow_assistant_question` | Answer the workflow Assistant's current clarification question and resume it |
72
73
  | `interrupt_workflow_assistant` | Safely interrupt active Assistant work without pausing the workflow schedule |
73
- | `resume_workflow_assistant` | Resume an idle/interrupted Lighthouse or Julie session with its persisted persona |
74
+ | `resume_workflow_assistant` | Resume an idle/interrupted workflow Assistant with its persisted role and conversation |
74
75
  | `stop_workflow_assistant` | Stop active Assistant work without deleting or replacing the workflow |
75
76
  | `get_workflow_strategy` | Get the current customer-safe extraction/build strategy for an Assistant or custom-script workflow |
76
77
  | `get_workflow_history` | Get the workflow's configuration revision history (audit log) — who changed it, when, from which channel, and a `changedFields` summary per revision |
@@ -167,14 +168,14 @@ in `America/New_York`, monitoring fields/conditions, and `limit: null` for all
167
168
  rows.
168
169
  ```
169
170
 
170
- ### Create a Julie realtime monitor
171
+ ### Create a realtime monitoring workflow
171
172
 
172
173
  ```
173
174
  > You: Watch https://example-shop.com/products for price changes and alert me by webhook.
174
175
 
175
- Claude calls create_realtime_monitor with the URL, schema/change intent, and notification settings. Kadoa persists reusable notification channels first, then Julie asynchronously accepts creation and returns workflow, session, thread, job, and dashboard identifiers.
176
+ Claude calls create_realtime_monitor with the URL, schema/change intent, and notification settings. Kadoa persists reusable notification channels first, then asynchronously accepts creation and returns workflow, session, thread, job, and dashboard identifiers.
176
177
 
177
- > You: Does Julie need anything from me?
178
+ > You: Does the workflow Assistant need anything from me?
178
179
 
179
180
  Claude uses get_workflow_assistant and the other workflow Assistant tools for follow-up status, questions, interrupts, resumes, or stops. It does not poll or sleep-wait.
180
181
  ```
@@ -191,9 +192,11 @@ Assistant session, thread, and job identifiers.
191
192
 
192
193
  > You: Does Kadoa need anything from me?
193
194
 
194
- Claude calls get_workflow_assistant. If a clarification is pending, Claude
195
- shows the question and calls answer_workflow_assistant_question with your
196
- answer. It does not poll or sleep-wait for the Assistant.
195
+ Claude calls get_workflow_assistant. To review the conversation, Claude calls
196
+ get_workflow_assistant_timeline and follows its opaque nextCursor only when
197
+ older messages are needed. If a clarification is pending, Claude shows the
198
+ question and calls answer_workflow_assistant_question with your answer. It does
199
+ not poll or sleep-wait for the Assistant.
197
200
 
198
201
  > You: How does this workflow extract the data now?
199
202
 
@@ -203,9 +206,9 @@ navigation, and extraction approach.
203
206
  > You: Interrupt the Assistant for now, then resume it later.
204
207
 
205
208
  Claude calls interrupt_workflow_assistant. When asked later, it calls
206
- resume_workflow_assistant, which preserves whether the session is Lighthouse
207
- or Julie. stop_workflow_assistant cancels active Assistant work without
208
- pausing or deleting the workflow itself.
209
+ resume_workflow_assistant, which continues the same Assistant role and
210
+ conversation for either workflow mode. stop_workflow_assistant cancels active
211
+ Assistant work without pausing or deleting the workflow itself.
209
212
  ```
210
213
 
211
214
  Use `update_workflow` for deterministic metadata such as name, schedule, tags,
package/dist/index.js CHANGED
@@ -45783,6 +45783,14 @@ var import_debug, __require2, FREEFORM_ASSISTANT_ANSWER_KEY = "_freeform", Kadoa
45783
45783
  }
45784
45784
  return data;
45785
45785
  }
45786
+ async getTimeline(workflowId, input = {}) {
45787
+ const response = await this.agentApi.v5AgentWorkflowAssistantTimeline({
45788
+ workflowId,
45789
+ ...input.cursor != null && { cursor: input.cursor },
45790
+ ...input.limit != null && { limit: input.limit }
45791
+ });
45792
+ return response.data.data;
45793
+ }
45786
45794
  async getPauseState(sessionId) {
45787
45795
  const response = await this.agentApi.v5AgentPauseState({ sessionId });
45788
45796
  return response.data.data;
@@ -46050,6 +46058,32 @@ var import_debug, __require2, FREEFORM_ASSISTANT_ANSWER_KEY = "_freeform", Kadoa
46050
46058
  url: toPathString(localVarUrlObj),
46051
46059
  options: localVarRequestOptions
46052
46060
  };
46061
+ },
46062
+ v5AgentWorkflowAssistantTimeline: async (workflowId, cursor, limit, options = {}) => {
46063
+ assertParamExists("v5AgentWorkflowAssistantTimeline", "workflowId", workflowId);
46064
+ const localVarPath = `/v5/agent/workflows/{workflowId}/timeline`.replace(`{${"workflowId"}}`, encodeURIComponent(String(workflowId)));
46065
+ const localVarUrlObj = new URL$1(localVarPath, DUMMY_BASE_URL);
46066
+ let baseOptions;
46067
+ if (configuration) {
46068
+ baseOptions = configuration.baseOptions;
46069
+ }
46070
+ const localVarRequestOptions = { method: "GET", ...baseOptions, ...options };
46071
+ const localVarHeaderParameter = {};
46072
+ const localVarQueryParameter = {};
46073
+ if (cursor !== undefined) {
46074
+ localVarQueryParameter["cursor"] = cursor;
46075
+ }
46076
+ if (limit !== undefined) {
46077
+ localVarQueryParameter["limit"] = limit;
46078
+ }
46079
+ localVarHeaderParameter["Accept"] = "application/json";
46080
+ setSearchParams(localVarUrlObj, localVarQueryParameter);
46081
+ let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {};
46082
+ localVarRequestOptions.headers = { ...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers };
46083
+ return {
46084
+ url: toPathString(localVarUrlObj),
46085
+ options: localVarRequestOptions
46086
+ };
46053
46087
  }
46054
46088
  };
46055
46089
  }, AgentApiFp = function(configuration) {
@@ -46102,6 +46136,12 @@ var import_debug, __require2, FREEFORM_ASSISTANT_ANSWER_KEY = "_freeform", Kadoa
46102
46136
  const localVarOperationServerIndex = configuration?.serverIndex ?? 0;
46103
46137
  const localVarOperationServerBasePath = operationServerMap["AgentApi.v5AgentWorkflowAssistantMessage"]?.[localVarOperationServerIndex]?.url;
46104
46138
  return (axios2, basePath) => createRequestFunction(localVarAxiosArgs, axios_default, BASE_PATH, configuration)(axios2, localVarOperationServerBasePath || basePath);
46139
+ },
46140
+ async v5AgentWorkflowAssistantTimeline(workflowId, cursor, limit, options) {
46141
+ const localVarAxiosArgs = await localVarAxiosParamCreator.v5AgentWorkflowAssistantTimeline(workflowId, cursor, limit, options);
46142
+ const localVarOperationServerIndex = configuration?.serverIndex ?? 0;
46143
+ const localVarOperationServerBasePath = operationServerMap["AgentApi.v5AgentWorkflowAssistantTimeline"]?.[localVarOperationServerIndex]?.url;
46144
+ return (axios2, basePath) => createRequestFunction(localVarAxiosArgs, axios_default, BASE_PATH, configuration)(axios2, localVarOperationServerBasePath || basePath);
46105
46145
  }
46106
46146
  };
46107
46147
  }, AgentApi, CrawlerApiAxiosParamCreator = function(configuration) {
@@ -48157,6 +48197,113 @@ var import_debug, __require2, FREEFORM_ASSISTANT_ANSWER_KEY = "_freeform", Kadoa
48157
48197
  };
48158
48198
  }, TemplatesApi, VariablesApiAxiosParamCreator = function(configuration) {
48159
48199
  return {
48200
+ v4VariablesConnectionsConnectionIdDelete: async (connectionId, options = {}) => {
48201
+ assertParamExists("v4VariablesConnectionsConnectionIdDelete", "connectionId", connectionId);
48202
+ const localVarPath = `/v4/variables/connections/{connectionId}`.replace(`{${"connectionId"}}`, encodeURIComponent(String(connectionId)));
48203
+ const localVarUrlObj = new URL$1(localVarPath, DUMMY_BASE_URL);
48204
+ let baseOptions;
48205
+ if (configuration) {
48206
+ baseOptions = configuration.baseOptions;
48207
+ }
48208
+ const localVarRequestOptions = { method: "DELETE", ...baseOptions, ...options };
48209
+ const localVarHeaderParameter = {};
48210
+ const localVarQueryParameter = {};
48211
+ await setApiKeyToObject(localVarHeaderParameter, "x-api-key", configuration);
48212
+ localVarHeaderParameter["Accept"] = "application/json";
48213
+ setSearchParams(localVarUrlObj, localVarQueryParameter);
48214
+ let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {};
48215
+ localVarRequestOptions.headers = { ...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers };
48216
+ return {
48217
+ url: toPathString(localVarUrlObj),
48218
+ options: localVarRequestOptions
48219
+ };
48220
+ },
48221
+ v4VariablesConnectionsConnectionIdPatch: async (connectionId, v4VariablesConnectionsConnectionIdPatchRequest, options = {}) => {
48222
+ assertParamExists("v4VariablesConnectionsConnectionIdPatch", "connectionId", connectionId);
48223
+ const localVarPath = `/v4/variables/connections/{connectionId}`.replace(`{${"connectionId"}}`, encodeURIComponent(String(connectionId)));
48224
+ const localVarUrlObj = new URL$1(localVarPath, DUMMY_BASE_URL);
48225
+ let baseOptions;
48226
+ if (configuration) {
48227
+ baseOptions = configuration.baseOptions;
48228
+ }
48229
+ const localVarRequestOptions = { method: "PATCH", ...baseOptions, ...options };
48230
+ const localVarHeaderParameter = {};
48231
+ const localVarQueryParameter = {};
48232
+ await setApiKeyToObject(localVarHeaderParameter, "x-api-key", configuration);
48233
+ localVarHeaderParameter["Content-Type"] = "application/json";
48234
+ localVarHeaderParameter["Accept"] = "application/json";
48235
+ setSearchParams(localVarUrlObj, localVarQueryParameter);
48236
+ let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {};
48237
+ localVarRequestOptions.headers = { ...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers };
48238
+ localVarRequestOptions.data = serializeDataIfNeeded(v4VariablesConnectionsConnectionIdPatchRequest, localVarRequestOptions, configuration);
48239
+ return {
48240
+ url: toPathString(localVarUrlObj),
48241
+ options: localVarRequestOptions
48242
+ };
48243
+ },
48244
+ v4VariablesConnectionsConnectionIdVerifyPost: async (connectionId, options = {}) => {
48245
+ assertParamExists("v4VariablesConnectionsConnectionIdVerifyPost", "connectionId", connectionId);
48246
+ const localVarPath = `/v4/variables/connections/{connectionId}/verify`.replace(`{${"connectionId"}}`, encodeURIComponent(String(connectionId)));
48247
+ const localVarUrlObj = new URL$1(localVarPath, DUMMY_BASE_URL);
48248
+ let baseOptions;
48249
+ if (configuration) {
48250
+ baseOptions = configuration.baseOptions;
48251
+ }
48252
+ const localVarRequestOptions = { method: "POST", ...baseOptions, ...options };
48253
+ const localVarHeaderParameter = {};
48254
+ const localVarQueryParameter = {};
48255
+ await setApiKeyToObject(localVarHeaderParameter, "x-api-key", configuration);
48256
+ localVarHeaderParameter["Accept"] = "application/json";
48257
+ setSearchParams(localVarUrlObj, localVarQueryParameter);
48258
+ let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {};
48259
+ localVarRequestOptions.headers = { ...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers };
48260
+ return {
48261
+ url: toPathString(localVarUrlObj),
48262
+ options: localVarRequestOptions
48263
+ };
48264
+ },
48265
+ v4VariablesConnectionsGet: async (options = {}) => {
48266
+ const localVarPath = `/v4/variables/connections`;
48267
+ const localVarUrlObj = new URL$1(localVarPath, DUMMY_BASE_URL);
48268
+ let baseOptions;
48269
+ if (configuration) {
48270
+ baseOptions = configuration.baseOptions;
48271
+ }
48272
+ const localVarRequestOptions = { method: "GET", ...baseOptions, ...options };
48273
+ const localVarHeaderParameter = {};
48274
+ const localVarQueryParameter = {};
48275
+ await setApiKeyToObject(localVarHeaderParameter, "x-api-key", configuration);
48276
+ localVarHeaderParameter["Accept"] = "application/json";
48277
+ setSearchParams(localVarUrlObj, localVarQueryParameter);
48278
+ let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {};
48279
+ localVarRequestOptions.headers = { ...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers };
48280
+ return {
48281
+ url: toPathString(localVarUrlObj),
48282
+ options: localVarRequestOptions
48283
+ };
48284
+ },
48285
+ v4VariablesConnectionsPost: async (v4VariablesConnectionsPostRequest, options = {}) => {
48286
+ const localVarPath = `/v4/variables/connections`;
48287
+ const localVarUrlObj = new URL$1(localVarPath, DUMMY_BASE_URL);
48288
+ let baseOptions;
48289
+ if (configuration) {
48290
+ baseOptions = configuration.baseOptions;
48291
+ }
48292
+ const localVarRequestOptions = { method: "POST", ...baseOptions, ...options };
48293
+ const localVarHeaderParameter = {};
48294
+ const localVarQueryParameter = {};
48295
+ await setApiKeyToObject(localVarHeaderParameter, "x-api-key", configuration);
48296
+ localVarHeaderParameter["Content-Type"] = "application/json";
48297
+ localVarHeaderParameter["Accept"] = "application/json";
48298
+ setSearchParams(localVarUrlObj, localVarQueryParameter);
48299
+ let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {};
48300
+ localVarRequestOptions.headers = { ...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers };
48301
+ localVarRequestOptions.data = serializeDataIfNeeded(v4VariablesConnectionsPostRequest, localVarRequestOptions, configuration);
48302
+ return {
48303
+ url: toPathString(localVarUrlObj),
48304
+ options: localVarRequestOptions
48305
+ };
48306
+ },
48160
48307
  v4VariablesGet: async (options = {}) => {
48161
48308
  const localVarPath = `/v4/variables/`;
48162
48309
  const localVarUrlObj = new URL$1(localVarPath, DUMMY_BASE_URL);
@@ -48268,6 +48415,36 @@ var import_debug, __require2, FREEFORM_ASSISTANT_ANSWER_KEY = "_freeform", Kadoa
48268
48415
  }, VariablesApiFp = function(configuration) {
48269
48416
  const localVarAxiosParamCreator = VariablesApiAxiosParamCreator(configuration);
48270
48417
  return {
48418
+ async v4VariablesConnectionsConnectionIdDelete(connectionId, options) {
48419
+ const localVarAxiosArgs = await localVarAxiosParamCreator.v4VariablesConnectionsConnectionIdDelete(connectionId, options);
48420
+ const localVarOperationServerIndex = configuration?.serverIndex ?? 0;
48421
+ const localVarOperationServerBasePath = operationServerMap["VariablesApi.v4VariablesConnectionsConnectionIdDelete"]?.[localVarOperationServerIndex]?.url;
48422
+ return (axios2, basePath) => createRequestFunction(localVarAxiosArgs, axios_default, BASE_PATH, configuration)(axios2, localVarOperationServerBasePath || basePath);
48423
+ },
48424
+ async v4VariablesConnectionsConnectionIdPatch(connectionId, v4VariablesConnectionsConnectionIdPatchRequest, options) {
48425
+ const localVarAxiosArgs = await localVarAxiosParamCreator.v4VariablesConnectionsConnectionIdPatch(connectionId, v4VariablesConnectionsConnectionIdPatchRequest, options);
48426
+ const localVarOperationServerIndex = configuration?.serverIndex ?? 0;
48427
+ const localVarOperationServerBasePath = operationServerMap["VariablesApi.v4VariablesConnectionsConnectionIdPatch"]?.[localVarOperationServerIndex]?.url;
48428
+ return (axios2, basePath) => createRequestFunction(localVarAxiosArgs, axios_default, BASE_PATH, configuration)(axios2, localVarOperationServerBasePath || basePath);
48429
+ },
48430
+ async v4VariablesConnectionsConnectionIdVerifyPost(connectionId, options) {
48431
+ const localVarAxiosArgs = await localVarAxiosParamCreator.v4VariablesConnectionsConnectionIdVerifyPost(connectionId, options);
48432
+ const localVarOperationServerIndex = configuration?.serverIndex ?? 0;
48433
+ const localVarOperationServerBasePath = operationServerMap["VariablesApi.v4VariablesConnectionsConnectionIdVerifyPost"]?.[localVarOperationServerIndex]?.url;
48434
+ return (axios2, basePath) => createRequestFunction(localVarAxiosArgs, axios_default, BASE_PATH, configuration)(axios2, localVarOperationServerBasePath || basePath);
48435
+ },
48436
+ async v4VariablesConnectionsGet(options) {
48437
+ const localVarAxiosArgs = await localVarAxiosParamCreator.v4VariablesConnectionsGet(options);
48438
+ const localVarOperationServerIndex = configuration?.serverIndex ?? 0;
48439
+ const localVarOperationServerBasePath = operationServerMap["VariablesApi.v4VariablesConnectionsGet"]?.[localVarOperationServerIndex]?.url;
48440
+ return (axios2, basePath) => createRequestFunction(localVarAxiosArgs, axios_default, BASE_PATH, configuration)(axios2, localVarOperationServerBasePath || basePath);
48441
+ },
48442
+ async v4VariablesConnectionsPost(v4VariablesConnectionsPostRequest, options) {
48443
+ const localVarAxiosArgs = await localVarAxiosParamCreator.v4VariablesConnectionsPost(v4VariablesConnectionsPostRequest, options);
48444
+ const localVarOperationServerIndex = configuration?.serverIndex ?? 0;
48445
+ const localVarOperationServerBasePath = operationServerMap["VariablesApi.v4VariablesConnectionsPost"]?.[localVarOperationServerIndex]?.url;
48446
+ return (axios2, basePath) => createRequestFunction(localVarAxiosArgs, axios_default, BASE_PATH, configuration)(axios2, localVarOperationServerBasePath || basePath);
48447
+ },
48271
48448
  async v4VariablesGet(options) {
48272
48449
  const localVarAxiosArgs = await localVarAxiosParamCreator.v4VariablesGet(options);
48273
48450
  const localVarOperationServerIndex = configuration?.serverIndex ?? 0;
@@ -50422,7 +50599,7 @@ var import_debug, __require2, FREEFORM_ASSISTANT_ANSWER_KEY = "_freeform", Kadoa
50422
50599
  }));
50423
50600
  return channels;
50424
50601
  }
50425
- }, PUBLIC_API_URI, WSS_API_URI, REALTIME_API_URI, SDK_VERSION = "0.38.0", SDK_NAME = "kadoa-node-sdk", SDK_LANGUAGE = "node", debug6, isDrainControlMessage = (message) => message.type === "control.draining", isRealtimeEvent = (message) => message.type !== "heartbeat" && message.type !== "control.draining", _Realtime = class _Realtime2 {
50602
+ }, PUBLIC_API_URI, WSS_API_URI, REALTIME_API_URI, SDK_VERSION = "0.39.0", SDK_NAME = "kadoa-node-sdk", SDK_LANGUAGE = "node", debug6, isDrainControlMessage = (message) => message.type === "control.draining", isRealtimeEvent = (message) => message.type !== "heartbeat" && message.type !== "control.draining", _Realtime = class _Realtime2 {
50426
50603
  constructor(config2) {
50427
50604
  this.drainingSockets = /* @__PURE__ */ new Set;
50428
50605
  this.lastHeartbeat = Date.now();
@@ -51864,6 +52041,9 @@ var init_dist2 = __esm(() => {
51864
52041
  v5AgentWorkflowAssistantMessage(requestParameters, options) {
51865
52042
  return AgentApiFp(this.configuration).v5AgentWorkflowAssistantMessage(requestParameters.workflowId, requestParameters.workflowAssistantMessageRequest, options).then((request) => request(this.axios, this.basePath));
51866
52043
  }
52044
+ v5AgentWorkflowAssistantTimeline(requestParameters, options) {
52045
+ return AgentApiFp(this.configuration).v5AgentWorkflowAssistantTimeline(requestParameters.workflowId, requestParameters.cursor, requestParameters.limit, options).then((request) => request(this.axios, this.basePath));
52046
+ }
51867
52047
  };
51868
52048
  CrawlerApi = class extends BaseAPI {
51869
52049
  v4CrawlBucketDataFilenameb64Get(requestParameters, options) {
@@ -52095,6 +52275,21 @@ var init_dist2 = __esm(() => {
52095
52275
  }
52096
52276
  };
52097
52277
  VariablesApi = class extends BaseAPI {
52278
+ v4VariablesConnectionsConnectionIdDelete(requestParameters, options) {
52279
+ return VariablesApiFp(this.configuration).v4VariablesConnectionsConnectionIdDelete(requestParameters.connectionId, options).then((request) => request(this.axios, this.basePath));
52280
+ }
52281
+ v4VariablesConnectionsConnectionIdPatch(requestParameters, options) {
52282
+ return VariablesApiFp(this.configuration).v4VariablesConnectionsConnectionIdPatch(requestParameters.connectionId, requestParameters.v4VariablesConnectionsConnectionIdPatchRequest, options).then((request) => request(this.axios, this.basePath));
52283
+ }
52284
+ v4VariablesConnectionsConnectionIdVerifyPost(requestParameters, options) {
52285
+ return VariablesApiFp(this.configuration).v4VariablesConnectionsConnectionIdVerifyPost(requestParameters.connectionId, options).then((request) => request(this.axios, this.basePath));
52286
+ }
52287
+ v4VariablesConnectionsGet(options) {
52288
+ return VariablesApiFp(this.configuration).v4VariablesConnectionsGet(options).then((request) => request(this.axios, this.basePath));
52289
+ }
52290
+ v4VariablesConnectionsPost(requestParameters = {}, options) {
52291
+ return VariablesApiFp(this.configuration).v4VariablesConnectionsPost(requestParameters.v4VariablesConnectionsPostRequest, options).then((request) => request(this.axios, this.basePath));
52292
+ }
52098
52293
  v4VariablesGet(options) {
52099
52294
  return VariablesApiFp(this.configuration).v4VariablesGet(options).then((request) => request(this.axios, this.basePath));
52100
52295
  }
@@ -52934,7 +53129,7 @@ function registerTools(server, ctx, capabilities) {
52934
53129
  return urls.length > 0 ? urls : null;
52935
53130
  }
52936
53131
  function buildRealtimeAssistantInstructions(args, urls) {
52937
- const lines = ["Create a realtime monitoring workflow with Julie.", "", "Source URLs:"];
53132
+ const lines = ["Create a realtime monitoring workflow.", "", "Source URLs:"];
52938
53133
  for (const url3 of urls)
52939
53134
  lines.push(`- ${url3}`);
52940
53135
  if (args.prompt)
@@ -53034,7 +53229,7 @@ function registerTools(server, ctx, capabilities) {
53034
53229
 
53035
53230
  ` + "Create a data extraction workflow using agentic navigation. Supports one-time or scheduled runs. " + "If entity and schema are provided, they guide the extraction; otherwise the AI agent auto-detects the schema from the page. " + "The workflow runs asynchronously and may take several minutes. Do NOT poll or sleep-wait for completion. " + `Return the workflow ID to the user and let them check back later with get_workflow or fetch_data.
53036
53231
 
53037
- ` + "PREFER TEMPLATES: If the user's request matches an existing template, instantiate it via `templateId` instead of writing a fresh prompt/schema. " + "Use `list_templates` to discover available templates and `get_template` to inspect schemas before deciding. " + "When creating from a template, call this tool with the template's `templateId`, the source `urls`, and optional `templateVersion` only. Never copy the template prompt, entity, or schema into standalone creation, and never silently match or rewrite inline configuration.\n\n" + "NOTE: This tool is for one-time or scheduled extraction ONLY. " + "For continuous Julie realtime monitoring (watching a page for data changes and alerting), use the create_realtime_monitor tool instead.",
53232
+ ` + "PREFER TEMPLATES: If the user's request matches an existing template, instantiate it via `templateId` instead of writing a fresh prompt/schema. " + "Use `list_templates` to discover available templates and `get_template` to inspect schemas before deciding. " + "When creating from a template, call this tool with the template's `templateId`, the source `urls`, and optional `templateVersion` only. Never copy the template prompt, entity, or schema into standalone creation, and never silently match or rewrite inline configuration.\n\n" + "NOTE: This tool is for one-time or scheduled extraction ONLY. " + "For continuous realtime monitoring that watches a page for data changes and sends alerts, use the create_realtime_monitor tool instead.",
53038
53233
  inputSchema: strictSchema({
53039
53234
  ...extractionInputShape,
53040
53235
  ...urlInputShape,
@@ -53145,9 +53340,9 @@ function registerTools(server, ctx, capabilities) {
53145
53340
  });
53146
53341
  }));
53147
53342
  server.registerTool("create_realtime_monitor", {
53148
- description: "Create a Julie realtime monitoring workflow that continuously watches a page for data changes and sends alerts. " + "Use this when the user wants to monitor, track, or watch a page in realtime. " + "At least one notification channel (email, webhook, slack, or websocket) is required; notification settings are persisted before Julie is dispatched. " + `Realtime monitors CANNOT be converted to/from regular extraction workflows after creation.
53343
+ description: "Create a realtime monitoring workflow that continuously watches a page for data changes and sends alerts. " + "Use this when the user wants to monitor, track, or watch a page in realtime. " + "At least one notification channel (email, webhook, slack, or websocket) is required; notification settings are persisted before Assistant creation is dispatched. " + `Realtime monitors CANNOT be converted to/from one-time or scheduled extraction workflows after creation.
53149
53344
 
53150
- ` + "If entity and schema are provided, they guide what Julie should monitor; otherwise Julie auto-detects what to watch. " + "Creation is asynchronous and the response includes workflow, session, thread, and job IDs plus a dashboard URL. " + "Use generic workflow Assistant tools (get_workflow_assistant, answer_workflow_assistant_question, interrupt_workflow_assistant, resume_workflow_assistant, stop_workflow_assistant) for follow-up status, questions, and controls. " + "Do NOT poll or sleep-wait for completion.",
53345
+ ` + "If entity and schema are provided, they guide what the Assistant should monitor; otherwise the Assistant determines what to watch. " + "Creation is asynchronous and the response includes workflow, session, thread, and job IDs plus a dashboard URL. " + "Use generic workflow Assistant tools (get_workflow_assistant, answer_workflow_assistant_question, interrupt_workflow_assistant, resume_workflow_assistant, stop_workflow_assistant) for follow-up status, questions, and controls. " + "Do NOT poll or sleep-wait for completion.",
53151
53346
  inputSchema: strictSchema({
53152
53347
  ...extractionInputShape,
53153
53348
  ...urlInputShape,
@@ -53192,7 +53387,7 @@ function registerTools(server, ctx, capabilities) {
53192
53387
  threadId: result.threadId,
53193
53388
  jobId: result.jobId,
53194
53389
  dashboardUrl: workflowDashboardUrl(result.workflowId),
53195
- message: "Julie realtime workflow creation accepted. Notification settings were persisted before Julie dispatch. Creation is asynchronous; use get_workflow_assistant for status, questions, or controls, and do not poll or sleep-wait."
53390
+ message: "Realtime monitoring workflow creation accepted. Notification settings were persisted before Assistant dispatch. Creation is asynchronous; use get_workflow_assistant for status, questions, or controls, and do not poll or sleep-wait."
53196
53391
  });
53197
53392
  }));
53198
53393
  server.registerTool("list_workflows", {
@@ -53350,7 +53545,7 @@ function registerTools(server, ctx, capabilities) {
53350
53545
  });
53351
53546
  }));
53352
53547
  server.registerTool("get_workflow_assistant", {
53353
- description: "Get the current Assistant lifecycle for a workflow, including whether it is working, waiting for input, idle, interrupted, or closed and any pending customer question. Works for both Shelly/Lighthouse and Julie workflows.",
53548
+ description: "Get the current Assistant lifecycle for a workflow, including whether it is working, waiting for input, idle, interrupted, or closed and any pending customer question. Works for one-time or scheduled extraction workflows and realtime monitoring workflows.",
53354
53549
  inputSchema: strictSchema({
53355
53550
  workflowId: exports_external.string().min(1).describe("The workflow ID")
53356
53551
  }),
@@ -53387,6 +53582,30 @@ function registerTools(server, ctx, capabilities) {
53387
53582
  pendingQuestion: pauseState?.pendingQuestion ?? null
53388
53583
  });
53389
53584
  }));
53585
+ server.registerTool("get_workflow_assistant_timeline", {
53586
+ description: "Read the customer-visible conversation history for a workflow Assistant, including user messages, Assistant messages, and clarification questions with answers. " + "Use this when the user asks what the Assistant said or asked, how a clarification was answered, or to show the latest conversation for a workflow. " + "Supports one-time or scheduled extraction workflows and realtime monitoring workflows. Use get_workflow_history instead for configuration revisions. " + "Results are chronological within each page; use nextCursor to request older items when hasMore is true.",
53587
+ inputSchema: strictSchema({
53588
+ workflowId: exports_external.string().min(1).describe("The workflow ID"),
53589
+ cursor: exports_external.string().min(1).optional().describe("Opaque nextCursor from the previous page"),
53590
+ limit: exports_external.preprocess(coerceNumber(), exports_external.number().int().min(1).max(100)).optional().describe("Maximum history items to return (default: 50, maximum: 100)")
53591
+ }),
53592
+ annotations: { readOnlyHint: true, destructiveHint: false, idempotentHint: true }
53593
+ }, withErrorHandling("get_workflow_assistant_timeline", async (args) => {
53594
+ const timeline = await ctx.client.assistant.getTimeline(args.workflowId, {
53595
+ cursor: args.cursor,
53596
+ limit: args.limit
53597
+ });
53598
+ if (timeline.workflowId !== args.workflowId) {
53599
+ return errorResult(`The Assistant timeline returned workflow ID '${timeline.workflowId}' instead of '${args.workflowId}'.`);
53600
+ }
53601
+ return jsonResult({
53602
+ workflowId: timeline.workflowId,
53603
+ sessionId: timeline.sessionId,
53604
+ items: timeline.items,
53605
+ pagination: timeline.pagination,
53606
+ dashboardUrl: workflowDashboardUrl(timeline.workflowId)
53607
+ });
53608
+ }));
53390
53609
  server.registerTool("answer_workflow_assistant_question", {
53391
53610
  description: "Answer the workflow Assistant's currently pending clarification question and resume it. " + "Use `answer` for a freeform response, or `answers` for the structured key/value response described by get_workflow_assistant. Provide exactly one. The question ID must still be current.",
53392
53611
  inputSchema: strictSchema({
@@ -53466,7 +53685,7 @@ function registerTools(server, ctx, capabilities) {
53466
53685
  });
53467
53686
  }));
53468
53687
  server.registerTool("resume_workflow_assistant", {
53469
- description: "Resume an idle or interrupted workflow Assistant using the persona and conversation persisted on its session. Works for both Lighthouse and Julie. This does not resume a paused workflow schedule; use approve_workflow for that.",
53688
+ description: "Resume an idle or interrupted workflow Assistant using the role and conversation persisted on its session. Works for one-time or scheduled extraction workflows and realtime monitoring workflows. This does not resume a paused workflow schedule; use approve_workflow for that.",
53470
53689
  inputSchema: strictSchema({
53471
53690
  workflowId: exports_external.string().min(1).describe("Workflow whose Assistant session should resume")
53472
53691
  }),
@@ -53718,7 +53937,7 @@ function registerTools(server, ctx, capabilities) {
53718
53937
  });
53719
53938
  }));
53720
53939
  server.registerTool("list_changes", {
53721
- description: "List detected data changes across one or more Julie realtime monitoring workflows. " + "Returns structured diffs showing added, removed, and changed records. " + "Only works for workflows with realtime monitoring enabled.",
53940
+ description: "List detected data changes across one or more realtime monitoring workflows. " + "Returns structured diffs showing added, removed, and changed records. " + "Only works for workflows with realtime monitoring enabled.",
53722
53941
  inputSchema: {
53723
53942
  workflowIds: exports_external.preprocess(coerceArray(true), exports_external.array(exports_external.string())).optional().describe("Workflow IDs to filter by. If omitted, returns changes for all ACTIVE monitoring workflows."),
53724
53943
  startDate: exports_external.string().optional().describe("Start date filter (ISO format, e.g. 2025-01-01)"),
@@ -53828,9 +54047,9 @@ function registerTools(server, ctx, capabilities) {
53828
54047
  server.registerTool("update_workflow", {
53829
54048
  description: `Update a workflow's configuration. All fields are optional - only provided fields will be updated. Use this to change the name, URLs, extraction schema, entity, prompt, schedule, or other metadata.
53830
54049
 
53831
- ` + `IMPORTANT: You cannot change a workflow's interval to or from REAL_TIME. Julie realtime workflows are architecturally different from scheduled workflows and must be created with create_realtime_monitor from the start. Existing workflows cannot be converted between these modes in place; do not delete and recreate a workflow as an update workaround.
54050
+ ` + `IMPORTANT: You cannot change a workflow's interval to or from REAL_TIME. Realtime monitoring workflows are architecturally different from one-time or scheduled extraction workflows and must be created with create_realtime_monitor from the start. Existing workflows cannot be converted between these modes in place; do not delete and recreate a workflow as an update workaround.
53832
54051
 
53833
- ` + "ASSISTANT-OWNED INTENT: Use request_workflow_update - not `userPrompt` - for agent-built workflow changes to extraction intent, navigation, pagination, data sourcing, repair, or generated scripts. `userPrompt` may be rejected with `SHELLY_INTENT_REQUIRES_EXTRACTION_SPEC` because those workflows' canonical intent is owned by the Assistant. " + "Call get_workflow first. If its template.controlledParts contains the setting, create and apply a template version instead of overriding the workflow directly. NEVER delete and recreate a workflow to work around an update limitation - that changes workflowId, breaks downstream tables/connectors, and discards history.",
54052
+ ` + "ASSISTANT-OWNED INTENT: Use request_workflow_update - not `userPrompt` - for Assistant-built workflow changes to extraction intent, navigation, pagination, data sourcing, repair, or generated scripts. The API may reject `userPrompt` because these workflows' canonical intent is owned by the Assistant. " + "Call get_workflow first. If its template.controlledParts contains the setting, create and apply a template version instead of overriding the workflow directly. NEVER delete and recreate a workflow to work around an update limitation - that changes workflowId, breaks downstream tables/connectors, and discards history.",
53834
54053
  inputSchema: strictSchema({
53835
54054
  workflowId: exports_external.string().describe("The workflow ID to update"),
53836
54055
  name: exports_external.string().optional().describe("New name for the workflow"),
@@ -53873,10 +54092,10 @@ function registerTools(server, ctx, capabilities) {
53873
54092
  const isCurrentlyRealTime = isRealTimeInterval(workflow.updateInterval);
53874
54093
  const isRequestingRealTime = isRealTimeInterval(updates.updateInterval);
53875
54094
  if (isRequestingRealTime && !isCurrentlyRealTime) {
53876
- return errorResult("Cannot change a regular workflow's interval to REAL_TIME. " + "Julie realtime workflows cannot replace this workflow in place. " + "The existing workflow was left unchanged.");
54095
+ return errorResult("Cannot change a regular workflow's interval to REAL_TIME. " + "Realtime monitoring workflows cannot replace this workflow in place. " + "The existing workflow was left unchanged.");
53877
54096
  }
53878
54097
  if (!isRequestingRealTime && isCurrentlyRealTime) {
53879
- return errorResult("Cannot change a Julie realtime workflow's interval to a scheduled interval. " + "Julie realtime workflows are architecturally different and cannot be converted in place. " + "The existing workflow was left unchanged.");
54098
+ return errorResult("Cannot change a realtime monitoring workflow's interval to a scheduled interval. " + "Realtime monitoring workflows are architecturally different and cannot be converted in place. " + "The existing workflow was left unchanged.");
53880
54099
  }
53881
54100
  }
53882
54101
  if (updates.updateInterval === "CUSTOM" && (!updates.schedules || updates.schedules.length === 0)) {
@@ -54742,7 +54961,7 @@ var package_default;
54742
54961
  var init_package = __esm(() => {
54743
54962
  package_default = {
54744
54963
  name: "@kadoa/mcp",
54745
- version: "0.5.21",
54964
+ version: "0.5.23",
54746
54965
  description: "Kadoa MCP Server — manage workflows from Claude Desktop, Cursor, and other MCP clients",
54747
54966
  type: "module",
54748
54967
  main: "dist/index.js",
@@ -54766,7 +54985,7 @@ var init_package = __esm(() => {
54766
54985
  prepublishOnly: "bun run check-types && bun run test:unit && bun run build"
54767
54986
  },
54768
54987
  dependencies: {
54769
- "@kadoa/node-sdk": "^0.38.0",
54988
+ "@kadoa/node-sdk": "^0.39.0",
54770
54989
  "@modelcontextprotocol/sdk": "^1.26.0",
54771
54990
  express: "^5.2.1",
54772
54991
  "express-rate-limit": "^8.2.1",
@@ -60352,7 +60571,7 @@ async function createServer(auth, options) {
60352
60571
  "",
60353
60572
  "Workflow lifecycle: create_workflow \u2192 get_workflow (check status) \u2192 fetch_data (get results). Workflows run asynchronously - never poll or sleep-wait.",
60354
60573
  "",
60355
- "Use create_realtime_monitor only when the user wants continuous Julie change detection with alerts. It first persists notification channels, then asynchronously returns workflow/session/thread/job IDs; use the workflow Assistant tools for follow-up status, questions, and controls.",
60574
+ "Use create_realtime_monitor only when the user wants continuous realtime change detection with alerts. It first persists notification channels, then asynchronously returns workflow/session/thread/job IDs; use the workflow Assistant tools for follow-up status, questions, and controls.",
60356
60575
  "For one-time or scheduled extraction, use create_workflow. Use scrape for an immediate raw HTML or markdown fetch from one URL. Use create_workflow for structured extraction, recurring runs, monitoring, or navigation-heavy jobs.",
60357
60576
  "If a one-time or scheduled workflow fails, retry it with run_workflow using the existing workflow ID. Do NOT delete and recreate the workflow just to retry it - preserve its workflow ID and configuration. Realtime workflows cannot be manually run.",
60358
60577
  "Use list_changes and get_change to retrieve detected diffs from realtime monitoring workflows.",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@kadoa/mcp",
3
- "version": "0.5.21",
3
+ "version": "0.5.23",
4
4
  "description": "Kadoa MCP Server — manage workflows from Claude Desktop, Cursor, and other MCP clients",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -24,7 +24,7 @@
24
24
  "prepublishOnly": "bun run check-types && bun run test:unit && bun run build"
25
25
  },
26
26
  "dependencies": {
27
- "@kadoa/node-sdk": "^0.38.0",
27
+ "@kadoa/node-sdk": "^0.39.0",
28
28
  "@modelcontextprotocol/sdk": "^1.26.0",
29
29
  "express": "^5.2.1",
30
30
  "express-rate-limit": "^8.2.1",