@myna-sh/mcp 0.1.0 → 0.2.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/LICENSE +21 -0
- package/README.md +52 -0
- package/dist/main.d.ts +2 -0
- package/dist/main.js +235 -8
- package/dist/main.js.map +1 -1
- package/package.json +7 -4
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Tiago Mouta
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
# @myna-sh/mcp
|
|
2
|
+
|
|
3
|
+
Model Context Protocol server for managing [Myna](https://myna.sh) content from coding agents and MCP clients.
|
|
4
|
+
|
|
5
|
+
## Install
|
|
6
|
+
|
|
7
|
+
```sh
|
|
8
|
+
npm install --global @myna-sh/mcp
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
## Stdio
|
|
12
|
+
|
|
13
|
+
Configure your MCP client to run:
|
|
14
|
+
|
|
15
|
+
```json
|
|
16
|
+
{
|
|
17
|
+
"command": "npx",
|
|
18
|
+
"args": ["-y", "@myna-sh/mcp"],
|
|
19
|
+
"env": {
|
|
20
|
+
"MYNA_TOKEN": "myna_sk_...",
|
|
21
|
+
"MYNA_ORGANIZATION": "my-organization",
|
|
22
|
+
"MYNA_PROJECT": "my-project"
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
Use a narrowly scoped Myna API key and keep it out of source control.
|
|
28
|
+
|
|
29
|
+
## Streamable HTTP
|
|
30
|
+
|
|
31
|
+
```sh
|
|
32
|
+
MYNA_MCP_TRANSPORT=http \
|
|
33
|
+
MYNA_MCP_TOKEN=server-access-token \
|
|
34
|
+
MYNA_TOKEN=myna_sk_... \
|
|
35
|
+
MYNA_PROJECT=my-project \
|
|
36
|
+
myna-mcp
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
The MCP endpoint is `/mcp`; health checks are available at `/health`. The default port is `3333` and can be changed with `MYNA_MCP_PORT` or `PORT`.
|
|
40
|
+
|
|
41
|
+
## Configuration
|
|
42
|
+
|
|
43
|
+
The server reads `MYNA_API_URL`, `MYNA_TOKEN`, `MYNA_ORGANIZATION`, and `MYNA_PROJECT`. Named projects can be configured in `~/.config/myna/mcp.json` or a file selected by `MYNA_MCP_CONFIG`.
|
|
44
|
+
|
|
45
|
+
## Links
|
|
46
|
+
|
|
47
|
+
- [Myna](https://myna.sh)
|
|
48
|
+
- Support: [support@myna.sh](mailto:support@myna.sh)
|
|
49
|
+
|
|
50
|
+
## License
|
|
51
|
+
|
|
52
|
+
MIT
|
package/dist/main.d.ts
CHANGED
|
@@ -7,6 +7,8 @@ interface HttpOptions {
|
|
|
7
7
|
port: number;
|
|
8
8
|
/** Bearer token required in the `Authorization` header. */
|
|
9
9
|
authToken?: string;
|
|
10
|
+
/** Explicitly serve without endpoint auth. Never enable on a public network. */
|
|
11
|
+
allowUnauthenticated?: boolean;
|
|
10
12
|
path?: string;
|
|
11
13
|
}
|
|
12
14
|
/**
|
package/dist/main.js
CHANGED
|
@@ -198,6 +198,12 @@ function isAbort(error) {
|
|
|
198
198
|
import { createHash, randomUUID } from "crypto";
|
|
199
199
|
import { readFile } from "fs/promises";
|
|
200
200
|
import { basename } from "path";
|
|
201
|
+
var JSON_VALUE = [
|
|
202
|
+
"export type JsonValue = string | number | boolean | null | JsonValue[] | { [key: string]: JsonValue };",
|
|
203
|
+
"",
|
|
204
|
+
"/** Portable rich-text document tree (never rendered HTML). */",
|
|
205
|
+
'export interface RichTextDoc { type: "doc"; content: Array<{ type: string; [key: string]: unknown }>; }'
|
|
206
|
+
].join("\n");
|
|
201
207
|
var DEFAULT_API_URL = "https://api.myna.sh";
|
|
202
208
|
var ManagementClient = class {
|
|
203
209
|
http;
|
|
@@ -260,7 +266,12 @@ var ManagementClient = class {
|
|
|
260
266
|
create: (organization, body) => this.mutate("POST", `/organizations/${enc(organization)}/projects`, body),
|
|
261
267
|
get: (project, signal) => this.get(`/projects/${enc(project)}`, void 0, signal),
|
|
262
268
|
update: (project, body) => this.mutate("PATCH", `/projects/${enc(project)}`, body),
|
|
263
|
-
archive: (project) => this.mutate("POST", `/projects/${enc(project)}/archive`)
|
|
269
|
+
archive: (project) => this.mutate("POST", `/projects/${enc(project)}/archive`),
|
|
270
|
+
/** Full project export: schemas, entries (draft + published), asset metadata. */
|
|
271
|
+
export: (project, signal) => this.get(`/projects/${enc(project)}/export`, void 0, signal),
|
|
272
|
+
views: (project, signal) => this.get(`/projects/${enc(project)}/views`, void 0, signal),
|
|
273
|
+
createView: (project, body) => this.mutate("POST", `/projects/${enc(project)}/views`, body),
|
|
274
|
+
deleteView: (project, view) => this.mutate("DELETE", `/projects/${enc(project)}/views/${enc(view)}`)
|
|
264
275
|
};
|
|
265
276
|
// --- Schema ---------------------------------------------------------------
|
|
266
277
|
schema = {
|
|
@@ -272,6 +283,13 @@ var ManagementClient = class {
|
|
|
272
283
|
collections,
|
|
273
284
|
allowDestructive: opts.allowDestructive ?? false,
|
|
274
285
|
changeSummary: opts.changeSummary
|
|
286
|
+
}),
|
|
287
|
+
// Environments as projects
|
|
288
|
+
drift: (project, against, signal) => this.get(`/projects/${enc(project)}/schema/drift`, { against }, signal),
|
|
289
|
+
promote: (project, fromProject, opts = {}) => this.mutate("POST", `/projects/${enc(project)}/schema/promote`, {
|
|
290
|
+
fromProject,
|
|
291
|
+
allowDestructive: opts.allowDestructive ?? false,
|
|
292
|
+
confirm: true
|
|
275
293
|
})
|
|
276
294
|
};
|
|
277
295
|
// --- Entries & revisions --------------------------------------------------
|
|
@@ -286,6 +304,12 @@ var ManagementClient = class {
|
|
|
286
304
|
delete: (project, entry, changeSetId) => this.mutate("DELETE", `/projects/${enc(project)}/entries/${enc(entry)}`, void 0, { changeSetId }),
|
|
287
305
|
unpublish: (project, entry, changeSetId) => this.mutate("POST", `/projects/${enc(project)}/entries/${enc(entry)}/unpublish`, void 0, { changeSetId }),
|
|
288
306
|
restore: (project, entry) => this.mutate("POST", `/projects/${enc(project)}/entries/${enc(entry)}/restore`),
|
|
307
|
+
duplicate: (project, entry, changeSetId) => this.mutate("POST", `/projects/${enc(project)}/entries/${enc(entry)}/duplicate`, {
|
|
308
|
+
changeSetId
|
|
309
|
+
}),
|
|
310
|
+
bulk: (project, body) => this.mutate("POST", `/projects/${enc(project)}/entries/bulk`, body),
|
|
311
|
+
import: (project, body) => this.mutate("POST", `/projects/${enc(project)}/entries/import`, body),
|
|
312
|
+
references: (project, entry, signal) => this.get(`/projects/${enc(project)}/entries/${enc(entry)}/references`, void 0, signal),
|
|
289
313
|
revisions: (project, entry, signal) => this.get(`/projects/${enc(project)}/entries/${enc(entry)}/revisions`, void 0, signal),
|
|
290
314
|
revision: (project, entry, revision, signal) => this.get(`/projects/${enc(project)}/entries/${enc(entry)}/revisions/${enc(revision)}`, void 0, signal),
|
|
291
315
|
restoreRevision: (project, entry, revision) => this.mutate(
|
|
@@ -301,7 +325,48 @@ var ManagementClient = class {
|
|
|
301
325
|
update: (project, changeSet, body) => this.mutate("PATCH", `/projects/${enc(project)}/change-sets/${enc(changeSet)}`, body),
|
|
302
326
|
validate: (project, changeSet) => this.mutate("POST", `/projects/${enc(project)}/change-sets/${enc(changeSet)}/validate`),
|
|
303
327
|
publish: (project, changeSet) => this.mutate("POST", `/projects/${enc(project)}/change-sets/${enc(changeSet)}/publish`, { confirm: true }),
|
|
304
|
-
close: (project, changeSet) => this.mutate("POST", `/projects/${enc(project)}/change-sets/${enc(changeSet)}/close`)
|
|
328
|
+
close: (project, changeSet) => this.mutate("POST", `/projects/${enc(project)}/change-sets/${enc(changeSet)}/close`),
|
|
329
|
+
// Scheduled publishing
|
|
330
|
+
schedule: (project, changeSet, publishAt) => this.mutate("POST", `/projects/${enc(project)}/change-sets/${enc(changeSet)}/schedule`, {
|
|
331
|
+
publishAt
|
|
332
|
+
}),
|
|
333
|
+
cancelSchedule: (project, changeSet) => this.mutate("DELETE", `/projects/${enc(project)}/change-sets/${enc(changeSet)}/schedule`),
|
|
334
|
+
// Reviews & approvals
|
|
335
|
+
reviews: (project, changeSet, signal) => this.get(
|
|
336
|
+
`/projects/${enc(project)}/change-sets/${enc(changeSet)}/reviews`,
|
|
337
|
+
void 0,
|
|
338
|
+
signal
|
|
339
|
+
),
|
|
340
|
+
requestReview: (project, changeSet, body) => this.mutate("POST", `/projects/${enc(project)}/change-sets/${enc(changeSet)}/reviews`, body),
|
|
341
|
+
removeReviewer: (project, changeSet, reviewer) => this.mutate(
|
|
342
|
+
"DELETE",
|
|
343
|
+
`/projects/${enc(project)}/change-sets/${enc(changeSet)}/reviews/${enc(reviewer)}`
|
|
344
|
+
),
|
|
345
|
+
approve: (project, changeSet, body = {}) => this.mutate("POST", `/projects/${enc(project)}/change-sets/${enc(changeSet)}/approve`, body),
|
|
346
|
+
requestChanges: (project, changeSet, body = {}) => this.mutate(
|
|
347
|
+
"POST",
|
|
348
|
+
`/projects/${enc(project)}/change-sets/${enc(changeSet)}/request-changes`,
|
|
349
|
+
body
|
|
350
|
+
),
|
|
351
|
+
// Comments
|
|
352
|
+
comments: (project, changeSet, signal) => this.get(
|
|
353
|
+
`/projects/${enc(project)}/change-sets/${enc(changeSet)}/comments`,
|
|
354
|
+
void 0,
|
|
355
|
+
signal
|
|
356
|
+
),
|
|
357
|
+
comment: (project, changeSet, body) => this.mutate("POST", `/projects/${enc(project)}/change-sets/${enc(changeSet)}/comments`, body),
|
|
358
|
+
resolveComment: (project, changeSet, comment, resolved = true) => this.mutate(
|
|
359
|
+
"PATCH",
|
|
360
|
+
`/projects/${enc(project)}/change-sets/${enc(changeSet)}/comments/${enc(comment)}`,
|
|
361
|
+
{ resolved }
|
|
362
|
+
),
|
|
363
|
+
// Automated checks
|
|
364
|
+
checks: (project, changeSet, signal) => this.get(
|
|
365
|
+
`/projects/${enc(project)}/change-sets/${enc(changeSet)}/checks`,
|
|
366
|
+
void 0,
|
|
367
|
+
signal
|
|
368
|
+
),
|
|
369
|
+
runChecks: (project, changeSet) => this.mutate("POST", `/projects/${enc(project)}/change-sets/${enc(changeSet)}/checks/run`)
|
|
305
370
|
};
|
|
306
371
|
// --- Previews -------------------------------------------------------------
|
|
307
372
|
previews = {
|
|
@@ -319,6 +384,7 @@ var ManagementClient = class {
|
|
|
319
384
|
get: (project, asset, signal) => this.get(`/projects/${enc(project)}/assets/${enc(asset)}`, void 0, signal),
|
|
320
385
|
usage: (project, asset, signal) => this.get(`/projects/${enc(project)}/assets/${enc(asset)}`, { usage: "true" }, signal),
|
|
321
386
|
update: (project, asset, body) => this.mutate("PATCH", `/projects/${enc(project)}/assets/${enc(asset)}`, body),
|
|
387
|
+
replace: (project, asset, body) => this.mutate("POST", `/projects/${enc(project)}/assets/${enc(asset)}/replace`, body),
|
|
322
388
|
delete: (project, asset) => this.mutate("DELETE", `/projects/${enc(project)}/assets/${enc(asset)}`),
|
|
323
389
|
/** Full presigned upload flow: create → PUT bytes → complete. */
|
|
324
390
|
upload: (project, input, meta = {}) => this.uploadAsset(project, input, meta)
|
|
@@ -544,7 +610,7 @@ async function resolveEntryId(client, project, ref) {
|
|
|
544
610
|
throw new Error(`Entry not found: ${ref}`);
|
|
545
611
|
}
|
|
546
612
|
var projectArg = { project: z.string().optional().describe("Project id, slug, or configured name. Omit to use the default.") };
|
|
547
|
-
function registerTools(server, registry) {
|
|
613
|
+
function registerTools(server, registry, options = { allowPathUploads: true }) {
|
|
548
614
|
server.registerTool(
|
|
549
615
|
"myna_list_projects",
|
|
550
616
|
{
|
|
@@ -817,6 +883,9 @@ function registerTools(server, registry) {
|
|
|
817
883
|
try {
|
|
818
884
|
const { client, project } = registry.clientFor(args.project);
|
|
819
885
|
if (!args.base64 && !args.path) throw new Error("Provide either `base64` or `path`.");
|
|
886
|
+
if (args.path && !options.allowPathUploads) {
|
|
887
|
+
throw new Error("`path` uploads are only available on stdio transports; send `base64` instead.");
|
|
888
|
+
}
|
|
820
889
|
const input = args.base64 ? new Uint8Array(Buffer.from(args.base64, "base64")) : args.path;
|
|
821
890
|
const asset = await client.assets.upload(project, input, {
|
|
822
891
|
filename: args.filename,
|
|
@@ -913,6 +982,28 @@ function registerTools(server, registry) {
|
|
|
913
982
|
}
|
|
914
983
|
}
|
|
915
984
|
);
|
|
985
|
+
server.registerTool(
|
|
986
|
+
"myna_get_entry_references",
|
|
987
|
+
{
|
|
988
|
+
title: "Get entry references",
|
|
989
|
+
description: "Show reference integrity for an entry: which entries reference it (backlinks) and which entries it references, with publish state. Useful before unpublishing or deleting.",
|
|
990
|
+
inputSchema: { ...projectArg, entry: z.string() },
|
|
991
|
+
annotations: { readOnlyHint: true, openWorldHint: true }
|
|
992
|
+
},
|
|
993
|
+
async (args) => {
|
|
994
|
+
try {
|
|
995
|
+
const { client, project } = registry.clientFor(args.project);
|
|
996
|
+
const id = await resolveEntryId(client, project, args.entry);
|
|
997
|
+
const refs = await client.entries.references(project, id);
|
|
998
|
+
return ok(
|
|
999
|
+
`Referenced by ${refs.referencedBy.length} entr(y/ies); references ${refs.references.length}.`,
|
|
1000
|
+
refs
|
|
1001
|
+
);
|
|
1002
|
+
} catch (error) {
|
|
1003
|
+
return fail(error);
|
|
1004
|
+
}
|
|
1005
|
+
}
|
|
1006
|
+
);
|
|
916
1007
|
server.registerTool(
|
|
917
1008
|
"myna_restore_revision",
|
|
918
1009
|
{
|
|
@@ -937,6 +1028,134 @@ function registerTools(server, registry) {
|
|
|
937
1028
|
}
|
|
938
1029
|
}
|
|
939
1030
|
);
|
|
1031
|
+
server.registerTool(
|
|
1032
|
+
"myna_schedule_change_set",
|
|
1033
|
+
{
|
|
1034
|
+
title: "Schedule change-set publish",
|
|
1035
|
+
description: "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).",
|
|
1036
|
+
inputSchema: {
|
|
1037
|
+
...projectArg,
|
|
1038
|
+
changeSet: z.string(),
|
|
1039
|
+
publishAt: z.string().optional().describe("ISO 8601 datetime to publish at. Omit with cancel=true."),
|
|
1040
|
+
cancel: z.boolean().optional().describe("Cancel the existing schedule instead."),
|
|
1041
|
+
confirm: z.literal(true).describe("Must be true.")
|
|
1042
|
+
},
|
|
1043
|
+
annotations: { readOnlyHint: false, destructiveHint: true, idempotentHint: true, openWorldHint: true }
|
|
1044
|
+
},
|
|
1045
|
+
async (args) => {
|
|
1046
|
+
try {
|
|
1047
|
+
if (Boolean(args.publishAt) === Boolean(args.cancel)) {
|
|
1048
|
+
throw new Error("Provide exactly one of `publishAt` or `cancel`.");
|
|
1049
|
+
}
|
|
1050
|
+
const { client, project } = registry.clientFor(args.project);
|
|
1051
|
+
const cs = args.cancel ? await client.changeSets.cancelSchedule(project, args.changeSet) : await client.changeSets.schedule(project, args.changeSet, args.publishAt);
|
|
1052
|
+
return ok(cs.scheduledAt ? `Scheduled for ${cs.scheduledAt}.` : "Schedule cancelled.", { changeSet: cs });
|
|
1053
|
+
} catch (error) {
|
|
1054
|
+
return fail(error);
|
|
1055
|
+
}
|
|
1056
|
+
}
|
|
1057
|
+
);
|
|
1058
|
+
server.registerTool(
|
|
1059
|
+
"myna_get_change_set_review",
|
|
1060
|
+
{
|
|
1061
|
+
title: "Get change-set review status",
|
|
1062
|
+
description: "Fetch a change set's reviews, comments, and latest automated check run in one call.",
|
|
1063
|
+
inputSchema: { ...projectArg, changeSet: z.string() },
|
|
1064
|
+
annotations: { readOnlyHint: true, openWorldHint: true }
|
|
1065
|
+
},
|
|
1066
|
+
async (args) => {
|
|
1067
|
+
try {
|
|
1068
|
+
const { client, project } = registry.clientFor(args.project);
|
|
1069
|
+
const [reviews, comments, checks] = await Promise.all([
|
|
1070
|
+
client.changeSets.reviews(project, args.changeSet),
|
|
1071
|
+
client.changeSets.comments(project, args.changeSet),
|
|
1072
|
+
client.changeSets.checks(project, args.changeSet)
|
|
1073
|
+
]);
|
|
1074
|
+
const approvals = reviews.filter((r) => r.status === "approved" && !r.stale).length;
|
|
1075
|
+
const failing = checks.filter((c) => c.status === "failed").length;
|
|
1076
|
+
return ok(
|
|
1077
|
+
`${approvals} fresh approval(s), ${comments.length} comment(s), ${checks.length === 0 ? "no check run" : `${failing} failing check(s)`}.`,
|
|
1078
|
+
{ reviews, comments, checks }
|
|
1079
|
+
);
|
|
1080
|
+
} catch (error) {
|
|
1081
|
+
return fail(error);
|
|
1082
|
+
}
|
|
1083
|
+
}
|
|
1084
|
+
);
|
|
1085
|
+
server.registerTool(
|
|
1086
|
+
"myna_review_change_set",
|
|
1087
|
+
{
|
|
1088
|
+
title: "Review change set",
|
|
1089
|
+
description: "Record an approve or request-changes review decision on a change set. Requires content:review scope.",
|
|
1090
|
+
inputSchema: {
|
|
1091
|
+
...projectArg,
|
|
1092
|
+
changeSet: z.string(),
|
|
1093
|
+
decision: z.enum(["approve", "request_changes"]),
|
|
1094
|
+
comment: z.string().optional().describe("Optional review comment.")
|
|
1095
|
+
},
|
|
1096
|
+
annotations: { readOnlyHint: false, destructiveHint: false, idempotentHint: true, openWorldHint: true }
|
|
1097
|
+
},
|
|
1098
|
+
async (args) => {
|
|
1099
|
+
try {
|
|
1100
|
+
const { client, project } = registry.clientFor(args.project);
|
|
1101
|
+
const reviews = args.decision === "approve" ? await client.changeSets.approve(project, args.changeSet, { comment: args.comment }) : await client.changeSets.requestChanges(project, args.changeSet, { comment: args.comment });
|
|
1102
|
+
return ok(`Recorded ${args.decision} review.`, { reviews });
|
|
1103
|
+
} catch (error) {
|
|
1104
|
+
return fail(error);
|
|
1105
|
+
}
|
|
1106
|
+
}
|
|
1107
|
+
);
|
|
1108
|
+
server.registerTool(
|
|
1109
|
+
"myna_comment_on_change_set",
|
|
1110
|
+
{
|
|
1111
|
+
title: "Comment on change set",
|
|
1112
|
+
description: "Add a comment to a change set, optionally anchored to an entry field.",
|
|
1113
|
+
inputSchema: {
|
|
1114
|
+
...projectArg,
|
|
1115
|
+
changeSet: z.string(),
|
|
1116
|
+
body: z.string().min(1),
|
|
1117
|
+
entry: z.string().optional().describe("Entry id (ent_) to anchor the comment to."),
|
|
1118
|
+
fieldPath: z.string().optional().describe("Field path within the entry, e.g. fields.title.")
|
|
1119
|
+
},
|
|
1120
|
+
annotations: { readOnlyHint: false, destructiveHint: false, idempotentHint: false, openWorldHint: true }
|
|
1121
|
+
},
|
|
1122
|
+
async (args) => {
|
|
1123
|
+
try {
|
|
1124
|
+
const { client, project } = registry.clientFor(args.project);
|
|
1125
|
+
const comment = await client.changeSets.comment(project, args.changeSet, {
|
|
1126
|
+
body: args.body,
|
|
1127
|
+
resourceType: args.entry ? "entry" : void 0,
|
|
1128
|
+
resourceId: args.entry,
|
|
1129
|
+
fieldPath: args.fieldPath
|
|
1130
|
+
});
|
|
1131
|
+
return ok(`Commented ${comment.id}.`, { comment });
|
|
1132
|
+
} catch (error) {
|
|
1133
|
+
return fail(error);
|
|
1134
|
+
}
|
|
1135
|
+
}
|
|
1136
|
+
);
|
|
1137
|
+
server.registerTool(
|
|
1138
|
+
"myna_run_change_set_checks",
|
|
1139
|
+
{
|
|
1140
|
+
title: "Run change-set checks",
|
|
1141
|
+
description: "Run the built-in automated checks (schema, references, slugs, alt-text, SEO) against a change set and return the results.",
|
|
1142
|
+
inputSchema: { ...projectArg, changeSet: z.string() },
|
|
1143
|
+
annotations: { readOnlyHint: false, destructiveHint: false, idempotentHint: true, openWorldHint: true }
|
|
1144
|
+
},
|
|
1145
|
+
async (args) => {
|
|
1146
|
+
try {
|
|
1147
|
+
const { client, project } = registry.clientFor(args.project);
|
|
1148
|
+
const result = await client.changeSets.runChecks(project, args.changeSet);
|
|
1149
|
+
const failing = result.checks.filter((c) => c.status === "failed");
|
|
1150
|
+
return ok(
|
|
1151
|
+
result.passed ? "All checks passed." : `Failing: ${failing.map((c) => c.name).join(", ")}.`,
|
|
1152
|
+
result
|
|
1153
|
+
);
|
|
1154
|
+
} catch (error) {
|
|
1155
|
+
return fail(error);
|
|
1156
|
+
}
|
|
1157
|
+
}
|
|
1158
|
+
);
|
|
940
1159
|
}
|
|
941
1160
|
|
|
942
1161
|
// src/resources.ts
|
|
@@ -1012,11 +1231,11 @@ function registerResources(server, registry) {
|
|
|
1012
1231
|
|
|
1013
1232
|
// src/server.ts
|
|
1014
1233
|
var SERVER_NAME = "myna";
|
|
1015
|
-
var SERVER_VERSION = "0.
|
|
1234
|
+
var SERVER_VERSION = "0.2.0";
|
|
1016
1235
|
function createServer() {
|
|
1017
1236
|
return createServerForRegistry(new ProjectRegistry());
|
|
1018
1237
|
}
|
|
1019
|
-
function createServerForRegistry(registry) {
|
|
1238
|
+
function createServerForRegistry(registry, toolOptions) {
|
|
1020
1239
|
const server = new McpServer2(
|
|
1021
1240
|
{ name: SERVER_NAME, version: SERVER_VERSION },
|
|
1022
1241
|
{
|
|
@@ -1024,7 +1243,7 @@ function createServerForRegistry(registry) {
|
|
|
1024
1243
|
instructions: "Myna MCP server: manage content, schemas, assets, change sets, and previews. The primary flow is: create a change set, apply entry/asset operations, validate, then create one preview URL. Publishing is a separate, confirmation-gated action."
|
|
1025
1244
|
}
|
|
1026
1245
|
);
|
|
1027
|
-
registerTools(server, registry);
|
|
1246
|
+
registerTools(server, registry, toolOptions);
|
|
1028
1247
|
registerResources(server, registry);
|
|
1029
1248
|
return server;
|
|
1030
1249
|
}
|
|
@@ -1053,6 +1272,11 @@ function bearer(req) {
|
|
|
1053
1272
|
return header?.startsWith("Bearer ") ? header.slice(7).trim() : void 0;
|
|
1054
1273
|
}
|
|
1055
1274
|
async function runHttp(options) {
|
|
1275
|
+
if (!options.authToken && !options.allowUnauthenticated) {
|
|
1276
|
+
throw new Error(
|
|
1277
|
+
"Refusing to serve HTTP without auth. Set MYNA_MCP_TOKEN (or MYNA_TOKEN), or set MYNA_MCP_ALLOW_UNAUTHENTICATED=1 for trusted-network use only."
|
|
1278
|
+
);
|
|
1279
|
+
}
|
|
1056
1280
|
const registry = new ProjectRegistry();
|
|
1057
1281
|
const path = options.path ?? "/mcp";
|
|
1058
1282
|
const httpServer = createHttpServer((req, res) => {
|
|
@@ -1083,7 +1307,7 @@ async function runHttp(options) {
|
|
|
1083
1307
|
}
|
|
1084
1308
|
const body = await readBody(req);
|
|
1085
1309
|
const transport = new StreamableHTTPServerTransport({ sessionIdGenerator: void 0 });
|
|
1086
|
-
const server = createServerForRegistry(registry);
|
|
1310
|
+
const server = createServerForRegistry(registry, { allowPathUploads: false });
|
|
1087
1311
|
res.on("close", () => {
|
|
1088
1312
|
void transport.close();
|
|
1089
1313
|
void server.close();
|
|
@@ -1102,7 +1326,10 @@ async function main(argv = process.argv.slice(2)) {
|
|
|
1102
1326
|
if (useHttp) {
|
|
1103
1327
|
const port = Number(process.env.MYNA_MCP_PORT ?? process.env.PORT ?? 3333);
|
|
1104
1328
|
const authToken = process.env.MYNA_MCP_TOKEN ?? process.env.MYNA_TOKEN;
|
|
1105
|
-
|
|
1329
|
+
const allowUnauthenticated = ["1", "true"].includes(
|
|
1330
|
+
process.env.MYNA_MCP_ALLOW_UNAUTHENTICATED ?? ""
|
|
1331
|
+
);
|
|
1332
|
+
await runHttp({ port, authToken, allowUnauthenticated });
|
|
1106
1333
|
return;
|
|
1107
1334
|
}
|
|
1108
1335
|
const server = createServer();
|
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 await runHttp({ port, authToken });\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 } from \"./tools.js\";\nimport { registerResources } from \"./resources.js\";\n\nexport const SERVER_NAME = \"myna\";\nexport const SERVER_VERSION = \"0.1.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(registry: ProjectRegistry): 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);\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 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 ChangeSetContract,\n CreateChangeSetRequest,\n UpdateChangeSetRequest,\n} from \"../../api-contracts/src/change-sets.js\";\nimport type {\n CollectionContract,\n CollectionVersionContract,\n SchemaDiffResponse,\n SchemaPushResponse,\n} from \"../../api-contracts/src/collections.js\";\nimport type {\n EntryContract,\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 ProjectContract,\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 };\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 };\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 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 };\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 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 return `${doc}${indent}${safeKey(field.key)}${optional}: ${fieldType(field, depth)};`;\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 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 = \"export type JsonValue = string | number | boolean | null | JsonValue[] | { [key: string]: JsonValue };\";\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 17 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 function registerTools(server: McpServer, registry: ProjectRegistry): 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 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 // 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","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 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 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 const server = createServerForRegistry(registry);\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/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"]}
|
package/package.json
CHANGED
|
@@ -1,12 +1,13 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@myna-sh/mcp",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.2.0",
|
|
4
4
|
"private": false,
|
|
5
5
|
"publishConfig": {
|
|
6
6
|
"access": "public"
|
|
7
7
|
},
|
|
8
8
|
"type": "module",
|
|
9
|
-
"license": "
|
|
9
|
+
"license": "MIT",
|
|
10
|
+
"homepage": "https://myna.sh",
|
|
10
11
|
"bin": {
|
|
11
12
|
"myna-mcp": "bin/mcp.mjs"
|
|
12
13
|
},
|
|
@@ -18,7 +19,9 @@
|
|
|
18
19
|
},
|
|
19
20
|
"files": [
|
|
20
21
|
"dist",
|
|
21
|
-
"bin"
|
|
22
|
+
"bin",
|
|
23
|
+
"README.md",
|
|
24
|
+
"LICENSE"
|
|
22
25
|
],
|
|
23
26
|
"dependencies": {
|
|
24
27
|
"@modelcontextprotocol/sdk": "1.20.0",
|
|
@@ -29,7 +32,7 @@
|
|
|
29
32
|
"eslint": "9.39.5",
|
|
30
33
|
"typescript": "5.9.3",
|
|
31
34
|
"@myna-sh/api-contracts": "0.0.0",
|
|
32
|
-
"@myna-sh/sdk": "0.
|
|
35
|
+
"@myna-sh/sdk": "0.2.0",
|
|
33
36
|
"@myna-sh/config": "0.0.0"
|
|
34
37
|
},
|
|
35
38
|
"scripts": {
|