jetty-mcp-server 1.0.0 → 1.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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 [flows.jetty.io](https://flows.jetty.io) → Settings → API Tokens.
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
- | `JETTY_DOCK_URL` | No | `https://dock.jetty.io` | Dock API base URL |
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
 
@@ -92,6 +91,65 @@ JETTY_API_TOKEN=mlc_your_token npx -y jetty-mcp-server
92
91
  | `add-label` | Label a trajectory (e.g., quality=high) |
93
92
  | `list-step-templates` | List available step templates |
94
93
  | `get-step-template` | Get template details and schema |
94
+ | `check-secrets` | Compare a collection's env vars with what a runbook needs |
95
+ | `set-environment-vars` | Set env vars on a collection |
96
+ | `get-trial-status` / `activate-trial` | Trial keys for a collection |
97
+ | `list-routines` / `get-routine` / `create-routine` / `update-routine` / `delete-routine` / `pause-routine` / `resume-routine` / `run-routine-now` / `list-routine-runs` | Scheduled runs (the API calls a schedule a *routine*) |
98
+
99
+ ## Use as a library
100
+
101
+ Version 1.1.0 splits the package into importable pieces (all ESM):
102
+
103
+ | Import | Runs in | What it gives you |
104
+ |--------|---------|-------------------|
105
+ | `jetty-mcp-server` | Node | `JettyClient` (token from env / `~/.config/jetty/token`), `registerTools`, the catalog, and the WebMCP helpers |
106
+ | `jetty-mcp-server/api-client` | Browser + Node | `JettyApiClient` — the API client with the token, origin and URL builder passed in |
107
+ | `jetty-mcp-server/tool-definitions` | Browser + Node | `JETTY_TOOLS` — every tool as data: name, description, zod input shape, annotations, handler |
108
+ | `jetty-mcp-server/tools` | Node | `registerTools(server, client)` for an `McpServer` |
109
+ | `jetty-mcp-server/webmcp` | Browser + Node | The catalog as WebMCP tools (see below) |
110
+
111
+ `npx jetty-mcp-server` still starts the stdio server; nothing changes for editor setups.
112
+
113
+ ## WebMCP: the same tools in the browser
114
+
115
+ [WebMCP](https://webmachinelearning.github.io/webmcp/) lets a web page hand tools to an
116
+ in-browser agent through `navigator.modelContext`. A site that already knows who the
117
+ visitor is can register the whole Jetty catalog, executed with the visitor's own session:
118
+
119
+ ```ts
120
+ import { JettyApiClient } from "jetty-mcp-server/api-client";
121
+ import { findModelContext, registerJettyWebMcpTools } from "jetty-mcp-server/webmcp";
122
+
123
+ const modelContext = findModelContext(); // document.modelContext, then navigator.modelContext
124
+ if (modelContext) {
125
+ const client = new JettyApiClient({
126
+ token: () => session.getToken(), // called on every request
127
+ buildUrl: (path) => `/api/mise${path.slice("/api/v1".length)}`, // a same-origin proxy
128
+ });
129
+ const controller = new AbortController();
130
+ registerJettyWebMcpTools(modelContext, client, {
131
+ signal: controller.signal, // abort to unregister
132
+ readOnly: false, // or true for list/get tools only
133
+ include: ["list-tasks", "run-workflow"], // optional allow-list
134
+ });
135
+ }
136
+ ```
137
+
138
+ Two tools stay MCP-only and are never exposed over WebMCP, even when `include` names
139
+ them: `get-trial-status` and `activate-trial` (trial keys are an account-level concern
140
+ for the local agent that set the workspace up, not something a page hands to a browser
141
+ agent). `JETTY_WEBMCP_TOOLS` is the eligible subset.
142
+
143
+ Each WebMCP tool carries the MCP tool's name, description, a JSON-Schema `inputSchema`
144
+ derived from the zod shape, MCP-style `annotations` (`readOnlyHint`, `destructiveHint`),
145
+ and an `execute` that validates input, calls the API, and returns the same
146
+ `{ content: [{ type: "text", text }] }` envelope the MCP server returns (with
147
+ `isError: true` on failure instead of throwing). Both API shapes are supported:
148
+ `registerTool(tool, { signal })` and the earlier `provideContext({ tools })`.
149
+
150
+ `flows-api.jetty.io` sends no CORS headers, so a page must call it through a proxy on its
151
+ own origin (hence `buildUrl`) or a backend that adds the bearer token. jetty.io does this
152
+ for signed-in users on its app pages.
95
153
 
96
154
  ## Development
97
155
 
@@ -0,0 +1,71 @@
1
+ /**
2
+ * Jetty API client core. Browser-safe: no Node built-ins, no environment
3
+ * reads. Credentials and the API origin come in through the constructor, so
4
+ * the same class serves the stdio MCP server (see client.ts, which resolves
5
+ * the token from JETTY_API_TOKEN / ~/.config/jetty/token) and WebMCP in a
6
+ * page (see webmcp.ts, where a site passes a session token getter and a
7
+ * same-origin proxy).
8
+ */
9
+ export declare const DEFAULT_API_URL = "https://flows-api.jetty.io";
10
+ /** A bearer token, or a function that yields one per request. */
11
+ export type TokenSource = string | (() => string | undefined | Promise<string | undefined>);
12
+ export interface JettyApiClientOptions {
13
+ /** Bearer token, or a getter called on every request (e.g. a fresh session JWT). */
14
+ token?: TokenSource;
15
+ /** API origin. Defaults to https://flows-api.jetty.io. */
16
+ apiUrl?: string;
17
+ /** fetch implementation. Defaults to globalThis.fetch, resolved per request. */
18
+ fetch?: typeof fetch;
19
+ /**
20
+ * Maps an API path (always `/api/v1/...`) to the URL to request. Defaults
21
+ * to `${apiUrl}${path}`. Override it behind a same-origin proxy, e.g.
22
+ * jetty.io rewrites `/api/mise/:path*` to `${mise}/api/v1/:path*`.
23
+ */
24
+ buildUrl?: (path: string, apiUrl: string) => string;
25
+ /** Error message thrown when no token is available. */
26
+ missingTokenMessage?: string;
27
+ }
28
+ export declare class JettyApiClient {
29
+ protected readonly apiUrl: string;
30
+ private readonly tokenSource;
31
+ private readonly fetchImpl;
32
+ private readonly buildUrlImpl;
33
+ private readonly missingTokenMessage;
34
+ constructor(options?: JettyApiClientOptions);
35
+ protected requireToken(): Promise<string>;
36
+ private request;
37
+ private api;
38
+ listCollections(): Promise<unknown>;
39
+ getCollection(collection: string): Promise<unknown>;
40
+ listTasks(collection: string): Promise<unknown>;
41
+ getTask(collection: string, task: string): Promise<unknown>;
42
+ createTask(collection: string, name: string, workflow: unknown, description?: string): Promise<unknown>;
43
+ updateTask(collection: string, task: string, updates: {
44
+ workflow?: unknown;
45
+ description?: string;
46
+ }): Promise<unknown>;
47
+ deleteTask(collection: string, task: string): Promise<unknown>;
48
+ getTrialStatus(collection: string): Promise<unknown>;
49
+ activateTrial(collection: string): Promise<unknown>;
50
+ getCollectionEnvironment(collection: string): Promise<unknown>;
51
+ runWorkflow(collection: string, task: string, initParams?: Record<string, unknown>): Promise<unknown>;
52
+ runWorkflowSync(collection: string, task: string, initParams?: Record<string, unknown>): Promise<unknown>;
53
+ listTrajectories(collection: string, task: string, limit?: number, page?: number): Promise<unknown>;
54
+ getTrajectory(collection: string, task: string, trajectoryId: string): Promise<unknown>;
55
+ getStats(collection: string, task: string): Promise<unknown>;
56
+ addLabel(collection: string, task: string, trajectoryId: string, key: string, value: string, author: string): Promise<unknown>;
57
+ getWorkflowLogs(workflowId: string): Promise<unknown>;
58
+ listStepTemplates(): Promise<unknown>;
59
+ getStepTemplate(name: string): Promise<unknown>;
60
+ setEnvironmentVars(collection: string, vars: Record<string, string>): Promise<unknown>;
61
+ listRoutines(collection: string, task?: string): Promise<unknown>;
62
+ getRoutine(collection: string, task: string, name: string): Promise<unknown>;
63
+ createRoutine(collection: string, task: string, body: Record<string, unknown>): Promise<unknown>;
64
+ updateRoutine(collection: string, task: string, name: string, patch: Record<string, unknown>): Promise<unknown>;
65
+ deleteRoutine(collection: string, task: string, name: string): Promise<unknown>;
66
+ pauseRoutine(collection: string, task: string, name: string): Promise<unknown>;
67
+ resumeRoutine(collection: string, task: string, name: string): Promise<unknown>;
68
+ runRoutineNow(collection: string, task: string, name: string): Promise<unknown>;
69
+ listRoutineRuns(collection: string, task: string, name: string, limit?: number): Promise<unknown>;
70
+ }
71
+ //# sourceMappingURL=api-client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api-client.d.ts","sourceRoot":"","sources":["../src/api-client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,201 @@
1
+ /**
2
+ * Jetty API client core. Browser-safe: no Node built-ins, no environment
3
+ * reads. Credentials and the API origin come in through the constructor, so
4
+ * the same class serves the stdio MCP server (see client.ts, which resolves
5
+ * the token from JETTY_API_TOKEN / ~/.config/jetty/token) and WebMCP in a
6
+ * page (see webmcp.ts, where a site passes a session token getter and a
7
+ * same-origin proxy).
8
+ */
9
+ export const DEFAULT_API_URL = "https://flows-api.jetty.io";
10
+ /** A dynamic path segment, so reserved characters cannot alter the route. */
11
+ const seg = (value) => encodeURIComponent(String(value));
12
+ const DEFAULT_MISSING_TOKEN = "No Jetty token available. Pass `token` (a string or a getter) to the client.";
13
+ export class JettyApiClient {
14
+ apiUrl;
15
+ tokenSource;
16
+ fetchImpl;
17
+ buildUrlImpl;
18
+ missingTokenMessage;
19
+ constructor(options = {}) {
20
+ this.tokenSource = options.token;
21
+ this.apiUrl = (options.apiUrl || DEFAULT_API_URL).replace(/\/+$/, "");
22
+ this.fetchImpl = options.fetch;
23
+ this.buildUrlImpl = options.buildUrl ?? ((path, apiUrl) => `${apiUrl}${path}`);
24
+ this.missingTokenMessage = options.missingTokenMessage ?? DEFAULT_MISSING_TOKEN;
25
+ }
26
+ async requireToken() {
27
+ const source = this.tokenSource;
28
+ const token = typeof source === "function" ? await source() : source;
29
+ if (!token)
30
+ throw new Error(this.missingTokenMessage);
31
+ return token;
32
+ }
33
+ async request(path, options = {}) {
34
+ const url = this.buildUrlImpl(path, this.apiUrl);
35
+ const headers = {
36
+ Authorization: `Bearer ${await this.requireToken()}`,
37
+ ...(options.headers || {}),
38
+ };
39
+ // Resolved per request so a test (or a page) may swap globalThis.fetch
40
+ // after construction.
41
+ const fetchImpl = this.fetchImpl ?? globalThis.fetch;
42
+ const res = await fetchImpl(url, { ...options, headers });
43
+ if (!res.ok) {
44
+ const body = await res.text();
45
+ throw new Error(`Jetty API error ${res.status}: ${body}`);
46
+ }
47
+ const contentType = res.headers.get("content-type") || "";
48
+ if (contentType.includes("application/json")) {
49
+ return res.json();
50
+ }
51
+ return res.text();
52
+ }
53
+ api(path, options) {
54
+ return this.request(path, options);
55
+ }
56
+ // Collections
57
+ async listCollections() {
58
+ return this.api("/api/v1/collections/");
59
+ }
60
+ async getCollection(collection) {
61
+ return this.api(`/api/v1/collections/${seg(collection)}`);
62
+ }
63
+ // Tasks
64
+ async listTasks(collection) {
65
+ return this.api(`/api/v1/tasks/${seg(collection)}/`);
66
+ }
67
+ async getTask(collection, task) {
68
+ return this.api(`/api/v1/tasks/${seg(collection)}/${seg(task)}`);
69
+ }
70
+ async createTask(collection, name, workflow, description) {
71
+ return this.api(`/api/v1/tasks/${seg(collection)}`, {
72
+ method: "POST",
73
+ headers: { "Content-Type": "application/json" },
74
+ body: JSON.stringify({ name, description: description || "", workflow }),
75
+ });
76
+ }
77
+ async updateTask(collection, task, updates) {
78
+ return this.api(`/api/v1/tasks/${seg(collection)}/${seg(task)}`, {
79
+ method: "PUT",
80
+ headers: { "Content-Type": "application/json" },
81
+ body: JSON.stringify(updates),
82
+ });
83
+ }
84
+ async deleteTask(collection, task) {
85
+ return this.api(`/api/v1/tasks/${seg(collection)}/${seg(task)}`, {
86
+ method: "DELETE",
87
+ });
88
+ }
89
+ // Trial keys
90
+ async getTrialStatus(collection) {
91
+ return this.api(`/api/v1/trial/${seg(collection)}`);
92
+ }
93
+ async activateTrial(collection) {
94
+ return this.api(`/api/v1/trial/${seg(collection)}/activate`, {
95
+ method: "POST",
96
+ });
97
+ }
98
+ // Collection environment
99
+ async getCollectionEnvironment(collection) {
100
+ return this.api(`/api/v1/collections/${seg(collection)}/environment`);
101
+ }
102
+ // Run workflows. Trial keys are injected automatically server-side when
103
+ // the collection is eligible — there is no flag to send.
104
+ async runWorkflow(collection, task, initParams) {
105
+ const formData = new FormData();
106
+ formData.append("init_params", JSON.stringify(initParams || {}));
107
+ return this.api(`/api/v1/run/${seg(collection)}/${seg(task)}`, {
108
+ method: "POST",
109
+ body: formData,
110
+ });
111
+ }
112
+ async runWorkflowSync(collection, task, initParams) {
113
+ const formData = new FormData();
114
+ formData.append("init_params", JSON.stringify(initParams || {}));
115
+ return this.api(`/api/v1/run-sync/${seg(collection)}/${seg(task)}`, {
116
+ method: "POST",
117
+ body: formData,
118
+ });
119
+ }
120
+ // Trajectories
121
+ async listTrajectories(collection, task, limit = 10, page = 1) {
122
+ return this.api(`/api/v1/db/trajectories/${seg(collection)}/${seg(task)}?limit=${seg(limit)}&page=${seg(page)}`);
123
+ }
124
+ async getTrajectory(collection, task, trajectoryId) {
125
+ return this.api(`/api/v1/db/trajectory/${seg(collection)}/${seg(task)}/${seg(trajectoryId)}`);
126
+ }
127
+ // Stats
128
+ async getStats(collection, task) {
129
+ return this.api(`/api/v1/db/stats/${seg(collection)}/${seg(task)}`);
130
+ }
131
+ // Labels
132
+ async addLabel(collection, task, trajectoryId, key, value, author) {
133
+ return this.api(`/api/v1/trajectory/${seg(collection)}/${seg(task)}/${seg(trajectoryId)}/labels`, {
134
+ method: "POST",
135
+ headers: { "Content-Type": "application/json" },
136
+ body: JSON.stringify({ key, value, author }),
137
+ });
138
+ }
139
+ // Workflow logs
140
+ async getWorkflowLogs(workflowId) {
141
+ return this.api(`/api/v1/workflows-logs/${seg(workflowId)}`);
142
+ }
143
+ // Step templates
144
+ async listStepTemplates() {
145
+ return this.request("/api/v1/step-templates");
146
+ }
147
+ async getStepTemplate(name) {
148
+ return this.request(`/api/v1/step-templates/${seg(name)}`);
149
+ }
150
+ // Environment variables
151
+ async setEnvironmentVars(collection, vars) {
152
+ return this.api(`/api/v1/collections/${seg(collection)}/environment`, {
153
+ method: "PATCH",
154
+ headers: { "Content-Type": "application/json" },
155
+ body: JSON.stringify({ environment_variables: vars }),
156
+ });
157
+ }
158
+ // Routines (scheduled runs)
159
+ async listRoutines(collection, task) {
160
+ const path = task
161
+ ? `/api/v1/routines/${seg(collection)}/${seg(task)}`
162
+ : `/api/v1/routines/${seg(collection)}`;
163
+ return this.api(path);
164
+ }
165
+ async getRoutine(collection, task, name) {
166
+ return this.api(`/api/v1/routines/${seg(collection)}/${seg(task)}/${seg(name)}`);
167
+ }
168
+ async createRoutine(collection, task, body) {
169
+ return this.api(`/api/v1/routines/${seg(collection)}/${seg(task)}`, {
170
+ method: "POST",
171
+ headers: { "Content-Type": "application/json" },
172
+ body: JSON.stringify(body),
173
+ });
174
+ }
175
+ async updateRoutine(collection, task, name, patch) {
176
+ return this.api(`/api/v1/routines/${seg(collection)}/${seg(task)}/${seg(name)}`, {
177
+ method: "PATCH",
178
+ headers: { "Content-Type": "application/json" },
179
+ body: JSON.stringify(patch),
180
+ });
181
+ }
182
+ async deleteRoutine(collection, task, name) {
183
+ return this.api(`/api/v1/routines/${seg(collection)}/${seg(task)}/${seg(name)}`, {
184
+ method: "DELETE",
185
+ });
186
+ }
187
+ async pauseRoutine(collection, task, name) {
188
+ return this.api(`/api/v1/routines/${seg(collection)}/${seg(task)}/${seg(name)}/pause`, { method: "POST" });
189
+ }
190
+ async resumeRoutine(collection, task, name) {
191
+ return this.api(`/api/v1/routines/${seg(collection)}/${seg(task)}/${seg(name)}/resume`, { method: "POST" });
192
+ }
193
+ async runRoutineNow(collection, task, name) {
194
+ return this.api(`/api/v1/routines/${seg(collection)}/${seg(task)}/${seg(name)}/run-now`, { method: "POST" });
195
+ }
196
+ async listRoutineRuns(collection, task, name, limit) {
197
+ const qs = typeof limit === "number" ? `?limit=${seg(limit)}` : "";
198
+ return this.api(`/api/v1/routines/${seg(collection)}/${seg(task)}/${seg(name)}/runs${qs}`);
199
+ }
200
+ }
201
+ //# sourceMappingURL=api-client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api-client.js","sourceRoot":"","sources":["../src/api-client.ts"],"names":[],"mappings":"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"}
package/dist/client.d.ts CHANGED
@@ -1,30 +1,14 @@
1
- export declare class JettyClient {
2
- private token;
3
- private dockUrl;
4
- private flowsUrl;
5
- constructor();
6
- private request;
7
- private dock;
8
- private flows;
9
- listCollections(): Promise<unknown>;
10
- getCollection(collection: string): Promise<unknown>;
11
- listTasks(collection: string): Promise<unknown>;
12
- getTask(collection: string, task: string): Promise<unknown>;
13
- createTask(collection: string, name: string, workflow: unknown, description?: string): Promise<unknown>;
14
- updateTask(collection: string, task: string, updates: {
15
- workflow?: unknown;
16
- description?: string;
17
- }): Promise<unknown>;
18
- deleteTask(collection: string, task: string): Promise<unknown>;
19
- runWorkflow(collection: string, task: string, initParams?: Record<string, unknown>): Promise<unknown>;
20
- runWorkflowSync(collection: string, task: string, initParams?: Record<string, unknown>): Promise<unknown>;
21
- listTrajectories(collection: string, task: string, limit?: number, page?: number): Promise<unknown>;
22
- getTrajectory(collection: string, task: string, trajectoryId: string): Promise<unknown>;
23
- getStats(collection: string, task: string): Promise<unknown>;
24
- addLabel(collection: string, task: string, trajectoryId: string, key: string, value: string, author: string): Promise<unknown>;
25
- getWorkflowLogs(workflowId: string): Promise<unknown>;
26
- listStepTemplates(): Promise<unknown>;
27
- getStepTemplate(name: string): Promise<unknown>;
28
- setEnvironmentVars(collection: string, vars: Record<string, string>): Promise<unknown>;
1
+ import { JettyApiClient, type JettyApiClientOptions } from "./api-client.js";
2
+ export { DEFAULT_API_URL, JettyApiClient } from "./api-client.js";
3
+ export type { JettyApiClientOptions, TokenSource } from "./api-client.js";
4
+ /**
5
+ * Resolve the API token: prefer JETTY_API_TOKEN (trimmed, non-empty), then the
6
+ * token file written by `jetty login`. The env var is checked for emptiness
7
+ * because the plugin's .mcp.json may pass it through as "" — which must not
8
+ * count as "set" and must not block the file fallback.
9
+ */
10
+ export declare function resolveToken(): string | undefined;
11
+ export declare class JettyClient extends JettyApiClient {
12
+ constructor(options?: JettyApiClientOptions);
29
13
  }
30
14
  //# sourceMappingURL=client.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAGA,qBAAa,WAAW;IACtB,OAAO,CAAC,KAAK,CAAS;IACtB,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,QAAQ,CAAS;;YAeX,OAAO;IAyBrB,OAAO,CAAC,IAAI;IAIZ,OAAO,CAAC,KAAK;IAKP,eAAe;IAIf,aAAa,CAAC,UAAU,EAAE,MAAM;IAKhC,SAAS,CAAC,UAAU,EAAE,MAAM;IAI5B,OAAO,CAAC,UAAU,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM;IAIxC,UAAU,CACd,UAAU,EAAE,MAAM,EAClB,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,OAAO,EACjB,WAAW,CAAC,EAAE,MAAM;IAShB,UAAU,CACd,UAAU,EAAE,MAAM,EAClB,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE;QAAE,QAAQ,CAAC,EAAE,OAAO,CAAC;QAAC,WAAW,CAAC,EAAE,MAAM,CAAA;KAAE;IASjD,UAAU,CAAC,UAAU,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM;IAO3C,WAAW,CACf,UAAU,EAAE,MAAM,EAClB,IAAI,EAAE,MAAM,EACZ,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IAYhC,eAAe,CACnB,UAAU,EAAE,MAAM,EAClB,IAAI,EAAE,MAAM,EACZ,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IAahC,gBAAgB,CACpB,UAAU,EAAE,MAAM,EAClB,IAAI,EAAE,MAAM,EACZ,KAAK,SAAK,EACV,IAAI,SAAI;IAOJ,aAAa,CACjB,UAAU,EAAE,MAAM,EAClB,IAAI,EAAE,MAAM,EACZ,YAAY,EAAE,MAAM;IAQhB,QAAQ,CAAC,UAAU,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM;IAKzC,QAAQ,CACZ,UAAU,EAAE,MAAM,EAClB,IAAI,EAAE,MAAM,EACZ,YAAY,EAAE,MAAM,EACpB,GAAG,EAAE,MAAM,EACX,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM;IAaV,eAAe,CAAC,UAAU,EAAE,MAAM;IAKlC,iBAAiB;IAIjB,eAAe,CAAC,IAAI,EAAE,MAAM;IAK5B,kBAAkB,CACtB,UAAU,EAAE,MAAM,EAClB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC;CAQ/B"}
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAQA,OAAO,EAEL,cAAc,EACd,KAAK,qBAAqB,EAC3B,MAAM,iBAAiB,CAAC;AAEzB,OAAO,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAClE,YAAY,EAAE,qBAAqB,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAU1E;;;;;GAKG;AACH,wBAAgB,YAAY,IAAI,MAAM,GAAG,SAAS,CAYjD;AAED,qBAAa,WAAY,SAAQ,cAAc;gBACjC,OAAO,GAAE,qBAA0B;CAYhD"}
package/dist/client.js CHANGED
@@ -1,130 +1,50 @@
1
- const DOCK_URL = process.env.JETTY_DOCK_URL || "https://dock.jetty.io";
2
- const FLOWS_URL = process.env.JETTY_FLOWS_URL || "https://flows-api.jetty.io";
3
- export class JettyClient {
4
- token;
5
- dockUrl;
6
- flowsUrl;
7
- constructor() {
8
- const token = process.env.JETTY_API_TOKEN;
9
- if (!token) {
10
- throw new Error("JETTY_API_TOKEN environment variable is required. " +
11
- "Get your token at https://flows.jetty.io Settings API Tokens");
12
- }
13
- this.token = token;
14
- this.dockUrl = DOCK_URL;
15
- this.flowsUrl = FLOWS_URL;
16
- }
17
- async request(baseUrl, path, options = {}) {
18
- const url = `${baseUrl}${path}`;
19
- const headers = {
20
- Authorization: `Bearer ${this.token}`,
21
- ...(options.headers || {}),
22
- };
23
- const res = await fetch(url, { ...options, headers });
24
- if (!res.ok) {
25
- const body = await res.text();
26
- throw new Error(`Jetty API error ${res.status}: ${body}`);
27
- }
28
- const contentType = res.headers.get("content-type") || "";
29
- if (contentType.includes("application/json")) {
30
- return res.json();
31
- }
32
- return res.text();
33
- }
34
- dock(path, options) {
35
- return this.request(this.dockUrl, path, options);
36
- }
37
- flows(path, options) {
38
- return this.request(this.flowsUrl, path, options);
39
- }
40
- // Collections
41
- async listCollections() {
42
- return this.dock("/api/v1/collections/");
43
- }
44
- async getCollection(collection) {
45
- return this.dock(`/api/v1/collections/${collection}`);
46
- }
47
- // Tasks
48
- async listTasks(collection) {
49
- return this.dock(`/api/v1/tasks/${collection}/`);
50
- }
51
- async getTask(collection, task) {
52
- return this.dock(`/api/v1/tasks/${collection}/${task}`);
53
- }
54
- async createTask(collection, name, workflow, description) {
55
- return this.dock(`/api/v1/tasks/${collection}`, {
56
- method: "POST",
57
- headers: { "Content-Type": "application/json" },
58
- body: JSON.stringify({ name, description: description || "", workflow }),
59
- });
60
- }
61
- async updateTask(collection, task, updates) {
62
- return this.dock(`/api/v1/tasks/${collection}/${task}`, {
63
- method: "PUT",
64
- headers: { "Content-Type": "application/json" },
65
- body: JSON.stringify(updates),
66
- });
67
- }
68
- async deleteTask(collection, task) {
69
- return this.dock(`/api/v1/tasks/${collection}/${task}`, {
70
- method: "DELETE",
71
- });
72
- }
73
- // Run workflows
74
- async runWorkflow(collection, task, initParams) {
75
- const formData = new FormData();
76
- formData.append("bakery_host", this.dockUrl);
77
- formData.append("init_params", JSON.stringify(initParams || {}));
78
- return this.flows(`/api/v1/run/${collection}/${task}`, {
79
- method: "POST",
80
- body: formData,
81
- });
82
- }
83
- async runWorkflowSync(collection, task, initParams) {
84
- const formData = new FormData();
85
- formData.append("bakery_host", this.dockUrl);
86
- formData.append("init_params", JSON.stringify(initParams || {}));
87
- return this.flows(`/api/v1/run-sync/${collection}/${task}`, {
88
- method: "POST",
89
- body: formData,
90
- });
91
- }
92
- // Trajectories
93
- async listTrajectories(collection, task, limit = 10, page = 1) {
94
- return this.flows(`/api/v1/db/trajectories/${collection}/${task}?limit=${limit}&page=${page}`);
95
- }
96
- async getTrajectory(collection, task, trajectoryId) {
97
- return this.flows(`/api/v1/db/trajectory/${collection}/${task}/${trajectoryId}`);
98
- }
99
- // Stats
100
- async getStats(collection, task) {
101
- return this.flows(`/api/v1/db/stats/${collection}/${task}`);
102
- }
103
- // Labels
104
- async addLabel(collection, task, trajectoryId, key, value, author) {
105
- return this.flows(`/api/v1/trajectory/${collection}/${task}/${trajectoryId}/labels`, {
106
- method: "POST",
107
- headers: { "Content-Type": "application/json" },
108
- body: JSON.stringify({ key, value, author }),
109
- });
110
- }
111
- // Workflow logs
112
- async getWorkflowLogs(workflowId) {
113
- return this.flows(`/api/v1/workflows-logs/${workflowId}`);
114
- }
115
- // Step templates
116
- async listStepTemplates() {
117
- return this.request(this.flowsUrl, "/api/v1/step-templates");
118
- }
119
- async getStepTemplate(name) {
120
- return this.request(this.flowsUrl, `/api/v1/step-templates/${name}`);
121
- }
122
- // Environment variables
123
- async setEnvironmentVars(collection, vars) {
124
- return this.dock(`/api/v1/collections/${collection}/environment`, {
125
- method: "PATCH",
126
- headers: { "Content-Type": "application/json" },
127
- body: JSON.stringify({ environment_variables: vars }),
1
+ /**
2
+ * Node client for the stdio MCP server: the browser-safe core (api-client.ts)
3
+ * plus token resolution from the environment and the file `jetty login`
4
+ * writes. Not for the browser — it imports node:fs.
5
+ */
6
+ import { readFileSync } from "node:fs";
7
+ import { homedir } from "node:os";
8
+ import { join } from "node:path";
9
+ import { DEFAULT_API_URL, JettyApiClient, } from "./api-client.js";
10
+ export { DEFAULT_API_URL, JettyApiClient } from "./api-client.js";
11
+ // The `jetty` CLI / Claude Code skill writes the collection-scoped `mlc_` key
12
+ // here on `jetty login`. We fall back to it so an already-logged-in user does
13
+ // not also have to plumb JETTY_API_TOKEN into the MCP server's env. Resolved
14
+ // lazily (not memoized at module load) so HOME changes are honoured.
15
+ function tokenFilePath() {
16
+ return join(homedir(), ".config", "jetty", "token");
17
+ }
18
+ /**
19
+ * Resolve the API token: prefer JETTY_API_TOKEN (trimmed, non-empty), then the
20
+ * token file written by `jetty login`. The env var is checked for emptiness
21
+ * because the plugin's .mcp.json may pass it through as "" — which must not
22
+ * count as "set" and must not block the file fallback.
23
+ */
24
+ export function resolveToken() {
25
+ const fromEnv = process.env.JETTY_API_TOKEN?.trim();
26
+ if (fromEnv)
27
+ return fromEnv;
28
+ try {
29
+ const fromFile = readFileSync(tokenFilePath(), "utf8").trim();
30
+ if (fromFile)
31
+ return fromFile;
32
+ }
33
+ catch {
34
+ // file absent / unreadable — fall through to undefined
35
+ }
36
+ return undefined;
37
+ }
38
+ export class JettyClient extends JettyApiClient {
39
+ constructor(options = {}) {
40
+ super({
41
+ ...options,
42
+ token: options.token ?? resolveToken(),
43
+ apiUrl: options.apiUrl ?? (process.env.JETTY_API_URL || DEFAULT_API_URL),
44
+ missingTokenMessage: options.missingTokenMessage ??
45
+ "No Jetty token found. Set JETTY_API_TOKEN, or run `jetty login` " +
46
+ `(writes ${tokenFilePath()}). ` +
47
+ "Get a token at https://jetty.io → Settings → API Tokens",
128
48
  });
129
49
  }
130
50
  }
@@ -1 +1 @@
1
- {"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EACL,eAAe,EACf,cAAc,GAEf,MAAM,iBAAiB,CAAC;AAEzB,OAAO,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAGlE,8EAA8E;AAC9E,8EAA8E;AAC9E,6EAA6E;AAC7E,qEAAqE;AACrE,SAAS,aAAa;IACpB,OAAO,IAAI,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;AACtD,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,YAAY;IAC1B,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,eAAe,EAAE,IAAI,EAAE,CAAC;IACpD,IAAI,OAAO;QAAE,OAAO,OAAO,CAAC;IAE5B,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,YAAY,CAAC,aAAa,EAAE,EAAE,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC;QAC9D,IAAI,QAAQ;YAAE,OAAO,QAAQ,CAAC;IAChC,CAAC;IAAC,MAAM,CAAC;QACP,uDAAuD;IACzD,CAAC;IAED,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,MAAM,OAAO,WAAY,SAAQ,cAAc;IAC7C,YAAY,UAAiC,EAAE;QAC7C,KAAK,CAAC;YACJ,GAAG,OAAO;YACV,KAAK,EAAE,OAAO,CAAC,KAAK,IAAI,YAAY,EAAE;YACtC,MAAM,EAAE,OAAO,CAAC,MAAM,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,aAAa,IAAI,eAAe,CAAC;YACxE,mBAAmB,EACjB,OAAO,CAAC,mBAAmB;gBAC3B,kEAAkE;oBAChE,WAAW,aAAa,EAAE,KAAK;oBAC/B,yDAAyD;SAC9D,CAAC,CAAC;IACL,CAAC;CACF"}