@myna-sh/mcp 0.2.0 → 0.4.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 +4 -0
- package/dist/main.d.ts +89 -1
- package/dist/main.js +178 -53
- package/dist/main.js.map +1 -1
- package/package.json +3 -3
package/README.md
CHANGED
|
@@ -2,12 +2,16 @@
|
|
|
2
2
|
|
|
3
3
|
Model Context Protocol server for managing [Myna](https://myna.sh) content from coding agents and MCP clients.
|
|
4
4
|
|
|
5
|
+
> **Connecting Claude, ChatGPT, or another remote agent?** You do not need this package. Myna hosts the same server at `https://api.myna.sh/mcp` — add it as a custom connector and authorize it with OAuth. See [connecting a remote agent](https://docs.myna.sh/mcp/hosted). This package is for local coding agents that run the server over stdio.
|
|
6
|
+
|
|
5
7
|
## Install
|
|
6
8
|
|
|
7
9
|
```sh
|
|
8
10
|
npm install --global @myna-sh/mcp
|
|
9
11
|
```
|
|
10
12
|
|
|
13
|
+
`@myna-sh/mcp`, `@myna-sh/sdk`, `@myna-sh/cli`, and `@myna-sh/react` are released in lockstep — the same version number always means the same commit. The server reports its version in the MCP handshake; if a tool in the [documentation](https://docs.myna.sh/mcp/tools) is missing from your client's tool list, that install is older than the docs. See [versioning and compatibility](https://docs.myna.sh/platform/compatibility).
|
|
14
|
+
|
|
11
15
|
## Stdio
|
|
12
16
|
|
|
13
17
|
Configure your MCP client to run:
|
package/dist/main.d.ts
CHANGED
|
@@ -1,7 +1,93 @@
|
|
|
1
1
|
import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
2
|
+
import { ManagementClient } from '@myna-sh/sdk/management';
|
|
2
3
|
|
|
4
|
+
interface RegistryOptions {
|
|
5
|
+
/**
|
|
6
|
+
* Skip the on-disk config file. The hosted server builds one registry per
|
|
7
|
+
* request from the caller's OAuth grant; it must never pick up whatever
|
|
8
|
+
* `~/.config/myna/mcp.json` happens to exist on the host.
|
|
9
|
+
*/
|
|
10
|
+
ignoreConfigFile?: boolean;
|
|
11
|
+
/** Replaces the "set MYNA_PROJECT" advice, which is meaningless remotely. */
|
|
12
|
+
noProjectHint?: string;
|
|
13
|
+
}
|
|
14
|
+
declare class ProjectRegistry {
|
|
15
|
+
private readonly env;
|
|
16
|
+
private readonly file;
|
|
17
|
+
private readonly clients;
|
|
18
|
+
private readonly options;
|
|
19
|
+
constructor(env?: NodeJS.ProcessEnv, options?: RegistryOptions);
|
|
20
|
+
/**
|
|
21
|
+
* A registry bound to a single credential, for the hosted (multi-tenant)
|
|
22
|
+
* server. Every request builds its own; nothing is shared between callers.
|
|
23
|
+
*/
|
|
24
|
+
static forCredential(input: {
|
|
25
|
+
apiUrl: string;
|
|
26
|
+
token: string;
|
|
27
|
+
organization?: string;
|
|
28
|
+
}): ProjectRegistry;
|
|
29
|
+
private get defaultApiUrl();
|
|
30
|
+
private get defaultToken();
|
|
31
|
+
/** The named-project key used when a call omits `project`. */
|
|
32
|
+
defaultProjectName(): string | undefined;
|
|
33
|
+
/** All configured named projects (env default included). */
|
|
34
|
+
list(): Array<{
|
|
35
|
+
name: string;
|
|
36
|
+
project: string;
|
|
37
|
+
organization?: string;
|
|
38
|
+
}>;
|
|
39
|
+
/**
|
|
40
|
+
* Resolve credentials without demanding a project.
|
|
41
|
+
*
|
|
42
|
+
* Org-scoped calls — listing projects above all — have no project to name
|
|
43
|
+
* yet. A hosted connector is bound to an organization, not a project, so
|
|
44
|
+
* requiring one here made discovery impossible: the tool an agent must call
|
|
45
|
+
* first was the one that could not run.
|
|
46
|
+
*/
|
|
47
|
+
resolveCredential(ref?: string): {
|
|
48
|
+
project: string | null;
|
|
49
|
+
organization?: string;
|
|
50
|
+
apiUrl: string;
|
|
51
|
+
token: string | undefined;
|
|
52
|
+
};
|
|
53
|
+
/** Resolve a project reference: an explicit id/slug, a named config, or the default. */
|
|
54
|
+
resolve(ref?: string): {
|
|
55
|
+
project: string;
|
|
56
|
+
organization?: string;
|
|
57
|
+
apiUrl: string;
|
|
58
|
+
token: string | undefined;
|
|
59
|
+
};
|
|
60
|
+
private clientFrom;
|
|
61
|
+
/** A management client bound to the resolved project's API + token. */
|
|
62
|
+
clientFor(ref?: string): {
|
|
63
|
+
client: ManagementClient;
|
|
64
|
+
project: string;
|
|
65
|
+
organization?: string;
|
|
66
|
+
};
|
|
67
|
+
/** A management client for an org-scoped call, where no project is required. */
|
|
68
|
+
clientForOrg(ref?: string): {
|
|
69
|
+
client: ManagementClient;
|
|
70
|
+
organization?: string;
|
|
71
|
+
};
|
|
72
|
+
/** Resolve an organization for org-scoped calls. */
|
|
73
|
+
organizationFor(ref?: string, organizationOverride?: string): string;
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
interface ToolOptions {
|
|
77
|
+
/**
|
|
78
|
+
* Whether `myna_upload_asset` may read local filesystem paths. True for
|
|
79
|
+
* stdio (the client and server share a machine); false for HTTP, where a
|
|
80
|
+
* remote client must never be able to read the server's filesystem.
|
|
81
|
+
*/
|
|
82
|
+
allowPathUploads: boolean;
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
declare const SERVER_NAME = "myna";
|
|
86
|
+
declare const SERVER_VERSION: string;
|
|
3
87
|
/** Build a fully-wired Myna MCP server (tools + resources). */
|
|
4
88
|
declare function createServer(): McpServer;
|
|
89
|
+
/** Internal variant used by the stateless HTTP transport. */
|
|
90
|
+
declare function createServerForRegistry(registry: ProjectRegistry, toolOptions?: ToolOptions): McpServer;
|
|
5
91
|
|
|
6
92
|
interface HttpOptions {
|
|
7
93
|
port: number;
|
|
@@ -17,7 +103,9 @@ interface HttpOptions {
|
|
|
17
103
|
*/
|
|
18
104
|
declare function runHttp(options: HttpOptions): Promise<void>;
|
|
19
105
|
|
|
106
|
+
declare const VERSION: string;
|
|
107
|
+
|
|
20
108
|
/** Run over stdio (default) or streamable HTTP (`--http`). */
|
|
21
109
|
declare function main(argv?: string[]): Promise<void>;
|
|
22
110
|
|
|
23
|
-
export { createServer, main, runHttp };
|
|
111
|
+
export { ProjectRegistry, type RegistryOptions, SERVER_NAME, SERVER_VERSION, VERSION, createServer, createServerForRegistry, main, runHttp };
|
package/dist/main.js
CHANGED
|
@@ -9,7 +9,7 @@ import { readFileSync } from "fs";
|
|
|
9
9
|
import { homedir } from "os";
|
|
10
10
|
import { join } from "path";
|
|
11
11
|
|
|
12
|
-
// ../sdk/dist/chunk-
|
|
12
|
+
// ../sdk/dist/chunk-5WMWKWGV.js
|
|
13
13
|
var MynaApiError = class _MynaApiError extends Error {
|
|
14
14
|
/** HTTP status code. */
|
|
15
15
|
status;
|
|
@@ -60,6 +60,15 @@ function problemFromResponse(status, body, fallbackTitle) {
|
|
|
60
60
|
detail
|
|
61
61
|
});
|
|
62
62
|
}
|
|
63
|
+
function inBrowser() {
|
|
64
|
+
return typeof globalThis === "object" && "document" in globalThis;
|
|
65
|
+
}
|
|
66
|
+
function defaultMaxRetries() {
|
|
67
|
+
return inBrowser() ? 1 : 3;
|
|
68
|
+
}
|
|
69
|
+
function defaultMaxNetworkRetries() {
|
|
70
|
+
return inBrowser() ? 0 : 1;
|
|
71
|
+
}
|
|
63
72
|
var RETRYABLE_STATUS = /* @__PURE__ */ new Set([408, 425, 429, 500, 502, 503, 504]);
|
|
64
73
|
var SAFE_METHODS = /* @__PURE__ */ new Set(["GET", "HEAD", "OPTIONS"]);
|
|
65
74
|
function resolveFetch(custom) {
|
|
@@ -67,8 +76,8 @@ function resolveFetch(custom) {
|
|
|
67
76
|
if (typeof globalThis.fetch === "function") return globalThis.fetch.bind(globalThis);
|
|
68
77
|
throw new Error("No fetch implementation available. Pass `fetch` to the Myna client.");
|
|
69
78
|
}
|
|
70
|
-
function buildQuery(
|
|
71
|
-
if (!
|
|
79
|
+
function buildQuery(query) {
|
|
80
|
+
if (!query) return "";
|
|
72
81
|
const params = new URLSearchParams();
|
|
73
82
|
const append = (key, value) => {
|
|
74
83
|
if (value === void 0 || value === null) return;
|
|
@@ -84,7 +93,7 @@ function buildQuery(query2) {
|
|
|
84
93
|
}
|
|
85
94
|
params.set(key, String(value));
|
|
86
95
|
};
|
|
87
|
-
for (const [key, value] of Object.entries(
|
|
96
|
+
for (const [key, value] of Object.entries(query)) append(key, value);
|
|
88
97
|
const qs = params.toString();
|
|
89
98
|
return qs ? `?${qs}` : "";
|
|
90
99
|
}
|
|
@@ -114,10 +123,31 @@ var HttpClient = class {
|
|
|
114
123
|
this.fetchImpl = resolveFetch(options.fetch);
|
|
115
124
|
this.defaultHeaders = options.headers ?? {};
|
|
116
125
|
this.retry = {
|
|
117
|
-
maxRetries: options.retry?.maxRetries ??
|
|
126
|
+
maxRetries: options.retry?.maxRetries ?? defaultMaxRetries(),
|
|
118
127
|
baseDelayMs: options.retry?.baseDelayMs ?? 200,
|
|
119
|
-
maxDelayMs: options.retry?.maxDelayMs ?? 5e3
|
|
128
|
+
maxDelayMs: options.retry?.maxDelayMs ?? 5e3,
|
|
129
|
+
maxNetworkRetries: options.retry?.maxNetworkRetries ?? defaultMaxNetworkRetries()
|
|
130
|
+
};
|
|
131
|
+
}
|
|
132
|
+
/**
|
|
133
|
+
* Share one in-flight request between identical concurrent safe reads.
|
|
134
|
+
*
|
|
135
|
+
* Several components asking for the same collection on first paint is the
|
|
136
|
+
* normal shape of a page, not a mistake, and issuing N identical requests
|
|
137
|
+
* multiplies both latency and any failure. Only GET/HEAD are pooled, and only
|
|
138
|
+
* while in flight — this is request coalescing, not a cache.
|
|
139
|
+
*/
|
|
140
|
+
inFlight = /* @__PURE__ */ new Map();
|
|
141
|
+
dedupe(key, run) {
|
|
142
|
+
const existing = this.inFlight.get(key);
|
|
143
|
+
if (existing) return existing.then((response) => response.clone());
|
|
144
|
+
const started = run();
|
|
145
|
+
this.inFlight.set(key, started);
|
|
146
|
+
const cleanup = () => {
|
|
147
|
+
if (this.inFlight.get(key) === started) this.inFlight.delete(key);
|
|
120
148
|
};
|
|
149
|
+
started.then(cleanup, cleanup);
|
|
150
|
+
return started.then((response) => response.clone());
|
|
121
151
|
}
|
|
122
152
|
/** Perform a request and unwrap the `{ data }` envelope. */
|
|
123
153
|
async request(method, path, options = {}) {
|
|
@@ -151,19 +181,30 @@ var HttpClient = class {
|
|
|
151
181
|
}
|
|
152
182
|
}
|
|
153
183
|
if (options.idempotencyKey) headers["idempotency-key"] = options.idempotencyKey;
|
|
154
|
-
const
|
|
184
|
+
const upper = method.toUpperCase();
|
|
185
|
+
const safe = SAFE_METHODS.has(upper);
|
|
186
|
+
const idempotent = safe || Boolean(options.idempotencyKey);
|
|
155
187
|
const init = { method, headers };
|
|
156
188
|
if (payload !== void 0) init.body = payload;
|
|
157
189
|
if (options.signal) init.signal = options.signal;
|
|
190
|
+
if (safe && !options.signal && (upper === "GET" || upper === "HEAD")) {
|
|
191
|
+
const key = `${upper} ${url} ${token ?? ""}`;
|
|
192
|
+
return this.dedupe(key, () => this.attempt(url, init, idempotent, options));
|
|
193
|
+
}
|
|
194
|
+
return this.attempt(url, init, idempotent, options);
|
|
195
|
+
}
|
|
196
|
+
async attempt(url, init, idempotent, options) {
|
|
158
197
|
let attempt = 0;
|
|
198
|
+
let networkAttempt = 0;
|
|
159
199
|
for (; ; ) {
|
|
160
200
|
let response;
|
|
161
201
|
try {
|
|
162
202
|
response = await this.fetchImpl(url, init);
|
|
163
203
|
} catch (error) {
|
|
164
|
-
if (idempotent && attempt < this.retry.maxRetries && !isAbort(error)) {
|
|
204
|
+
if (idempotent && networkAttempt < this.retry.maxNetworkRetries && attempt < this.retry.maxRetries && !isAbort(error)) {
|
|
165
205
|
await sleep(this.backoff(attempt), options.signal);
|
|
166
206
|
attempt++;
|
|
207
|
+
networkAttempt++;
|
|
167
208
|
continue;
|
|
168
209
|
}
|
|
169
210
|
throw error;
|
|
@@ -198,6 +239,15 @@ function isAbort(error) {
|
|
|
198
239
|
import { createHash, randomUUID } from "crypto";
|
|
199
240
|
import { readFile } from "fs/promises";
|
|
200
241
|
import { basename } from "path";
|
|
242
|
+
var REGISTRY_DOC = [
|
|
243
|
+
"/**",
|
|
244
|
+
" * Collection registry consumed by `createMyna<MynaCollections>()`.",
|
|
245
|
+
" *",
|
|
246
|
+
" * `fields` types the entry payload; `sortable` and `reference` carry the",
|
|
247
|
+
" * distinctions the field types alone cannot express \u2014 a markdown body and a",
|
|
248
|
+
" * text title are both `string`, but only one of them can be ordered on.",
|
|
249
|
+
" */"
|
|
250
|
+
].join("\n");
|
|
201
251
|
var JSON_VALUE = [
|
|
202
252
|
"export type JsonValue = string | number | boolean | null | JsonValue[] | { [key: string]: JsonValue };",
|
|
203
253
|
"",
|
|
@@ -224,19 +274,25 @@ var ManagementClient = class {
|
|
|
224
274
|
idem() {
|
|
225
275
|
return this.newIdempotencyKey();
|
|
226
276
|
}
|
|
227
|
-
get(path,
|
|
228
|
-
return this.http.request("GET", path, { query
|
|
277
|
+
get(path, query, signal) {
|
|
278
|
+
return this.http.request("GET", path, { query, signal });
|
|
229
279
|
}
|
|
230
|
-
|
|
280
|
+
/**
|
|
281
|
+
* Paged GET. Extra filters are merged into the query rather than appended to
|
|
282
|
+
* the path: the client builds its own query string from `options.query`, so a
|
|
283
|
+
* path that already carries one produces `?a=1?limit=25` — a second `?` that
|
|
284
|
+
* silently becomes part of the previous value.
|
|
285
|
+
*/
|
|
286
|
+
async page(path, opts = {}, filters = {}) {
|
|
231
287
|
const body = await this.http.requestEnvelope(
|
|
232
288
|
"GET",
|
|
233
289
|
path,
|
|
234
|
-
{ query: { limit: opts.limit, cursor: opts.cursor }, signal: opts.signal }
|
|
290
|
+
{ query: { ...filters, limit: opts.limit, cursor: opts.cursor }, signal: opts.signal }
|
|
235
291
|
);
|
|
236
292
|
return { data: body.data, nextCursor: body.pagination?.nextCursor ?? null };
|
|
237
293
|
}
|
|
238
|
-
mutate(method, path, body,
|
|
239
|
-
return this.http.request(method, path, { body, query
|
|
294
|
+
mutate(method, path, body, query) {
|
|
295
|
+
return this.http.request(method, path, { body, query, idempotencyKey: this.idem() });
|
|
240
296
|
}
|
|
241
297
|
// --- Organizations --------------------------------------------------------
|
|
242
298
|
organizations = {
|
|
@@ -269,6 +325,12 @@ var ManagementClient = class {
|
|
|
269
325
|
archive: (project) => this.mutate("POST", `/projects/${enc(project)}/archive`),
|
|
270
326
|
/** Full project export: schemas, entries (draft + published), asset metadata. */
|
|
271
327
|
export: (project, signal) => this.get(`/projects/${enc(project)}/export`, void 0, signal),
|
|
328
|
+
/** Why a browser at `origin` can or cannot read this project's content. */
|
|
329
|
+
corsCheck: (project, origin, collection, signal) => this.get(
|
|
330
|
+
`/projects/${enc(project)}/cors-check`,
|
|
331
|
+
collection ? { origin, collection } : { origin },
|
|
332
|
+
signal
|
|
333
|
+
),
|
|
272
334
|
views: (project, signal) => this.get(`/projects/${enc(project)}/views`, void 0, signal),
|
|
273
335
|
createView: (project, body) => this.mutate("POST", `/projects/${enc(project)}/views`, body),
|
|
274
336
|
deleteView: (project, view) => this.mutate("DELETE", `/projects/${enc(project)}/views/${enc(view)}`)
|
|
@@ -294,10 +356,10 @@ var ManagementClient = class {
|
|
|
294
356
|
};
|
|
295
357
|
// --- Entries & revisions --------------------------------------------------
|
|
296
358
|
entries = {
|
|
297
|
-
list: (project, opts = {}) => this.page(
|
|
298
|
-
|
|
299
|
-
opts
|
|
300
|
-
),
|
|
359
|
+
list: (project, opts = {}) => this.page(`/projects/${enc(project)}/entries`, opts, {
|
|
360
|
+
collection: opts.collection,
|
|
361
|
+
status: opts.status
|
|
362
|
+
}),
|
|
301
363
|
create: (project, body) => this.mutate("POST", `/projects/${enc(project)}/entries`, body),
|
|
302
364
|
get: (project, entry, signal) => this.get(`/projects/${enc(project)}/entries/${enc(entry)}`, void 0, signal),
|
|
303
365
|
update: (project, entry, body) => this.mutate("PATCH", `/projects/${enc(project)}/entries/${enc(entry)}`, body),
|
|
@@ -308,6 +370,16 @@ var ManagementClient = class {
|
|
|
308
370
|
changeSetId
|
|
309
371
|
}),
|
|
310
372
|
bulk: (project, body) => this.mutate("POST", `/projects/${enc(project)}/entries/bulk`, body),
|
|
373
|
+
/**
|
|
374
|
+
* Set a collection's editorial order. Not staged on a change set — ranks
|
|
375
|
+
* are arrangement rather than content and take effect immediately, which
|
|
376
|
+
* is why `confirm` is required.
|
|
377
|
+
*/
|
|
378
|
+
reorder: (project, collection, body) => this.mutate(
|
|
379
|
+
"POST",
|
|
380
|
+
`/projects/${enc(project)}/collections/${enc(collection)}/reorder`,
|
|
381
|
+
{ ...body, confirm: true }
|
|
382
|
+
),
|
|
311
383
|
import: (project, body) => this.mutate("POST", `/projects/${enc(project)}/entries/import`, body),
|
|
312
384
|
references: (project, entry, signal) => this.get(`/projects/${enc(project)}/entries/${enc(entry)}/references`, void 0, signal),
|
|
313
385
|
revisions: (project, entry, signal) => this.get(`/projects/${enc(project)}/entries/${enc(entry)}/revisions`, void 0, signal),
|
|
@@ -319,7 +391,7 @@ var ManagementClient = class {
|
|
|
319
391
|
};
|
|
320
392
|
// --- Change sets ----------------------------------------------------------
|
|
321
393
|
changeSets = {
|
|
322
|
-
list: (project, opts = {}) => this.page(`/projects/${enc(project)}/change-sets
|
|
394
|
+
list: (project, opts = {}) => this.page(`/projects/${enc(project)}/change-sets`, opts, { status: opts.status }),
|
|
323
395
|
create: (project, body) => this.mutate("POST", `/projects/${enc(project)}/change-sets`, body),
|
|
324
396
|
get: (project, changeSet, signal) => this.get(`/projects/${enc(project)}/change-sets/${enc(changeSet)}`, void 0, signal),
|
|
325
397
|
update: (project, changeSet, body) => this.mutate("PATCH", `/projects/${enc(project)}/change-sets/${enc(changeSet)}`, body),
|
|
@@ -409,16 +481,13 @@ var ManagementClient = class {
|
|
|
409
481
|
};
|
|
410
482
|
// --- Activity -------------------------------------------------------------
|
|
411
483
|
activity(project, opts = {}) {
|
|
412
|
-
return this.page(
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
}),
|
|
420
|
-
opts
|
|
421
|
-
);
|
|
484
|
+
return this.page(`/projects/${enc(project)}/activity`, opts, {
|
|
485
|
+
actorType: opts.actorType,
|
|
486
|
+
action: opts.action,
|
|
487
|
+
targetType: opts.targetType,
|
|
488
|
+
from: opts.from,
|
|
489
|
+
to: opts.to
|
|
490
|
+
});
|
|
422
491
|
}
|
|
423
492
|
// --- Billing --------------------------------------------------------------
|
|
424
493
|
billing = {
|
|
@@ -480,25 +549,39 @@ function guessContentType(filename) {
|
|
|
480
549
|
function enc(segment) {
|
|
481
550
|
return encodeURIComponent(segment);
|
|
482
551
|
}
|
|
483
|
-
function query(params) {
|
|
484
|
-
const entries = Object.entries(params).filter(([, v]) => v !== void 0 && v !== "");
|
|
485
|
-
if (entries.length === 0) return "";
|
|
486
|
-
return "?" + entries.map(([k, v]) => `${k}=${encodeURIComponent(v)}`).join("&");
|
|
487
|
-
}
|
|
488
552
|
function createManagementClient(options) {
|
|
489
553
|
return new ManagementClient(options);
|
|
490
554
|
}
|
|
491
555
|
|
|
492
556
|
// src/config.ts
|
|
493
557
|
var DEFAULT_API_URL2 = "https://api.myna.sh";
|
|
494
|
-
var ProjectRegistry = class {
|
|
495
|
-
constructor(env = process.env) {
|
|
558
|
+
var ProjectRegistry = class _ProjectRegistry {
|
|
559
|
+
constructor(env = process.env, options = {}) {
|
|
496
560
|
this.env = env;
|
|
497
|
-
this.
|
|
561
|
+
this.options = options;
|
|
562
|
+
this.file = options.ignoreConfigFile ? {} : loadConfigFile(env);
|
|
498
563
|
}
|
|
499
564
|
env;
|
|
500
565
|
file;
|
|
501
566
|
clients = /* @__PURE__ */ new Map();
|
|
567
|
+
options;
|
|
568
|
+
/**
|
|
569
|
+
* A registry bound to a single credential, for the hosted (multi-tenant)
|
|
570
|
+
* server. Every request builds its own; nothing is shared between callers.
|
|
571
|
+
*/
|
|
572
|
+
static forCredential(input) {
|
|
573
|
+
return new _ProjectRegistry(
|
|
574
|
+
{
|
|
575
|
+
MYNA_API_URL: input.apiUrl,
|
|
576
|
+
MYNA_TOKEN: input.token,
|
|
577
|
+
...input.organization ? { MYNA_ORGANIZATION: input.organization } : {}
|
|
578
|
+
},
|
|
579
|
+
{
|
|
580
|
+
ignoreConfigFile: true,
|
|
581
|
+
noProjectHint: "No project specified. Pass `project` (an id or slug); use myna_list_projects to see them."
|
|
582
|
+
}
|
|
583
|
+
);
|
|
584
|
+
}
|
|
502
585
|
get defaultApiUrl() {
|
|
503
586
|
return this.env.MYNA_API_URL ?? this.file.apiUrl ?? DEFAULT_API_URL2;
|
|
504
587
|
}
|
|
@@ -520,8 +603,15 @@ var ProjectRegistry = class {
|
|
|
520
603
|
}
|
|
521
604
|
return out;
|
|
522
605
|
}
|
|
523
|
-
/**
|
|
524
|
-
|
|
606
|
+
/**
|
|
607
|
+
* Resolve credentials without demanding a project.
|
|
608
|
+
*
|
|
609
|
+
* Org-scoped calls — listing projects above all — have no project to name
|
|
610
|
+
* yet. A hosted connector is bound to an organization, not a project, so
|
|
611
|
+
* requiring one here made discovery impossible: the tool an agent must call
|
|
612
|
+
* first was the one that could not run.
|
|
613
|
+
*/
|
|
614
|
+
resolveCredential(ref) {
|
|
525
615
|
if (ref && this.file.projects?.[ref]) {
|
|
526
616
|
const cfg = this.file.projects[ref];
|
|
527
617
|
return {
|
|
@@ -540,30 +630,57 @@ var ProjectRegistry = class {
|
|
|
540
630
|
};
|
|
541
631
|
}
|
|
542
632
|
if (!ref && this.file.default && this.file.projects?.[this.file.default]) {
|
|
543
|
-
return this.
|
|
633
|
+
return this.resolveCredential(this.file.default);
|
|
544
634
|
}
|
|
545
|
-
|
|
546
|
-
|
|
635
|
+
return {
|
|
636
|
+
project: ref ?? null,
|
|
637
|
+
organization: this.env.MYNA_ORGANIZATION,
|
|
638
|
+
apiUrl: this.defaultApiUrl,
|
|
639
|
+
token: this.defaultToken
|
|
640
|
+
};
|
|
641
|
+
}
|
|
642
|
+
/** Resolve a project reference: an explicit id/slug, a named config, or the default. */
|
|
643
|
+
resolve(ref) {
|
|
644
|
+
const resolved = this.resolveCredential(ref);
|
|
645
|
+
if (!resolved.project) {
|
|
646
|
+
throw new Error(
|
|
647
|
+
this.options.noProjectHint ?? "No project specified and no default is configured (set MYNA_PROJECT or configure a default)."
|
|
648
|
+
);
|
|
547
649
|
}
|
|
548
|
-
return {
|
|
650
|
+
return { ...resolved, project: resolved.project };
|
|
549
651
|
}
|
|
550
|
-
|
|
551
|
-
|
|
552
|
-
const resolved = this.resolve(ref);
|
|
553
|
-
if (!resolved.token) {
|
|
652
|
+
clientFrom(apiUrl, token) {
|
|
653
|
+
if (!token) {
|
|
554
654
|
throw new Error("No credential available. Set MYNA_TOKEN or configure a token for the project.");
|
|
555
655
|
}
|
|
556
|
-
const cacheKey = `${
|
|
656
|
+
const cacheKey = `${apiUrl}::${token}`;
|
|
557
657
|
let client = this.clients.get(cacheKey);
|
|
558
658
|
if (!client) {
|
|
559
|
-
client = createManagementClient({ token
|
|
659
|
+
client = createManagementClient({ token, apiUrl });
|
|
560
660
|
this.clients.set(cacheKey, client);
|
|
561
661
|
}
|
|
562
|
-
return
|
|
662
|
+
return client;
|
|
663
|
+
}
|
|
664
|
+
/** A management client bound to the resolved project's API + token. */
|
|
665
|
+
clientFor(ref) {
|
|
666
|
+
const resolved = this.resolve(ref);
|
|
667
|
+
return {
|
|
668
|
+
client: this.clientFrom(resolved.apiUrl, resolved.token),
|
|
669
|
+
project: resolved.project,
|
|
670
|
+
organization: resolved.organization
|
|
671
|
+
};
|
|
672
|
+
}
|
|
673
|
+
/** A management client for an org-scoped call, where no project is required. */
|
|
674
|
+
clientForOrg(ref) {
|
|
675
|
+
const resolved = this.resolveCredential(ref);
|
|
676
|
+
return {
|
|
677
|
+
client: this.clientFrom(resolved.apiUrl, resolved.token),
|
|
678
|
+
organization: resolved.organization
|
|
679
|
+
};
|
|
563
680
|
}
|
|
564
681
|
/** Resolve an organization for org-scoped calls. */
|
|
565
682
|
organizationFor(ref, organizationOverride) {
|
|
566
|
-
const resolved = this.
|
|
683
|
+
const resolved = this.resolveCredential(ref);
|
|
567
684
|
const org = organizationOverride ?? resolved.organization;
|
|
568
685
|
if (!org) throw new Error("No organization specified. Provide `organization` or configure one for the project.");
|
|
569
686
|
return org;
|
|
@@ -624,7 +741,7 @@ function registerTools(server, registry, options = { allowPathUploads: true }) {
|
|
|
624
741
|
},
|
|
625
742
|
async (args) => {
|
|
626
743
|
try {
|
|
627
|
-
const { client } = registry.
|
|
744
|
+
const { client } = registry.clientForOrg(args.project);
|
|
628
745
|
const org = registry.organizationFor(args.project, args.organization);
|
|
629
746
|
const projects = await client.projects.list(org);
|
|
630
747
|
return ok(`${projects.length} project(s) in ${org}.`, { projects });
|
|
@@ -1229,9 +1346,12 @@ function registerResources(server, registry) {
|
|
|
1229
1346
|
);
|
|
1230
1347
|
}
|
|
1231
1348
|
|
|
1349
|
+
// src/version.ts
|
|
1350
|
+
var VERSION = true ? "0.4.0" : "0.0.0-dev";
|
|
1351
|
+
|
|
1232
1352
|
// src/server.ts
|
|
1233
1353
|
var SERVER_NAME = "myna";
|
|
1234
|
-
var SERVER_VERSION =
|
|
1354
|
+
var SERVER_VERSION = VERSION;
|
|
1235
1355
|
function createServer() {
|
|
1236
1356
|
return createServerForRegistry(new ProjectRegistry());
|
|
1237
1357
|
}
|
|
@@ -1338,7 +1458,12 @@ async function main(argv = process.argv.slice(2)) {
|
|
|
1338
1458
|
process.stderr.write("myna-mcp: stdio transport ready\n");
|
|
1339
1459
|
}
|
|
1340
1460
|
export {
|
|
1461
|
+
ProjectRegistry,
|
|
1462
|
+
SERVER_NAME,
|
|
1463
|
+
SERVER_VERSION,
|
|
1464
|
+
VERSION,
|
|
1341
1465
|
createServer,
|
|
1466
|
+
createServerForRegistry,
|
|
1342
1467
|
main,
|
|
1343
1468
|
runHttp
|
|
1344
1469
|
};
|
package/dist/main.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/main.ts","../src/server.ts","../src/config.ts","../../sdk/src/errors.ts","../../sdk/src/http.ts","../../sdk/src/management.ts","../../sdk/src/codegen.ts","../src/tools.ts","../src/resources.ts","../src/http.ts"],"sourcesContent":["import { StdioServerTransport } from \"@modelcontextprotocol/sdk/server/stdio.js\";\nimport { createServer } from \"./server.js\";\nimport { runHttp } from \"./http.js\";\n\n/** Run over stdio (default) or streamable HTTP (`--http`). */\nexport async function main(argv: string[] = process.argv.slice(2)): Promise<void> {\n const useHttp = argv.includes(\"--http\") || process.env.MYNA_MCP_TRANSPORT === \"http\";\n\n if (useHttp) {\n const port = Number(process.env.MYNA_MCP_PORT ?? process.env.PORT ?? 3333);\n const authToken = process.env.MYNA_MCP_TOKEN ?? process.env.MYNA_TOKEN;\n const allowUnauthenticated = [\"1\", \"true\"].includes(\n process.env.MYNA_MCP_ALLOW_UNAUTHENTICATED ?? \"\",\n );\n await runHttp({ port, authToken, allowUnauthenticated });\n return;\n }\n\n const server = createServer();\n const transport = new StdioServerTransport();\n await server.connect(transport);\n // Keep the process alive; the transport closes on stdin end.\n process.stderr.write(\"myna-mcp: stdio transport ready\\n\");\n}\n\nexport { createServer } from \"./server.js\";\nexport { runHttp } from \"./http.js\";\n","import { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { ProjectRegistry } from \"./config.js\";\nimport { registerTools, type ToolOptions } from \"./tools.js\";\nimport { registerResources } from \"./resources.js\";\n\nexport const SERVER_NAME = \"myna\";\nexport const SERVER_VERSION = \"0.2.0\";\n\n/** Build a fully-wired Myna MCP server (tools + resources). */\nexport function createServer(): McpServer {\n return createServerForRegistry(new ProjectRegistry());\n}\n\n/** Internal variant used by the stateless HTTP transport. */\nexport function createServerForRegistry(\n registry: ProjectRegistry,\n toolOptions?: ToolOptions,\n): McpServer {\n const server = new McpServer(\n { name: SERVER_NAME, version: SERVER_VERSION },\n {\n capabilities: { tools: {}, resources: {} },\n instructions:\n \"Myna MCP server: manage content, schemas, assets, change sets, and previews. \" +\n \"The primary flow is: create a change set, apply entry/asset operations, validate, \" +\n \"then create one preview URL. Publishing is a separate, confirmation-gated action.\",\n },\n );\n registerTools(server, registry, toolOptions);\n registerResources(server, registry);\n return server;\n}\n","import { readFileSync } from \"node:fs\";\nimport { homedir } from \"node:os\";\nimport { join } from \"node:path\";\nimport { createManagementClient, type ManagementClient } from \"@myna-sh/sdk/management\";\n\n/**\n * Named project configurations (SPEC 13). A default project plus per-call\n * overrides. Configuration comes from the environment and an optional JSON file\n * (`MYNA_MCP_CONFIG` or `~/.config/myna/mcp.json`).\n */\n\nexport interface NamedProject {\n project: string;\n organization?: string;\n apiUrl?: string;\n token?: string;\n}\n\nexport interface McpConfigFile {\n default?: string;\n apiUrl?: string;\n token?: string;\n projects?: Record<string, NamedProject>;\n}\n\nconst DEFAULT_API_URL = \"https://api.myna.sh\";\n\nexport class ProjectRegistry {\n private readonly file: McpConfigFile;\n private readonly clients = new Map<string, ManagementClient>();\n\n constructor(private readonly env: NodeJS.ProcessEnv = process.env) {\n this.file = loadConfigFile(env);\n }\n\n private get defaultApiUrl(): string {\n return this.env.MYNA_API_URL ?? this.file.apiUrl ?? DEFAULT_API_URL;\n }\n\n private get defaultToken(): string | undefined {\n return this.env.MYNA_TOKEN ?? this.file.token;\n }\n\n /** The named-project key used when a call omits `project`. */\n defaultProjectName(): string | undefined {\n return this.file.default ?? (this.env.MYNA_PROJECT ? \"__env\" : undefined);\n }\n\n /** All configured named projects (env default included). */\n list(): Array<{ name: string; project: string; organization?: string }> {\n const out: Array<{ name: string; project: string; organization?: string }> = [];\n if (this.env.MYNA_PROJECT) {\n out.push({ name: \"__env\", project: this.env.MYNA_PROJECT, organization: this.env.MYNA_ORGANIZATION });\n }\n for (const [name, cfg] of Object.entries(this.file.projects ?? {})) {\n out.push({ name, project: cfg.project, organization: cfg.organization });\n }\n return out;\n }\n\n /** Resolve a project reference: an explicit id/slug, a named config, or the default. */\n resolve(ref?: string): { project: string; organization?: string; apiUrl: string; token: string | undefined } {\n // A named configuration.\n if (ref && this.file.projects?.[ref]) {\n const cfg = this.file.projects[ref]!;\n return {\n project: cfg.project,\n organization: cfg.organization,\n apiUrl: cfg.apiUrl ?? this.defaultApiUrl,\n token: cfg.token ?? this.defaultToken,\n };\n }\n // The env default named project.\n if ((!ref || ref === \"__env\") && this.env.MYNA_PROJECT) {\n return {\n project: ref && ref !== \"__env\" ? ref : this.env.MYNA_PROJECT,\n organization: this.env.MYNA_ORGANIZATION,\n apiUrl: this.defaultApiUrl,\n token: this.defaultToken,\n };\n }\n // A raw project id/slug, or a default named config.\n if (!ref && this.file.default && this.file.projects?.[this.file.default]) {\n return this.resolve(this.file.default);\n }\n if (!ref) {\n throw new Error(\"No project specified and no default is configured (set MYNA_PROJECT or configure a default).\");\n }\n return { project: ref, organization: this.env.MYNA_ORGANIZATION, apiUrl: this.defaultApiUrl, token: this.defaultToken };\n }\n\n /** A management client bound to the resolved project's API + token. */\n clientFor(ref?: string): { client: ManagementClient; project: string; organization?: string } {\n const resolved = this.resolve(ref);\n if (!resolved.token) {\n throw new Error(\"No credential available. Set MYNA_TOKEN or configure a token for the project.\");\n }\n const cacheKey = `${resolved.apiUrl}::${resolved.token}`;\n let client = this.clients.get(cacheKey);\n if (!client) {\n client = createManagementClient({ token: resolved.token, apiUrl: resolved.apiUrl });\n this.clients.set(cacheKey, client);\n }\n return { client, project: resolved.project, organization: resolved.organization };\n }\n\n /** Resolve an organization for org-scoped calls. */\n organizationFor(ref?: string, organizationOverride?: string): string {\n const resolved = this.resolve(ref);\n const org = organizationOverride ?? resolved.organization;\n if (!org) throw new Error(\"No organization specified. Provide `organization` or configure one for the project.\");\n return org;\n }\n}\n\nfunction loadConfigFile(env: NodeJS.ProcessEnv): McpConfigFile {\n const explicit = env.MYNA_MCP_CONFIG;\n const candidates = [explicit, join(env.XDG_CONFIG_HOME ?? join(homedir(), \".config\"), \"myna\", \"mcp.json\")].filter(\n (v): v is string => Boolean(v),\n );\n for (const path of candidates) {\n try {\n return JSON.parse(readFileSync(path, \"utf8\")) as McpConfigFile;\n } catch {\n // Try next candidate.\n }\n }\n return {};\n}\n","import type { FieldErrorContract, ProblemDetailsContract } from \"../../api-contracts/src/common.js\";\n\n/**\n * Error thrown by both SDK clients when the API returns a non-2xx response.\n * Carries the parsed RFC 9457 problem-details document so callers can branch on\n * the stable `code`, inspect field-level `fields`, and surface the `requestId`.\n */\nexport class MynaApiError extends Error {\n /** HTTP status code. */\n readonly status: number;\n /** Stable machine-readable error code (e.g. `VALIDATION_FAILED`). */\n readonly code: string;\n /** RFC 9457 `type` URI. */\n readonly type: string | undefined;\n /** Human-facing title. */\n readonly title: string;\n /** Longer human-facing detail, when provided. */\n readonly detail: string | undefined;\n /** Server request id for support/correlation. */\n readonly requestId: string | undefined;\n /** Field-level validation errors, when present. */\n readonly fields: FieldErrorContract[] | undefined;\n /** The full parsed problem document (or a synthesized one). */\n readonly problem: ProblemDetailsContract;\n\n constructor(problem: ProblemDetailsContract) {\n super(problem.detail ?? problem.title ?? `Request failed (${problem.status})`);\n this.name = \"MynaApiError\";\n this.status = problem.status;\n this.code = problem.code;\n this.type = problem.type;\n this.title = problem.title;\n this.detail = problem.detail;\n this.requestId = problem.requestId;\n this.fields = problem.fields;\n this.problem = problem;\n Object.setPrototypeOf(this, MynaApiError.prototype);\n }\n\n static is(value: unknown): value is MynaApiError {\n return value instanceof MynaApiError;\n }\n}\n\n/** Type guard for `MynaApiError`. */\nexport function isMynaApiError(value: unknown): value is MynaApiError {\n return value instanceof MynaApiError;\n}\n\n/** Build a `MynaApiError` from an arbitrary response body and status. */\nexport function problemFromResponse(status: number, body: unknown, fallbackTitle: string): MynaApiError {\n if (body && typeof body === \"object\" && \"code\" in body && \"status\" in body) {\n return new MynaApiError(body as ProblemDetailsContract);\n }\n const detail =\n body && typeof body === \"object\" && \"error\" in body && typeof (body as { error: unknown }).error === \"string\"\n ? (body as { error: string }).error\n : typeof body === \"string\" && body\n ? body\n : undefined;\n return new MynaApiError({\n type: \"about:blank\",\n title: fallbackTitle,\n status,\n code: status >= 500 ? \"INTERNAL\" : \"REQUEST_FAILED\",\n detail,\n } as ProblemDetailsContract);\n}\n","import { problemFromResponse } from \"./errors.js\";\n\n/** A fetch-compatible function. */\nexport type FetchLike = (input: string, init?: RequestInit) => Promise<Response>;\n\nexport interface RetryOptions {\n /** Maximum number of retries (in addition to the first attempt). Default 3. */\n maxRetries?: number;\n /** Base backoff in milliseconds (exponential). Default 200. */\n baseDelayMs?: number;\n /** Cap on any single backoff. Default 5000. */\n maxDelayMs?: number;\n}\n\nexport interface HttpClientOptions {\n /** Base URL including the version prefix, e.g. `https://api.myna.sh/v1`. */\n baseUrl: string;\n /** Bearer credential (API key, preview token, or CLI token). */\n token?: string | undefined;\n /** Custom fetch implementation (browser/undici/node). */\n fetch?: FetchLike | undefined;\n /** Extra default headers merged into every request. */\n headers?: Record<string, string> | undefined;\n /** Retry policy. Retries apply to safe reads and idempotent mutations only. */\n retry?: RetryOptions | undefined;\n}\n\nexport interface RequestOptions {\n query?: Record<string, unknown> | undefined;\n body?: unknown;\n headers?: Record<string, string> | undefined;\n signal?: AbortSignal | undefined;\n /** Sending an idempotency key makes a mutation eligible for automatic retry. */\n idempotencyKey?: string | undefined;\n /** Override the bearer token for a single request (e.g. a preview token). */\n token?: string | undefined;\n}\n\nconst RETRYABLE_STATUS = new Set([408, 425, 429, 500, 502, 503, 504]);\nconst SAFE_METHODS = new Set([\"GET\", \"HEAD\", \"OPTIONS\"]);\n\nfunction resolveFetch(custom?: FetchLike): FetchLike {\n if (custom) return custom;\n if (typeof globalThis.fetch === \"function\") return globalThis.fetch.bind(globalThis) as FetchLike;\n throw new Error(\"No fetch implementation available. Pass `fetch` to the Myna client.\");\n}\n\n/** Serialize a query object, supporting nested `filter[field][op]` shapes. */\nexport function buildQuery(query: Record<string, unknown> | undefined): string {\n if (!query) return \"\";\n const params = new URLSearchParams();\n const append = (key: string, value: unknown): void => {\n if (value === undefined || value === null) return;\n if (Array.isArray(value)) {\n params.set(key, value.join(\",\"));\n return;\n }\n if (typeof value === \"object\") {\n for (const [op, v] of Object.entries(value as Record<string, unknown>)) {\n append(`${key}[${op}]`, v);\n }\n return;\n }\n params.set(key, String(value));\n };\n for (const [key, value] of Object.entries(query)) append(key, value);\n const qs = params.toString();\n return qs ? `?${qs}` : \"\";\n}\n\nfunction sleep(ms: number, signal?: AbortSignal): Promise<void> {\n return new Promise((resolve, reject) => {\n if (signal?.aborted) return reject(signal.reason ?? new Error(\"Aborted\"));\n const timer = setTimeout(resolve, ms);\n signal?.addEventListener(\n \"abort\",\n () => {\n clearTimeout(timer);\n reject(signal.reason ?? new Error(\"Aborted\"));\n },\n { once: true },\n );\n });\n}\n\nexport class HttpClient {\n private readonly baseUrl: string;\n private readonly token: string | undefined;\n private readonly fetchImpl: FetchLike;\n private readonly defaultHeaders: Record<string, string>;\n private readonly retry: Required<RetryOptions>;\n\n constructor(options: HttpClientOptions) {\n this.baseUrl = options.baseUrl.replace(/\\/+$/, \"\");\n this.token = options.token;\n this.fetchImpl = resolveFetch(options.fetch);\n this.defaultHeaders = options.headers ?? {};\n this.retry = {\n maxRetries: options.retry?.maxRetries ?? 3,\n baseDelayMs: options.retry?.baseDelayMs ?? 200,\n maxDelayMs: options.retry?.maxDelayMs ?? 5000,\n };\n }\n\n /** Perform a request and unwrap the `{ data }` envelope. */\n async request<T>(method: string, path: string, options: RequestOptions = {}): Promise<T> {\n const raw = await this.requestRaw(method, path, options);\n if (raw.status === 204 || raw.status === 304) return undefined as T;\n const parsed = (await raw.json().catch(() => undefined)) as { data?: T } | undefined;\n return (parsed && \"data\" in parsed ? parsed.data : (parsed as unknown)) as T;\n }\n\n /** Perform a request and return the full parsed body (envelope included). */\n async requestEnvelope<T>(method: string, path: string, options: RequestOptions = {}): Promise<T> {\n const raw = await this.requestRaw(method, path, options);\n return (await raw.json().catch(() => ({}))) as T;\n }\n\n /** Low-level request with retries; throws `MynaApiError` on non-2xx. */\n async requestRaw(method: string, path: string, options: RequestOptions = {}): Promise<Response> {\n const url = `${this.baseUrl}${path}${buildQuery(options.query)}`;\n const headers: Record<string, string> = {\n accept: \"application/json\",\n ...this.defaultHeaders,\n ...options.headers,\n };\n const token = options.token ?? this.token;\n if (token) headers.authorization = `Bearer ${token}`;\n\n let payload: BodyInit | undefined;\n if (options.body !== undefined) {\n if (options.body instanceof Uint8Array || typeof options.body === \"string\") {\n payload = options.body as BodyInit;\n } else {\n headers[\"content-type\"] = \"application/json\";\n payload = JSON.stringify(options.body);\n }\n }\n if (options.idempotencyKey) headers[\"idempotency-key\"] = options.idempotencyKey;\n\n const idempotent = SAFE_METHODS.has(method.toUpperCase()) || Boolean(options.idempotencyKey);\n const init: RequestInit = { method, headers };\n if (payload !== undefined) init.body = payload;\n if (options.signal) init.signal = options.signal;\n\n let attempt = 0;\n for (;;) {\n let response: Response;\n try {\n response = await this.fetchImpl(url, init);\n } catch (error) {\n if (idempotent && attempt < this.retry.maxRetries && !isAbort(error)) {\n await sleep(this.backoff(attempt), options.signal);\n attempt++;\n continue;\n }\n throw error;\n }\n\n if (response.ok) return response;\n\n if (idempotent && RETRYABLE_STATUS.has(response.status) && attempt < this.retry.maxRetries) {\n const retryAfter = retryAfterMs(response);\n await sleep(retryAfter ?? this.backoff(attempt), options.signal);\n attempt++;\n continue;\n }\n\n const body = await response.json().catch(() => undefined);\n throw problemFromResponse(response.status, body, response.statusText || \"Request failed\");\n }\n }\n\n private backoff(attempt: number): number {\n const base = Math.min(this.retry.baseDelayMs * 2 ** attempt, this.retry.maxDelayMs);\n return Math.round(base * (0.5 + Math.random() * 0.5));\n }\n}\n\nfunction retryAfterMs(response: Response): number | undefined {\n const header = response.headers.get(\"retry-after\");\n if (!header) return undefined;\n const seconds = Number(header);\n return Number.isFinite(seconds) ? seconds * 1000 : undefined;\n}\n\nfunction isAbort(error: unknown): boolean {\n return (\n error instanceof Error &&\n (error.name === \"AbortError\" || error.name === \"TimeoutError\")\n );\n}\n","import { createHash, randomUUID } from \"node:crypto\";\nimport { readFile } from \"node:fs/promises\";\nimport { basename } from \"node:path\";\nimport type {\n AcceptInvitationResponse,\n ApiKeyContract,\n CreateApiKeyRequest,\n CreateApiKeyResponse,\n CreateInvitationRequest,\n CreateOrganizationRequest,\n InvitationContract,\n MemberContract,\n OrganizationContract,\n UpdateMemberRequest,\n UpdateOrganizationRequest,\n} from \"../../api-contracts/src/organizations.js\";\nimport type { ActivityEventContract } from \"../../api-contracts/src/activity.js\";\nimport type {\n AssetContract,\n CompleteUploadResponse,\n CreateUploadRequest,\n CreateUploadResponse,\n ReplaceAssetRequest,\n UpdateAssetRequest,\n} from \"../../api-contracts/src/assets.js\";\nimport type {\n BillingResponse,\n CheckoutRequest,\n CheckoutResponse,\n PortalResponse,\n} from \"../../api-contracts/src/billing.js\";\nimport type {\n ChangeSetCheckContract,\n ChangeSetCommentContract,\n ChangeSetContract,\n ChangeSetReviewContract,\n CreateChangeSetCommentRequest,\n CreateChangeSetRequest,\n RequestReviewRequest,\n ReviewDecisionRequest,\n RunChecksResponse,\n UpdateChangeSetRequest,\n} from \"../../api-contracts/src/change-sets.js\";\nimport type {\n CollectionContract,\n CollectionVersionContract,\n SchemaDiffResponse,\n SchemaDriftResponse,\n SchemaPushResponse,\n} from \"../../api-contracts/src/collections.js\";\nimport type {\n BulkEntriesRequest,\n BulkEntriesResponse,\n EntryContract,\n EntryReferencesResponse,\n ImportEntriesRequest,\n ImportEntriesResponse,\n RestoreRevisionResponse,\n RevisionContract,\n} from \"../../api-contracts/src/entries.js\";\nimport type { CreatePreviewRequest, PreviewContract } from \"../../api-contracts/src/previews.js\";\nimport type {\n CreateProjectRequest,\n CreateSavedViewRequest,\n ProjectContract,\n ProjectExportResponse,\n SavedViewContract,\n UpdateProjectRequest,\n} from \"../../api-contracts/src/projects.js\";\nimport type { UsageResponse } from \"../../api-contracts/src/usage.js\";\nimport type {\n CreateWebhookRequest,\n CreateWebhookResponse,\n UpdateWebhookRequest,\n WebhookDeliveryContract,\n WebhookEndpointContract,\n} from \"../../api-contracts/src/webhooks.js\";\nimport { HttpClient, type FetchLike, type RetryOptions } from \"./http.js\";\n\nconst DEFAULT_API_URL = \"https://api.myna.sh\";\n\nexport interface ManagementClientOptions {\n /** Management/CLI credential (`myna_sk_...`). */\n token: string;\n /** API origin. Defaults to `https://api.myna.sh`. */\n apiUrl?: string;\n fetch?: FetchLike;\n retry?: RetryOptions;\n /**\n * Idempotency-key factory for mutations. Defaults to a random UUID per call.\n * Pass a stable value to make a specific mutation replay-safe.\n */\n idempotencyKey?: () => string;\n}\n\nexport interface ListOptions {\n limit?: number;\n cursor?: string;\n signal?: AbortSignal;\n}\n\nexport interface Page<T> {\n data: T[];\n nextCursor: string | null;\n}\n\nexport interface UploadAssetMeta {\n filename?: string;\n contentType?: string;\n /** Override the automatically detected byte length. */\n byteSize?: number;\n}\n\n/** Bytes or a filesystem path accepted by `uploadAsset`. */\nexport type AssetInput = string | Uint8Array | ArrayBuffer;\n\n/**\n * Server-only management client (SPEC 12). Typed wrappers over the full\n * management API surface. Mutations automatically carry an `Idempotency-Key`.\n */\nexport class ManagementClient {\n private readonly http: HttpClient;\n private readonly newIdempotencyKey: () => string;\n private readonly fetchImpl: FetchLike;\n\n constructor(options: ManagementClientOptions) {\n if (!options.token) throw new Error(\"createManagementClient: `token` is required.\");\n this.newIdempotencyKey = options.idempotencyKey ?? (() => randomUUID());\n this.fetchImpl = options.fetch ?? ((input, init) => fetch(input, init));\n this.http = new HttpClient({\n baseUrl: `${(options.apiUrl ?? DEFAULT_API_URL).replace(/\\/+$/, \"\")}/v1`,\n token: options.token,\n fetch: options.fetch,\n retry: options.retry,\n });\n }\n\n // Convenience: idempotency key for a mutation.\n private idem(): string {\n return this.newIdempotencyKey();\n }\n\n private get<T>(path: string, query?: Record<string, unknown>, signal?: AbortSignal): Promise<T> {\n return this.http.request<T>(\"GET\", path, { query, signal });\n }\n\n private async page<T>(path: string, opts: ListOptions = {}): Promise<Page<T>> {\n const body = await this.http.requestEnvelope<{ data: T[]; pagination: { nextCursor: string | null } }>(\n \"GET\",\n path,\n { query: { limit: opts.limit, cursor: opts.cursor }, signal: opts.signal },\n );\n return { data: body.data, nextCursor: body.pagination?.nextCursor ?? null };\n }\n\n private mutate<T>(method: string, path: string, body?: unknown, query?: Record<string, unknown>): Promise<T> {\n return this.http.request<T>(method, path, { body, query, idempotencyKey: this.idem() });\n }\n\n // --- Organizations --------------------------------------------------------\n readonly organizations = {\n list: (signal?: AbortSignal): Promise<OrganizationContract[]> =>\n this.get<OrganizationContract[]>(\"/organizations\", undefined, signal),\n create: (body: CreateOrganizationRequest): Promise<OrganizationContract> =>\n this.mutate<OrganizationContract>(\"POST\", \"/organizations\", body),\n get: (organization: string, signal?: AbortSignal): Promise<OrganizationContract> =>\n this.get<OrganizationContract>(`/organizations/${enc(organization)}`, undefined, signal),\n update: (organization: string, body: UpdateOrganizationRequest): Promise<OrganizationContract> =>\n this.mutate<OrganizationContract>(\"PATCH\", `/organizations/${enc(organization)}`, body),\n delete: (organization: string): Promise<{ ok: boolean; recoverableForDays: number }> =>\n this.mutate(\"DELETE\", `/organizations/${enc(organization)}`),\n export: (organization: string): Promise<{ jobId: string; storageKey: string; downloadUrl: string; ready: boolean }> =>\n this.mutate(\"POST\", `/organizations/${enc(organization)}/export`),\n usage: (organization: string, signal?: AbortSignal): Promise<UsageResponse> =>\n this.get<UsageResponse>(`/organizations/${enc(organization)}/usage`, undefined, signal),\n };\n\n // --- Members & invitations ------------------------------------------------\n readonly members = {\n list: (organization: string, signal?: AbortSignal): Promise<MemberContract[]> =>\n this.get<MemberContract[]>(`/organizations/${enc(organization)}/members`, undefined, signal),\n update: (organization: string, user: string, body: UpdateMemberRequest): Promise<{ ok: boolean }> =>\n this.mutate(\"PATCH\", `/organizations/${enc(organization)}/members/${enc(user)}`, body),\n remove: (organization: string, user: string): Promise<{ ok: boolean }> =>\n this.mutate(\"DELETE\", `/organizations/${enc(organization)}/members/${enc(user)}`),\n };\n\n readonly invitations = {\n list: (organization: string, signal?: AbortSignal): Promise<InvitationContract[]> =>\n this.get<InvitationContract[]>(`/organizations/${enc(organization)}/invitations`, undefined, signal),\n create: (organization: string, body: CreateInvitationRequest): Promise<InvitationContract> =>\n this.mutate<InvitationContract>(\"POST\", `/organizations/${enc(organization)}/invitations`, body),\n revoke: (organization: string, invitation: string): Promise<{ ok: boolean }> =>\n this.mutate(\"DELETE\", `/organizations/${enc(organization)}/invitations/${enc(invitation)}`),\n accept: (token: string): Promise<AcceptInvitationResponse> =>\n this.mutate<AcceptInvitationResponse>(\"POST\", `/invitations/${enc(token)}/accept`),\n };\n\n // --- Projects -------------------------------------------------------------\n readonly projects = {\n list: (organization: string, signal?: AbortSignal): Promise<ProjectContract[]> =>\n this.get<ProjectContract[]>(`/organizations/${enc(organization)}/projects`, undefined, signal),\n create: (organization: string, body: CreateProjectRequest): Promise<ProjectContract> =>\n this.mutate<ProjectContract>(\"POST\", `/organizations/${enc(organization)}/projects`, body),\n get: (project: string, signal?: AbortSignal): Promise<ProjectContract> =>\n this.get<ProjectContract>(`/projects/${enc(project)}`, undefined, signal),\n update: (project: string, body: UpdateProjectRequest): Promise<ProjectContract> =>\n this.mutate<ProjectContract>(\"PATCH\", `/projects/${enc(project)}`, body),\n archive: (project: string): Promise<ProjectContract> =>\n this.mutate<ProjectContract>(\"POST\", `/projects/${enc(project)}/archive`),\n /** Full project export: schemas, entries (draft + published), asset metadata. */\n export: (project: string, signal?: AbortSignal): Promise<ProjectExportResponse> =>\n this.get<ProjectExportResponse>(`/projects/${enc(project)}/export`, undefined, signal),\n views: (project: string, signal?: AbortSignal): Promise<SavedViewContract[]> =>\n this.get<SavedViewContract[]>(`/projects/${enc(project)}/views`, undefined, signal),\n createView: (project: string, body: CreateSavedViewRequest): Promise<SavedViewContract> =>\n this.mutate<SavedViewContract>(\"POST\", `/projects/${enc(project)}/views`, body),\n deleteView: (project: string, view: string): Promise<{ ok: boolean }> =>\n this.mutate(\"DELETE\", `/projects/${enc(project)}/views/${enc(view)}`),\n };\n\n // --- Schema ---------------------------------------------------------------\n readonly schema = {\n collections: (project: string, signal?: AbortSignal): Promise<CollectionContract[]> =>\n this.get<CollectionContract[]>(`/projects/${enc(project)}/collections`, undefined, signal),\n collection: (project: string, key: string, signal?: AbortSignal): Promise<CollectionContract> =>\n this.get<CollectionContract>(`/projects/${enc(project)}/collections/${enc(key)}`, undefined, signal),\n versions: (project: string, key: string, signal?: AbortSignal): Promise<CollectionVersionContract[]> =>\n this.get<CollectionVersionContract[]>(`/projects/${enc(project)}/collections/${enc(key)}/versions`, undefined, signal),\n diff: (project: string, collections: Record<string, unknown>[]): Promise<SchemaDiffResponse> =>\n this.mutate<SchemaDiffResponse>(\"POST\", `/projects/${enc(project)}/schema/diff`, { collections }),\n push: (\n project: string,\n collections: Record<string, unknown>[],\n opts: { allowDestructive?: boolean; changeSummary?: string } = {},\n ): Promise<SchemaPushResponse> =>\n this.mutate<SchemaPushResponse>(\"POST\", `/projects/${enc(project)}/schema/push`, {\n collections,\n allowDestructive: opts.allowDestructive ?? false,\n changeSummary: opts.changeSummary,\n }),\n // Environments as projects\n drift: (project: string, against: string, signal?: AbortSignal): Promise<SchemaDriftResponse> =>\n this.get<SchemaDriftResponse>(`/projects/${enc(project)}/schema/drift`, { against }, signal),\n promote: (\n project: string,\n fromProject: string,\n opts: { allowDestructive?: boolean } = {},\n ): Promise<SchemaPushResponse> =>\n this.mutate<SchemaPushResponse>(\"POST\", `/projects/${enc(project)}/schema/promote`, {\n fromProject,\n allowDestructive: opts.allowDestructive ?? false,\n confirm: true,\n }),\n };\n\n // --- Entries & revisions --------------------------------------------------\n readonly entries = {\n list: (\n project: string,\n opts: ListOptions & { collection?: string; status?: string } = {},\n ): Promise<Page<EntryContract>> =>\n this.page<EntryContract>(\n `/projects/${enc(project)}/entries` + query({ collection: opts.collection, status: opts.status }),\n opts,\n ),\n create: (\n project: string,\n body: { collection: string; slug?: string; data: Record<string, unknown>; changeSetId?: string; changeSummary?: string },\n ): Promise<EntryContract> => this.mutate<EntryContract>(\"POST\", `/projects/${enc(project)}/entries`, body),\n get: (project: string, entry: string, signal?: AbortSignal): Promise<EntryContract> =>\n this.get<EntryContract>(`/projects/${enc(project)}/entries/${enc(entry)}`, undefined, signal),\n update: (\n project: string,\n entry: string,\n body: {\n data?: Record<string, unknown>;\n slug?: string;\n expectedRevisionId?: string;\n changeSetId?: string;\n changeSummary?: string;\n },\n ): Promise<EntryContract> => this.mutate<EntryContract>(\"PATCH\", `/projects/${enc(project)}/entries/${enc(entry)}`, body),\n delete: (project: string, entry: string, changeSetId?: string): Promise<{ changeSetId: string; staged: string }> =>\n this.mutate(\"DELETE\", `/projects/${enc(project)}/entries/${enc(entry)}`, undefined, { changeSetId }),\n unpublish: (project: string, entry: string, changeSetId?: string): Promise<{ changeSetId: string; staged: string }> =>\n this.mutate(\"POST\", `/projects/${enc(project)}/entries/${enc(entry)}/unpublish`, undefined, { changeSetId }),\n restore: (project: string, entry: string): Promise<RestoreRevisionResponse> =>\n this.mutate<RestoreRevisionResponse>(\"POST\", `/projects/${enc(project)}/entries/${enc(entry)}/restore`),\n duplicate: (project: string, entry: string, changeSetId?: string): Promise<EntryContract> =>\n this.mutate<EntryContract>(\"POST\", `/projects/${enc(project)}/entries/${enc(entry)}/duplicate`, {\n changeSetId,\n }),\n bulk: (project: string, body: BulkEntriesRequest): Promise<BulkEntriesResponse> =>\n this.mutate<BulkEntriesResponse>(\"POST\", `/projects/${enc(project)}/entries/bulk`, body),\n import: (project: string, body: ImportEntriesRequest): Promise<ImportEntriesResponse> =>\n this.mutate<ImportEntriesResponse>(\"POST\", `/projects/${enc(project)}/entries/import`, body),\n references: (project: string, entry: string, signal?: AbortSignal): Promise<EntryReferencesResponse> =>\n this.get<EntryReferencesResponse>(`/projects/${enc(project)}/entries/${enc(entry)}/references`, undefined, signal),\n revisions: (project: string, entry: string, signal?: AbortSignal): Promise<RevisionContract[]> =>\n this.get<RevisionContract[]>(`/projects/${enc(project)}/entries/${enc(entry)}/revisions`, undefined, signal),\n revision: (project: string, entry: string, revision: string, signal?: AbortSignal): Promise<RevisionContract> =>\n this.get<RevisionContract>(`/projects/${enc(project)}/entries/${enc(entry)}/revisions/${enc(revision)}`, undefined, signal),\n restoreRevision: (project: string, entry: string, revision: string): Promise<RestoreRevisionResponse> =>\n this.mutate<RestoreRevisionResponse>(\n \"POST\",\n `/projects/${enc(project)}/entries/${enc(entry)}/revisions/${enc(revision)}/restore`,\n ),\n };\n\n // --- Change sets ----------------------------------------------------------\n readonly changeSets = {\n list: (project: string, opts: ListOptions & { status?: string } = {}): Promise<Page<ChangeSetContract>> =>\n this.page<ChangeSetContract>(`/projects/${enc(project)}/change-sets` + query({ status: opts.status }), opts),\n create: (project: string, body: CreateChangeSetRequest): Promise<ChangeSetContract> =>\n this.mutate<ChangeSetContract>(\"POST\", `/projects/${enc(project)}/change-sets`, body),\n get: (project: string, changeSet: string, signal?: AbortSignal): Promise<ChangeSetContract> =>\n this.get<ChangeSetContract>(`/projects/${enc(project)}/change-sets/${enc(changeSet)}`, undefined, signal),\n update: (project: string, changeSet: string, body: UpdateChangeSetRequest): Promise<ChangeSetContract> =>\n this.mutate<ChangeSetContract>(\"PATCH\", `/projects/${enc(project)}/change-sets/${enc(changeSet)}`, body),\n validate: (project: string, changeSet: string): Promise<{ valid: boolean; errors: ValidationIssue[] }> =>\n this.mutate(\"POST\", `/projects/${enc(project)}/change-sets/${enc(changeSet)}/validate`),\n publish: (\n project: string,\n changeSet: string,\n ): Promise<{ changeSet: ChangeSetContract; publishedEntryIds: string[] }> =>\n this.mutate(\"POST\", `/projects/${enc(project)}/change-sets/${enc(changeSet)}/publish`, { confirm: true }),\n close: (project: string, changeSet: string): Promise<ChangeSetContract> =>\n this.mutate<ChangeSetContract>(\"POST\", `/projects/${enc(project)}/change-sets/${enc(changeSet)}/close`),\n // Scheduled publishing\n schedule: (project: string, changeSet: string, publishAt: string): Promise<ChangeSetContract> =>\n this.mutate<ChangeSetContract>(\"POST\", `/projects/${enc(project)}/change-sets/${enc(changeSet)}/schedule`, {\n publishAt,\n }),\n cancelSchedule: (project: string, changeSet: string): Promise<ChangeSetContract> =>\n this.mutate<ChangeSetContract>(\"DELETE\", `/projects/${enc(project)}/change-sets/${enc(changeSet)}/schedule`),\n // Reviews & approvals\n reviews: (project: string, changeSet: string, signal?: AbortSignal): Promise<ChangeSetReviewContract[]> =>\n this.get<ChangeSetReviewContract[]>(\n `/projects/${enc(project)}/change-sets/${enc(changeSet)}/reviews`,\n undefined,\n signal,\n ),\n requestReview: (project: string, changeSet: string, body: RequestReviewRequest): Promise<ChangeSetReviewContract[]> =>\n this.mutate<ChangeSetReviewContract[]>(\"POST\", `/projects/${enc(project)}/change-sets/${enc(changeSet)}/reviews`, body),\n removeReviewer: (project: string, changeSet: string, reviewer: string): Promise<ChangeSetReviewContract[]> =>\n this.mutate<ChangeSetReviewContract[]>(\n \"DELETE\",\n `/projects/${enc(project)}/change-sets/${enc(changeSet)}/reviews/${enc(reviewer)}`,\n ),\n approve: (project: string, changeSet: string, body: ReviewDecisionRequest = {}): Promise<ChangeSetReviewContract[]> =>\n this.mutate<ChangeSetReviewContract[]>(\"POST\", `/projects/${enc(project)}/change-sets/${enc(changeSet)}/approve`, body),\n requestChanges: (project: string, changeSet: string, body: ReviewDecisionRequest = {}): Promise<ChangeSetReviewContract[]> =>\n this.mutate<ChangeSetReviewContract[]>(\n \"POST\",\n `/projects/${enc(project)}/change-sets/${enc(changeSet)}/request-changes`,\n body,\n ),\n // Comments\n comments: (project: string, changeSet: string, signal?: AbortSignal): Promise<ChangeSetCommentContract[]> =>\n this.get<ChangeSetCommentContract[]>(\n `/projects/${enc(project)}/change-sets/${enc(changeSet)}/comments`,\n undefined,\n signal,\n ),\n comment: (project: string, changeSet: string, body: CreateChangeSetCommentRequest): Promise<ChangeSetCommentContract> =>\n this.mutate<ChangeSetCommentContract>(\"POST\", `/projects/${enc(project)}/change-sets/${enc(changeSet)}/comments`, body),\n resolveComment: (project: string, changeSet: string, comment: string, resolved = true): Promise<ChangeSetCommentContract> =>\n this.mutate<ChangeSetCommentContract>(\n \"PATCH\",\n `/projects/${enc(project)}/change-sets/${enc(changeSet)}/comments/${enc(comment)}`,\n { resolved },\n ),\n // Automated checks\n checks: (project: string, changeSet: string, signal?: AbortSignal): Promise<ChangeSetCheckContract[]> =>\n this.get<ChangeSetCheckContract[]>(\n `/projects/${enc(project)}/change-sets/${enc(changeSet)}/checks`,\n undefined,\n signal,\n ),\n runChecks: (project: string, changeSet: string): Promise<RunChecksResponse> =>\n this.mutate<RunChecksResponse>(\"POST\", `/projects/${enc(project)}/change-sets/${enc(changeSet)}/checks/run`),\n };\n\n // --- Previews -------------------------------------------------------------\n readonly previews = {\n create: (project: string, body: CreatePreviewRequest): Promise<PreviewContract> =>\n this.mutate<PreviewContract>(\"POST\", `/projects/${enc(project)}/previews`, body),\n list: (project: string, signal?: AbortSignal): Promise<PreviewContract[]> =>\n this.get<PreviewContract[]>(`/projects/${enc(project)}/previews`, undefined, signal),\n revoke: (project: string, preview: string): Promise<{ ok: boolean }> =>\n this.mutate(\"DELETE\", `/projects/${enc(project)}/previews/${enc(preview)}`),\n };\n\n // --- Assets ---------------------------------------------------------------\n readonly assets = {\n createUpload: (project: string, body: CreateUploadRequest): Promise<CreateUploadResponse> =>\n this.mutate<CreateUploadResponse>(\"POST\", `/projects/${enc(project)}/assets/uploads`, body),\n completeUpload: (project: string, upload: string): Promise<AssetContract> =>\n this.mutate<CompleteUploadResponse>(\"POST\", `/projects/${enc(project)}/assets/uploads/${enc(upload)}/complete`).then(\n (r) => r.asset,\n ),\n list: (project: string, opts: ListOptions = {}): Promise<Page<AssetContract>> =>\n this.page<AssetContract>(`/projects/${enc(project)}/assets`, opts),\n get: (project: string, asset: string, signal?: AbortSignal): Promise<AssetContract> =>\n this.get<AssetContract>(`/projects/${enc(project)}/assets/${enc(asset)}`, undefined, signal),\n usage: (project: string, asset: string, signal?: AbortSignal): Promise<{ asset: AssetContract; usage: { entryIds: string[] } }> =>\n this.get(`/projects/${enc(project)}/assets/${enc(asset)}`, { usage: \"true\" }, signal),\n update: (project: string, asset: string, body: UpdateAssetRequest): Promise<AssetContract> =>\n this.mutate<AssetContract>(\"PATCH\", `/projects/${enc(project)}/assets/${enc(asset)}`, body),\n replace: (project: string, asset: string, body: ReplaceAssetRequest): Promise<AssetContract> =>\n this.mutate<AssetContract>(\"POST\", `/projects/${enc(project)}/assets/${enc(asset)}/replace`, body),\n delete: (project: string, asset: string): Promise<{ ok: boolean }> =>\n this.mutate(\"DELETE\", `/projects/${enc(project)}/assets/${enc(asset)}`),\n /** Full presigned upload flow: create → PUT bytes → complete. */\n upload: (project: string, input: AssetInput, meta: UploadAssetMeta = {}): Promise<AssetContract> =>\n this.uploadAsset(project, input, meta),\n };\n\n // --- API keys -------------------------------------------------------------\n readonly apiKeys = {\n listForOrganization: (organization: string, signal?: AbortSignal): Promise<ApiKeyContract[]> =>\n this.get<ApiKeyContract[]>(`/organizations/${enc(organization)}/api-keys`, undefined, signal),\n createForOrganization: (organization: string, body: CreateApiKeyRequest): Promise<CreateApiKeyResponse> =>\n this.mutate<CreateApiKeyResponse>(\"POST\", `/organizations/${enc(organization)}/api-keys`, body),\n revokeForOrganization: (organization: string, key: string): Promise<{ ok: boolean }> =>\n this.mutate(\"DELETE\", `/organizations/${enc(organization)}/api-keys/${enc(key)}`),\n listForProject: (project: string, signal?: AbortSignal): Promise<ApiKeyContract[]> =>\n this.get<ApiKeyContract[]>(`/projects/${enc(project)}/api-keys`, undefined, signal),\n createForProject: (project: string, body: CreateApiKeyRequest): Promise<CreateApiKeyResponse> =>\n this.mutate<CreateApiKeyResponse>(\"POST\", `/projects/${enc(project)}/api-keys`, body),\n revokeForProject: (project: string, key: string): Promise<{ ok: boolean }> =>\n this.mutate(\"DELETE\", `/projects/${enc(project)}/api-keys/${enc(key)}`),\n };\n\n // --- Webhooks -------------------------------------------------------------\n readonly webhooks = {\n list: (project: string, signal?: AbortSignal): Promise<WebhookEndpointContract[]> =>\n this.get<WebhookEndpointContract[]>(`/projects/${enc(project)}/webhooks`, undefined, signal),\n create: (project: string, body: CreateWebhookRequest): Promise<CreateWebhookResponse> =>\n this.mutate<CreateWebhookResponse>(\"POST\", `/projects/${enc(project)}/webhooks`, body),\n update: (project: string, webhook: string, body: UpdateWebhookRequest): Promise<WebhookEndpointContract> =>\n this.mutate<WebhookEndpointContract>(\"PATCH\", `/projects/${enc(project)}/webhooks/${enc(webhook)}`, body),\n delete: (project: string, webhook: string): Promise<{ ok: boolean }> =>\n this.mutate(\"DELETE\", `/projects/${enc(project)}/webhooks/${enc(webhook)}`),\n deliveries: (project: string, webhook: string, signal?: AbortSignal): Promise<WebhookDeliveryContract[]> =>\n this.get<WebhookDeliveryContract[]>(`/projects/${enc(project)}/webhooks/${enc(webhook)}/deliveries`, undefined, signal),\n retry: (project: string, webhook: string, delivery: string): Promise<{ ok: boolean }> =>\n this.mutate(\"POST\", `/projects/${enc(project)}/webhooks/${enc(webhook)}/deliveries/${enc(delivery)}/retry`),\n };\n\n // --- Activity -------------------------------------------------------------\n activity(\n project: string,\n opts: ListOptions & { actorType?: string; action?: string; targetType?: string; from?: string; to?: string } = {},\n ): Promise<Page<ActivityEventContract>> {\n return this.page<ActivityEventContract>(\n `/projects/${enc(project)}/activity` +\n query({\n actorType: opts.actorType,\n action: opts.action,\n targetType: opts.targetType,\n from: opts.from,\n to: opts.to,\n }),\n opts,\n );\n }\n\n // --- Billing --------------------------------------------------------------\n readonly billing = {\n status: (organization: string, signal?: AbortSignal): Promise<BillingResponse> =>\n this.get<BillingResponse>(`/organizations/${enc(organization)}/billing`, undefined, signal),\n checkout: (organization: string, body: CheckoutRequest): Promise<CheckoutResponse> =>\n this.mutate<CheckoutResponse>(\"POST\", `/organizations/${enc(organization)}/billing/checkout`, body),\n portal: (organization: string): Promise<PortalResponse> =>\n this.mutate<PortalResponse>(\"POST\", `/organizations/${enc(organization)}/billing/portal`),\n };\n\n // --- Upload helper --------------------------------------------------------\n private async uploadAsset(project: string, input: AssetInput, meta: UploadAssetMeta): Promise<AssetContract> {\n const { bytes, filename } = await readInput(input, meta.filename);\n const contentType = meta.contentType ?? guessContentType(filename);\n const checksum = createHash(\"md5\").update(bytes).digest(\"hex\");\n\n const upload = await this.assets.createUpload(project, {\n filename,\n contentType,\n byteSize: meta.byteSize ?? bytes.byteLength,\n checksum,\n });\n\n // The presigned URL is absolute (storage host) and must bypass the API base.\n const put = await this.fetchImpl(upload.url, {\n method: upload.method,\n headers: upload.headers,\n body: bytes as unknown as BodyInit,\n });\n if (!put.ok) {\n throw new Error(`Asset upload PUT failed with status ${put.status}.`);\n }\n\n return this.assets.completeUpload(project, upload.uploadId);\n }\n}\n\ninterface ValidationIssue {\n resourceType: string;\n resourceId: string;\n path: string;\n message: string;\n code?: string;\n}\n\nasync function readInput(input: AssetInput, filenameOverride?: string): Promise<{ bytes: Uint8Array; filename: string }> {\n if (typeof input === \"string\") {\n const bytes = await readFile(input);\n return { bytes: new Uint8Array(bytes), filename: filenameOverride ?? basename(input) };\n }\n const bytes = input instanceof Uint8Array ? input : new Uint8Array(input);\n return { bytes, filename: filenameOverride ?? \"upload.bin\" };\n}\n\nconst CONTENT_TYPES: Record<string, string> = {\n png: \"image/png\",\n jpg: \"image/jpeg\",\n jpeg: \"image/jpeg\",\n gif: \"image/gif\",\n webp: \"image/webp\",\n avif: \"image/avif\",\n pdf: \"application/pdf\",\n json: \"application/json\",\n txt: \"text/plain\",\n md: \"text/markdown\",\n csv: \"text/csv\",\n mp4: \"video/mp4\",\n webm: \"video/webm\",\n mp3: \"audio/mpeg\",\n wav: \"audio/wav\",\n};\n\nfunction guessContentType(filename: string): string {\n const ext = filename.split(\".\").pop()?.toLowerCase() ?? \"\";\n return CONTENT_TYPES[ext] ?? \"application/octet-stream\";\n}\n\nfunction enc(segment: string): string {\n return encodeURIComponent(segment);\n}\n\nfunction query(params: Record<string, string | undefined>): string {\n const entries = Object.entries(params).filter(([, v]) => v !== undefined && v !== \"\");\n if (entries.length === 0) return \"\";\n return \"?\" + entries.map(([k, v]) => `${k}=${encodeURIComponent(v as string)}`).join(\"&\");\n}\n\n/** Create a management client. */\nexport function createManagementClient(options: ManagementClientOptions): ManagementClient {\n return new ManagementClient(options);\n}\n\nexport { generateTypes, generateTypesModule } from \"./codegen.js\";\nexport { MynaApiError, isMynaApiError } from \"./errors.js\";\nexport type { FetchLike, RetryOptions } from \"./http.js\";\n","import type {\n CollectionSchema,\n FieldDef,\n ListItem,\n ObjectField,\n} from \"../../schema/src/types.js\";\n\n/**\n * Deterministic TypeScript type generation from canonical collection schemas\n * (SPEC 12). Pure and stable: the same input always yields byte-identical\n * output, and no user-written files are touched. Consumed by `myna types\n * generate`.\n */\nexport function generateTypes(collections: CollectionSchema[]): string {\n const sorted = [...collections].sort((a, b) => a.name.localeCompare(b.name));\n const blocks: string[] = [];\n\n for (const collection of sorted) {\n blocks.push(renderInterface(collection));\n }\n\n const registry = sorted\n .map((c) => ` ${JSON.stringify(c.name)}: ${pascal(c.name)};`)\n .join(\"\\n\");\n\n const header = [\n \"// Generated by `myna types generate`. Do not edit by hand.\",\n \"// This file is safe to commit and regenerate.\",\n \"\",\n ].join(\"\\n\");\n\n return `${header}${blocks.join(\"\\n\\n\")}\\n\\nexport interface MynaCollections {\\n${registry}\\n}\\n`;\n}\n\nfunction renderInterface(collection: CollectionSchema): string {\n const name = pascal(collection.name);\n const lines = collection.fields.map((f) => renderField(f, 1));\n const label = collection.label ? ` ${collection.label}` : \"\";\n return `/**${label} (${collection.kind}) */\\nexport interface ${name} {\\n${lines.join(\"\\n\")}\\n}`;\n}\n\nfunction renderField(field: FieldDef, depth: number): string {\n const indent = \" \".repeat(depth);\n const optional = field.required ? \"\" : \"?\";\n const doc = field.description ? `${indent}/** ${escapeComment(field.description)} */\\n` : \"\";\n const base = fieldType(field, depth);\n // Localized fields store one value per project locale.\n const type = field.localized ? `{ [locale: string]: ${base} }` : base;\n return `${doc}${indent}${safeKey(field.key)}${optional}: ${type};`;\n}\n\nfunction fieldType(field: FieldDef, depth: number): string {\n switch (field.type) {\n case \"text\":\n return field.enum && field.enum.length > 0 ? field.enum.map((v) => JSON.stringify(v)).join(\" | \") : \"string\";\n case \"slug\":\n return \"string\";\n case \"markdown\":\n return \"string\";\n case \"number\":\n return \"number\";\n case \"boolean\":\n return \"boolean\";\n case \"date\":\n case \"datetime\":\n return \"string\";\n case \"json\":\n return \"JsonValue\";\n case \"asset\":\n return field.multiple ? \"string[]\" : \"string\";\n case \"reference\":\n return field.multiple ? \"string[]\" : \"string\";\n case \"object\":\n return renderObject(field, depth);\n case \"list\":\n return `${listItemType(field.item, depth)}[]`;\n case \"richText\":\n return \"RichTextDoc\";\n case \"blocks\": {\n // Discriminated union over the allowed block components.\n const inner = \" \".repeat(depth + 1);\n const options = field.blocks.map((b) => {\n const lines = b.fields.map((f) => renderField(f, depth + 2));\n return `{ type: ${JSON.stringify(b.key)}; fields: {\\n${lines.join(\"\\n\")}\\n${inner}} }`;\n });\n return `Array<\\n${inner}${options.join(`\\n${inner}| `)}\\n${\" \".repeat(depth)}>`;\n }\n default:\n return \"unknown\";\n }\n}\n\nfunction renderObject(field: ObjectField, depth: number): string {\n const lines = field.fields.map((f) => renderField(f, depth + 1));\n const closingIndent = \" \".repeat(depth);\n return `{\\n${lines.join(\"\\n\")}\\n${closingIndent}}`;\n}\n\nfunction listItemType(item: ListItem, depth: number): string {\n switch (item.kind) {\n case \"text\":\n return item.enum && item.enum.length > 0 ? `(${item.enum.map((v) => JSON.stringify(v)).join(\" | \")})` : \"string\";\n case \"number\":\n return \"number\";\n case \"boolean\":\n return \"boolean\";\n case \"date\":\n case \"datetime\":\n return \"string\";\n case \"markdown\":\n return \"string\";\n case \"json\":\n return \"JsonValue\";\n case \"reference\":\n return \"string\";\n case \"asset\":\n return \"string\";\n case \"object\": {\n const lines = item.fields.map((f) => renderField(f, depth + 1));\n const closingIndent = \" \".repeat(depth);\n return `{\\n${lines.join(\"\\n\")}\\n${closingIndent}}`;\n }\n default:\n return \"unknown\";\n }\n}\n\nconst JSON_VALUE = [\n \"export type JsonValue = string | number | boolean | null | JsonValue[] | { [key: string]: JsonValue };\",\n \"\",\n \"/** Portable rich-text document tree (never rendered HTML). */\",\n \"export interface RichTextDoc { type: \\\"doc\\\"; content: Array<{ type: string; [key: string]: unknown }>; }\",\n].join(\"\\n\");\n\n/** Generate types plus the shared `JsonValue` helper as a standalone module. */\nexport function generateTypesModule(collections: CollectionSchema[]): string {\n return `${JSON_VALUE}\\n\\n${generateTypes(collections)}`;\n}\n\nfunction pascal(key: string): string {\n return key\n .split(/[-_\\s]+/)\n .filter(Boolean)\n .map((part) => part.charAt(0).toUpperCase() + part.slice(1))\n .join(\"\");\n}\n\nfunction safeKey(key: string): string {\n return /^[A-Za-z_$][A-Za-z0-9_$]*$/.test(key) ? key : JSON.stringify(key);\n}\n\nfunction escapeComment(text: string): string {\n return text.replace(/\\*\\//g, \"*\\\\/\");\n}\n","import { z } from \"zod\";\nimport type { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport type { CallToolResult } from \"@modelcontextprotocol/sdk/types.js\";\nimport type { ManagementClient } from \"@myna-sh/sdk/management\";\nimport { isMynaApiError } from \"@myna-sh/sdk/management\";\nimport type { ProjectRegistry } from \"./config.js\";\n\n/**\n * The Myna MCP tools (SPEC 13). This module contains no CMS business logic —\n * every tool is a thin adapter over the management SDK.\n */\n\nfunction ok(text: string, structured: unknown): CallToolResult {\n return {\n content: [{ type: \"text\", text }],\n structuredContent: structured as Record<string, unknown>,\n };\n}\n\nfunction fail(error: unknown): CallToolResult {\n const message = isMynaApiError(error)\n ? `${error.code}: ${error.detail ?? error.title}`\n : error instanceof Error\n ? error.message\n : String(error);\n return { content: [{ type: \"text\", text: `Error: ${message}` }], isError: true };\n}\n\nasync function resolveEntryId(client: ManagementClient, project: string, ref: string): Promise<string> {\n if (ref.startsWith(\"ent_\") && !ref.includes(\"/\")) return ref;\n const [collection, slug] = ref.includes(\"/\") ? ref.split(\"/\", 2) : [undefined, ref];\n if (!collection) throw new Error(`Provide the entry as \"<collection>/<slug>\" or an ent_ id (got \"${ref}\").`);\n let cursor: string | undefined;\n for (let i = 0; i < 50; i++) {\n const page = await client.entries.list(project, { collection, limit: 100, cursor });\n const match = page.data.find((e) => e.slug === slug || e.id === slug);\n if (match) return match.id;\n if (!page.nextCursor) break;\n cursor = page.nextCursor;\n }\n throw new Error(`Entry not found: ${ref}`);\n}\n\nconst projectArg = { project: z.string().optional().describe(\"Project id, slug, or configured name. Omit to use the default.\") };\n\nexport interface ToolOptions {\n /**\n * Whether `myna_upload_asset` may read local filesystem paths. True for\n * stdio (the client and server share a machine); false for HTTP, where a\n * remote client must never be able to read the server's filesystem.\n */\n allowPathUploads: boolean;\n}\n\nexport function registerTools(\n server: McpServer,\n registry: ProjectRegistry,\n options: ToolOptions = { allowPathUploads: true },\n): void {\n // 1. list projects\n server.registerTool(\n \"myna_list_projects\",\n {\n title: \"List projects\",\n description: \"List projects in an organization.\",\n inputSchema: {\n organization: z.string().optional().describe(\"Organization id or slug. Omit to use the default.\"),\n ...projectArg,\n },\n annotations: { readOnlyHint: true, openWorldHint: true },\n },\n async (args) => {\n try {\n const { client } = registry.clientFor(args.project);\n const org = registry.organizationFor(args.project, args.organization);\n const projects = await client.projects.list(org);\n return ok(`${projects.length} project(s) in ${org}.`, { projects });\n } catch (error) {\n return fail(error);\n }\n },\n );\n\n // 2. get project\n server.registerTool(\n \"myna_get_project\",\n {\n title: \"Get project\",\n description: \"Fetch a single project's details.\",\n inputSchema: { ...projectArg },\n annotations: { readOnlyHint: true, openWorldHint: true },\n },\n async (args) => {\n try {\n const { client, project } = registry.clientFor(args.project);\n const result = await client.projects.get(project);\n return ok(`Project ${result.name} (${result.slug}).`, { project: result });\n } catch (error) {\n return fail(error);\n }\n },\n );\n\n // 3. list collections\n server.registerTool(\n \"myna_list_collections\",\n {\n title: \"List collections\",\n description: \"List the deployed collections in a project.\",\n inputSchema: { ...projectArg },\n annotations: { readOnlyHint: true, openWorldHint: true },\n },\n async (args) => {\n try {\n const { client, project } = registry.clientFor(args.project);\n const collections = await client.schema.collections(project);\n return ok(`${collections.length} collection(s).`, { collections });\n } catch (error) {\n return fail(error);\n }\n },\n );\n\n // 4. get collection schema\n server.registerTool(\n \"myna_get_collection_schema\",\n {\n title: \"Get collection schema\",\n description: \"Fetch the latest canonical schema for a collection.\",\n inputSchema: { ...projectArg, collection: z.string().describe(\"Collection key.\") },\n annotations: { readOnlyHint: true, openWorldHint: true },\n },\n async (args) => {\n try {\n const { client, project } = registry.clientFor(args.project);\n const versions = await client.schema.versions(project, args.collection);\n const latest = versions[0];\n if (!latest) throw new Error(`Collection ${args.collection} has no versions.`);\n return ok(`${args.collection} schema v${latest.version}.`, { version: latest.version, schema: latest.schemaJson });\n } catch (error) {\n return fail(error);\n }\n },\n );\n\n // 5. list entries\n server.registerTool(\n \"myna_list_entries\",\n {\n title: \"List entries\",\n description: \"List entries in a collection.\",\n inputSchema: {\n ...projectArg,\n collection: z.string().describe(\"Collection key.\"),\n status: z.enum([\"draft\", \"published\", \"changed\", \"unpublished\", \"deleted\"]).optional(),\n limit: z.number().int().min(1).max(100).optional(),\n cursor: z.string().optional(),\n },\n annotations: { readOnlyHint: true, openWorldHint: true },\n },\n async (args) => {\n try {\n const { client, project } = registry.clientFor(args.project);\n const page = await client.entries.list(project, {\n collection: args.collection,\n status: args.status,\n limit: args.limit ?? 25,\n cursor: args.cursor,\n });\n return ok(`${page.data.length} entr(y/ies).`, { entries: page.data, nextCursor: page.nextCursor });\n } catch (error) {\n return fail(error);\n }\n },\n );\n\n // 6. get entry\n server.registerTool(\n \"myna_get_entry\",\n {\n title: \"Get entry\",\n description: \"Fetch one entry by \\\"<collection>/<slug>\\\" or entry id.\",\n inputSchema: { ...projectArg, entry: z.string().describe(\"collection/slug or ent_ id.\") },\n annotations: { readOnlyHint: true, openWorldHint: true },\n },\n async (args) => {\n try {\n const { client, project } = registry.clientFor(args.project);\n const id = await resolveEntryId(client, project, args.entry);\n const entry = await client.entries.get(project, id);\n return ok(`Entry ${entry.id} (${entry.status}).`, { entry });\n } catch (error) {\n return fail(error);\n }\n },\n );\n\n // 7. create change set\n server.registerTool(\n \"myna_create_change_set\",\n {\n title: \"Create change set\",\n description: \"Open a new change set to group entry and asset operations.\",\n inputSchema: {\n ...projectArg,\n title: z.string().min(1).max(200),\n description: z.string().max(2000).optional(),\n },\n annotations: { readOnlyHint: false, destructiveHint: false, idempotentHint: false, openWorldHint: true },\n },\n async (args) => {\n try {\n const { client, project } = registry.clientFor(args.project);\n const cs = await client.changeSets.create(project, { title: args.title, description: args.description });\n return ok(`Created change set ${cs.id}.`, { changeSet: cs });\n } catch (error) {\n return fail(error);\n }\n },\n );\n\n // 8. get change set\n server.registerTool(\n \"myna_get_change_set\",\n {\n title: \"Get change set\",\n description: \"Fetch a change set and its items.\",\n inputSchema: { ...projectArg, changeSet: z.string().describe(\"Change set id (chs_).\") },\n annotations: { readOnlyHint: true, openWorldHint: true },\n },\n async (args) => {\n try {\n const { client, project } = registry.clientFor(args.project);\n const cs = await client.changeSets.get(project, args.changeSet);\n return ok(`Change set ${cs.id} (${cs.status}), ${cs.items.length} item(s).`, { changeSet: cs });\n } catch (error) {\n return fail(error);\n }\n },\n );\n\n // 9. create entry\n server.registerTool(\n \"myna_create_entry\",\n {\n title: \"Create entry\",\n description: \"Create a draft entry. Does not publish.\",\n inputSchema: {\n ...projectArg,\n collection: z.string(),\n data: z.record(z.string(), z.unknown()).describe(\"Field values.\"),\n slug: z.string().optional(),\n changeSet: z.string().optional().describe(\"Attach to an existing change set (chs_).\"),\n changeSummary: z.string().max(500).optional(),\n },\n annotations: { readOnlyHint: false, destructiveHint: false, idempotentHint: false, openWorldHint: true },\n },\n async (args) => {\n try {\n const { client, project } = registry.clientFor(args.project);\n const entry = await client.entries.create(project, {\n collection: args.collection,\n data: args.data,\n slug: args.slug,\n changeSetId: args.changeSet,\n changeSummary: args.changeSummary,\n });\n return ok(`Created entry ${entry.id} (${entry.status}).`, { entry });\n } catch (error) {\n return fail(error);\n }\n },\n );\n\n // 10. update entry\n server.registerTool(\n \"myna_update_entry\",\n {\n title: \"Update entry\",\n description: \"Update a draft entry. Does not publish.\",\n inputSchema: {\n ...projectArg,\n entry: z.string().describe(\"collection/slug or ent_ id.\"),\n data: z.record(z.string(), z.unknown()).optional(),\n slug: z.string().optional(),\n expectedRevisionId: z.string().optional().describe(\"Optimistic concurrency guard.\"),\n changeSet: z.string().optional(),\n changeSummary: z.string().max(500).optional(),\n },\n annotations: { readOnlyHint: false, destructiveHint: false, idempotentHint: false, openWorldHint: true },\n },\n async (args) => {\n try {\n const { client, project } = registry.clientFor(args.project);\n const id = await resolveEntryId(client, project, args.entry);\n const entry = await client.entries.update(project, id, {\n data: args.data,\n slug: args.slug,\n expectedRevisionId: args.expectedRevisionId,\n changeSetId: args.changeSet,\n changeSummary: args.changeSummary,\n });\n return ok(`Updated entry ${entry.id} (${entry.status}).`, { entry });\n } catch (error) {\n return fail(error);\n }\n },\n );\n\n // 11. delete entry (destructive)\n server.registerTool(\n \"myna_delete_entry\",\n {\n title: \"Delete entry\",\n description: \"Stage an entry deletion on a change set. Requires confirm=true. Takes effect only on publish.\",\n inputSchema: {\n ...projectArg,\n entry: z.string(),\n changeSet: z.string().optional(),\n confirm: z.literal(true).describe(\"Must be true to proceed.\"),\n },\n annotations: { readOnlyHint: false, destructiveHint: true, idempotentHint: false, openWorldHint: true },\n },\n async (args) => {\n try {\n const { client, project } = registry.clientFor(args.project);\n const id = await resolveEntryId(client, project, args.entry);\n const result = await client.entries.delete(project, id, args.changeSet);\n return ok(`Staged delete of ${id} on ${result.changeSetId}.`, result);\n } catch (error) {\n return fail(error);\n }\n },\n );\n\n // 12. upload asset\n server.registerTool(\n \"myna_upload_asset\",\n {\n title: \"Upload asset\",\n description: \"Upload an asset from base64 bytes or a local file path via the presigned flow.\",\n inputSchema: {\n ...projectArg,\n filename: z.string().describe(\"Display filename, e.g. cover.png.\"),\n base64: z.string().optional().describe(\"Base64-encoded file bytes.\"),\n path: z.string().optional().describe(\"Local filesystem path (stdio hosts only).\"),\n contentType: z.string().optional(),\n },\n annotations: { readOnlyHint: false, destructiveHint: false, idempotentHint: false, openWorldHint: true },\n },\n async (args) => {\n try {\n const { client, project } = registry.clientFor(args.project);\n if (!args.base64 && !args.path) throw new Error(\"Provide either `base64` or `path`.\");\n if (args.path && !options.allowPathUploads) {\n throw new Error(\"`path` uploads are only available on stdio transports; send `base64` instead.\");\n }\n const input = args.base64 ? new Uint8Array(Buffer.from(args.base64, \"base64\")) : args.path!;\n const asset = await client.assets.upload(project, input, {\n filename: args.filename,\n contentType: args.contentType,\n });\n return ok(`Uploaded ${asset.displayFilename} (${asset.id}).`, { asset });\n } catch (error) {\n return fail(error);\n }\n },\n );\n\n // 13. validate change set\n server.registerTool(\n \"myna_validate_change_set\",\n {\n title: \"Validate change set\",\n description: \"Validate every changed resource in a change set against the deployed schemas.\",\n inputSchema: { ...projectArg, changeSet: z.string() },\n annotations: { readOnlyHint: true, openWorldHint: true },\n },\n async (args) => {\n try {\n const { client, project } = registry.clientFor(args.project);\n const result = await client.changeSets.validate(project, args.changeSet);\n return ok(result.valid ? \"Change set is valid.\" : `Invalid: ${result.errors.length} error(s).`, result);\n } catch (error) {\n return fail(error);\n }\n },\n );\n\n // 14. create preview\n server.registerTool(\n \"myna_create_preview\",\n {\n title: \"Create preview\",\n description: \"Create one preview URL for a change set (or entry). Never publishes.\",\n inputSchema: {\n ...projectArg,\n changeSet: z.string().optional().describe(\"Change set id (chs_).\"),\n entry: z.string().optional().describe(\"Entry id (ent_).\"),\n expiresInSeconds: z.number().int().min(60).max(604800).optional(),\n },\n annotations: { readOnlyHint: false, destructiveHint: false, idempotentHint: false, openWorldHint: true },\n },\n async (args) => {\n try {\n if (Boolean(args.changeSet) === Boolean(args.entry)) {\n throw new Error(\"Provide exactly one of `changeSet` or `entry`.\");\n }\n const { client, project } = registry.clientFor(args.project);\n const preview = await client.previews.create(project, {\n changeSetId: args.changeSet,\n entryId: args.entry,\n expiresInSeconds: args.expiresInSeconds,\n });\n return ok(`Preview: ${preview.url}`, { preview });\n } catch (error) {\n return fail(error);\n }\n },\n );\n\n // 15. publish change set (destructive)\n server.registerTool(\n \"myna_publish_change_set\",\n {\n title: \"Publish change set\",\n description: \"Atomically publish a change set. Requires confirm=true and content:publish scope.\",\n inputSchema: { ...projectArg, changeSet: z.string(), confirm: z.literal(true).describe(\"Must be true.\") },\n annotations: { readOnlyHint: false, destructiveHint: true, idempotentHint: false, openWorldHint: true },\n },\n async (args) => {\n try {\n const { client, project } = registry.clientFor(args.project);\n const result = await client.changeSets.publish(project, args.changeSet);\n return ok(`Published ${result.publishedEntryIds.length} entr(y/ies).`, result);\n } catch (error) {\n return fail(error);\n }\n },\n );\n\n // 16. get entry revisions\n server.registerTool(\n \"myna_get_entry_revisions\",\n {\n title: \"Get entry revisions\",\n description: \"List the immutable revisions of an entry.\",\n inputSchema: { ...projectArg, entry: z.string() },\n annotations: { readOnlyHint: true, openWorldHint: true },\n },\n async (args) => {\n try {\n const { client, project } = registry.clientFor(args.project);\n const id = await resolveEntryId(client, project, args.entry);\n const revisions = await client.entries.revisions(project, id);\n return ok(`${revisions.length} revision(s).`, { revisions });\n } catch (error) {\n return fail(error);\n }\n },\n );\n\n // get entry references (reference integrity)\n server.registerTool(\n \"myna_get_entry_references\",\n {\n title: \"Get entry references\",\n description:\n \"Show reference integrity for an entry: which entries reference it (backlinks) and which entries it references, with publish state. Useful before unpublishing or deleting.\",\n inputSchema: { ...projectArg, entry: z.string() },\n annotations: { readOnlyHint: true, openWorldHint: true },\n },\n async (args) => {\n try {\n const { client, project } = registry.clientFor(args.project);\n const id = await resolveEntryId(client, project, args.entry);\n const refs = await client.entries.references(project, id);\n return ok(\n `Referenced by ${refs.referencedBy.length} entr(y/ies); references ${refs.references.length}.`,\n refs,\n );\n } catch (error) {\n return fail(error);\n }\n },\n );\n\n // 17. restore revision (destructive)\n server.registerTool(\n \"myna_restore_revision\",\n {\n title: \"Restore revision\",\n description: \"Restore a historical revision into a new draft revision. Requires confirm=true.\",\n inputSchema: {\n ...projectArg,\n entry: z.string(),\n revision: z.string().describe(\"Revision id (rev_).\"),\n confirm: z.literal(true).describe(\"Must be true.\"),\n },\n annotations: { readOnlyHint: false, destructiveHint: true, idempotentHint: false, openWorldHint: true },\n },\n async (args) => {\n try {\n const { client, project } = registry.clientFor(args.project);\n const id = await resolveEntryId(client, project, args.entry);\n const result = await client.entries.restoreRevision(project, id, args.revision);\n return ok(`Restored into ${result.revision.id}.`, result);\n } catch (error) {\n return fail(error);\n }\n },\n );\n\n // schedule / cancel scheduled publish\n server.registerTool(\n \"myna_schedule_change_set\",\n {\n title: \"Schedule change-set publish\",\n description:\n \"Schedule a change set to publish atomically at a future time, or cancel its schedule. Requires confirm=true and content:publish scope. Schedule status is readable via myna_get_change_set (scheduledAt).\",\n inputSchema: {\n ...projectArg,\n changeSet: z.string(),\n publishAt: z.string().optional().describe(\"ISO 8601 datetime to publish at. Omit with cancel=true.\"),\n cancel: z.boolean().optional().describe(\"Cancel the existing schedule instead.\"),\n confirm: z.literal(true).describe(\"Must be true.\"),\n },\n annotations: { readOnlyHint: false, destructiveHint: true, idempotentHint: true, openWorldHint: true },\n },\n async (args) => {\n try {\n if (Boolean(args.publishAt) === Boolean(args.cancel)) {\n throw new Error(\"Provide exactly one of `publishAt` or `cancel`.\");\n }\n const { client, project } = registry.clientFor(args.project);\n const cs = args.cancel\n ? await client.changeSets.cancelSchedule(project, args.changeSet)\n : await client.changeSets.schedule(project, args.changeSet, args.publishAt!);\n return ok(cs.scheduledAt ? `Scheduled for ${cs.scheduledAt}.` : \"Schedule cancelled.\", { changeSet: cs });\n } catch (error) {\n return fail(error);\n }\n },\n );\n\n // 18. get review status (reviews + comments + latest checks)\n server.registerTool(\n \"myna_get_change_set_review\",\n {\n title: \"Get change-set review status\",\n description:\n \"Fetch a change set's reviews, comments, and latest automated check run in one call.\",\n inputSchema: { ...projectArg, changeSet: z.string() },\n annotations: { readOnlyHint: true, openWorldHint: true },\n },\n async (args) => {\n try {\n const { client, project } = registry.clientFor(args.project);\n const [reviews, comments, checks] = await Promise.all([\n client.changeSets.reviews(project, args.changeSet),\n client.changeSets.comments(project, args.changeSet),\n client.changeSets.checks(project, args.changeSet),\n ]);\n const approvals = reviews.filter((r) => r.status === \"approved\" && !r.stale).length;\n const failing = checks.filter((c) => c.status === \"failed\").length;\n return ok(\n `${approvals} fresh approval(s), ${comments.length} comment(s), ${checks.length === 0 ? \"no check run\" : `${failing} failing check(s)`}.`,\n { reviews, comments, checks },\n );\n } catch (error) {\n return fail(error);\n }\n },\n );\n\n // 19. review change set (approve / request changes)\n server.registerTool(\n \"myna_review_change_set\",\n {\n title: \"Review change set\",\n description:\n \"Record an approve or request-changes review decision on a change set. Requires content:review scope.\",\n inputSchema: {\n ...projectArg,\n changeSet: z.string(),\n decision: z.enum([\"approve\", \"request_changes\"]),\n comment: z.string().optional().describe(\"Optional review comment.\"),\n },\n annotations: { readOnlyHint: false, destructiveHint: false, idempotentHint: true, openWorldHint: true },\n },\n async (args) => {\n try {\n const { client, project } = registry.clientFor(args.project);\n const reviews =\n args.decision === \"approve\"\n ? await client.changeSets.approve(project, args.changeSet, { comment: args.comment })\n : await client.changeSets.requestChanges(project, args.changeSet, { comment: args.comment });\n return ok(`Recorded ${args.decision} review.`, { reviews });\n } catch (error) {\n return fail(error);\n }\n },\n );\n\n // 20. comment on change set\n server.registerTool(\n \"myna_comment_on_change_set\",\n {\n title: \"Comment on change set\",\n description: \"Add a comment to a change set, optionally anchored to an entry field.\",\n inputSchema: {\n ...projectArg,\n changeSet: z.string(),\n body: z.string().min(1),\n entry: z.string().optional().describe(\"Entry id (ent_) to anchor the comment to.\"),\n fieldPath: z.string().optional().describe(\"Field path within the entry, e.g. fields.title.\"),\n },\n annotations: { readOnlyHint: false, destructiveHint: false, idempotentHint: false, openWorldHint: true },\n },\n async (args) => {\n try {\n const { client, project } = registry.clientFor(args.project);\n const comment = await client.changeSets.comment(project, args.changeSet, {\n body: args.body,\n resourceType: args.entry ? \"entry\" : undefined,\n resourceId: args.entry,\n fieldPath: args.fieldPath,\n });\n return ok(`Commented ${comment.id}.`, { comment });\n } catch (error) {\n return fail(error);\n }\n },\n );\n\n // 21. run automated checks\n server.registerTool(\n \"myna_run_change_set_checks\",\n {\n title: \"Run change-set checks\",\n description:\n \"Run the built-in automated checks (schema, references, slugs, alt-text, SEO) against a change set and return the results.\",\n inputSchema: { ...projectArg, changeSet: z.string() },\n annotations: { readOnlyHint: false, destructiveHint: false, idempotentHint: true, openWorldHint: true },\n },\n async (args) => {\n try {\n const { client, project } = registry.clientFor(args.project);\n const result = await client.changeSets.runChecks(project, args.changeSet);\n const failing = result.checks.filter((c) => c.status === \"failed\");\n return ok(\n result.passed ? \"All checks passed.\" : `Failing: ${failing.map((c) => c.name).join(\", \")}.`,\n result,\n );\n } catch (error) {\n return fail(error);\n }\n },\n );\n}\n","import { McpServer, ResourceTemplate } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport type { ReadResourceResult } from \"@modelcontextprotocol/sdk/types.js\";\nimport type { ProjectRegistry } from \"./config.js\";\n\n/**\n * MCP resources (SPEC 13): project summaries, collection schemas, entry and\n * revision representations, and change-set validation results.\n */\nexport function registerResources(server: McpServer, registry: ProjectRegistry): void {\n const json = (uri: string, value: unknown): ReadResourceResult => ({\n contents: [{ uri, mimeType: \"application/json\", text: JSON.stringify(value, null, 2) }],\n });\n\n // Project summaries for the default organization.\n server.registerResource(\n \"projects\",\n \"myna://projects\",\n { title: \"Projects\", description: \"Projects in the default organization.\", mimeType: \"application/json\" },\n async (uri) => {\n const { client } = registry.clientFor();\n const org = registry.organizationFor();\n const projects = await client.projects.list(org);\n return json(uri.href, { organization: org, projects });\n },\n );\n\n // Collection list for a project.\n server.registerResource(\n \"collections\",\n new ResourceTemplate(\"myna://{project}/collections\", { list: undefined }),\n { title: \"Collections\", description: \"Deployed collections for a project.\", mimeType: \"application/json\" },\n async (uri, variables) => {\n const project = String(variables.project);\n const { client, project: ref } = registry.clientFor(project);\n const collections = await client.schema.collections(ref);\n return json(uri.href, { project: ref, collections });\n },\n );\n\n // Canonical schema for one collection.\n server.registerResource(\n \"collection-schema\",\n new ResourceTemplate(\"myna://{project}/collection/{key}\", { list: undefined }),\n { title: \"Collection schema\", description: \"Latest canonical schema for a collection.\", mimeType: \"application/json\" },\n async (uri, variables) => {\n const { client, project } = registry.clientFor(String(variables.project));\n const versions = await client.schema.versions(project, String(variables.key));\n const latest = versions[0];\n return json(uri.href, { collection: String(variables.key), version: latest?.version ?? null, schema: latest?.schemaJson ?? null });\n },\n );\n\n // Entry representation (by entry id).\n server.registerResource(\n \"entry\",\n new ResourceTemplate(\"myna://{project}/entry/{entry}\", { list: undefined }),\n { title: \"Entry\", description: \"An entry's current representation.\", mimeType: \"application/json\" },\n async (uri, variables) => {\n const { client, project } = registry.clientFor(String(variables.project));\n const entry = await client.entries.get(project, String(variables.entry));\n return json(uri.href, { entry });\n },\n );\n\n // Entry revisions.\n server.registerResource(\n \"entry-revisions\",\n new ResourceTemplate(\"myna://{project}/entry/{entry}/revisions\", { list: undefined }),\n { title: \"Entry revisions\", description: \"Immutable revisions for an entry.\", mimeType: \"application/json\" },\n async (uri, variables) => {\n const { client, project } = registry.clientFor(String(variables.project));\n const revisions = await client.entries.revisions(project, String(variables.entry));\n return json(uri.href, { entry: String(variables.entry), revisions });\n },\n );\n\n // Change-set validation results.\n server.registerResource(\n \"change-set-validation\",\n new ResourceTemplate(\"myna://{project}/change-set/{changeSet}/validation\", { list: undefined }),\n { title: \"Change-set validation\", description: \"Validation result for a change set.\", mimeType: \"application/json\" },\n async (uri, variables) => {\n const { client, project } = registry.clientFor(String(variables.project));\n const result = await client.changeSets.validate(project, String(variables.changeSet));\n return json(uri.href, result);\n },\n );\n}\n","import { createServer as createHttpServer, type IncomingMessage, type ServerResponse } from \"node:http\";\nimport { StreamableHTTPServerTransport } from \"@modelcontextprotocol/sdk/server/streamableHttp.js\";\nimport { ProjectRegistry } from \"./config.js\";\nimport { createServerForRegistry } from \"./server.js\";\n\nexport interface HttpOptions {\n port: number;\n /** Bearer token required in the `Authorization` header. */\n authToken?: string;\n /** Explicitly serve without endpoint auth. Never enable on a public network. */\n allowUnauthenticated?: boolean;\n path?: string;\n}\n\nfunction readBody(req: IncomingMessage): Promise<unknown> {\n return new Promise((resolve, reject) => {\n const chunks: Buffer[] = [];\n req.on(\"data\", (c: Buffer) => chunks.push(c));\n req.on(\"end\", () => {\n const raw = Buffer.concat(chunks).toString(\"utf8\");\n if (!raw) return resolve(undefined);\n try {\n resolve(JSON.parse(raw));\n } catch (error) {\n reject(error);\n }\n });\n req.on(\"error\", reject);\n });\n}\n\nfunction bearer(req: IncomingMessage): string | undefined {\n const header = req.headers.authorization;\n return header?.startsWith(\"Bearer \") ? header.slice(7).trim() : undefined;\n}\n\n/**\n * Streamable HTTP transport (SPEC 13). Stateless: a fresh server + transport per\n * request. Authenticated by a bearer token in the `Authorization` header.\n */\nexport async function runHttp(options: HttpOptions): Promise<void> {\n if (!options.authToken && !options.allowUnauthenticated) {\n throw new Error(\n \"Refusing to serve HTTP without auth. Set MYNA_MCP_TOKEN (or MYNA_TOKEN), \" +\n \"or set MYNA_MCP_ALLOW_UNAUTHENTICATED=1 for trusted-network use only.\",\n );\n }\n const registry = new ProjectRegistry();\n const path = options.path ?? \"/mcp\";\n\n const httpServer = createHttpServer((req: IncomingMessage, res: ServerResponse) => {\n void handle(req, res).catch((error: unknown) => {\n if (!res.headersSent) res.writeHead(500, { \"content-type\": \"application/json\" });\n res.end(JSON.stringify({ jsonrpc: \"2.0\", error: { code: -32603, message: String(error) }, id: null }));\n });\n });\n\n async function handle(req: IncomingMessage, res: ServerResponse): Promise<void> {\n const url = new URL(req.url ?? \"/\", \"http://localhost\");\n if (url.pathname === \"/health\") {\n res.writeHead(200, { \"content-type\": \"application/json\" }).end(JSON.stringify({ ok: true }));\n return;\n }\n if (url.pathname !== path) {\n res.writeHead(404, { \"content-type\": \"application/json\" }).end(JSON.stringify({ error: \"not found\" }));\n return;\n }\n if (options.authToken && bearer(req) !== options.authToken) {\n res.writeHead(401, { \"content-type\": \"application/json\" }).end(JSON.stringify({ error: \"unauthorized\" }));\n return;\n }\n if (req.method !== \"POST\") {\n // Stateless server: no standalone SSE stream.\n res.writeHead(405, { \"content-type\": \"application/json\", allow: \"POST\" }).end(\n JSON.stringify({ jsonrpc: \"2.0\", error: { code: -32000, message: \"Method not allowed.\" }, id: null }),\n );\n return;\n }\n\n const body = await readBody(req);\n const transport = new StreamableHTTPServerTransport({ sessionIdGenerator: undefined });\n // Remote clients must never be able to read this machine's filesystem.\n const server = createServerForRegistry(registry, { allowPathUploads: false });\n res.on(\"close\", () => {\n void transport.close();\n void server.close();\n });\n await server.connect(transport);\n await transport.handleRequest(req, res, body);\n }\n\n await new Promise<void>((resolve) => httpServer.listen(options.port, resolve));\n process.stderr.write(`myna-mcp: streamable HTTP transport listening on :${options.port}${path}\\n`);\n}\n"],"mappings":"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","names":["McpServer","query","query","bytes","DEFAULT_API_URL","McpServer"]}
|
|
1
|
+
{"version":3,"sources":["../src/main.ts","../src/server.ts","../src/config.ts","../../sdk/src/errors.ts","../../sdk/src/http.ts","../../sdk/src/management.ts","../../sdk/src/codegen.ts","../src/tools.ts","../src/resources.ts","../src/version.ts","../src/http.ts"],"sourcesContent":["import { StdioServerTransport } from \"@modelcontextprotocol/sdk/server/stdio.js\";\nimport { createServer } from \"./server.js\";\nimport { runHttp } from \"./http.js\";\n\n/** Run over stdio (default) or streamable HTTP (`--http`). */\nexport async function main(argv: string[] = process.argv.slice(2)): Promise<void> {\n const useHttp = argv.includes(\"--http\") || process.env.MYNA_MCP_TRANSPORT === \"http\";\n\n if (useHttp) {\n const port = Number(process.env.MYNA_MCP_PORT ?? process.env.PORT ?? 3333);\n const authToken = process.env.MYNA_MCP_TOKEN ?? process.env.MYNA_TOKEN;\n const allowUnauthenticated = [\"1\", \"true\"].includes(\n process.env.MYNA_MCP_ALLOW_UNAUTHENTICATED ?? \"\",\n );\n await runHttp({ port, authToken, allowUnauthenticated });\n return;\n }\n\n const server = createServer();\n const transport = new StdioServerTransport();\n await server.connect(transport);\n // Keep the process alive; the transport closes on stdin end.\n process.stderr.write(\"myna-mcp: stdio transport ready\\n\");\n}\n\nexport { createServer, createServerForRegistry, SERVER_NAME, SERVER_VERSION } from \"./server.js\";\nexport { runHttp } from \"./http.js\";\nexport { ProjectRegistry, type RegistryOptions } from \"./config.js\";\nexport { VERSION } from \"./version.js\";\n","import { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { ProjectRegistry } from \"./config.js\";\nimport { registerTools, type ToolOptions } from \"./tools.js\";\nimport { registerResources } from \"./resources.js\";\nimport { VERSION } from \"./version.js\";\n\nexport const SERVER_NAME = \"myna\";\nexport const SERVER_VERSION = VERSION;\n\n/** Build a fully-wired Myna MCP server (tools + resources). */\nexport function createServer(): McpServer {\n return createServerForRegistry(new ProjectRegistry());\n}\n\n/** Internal variant used by the stateless HTTP transport. */\nexport function createServerForRegistry(\n registry: ProjectRegistry,\n toolOptions?: ToolOptions,\n): McpServer {\n const server = new McpServer(\n { name: SERVER_NAME, version: SERVER_VERSION },\n {\n capabilities: { tools: {}, resources: {} },\n instructions:\n \"Myna MCP server: manage content, schemas, assets, change sets, and previews. \" +\n \"The primary flow is: create a change set, apply entry/asset operations, validate, \" +\n \"then create one preview URL. Publishing is a separate, confirmation-gated action.\",\n },\n );\n registerTools(server, registry, toolOptions);\n registerResources(server, registry);\n return server;\n}\n","import { readFileSync } from \"node:fs\";\nimport { homedir } from \"node:os\";\nimport { join } from \"node:path\";\nimport { createManagementClient, type ManagementClient } from \"@myna-sh/sdk/management\";\n\n/**\n * Named project configurations (SPEC 13). A default project plus per-call\n * overrides. Configuration comes from the environment and an optional JSON file\n * (`MYNA_MCP_CONFIG` or `~/.config/myna/mcp.json`).\n */\n\nexport interface NamedProject {\n project: string;\n organization?: string;\n apiUrl?: string;\n token?: string;\n}\n\nexport interface McpConfigFile {\n default?: string;\n apiUrl?: string;\n token?: string;\n projects?: Record<string, NamedProject>;\n}\n\nconst DEFAULT_API_URL = \"https://api.myna.sh\";\n\nexport interface RegistryOptions {\n /**\n * Skip the on-disk config file. The hosted server builds one registry per\n * request from the caller's OAuth grant; it must never pick up whatever\n * `~/.config/myna/mcp.json` happens to exist on the host.\n */\n ignoreConfigFile?: boolean;\n /** Replaces the \"set MYNA_PROJECT\" advice, which is meaningless remotely. */\n noProjectHint?: string;\n}\n\nexport class ProjectRegistry {\n private readonly file: McpConfigFile;\n private readonly clients = new Map<string, ManagementClient>();\n private readonly options: RegistryOptions;\n\n constructor(\n private readonly env: NodeJS.ProcessEnv = process.env,\n options: RegistryOptions = {},\n ) {\n this.options = options;\n this.file = options.ignoreConfigFile ? {} : loadConfigFile(env);\n }\n\n /**\n * A registry bound to a single credential, for the hosted (multi-tenant)\n * server. Every request builds its own; nothing is shared between callers.\n */\n static forCredential(input: {\n apiUrl: string;\n token: string;\n organization?: string;\n }): ProjectRegistry {\n return new ProjectRegistry(\n {\n MYNA_API_URL: input.apiUrl,\n MYNA_TOKEN: input.token,\n ...(input.organization ? { MYNA_ORGANIZATION: input.organization } : {}),\n } as NodeJS.ProcessEnv,\n {\n ignoreConfigFile: true,\n noProjectHint:\n \"No project specified. Pass `project` (an id or slug); use myna_list_projects to see them.\",\n },\n );\n }\n\n private get defaultApiUrl(): string {\n return this.env.MYNA_API_URL ?? this.file.apiUrl ?? DEFAULT_API_URL;\n }\n\n private get defaultToken(): string | undefined {\n return this.env.MYNA_TOKEN ?? this.file.token;\n }\n\n /** The named-project key used when a call omits `project`. */\n defaultProjectName(): string | undefined {\n return this.file.default ?? (this.env.MYNA_PROJECT ? \"__env\" : undefined);\n }\n\n /** All configured named projects (env default included). */\n list(): Array<{ name: string; project: string; organization?: string }> {\n const out: Array<{ name: string; project: string; organization?: string }> = [];\n if (this.env.MYNA_PROJECT) {\n out.push({ name: \"__env\", project: this.env.MYNA_PROJECT, organization: this.env.MYNA_ORGANIZATION });\n }\n for (const [name, cfg] of Object.entries(this.file.projects ?? {})) {\n out.push({ name, project: cfg.project, organization: cfg.organization });\n }\n return out;\n }\n\n /**\n * Resolve credentials without demanding a project.\n *\n * Org-scoped calls — listing projects above all — have no project to name\n * yet. A hosted connector is bound to an organization, not a project, so\n * requiring one here made discovery impossible: the tool an agent must call\n * first was the one that could not run.\n */\n resolveCredential(ref?: string): {\n project: string | null;\n organization?: string;\n apiUrl: string;\n token: string | undefined;\n } {\n // A named configuration.\n if (ref && this.file.projects?.[ref]) {\n const cfg = this.file.projects[ref]!;\n return {\n project: cfg.project,\n organization: cfg.organization,\n apiUrl: cfg.apiUrl ?? this.defaultApiUrl,\n token: cfg.token ?? this.defaultToken,\n };\n }\n // The env default named project.\n if ((!ref || ref === \"__env\") && this.env.MYNA_PROJECT) {\n return {\n project: ref && ref !== \"__env\" ? ref : this.env.MYNA_PROJECT,\n organization: this.env.MYNA_ORGANIZATION,\n apiUrl: this.defaultApiUrl,\n token: this.defaultToken,\n };\n }\n // A default named config.\n if (!ref && this.file.default && this.file.projects?.[this.file.default]) {\n return this.resolveCredential(this.file.default);\n }\n return {\n project: ref ?? null,\n organization: this.env.MYNA_ORGANIZATION,\n apiUrl: this.defaultApiUrl,\n token: this.defaultToken,\n };\n }\n\n /** Resolve a project reference: an explicit id/slug, a named config, or the default. */\n resolve(ref?: string): { project: string; organization?: string; apiUrl: string; token: string | undefined } {\n const resolved = this.resolveCredential(ref);\n if (!resolved.project) {\n throw new Error(\n this.options.noProjectHint ??\n \"No project specified and no default is configured (set MYNA_PROJECT or configure a default).\",\n );\n }\n return { ...resolved, project: resolved.project };\n }\n\n private clientFrom(apiUrl: string, token: string | undefined): ManagementClient {\n if (!token) {\n throw new Error(\"No credential available. Set MYNA_TOKEN or configure a token for the project.\");\n }\n const cacheKey = `${apiUrl}::${token}`;\n let client = this.clients.get(cacheKey);\n if (!client) {\n client = createManagementClient({ token, apiUrl });\n this.clients.set(cacheKey, client);\n }\n return client;\n }\n\n /** A management client bound to the resolved project's API + token. */\n clientFor(ref?: string): { client: ManagementClient; project: string; organization?: string } {\n const resolved = this.resolve(ref);\n return {\n client: this.clientFrom(resolved.apiUrl, resolved.token),\n project: resolved.project,\n organization: resolved.organization,\n };\n }\n\n /** A management client for an org-scoped call, where no project is required. */\n clientForOrg(ref?: string): { client: ManagementClient; organization?: string } {\n const resolved = this.resolveCredential(ref);\n return {\n client: this.clientFrom(resolved.apiUrl, resolved.token),\n organization: resolved.organization,\n };\n }\n\n /** Resolve an organization for org-scoped calls. */\n organizationFor(ref?: string, organizationOverride?: string): string {\n const resolved = this.resolveCredential(ref);\n const org = organizationOverride ?? resolved.organization;\n if (!org) throw new Error(\"No organization specified. Provide `organization` or configure one for the project.\");\n return org;\n }\n}\n\nfunction loadConfigFile(env: NodeJS.ProcessEnv): McpConfigFile {\n const explicit = env.MYNA_MCP_CONFIG;\n const candidates = [explicit, join(env.XDG_CONFIG_HOME ?? join(homedir(), \".config\"), \"myna\", \"mcp.json\")].filter(\n (v): v is string => Boolean(v),\n );\n for (const path of candidates) {\n try {\n return JSON.parse(readFileSync(path, \"utf8\")) as McpConfigFile;\n } catch {\n // Try next candidate.\n }\n }\n return {};\n}\n","import type { FieldErrorContract, ProblemDetailsContract } from \"../../api-contracts/src/common.js\";\n\n/**\n * Error thrown by both SDK clients when the API returns a non-2xx response.\n * Carries the parsed RFC 9457 problem-details document so callers can branch on\n * the stable `code`, inspect field-level `fields`, and surface the `requestId`.\n */\nexport class MynaApiError extends Error {\n /** HTTP status code. */\n readonly status: number;\n /** Stable machine-readable error code (e.g. `VALIDATION_FAILED`). */\n readonly code: string;\n /** RFC 9457 `type` URI. */\n readonly type: string | undefined;\n /** Human-facing title. */\n readonly title: string;\n /** Longer human-facing detail, when provided. */\n readonly detail: string | undefined;\n /** Server request id for support/correlation. */\n readonly requestId: string | undefined;\n /** Field-level validation errors, when present. */\n readonly fields: FieldErrorContract[] | undefined;\n /** The full parsed problem document (or a synthesized one). */\n readonly problem: ProblemDetailsContract;\n\n constructor(problem: ProblemDetailsContract) {\n super(problem.detail ?? problem.title ?? `Request failed (${problem.status})`);\n this.name = \"MynaApiError\";\n this.status = problem.status;\n this.code = problem.code;\n this.type = problem.type;\n this.title = problem.title;\n this.detail = problem.detail;\n this.requestId = problem.requestId;\n this.fields = problem.fields;\n this.problem = problem;\n Object.setPrototypeOf(this, MynaApiError.prototype);\n }\n\n static is(value: unknown): value is MynaApiError {\n return value instanceof MynaApiError;\n }\n}\n\n/** Type guard for `MynaApiError`. */\nexport function isMynaApiError(value: unknown): value is MynaApiError {\n return value instanceof MynaApiError;\n}\n\n/** Build a `MynaApiError` from an arbitrary response body and status. */\nexport function problemFromResponse(status: number, body: unknown, fallbackTitle: string): MynaApiError {\n if (body && typeof body === \"object\" && \"code\" in body && \"status\" in body) {\n return new MynaApiError(body as ProblemDetailsContract);\n }\n const detail =\n body && typeof body === \"object\" && \"error\" in body && typeof (body as { error: unknown }).error === \"string\"\n ? (body as { error: string }).error\n : typeof body === \"string\" && body\n ? body\n : undefined;\n return new MynaApiError({\n type: \"about:blank\",\n title: fallbackTitle,\n status,\n code: status >= 500 ? \"INTERNAL\" : \"REQUEST_FAILED\",\n detail,\n } as ProblemDetailsContract);\n}\n","import { problemFromResponse } from \"./errors.js\";\n\n/** A fetch-compatible function. */\nexport type FetchLike = (input: string, init?: RequestInit) => Promise<Response>;\n\nexport interface RetryOptions {\n /**\n * Maximum number of retries (in addition to the first attempt).\n * Defaults to 3 on a server and 1 in a browser — see `defaultMaxRetries`.\n */\n maxRetries?: number;\n /** Base backoff in milliseconds (exponential). Default 200. */\n baseDelayMs?: number;\n /** Cap on any single backoff. Default 5000. */\n maxDelayMs?: number;\n /**\n * Retries for transport-level failures (`fetch` rejecting outright).\n * Defaults to 1, and to 0 in a browser.\n *\n * In a browser these are usually permanent, not transient: a blocked CORS\n * response, a disallowed origin, an extension cancelling the request. They\n * are indistinguishable from a dropped connection — `fetch` rejects with an\n * opaque `TypeError` either way — so retrying converts one clear failure into\n * an identical wall of them, which is what buries the real cause.\n */\n maxNetworkRetries?: number;\n}\n\n/** Browsers get conservative retry defaults; servers keep the aggressive ones. */\nfunction inBrowser(): boolean {\n return typeof globalThis === \"object\" && \"document\" in globalThis;\n}\n\nfunction defaultMaxRetries(): number {\n return inBrowser() ? 1 : 3;\n}\n\nfunction defaultMaxNetworkRetries(): number {\n return inBrowser() ? 0 : 1;\n}\n\nexport interface HttpClientOptions {\n /** Base URL including the version prefix, e.g. `https://api.myna.sh/v1`. */\n baseUrl: string;\n /** Bearer credential (API key, preview token, or CLI token). */\n token?: string | undefined;\n /** Custom fetch implementation (browser/undici/node). */\n fetch?: FetchLike | undefined;\n /** Extra default headers merged into every request. */\n headers?: Record<string, string> | undefined;\n /** Retry policy. Retries apply to safe reads and idempotent mutations only. */\n retry?: RetryOptions | undefined;\n}\n\nexport interface RequestOptions {\n query?: Record<string, unknown> | undefined;\n body?: unknown;\n headers?: Record<string, string> | undefined;\n signal?: AbortSignal | undefined;\n /** Sending an idempotency key makes a mutation eligible for automatic retry. */\n idempotencyKey?: string | undefined;\n /** Override the bearer token for a single request (e.g. a preview token). */\n token?: string | undefined;\n}\n\nconst RETRYABLE_STATUS = new Set([408, 425, 429, 500, 502, 503, 504]);\nconst SAFE_METHODS = new Set([\"GET\", \"HEAD\", \"OPTIONS\"]);\n\nfunction resolveFetch(custom?: FetchLike): FetchLike {\n if (custom) return custom;\n if (typeof globalThis.fetch === \"function\") return globalThis.fetch.bind(globalThis) as FetchLike;\n throw new Error(\"No fetch implementation available. Pass `fetch` to the Myna client.\");\n}\n\n/** Serialize a query object, supporting nested `filter[field][op]` shapes. */\nexport function buildQuery(query: Record<string, unknown> | undefined): string {\n if (!query) return \"\";\n const params = new URLSearchParams();\n const append = (key: string, value: unknown): void => {\n if (value === undefined || value === null) return;\n if (Array.isArray(value)) {\n params.set(key, value.join(\",\"));\n return;\n }\n if (typeof value === \"object\") {\n for (const [op, v] of Object.entries(value as Record<string, unknown>)) {\n append(`${key}[${op}]`, v);\n }\n return;\n }\n params.set(key, String(value));\n };\n for (const [key, value] of Object.entries(query)) append(key, value);\n const qs = params.toString();\n return qs ? `?${qs}` : \"\";\n}\n\nfunction sleep(ms: number, signal?: AbortSignal): Promise<void> {\n return new Promise((resolve, reject) => {\n if (signal?.aborted) return reject(signal.reason ?? new Error(\"Aborted\"));\n const timer = setTimeout(resolve, ms);\n signal?.addEventListener(\n \"abort\",\n () => {\n clearTimeout(timer);\n reject(signal.reason ?? new Error(\"Aborted\"));\n },\n { once: true },\n );\n });\n}\n\nexport class HttpClient {\n private readonly baseUrl: string;\n private readonly token: string | undefined;\n private readonly fetchImpl: FetchLike;\n private readonly defaultHeaders: Record<string, string>;\n private readonly retry: Required<RetryOptions>;\n\n constructor(options: HttpClientOptions) {\n this.baseUrl = options.baseUrl.replace(/\\/+$/, \"\");\n this.token = options.token;\n this.fetchImpl = resolveFetch(options.fetch);\n this.defaultHeaders = options.headers ?? {};\n this.retry = {\n maxRetries: options.retry?.maxRetries ?? defaultMaxRetries(),\n baseDelayMs: options.retry?.baseDelayMs ?? 200,\n maxDelayMs: options.retry?.maxDelayMs ?? 5000,\n maxNetworkRetries: options.retry?.maxNetworkRetries ?? defaultMaxNetworkRetries(),\n };\n }\n\n /**\n * Share one in-flight request between identical concurrent safe reads.\n *\n * Several components asking for the same collection on first paint is the\n * normal shape of a page, not a mistake, and issuing N identical requests\n * multiplies both latency and any failure. Only GET/HEAD are pooled, and only\n * while in flight — this is request coalescing, not a cache.\n */\n private readonly inFlight = new Map<string, Promise<Response>>();\n\n private dedupe(key: string, run: () => Promise<Response>): Promise<Response> {\n const existing = this.inFlight.get(key);\n // Each caller needs its own Response: a body can only be read once.\n if (existing) return existing.then((response) => response.clone());\n const started = run();\n this.inFlight.set(key, started);\n const cleanup = (): void => {\n if (this.inFlight.get(key) === started) this.inFlight.delete(key);\n };\n started.then(cleanup, cleanup);\n return started.then((response) => response.clone());\n }\n\n /** Perform a request and unwrap the `{ data }` envelope. */\n async request<T>(method: string, path: string, options: RequestOptions = {}): Promise<T> {\n const raw = await this.requestRaw(method, path, options);\n if (raw.status === 204 || raw.status === 304) return undefined as T;\n const parsed = (await raw.json().catch(() => undefined)) as { data?: T } | undefined;\n return (parsed && \"data\" in parsed ? parsed.data : (parsed as unknown)) as T;\n }\n\n /** Perform a request and return the full parsed body (envelope included). */\n async requestEnvelope<T>(method: string, path: string, options: RequestOptions = {}): Promise<T> {\n const raw = await this.requestRaw(method, path, options);\n return (await raw.json().catch(() => ({}))) as T;\n }\n\n /** Low-level request with retries; throws `MynaApiError` on non-2xx. */\n async requestRaw(method: string, path: string, options: RequestOptions = {}): Promise<Response> {\n const url = `${this.baseUrl}${path}${buildQuery(options.query)}`;\n const headers: Record<string, string> = {\n accept: \"application/json\",\n ...this.defaultHeaders,\n ...options.headers,\n };\n const token = options.token ?? this.token;\n if (token) headers.authorization = `Bearer ${token}`;\n\n let payload: BodyInit | undefined;\n if (options.body !== undefined) {\n if (options.body instanceof Uint8Array || typeof options.body === \"string\") {\n payload = options.body as BodyInit;\n } else {\n headers[\"content-type\"] = \"application/json\";\n payload = JSON.stringify(options.body);\n }\n }\n if (options.idempotencyKey) headers[\"idempotency-key\"] = options.idempotencyKey;\n\n const upper = method.toUpperCase();\n const safe = SAFE_METHODS.has(upper);\n const idempotent = safe || Boolean(options.idempotencyKey);\n const init: RequestInit = { method, headers };\n if (payload !== undefined) init.body = payload;\n if (options.signal) init.signal = options.signal;\n\n // Coalesce identical concurrent safe reads. Requests carrying a signal opt\n // out: one caller aborting must not cancel another's request.\n if (safe && !options.signal && (upper === \"GET\" || upper === \"HEAD\")) {\n const key = `${upper} ${url} ${token ?? \"\"}`;\n return this.dedupe(key, () => this.attempt(url, init, idempotent, options));\n }\n return this.attempt(url, init, idempotent, options);\n }\n\n private async attempt(\n url: string,\n init: RequestInit,\n idempotent: boolean,\n options: RequestOptions,\n ): Promise<Response> {\n let attempt = 0;\n let networkAttempt = 0;\n for (;;) {\n let response: Response;\n try {\n response = await this.fetchImpl(url, init);\n } catch (error) {\n // A rejected fetch is a transport failure, budgeted separately from\n // HTTP-level retries: in a browser it is usually permanent (CORS, a\n // blocked request), and repeating it only multiplies the noise.\n if (\n idempotent &&\n networkAttempt < this.retry.maxNetworkRetries &&\n attempt < this.retry.maxRetries &&\n !isAbort(error)\n ) {\n await sleep(this.backoff(attempt), options.signal);\n attempt++;\n networkAttempt++;\n continue;\n }\n throw error;\n }\n\n if (response.ok) return response;\n\n if (idempotent && RETRYABLE_STATUS.has(response.status) && attempt < this.retry.maxRetries) {\n const retryAfter = retryAfterMs(response);\n await sleep(retryAfter ?? this.backoff(attempt), options.signal);\n attempt++;\n continue;\n }\n\n const body = await response.json().catch(() => undefined);\n throw problemFromResponse(response.status, body, response.statusText || \"Request failed\");\n }\n }\n\n private backoff(attempt: number): number {\n const base = Math.min(this.retry.baseDelayMs * 2 ** attempt, this.retry.maxDelayMs);\n return Math.round(base * (0.5 + Math.random() * 0.5));\n }\n}\n\nfunction retryAfterMs(response: Response): number | undefined {\n const header = response.headers.get(\"retry-after\");\n if (!header) return undefined;\n const seconds = Number(header);\n return Number.isFinite(seconds) ? seconds * 1000 : undefined;\n}\n\nfunction isAbort(error: unknown): boolean {\n return (\n error instanceof Error &&\n (error.name === \"AbortError\" || error.name === \"TimeoutError\")\n );\n}\n","import { createHash, randomUUID } from \"node:crypto\";\nimport { readFile } from \"node:fs/promises\";\nimport { basename } from \"node:path\";\nimport type {\n AcceptInvitationResponse,\n ApiKeyContract,\n CreateApiKeyRequest,\n CreateApiKeyResponse,\n CreateInvitationRequest,\n CreateOrganizationRequest,\n InvitationContract,\n MemberContract,\n OrganizationContract,\n UpdateMemberRequest,\n UpdateOrganizationRequest,\n} from \"../../api-contracts/src/organizations.js\";\nimport type { ActivityEventContract } from \"../../api-contracts/src/activity.js\";\nimport type {\n AssetContract,\n CompleteUploadResponse,\n CreateUploadRequest,\n CreateUploadResponse,\n ReplaceAssetRequest,\n UpdateAssetRequest,\n} from \"../../api-contracts/src/assets.js\";\nimport type {\n BillingResponse,\n CheckoutRequest,\n CheckoutResponse,\n PortalResponse,\n} from \"../../api-contracts/src/billing.js\";\nimport type {\n ChangeSetCheckContract,\n ChangeSetCommentContract,\n ChangeSetContract,\n ChangeSetReviewContract,\n CreateChangeSetCommentRequest,\n CreateChangeSetRequest,\n RequestReviewRequest,\n ReviewDecisionRequest,\n RunChecksResponse,\n UpdateChangeSetRequest,\n} from \"../../api-contracts/src/change-sets.js\";\nimport type {\n CollectionContract,\n CollectionVersionContract,\n SchemaDiffResponse,\n SchemaDriftResponse,\n SchemaPushResponse,\n} from \"../../api-contracts/src/collections.js\";\nimport type {\n BulkEntriesRequest,\n BulkEntriesResponse,\n EntryContract,\n EntryReferencesResponse,\n ImportEntriesRequest,\n ImportEntriesResponse,\n ReorderEntriesRequest,\n ReorderEntriesResponse,\n RestoreRevisionResponse,\n RevisionContract,\n} from \"../../api-contracts/src/entries.js\";\nimport type { CreatePreviewRequest, PreviewContract } from \"../../api-contracts/src/previews.js\";\nimport type {\n CorsCheckResponse,\n CreateProjectRequest,\n CreateSavedViewRequest,\n ProjectContract,\n ProjectExportResponse,\n SavedViewContract,\n UpdateProjectRequest,\n} from \"../../api-contracts/src/projects.js\";\nimport type { UsageResponse } from \"../../api-contracts/src/usage.js\";\nimport type {\n CreateWebhookRequest,\n CreateWebhookResponse,\n UpdateWebhookRequest,\n WebhookDeliveryContract,\n WebhookEndpointContract,\n} from \"../../api-contracts/src/webhooks.js\";\nimport { HttpClient, type FetchLike, type RetryOptions } from \"./http.js\";\n\nconst DEFAULT_API_URL = \"https://api.myna.sh\";\n\nexport interface ManagementClientOptions {\n /** Management/CLI credential (`myna_sk_...`). */\n token: string;\n /** API origin. Defaults to `https://api.myna.sh`. */\n apiUrl?: string;\n fetch?: FetchLike;\n retry?: RetryOptions;\n /**\n * Idempotency-key factory for mutations. Defaults to a random UUID per call.\n * Pass a stable value to make a specific mutation replay-safe.\n */\n idempotencyKey?: () => string;\n}\n\nexport interface ListOptions {\n limit?: number;\n cursor?: string;\n signal?: AbortSignal;\n}\n\nexport interface Page<T> {\n data: T[];\n nextCursor: string | null;\n}\n\nexport interface UploadAssetMeta {\n filename?: string;\n contentType?: string;\n /** Override the automatically detected byte length. */\n byteSize?: number;\n}\n\n/** Bytes or a filesystem path accepted by `uploadAsset`. */\nexport type AssetInput = string | Uint8Array | ArrayBuffer;\n\n/**\n * Server-only management client (SPEC 12). Typed wrappers over the full\n * management API surface. Mutations automatically carry an `Idempotency-Key`.\n */\nexport class ManagementClient {\n private readonly http: HttpClient;\n private readonly newIdempotencyKey: () => string;\n private readonly fetchImpl: FetchLike;\n\n constructor(options: ManagementClientOptions) {\n if (!options.token) throw new Error(\"createManagementClient: `token` is required.\");\n this.newIdempotencyKey = options.idempotencyKey ?? (() => randomUUID());\n this.fetchImpl = options.fetch ?? ((input, init) => fetch(input, init));\n this.http = new HttpClient({\n baseUrl: `${(options.apiUrl ?? DEFAULT_API_URL).replace(/\\/+$/, \"\")}/v1`,\n token: options.token,\n fetch: options.fetch,\n retry: options.retry,\n });\n }\n\n // Convenience: idempotency key for a mutation.\n private idem(): string {\n return this.newIdempotencyKey();\n }\n\n private get<T>(path: string, query?: Record<string, unknown>, signal?: AbortSignal): Promise<T> {\n return this.http.request<T>(\"GET\", path, { query, signal });\n }\n\n /**\n * Paged GET. Extra filters are merged into the query rather than appended to\n * the path: the client builds its own query string from `options.query`, so a\n * path that already carries one produces `?a=1?limit=25` — a second `?` that\n * silently becomes part of the previous value.\n */\n private async page<T>(\n path: string,\n opts: ListOptions = {},\n filters: Record<string, unknown> = {},\n ): Promise<Page<T>> {\n const body = await this.http.requestEnvelope<{ data: T[]; pagination: { nextCursor: string | null } }>(\n \"GET\",\n path,\n { query: { ...filters, limit: opts.limit, cursor: opts.cursor }, signal: opts.signal },\n );\n return { data: body.data, nextCursor: body.pagination?.nextCursor ?? null };\n }\n\n private mutate<T>(method: string, path: string, body?: unknown, query?: Record<string, unknown>): Promise<T> {\n return this.http.request<T>(method, path, { body, query, idempotencyKey: this.idem() });\n }\n\n // --- Organizations --------------------------------------------------------\n readonly organizations = {\n list: (signal?: AbortSignal): Promise<OrganizationContract[]> =>\n this.get<OrganizationContract[]>(\"/organizations\", undefined, signal),\n create: (body: CreateOrganizationRequest): Promise<OrganizationContract> =>\n this.mutate<OrganizationContract>(\"POST\", \"/organizations\", body),\n get: (organization: string, signal?: AbortSignal): Promise<OrganizationContract> =>\n this.get<OrganizationContract>(`/organizations/${enc(organization)}`, undefined, signal),\n update: (organization: string, body: UpdateOrganizationRequest): Promise<OrganizationContract> =>\n this.mutate<OrganizationContract>(\"PATCH\", `/organizations/${enc(organization)}`, body),\n delete: (organization: string): Promise<{ ok: boolean; recoverableForDays: number }> =>\n this.mutate(\"DELETE\", `/organizations/${enc(organization)}`),\n export: (organization: string): Promise<{ jobId: string; storageKey: string; downloadUrl: string; ready: boolean }> =>\n this.mutate(\"POST\", `/organizations/${enc(organization)}/export`),\n usage: (organization: string, signal?: AbortSignal): Promise<UsageResponse> =>\n this.get<UsageResponse>(`/organizations/${enc(organization)}/usage`, undefined, signal),\n };\n\n // --- Members & invitations ------------------------------------------------\n readonly members = {\n list: (organization: string, signal?: AbortSignal): Promise<MemberContract[]> =>\n this.get<MemberContract[]>(`/organizations/${enc(organization)}/members`, undefined, signal),\n update: (organization: string, user: string, body: UpdateMemberRequest): Promise<{ ok: boolean }> =>\n this.mutate(\"PATCH\", `/organizations/${enc(organization)}/members/${enc(user)}`, body),\n remove: (organization: string, user: string): Promise<{ ok: boolean }> =>\n this.mutate(\"DELETE\", `/organizations/${enc(organization)}/members/${enc(user)}`),\n };\n\n readonly invitations = {\n list: (organization: string, signal?: AbortSignal): Promise<InvitationContract[]> =>\n this.get<InvitationContract[]>(`/organizations/${enc(organization)}/invitations`, undefined, signal),\n create: (organization: string, body: CreateInvitationRequest): Promise<InvitationContract> =>\n this.mutate<InvitationContract>(\"POST\", `/organizations/${enc(organization)}/invitations`, body),\n revoke: (organization: string, invitation: string): Promise<{ ok: boolean }> =>\n this.mutate(\"DELETE\", `/organizations/${enc(organization)}/invitations/${enc(invitation)}`),\n accept: (token: string): Promise<AcceptInvitationResponse> =>\n this.mutate<AcceptInvitationResponse>(\"POST\", `/invitations/${enc(token)}/accept`),\n };\n\n // --- Projects -------------------------------------------------------------\n readonly projects = {\n list: (organization: string, signal?: AbortSignal): Promise<ProjectContract[]> =>\n this.get<ProjectContract[]>(`/organizations/${enc(organization)}/projects`, undefined, signal),\n create: (organization: string, body: CreateProjectRequest): Promise<ProjectContract> =>\n this.mutate<ProjectContract>(\"POST\", `/organizations/${enc(organization)}/projects`, body),\n get: (project: string, signal?: AbortSignal): Promise<ProjectContract> =>\n this.get<ProjectContract>(`/projects/${enc(project)}`, undefined, signal),\n update: (project: string, body: UpdateProjectRequest): Promise<ProjectContract> =>\n this.mutate<ProjectContract>(\"PATCH\", `/projects/${enc(project)}`, body),\n archive: (project: string): Promise<ProjectContract> =>\n this.mutate<ProjectContract>(\"POST\", `/projects/${enc(project)}/archive`),\n /** Full project export: schemas, entries (draft + published), asset metadata. */\n export: (project: string, signal?: AbortSignal): Promise<ProjectExportResponse> =>\n this.get<ProjectExportResponse>(`/projects/${enc(project)}/export`, undefined, signal),\n /** Why a browser at `origin` can or cannot read this project's content. */\n corsCheck: (\n project: string,\n origin: string,\n collection?: string,\n signal?: AbortSignal,\n ): Promise<CorsCheckResponse> =>\n this.get<CorsCheckResponse>(\n `/projects/${enc(project)}/cors-check`,\n collection ? { origin, collection } : { origin },\n signal,\n ),\n views: (project: string, signal?: AbortSignal): Promise<SavedViewContract[]> =>\n this.get<SavedViewContract[]>(`/projects/${enc(project)}/views`, undefined, signal),\n createView: (project: string, body: CreateSavedViewRequest): Promise<SavedViewContract> =>\n this.mutate<SavedViewContract>(\"POST\", `/projects/${enc(project)}/views`, body),\n deleteView: (project: string, view: string): Promise<{ ok: boolean }> =>\n this.mutate(\"DELETE\", `/projects/${enc(project)}/views/${enc(view)}`),\n };\n\n // --- Schema ---------------------------------------------------------------\n readonly schema = {\n collections: (project: string, signal?: AbortSignal): Promise<CollectionContract[]> =>\n this.get<CollectionContract[]>(`/projects/${enc(project)}/collections`, undefined, signal),\n collection: (project: string, key: string, signal?: AbortSignal): Promise<CollectionContract> =>\n this.get<CollectionContract>(`/projects/${enc(project)}/collections/${enc(key)}`, undefined, signal),\n versions: (project: string, key: string, signal?: AbortSignal): Promise<CollectionVersionContract[]> =>\n this.get<CollectionVersionContract[]>(`/projects/${enc(project)}/collections/${enc(key)}/versions`, undefined, signal),\n diff: (project: string, collections: Record<string, unknown>[]): Promise<SchemaDiffResponse> =>\n this.mutate<SchemaDiffResponse>(\"POST\", `/projects/${enc(project)}/schema/diff`, { collections }),\n push: (\n project: string,\n collections: Record<string, unknown>[],\n opts: { allowDestructive?: boolean; changeSummary?: string } = {},\n ): Promise<SchemaPushResponse> =>\n this.mutate<SchemaPushResponse>(\"POST\", `/projects/${enc(project)}/schema/push`, {\n collections,\n allowDestructive: opts.allowDestructive ?? false,\n changeSummary: opts.changeSummary,\n }),\n // Environments as projects\n drift: (project: string, against: string, signal?: AbortSignal): Promise<SchemaDriftResponse> =>\n this.get<SchemaDriftResponse>(`/projects/${enc(project)}/schema/drift`, { against }, signal),\n promote: (\n project: string,\n fromProject: string,\n opts: { allowDestructive?: boolean } = {},\n ): Promise<SchemaPushResponse> =>\n this.mutate<SchemaPushResponse>(\"POST\", `/projects/${enc(project)}/schema/promote`, {\n fromProject,\n allowDestructive: opts.allowDestructive ?? false,\n confirm: true,\n }),\n };\n\n // --- Entries & revisions --------------------------------------------------\n readonly entries = {\n list: (\n project: string,\n opts: ListOptions & { collection?: string; status?: string } = {},\n ): Promise<Page<EntryContract>> =>\n this.page<EntryContract>(`/projects/${enc(project)}/entries`, opts, {\n collection: opts.collection,\n status: opts.status,\n }),\n create: (\n project: string,\n body: { collection: string; slug?: string; data: Record<string, unknown>; changeSetId?: string; changeSummary?: string },\n ): Promise<EntryContract> => this.mutate<EntryContract>(\"POST\", `/projects/${enc(project)}/entries`, body),\n get: (project: string, entry: string, signal?: AbortSignal): Promise<EntryContract> =>\n this.get<EntryContract>(`/projects/${enc(project)}/entries/${enc(entry)}`, undefined, signal),\n update: (\n project: string,\n entry: string,\n body: {\n data?: Record<string, unknown>;\n slug?: string;\n expectedRevisionId?: string;\n changeSetId?: string;\n changeSummary?: string;\n },\n ): Promise<EntryContract> => this.mutate<EntryContract>(\"PATCH\", `/projects/${enc(project)}/entries/${enc(entry)}`, body),\n delete: (project: string, entry: string, changeSetId?: string): Promise<{ changeSetId: string; staged: string }> =>\n this.mutate(\"DELETE\", `/projects/${enc(project)}/entries/${enc(entry)}`, undefined, { changeSetId }),\n unpublish: (project: string, entry: string, changeSetId?: string): Promise<{ changeSetId: string; staged: string }> =>\n this.mutate(\"POST\", `/projects/${enc(project)}/entries/${enc(entry)}/unpublish`, undefined, { changeSetId }),\n restore: (project: string, entry: string): Promise<RestoreRevisionResponse> =>\n this.mutate<RestoreRevisionResponse>(\"POST\", `/projects/${enc(project)}/entries/${enc(entry)}/restore`),\n duplicate: (project: string, entry: string, changeSetId?: string): Promise<EntryContract> =>\n this.mutate<EntryContract>(\"POST\", `/projects/${enc(project)}/entries/${enc(entry)}/duplicate`, {\n changeSetId,\n }),\n bulk: (project: string, body: BulkEntriesRequest): Promise<BulkEntriesResponse> =>\n this.mutate<BulkEntriesResponse>(\"POST\", `/projects/${enc(project)}/entries/bulk`, body),\n /**\n * Set a collection's editorial order. Not staged on a change set — ranks\n * are arrangement rather than content and take effect immediately, which\n * is why `confirm` is required.\n */\n reorder: (\n project: string,\n collection: string,\n body: Omit<ReorderEntriesRequest, \"confirm\">,\n ): Promise<ReorderEntriesResponse> =>\n this.mutate<ReorderEntriesResponse>(\n \"POST\",\n `/projects/${enc(project)}/collections/${enc(collection)}/reorder`,\n { ...body, confirm: true },\n ),\n import: (project: string, body: ImportEntriesRequest): Promise<ImportEntriesResponse> =>\n this.mutate<ImportEntriesResponse>(\"POST\", `/projects/${enc(project)}/entries/import`, body),\n references: (project: string, entry: string, signal?: AbortSignal): Promise<EntryReferencesResponse> =>\n this.get<EntryReferencesResponse>(`/projects/${enc(project)}/entries/${enc(entry)}/references`, undefined, signal),\n revisions: (project: string, entry: string, signal?: AbortSignal): Promise<RevisionContract[]> =>\n this.get<RevisionContract[]>(`/projects/${enc(project)}/entries/${enc(entry)}/revisions`, undefined, signal),\n revision: (project: string, entry: string, revision: string, signal?: AbortSignal): Promise<RevisionContract> =>\n this.get<RevisionContract>(`/projects/${enc(project)}/entries/${enc(entry)}/revisions/${enc(revision)}`, undefined, signal),\n restoreRevision: (project: string, entry: string, revision: string): Promise<RestoreRevisionResponse> =>\n this.mutate<RestoreRevisionResponse>(\n \"POST\",\n `/projects/${enc(project)}/entries/${enc(entry)}/revisions/${enc(revision)}/restore`,\n ),\n };\n\n // --- Change sets ----------------------------------------------------------\n readonly changeSets = {\n list: (project: string, opts: ListOptions & { status?: string } = {}): Promise<Page<ChangeSetContract>> =>\n this.page<ChangeSetContract>(`/projects/${enc(project)}/change-sets`, opts, { status: opts.status }),\n create: (project: string, body: CreateChangeSetRequest): Promise<ChangeSetContract> =>\n this.mutate<ChangeSetContract>(\"POST\", `/projects/${enc(project)}/change-sets`, body),\n get: (project: string, changeSet: string, signal?: AbortSignal): Promise<ChangeSetContract> =>\n this.get<ChangeSetContract>(`/projects/${enc(project)}/change-sets/${enc(changeSet)}`, undefined, signal),\n update: (project: string, changeSet: string, body: UpdateChangeSetRequest): Promise<ChangeSetContract> =>\n this.mutate<ChangeSetContract>(\"PATCH\", `/projects/${enc(project)}/change-sets/${enc(changeSet)}`, body),\n validate: (project: string, changeSet: string): Promise<{ valid: boolean; errors: ValidationIssue[] }> =>\n this.mutate(\"POST\", `/projects/${enc(project)}/change-sets/${enc(changeSet)}/validate`),\n publish: (\n project: string,\n changeSet: string,\n ): Promise<{ changeSet: ChangeSetContract; publishedEntryIds: string[] }> =>\n this.mutate(\"POST\", `/projects/${enc(project)}/change-sets/${enc(changeSet)}/publish`, { confirm: true }),\n close: (project: string, changeSet: string): Promise<ChangeSetContract> =>\n this.mutate<ChangeSetContract>(\"POST\", `/projects/${enc(project)}/change-sets/${enc(changeSet)}/close`),\n // Scheduled publishing\n schedule: (project: string, changeSet: string, publishAt: string): Promise<ChangeSetContract> =>\n this.mutate<ChangeSetContract>(\"POST\", `/projects/${enc(project)}/change-sets/${enc(changeSet)}/schedule`, {\n publishAt,\n }),\n cancelSchedule: (project: string, changeSet: string): Promise<ChangeSetContract> =>\n this.mutate<ChangeSetContract>(\"DELETE\", `/projects/${enc(project)}/change-sets/${enc(changeSet)}/schedule`),\n // Reviews & approvals\n reviews: (project: string, changeSet: string, signal?: AbortSignal): Promise<ChangeSetReviewContract[]> =>\n this.get<ChangeSetReviewContract[]>(\n `/projects/${enc(project)}/change-sets/${enc(changeSet)}/reviews`,\n undefined,\n signal,\n ),\n requestReview: (project: string, changeSet: string, body: RequestReviewRequest): Promise<ChangeSetReviewContract[]> =>\n this.mutate<ChangeSetReviewContract[]>(\"POST\", `/projects/${enc(project)}/change-sets/${enc(changeSet)}/reviews`, body),\n removeReviewer: (project: string, changeSet: string, reviewer: string): Promise<ChangeSetReviewContract[]> =>\n this.mutate<ChangeSetReviewContract[]>(\n \"DELETE\",\n `/projects/${enc(project)}/change-sets/${enc(changeSet)}/reviews/${enc(reviewer)}`,\n ),\n approve: (project: string, changeSet: string, body: ReviewDecisionRequest = {}): Promise<ChangeSetReviewContract[]> =>\n this.mutate<ChangeSetReviewContract[]>(\"POST\", `/projects/${enc(project)}/change-sets/${enc(changeSet)}/approve`, body),\n requestChanges: (project: string, changeSet: string, body: ReviewDecisionRequest = {}): Promise<ChangeSetReviewContract[]> =>\n this.mutate<ChangeSetReviewContract[]>(\n \"POST\",\n `/projects/${enc(project)}/change-sets/${enc(changeSet)}/request-changes`,\n body,\n ),\n // Comments\n comments: (project: string, changeSet: string, signal?: AbortSignal): Promise<ChangeSetCommentContract[]> =>\n this.get<ChangeSetCommentContract[]>(\n `/projects/${enc(project)}/change-sets/${enc(changeSet)}/comments`,\n undefined,\n signal,\n ),\n comment: (project: string, changeSet: string, body: CreateChangeSetCommentRequest): Promise<ChangeSetCommentContract> =>\n this.mutate<ChangeSetCommentContract>(\"POST\", `/projects/${enc(project)}/change-sets/${enc(changeSet)}/comments`, body),\n resolveComment: (project: string, changeSet: string, comment: string, resolved = true): Promise<ChangeSetCommentContract> =>\n this.mutate<ChangeSetCommentContract>(\n \"PATCH\",\n `/projects/${enc(project)}/change-sets/${enc(changeSet)}/comments/${enc(comment)}`,\n { resolved },\n ),\n // Automated checks\n checks: (project: string, changeSet: string, signal?: AbortSignal): Promise<ChangeSetCheckContract[]> =>\n this.get<ChangeSetCheckContract[]>(\n `/projects/${enc(project)}/change-sets/${enc(changeSet)}/checks`,\n undefined,\n signal,\n ),\n runChecks: (project: string, changeSet: string): Promise<RunChecksResponse> =>\n this.mutate<RunChecksResponse>(\"POST\", `/projects/${enc(project)}/change-sets/${enc(changeSet)}/checks/run`),\n };\n\n // --- Previews -------------------------------------------------------------\n readonly previews = {\n create: (project: string, body: CreatePreviewRequest): Promise<PreviewContract> =>\n this.mutate<PreviewContract>(\"POST\", `/projects/${enc(project)}/previews`, body),\n list: (project: string, signal?: AbortSignal): Promise<PreviewContract[]> =>\n this.get<PreviewContract[]>(`/projects/${enc(project)}/previews`, undefined, signal),\n revoke: (project: string, preview: string): Promise<{ ok: boolean }> =>\n this.mutate(\"DELETE\", `/projects/${enc(project)}/previews/${enc(preview)}`),\n };\n\n // --- Assets ---------------------------------------------------------------\n readonly assets = {\n createUpload: (project: string, body: CreateUploadRequest): Promise<CreateUploadResponse> =>\n this.mutate<CreateUploadResponse>(\"POST\", `/projects/${enc(project)}/assets/uploads`, body),\n completeUpload: (project: string, upload: string): Promise<AssetContract> =>\n this.mutate<CompleteUploadResponse>(\"POST\", `/projects/${enc(project)}/assets/uploads/${enc(upload)}/complete`).then(\n (r) => r.asset,\n ),\n list: (project: string, opts: ListOptions = {}): Promise<Page<AssetContract>> =>\n this.page<AssetContract>(`/projects/${enc(project)}/assets`, opts),\n get: (project: string, asset: string, signal?: AbortSignal): Promise<AssetContract> =>\n this.get<AssetContract>(`/projects/${enc(project)}/assets/${enc(asset)}`, undefined, signal),\n usage: (project: string, asset: string, signal?: AbortSignal): Promise<{ asset: AssetContract; usage: { entryIds: string[] } }> =>\n this.get(`/projects/${enc(project)}/assets/${enc(asset)}`, { usage: \"true\" }, signal),\n update: (project: string, asset: string, body: UpdateAssetRequest): Promise<AssetContract> =>\n this.mutate<AssetContract>(\"PATCH\", `/projects/${enc(project)}/assets/${enc(asset)}`, body),\n replace: (project: string, asset: string, body: ReplaceAssetRequest): Promise<AssetContract> =>\n this.mutate<AssetContract>(\"POST\", `/projects/${enc(project)}/assets/${enc(asset)}/replace`, body),\n delete: (project: string, asset: string): Promise<{ ok: boolean }> =>\n this.mutate(\"DELETE\", `/projects/${enc(project)}/assets/${enc(asset)}`),\n /** Full presigned upload flow: create → PUT bytes → complete. */\n upload: (project: string, input: AssetInput, meta: UploadAssetMeta = {}): Promise<AssetContract> =>\n this.uploadAsset(project, input, meta),\n };\n\n // --- API keys -------------------------------------------------------------\n readonly apiKeys = {\n listForOrganization: (organization: string, signal?: AbortSignal): Promise<ApiKeyContract[]> =>\n this.get<ApiKeyContract[]>(`/organizations/${enc(organization)}/api-keys`, undefined, signal),\n createForOrganization: (organization: string, body: CreateApiKeyRequest): Promise<CreateApiKeyResponse> =>\n this.mutate<CreateApiKeyResponse>(\"POST\", `/organizations/${enc(organization)}/api-keys`, body),\n revokeForOrganization: (organization: string, key: string): Promise<{ ok: boolean }> =>\n this.mutate(\"DELETE\", `/organizations/${enc(organization)}/api-keys/${enc(key)}`),\n listForProject: (project: string, signal?: AbortSignal): Promise<ApiKeyContract[]> =>\n this.get<ApiKeyContract[]>(`/projects/${enc(project)}/api-keys`, undefined, signal),\n createForProject: (project: string, body: CreateApiKeyRequest): Promise<CreateApiKeyResponse> =>\n this.mutate<CreateApiKeyResponse>(\"POST\", `/projects/${enc(project)}/api-keys`, body),\n revokeForProject: (project: string, key: string): Promise<{ ok: boolean }> =>\n this.mutate(\"DELETE\", `/projects/${enc(project)}/api-keys/${enc(key)}`),\n };\n\n // --- Webhooks -------------------------------------------------------------\n readonly webhooks = {\n list: (project: string, signal?: AbortSignal): Promise<WebhookEndpointContract[]> =>\n this.get<WebhookEndpointContract[]>(`/projects/${enc(project)}/webhooks`, undefined, signal),\n create: (project: string, body: CreateWebhookRequest): Promise<CreateWebhookResponse> =>\n this.mutate<CreateWebhookResponse>(\"POST\", `/projects/${enc(project)}/webhooks`, body),\n update: (project: string, webhook: string, body: UpdateWebhookRequest): Promise<WebhookEndpointContract> =>\n this.mutate<WebhookEndpointContract>(\"PATCH\", `/projects/${enc(project)}/webhooks/${enc(webhook)}`, body),\n delete: (project: string, webhook: string): Promise<{ ok: boolean }> =>\n this.mutate(\"DELETE\", `/projects/${enc(project)}/webhooks/${enc(webhook)}`),\n deliveries: (project: string, webhook: string, signal?: AbortSignal): Promise<WebhookDeliveryContract[]> =>\n this.get<WebhookDeliveryContract[]>(`/projects/${enc(project)}/webhooks/${enc(webhook)}/deliveries`, undefined, signal),\n retry: (project: string, webhook: string, delivery: string): Promise<{ ok: boolean }> =>\n this.mutate(\"POST\", `/projects/${enc(project)}/webhooks/${enc(webhook)}/deliveries/${enc(delivery)}/retry`),\n };\n\n // --- Activity -------------------------------------------------------------\n activity(\n project: string,\n opts: ListOptions & { actorType?: string; action?: string; targetType?: string; from?: string; to?: string } = {},\n ): Promise<Page<ActivityEventContract>> {\n return this.page<ActivityEventContract>(`/projects/${enc(project)}/activity`, opts, {\n actorType: opts.actorType,\n action: opts.action,\n targetType: opts.targetType,\n from: opts.from,\n to: opts.to,\n });\n }\n\n // --- Billing --------------------------------------------------------------\n readonly billing = {\n status: (organization: string, signal?: AbortSignal): Promise<BillingResponse> =>\n this.get<BillingResponse>(`/organizations/${enc(organization)}/billing`, undefined, signal),\n checkout: (organization: string, body: CheckoutRequest): Promise<CheckoutResponse> =>\n this.mutate<CheckoutResponse>(\"POST\", `/organizations/${enc(organization)}/billing/checkout`, body),\n portal: (organization: string): Promise<PortalResponse> =>\n this.mutate<PortalResponse>(\"POST\", `/organizations/${enc(organization)}/billing/portal`),\n };\n\n // --- Upload helper --------------------------------------------------------\n private async uploadAsset(project: string, input: AssetInput, meta: UploadAssetMeta): Promise<AssetContract> {\n const { bytes, filename } = await readInput(input, meta.filename);\n const contentType = meta.contentType ?? guessContentType(filename);\n const checksum = createHash(\"md5\").update(bytes).digest(\"hex\");\n\n const upload = await this.assets.createUpload(project, {\n filename,\n contentType,\n byteSize: meta.byteSize ?? bytes.byteLength,\n checksum,\n });\n\n // The presigned URL is absolute (storage host) and must bypass the API base.\n const put = await this.fetchImpl(upload.url, {\n method: upload.method,\n headers: upload.headers,\n body: bytes as unknown as BodyInit,\n });\n if (!put.ok) {\n throw new Error(`Asset upload PUT failed with status ${put.status}.`);\n }\n\n return this.assets.completeUpload(project, upload.uploadId);\n }\n}\n\ninterface ValidationIssue {\n resourceType: string;\n resourceId: string;\n path: string;\n message: string;\n code?: string;\n}\n\nasync function readInput(input: AssetInput, filenameOverride?: string): Promise<{ bytes: Uint8Array; filename: string }> {\n if (typeof input === \"string\") {\n const bytes = await readFile(input);\n return { bytes: new Uint8Array(bytes), filename: filenameOverride ?? basename(input) };\n }\n const bytes = input instanceof Uint8Array ? input : new Uint8Array(input);\n return { bytes, filename: filenameOverride ?? \"upload.bin\" };\n}\n\nconst CONTENT_TYPES: Record<string, string> = {\n png: \"image/png\",\n jpg: \"image/jpeg\",\n jpeg: \"image/jpeg\",\n gif: \"image/gif\",\n webp: \"image/webp\",\n avif: \"image/avif\",\n pdf: \"application/pdf\",\n json: \"application/json\",\n txt: \"text/plain\",\n md: \"text/markdown\",\n csv: \"text/csv\",\n mp4: \"video/mp4\",\n webm: \"video/webm\",\n mp3: \"audio/mpeg\",\n wav: \"audio/wav\",\n};\n\nfunction guessContentType(filename: string): string {\n const ext = filename.split(\".\").pop()?.toLowerCase() ?? \"\";\n return CONTENT_TYPES[ext] ?? \"application/octet-stream\";\n}\n\nfunction enc(segment: string): string {\n return encodeURIComponent(segment);\n}\n\n/** Create a management client. */\nexport function createManagementClient(options: ManagementClientOptions): ManagementClient {\n return new ManagementClient(options);\n}\n\nexport { generateTypes, generateTypesModule } from \"./codegen.js\";\nexport { MynaApiError, isMynaApiError } from \"./errors.js\";\nexport type { FetchLike, RetryOptions } from \"./http.js\";\n","import type {\n CollectionSchema,\n FieldDef,\n ListItem,\n ObjectField,\n} from \"../../schema/src/types.js\";\n\n/**\n * Deterministic TypeScript type generation from canonical collection schemas\n * (SPEC 12). Pure and stable: the same input always yields byte-identical\n * output, and no user-written files are touched. Consumed by `myna types\n * generate`.\n */\nexport function generateTypes(collections: CollectionSchema[]): string {\n const sorted = [...collections].sort((a, b) => a.name.localeCompare(b.name));\n const blocks: string[] = [];\n\n for (const collection of sorted) {\n blocks.push(renderInterface(collection));\n }\n\n const registry = sorted.map((c) => registryEntry(c)).join(\"\\n\");\n\n const header = [\n \"// Generated by `myna types generate`. Do not edit by hand.\",\n \"// This file is safe to commit and regenerate.\",\n \"\",\n ].join(\"\\n\");\n\n return `${header}${blocks.join(\"\\n\\n\")}\\n\\n${REGISTRY_DOC}\\nexport interface MynaCollections {\\n${registry}\\n}\\n`;\n}\n\nconst REGISTRY_DOC = [\n \"/**\",\n \" * Collection registry consumed by `createMyna<MynaCollections>()`.\",\n \" *\",\n \" * `fields` types the entry payload; `sortable` and `reference` carry the\",\n \" * distinctions the field types alone cannot express — a markdown body and a\",\n \" * text title are both `string`, but only one of them can be ordered on.\",\n \" */\",\n].join(\"\\n\");\n\n/**\n * Fields the query engine can order and filter by: scalars, excluding localized\n * fields, which hold one value per locale rather than a comparable value. This\n * mirrors `SCALAR_TYPES` in the API's public content service; the two must agree\n * or the types will promise a query the server rejects.\n */\nconst SORTABLE_TYPES = new Set([\"text\", \"number\", \"boolean\", \"date\", \"datetime\", \"slug\"]);\n\nfunction registryEntry(collection: CollectionSchema): string {\n const sortable = collection.fields\n .filter((f) => SORTABLE_TYPES.has(f.type) && !f.localized)\n .map((f) => JSON.stringify(f.key));\n const references = collection.fields\n .filter((f) => f.type === \"reference\")\n .map((f) => JSON.stringify(f.key));\n return [\n ` ${JSON.stringify(collection.name)}: {`,\n ` fields: ${pascal(collection.name)};`,\n ` sortable: ${sortable.length > 0 ? sortable.join(\" | \") : \"never\"};`,\n ` reference: ${references.length > 0 ? references.join(\" | \") : \"never\"};`,\n ` };`,\n ].join(\"\\n\");\n}\n\nfunction renderInterface(collection: CollectionSchema): string {\n const name = pascal(collection.name);\n const lines = collection.fields.map((f) => renderField(f, 1));\n const label = collection.label ? ` ${collection.label}` : \"\";\n return `/**${label} (${collection.kind}) */\\nexport interface ${name} {\\n${lines.join(\"\\n\")}\\n}`;\n}\n\nfunction renderField(field: FieldDef, depth: number): string {\n const indent = \" \".repeat(depth);\n const optional = field.required ? \"\" : \"?\";\n const doc = field.description ? `${indent}/** ${escapeComment(field.description)} */\\n` : \"\";\n const base = fieldType(field, depth);\n // Localized fields store one value per project locale.\n const type = field.localized ? `{ [locale: string]: ${base} }` : base;\n return `${doc}${indent}${safeKey(field.key)}${optional}: ${type};`;\n}\n\nfunction fieldType(field: FieldDef, depth: number): string {\n switch (field.type) {\n case \"text\":\n return field.enum && field.enum.length > 0 ? field.enum.map((v) => JSON.stringify(v)).join(\" | \") : \"string\";\n case \"slug\":\n return \"string\";\n case \"markdown\":\n return \"string\";\n case \"number\":\n return \"number\";\n case \"boolean\":\n return \"boolean\";\n case \"date\":\n case \"datetime\":\n return \"string\";\n case \"json\":\n return \"JsonValue\";\n case \"asset\":\n return field.multiple ? \"string[]\" : \"string\";\n case \"reference\":\n return field.multiple ? \"string[]\" : \"string\";\n case \"object\":\n return renderObject(field, depth);\n case \"list\":\n return `${listItemType(field.item, depth)}[]`;\n case \"richText\":\n return \"RichTextDoc\";\n case \"blocks\": {\n // Discriminated union over the allowed block components.\n const inner = \" \".repeat(depth + 1);\n const options = field.blocks.map((b) => {\n const lines = b.fields.map((f) => renderField(f, depth + 2));\n return `{ type: ${JSON.stringify(b.key)}; fields: {\\n${lines.join(\"\\n\")}\\n${inner}} }`;\n });\n return `Array<\\n${inner}${options.join(`\\n${inner}| `)}\\n${\" \".repeat(depth)}>`;\n }\n default:\n return \"unknown\";\n }\n}\n\nfunction renderObject(field: ObjectField, depth: number): string {\n const lines = field.fields.map((f) => renderField(f, depth + 1));\n const closingIndent = \" \".repeat(depth);\n return `{\\n${lines.join(\"\\n\")}\\n${closingIndent}}`;\n}\n\nfunction listItemType(item: ListItem, depth: number): string {\n switch (item.kind) {\n case \"text\":\n return item.enum && item.enum.length > 0 ? `(${item.enum.map((v) => JSON.stringify(v)).join(\" | \")})` : \"string\";\n case \"number\":\n return \"number\";\n case \"boolean\":\n return \"boolean\";\n case \"date\":\n case \"datetime\":\n return \"string\";\n case \"markdown\":\n return \"string\";\n case \"json\":\n return \"JsonValue\";\n case \"reference\":\n return \"string\";\n case \"asset\":\n return \"string\";\n case \"object\": {\n const lines = item.fields.map((f) => renderField(f, depth + 1));\n const closingIndent = \" \".repeat(depth);\n return `{\\n${lines.join(\"\\n\")}\\n${closingIndent}}`;\n }\n default:\n return \"unknown\";\n }\n}\n\nconst JSON_VALUE = [\n \"export type JsonValue = string | number | boolean | null | JsonValue[] | { [key: string]: JsonValue };\",\n \"\",\n \"/** Portable rich-text document tree (never rendered HTML). */\",\n \"export interface RichTextDoc { type: \\\"doc\\\"; content: Array<{ type: string; [key: string]: unknown }>; }\",\n].join(\"\\n\");\n\n/** Generate types plus the shared `JsonValue` helper as a standalone module. */\nexport function generateTypesModule(collections: CollectionSchema[]): string {\n return `${JSON_VALUE}\\n\\n${generateTypes(collections)}`;\n}\n\nfunction pascal(key: string): string {\n return key\n .split(/[-_\\s]+/)\n .filter(Boolean)\n .map((part) => part.charAt(0).toUpperCase() + part.slice(1))\n .join(\"\");\n}\n\nfunction safeKey(key: string): string {\n return /^[A-Za-z_$][A-Za-z0-9_$]*$/.test(key) ? key : JSON.stringify(key);\n}\n\nfunction escapeComment(text: string): string {\n return text.replace(/\\*\\//g, \"*\\\\/\");\n}\n","import { z } from \"zod\";\nimport type { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport type { CallToolResult } from \"@modelcontextprotocol/sdk/types.js\";\nimport type { ManagementClient } from \"@myna-sh/sdk/management\";\nimport { isMynaApiError } from \"@myna-sh/sdk/management\";\nimport type { ProjectRegistry } from \"./config.js\";\n\n/**\n * The Myna MCP tools (SPEC 13). This module contains no CMS business logic —\n * every tool is a thin adapter over the management SDK.\n */\n\nfunction ok(text: string, structured: unknown): CallToolResult {\n return {\n content: [{ type: \"text\", text }],\n structuredContent: structured as Record<string, unknown>,\n };\n}\n\nfunction fail(error: unknown): CallToolResult {\n const message = isMynaApiError(error)\n ? `${error.code}: ${error.detail ?? error.title}`\n : error instanceof Error\n ? error.message\n : String(error);\n return { content: [{ type: \"text\", text: `Error: ${message}` }], isError: true };\n}\n\nasync function resolveEntryId(client: ManagementClient, project: string, ref: string): Promise<string> {\n if (ref.startsWith(\"ent_\") && !ref.includes(\"/\")) return ref;\n const [collection, slug] = ref.includes(\"/\") ? ref.split(\"/\", 2) : [undefined, ref];\n if (!collection) throw new Error(`Provide the entry as \"<collection>/<slug>\" or an ent_ id (got \"${ref}\").`);\n let cursor: string | undefined;\n for (let i = 0; i < 50; i++) {\n const page = await client.entries.list(project, { collection, limit: 100, cursor });\n const match = page.data.find((e) => e.slug === slug || e.id === slug);\n if (match) return match.id;\n if (!page.nextCursor) break;\n cursor = page.nextCursor;\n }\n throw new Error(`Entry not found: ${ref}`);\n}\n\nconst projectArg = { project: z.string().optional().describe(\"Project id, slug, or configured name. Omit to use the default.\") };\n\nexport interface ToolOptions {\n /**\n * Whether `myna_upload_asset` may read local filesystem paths. True for\n * stdio (the client and server share a machine); false for HTTP, where a\n * remote client must never be able to read the server's filesystem.\n */\n allowPathUploads: boolean;\n}\n\nexport function registerTools(\n server: McpServer,\n registry: ProjectRegistry,\n options: ToolOptions = { allowPathUploads: true },\n): void {\n // 1. list projects\n server.registerTool(\n \"myna_list_projects\",\n {\n title: \"List projects\",\n description: \"List projects in an organization.\",\n inputSchema: {\n organization: z.string().optional().describe(\"Organization id or slug. Omit to use the default.\"),\n ...projectArg,\n },\n annotations: { readOnlyHint: true, openWorldHint: true },\n },\n async (args) => {\n try {\n // Org-scoped: this is how an agent discovers projects, so it must not\n // itself require one.\n const { client } = registry.clientForOrg(args.project);\n const org = registry.organizationFor(args.project, args.organization);\n const projects = await client.projects.list(org);\n return ok(`${projects.length} project(s) in ${org}.`, { projects });\n } catch (error) {\n return fail(error);\n }\n },\n );\n\n // 2. get project\n server.registerTool(\n \"myna_get_project\",\n {\n title: \"Get project\",\n description: \"Fetch a single project's details.\",\n inputSchema: { ...projectArg },\n annotations: { readOnlyHint: true, openWorldHint: true },\n },\n async (args) => {\n try {\n const { client, project } = registry.clientFor(args.project);\n const result = await client.projects.get(project);\n return ok(`Project ${result.name} (${result.slug}).`, { project: result });\n } catch (error) {\n return fail(error);\n }\n },\n );\n\n // 3. list collections\n server.registerTool(\n \"myna_list_collections\",\n {\n title: \"List collections\",\n description: \"List the deployed collections in a project.\",\n inputSchema: { ...projectArg },\n annotations: { readOnlyHint: true, openWorldHint: true },\n },\n async (args) => {\n try {\n const { client, project } = registry.clientFor(args.project);\n const collections = await client.schema.collections(project);\n return ok(`${collections.length} collection(s).`, { collections });\n } catch (error) {\n return fail(error);\n }\n },\n );\n\n // 4. get collection schema\n server.registerTool(\n \"myna_get_collection_schema\",\n {\n title: \"Get collection schema\",\n description: \"Fetch the latest canonical schema for a collection.\",\n inputSchema: { ...projectArg, collection: z.string().describe(\"Collection key.\") },\n annotations: { readOnlyHint: true, openWorldHint: true },\n },\n async (args) => {\n try {\n const { client, project } = registry.clientFor(args.project);\n const versions = await client.schema.versions(project, args.collection);\n const latest = versions[0];\n if (!latest) throw new Error(`Collection ${args.collection} has no versions.`);\n return ok(`${args.collection} schema v${latest.version}.`, { version: latest.version, schema: latest.schemaJson });\n } catch (error) {\n return fail(error);\n }\n },\n );\n\n // 5. list entries\n server.registerTool(\n \"myna_list_entries\",\n {\n title: \"List entries\",\n description: \"List entries in a collection.\",\n inputSchema: {\n ...projectArg,\n collection: z.string().describe(\"Collection key.\"),\n status: z.enum([\"draft\", \"published\", \"changed\", \"unpublished\", \"deleted\"]).optional(),\n limit: z.number().int().min(1).max(100).optional(),\n cursor: z.string().optional(),\n },\n annotations: { readOnlyHint: true, openWorldHint: true },\n },\n async (args) => {\n try {\n const { client, project } = registry.clientFor(args.project);\n const page = await client.entries.list(project, {\n collection: args.collection,\n status: args.status,\n limit: args.limit ?? 25,\n cursor: args.cursor,\n });\n return ok(`${page.data.length} entr(y/ies).`, { entries: page.data, nextCursor: page.nextCursor });\n } catch (error) {\n return fail(error);\n }\n },\n );\n\n // 6. get entry\n server.registerTool(\n \"myna_get_entry\",\n {\n title: \"Get entry\",\n description: \"Fetch one entry by \\\"<collection>/<slug>\\\" or entry id.\",\n inputSchema: { ...projectArg, entry: z.string().describe(\"collection/slug or ent_ id.\") },\n annotations: { readOnlyHint: true, openWorldHint: true },\n },\n async (args) => {\n try {\n const { client, project } = registry.clientFor(args.project);\n const id = await resolveEntryId(client, project, args.entry);\n const entry = await client.entries.get(project, id);\n return ok(`Entry ${entry.id} (${entry.status}).`, { entry });\n } catch (error) {\n return fail(error);\n }\n },\n );\n\n // 7. create change set\n server.registerTool(\n \"myna_create_change_set\",\n {\n title: \"Create change set\",\n description: \"Open a new change set to group entry and asset operations.\",\n inputSchema: {\n ...projectArg,\n title: z.string().min(1).max(200),\n description: z.string().max(2000).optional(),\n },\n annotations: { readOnlyHint: false, destructiveHint: false, idempotentHint: false, openWorldHint: true },\n },\n async (args) => {\n try {\n const { client, project } = registry.clientFor(args.project);\n const cs = await client.changeSets.create(project, { title: args.title, description: args.description });\n return ok(`Created change set ${cs.id}.`, { changeSet: cs });\n } catch (error) {\n return fail(error);\n }\n },\n );\n\n // 8. get change set\n server.registerTool(\n \"myna_get_change_set\",\n {\n title: \"Get change set\",\n description: \"Fetch a change set and its items.\",\n inputSchema: { ...projectArg, changeSet: z.string().describe(\"Change set id (chs_).\") },\n annotations: { readOnlyHint: true, openWorldHint: true },\n },\n async (args) => {\n try {\n const { client, project } = registry.clientFor(args.project);\n const cs = await client.changeSets.get(project, args.changeSet);\n return ok(`Change set ${cs.id} (${cs.status}), ${cs.items.length} item(s).`, { changeSet: cs });\n } catch (error) {\n return fail(error);\n }\n },\n );\n\n // 9. create entry\n server.registerTool(\n \"myna_create_entry\",\n {\n title: \"Create entry\",\n description: \"Create a draft entry. Does not publish.\",\n inputSchema: {\n ...projectArg,\n collection: z.string(),\n data: z.record(z.string(), z.unknown()).describe(\"Field values.\"),\n slug: z.string().optional(),\n changeSet: z.string().optional().describe(\"Attach to an existing change set (chs_).\"),\n changeSummary: z.string().max(500).optional(),\n },\n annotations: { readOnlyHint: false, destructiveHint: false, idempotentHint: false, openWorldHint: true },\n },\n async (args) => {\n try {\n const { client, project } = registry.clientFor(args.project);\n const entry = await client.entries.create(project, {\n collection: args.collection,\n data: args.data,\n slug: args.slug,\n changeSetId: args.changeSet,\n changeSummary: args.changeSummary,\n });\n return ok(`Created entry ${entry.id} (${entry.status}).`, { entry });\n } catch (error) {\n return fail(error);\n }\n },\n );\n\n // 10. update entry\n server.registerTool(\n \"myna_update_entry\",\n {\n title: \"Update entry\",\n description: \"Update a draft entry. Does not publish.\",\n inputSchema: {\n ...projectArg,\n entry: z.string().describe(\"collection/slug or ent_ id.\"),\n data: z.record(z.string(), z.unknown()).optional(),\n slug: z.string().optional(),\n expectedRevisionId: z.string().optional().describe(\"Optimistic concurrency guard.\"),\n changeSet: z.string().optional(),\n changeSummary: z.string().max(500).optional(),\n },\n annotations: { readOnlyHint: false, destructiveHint: false, idempotentHint: false, openWorldHint: true },\n },\n async (args) => {\n try {\n const { client, project } = registry.clientFor(args.project);\n const id = await resolveEntryId(client, project, args.entry);\n const entry = await client.entries.update(project, id, {\n data: args.data,\n slug: args.slug,\n expectedRevisionId: args.expectedRevisionId,\n changeSetId: args.changeSet,\n changeSummary: args.changeSummary,\n });\n return ok(`Updated entry ${entry.id} (${entry.status}).`, { entry });\n } catch (error) {\n return fail(error);\n }\n },\n );\n\n // 11. delete entry (destructive)\n server.registerTool(\n \"myna_delete_entry\",\n {\n title: \"Delete entry\",\n description: \"Stage an entry deletion on a change set. Requires confirm=true. Takes effect only on publish.\",\n inputSchema: {\n ...projectArg,\n entry: z.string(),\n changeSet: z.string().optional(),\n confirm: z.literal(true).describe(\"Must be true to proceed.\"),\n },\n annotations: { readOnlyHint: false, destructiveHint: true, idempotentHint: false, openWorldHint: true },\n },\n async (args) => {\n try {\n const { client, project } = registry.clientFor(args.project);\n const id = await resolveEntryId(client, project, args.entry);\n const result = await client.entries.delete(project, id, args.changeSet);\n return ok(`Staged delete of ${id} on ${result.changeSetId}.`, result);\n } catch (error) {\n return fail(error);\n }\n },\n );\n\n // 12. upload asset\n server.registerTool(\n \"myna_upload_asset\",\n {\n title: \"Upload asset\",\n description: \"Upload an asset from base64 bytes or a local file path via the presigned flow.\",\n inputSchema: {\n ...projectArg,\n filename: z.string().describe(\"Display filename, e.g. cover.png.\"),\n base64: z.string().optional().describe(\"Base64-encoded file bytes.\"),\n path: z.string().optional().describe(\"Local filesystem path (stdio hosts only).\"),\n contentType: z.string().optional(),\n },\n annotations: { readOnlyHint: false, destructiveHint: false, idempotentHint: false, openWorldHint: true },\n },\n async (args) => {\n try {\n const { client, project } = registry.clientFor(args.project);\n if (!args.base64 && !args.path) throw new Error(\"Provide either `base64` or `path`.\");\n if (args.path && !options.allowPathUploads) {\n throw new Error(\"`path` uploads are only available on stdio transports; send `base64` instead.\");\n }\n const input = args.base64 ? new Uint8Array(Buffer.from(args.base64, \"base64\")) : args.path!;\n const asset = await client.assets.upload(project, input, {\n filename: args.filename,\n contentType: args.contentType,\n });\n return ok(`Uploaded ${asset.displayFilename} (${asset.id}).`, { asset });\n } catch (error) {\n return fail(error);\n }\n },\n );\n\n // 13. validate change set\n server.registerTool(\n \"myna_validate_change_set\",\n {\n title: \"Validate change set\",\n description: \"Validate every changed resource in a change set against the deployed schemas.\",\n inputSchema: { ...projectArg, changeSet: z.string() },\n annotations: { readOnlyHint: true, openWorldHint: true },\n },\n async (args) => {\n try {\n const { client, project } = registry.clientFor(args.project);\n const result = await client.changeSets.validate(project, args.changeSet);\n return ok(result.valid ? \"Change set is valid.\" : `Invalid: ${result.errors.length} error(s).`, result);\n } catch (error) {\n return fail(error);\n }\n },\n );\n\n // 14. create preview\n server.registerTool(\n \"myna_create_preview\",\n {\n title: \"Create preview\",\n description: \"Create one preview URL for a change set (or entry). Never publishes.\",\n inputSchema: {\n ...projectArg,\n changeSet: z.string().optional().describe(\"Change set id (chs_).\"),\n entry: z.string().optional().describe(\"Entry id (ent_).\"),\n expiresInSeconds: z.number().int().min(60).max(604800).optional(),\n },\n annotations: { readOnlyHint: false, destructiveHint: false, idempotentHint: false, openWorldHint: true },\n },\n async (args) => {\n try {\n if (Boolean(args.changeSet) === Boolean(args.entry)) {\n throw new Error(\"Provide exactly one of `changeSet` or `entry`.\");\n }\n const { client, project } = registry.clientFor(args.project);\n const preview = await client.previews.create(project, {\n changeSetId: args.changeSet,\n entryId: args.entry,\n expiresInSeconds: args.expiresInSeconds,\n });\n return ok(`Preview: ${preview.url}`, { preview });\n } catch (error) {\n return fail(error);\n }\n },\n );\n\n // 15. publish change set (destructive)\n server.registerTool(\n \"myna_publish_change_set\",\n {\n title: \"Publish change set\",\n description: \"Atomically publish a change set. Requires confirm=true and content:publish scope.\",\n inputSchema: { ...projectArg, changeSet: z.string(), confirm: z.literal(true).describe(\"Must be true.\") },\n annotations: { readOnlyHint: false, destructiveHint: true, idempotentHint: false, openWorldHint: true },\n },\n async (args) => {\n try {\n const { client, project } = registry.clientFor(args.project);\n const result = await client.changeSets.publish(project, args.changeSet);\n return ok(`Published ${result.publishedEntryIds.length} entr(y/ies).`, result);\n } catch (error) {\n return fail(error);\n }\n },\n );\n\n // 16. get entry revisions\n server.registerTool(\n \"myna_get_entry_revisions\",\n {\n title: \"Get entry revisions\",\n description: \"List the immutable revisions of an entry.\",\n inputSchema: { ...projectArg, entry: z.string() },\n annotations: { readOnlyHint: true, openWorldHint: true },\n },\n async (args) => {\n try {\n const { client, project } = registry.clientFor(args.project);\n const id = await resolveEntryId(client, project, args.entry);\n const revisions = await client.entries.revisions(project, id);\n return ok(`${revisions.length} revision(s).`, { revisions });\n } catch (error) {\n return fail(error);\n }\n },\n );\n\n // get entry references (reference integrity)\n server.registerTool(\n \"myna_get_entry_references\",\n {\n title: \"Get entry references\",\n description:\n \"Show reference integrity for an entry: which entries reference it (backlinks) and which entries it references, with publish state. Useful before unpublishing or deleting.\",\n inputSchema: { ...projectArg, entry: z.string() },\n annotations: { readOnlyHint: true, openWorldHint: true },\n },\n async (args) => {\n try {\n const { client, project } = registry.clientFor(args.project);\n const id = await resolveEntryId(client, project, args.entry);\n const refs = await client.entries.references(project, id);\n return ok(\n `Referenced by ${refs.referencedBy.length} entr(y/ies); references ${refs.references.length}.`,\n refs,\n );\n } catch (error) {\n return fail(error);\n }\n },\n );\n\n // 17. restore revision (destructive)\n server.registerTool(\n \"myna_restore_revision\",\n {\n title: \"Restore revision\",\n description: \"Restore a historical revision into a new draft revision. Requires confirm=true.\",\n inputSchema: {\n ...projectArg,\n entry: z.string(),\n revision: z.string().describe(\"Revision id (rev_).\"),\n confirm: z.literal(true).describe(\"Must be true.\"),\n },\n annotations: { readOnlyHint: false, destructiveHint: true, idempotentHint: false, openWorldHint: true },\n },\n async (args) => {\n try {\n const { client, project } = registry.clientFor(args.project);\n const id = await resolveEntryId(client, project, args.entry);\n const result = await client.entries.restoreRevision(project, id, args.revision);\n return ok(`Restored into ${result.revision.id}.`, result);\n } catch (error) {\n return fail(error);\n }\n },\n );\n\n // schedule / cancel scheduled publish\n server.registerTool(\n \"myna_schedule_change_set\",\n {\n title: \"Schedule change-set publish\",\n description:\n \"Schedule a change set to publish atomically at a future time, or cancel its schedule. Requires confirm=true and content:publish scope. Schedule status is readable via myna_get_change_set (scheduledAt).\",\n inputSchema: {\n ...projectArg,\n changeSet: z.string(),\n publishAt: z.string().optional().describe(\"ISO 8601 datetime to publish at. Omit with cancel=true.\"),\n cancel: z.boolean().optional().describe(\"Cancel the existing schedule instead.\"),\n confirm: z.literal(true).describe(\"Must be true.\"),\n },\n annotations: { readOnlyHint: false, destructiveHint: true, idempotentHint: true, openWorldHint: true },\n },\n async (args) => {\n try {\n if (Boolean(args.publishAt) === Boolean(args.cancel)) {\n throw new Error(\"Provide exactly one of `publishAt` or `cancel`.\");\n }\n const { client, project } = registry.clientFor(args.project);\n const cs = args.cancel\n ? await client.changeSets.cancelSchedule(project, args.changeSet)\n : await client.changeSets.schedule(project, args.changeSet, args.publishAt!);\n return ok(cs.scheduledAt ? `Scheduled for ${cs.scheduledAt}.` : \"Schedule cancelled.\", { changeSet: cs });\n } catch (error) {\n return fail(error);\n }\n },\n );\n\n // 18. get review status (reviews + comments + latest checks)\n server.registerTool(\n \"myna_get_change_set_review\",\n {\n title: \"Get change-set review status\",\n description:\n \"Fetch a change set's reviews, comments, and latest automated check run in one call.\",\n inputSchema: { ...projectArg, changeSet: z.string() },\n annotations: { readOnlyHint: true, openWorldHint: true },\n },\n async (args) => {\n try {\n const { client, project } = registry.clientFor(args.project);\n const [reviews, comments, checks] = await Promise.all([\n client.changeSets.reviews(project, args.changeSet),\n client.changeSets.comments(project, args.changeSet),\n client.changeSets.checks(project, args.changeSet),\n ]);\n const approvals = reviews.filter((r) => r.status === \"approved\" && !r.stale).length;\n const failing = checks.filter((c) => c.status === \"failed\").length;\n return ok(\n `${approvals} fresh approval(s), ${comments.length} comment(s), ${checks.length === 0 ? \"no check run\" : `${failing} failing check(s)`}.`,\n { reviews, comments, checks },\n );\n } catch (error) {\n return fail(error);\n }\n },\n );\n\n // 19. review change set (approve / request changes)\n server.registerTool(\n \"myna_review_change_set\",\n {\n title: \"Review change set\",\n description:\n \"Record an approve or request-changes review decision on a change set. Requires content:review scope.\",\n inputSchema: {\n ...projectArg,\n changeSet: z.string(),\n decision: z.enum([\"approve\", \"request_changes\"]),\n comment: z.string().optional().describe(\"Optional review comment.\"),\n },\n annotations: { readOnlyHint: false, destructiveHint: false, idempotentHint: true, openWorldHint: true },\n },\n async (args) => {\n try {\n const { client, project } = registry.clientFor(args.project);\n const reviews =\n args.decision === \"approve\"\n ? await client.changeSets.approve(project, args.changeSet, { comment: args.comment })\n : await client.changeSets.requestChanges(project, args.changeSet, { comment: args.comment });\n return ok(`Recorded ${args.decision} review.`, { reviews });\n } catch (error) {\n return fail(error);\n }\n },\n );\n\n // 20. comment on change set\n server.registerTool(\n \"myna_comment_on_change_set\",\n {\n title: \"Comment on change set\",\n description: \"Add a comment to a change set, optionally anchored to an entry field.\",\n inputSchema: {\n ...projectArg,\n changeSet: z.string(),\n body: z.string().min(1),\n entry: z.string().optional().describe(\"Entry id (ent_) to anchor the comment to.\"),\n fieldPath: z.string().optional().describe(\"Field path within the entry, e.g. fields.title.\"),\n },\n annotations: { readOnlyHint: false, destructiveHint: false, idempotentHint: false, openWorldHint: true },\n },\n async (args) => {\n try {\n const { client, project } = registry.clientFor(args.project);\n const comment = await client.changeSets.comment(project, args.changeSet, {\n body: args.body,\n resourceType: args.entry ? \"entry\" : undefined,\n resourceId: args.entry,\n fieldPath: args.fieldPath,\n });\n return ok(`Commented ${comment.id}.`, { comment });\n } catch (error) {\n return fail(error);\n }\n },\n );\n\n // 21. run automated checks\n server.registerTool(\n \"myna_run_change_set_checks\",\n {\n title: \"Run change-set checks\",\n description:\n \"Run the built-in automated checks (schema, references, slugs, alt-text, SEO) against a change set and return the results.\",\n inputSchema: { ...projectArg, changeSet: z.string() },\n annotations: { readOnlyHint: false, destructiveHint: false, idempotentHint: true, openWorldHint: true },\n },\n async (args) => {\n try {\n const { client, project } = registry.clientFor(args.project);\n const result = await client.changeSets.runChecks(project, args.changeSet);\n const failing = result.checks.filter((c) => c.status === \"failed\");\n return ok(\n result.passed ? \"All checks passed.\" : `Failing: ${failing.map((c) => c.name).join(\", \")}.`,\n result,\n );\n } catch (error) {\n return fail(error);\n }\n },\n );\n}\n","import { McpServer, ResourceTemplate } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport type { ReadResourceResult } from \"@modelcontextprotocol/sdk/types.js\";\nimport type { ProjectRegistry } from \"./config.js\";\n\n/**\n * MCP resources (SPEC 13): project summaries, collection schemas, entry and\n * revision representations, and change-set validation results.\n */\nexport function registerResources(server: McpServer, registry: ProjectRegistry): void {\n const json = (uri: string, value: unknown): ReadResourceResult => ({\n contents: [{ uri, mimeType: \"application/json\", text: JSON.stringify(value, null, 2) }],\n });\n\n // Project summaries for the default organization.\n server.registerResource(\n \"projects\",\n \"myna://projects\",\n { title: \"Projects\", description: \"Projects in the default organization.\", mimeType: \"application/json\" },\n async (uri) => {\n const { client } = registry.clientFor();\n const org = registry.organizationFor();\n const projects = await client.projects.list(org);\n return json(uri.href, { organization: org, projects });\n },\n );\n\n // Collection list for a project.\n server.registerResource(\n \"collections\",\n new ResourceTemplate(\"myna://{project}/collections\", { list: undefined }),\n { title: \"Collections\", description: \"Deployed collections for a project.\", mimeType: \"application/json\" },\n async (uri, variables) => {\n const project = String(variables.project);\n const { client, project: ref } = registry.clientFor(project);\n const collections = await client.schema.collections(ref);\n return json(uri.href, { project: ref, collections });\n },\n );\n\n // Canonical schema for one collection.\n server.registerResource(\n \"collection-schema\",\n new ResourceTemplate(\"myna://{project}/collection/{key}\", { list: undefined }),\n { title: \"Collection schema\", description: \"Latest canonical schema for a collection.\", mimeType: \"application/json\" },\n async (uri, variables) => {\n const { client, project } = registry.clientFor(String(variables.project));\n const versions = await client.schema.versions(project, String(variables.key));\n const latest = versions[0];\n return json(uri.href, { collection: String(variables.key), version: latest?.version ?? null, schema: latest?.schemaJson ?? null });\n },\n );\n\n // Entry representation (by entry id).\n server.registerResource(\n \"entry\",\n new ResourceTemplate(\"myna://{project}/entry/{entry}\", { list: undefined }),\n { title: \"Entry\", description: \"An entry's current representation.\", mimeType: \"application/json\" },\n async (uri, variables) => {\n const { client, project } = registry.clientFor(String(variables.project));\n const entry = await client.entries.get(project, String(variables.entry));\n return json(uri.href, { entry });\n },\n );\n\n // Entry revisions.\n server.registerResource(\n \"entry-revisions\",\n new ResourceTemplate(\"myna://{project}/entry/{entry}/revisions\", { list: undefined }),\n { title: \"Entry revisions\", description: \"Immutable revisions for an entry.\", mimeType: \"application/json\" },\n async (uri, variables) => {\n const { client, project } = registry.clientFor(String(variables.project));\n const revisions = await client.entries.revisions(project, String(variables.entry));\n return json(uri.href, { entry: String(variables.entry), revisions });\n },\n );\n\n // Change-set validation results.\n server.registerResource(\n \"change-set-validation\",\n new ResourceTemplate(\"myna://{project}/change-set/{changeSet}/validation\", { list: undefined }),\n { title: \"Change-set validation\", description: \"Validation result for a change set.\", mimeType: \"application/json\" },\n async (uri, variables) => {\n const { client, project } = registry.clientFor(String(variables.project));\n const result = await client.changeSets.validate(project, String(variables.changeSet));\n return json(uri.href, result);\n },\n );\n}\n","/**\n * Build-time version stamp.\n *\n * `tsup` substitutes `__MYNA_VERSION__` with the value from `package.json`\n * (see `tsup.config.ts`), so the version advertised in the MCP handshake can\n * never disagree with the package it was published from. Running from source\n * leaves the identifier undefined and falls back to a marker that is obviously\n * not a release.\n */\ndeclare const __MYNA_VERSION__: string | undefined;\n\nexport const VERSION: string =\n typeof __MYNA_VERSION__ === \"string\" ? __MYNA_VERSION__ : \"0.0.0-dev\";\n","import { createServer as createHttpServer, type IncomingMessage, type ServerResponse } from \"node:http\";\nimport { StreamableHTTPServerTransport } from \"@modelcontextprotocol/sdk/server/streamableHttp.js\";\nimport { ProjectRegistry } from \"./config.js\";\nimport { createServerForRegistry } from \"./server.js\";\n\nexport interface HttpOptions {\n port: number;\n /** Bearer token required in the `Authorization` header. */\n authToken?: string;\n /** Explicitly serve without endpoint auth. Never enable on a public network. */\n allowUnauthenticated?: boolean;\n path?: string;\n}\n\nfunction readBody(req: IncomingMessage): Promise<unknown> {\n return new Promise((resolve, reject) => {\n const chunks: Buffer[] = [];\n req.on(\"data\", (c: Buffer) => chunks.push(c));\n req.on(\"end\", () => {\n const raw = Buffer.concat(chunks).toString(\"utf8\");\n if (!raw) return resolve(undefined);\n try {\n resolve(JSON.parse(raw));\n } catch (error) {\n reject(error);\n }\n });\n req.on(\"error\", reject);\n });\n}\n\nfunction bearer(req: IncomingMessage): string | undefined {\n const header = req.headers.authorization;\n return header?.startsWith(\"Bearer \") ? header.slice(7).trim() : undefined;\n}\n\n/**\n * Streamable HTTP transport (SPEC 13). Stateless: a fresh server + transport per\n * request. Authenticated by a bearer token in the `Authorization` header.\n */\nexport async function runHttp(options: HttpOptions): Promise<void> {\n if (!options.authToken && !options.allowUnauthenticated) {\n throw new Error(\n \"Refusing to serve HTTP without auth. Set MYNA_MCP_TOKEN (or MYNA_TOKEN), \" +\n \"or set MYNA_MCP_ALLOW_UNAUTHENTICATED=1 for trusted-network use only.\",\n );\n }\n const registry = new ProjectRegistry();\n const path = options.path ?? \"/mcp\";\n\n const httpServer = createHttpServer((req: IncomingMessage, res: ServerResponse) => {\n void handle(req, res).catch((error: unknown) => {\n if (!res.headersSent) res.writeHead(500, { \"content-type\": \"application/json\" });\n res.end(JSON.stringify({ jsonrpc: \"2.0\", error: { code: -32603, message: String(error) }, id: null }));\n });\n });\n\n async function handle(req: IncomingMessage, res: ServerResponse): Promise<void> {\n const url = new URL(req.url ?? \"/\", \"http://localhost\");\n if (url.pathname === \"/health\") {\n res.writeHead(200, { \"content-type\": \"application/json\" }).end(JSON.stringify({ ok: true }));\n return;\n }\n if (url.pathname !== path) {\n res.writeHead(404, { \"content-type\": \"application/json\" }).end(JSON.stringify({ error: \"not found\" }));\n return;\n }\n if (options.authToken && bearer(req) !== options.authToken) {\n res.writeHead(401, { \"content-type\": \"application/json\" }).end(JSON.stringify({ error: \"unauthorized\" }));\n return;\n }\n if (req.method !== \"POST\") {\n // Stateless server: no standalone SSE stream.\n res.writeHead(405, { \"content-type\": \"application/json\", allow: \"POST\" }).end(\n JSON.stringify({ jsonrpc: \"2.0\", error: { code: -32000, message: \"Method not allowed.\" }, id: null }),\n );\n return;\n }\n\n const body = await readBody(req);\n const transport = new StreamableHTTPServerTransport({ sessionIdGenerator: undefined });\n // Remote clients must never be able to read this machine's filesystem.\n const server = createServerForRegistry(registry, { allowPathUploads: false });\n res.on(\"close\", () => {\n void transport.close();\n void server.close();\n });\n await server.connect(transport);\n await transport.handleRequest(req, res, body);\n }\n\n await new Promise<void>((resolve) => httpServer.listen(options.port, resolve));\n process.stderr.write(`myna-mcp: streamable HTTP transport listening on :${options.port}${path}\\n`);\n}\n"],"mappings":"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","names":["McpServer","bytes","DEFAULT_API_URL","McpServer"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@myna-sh/mcp",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.4.0",
|
|
4
4
|
"private": false,
|
|
5
5
|
"publishConfig": {
|
|
6
6
|
"access": "public"
|
|
@@ -32,8 +32,8 @@
|
|
|
32
32
|
"eslint": "9.39.5",
|
|
33
33
|
"typescript": "5.9.3",
|
|
34
34
|
"@myna-sh/api-contracts": "0.0.0",
|
|
35
|
-
"@myna-sh/
|
|
36
|
-
"@myna-sh/
|
|
35
|
+
"@myna-sh/config": "0.0.0",
|
|
36
|
+
"@myna-sh/sdk": "0.4.0"
|
|
37
37
|
},
|
|
38
38
|
"scripts": {
|
|
39
39
|
"build": "tsup",
|