jetty-mcp-server 1.0.0 → 1.0.3
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 +2 -3
- package/dist/client.d.ts +17 -6
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +126 -40
- package/dist/client.js.map +1 -1
- package/dist/tools.d.ts.map +1 -1
- package/dist/tools.js +232 -4
- package/dist/tools.js.map +1 -1
- package/package.json +3 -1
- package/src/client.ts +168 -42
- package/src/tools.ts +377 -14
- package/tests/auth.test.mjs +129 -0
- package/tests/routines.test.mjs +236 -0
package/README.md
CHANGED
|
@@ -14,15 +14,14 @@ Set your API token:
|
|
|
14
14
|
export JETTY_API_TOKEN="mlc_your_token_here"
|
|
15
15
|
```
|
|
16
16
|
|
|
17
|
-
Get a token at [
|
|
17
|
+
Get a token at [jetty.io](https://jetty.io) → Settings → API Tokens.
|
|
18
18
|
|
|
19
19
|
## Environment Variables
|
|
20
20
|
|
|
21
21
|
| Variable | Required | Default | Description |
|
|
22
22
|
|----------|----------|---------|-------------|
|
|
23
23
|
| `JETTY_API_TOKEN` | Yes | — | Your Jetty API token (`mlc_...`) |
|
|
24
|
-
| `
|
|
25
|
-
| `JETTY_FLOWS_URL` | No | `https://flows-api.jetty.io` | Flows API base URL |
|
|
24
|
+
| `JETTY_API_URL` | No | `https://flows-api.jetty.io` | API base URL |
|
|
26
25
|
|
|
27
26
|
## Configuration
|
|
28
27
|
|
package/dist/client.d.ts
CHANGED
|
@@ -1,11 +1,10 @@
|
|
|
1
1
|
export declare class JettyClient {
|
|
2
2
|
private token;
|
|
3
|
-
private
|
|
4
|
-
private flowsUrl;
|
|
3
|
+
private apiUrl;
|
|
5
4
|
constructor();
|
|
5
|
+
private requireToken;
|
|
6
6
|
private request;
|
|
7
|
-
private
|
|
8
|
-
private flows;
|
|
7
|
+
private api;
|
|
9
8
|
listCollections(): Promise<unknown>;
|
|
10
9
|
getCollection(collection: string): Promise<unknown>;
|
|
11
10
|
listTasks(collection: string): Promise<unknown>;
|
|
@@ -16,8 +15,11 @@ export declare class JettyClient {
|
|
|
16
15
|
description?: string;
|
|
17
16
|
}): Promise<unknown>;
|
|
18
17
|
deleteTask(collection: string, task: string): Promise<unknown>;
|
|
19
|
-
|
|
20
|
-
|
|
18
|
+
getTrialStatus(collection: string): Promise<unknown>;
|
|
19
|
+
activateTrial(collection: string): Promise<unknown>;
|
|
20
|
+
getCollectionEnvironment(collection: string): Promise<unknown>;
|
|
21
|
+
runWorkflow(collection: string, task: string, initParams?: Record<string, unknown>, useTrialKeys?: boolean): Promise<unknown>;
|
|
22
|
+
runWorkflowSync(collection: string, task: string, initParams?: Record<string, unknown>, useTrialKeys?: boolean): Promise<unknown>;
|
|
21
23
|
listTrajectories(collection: string, task: string, limit?: number, page?: number): Promise<unknown>;
|
|
22
24
|
getTrajectory(collection: string, task: string, trajectoryId: string): Promise<unknown>;
|
|
23
25
|
getStats(collection: string, task: string): Promise<unknown>;
|
|
@@ -26,5 +28,14 @@ export declare class JettyClient {
|
|
|
26
28
|
listStepTemplates(): Promise<unknown>;
|
|
27
29
|
getStepTemplate(name: string): Promise<unknown>;
|
|
28
30
|
setEnvironmentVars(collection: string, vars: Record<string, string>): Promise<unknown>;
|
|
31
|
+
listRoutines(collection: string, task?: string): Promise<unknown>;
|
|
32
|
+
getRoutine(collection: string, task: string, name: string): Promise<unknown>;
|
|
33
|
+
createRoutine(collection: string, task: string, body: Record<string, unknown>): Promise<unknown>;
|
|
34
|
+
updateRoutine(collection: string, task: string, name: string, patch: Record<string, unknown>): Promise<unknown>;
|
|
35
|
+
deleteRoutine(collection: string, task: string, name: string): Promise<unknown>;
|
|
36
|
+
pauseRoutine(collection: string, task: string, name: string): Promise<unknown>;
|
|
37
|
+
resumeRoutine(collection: string, task: string, name: string): Promise<unknown>;
|
|
38
|
+
runRoutineNow(collection: string, task: string, name: string): Promise<unknown>;
|
|
39
|
+
listRoutineRuns(collection: string, task: string, name: string, limit?: number): Promise<unknown>;
|
|
29
40
|
}
|
|
30
41
|
//# sourceMappingURL=client.d.ts.map
|
package/dist/client.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
|
package/dist/client.js
CHANGED
|
@@ -1,23 +1,33 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
1
|
+
import { readFileSync } from "node:fs";
|
|
2
|
+
import { homedir } from "node:os";
|
|
3
|
+
import { join } from "node:path";
|
|
4
|
+
const DEFAULT_API_URL = "https://flows-api.jetty.io";
|
|
5
|
+
// The `jetty` CLI / Claude Code skill writes the collection-scoped `mlc_` key
|
|
6
|
+
// here on `jetty login`. We fall back to it so an already-logged-in user does
|
|
7
|
+
// not also have to plumb JETTY_API_TOKEN into the MCP server's env. Resolved
|
|
8
|
+
// lazily (not memoized at module load) so HOME changes are honoured.
|
|
9
|
+
function tokenFilePath() {
|
|
10
|
+
return join(homedir(), ".config", "jetty", "token");
|
|
11
|
+
}
|
|
3
12
|
export class JettyClient {
|
|
4
13
|
token;
|
|
5
|
-
|
|
6
|
-
flowsUrl;
|
|
14
|
+
apiUrl;
|
|
7
15
|
constructor() {
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
16
|
+
this.token = resolveToken();
|
|
17
|
+
this.apiUrl = process.env.JETTY_API_URL || DEFAULT_API_URL;
|
|
18
|
+
}
|
|
19
|
+
requireToken() {
|
|
20
|
+
if (!this.token) {
|
|
21
|
+
throw new Error("No Jetty token found. Set JETTY_API_TOKEN, or run `jetty login` " +
|
|
22
|
+
`(writes ${tokenFilePath()}). ` +
|
|
23
|
+
"Get a token at https://jetty.io → Settings → API Tokens");
|
|
12
24
|
}
|
|
13
|
-
this.token
|
|
14
|
-
this.dockUrl = DOCK_URL;
|
|
15
|
-
this.flowsUrl = FLOWS_URL;
|
|
25
|
+
return this.token;
|
|
16
26
|
}
|
|
17
|
-
async request(
|
|
18
|
-
const url = `${
|
|
27
|
+
async request(path, options = {}) {
|
|
28
|
+
const url = `${this.apiUrl}${path}`;
|
|
19
29
|
const headers = {
|
|
20
|
-
Authorization: `Bearer ${this.
|
|
30
|
+
Authorization: `Bearer ${this.requireToken()}`,
|
|
21
31
|
...(options.headers || {}),
|
|
22
32
|
};
|
|
23
33
|
const res = await fetch(url, { ...options, headers });
|
|
@@ -31,78 +41,92 @@ export class JettyClient {
|
|
|
31
41
|
}
|
|
32
42
|
return res.text();
|
|
33
43
|
}
|
|
34
|
-
|
|
35
|
-
return this.request(
|
|
36
|
-
}
|
|
37
|
-
flows(path, options) {
|
|
38
|
-
return this.request(this.flowsUrl, path, options);
|
|
44
|
+
api(path, options) {
|
|
45
|
+
return this.request(path, options);
|
|
39
46
|
}
|
|
40
47
|
// Collections
|
|
41
48
|
async listCollections() {
|
|
42
|
-
return this.
|
|
49
|
+
return this.api("/api/v1/collections/");
|
|
43
50
|
}
|
|
44
51
|
async getCollection(collection) {
|
|
45
|
-
return this.
|
|
52
|
+
return this.api(`/api/v1/collections/${collection}`);
|
|
46
53
|
}
|
|
47
54
|
// Tasks
|
|
48
55
|
async listTasks(collection) {
|
|
49
|
-
return this.
|
|
56
|
+
return this.api(`/api/v1/tasks/${collection}/`);
|
|
50
57
|
}
|
|
51
58
|
async getTask(collection, task) {
|
|
52
|
-
return this.
|
|
59
|
+
return this.api(`/api/v1/tasks/${collection}/${task}`);
|
|
53
60
|
}
|
|
54
61
|
async createTask(collection, name, workflow, description) {
|
|
55
|
-
return this.
|
|
62
|
+
return this.api(`/api/v1/tasks/${collection}`, {
|
|
56
63
|
method: "POST",
|
|
57
64
|
headers: { "Content-Type": "application/json" },
|
|
58
65
|
body: JSON.stringify({ name, description: description || "", workflow }),
|
|
59
66
|
});
|
|
60
67
|
}
|
|
61
68
|
async updateTask(collection, task, updates) {
|
|
62
|
-
return this.
|
|
69
|
+
return this.api(`/api/v1/tasks/${collection}/${task}`, {
|
|
63
70
|
method: "PUT",
|
|
64
71
|
headers: { "Content-Type": "application/json" },
|
|
65
72
|
body: JSON.stringify(updates),
|
|
66
73
|
});
|
|
67
74
|
}
|
|
68
75
|
async deleteTask(collection, task) {
|
|
69
|
-
return this.
|
|
76
|
+
return this.api(`/api/v1/tasks/${collection}/${task}`, {
|
|
70
77
|
method: "DELETE",
|
|
71
78
|
});
|
|
72
79
|
}
|
|
80
|
+
// Trial keys
|
|
81
|
+
async getTrialStatus(collection) {
|
|
82
|
+
return this.api(`/api/v1/trial/${collection}`);
|
|
83
|
+
}
|
|
84
|
+
async activateTrial(collection) {
|
|
85
|
+
return this.api(`/api/v1/trial/${collection}/activate`, {
|
|
86
|
+
method: "POST",
|
|
87
|
+
});
|
|
88
|
+
}
|
|
89
|
+
// Collection environment
|
|
90
|
+
async getCollectionEnvironment(collection) {
|
|
91
|
+
return this.api(`/api/v1/collections/${collection}/environment`);
|
|
92
|
+
}
|
|
73
93
|
// Run workflows
|
|
74
|
-
async runWorkflow(collection, task, initParams) {
|
|
94
|
+
async runWorkflow(collection, task, initParams, useTrialKeys) {
|
|
75
95
|
const formData = new FormData();
|
|
76
|
-
formData.append("bakery_host", this.dockUrl);
|
|
77
96
|
formData.append("init_params", JSON.stringify(initParams || {}));
|
|
78
|
-
|
|
97
|
+
if (useTrialKeys) {
|
|
98
|
+
formData.append("use_trial_keys", "true");
|
|
99
|
+
}
|
|
100
|
+
return this.api(`/api/v1/run/${collection}/${task}`, {
|
|
79
101
|
method: "POST",
|
|
80
102
|
body: formData,
|
|
81
103
|
});
|
|
82
104
|
}
|
|
83
|
-
async runWorkflowSync(collection, task, initParams) {
|
|
105
|
+
async runWorkflowSync(collection, task, initParams, useTrialKeys) {
|
|
84
106
|
const formData = new FormData();
|
|
85
|
-
formData.append("bakery_host", this.dockUrl);
|
|
86
107
|
formData.append("init_params", JSON.stringify(initParams || {}));
|
|
87
|
-
|
|
108
|
+
if (useTrialKeys) {
|
|
109
|
+
formData.append("use_trial_keys", "true");
|
|
110
|
+
}
|
|
111
|
+
return this.api(`/api/v1/run-sync/${collection}/${task}`, {
|
|
88
112
|
method: "POST",
|
|
89
113
|
body: formData,
|
|
90
114
|
});
|
|
91
115
|
}
|
|
92
116
|
// Trajectories
|
|
93
117
|
async listTrajectories(collection, task, limit = 10, page = 1) {
|
|
94
|
-
return this.
|
|
118
|
+
return this.api(`/api/v1/db/trajectories/${collection}/${task}?limit=${limit}&page=${page}`);
|
|
95
119
|
}
|
|
96
120
|
async getTrajectory(collection, task, trajectoryId) {
|
|
97
|
-
return this.
|
|
121
|
+
return this.api(`/api/v1/db/trajectory/${collection}/${task}/${trajectoryId}`);
|
|
98
122
|
}
|
|
99
123
|
// Stats
|
|
100
124
|
async getStats(collection, task) {
|
|
101
|
-
return this.
|
|
125
|
+
return this.api(`/api/v1/db/stats/${collection}/${task}`);
|
|
102
126
|
}
|
|
103
127
|
// Labels
|
|
104
128
|
async addLabel(collection, task, trajectoryId, key, value, author) {
|
|
105
|
-
return this.
|
|
129
|
+
return this.api(`/api/v1/trajectory/${collection}/${task}/${trajectoryId}/labels`, {
|
|
106
130
|
method: "POST",
|
|
107
131
|
headers: { "Content-Type": "application/json" },
|
|
108
132
|
body: JSON.stringify({ key, value, author }),
|
|
@@ -110,22 +134,84 @@ export class JettyClient {
|
|
|
110
134
|
}
|
|
111
135
|
// Workflow logs
|
|
112
136
|
async getWorkflowLogs(workflowId) {
|
|
113
|
-
return this.
|
|
137
|
+
return this.api(`/api/v1/workflows-logs/${workflowId}`);
|
|
114
138
|
}
|
|
115
139
|
// Step templates
|
|
116
140
|
async listStepTemplates() {
|
|
117
|
-
return this.request(
|
|
141
|
+
return this.request("/api/v1/step-templates");
|
|
118
142
|
}
|
|
119
143
|
async getStepTemplate(name) {
|
|
120
|
-
return this.request(
|
|
144
|
+
return this.request(`/api/v1/step-templates/${name}`);
|
|
121
145
|
}
|
|
122
146
|
// Environment variables
|
|
123
147
|
async setEnvironmentVars(collection, vars) {
|
|
124
|
-
return this.
|
|
148
|
+
return this.api(`/api/v1/collections/${collection}/environment`, {
|
|
125
149
|
method: "PATCH",
|
|
126
150
|
headers: { "Content-Type": "application/json" },
|
|
127
151
|
body: JSON.stringify({ environment_variables: vars }),
|
|
128
152
|
});
|
|
129
153
|
}
|
|
154
|
+
// Routines (scheduled runs)
|
|
155
|
+
async listRoutines(collection, task) {
|
|
156
|
+
const path = task
|
|
157
|
+
? `/api/v1/routines/${collection}/${task}`
|
|
158
|
+
: `/api/v1/routines/${collection}`;
|
|
159
|
+
return this.api(path);
|
|
160
|
+
}
|
|
161
|
+
async getRoutine(collection, task, name) {
|
|
162
|
+
return this.api(`/api/v1/routines/${collection}/${task}/${name}`);
|
|
163
|
+
}
|
|
164
|
+
async createRoutine(collection, task, body) {
|
|
165
|
+
return this.api(`/api/v1/routines/${collection}/${task}`, {
|
|
166
|
+
method: "POST",
|
|
167
|
+
headers: { "Content-Type": "application/json" },
|
|
168
|
+
body: JSON.stringify(body),
|
|
169
|
+
});
|
|
170
|
+
}
|
|
171
|
+
async updateRoutine(collection, task, name, patch) {
|
|
172
|
+
return this.api(`/api/v1/routines/${collection}/${task}/${name}`, {
|
|
173
|
+
method: "PATCH",
|
|
174
|
+
headers: { "Content-Type": "application/json" },
|
|
175
|
+
body: JSON.stringify(patch),
|
|
176
|
+
});
|
|
177
|
+
}
|
|
178
|
+
async deleteRoutine(collection, task, name) {
|
|
179
|
+
return this.api(`/api/v1/routines/${collection}/${task}/${name}`, {
|
|
180
|
+
method: "DELETE",
|
|
181
|
+
});
|
|
182
|
+
}
|
|
183
|
+
async pauseRoutine(collection, task, name) {
|
|
184
|
+
return this.api(`/api/v1/routines/${collection}/${task}/${name}/pause`, { method: "POST" });
|
|
185
|
+
}
|
|
186
|
+
async resumeRoutine(collection, task, name) {
|
|
187
|
+
return this.api(`/api/v1/routines/${collection}/${task}/${name}/resume`, { method: "POST" });
|
|
188
|
+
}
|
|
189
|
+
async runRoutineNow(collection, task, name) {
|
|
190
|
+
return this.api(`/api/v1/routines/${collection}/${task}/${name}/run-now`, { method: "POST" });
|
|
191
|
+
}
|
|
192
|
+
async listRoutineRuns(collection, task, name, limit) {
|
|
193
|
+
const qs = typeof limit === "number" ? `?limit=${limit}` : "";
|
|
194
|
+
return this.api(`/api/v1/routines/${collection}/${task}/${name}/runs${qs}`);
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
/**
|
|
198
|
+
* Resolve the API token: prefer JETTY_API_TOKEN (trimmed, non-empty), then the
|
|
199
|
+
* token file written by `jetty login`. The env var is checked for emptiness
|
|
200
|
+
* because the plugin's .mcp.json may pass it through as "" — which must not
|
|
201
|
+
* count as "set" and must not block the file fallback.
|
|
202
|
+
*/
|
|
203
|
+
function resolveToken() {
|
|
204
|
+
const fromEnv = process.env.JETTY_API_TOKEN?.trim();
|
|
205
|
+
if (fromEnv)
|
|
206
|
+
return fromEnv;
|
|
207
|
+
try {
|
|
208
|
+
const fromFile = readFileSync(tokenFilePath(), "utf8").trim();
|
|
209
|
+
if (fromFile)
|
|
210
|
+
return fromFile;
|
|
211
|
+
}
|
|
212
|
+
catch {
|
|
213
|
+
// file absent / unreadable — fall through to undefined
|
|
214
|
+
}
|
|
215
|
+
return undefined;
|
|
130
216
|
}
|
|
131
217
|
//# sourceMappingURL=client.js.map
|
package/dist/client.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAAA,MAAM,
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
|
package/dist/tools.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tools.d.ts","sourceRoot":"","sources":["../src/tools.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAEpE,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"tools.d.ts","sourceRoot":"","sources":["../src/tools.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAEpE,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AA8D1C,wBAAgB,aAAa,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,WAAW,QAwgBnE"}
|
package/dist/tools.js
CHANGED
|
@@ -4,6 +4,46 @@ function jsonResult(data) {
|
|
|
4
4
|
content: [{ type: "text", text: JSON.stringify(data, null, 2) }],
|
|
5
5
|
};
|
|
6
6
|
}
|
|
7
|
+
const PROVIDER_KEYS = [
|
|
8
|
+
"OPENAI_API_KEY",
|
|
9
|
+
"ANTHROPIC_API_KEY",
|
|
10
|
+
"GEMINI_API_KEY",
|
|
11
|
+
"REPLICATE_API_TOKEN",
|
|
12
|
+
];
|
|
13
|
+
async function detectTrialEligibility(client, collection) {
|
|
14
|
+
try {
|
|
15
|
+
const trialStatus = (await client.getTrialStatus(collection));
|
|
16
|
+
if (!trialStatus.active) {
|
|
17
|
+
return {
|
|
18
|
+
useTrialKeys: false,
|
|
19
|
+
trialInfo: { trial_active: false },
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
const env = (await client.getCollectionEnvironment(collection));
|
|
23
|
+
const envKeys = Object.keys(env);
|
|
24
|
+
const hasProviderKeys = PROVIDER_KEYS.some((k) => envKeys.includes(k));
|
|
25
|
+
if (hasProviderKeys) {
|
|
26
|
+
return {
|
|
27
|
+
useTrialKeys: false,
|
|
28
|
+
trialInfo: {
|
|
29
|
+
trial_active: true,
|
|
30
|
+
using_trial_keys: false,
|
|
31
|
+
reason: "Collection has its own provider keys",
|
|
32
|
+
},
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
return {
|
|
36
|
+
useTrialKeys: true,
|
|
37
|
+
trialInfo: {
|
|
38
|
+
trial_active: true,
|
|
39
|
+
using_trial_keys: true,
|
|
40
|
+
},
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
catch {
|
|
44
|
+
return { useTrialKeys: false, trialInfo: {} };
|
|
45
|
+
}
|
|
46
|
+
}
|
|
7
47
|
export function registerTools(server, client) {
|
|
8
48
|
// ── Collections ──────────────────────────────────────────────
|
|
9
49
|
server.tool("list-collections", "List all collections", {}, async () => {
|
|
@@ -48,8 +88,15 @@ export function registerTools(server, client) {
|
|
|
48
88
|
updates.description = description;
|
|
49
89
|
return jsonResult(await client.updateTask(collection, task, updates));
|
|
50
90
|
});
|
|
91
|
+
// ── Trial Keys ────────────────────────────────────────────────
|
|
92
|
+
server.tool("get-trial-status", "Get trial key status for a collection", { collection: z.string().describe("Collection name") }, async ({ collection }) => {
|
|
93
|
+
return jsonResult(await client.getTrialStatus(collection));
|
|
94
|
+
});
|
|
95
|
+
server.tool("activate-trial", "Activate trial keys for a collection", { collection: z.string().describe("Collection name") }, async ({ collection }) => {
|
|
96
|
+
return jsonResult(await client.activateTrial(collection));
|
|
97
|
+
});
|
|
51
98
|
// ── Run Workflows ────────────────────────────────────────────
|
|
52
|
-
server.tool("run-workflow", "Run a workflow asynchronously (returns immediately with workflow_id)", {
|
|
99
|
+
server.tool("run-workflow", "Run a workflow asynchronously (returns immediately with workflow_id). Auto-detects trial key eligibility.", {
|
|
53
100
|
collection: z.string().describe("Collection name"),
|
|
54
101
|
task: z.string().describe("Task name"),
|
|
55
102
|
init_params: z
|
|
@@ -57,9 +104,11 @@ export function registerTools(server, client) {
|
|
|
57
104
|
.optional()
|
|
58
105
|
.describe("Input parameters for the workflow"),
|
|
59
106
|
}, async ({ collection, task, init_params }) => {
|
|
60
|
-
|
|
107
|
+
const { useTrialKeys, trialInfo } = await detectTrialEligibility(client, collection);
|
|
108
|
+
const result = await client.runWorkflow(collection, task, init_params, useTrialKeys);
|
|
109
|
+
return jsonResult({ ...trialInfo, result });
|
|
61
110
|
});
|
|
62
|
-
server.tool("run-workflow-sync", "Run a workflow synchronously (blocks until completion, may take 30-60s)", {
|
|
111
|
+
server.tool("run-workflow-sync", "Run a workflow synchronously (blocks until completion, may take 30-60s). Auto-detects trial key eligibility.", {
|
|
63
112
|
collection: z.string().describe("Collection name"),
|
|
64
113
|
task: z.string().describe("Task name"),
|
|
65
114
|
init_params: z
|
|
@@ -67,7 +116,9 @@ export function registerTools(server, client) {
|
|
|
67
116
|
.optional()
|
|
68
117
|
.describe("Input parameters for the workflow"),
|
|
69
118
|
}, async ({ collection, task, init_params }) => {
|
|
70
|
-
|
|
119
|
+
const { useTrialKeys, trialInfo } = await detectTrialEligibility(client, collection);
|
|
120
|
+
const result = await client.runWorkflowSync(collection, task, init_params, useTrialKeys);
|
|
121
|
+
return jsonResult({ ...trialInfo, result });
|
|
71
122
|
});
|
|
72
123
|
// ── Trajectories ─────────────────────────────────────────────
|
|
73
124
|
server.tool("list-trajectories", "List recent workflow runs (trajectories) for a task", {
|
|
@@ -110,5 +161,182 @@ export function registerTools(server, client) {
|
|
|
110
161
|
server.tool("get-step-template", "Get details and schema for a step template", { name: z.string().describe("Step template activity name") }, async ({ name }) => {
|
|
111
162
|
return jsonResult(await client.getStepTemplate(name));
|
|
112
163
|
});
|
|
164
|
+
// ── Environment Variables ─────────────────────────────────────
|
|
165
|
+
server.tool("check-secrets", "Check which environment variables a collection has configured vs. what a runbook needs", {
|
|
166
|
+
collection: z.string().describe("Collection name"),
|
|
167
|
+
required_keys: z
|
|
168
|
+
.array(z.string())
|
|
169
|
+
.describe("Environment variable names the runbook requires"),
|
|
170
|
+
}, async ({ collection, required_keys }) => {
|
|
171
|
+
const col = (await client.getCollectionEnvironment(collection));
|
|
172
|
+
const envVars = (col.environment_variables || {});
|
|
173
|
+
const configured = Object.keys(envVars);
|
|
174
|
+
const missing = required_keys.filter((k) => !configured.includes(k));
|
|
175
|
+
return jsonResult({
|
|
176
|
+
configured,
|
|
177
|
+
missing,
|
|
178
|
+
ready: missing.length === 0,
|
|
179
|
+
});
|
|
180
|
+
});
|
|
181
|
+
server.tool("set-environment-vars", "Set environment variables on a collection (merge semantics, pass null to delete a key)", {
|
|
182
|
+
collection: z.string().describe("Collection name"),
|
|
183
|
+
variables: z
|
|
184
|
+
.record(z.string().nullable())
|
|
185
|
+
.describe("Key-value pairs to set (null to delete)"),
|
|
186
|
+
}, async ({ collection, variables }) => {
|
|
187
|
+
return jsonResult(await client.setEnvironmentVars(collection, variables));
|
|
188
|
+
});
|
|
189
|
+
// ── Routines (Scheduled Runs) ─────────────────────────────────
|
|
190
|
+
const cadenceSchema = z
|
|
191
|
+
.object({
|
|
192
|
+
type: z
|
|
193
|
+
.enum(["manual", "hourly", "daily", "weekdays", "weekly"])
|
|
194
|
+
.describe("Cadence type. 'manual' creates a saved invocation preset (no schedule); the others register a Temporal schedule."),
|
|
195
|
+
hour_utc: z
|
|
196
|
+
.number()
|
|
197
|
+
.int()
|
|
198
|
+
.min(0)
|
|
199
|
+
.max(23)
|
|
200
|
+
.optional()
|
|
201
|
+
.describe("Hour of day in UTC (0-23). Required for daily/weekdays/weekly."),
|
|
202
|
+
minute_utc: z
|
|
203
|
+
.number()
|
|
204
|
+
.int()
|
|
205
|
+
.min(0)
|
|
206
|
+
.max(59)
|
|
207
|
+
.optional()
|
|
208
|
+
.describe("Minute of the hour in UTC (0-59). Defaults to 0."),
|
|
209
|
+
day_of_week: z
|
|
210
|
+
.enum(["mon", "tue", "wed", "thu", "fri", "sat", "sun"])
|
|
211
|
+
.optional()
|
|
212
|
+
.describe("Day of week. Required for weekly cadence."),
|
|
213
|
+
})
|
|
214
|
+
.describe("Cadence config. Examples: {type:'hourly', minute_utc:15}, {type:'daily', hour_utc:9}, {type:'weekly', day_of_week:'mon', hour_utc:9}.");
|
|
215
|
+
server.tool("list-routines", "List scheduled routines for a collection (optionally scoped to a task)", {
|
|
216
|
+
collection: z.string().describe("Collection name"),
|
|
217
|
+
task: z
|
|
218
|
+
.string()
|
|
219
|
+
.optional()
|
|
220
|
+
.describe("Task name (omit to list all routines in the collection)"),
|
|
221
|
+
}, async ({ collection, task }) => {
|
|
222
|
+
return jsonResult(await client.listRoutines(collection, task));
|
|
223
|
+
});
|
|
224
|
+
server.tool("get-routine", "Get a single routine including resolved next_run_at from Temporal", {
|
|
225
|
+
collection: z.string().describe("Collection name"),
|
|
226
|
+
task: z.string().describe("Task name"),
|
|
227
|
+
name: z.string().describe("Routine name (unique per collection+task)"),
|
|
228
|
+
}, async ({ collection, task, name }) => {
|
|
229
|
+
return jsonResult(await client.getRoutine(collection, task, name));
|
|
230
|
+
});
|
|
231
|
+
server.tool("create-routine", "Create a scheduled routine for an existing task. init_params_overrides keys must be a subset of task.workflow.init_params.", {
|
|
232
|
+
collection: z.string().describe("Collection name"),
|
|
233
|
+
task: z.string().describe("Task name"),
|
|
234
|
+
name: z.string().describe("Routine name (slug, unique per task)"),
|
|
235
|
+
cadence: cadenceSchema,
|
|
236
|
+
init_params_overrides: z
|
|
237
|
+
.record(z.unknown())
|
|
238
|
+
.optional()
|
|
239
|
+
.describe("Init param overrides. Keys must be a subset of task.workflow.init_params; unknown keys return 400."),
|
|
240
|
+
secret_params: z
|
|
241
|
+
.record(z.unknown())
|
|
242
|
+
.optional()
|
|
243
|
+
.describe("Secrets injected at fire time (encrypted at rest, never logged)."),
|
|
244
|
+
paused: z
|
|
245
|
+
.boolean()
|
|
246
|
+
.optional()
|
|
247
|
+
.describe("Create the routine in paused state"),
|
|
248
|
+
webhook_url: z
|
|
249
|
+
.string()
|
|
250
|
+
.optional()
|
|
251
|
+
.describe("Optional webhook to notify on each run"),
|
|
252
|
+
webhook_secret: z
|
|
253
|
+
.string()
|
|
254
|
+
.optional()
|
|
255
|
+
.describe("Optional shared secret for webhook signing"),
|
|
256
|
+
}, async ({ collection, task, name, cadence, init_params_overrides, secret_params, paused, webhook_url, webhook_secret, }) => {
|
|
257
|
+
const body = { name, cadence };
|
|
258
|
+
if (init_params_overrides !== undefined)
|
|
259
|
+
body.init_params_overrides = init_params_overrides;
|
|
260
|
+
if (secret_params !== undefined)
|
|
261
|
+
body.secret_params = secret_params;
|
|
262
|
+
if (paused !== undefined)
|
|
263
|
+
body.paused = paused;
|
|
264
|
+
if (webhook_url !== undefined)
|
|
265
|
+
body.webhook_url = webhook_url;
|
|
266
|
+
if (webhook_secret !== undefined)
|
|
267
|
+
body.webhook_secret = webhook_secret;
|
|
268
|
+
return jsonResult(await client.createRoutine(collection, task, body));
|
|
269
|
+
});
|
|
270
|
+
server.tool("update-routine", "Patch a routine — provide any subset of cadence/overrides/secrets/paused/webhook fields", {
|
|
271
|
+
collection: z.string().describe("Collection name"),
|
|
272
|
+
task: z.string().describe("Task name"),
|
|
273
|
+
name: z.string().describe("Routine name"),
|
|
274
|
+
cadence: cadenceSchema.optional(),
|
|
275
|
+
init_params_overrides: z
|
|
276
|
+
.record(z.unknown())
|
|
277
|
+
.optional()
|
|
278
|
+
.describe("Replace init param overrides"),
|
|
279
|
+
secret_params: z
|
|
280
|
+
.record(z.unknown())
|
|
281
|
+
.optional()
|
|
282
|
+
.describe("Replace secret params"),
|
|
283
|
+
paused: z.boolean().optional().describe("Pause/resume the routine"),
|
|
284
|
+
webhook_url: z.string().optional().describe("Update webhook URL"),
|
|
285
|
+
webhook_secret: z
|
|
286
|
+
.string()
|
|
287
|
+
.optional()
|
|
288
|
+
.describe("Update webhook signing secret"),
|
|
289
|
+
}, async ({ collection, task, name, cadence, init_params_overrides, secret_params, paused, webhook_url, webhook_secret, }) => {
|
|
290
|
+
const patch = {};
|
|
291
|
+
if (cadence !== undefined)
|
|
292
|
+
patch.cadence = cadence;
|
|
293
|
+
if (init_params_overrides !== undefined)
|
|
294
|
+
patch.init_params_overrides = init_params_overrides;
|
|
295
|
+
if (secret_params !== undefined)
|
|
296
|
+
patch.secret_params = secret_params;
|
|
297
|
+
if (paused !== undefined)
|
|
298
|
+
patch.paused = paused;
|
|
299
|
+
if (webhook_url !== undefined)
|
|
300
|
+
patch.webhook_url = webhook_url;
|
|
301
|
+
if (webhook_secret !== undefined)
|
|
302
|
+
patch.webhook_secret = webhook_secret;
|
|
303
|
+
return jsonResult(await client.updateRoutine(collection, task, name, patch));
|
|
304
|
+
});
|
|
305
|
+
server.tool("delete-routine", "Delete a routine and unregister its Temporal schedule", {
|
|
306
|
+
collection: z.string().describe("Collection name"),
|
|
307
|
+
task: z.string().describe("Task name"),
|
|
308
|
+
name: z.string().describe("Routine name"),
|
|
309
|
+
}, async ({ collection, task, name }) => {
|
|
310
|
+
return jsonResult(await client.deleteRoutine(collection, task, name));
|
|
311
|
+
});
|
|
312
|
+
server.tool("pause-routine", "Pause a routine (stops future fires until resumed)", {
|
|
313
|
+
collection: z.string().describe("Collection name"),
|
|
314
|
+
task: z.string().describe("Task name"),
|
|
315
|
+
name: z.string().describe("Routine name"),
|
|
316
|
+
}, async ({ collection, task, name }) => {
|
|
317
|
+
return jsonResult(await client.pauseRoutine(collection, task, name));
|
|
318
|
+
});
|
|
319
|
+
server.tool("resume-routine", "Resume a paused routine", {
|
|
320
|
+
collection: z.string().describe("Collection name"),
|
|
321
|
+
task: z.string().describe("Task name"),
|
|
322
|
+
name: z.string().describe("Routine name"),
|
|
323
|
+
}, async ({ collection, task, name }) => {
|
|
324
|
+
return jsonResult(await client.resumeRoutine(collection, task, name));
|
|
325
|
+
});
|
|
326
|
+
server.tool("run-routine-now", "Fire a routine immediately, bypassing the schedule. Returns workflow_id (parity with run-workflow).", {
|
|
327
|
+
collection: z.string().describe("Collection name"),
|
|
328
|
+
task: z.string().describe("Task name"),
|
|
329
|
+
name: z.string().describe("Routine name"),
|
|
330
|
+
}, async ({ collection, task, name }) => {
|
|
331
|
+
return jsonResult(await client.runRoutineNow(collection, task, name));
|
|
332
|
+
});
|
|
333
|
+
server.tool("list-routine-runs", "List recent trajectories triggered by this routine (filtered by triggered_by_routine_id)", {
|
|
334
|
+
collection: z.string().describe("Collection name"),
|
|
335
|
+
task: z.string().describe("Task name"),
|
|
336
|
+
name: z.string().describe("Routine name"),
|
|
337
|
+
limit: z.number().optional().describe("Max results"),
|
|
338
|
+
}, async ({ collection, task, name, limit }) => {
|
|
339
|
+
return jsonResult(await client.listRoutineRuns(collection, task, name, limit));
|
|
340
|
+
});
|
|
113
341
|
}
|
|
114
342
|
//# sourceMappingURL=tools.js.map
|