@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.
- package/README.md +14 -11
- package/dist/index.js +235 -16
- 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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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.
|
|
195
|
-
|
|
196
|
-
|
|
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
|
|
207
|
-
|
|
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.
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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: "
|
|
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
|
|
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
|
|
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
|
|
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.
|
|
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
|
|
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. " + "
|
|
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
|
|
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.
|
|
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.
|
|
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
|
|
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.
|
|
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.
|
|
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",
|