@myna-sh/mcp 0.4.1 → 0.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -28,7 +28,7 @@ Configure your MCP client to run:
28
28
  }
29
29
  ```
30
30
 
31
- Use a narrowly scoped Myna API key and keep it out of source control.
31
+ Use a narrowly scoped Myna API key and keep it out of source control. A key can also be confined to specific collections (`myna keys create --collections changelog`), which is worth doing for an agent with one job: the server then cannot reach content outside it, whatever it is asked to do.
32
32
 
33
33
  ## Streamable HTTP
34
34
 
package/dist/main.js CHANGED
@@ -340,6 +340,12 @@ var ManagementClient = class {
340
340
  collections: (project, signal) => this.get(`/projects/${enc(project)}/collections`, void 0, signal),
341
341
  collection: (project, key, signal) => this.get(`/projects/${enc(project)}/collections/${enc(key)}`, void 0, signal),
342
342
  versions: (project, key, signal) => this.get(`/projects/${enc(project)}/collections/${enc(key)}/versions`, void 0, signal),
343
+ /** What is still untranslated in a collection, per project locale. */
344
+ translations: (project, key, signal) => this.get(
345
+ `/projects/${enc(project)}/collections/${enc(key)}/translations`,
346
+ void 0,
347
+ signal
348
+ ),
343
349
  diff: (project, collections) => this.mutate("POST", `/projects/${enc(project)}/schema/diff`, { collections }),
344
350
  push: (project, collections, opts = {}) => this.mutate("POST", `/projects/${enc(project)}/schema/push`, {
345
351
  collections,
@@ -358,7 +364,8 @@ var ManagementClient = class {
358
364
  entries = {
359
365
  list: (project, opts = {}) => this.page(`/projects/${enc(project)}/entries`, opts, {
360
366
  collection: opts.collection,
361
- status: opts.status
367
+ status: opts.status,
368
+ q: opts.q
362
369
  }),
363
370
  create: (project, body) => this.mutate("POST", `/projects/${enc(project)}/entries`, body),
364
371
  get: (project, entry, signal) => this.get(`/projects/${enc(project)}/entries/${enc(entry)}`, void 0, signal),
@@ -438,7 +445,25 @@ var ManagementClient = class {
438
445
  void 0,
439
446
  signal
440
447
  ),
441
- runChecks: (project, changeSet) => this.mutate("POST", `/projects/${enc(project)}/change-sets/${enc(changeSet)}/checks/run`)
448
+ runChecks: (project, changeSet) => this.mutate("POST", `/projects/${enc(project)}/change-sets/${enc(changeSet)}/checks/run`),
449
+ /** Report a verdict Myna cannot compute, against the current contents. */
450
+ reportCheck: (project, changeSet, name, body) => this.mutate(
451
+ "POST",
452
+ `/projects/${enc(project)}/change-sets/${enc(changeSet)}/checks/${enc(name)}`,
453
+ body
454
+ ),
455
+ /** Field-level before/after for everything this change set would change. */
456
+ diff: (project, changeSet, signal) => this.get(
457
+ `/projects/${enc(project)}/change-sets/${enc(changeSet)}/diff`,
458
+ void 0,
459
+ signal
460
+ )
461
+ };
462
+ // --- Declared external checks ---------------------------------------------
463
+ checks = {
464
+ list: (project, signal) => this.get(`/projects/${enc(project)}/checks`, void 0, signal),
465
+ declare: (project, body) => this.mutate("POST", `/projects/${enc(project)}/checks`, body),
466
+ remove: (project, name) => this.mutate("DELETE", `/projects/${enc(project)}/checks/${enc(name)}`)
442
467
  };
443
468
  // --- Previews -------------------------------------------------------------
444
469
  previews = {
@@ -452,7 +477,11 @@ var ManagementClient = class {
452
477
  completeUpload: (project, upload) => this.mutate("POST", `/projects/${enc(project)}/assets/uploads/${enc(upload)}/complete`).then(
453
478
  (r) => r.asset
454
479
  ),
455
- list: (project, opts = {}) => this.page(`/projects/${enc(project)}/assets`, opts),
480
+ list: (project, opts = {}) => this.page(`/projects/${enc(project)}/assets`, opts, {
481
+ tag: opts.tag,
482
+ checksum: opts.checksum,
483
+ orphaned: opts.orphaned ? "true" : void 0
484
+ }),
456
485
  get: (project, asset, signal) => this.get(`/projects/${enc(project)}/assets/${enc(asset)}`, void 0, signal),
457
486
  usage: (project, asset, signal) => this.get(`/projects/${enc(project)}/assets/${enc(asset)}`, { usage: "true" }, signal),
458
487
  update: (project, asset, body) => this.mutate("PATCH", `/projects/${enc(project)}/assets/${enc(asset)}`, body),
@@ -1276,6 +1305,387 @@ function registerTools(server, registry, options = { allowPathUploads: true }) {
1276
1305
  }
1277
1306
  }
1278
1307
  );
1308
+ server.registerTool(
1309
+ "myna_list_change_sets",
1310
+ {
1311
+ title: "List change sets",
1312
+ description: "List change sets in a project, newest first, optionally filtered by status (open, ready, published, closed). Use this to find work already in progress before starting a new change set.",
1313
+ inputSchema: {
1314
+ ...projectArg,
1315
+ status: z.enum(["open", "ready", "published", "closed"]).optional(),
1316
+ limit: z.number().int().min(1).max(100).optional(),
1317
+ cursor: z.string().optional()
1318
+ },
1319
+ annotations: { readOnlyHint: true, openWorldHint: true }
1320
+ },
1321
+ async (args) => {
1322
+ try {
1323
+ const { client, project } = registry.clientFor(args.project);
1324
+ const page = await client.changeSets.list(project, {
1325
+ ...args.status ? { status: args.status } : {},
1326
+ ...args.limit ? { limit: args.limit } : {},
1327
+ ...args.cursor ? { cursor: args.cursor } : {}
1328
+ });
1329
+ return ok(`${page.data.length} change set(s).`, page);
1330
+ } catch (error) {
1331
+ return fail(error);
1332
+ }
1333
+ }
1334
+ );
1335
+ server.registerTool(
1336
+ "myna_diff_change_set",
1337
+ {
1338
+ title: "Diff a change set",
1339
+ description: "Show what a change set would change, field by field: per item, the operation, the collection and slug, and every changed field with its before and after value. This is what a reviewer reads; use it to summarize your own work or to review someone else's.",
1340
+ inputSchema: { ...projectArg, changeSet: z.string() },
1341
+ annotations: { readOnlyHint: true, openWorldHint: true }
1342
+ },
1343
+ async (args) => {
1344
+ try {
1345
+ const { client, project } = registry.clientFor(args.project);
1346
+ const diff = await client.changeSets.diff(project, args.changeSet);
1347
+ const fields = diff.items.reduce((n, i) => n + i.changes.length, 0);
1348
+ return ok(`${diff.items.length} item(s), ${fields} changed field(s).`, diff);
1349
+ } catch (error) {
1350
+ return fail(error);
1351
+ }
1352
+ }
1353
+ );
1354
+ server.registerTool(
1355
+ "myna_update_change_set",
1356
+ {
1357
+ title: "Update a change set",
1358
+ description: "Rename a change set, change its description, or mark it ready for review. Marking it ready signals that a human is needed and emits change_set.ready_for_review.",
1359
+ inputSchema: {
1360
+ ...projectArg,
1361
+ changeSet: z.string(),
1362
+ title: z.string().min(1).max(200).optional(),
1363
+ description: z.string().max(2e3).optional(),
1364
+ status: z.enum(["open", "ready"]).optional()
1365
+ },
1366
+ annotations: { readOnlyHint: false, destructiveHint: false, idempotentHint: true, openWorldHint: true }
1367
+ },
1368
+ async (args) => {
1369
+ try {
1370
+ const { client, project } = registry.clientFor(args.project);
1371
+ const cs = await client.changeSets.update(project, args.changeSet, {
1372
+ ...args.title ? { title: args.title } : {},
1373
+ ...args.description ? { description: args.description } : {},
1374
+ ...args.status ? { status: args.status } : {}
1375
+ });
1376
+ return ok(`Change set ${cs.id} is ${cs.status}.`, { changeSet: cs });
1377
+ } catch (error) {
1378
+ return fail(error);
1379
+ }
1380
+ }
1381
+ );
1382
+ server.registerTool(
1383
+ "myna_close_change_set",
1384
+ {
1385
+ title: "Close a change set",
1386
+ description: "Abandon a change set without publishing it. The staged drafts and their revisions remain in history; the set simply stops being work in progress. Use this when a task is cancelled, so open sets do not accumulate. Requires confirm=true.",
1387
+ inputSchema: { ...projectArg, changeSet: z.string(), confirm: z.literal(true).describe("Must be true.") },
1388
+ annotations: { readOnlyHint: false, destructiveHint: true, idempotentHint: true, openWorldHint: true }
1389
+ },
1390
+ async (args) => {
1391
+ try {
1392
+ const { client, project } = registry.clientFor(args.project);
1393
+ const cs = await client.changeSets.close(project, args.changeSet);
1394
+ return ok(`Closed ${cs.id}.`, { changeSet: cs });
1395
+ } catch (error) {
1396
+ return fail(error);
1397
+ }
1398
+ }
1399
+ );
1400
+ server.registerTool(
1401
+ "myna_request_change_set_review",
1402
+ {
1403
+ title: "Request review",
1404
+ description: "Ask a specific person to review a change set. Pass their user id. Requires content:review scope.",
1405
+ inputSchema: {
1406
+ ...projectArg,
1407
+ changeSet: z.string(),
1408
+ reviewerId: z.string().describe("User id (usr_) to assign as reviewer.")
1409
+ },
1410
+ annotations: { readOnlyHint: false, destructiveHint: false, idempotentHint: true, openWorldHint: true }
1411
+ },
1412
+ async (args) => {
1413
+ try {
1414
+ const { client, project } = registry.clientFor(args.project);
1415
+ const reviews = await client.changeSets.requestReview(project, args.changeSet, {
1416
+ reviewerType: "user",
1417
+ reviewerId: args.reviewerId
1418
+ });
1419
+ return ok(`${reviews.length} reviewer(s) assigned.`, { reviews });
1420
+ } catch (error) {
1421
+ return fail(error);
1422
+ }
1423
+ }
1424
+ );
1425
+ server.registerTool(
1426
+ "myna_report_check_result",
1427
+ {
1428
+ title: "Report an external check result",
1429
+ description: "Report the verdict of a check Myna cannot compute itself \u2014 a link check, a house-style review, an external build. The check must have been declared on the project first. The result is recorded against the change set's current contents, so later edits mark it stale. A failing required check blocks publish. Requires content:review scope.",
1430
+ inputSchema: {
1431
+ ...projectArg,
1432
+ changeSet: z.string(),
1433
+ name: z.string().describe("The declared check name, e.g. links."),
1434
+ status: z.enum(["passed", "failed", "skipped"]),
1435
+ details: z.array(
1436
+ z.object({
1437
+ resourceId: z.string().optional(),
1438
+ path: z.string().optional(),
1439
+ message: z.string()
1440
+ })
1441
+ ).optional().describe("What the check found; shown to the reviewer.")
1442
+ },
1443
+ annotations: { readOnlyHint: false, destructiveHint: false, idempotentHint: false, openWorldHint: true }
1444
+ },
1445
+ async (args) => {
1446
+ try {
1447
+ const { client, project } = registry.clientFor(args.project);
1448
+ const check = await client.changeSets.reportCheck(project, args.changeSet, args.name, {
1449
+ status: args.status,
1450
+ ...args.details ? { details: args.details } : {}
1451
+ });
1452
+ return ok(`Reported ${args.name}: ${check.status}.`, { check });
1453
+ } catch (error) {
1454
+ return fail(error);
1455
+ }
1456
+ }
1457
+ );
1458
+ server.registerTool(
1459
+ "myna_search_entries",
1460
+ {
1461
+ title: "Search entries",
1462
+ description: 'Full-text search across every text field of an entry, matching either its draft or its published state. Use this to find the entry a human described in prose ("the pricing page", "the post about webhooks") instead of listing a collection and scanning it.',
1463
+ inputSchema: {
1464
+ ...projectArg,
1465
+ query: z.string().min(1).describe("Words to search for. Supports quoted phrases and -exclusions."),
1466
+ collection: z.string().optional().describe("Restrict to one collection."),
1467
+ limit: z.number().int().min(1).max(100).optional()
1468
+ },
1469
+ annotations: { readOnlyHint: true, openWorldHint: true }
1470
+ },
1471
+ async (args) => {
1472
+ try {
1473
+ const { client, project } = registry.clientFor(args.project);
1474
+ const page = await client.entries.list(project, {
1475
+ q: args.query,
1476
+ ...args.collection ? { collection: args.collection } : {},
1477
+ limit: args.limit ?? 20
1478
+ });
1479
+ return ok(`${page.data.length} match(es) for "${args.query}".`, page);
1480
+ } catch (error) {
1481
+ return fail(error);
1482
+ }
1483
+ }
1484
+ );
1485
+ server.registerTool(
1486
+ "myna_unpublish_entry",
1487
+ {
1488
+ title: "Unpublish an entry",
1489
+ description: "Stage the removal of an entry from published content. Like every write this is a draft operation: it takes effect when the change set is published. The entry and its history are kept. Requires confirm=true.",
1490
+ inputSchema: {
1491
+ ...projectArg,
1492
+ entry: z.string(),
1493
+ changeSet: z.string().optional(),
1494
+ confirm: z.literal(true).describe("Must be true.")
1495
+ },
1496
+ annotations: { readOnlyHint: false, destructiveHint: true, idempotentHint: true, openWorldHint: true }
1497
+ },
1498
+ async (args) => {
1499
+ try {
1500
+ const { client, project } = registry.clientFor(args.project);
1501
+ const id = await resolveEntryId(client, project, args.entry);
1502
+ const result = await client.entries.unpublish(project, id, args.changeSet);
1503
+ return ok(`Unpublish staged on ${result.changeSetId}.`, result);
1504
+ } catch (error) {
1505
+ return fail(error);
1506
+ }
1507
+ }
1508
+ );
1509
+ server.registerTool(
1510
+ "myna_duplicate_entry",
1511
+ {
1512
+ title: "Duplicate an entry",
1513
+ description: "Copy an entry into a new draft with a fresh slug. Useful as a starting point when a new entry should follow the shape of an existing one.",
1514
+ inputSchema: { ...projectArg, entry: z.string(), changeSet: z.string().optional() },
1515
+ annotations: { readOnlyHint: false, destructiveHint: false, idempotentHint: false, openWorldHint: true }
1516
+ },
1517
+ async (args) => {
1518
+ try {
1519
+ const { client, project } = registry.clientFor(args.project);
1520
+ const id = await resolveEntryId(client, project, args.entry);
1521
+ const entry = await client.entries.duplicate(project, id, args.changeSet);
1522
+ return ok(`Created ${entry.id} (${entry.slug ?? "no slug"}).`, { entry });
1523
+ } catch (error) {
1524
+ return fail(error);
1525
+ }
1526
+ }
1527
+ );
1528
+ server.registerTool(
1529
+ "myna_import_entries",
1530
+ {
1531
+ title: "Import entries",
1532
+ description: "Create or update many entries in one collection in a single call, matched by slug: rows that already exist are updated, identical rows are skipped. Use dryRun=true first to see what would happen. Everything lands as drafts on one change set.",
1533
+ inputSchema: {
1534
+ ...projectArg,
1535
+ collection: z.string(),
1536
+ entries: z.array(z.object({ slug: z.string().optional(), data: z.record(z.string(), z.unknown()) })).min(1).max(500),
1537
+ changeSet: z.string().optional(),
1538
+ changeSummary: z.string().optional(),
1539
+ dryRun: z.boolean().optional().describe("Report what would change without writing.")
1540
+ },
1541
+ annotations: { readOnlyHint: false, destructiveHint: false, idempotentHint: true, openWorldHint: true }
1542
+ },
1543
+ async (args) => {
1544
+ try {
1545
+ const { client, project } = registry.clientFor(args.project);
1546
+ const result = await client.entries.import(project, {
1547
+ collection: args.collection,
1548
+ entries: args.entries,
1549
+ ...args.changeSet ? { changeSetId: args.changeSet } : {},
1550
+ ...args.changeSummary ? { changeSummary: args.changeSummary } : {},
1551
+ ...args.dryRun !== void 0 ? { dryRun: args.dryRun } : {}
1552
+ });
1553
+ const { created, updated, unchanged, invalid } = result.summary;
1554
+ return ok(
1555
+ `${args.dryRun ? "Would import" : "Imported"}: ${created} created, ${updated} updated, ${unchanged} unchanged, ${invalid} invalid.`,
1556
+ result
1557
+ );
1558
+ } catch (error) {
1559
+ return fail(error);
1560
+ }
1561
+ }
1562
+ );
1563
+ server.registerTool(
1564
+ "myna_reorder_entries",
1565
+ {
1566
+ title: "Reorder a collection",
1567
+ description: "Set the editorial order of a collection. Unlike every other write, ordering is arrangement rather than content: it carries no revision, is not staged on a change set, and reaches readers immediately \u2014 which is why confirm=true is required. Never use it to change what an entry says.",
1568
+ inputSchema: {
1569
+ ...projectArg,
1570
+ collection: z.string(),
1571
+ order: z.array(z.string()).optional().describe("Entry ids in the intended order."),
1572
+ move: z.object({ entry: z.string(), before: z.string().optional(), after: z.string().optional() }).optional().describe("Move one entry relative to another, instead of listing the whole order."),
1573
+ confirm: z.literal(true).describe("Must be true: this is immediately visible to readers.")
1574
+ },
1575
+ annotations: { readOnlyHint: false, destructiveHint: true, idempotentHint: true, openWorldHint: true }
1576
+ },
1577
+ async (args) => {
1578
+ try {
1579
+ if (Boolean(args.order) === Boolean(args.move)) {
1580
+ throw new Error("Provide exactly one of `order` or `move`.");
1581
+ }
1582
+ const { client, project } = registry.clientFor(args.project);
1583
+ const result = await client.entries.reorder(project, args.collection, {
1584
+ ...args.order ? { order: args.order } : {},
1585
+ ...args.move ? { move: args.move } : {}
1586
+ });
1587
+ return ok(`Reordered with ${result.writes} write(s).`, result);
1588
+ } catch (error) {
1589
+ return fail(error);
1590
+ }
1591
+ }
1592
+ );
1593
+ server.registerTool(
1594
+ "myna_list_assets",
1595
+ {
1596
+ title: "List assets",
1597
+ description: "List a project's assets, optionally filtered by tag or checksum. Check here before uploading: an asset that already exists should be referenced, not uploaded again.",
1598
+ inputSchema: {
1599
+ ...projectArg,
1600
+ tag: z.string().optional(),
1601
+ checksum: z.string().optional().describe("MD5 hex; finds an identical file already uploaded."),
1602
+ limit: z.number().int().min(1).max(100).optional(),
1603
+ cursor: z.string().optional()
1604
+ },
1605
+ annotations: { readOnlyHint: true, openWorldHint: true }
1606
+ },
1607
+ async (args) => {
1608
+ try {
1609
+ const { client, project } = registry.clientFor(args.project);
1610
+ const page = await client.assets.list(project, {
1611
+ ...args.tag ? { tag: args.tag } : {},
1612
+ ...args.checksum ? { checksum: args.checksum } : {},
1613
+ ...args.limit ? { limit: args.limit } : {},
1614
+ ...args.cursor ? { cursor: args.cursor } : {}
1615
+ });
1616
+ return ok(`${page.data.length} asset(s).`, page);
1617
+ } catch (error) {
1618
+ return fail(error);
1619
+ }
1620
+ }
1621
+ );
1622
+ server.registerTool(
1623
+ "myna_get_asset",
1624
+ {
1625
+ title: "Get an asset",
1626
+ description: "Fetch one asset: its delivery URL, content type, byte size, pixel dimensions, alt text, and tags.",
1627
+ inputSchema: { ...projectArg, asset: z.string().describe("Asset id (ast_).") },
1628
+ annotations: { readOnlyHint: true, openWorldHint: true }
1629
+ },
1630
+ async (args) => {
1631
+ try {
1632
+ const { client, project } = registry.clientFor(args.project);
1633
+ const asset = await client.assets.get(project, args.asset);
1634
+ return ok(`${asset.displayFilename} (${asset.contentType}).`, { asset });
1635
+ } catch (error) {
1636
+ return fail(error);
1637
+ }
1638
+ }
1639
+ );
1640
+ server.registerTool(
1641
+ "myna_update_asset",
1642
+ {
1643
+ title: "Update asset metadata",
1644
+ description: "Set an asset's alt text, caption, display filename, or tags. Alt text in particular is what the built-in alt-text check looks for, so filling it in here clears that check.",
1645
+ inputSchema: {
1646
+ ...projectArg,
1647
+ asset: z.string(),
1648
+ defaultAlt: z.string().optional(),
1649
+ caption: z.string().optional(),
1650
+ displayFilename: z.string().optional(),
1651
+ tags: z.array(z.string()).optional()
1652
+ },
1653
+ annotations: { readOnlyHint: false, destructiveHint: false, idempotentHint: true, openWorldHint: true }
1654
+ },
1655
+ async (args) => {
1656
+ try {
1657
+ const { client, project } = registry.clientFor(args.project);
1658
+ const asset = await client.assets.update(project, args.asset, {
1659
+ ...args.defaultAlt !== void 0 ? { defaultAlt: args.defaultAlt } : {},
1660
+ ...args.caption !== void 0 ? { caption: args.caption } : {},
1661
+ ...args.displayFilename !== void 0 ? { displayFilename: args.displayFilename } : {},
1662
+ ...args.tags !== void 0 ? { tags: args.tags } : {}
1663
+ });
1664
+ return ok(`Updated ${asset.id}.`, { asset });
1665
+ } catch (error) {
1666
+ return fail(error);
1667
+ }
1668
+ }
1669
+ );
1670
+ server.registerTool(
1671
+ "myna_translation_coverage",
1672
+ {
1673
+ title: "Translation coverage",
1674
+ description: "Report what is still untranslated in a collection, per project locale: how complete each locale is, which fields are missing most often, and a worklist of entries to fix. Empty when the project has no locales or the collection has no localized fields.",
1675
+ inputSchema: { ...projectArg, collection: z.string() },
1676
+ annotations: { readOnlyHint: true, openWorldHint: true }
1677
+ },
1678
+ async (args) => {
1679
+ try {
1680
+ const { client, project } = registry.clientFor(args.project);
1681
+ const report = await client.schema.translations(project, args.collection);
1682
+ const summary = report.coverage.map((c) => `${c.locale} ${c.percent}%`).join(", ");
1683
+ return ok(summary || "No localized fields.", report);
1684
+ } catch (error) {
1685
+ return fail(error);
1686
+ }
1687
+ }
1688
+ );
1279
1689
  }
1280
1690
 
1281
1691
  // src/resources.ts
@@ -1350,7 +1760,7 @@ function registerResources(server, registry) {
1350
1760
  }
1351
1761
 
1352
1762
  // src/version.ts
1353
- var VERSION = true ? "0.4.1" : "0.0.0-dev";
1763
+ var VERSION = true ? "0.5.0" : "0.0.0-dev";
1354
1764
 
1355
1765
  // src/server.ts
1356
1766
  var SERVER_NAME = "myna";
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/version.ts","../src/http.ts"],"sourcesContent":["import { StdioServerTransport } from \"@modelcontextprotocol/sdk/server/stdio.js\";\nimport { createServer } from \"./server.js\";\nimport { runHttp } from \"./http.js\";\n\n/** Run over stdio (default) or streamable HTTP (`--http`). */\nexport async function main(argv: string[] = process.argv.slice(2)): Promise<void> {\n const useHttp = argv.includes(\"--http\") || process.env.MYNA_MCP_TRANSPORT === \"http\";\n\n if (useHttp) {\n const port = Number(process.env.MYNA_MCP_PORT ?? process.env.PORT ?? 3333);\n const authToken = process.env.MYNA_MCP_TOKEN ?? process.env.MYNA_TOKEN;\n const allowUnauthenticated = [\"1\", \"true\"].includes(\n process.env.MYNA_MCP_ALLOW_UNAUTHENTICATED ?? \"\",\n );\n await runHttp({ port, authToken, allowUnauthenticated });\n return;\n }\n\n const server = createServer();\n const transport = new StdioServerTransport();\n await server.connect(transport);\n // Keep the process alive; the transport closes on stdin end.\n process.stderr.write(\"myna-mcp: stdio transport ready\\n\");\n}\n\nexport { createServer, createServerForRegistry, SERVER_NAME, SERVER_VERSION } from \"./server.js\";\nexport { runHttp } from \"./http.js\";\nexport { ProjectRegistry, type RegistryOptions } from \"./config.js\";\nexport { VERSION } from \"./version.js\";\n","import { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { ProjectRegistry } from \"./config.js\";\nimport { registerTools, type ToolOptions } from \"./tools.js\";\nimport { registerResources } from \"./resources.js\";\nimport { VERSION } from \"./version.js\";\n\nexport const SERVER_NAME = \"myna\";\nexport const SERVER_VERSION = VERSION;\n\n/** Build a fully-wired Myna MCP server (tools + resources). */\nexport function createServer(): McpServer {\n return createServerForRegistry(new ProjectRegistry());\n}\n\n/** Internal variant used by the stateless HTTP transport. */\nexport function createServerForRegistry(\n registry: ProjectRegistry,\n toolOptions?: ToolOptions,\n): McpServer {\n const server = new McpServer(\n { name: SERVER_NAME, version: SERVER_VERSION },\n {\n capabilities: { tools: {}, resources: {} },\n instructions:\n \"Myna MCP server: manage content, schemas, assets, change sets, and previews. \" +\n \"The primary flow is: create a change set, apply entry/asset operations, validate, \" +\n \"then create one preview URL. Publishing is a separate, confirmation-gated action.\",\n },\n );\n registerTools(server, registry, toolOptions);\n registerResources(server, registry);\n return server;\n}\n","import { readFileSync } from \"node:fs\";\nimport { homedir } from \"node:os\";\nimport { join } from \"node:path\";\nimport { createManagementClient, type ManagementClient } from \"@myna-sh/sdk/management\";\n\n/**\n * Named project configurations (SPEC 13). A default project plus per-call\n * overrides. Configuration comes from the environment and an optional JSON file\n * (`MYNA_MCP_CONFIG` or `~/.config/myna/mcp.json`).\n */\n\nexport interface NamedProject {\n project: string;\n organization?: string;\n apiUrl?: string;\n token?: string;\n}\n\nexport interface McpConfigFile {\n default?: string;\n apiUrl?: string;\n token?: string;\n projects?: Record<string, NamedProject>;\n}\n\nconst DEFAULT_API_URL = \"https://api.myna.sh\";\n\nexport interface RegistryOptions {\n /**\n * Skip the on-disk config file. The hosted server builds one registry per\n * request from the caller's OAuth grant; it must never pick up whatever\n * `~/.config/myna/mcp.json` happens to exist on the host.\n */\n ignoreConfigFile?: boolean;\n /** Replaces the \"set MYNA_PROJECT\" advice, which is meaningless remotely. */\n noProjectHint?: string;\n}\n\nexport class ProjectRegistry {\n private readonly file: McpConfigFile;\n private readonly clients = new Map<string, ManagementClient>();\n private readonly options: RegistryOptions;\n\n constructor(\n private readonly env: NodeJS.ProcessEnv = process.env,\n options: RegistryOptions = {},\n ) {\n this.options = options;\n this.file = options.ignoreConfigFile ? {} : loadConfigFile(env);\n }\n\n /**\n * A registry bound to a single credential, for the hosted (multi-tenant)\n * server. Every request builds its own; nothing is shared between callers.\n */\n static forCredential(input: {\n apiUrl: string;\n token: string;\n organization?: string;\n }): ProjectRegistry {\n return new ProjectRegistry(\n {\n MYNA_API_URL: input.apiUrl,\n MYNA_TOKEN: input.token,\n ...(input.organization ? { MYNA_ORGANIZATION: input.organization } : {}),\n } as NodeJS.ProcessEnv,\n {\n ignoreConfigFile: true,\n noProjectHint:\n \"No project specified. Pass `project` (an id or slug); use myna_list_projects to see them.\",\n },\n );\n }\n\n private get defaultApiUrl(): string {\n return this.env.MYNA_API_URL ?? this.file.apiUrl ?? DEFAULT_API_URL;\n }\n\n private get defaultToken(): string | undefined {\n return this.env.MYNA_TOKEN ?? this.file.token;\n }\n\n /** The named-project key used when a call omits `project`. */\n defaultProjectName(): string | undefined {\n return this.file.default ?? (this.env.MYNA_PROJECT ? \"__env\" : undefined);\n }\n\n /** All configured named projects (env default included). */\n list(): Array<{ name: string; project: string; organization?: string }> {\n const out: Array<{ name: string; project: string; organization?: string }> = [];\n if (this.env.MYNA_PROJECT) {\n out.push({ name: \"__env\", project: this.env.MYNA_PROJECT, organization: this.env.MYNA_ORGANIZATION });\n }\n for (const [name, cfg] of Object.entries(this.file.projects ?? {})) {\n out.push({ name, project: cfg.project, organization: cfg.organization });\n }\n return out;\n }\n\n /**\n * Resolve credentials without demanding a project.\n *\n * Org-scoped calls — listing projects above all — have no project to name\n * yet. A hosted connector is bound to an organization, not a project, so\n * requiring one here made discovery impossible: the tool an agent must call\n * first was the one that could not run.\n */\n resolveCredential(ref?: string): {\n project: string | null;\n organization?: string;\n apiUrl: string;\n token: string | undefined;\n } {\n // A named configuration.\n if (ref && this.file.projects?.[ref]) {\n const cfg = this.file.projects[ref]!;\n return {\n project: cfg.project,\n organization: cfg.organization,\n apiUrl: cfg.apiUrl ?? this.defaultApiUrl,\n token: cfg.token ?? this.defaultToken,\n };\n }\n // The env default named project.\n if ((!ref || ref === \"__env\") && this.env.MYNA_PROJECT) {\n return {\n project: ref && ref !== \"__env\" ? ref : this.env.MYNA_PROJECT,\n organization: this.env.MYNA_ORGANIZATION,\n apiUrl: this.defaultApiUrl,\n token: this.defaultToken,\n };\n }\n // A default named config.\n if (!ref && this.file.default && this.file.projects?.[this.file.default]) {\n return this.resolveCredential(this.file.default);\n }\n return {\n project: ref ?? null,\n organization: this.env.MYNA_ORGANIZATION,\n apiUrl: this.defaultApiUrl,\n token: this.defaultToken,\n };\n }\n\n /** Resolve a project reference: an explicit id/slug, a named config, or the default. */\n resolve(ref?: string): { project: string; organization?: string; apiUrl: string; token: string | undefined } {\n const resolved = this.resolveCredential(ref);\n if (!resolved.project) {\n throw new Error(\n this.options.noProjectHint ??\n \"No project specified and no default is configured (set MYNA_PROJECT or configure a default).\",\n );\n }\n return { ...resolved, project: resolved.project };\n }\n\n private clientFrom(apiUrl: string, token: string | undefined): ManagementClient {\n if (!token) {\n throw new Error(\"No credential available. Set MYNA_TOKEN or configure a token for the project.\");\n }\n const cacheKey = `${apiUrl}::${token}`;\n let client = this.clients.get(cacheKey);\n if (!client) {\n client = createManagementClient({ token, apiUrl });\n this.clients.set(cacheKey, client);\n }\n return client;\n }\n\n /** A management client bound to the resolved project's API + token. */\n clientFor(ref?: string): { client: ManagementClient; project: string; organization?: string } {\n const resolved = this.resolve(ref);\n return {\n client: this.clientFrom(resolved.apiUrl, resolved.token),\n project: resolved.project,\n organization: resolved.organization,\n };\n }\n\n /** A management client for an org-scoped call, where no project is required. */\n clientForOrg(ref?: string): { client: ManagementClient; organization?: string } {\n const resolved = this.resolveCredential(ref);\n return {\n client: this.clientFrom(resolved.apiUrl, resolved.token),\n organization: resolved.organization,\n };\n }\n\n /** Resolve an organization for org-scoped calls. */\n organizationFor(ref?: string, organizationOverride?: string): string {\n const resolved = this.resolveCredential(ref);\n const org = organizationOverride ?? resolved.organization;\n if (!org) throw new Error(\"No organization specified. Provide `organization` or configure one for the project.\");\n return org;\n }\n}\n\nfunction loadConfigFile(env: NodeJS.ProcessEnv): McpConfigFile {\n const explicit = env.MYNA_MCP_CONFIG;\n const candidates = [explicit, join(env.XDG_CONFIG_HOME ?? join(homedir(), \".config\"), \"myna\", \"mcp.json\")].filter(\n (v): v is string => Boolean(v),\n );\n for (const path of candidates) {\n try {\n return JSON.parse(readFileSync(path, \"utf8\")) as McpConfigFile;\n } catch {\n // Try next candidate.\n }\n }\n return {};\n}\n","import type { FieldErrorContract, ProblemDetailsContract } from \"../../api-contracts/src/common.js\";\n\n/**\n * Error thrown by both SDK clients when the API returns a non-2xx response.\n * Carries the parsed RFC 9457 problem-details document so callers can branch on\n * the stable `code`, inspect field-level `fields`, and surface the `requestId`.\n */\nexport class MynaApiError extends Error {\n /** HTTP status code. */\n readonly status: number;\n /** Stable machine-readable error code (e.g. `VALIDATION_FAILED`). */\n readonly code: string;\n /** RFC 9457 `type` URI. */\n readonly type: string | undefined;\n /** Human-facing title. */\n readonly title: string;\n /** Longer human-facing detail, when provided. */\n readonly detail: string | undefined;\n /** Server request id for support/correlation. */\n readonly requestId: string | undefined;\n /** Field-level validation errors, when present. */\n readonly fields: FieldErrorContract[] | undefined;\n /** The full parsed problem document (or a synthesized one). */\n readonly problem: ProblemDetailsContract;\n\n constructor(problem: ProblemDetailsContract) {\n super(problem.detail ?? problem.title ?? `Request failed (${problem.status})`);\n this.name = \"MynaApiError\";\n this.status = problem.status;\n this.code = problem.code;\n this.type = problem.type;\n this.title = problem.title;\n this.detail = problem.detail;\n this.requestId = problem.requestId;\n this.fields = problem.fields;\n this.problem = problem;\n Object.setPrototypeOf(this, MynaApiError.prototype);\n }\n\n static is(value: unknown): value is MynaApiError {\n return value instanceof MynaApiError;\n }\n}\n\n/** Type guard for `MynaApiError`. */\nexport function isMynaApiError(value: unknown): value is MynaApiError {\n return value instanceof MynaApiError;\n}\n\n/** Build a `MynaApiError` from an arbitrary response body and status. */\nexport function problemFromResponse(status: number, body: unknown, fallbackTitle: string): MynaApiError {\n if (body && typeof body === \"object\" && \"code\" in body && \"status\" in body) {\n return new MynaApiError(body as ProblemDetailsContract);\n }\n const detail =\n body && typeof body === \"object\" && \"error\" in body && typeof (body as { error: unknown }).error === \"string\"\n ? (body as { error: string }).error\n : typeof body === \"string\" && body\n ? body\n : undefined;\n return new MynaApiError({\n type: \"about:blank\",\n title: fallbackTitle,\n status,\n code: status >= 500 ? \"INTERNAL\" : \"REQUEST_FAILED\",\n detail,\n } as ProblemDetailsContract);\n}\n","import { problemFromResponse } from \"./errors.js\";\n\n/** A fetch-compatible function. */\nexport type FetchLike = (input: string, init?: RequestInit) => Promise<Response>;\n\nexport interface RetryOptions {\n /**\n * Maximum number of retries (in addition to the first attempt).\n * Defaults to 3 on a server and 1 in a browser — see `defaultMaxRetries`.\n */\n maxRetries?: number;\n /** Base backoff in milliseconds (exponential). Default 200. */\n baseDelayMs?: number;\n /** Cap on any single backoff. Default 5000. */\n maxDelayMs?: number;\n /**\n * Retries for transport-level failures (`fetch` rejecting outright).\n * Defaults to 1, and to 0 in a browser.\n *\n * In a browser these are usually permanent, not transient: a blocked CORS\n * response, a disallowed origin, an extension cancelling the request. They\n * are indistinguishable from a dropped connection — `fetch` rejects with an\n * opaque `TypeError` either way — so retrying converts one clear failure into\n * an identical wall of them, which is what buries the real cause.\n */\n maxNetworkRetries?: number;\n}\n\n/** Browsers get conservative retry defaults; servers keep the aggressive ones. */\nfunction inBrowser(): boolean {\n return typeof globalThis === \"object\" && \"document\" in globalThis;\n}\n\nfunction defaultMaxRetries(): number {\n return inBrowser() ? 1 : 3;\n}\n\nfunction defaultMaxNetworkRetries(): number {\n return inBrowser() ? 0 : 1;\n}\n\nexport interface HttpClientOptions {\n /** Base URL including the version prefix, e.g. `https://api.myna.sh/v1`. */\n baseUrl: string;\n /** Bearer credential (API key, preview token, or CLI token). */\n token?: string | undefined;\n /** Custom fetch implementation (browser/undici/node). */\n fetch?: FetchLike | undefined;\n /** Extra default headers merged into every request. */\n headers?: Record<string, string> | undefined;\n /** Retry policy. Retries apply to safe reads and idempotent mutations only. */\n retry?: RetryOptions | undefined;\n}\n\nexport interface RequestOptions {\n query?: Record<string, unknown> | undefined;\n body?: unknown;\n headers?: Record<string, string> | undefined;\n signal?: AbortSignal | undefined;\n /** Sending an idempotency key makes a mutation eligible for automatic retry. */\n idempotencyKey?: string | undefined;\n /** Override the bearer token for a single request (e.g. a preview token). */\n token?: string | undefined;\n}\n\nconst RETRYABLE_STATUS = new Set([408, 425, 429, 500, 502, 503, 504]);\nconst SAFE_METHODS = new Set([\"GET\", \"HEAD\", \"OPTIONS\"]);\n\nfunction resolveFetch(custom?: FetchLike): FetchLike {\n if (custom) return custom;\n if (typeof globalThis.fetch === \"function\") return globalThis.fetch.bind(globalThis) as FetchLike;\n throw new Error(\"No fetch implementation available. Pass `fetch` to the Myna client.\");\n}\n\n/** Serialize a query object, supporting nested `filter[field][op]` shapes. */\nexport function buildQuery(query: Record<string, unknown> | undefined): string {\n if (!query) return \"\";\n const params = new URLSearchParams();\n const append = (key: string, value: unknown): void => {\n if (value === undefined || value === null) return;\n if (Array.isArray(value)) {\n params.set(key, value.join(\",\"));\n return;\n }\n if (typeof value === \"object\") {\n for (const [op, v] of Object.entries(value as Record<string, unknown>)) {\n append(`${key}[${op}]`, v);\n }\n return;\n }\n params.set(key, String(value));\n };\n for (const [key, value] of Object.entries(query)) append(key, value);\n const qs = params.toString();\n return qs ? `?${qs}` : \"\";\n}\n\nfunction sleep(ms: number, signal?: AbortSignal): Promise<void> {\n return new Promise((resolve, reject) => {\n if (signal?.aborted) return reject(signal.reason ?? new Error(\"Aborted\"));\n const timer = setTimeout(resolve, ms);\n signal?.addEventListener(\n \"abort\",\n () => {\n clearTimeout(timer);\n reject(signal.reason ?? new Error(\"Aborted\"));\n },\n { once: true },\n );\n });\n}\n\nexport class HttpClient {\n private readonly baseUrl: string;\n private readonly token: string | undefined;\n private readonly fetchImpl: FetchLike;\n private readonly defaultHeaders: Record<string, string>;\n private readonly retry: Required<RetryOptions>;\n\n constructor(options: HttpClientOptions) {\n this.baseUrl = options.baseUrl.replace(/\\/+$/, \"\");\n this.token = options.token;\n this.fetchImpl = resolveFetch(options.fetch);\n this.defaultHeaders = options.headers ?? {};\n this.retry = {\n maxRetries: options.retry?.maxRetries ?? defaultMaxRetries(),\n baseDelayMs: options.retry?.baseDelayMs ?? 200,\n maxDelayMs: options.retry?.maxDelayMs ?? 5000,\n maxNetworkRetries: options.retry?.maxNetworkRetries ?? defaultMaxNetworkRetries(),\n };\n }\n\n /**\n * Share one in-flight request between identical concurrent safe reads.\n *\n * Several components asking for the same collection on first paint is the\n * normal shape of a page, not a mistake, and issuing N identical requests\n * multiplies both latency and any failure. Only GET/HEAD are pooled, and only\n * while in flight — this is request coalescing, not a cache.\n */\n private readonly inFlight = new Map<string, Promise<Response>>();\n\n private dedupe(key: string, run: () => Promise<Response>): Promise<Response> {\n const existing = this.inFlight.get(key);\n // Each caller needs its own Response: a body can only be read once.\n if (existing) return existing.then((response) => response.clone());\n const started = run();\n this.inFlight.set(key, started);\n const cleanup = (): void => {\n if (this.inFlight.get(key) === started) this.inFlight.delete(key);\n };\n started.then(cleanup, cleanup);\n return started.then((response) => response.clone());\n }\n\n /** Perform a request and unwrap the `{ data }` envelope. */\n async request<T>(method: string, path: string, options: RequestOptions = {}): Promise<T> {\n const raw = await this.requestRaw(method, path, options);\n if (raw.status === 204 || raw.status === 304) return undefined as T;\n const parsed = (await raw.json().catch(() => undefined)) as { data?: T } | undefined;\n return (parsed && \"data\" in parsed ? parsed.data : (parsed as unknown)) as T;\n }\n\n /** Perform a request and return the full parsed body (envelope included). */\n async requestEnvelope<T>(method: string, path: string, options: RequestOptions = {}): Promise<T> {\n const raw = await this.requestRaw(method, path, options);\n return (await raw.json().catch(() => ({}))) as T;\n }\n\n /** Low-level request with retries; throws `MynaApiError` on non-2xx. */\n async requestRaw(method: string, path: string, options: RequestOptions = {}): Promise<Response> {\n const url = `${this.baseUrl}${path}${buildQuery(options.query)}`;\n const headers: Record<string, string> = {\n accept: \"application/json\",\n ...this.defaultHeaders,\n ...options.headers,\n };\n const token = options.token ?? this.token;\n if (token) headers.authorization = `Bearer ${token}`;\n\n let payload: BodyInit | undefined;\n if (options.body !== undefined) {\n if (options.body instanceof Uint8Array || typeof options.body === \"string\") {\n payload = options.body as BodyInit;\n } else {\n headers[\"content-type\"] = \"application/json\";\n payload = JSON.stringify(options.body);\n }\n }\n if (options.idempotencyKey) headers[\"idempotency-key\"] = options.idempotencyKey;\n\n const upper = method.toUpperCase();\n const safe = SAFE_METHODS.has(upper);\n const idempotent = safe || Boolean(options.idempotencyKey);\n const init: RequestInit = { method, headers };\n if (payload !== undefined) init.body = payload;\n if (options.signal) init.signal = options.signal;\n\n // Coalesce identical concurrent safe reads. Requests carrying a signal opt\n // out: one caller aborting must not cancel another's request.\n if (safe && !options.signal && (upper === \"GET\" || upper === \"HEAD\")) {\n const key = `${upper} ${url} ${token ?? \"\"}`;\n return this.dedupe(key, () => this.attempt(url, init, idempotent, options));\n }\n return this.attempt(url, init, idempotent, options);\n }\n\n private async attempt(\n url: string,\n init: RequestInit,\n idempotent: boolean,\n options: RequestOptions,\n ): Promise<Response> {\n let attempt = 0;\n let networkAttempt = 0;\n for (;;) {\n let response: Response;\n try {\n response = await this.fetchImpl(url, init);\n } catch (error) {\n // A rejected fetch is a transport failure, budgeted separately from\n // HTTP-level retries: in a browser it is usually permanent (CORS, a\n // blocked request), and repeating it only multiplies the noise.\n if (\n idempotent &&\n networkAttempt < this.retry.maxNetworkRetries &&\n attempt < this.retry.maxRetries &&\n !isAbort(error)\n ) {\n await sleep(this.backoff(attempt), options.signal);\n attempt++;\n networkAttempt++;\n continue;\n }\n throw error;\n }\n\n if (response.ok) return response;\n\n if (idempotent && RETRYABLE_STATUS.has(response.status) && attempt < this.retry.maxRetries) {\n const retryAfter = retryAfterMs(response);\n await sleep(retryAfter ?? this.backoff(attempt), options.signal);\n attempt++;\n continue;\n }\n\n const body = await response.json().catch(() => undefined);\n throw problemFromResponse(response.status, body, response.statusText || \"Request failed\");\n }\n }\n\n private backoff(attempt: number): number {\n const base = Math.min(this.retry.baseDelayMs * 2 ** attempt, this.retry.maxDelayMs);\n return Math.round(base * (0.5 + Math.random() * 0.5));\n }\n}\n\nfunction retryAfterMs(response: Response): number | undefined {\n const header = response.headers.get(\"retry-after\");\n if (!header) return undefined;\n const seconds = Number(header);\n return Number.isFinite(seconds) ? seconds * 1000 : undefined;\n}\n\nfunction isAbort(error: unknown): boolean {\n return (\n error instanceof Error &&\n (error.name === \"AbortError\" || error.name === \"TimeoutError\")\n );\n}\n","import { createHash, randomUUID } from \"node:crypto\";\nimport { readFile } from \"node:fs/promises\";\nimport { basename } from \"node:path\";\nimport type {\n AcceptInvitationResponse,\n ApiKeyContract,\n CreateApiKeyRequest,\n CreateApiKeyResponse,\n CreateInvitationRequest,\n CreateOrganizationRequest,\n InvitationContract,\n MemberContract,\n OrganizationContract,\n UpdateMemberRequest,\n UpdateOrganizationRequest,\n} from \"../../api-contracts/src/organizations.js\";\nimport type { ActivityEventContract } from \"../../api-contracts/src/activity.js\";\nimport type {\n AssetContract,\n CompleteUploadResponse,\n CreateUploadRequest,\n CreateUploadResponse,\n ReplaceAssetRequest,\n UpdateAssetRequest,\n} from \"../../api-contracts/src/assets.js\";\nimport type {\n BillingResponse,\n CheckoutRequest,\n CheckoutResponse,\n PortalResponse,\n} from \"../../api-contracts/src/billing.js\";\nimport type {\n ChangeSetCheckContract,\n ChangeSetCommentContract,\n ChangeSetContract,\n ChangeSetReviewContract,\n CreateChangeSetCommentRequest,\n CreateChangeSetRequest,\n RequestReviewRequest,\n ReviewDecisionRequest,\n RunChecksResponse,\n UpdateChangeSetRequest,\n} from \"../../api-contracts/src/change-sets.js\";\nimport type {\n CollectionContract,\n CollectionVersionContract,\n SchemaDiffResponse,\n SchemaDriftResponse,\n SchemaPushResponse,\n} from \"../../api-contracts/src/collections.js\";\nimport type {\n BulkEntriesRequest,\n BulkEntriesResponse,\n EntryContract,\n EntryReferencesResponse,\n ImportEntriesRequest,\n ImportEntriesResponse,\n ReorderEntriesRequest,\n ReorderEntriesResponse,\n RestoreRevisionResponse,\n RevisionContract,\n} from \"../../api-contracts/src/entries.js\";\nimport type { CreatePreviewRequest, PreviewContract } from \"../../api-contracts/src/previews.js\";\nimport type {\n CorsCheckResponse,\n CreateProjectRequest,\n CreateSavedViewRequest,\n ProjectContract,\n ProjectExportResponse,\n SavedViewContract,\n UpdateProjectRequest,\n} from \"../../api-contracts/src/projects.js\";\nimport type { UsageResponse } from \"../../api-contracts/src/usage.js\";\nimport type {\n CreateWebhookRequest,\n CreateWebhookResponse,\n UpdateWebhookRequest,\n WebhookDeliveryContract,\n WebhookEndpointContract,\n} from \"../../api-contracts/src/webhooks.js\";\nimport { HttpClient, type FetchLike, type RetryOptions } from \"./http.js\";\n\nconst DEFAULT_API_URL = \"https://api.myna.sh\";\n\nexport interface ManagementClientOptions {\n /** Management/CLI credential (`myna_sk_...`). */\n token: string;\n /** API origin. Defaults to `https://api.myna.sh`. */\n apiUrl?: string;\n fetch?: FetchLike;\n retry?: RetryOptions;\n /**\n * Idempotency-key factory for mutations. Defaults to a random UUID per call.\n * Pass a stable value to make a specific mutation replay-safe.\n */\n idempotencyKey?: () => string;\n}\n\nexport interface ListOptions {\n limit?: number;\n cursor?: string;\n signal?: AbortSignal;\n}\n\nexport interface Page<T> {\n data: T[];\n nextCursor: string | null;\n}\n\nexport interface UploadAssetMeta {\n filename?: string;\n contentType?: string;\n /** Override the automatically detected byte length. */\n byteSize?: number;\n}\n\n/** Bytes or a filesystem path accepted by `uploadAsset`. */\nexport type AssetInput = string | Uint8Array | ArrayBuffer;\n\n/**\n * Server-only management client (SPEC 12). Typed wrappers over the full\n * management API surface. Mutations automatically carry an `Idempotency-Key`.\n */\nexport class ManagementClient {\n private readonly http: HttpClient;\n private readonly newIdempotencyKey: () => string;\n private readonly fetchImpl: FetchLike;\n\n constructor(options: ManagementClientOptions) {\n if (!options.token) throw new Error(\"createManagementClient: `token` is required.\");\n this.newIdempotencyKey = options.idempotencyKey ?? (() => randomUUID());\n this.fetchImpl = options.fetch ?? ((input, init) => fetch(input, init));\n this.http = new HttpClient({\n baseUrl: `${(options.apiUrl ?? DEFAULT_API_URL).replace(/\\/+$/, \"\")}/v1`,\n token: options.token,\n fetch: options.fetch,\n retry: options.retry,\n });\n }\n\n // Convenience: idempotency key for a mutation.\n private idem(): string {\n return this.newIdempotencyKey();\n }\n\n private get<T>(path: string, query?: Record<string, unknown>, signal?: AbortSignal): Promise<T> {\n return this.http.request<T>(\"GET\", path, { query, signal });\n }\n\n /**\n * Paged GET. Extra filters are merged into the query rather than appended to\n * the path: the client builds its own query string from `options.query`, so a\n * path that already carries one produces `?a=1?limit=25` — a second `?` that\n * silently becomes part of the previous value.\n */\n private async page<T>(\n path: string,\n opts: ListOptions = {},\n filters: Record<string, unknown> = {},\n ): Promise<Page<T>> {\n const body = await this.http.requestEnvelope<{ data: T[]; pagination: { nextCursor: string | null } }>(\n \"GET\",\n path,\n { query: { ...filters, limit: opts.limit, cursor: opts.cursor }, signal: opts.signal },\n );\n return { data: body.data, nextCursor: body.pagination?.nextCursor ?? null };\n }\n\n private mutate<T>(method: string, path: string, body?: unknown, query?: Record<string, unknown>): Promise<T> {\n return this.http.request<T>(method, path, { body, query, idempotencyKey: this.idem() });\n }\n\n // --- Organizations --------------------------------------------------------\n readonly organizations = {\n list: (signal?: AbortSignal): Promise<OrganizationContract[]> =>\n this.get<OrganizationContract[]>(\"/organizations\", undefined, signal),\n create: (body: CreateOrganizationRequest): Promise<OrganizationContract> =>\n this.mutate<OrganizationContract>(\"POST\", \"/organizations\", body),\n get: (organization: string, signal?: AbortSignal): Promise<OrganizationContract> =>\n this.get<OrganizationContract>(`/organizations/${enc(organization)}`, undefined, signal),\n update: (organization: string, body: UpdateOrganizationRequest): Promise<OrganizationContract> =>\n this.mutate<OrganizationContract>(\"PATCH\", `/organizations/${enc(organization)}`, body),\n delete: (organization: string): Promise<{ ok: boolean; recoverableForDays: number }> =>\n this.mutate(\"DELETE\", `/organizations/${enc(organization)}`),\n export: (organization: string): Promise<{ jobId: string; storageKey: string; downloadUrl: string; ready: boolean }> =>\n this.mutate(\"POST\", `/organizations/${enc(organization)}/export`),\n usage: (organization: string, signal?: AbortSignal): Promise<UsageResponse> =>\n this.get<UsageResponse>(`/organizations/${enc(organization)}/usage`, undefined, signal),\n };\n\n // --- Members & invitations ------------------------------------------------\n readonly members = {\n list: (organization: string, signal?: AbortSignal): Promise<MemberContract[]> =>\n this.get<MemberContract[]>(`/organizations/${enc(organization)}/members`, undefined, signal),\n update: (organization: string, user: string, body: UpdateMemberRequest): Promise<{ ok: boolean }> =>\n this.mutate(\"PATCH\", `/organizations/${enc(organization)}/members/${enc(user)}`, body),\n remove: (organization: string, user: string): Promise<{ ok: boolean }> =>\n this.mutate(\"DELETE\", `/organizations/${enc(organization)}/members/${enc(user)}`),\n };\n\n readonly invitations = {\n list: (organization: string, signal?: AbortSignal): Promise<InvitationContract[]> =>\n this.get<InvitationContract[]>(`/organizations/${enc(organization)}/invitations`, undefined, signal),\n create: (organization: string, body: CreateInvitationRequest): Promise<InvitationContract> =>\n this.mutate<InvitationContract>(\"POST\", `/organizations/${enc(organization)}/invitations`, body),\n revoke: (organization: string, invitation: string): Promise<{ ok: boolean }> =>\n this.mutate(\"DELETE\", `/organizations/${enc(organization)}/invitations/${enc(invitation)}`),\n accept: (token: string): Promise<AcceptInvitationResponse> =>\n this.mutate<AcceptInvitationResponse>(\"POST\", `/invitations/${enc(token)}/accept`),\n };\n\n // --- Projects -------------------------------------------------------------\n readonly projects = {\n list: (organization: string, signal?: AbortSignal): Promise<ProjectContract[]> =>\n this.get<ProjectContract[]>(`/organizations/${enc(organization)}/projects`, undefined, signal),\n create: (organization: string, body: CreateProjectRequest): Promise<ProjectContract> =>\n this.mutate<ProjectContract>(\"POST\", `/organizations/${enc(organization)}/projects`, body),\n get: (project: string, signal?: AbortSignal): Promise<ProjectContract> =>\n this.get<ProjectContract>(`/projects/${enc(project)}`, undefined, signal),\n update: (project: string, body: UpdateProjectRequest): Promise<ProjectContract> =>\n this.mutate<ProjectContract>(\"PATCH\", `/projects/${enc(project)}`, body),\n archive: (project: string): Promise<ProjectContract> =>\n this.mutate<ProjectContract>(\"POST\", `/projects/${enc(project)}/archive`),\n /** Full project export: schemas, entries (draft + published), asset metadata. */\n export: (project: string, signal?: AbortSignal): Promise<ProjectExportResponse> =>\n this.get<ProjectExportResponse>(`/projects/${enc(project)}/export`, undefined, signal),\n /** Why a browser at `origin` can or cannot read this project's content. */\n corsCheck: (\n project: string,\n origin: string,\n collection?: string,\n signal?: AbortSignal,\n ): Promise<CorsCheckResponse> =>\n this.get<CorsCheckResponse>(\n `/projects/${enc(project)}/cors-check`,\n collection ? { origin, collection } : { origin },\n signal,\n ),\n views: (project: string, signal?: AbortSignal): Promise<SavedViewContract[]> =>\n this.get<SavedViewContract[]>(`/projects/${enc(project)}/views`, undefined, signal),\n createView: (project: string, body: CreateSavedViewRequest): Promise<SavedViewContract> =>\n this.mutate<SavedViewContract>(\"POST\", `/projects/${enc(project)}/views`, body),\n deleteView: (project: string, view: string): Promise<{ ok: boolean }> =>\n this.mutate(\"DELETE\", `/projects/${enc(project)}/views/${enc(view)}`),\n };\n\n // --- Schema ---------------------------------------------------------------\n readonly schema = {\n collections: (project: string, signal?: AbortSignal): Promise<CollectionContract[]> =>\n this.get<CollectionContract[]>(`/projects/${enc(project)}/collections`, undefined, signal),\n collection: (project: string, key: string, signal?: AbortSignal): Promise<CollectionContract> =>\n this.get<CollectionContract>(`/projects/${enc(project)}/collections/${enc(key)}`, undefined, signal),\n versions: (project: string, key: string, signal?: AbortSignal): Promise<CollectionVersionContract[]> =>\n this.get<CollectionVersionContract[]>(`/projects/${enc(project)}/collections/${enc(key)}/versions`, undefined, signal),\n diff: (project: string, collections: Record<string, unknown>[]): Promise<SchemaDiffResponse> =>\n this.mutate<SchemaDiffResponse>(\"POST\", `/projects/${enc(project)}/schema/diff`, { collections }),\n push: (\n project: string,\n collections: Record<string, unknown>[],\n opts: { allowDestructive?: boolean; changeSummary?: string } = {},\n ): Promise<SchemaPushResponse> =>\n this.mutate<SchemaPushResponse>(\"POST\", `/projects/${enc(project)}/schema/push`, {\n collections,\n allowDestructive: opts.allowDestructive ?? false,\n changeSummary: opts.changeSummary,\n }),\n // Environments as projects\n drift: (project: string, against: string, signal?: AbortSignal): Promise<SchemaDriftResponse> =>\n this.get<SchemaDriftResponse>(`/projects/${enc(project)}/schema/drift`, { against }, signal),\n promote: (\n project: string,\n fromProject: string,\n opts: { allowDestructive?: boolean } = {},\n ): Promise<SchemaPushResponse> =>\n this.mutate<SchemaPushResponse>(\"POST\", `/projects/${enc(project)}/schema/promote`, {\n fromProject,\n allowDestructive: opts.allowDestructive ?? false,\n confirm: true,\n }),\n };\n\n // --- Entries & revisions --------------------------------------------------\n readonly entries = {\n list: (\n project: string,\n opts: ListOptions & { collection?: string; status?: string } = {},\n ): Promise<Page<EntryContract>> =>\n this.page<EntryContract>(`/projects/${enc(project)}/entries`, opts, {\n collection: opts.collection,\n status: opts.status,\n }),\n create: (\n project: string,\n body: { collection: string; slug?: string; data: Record<string, unknown>; changeSetId?: string; changeSummary?: string },\n ): Promise<EntryContract> => this.mutate<EntryContract>(\"POST\", `/projects/${enc(project)}/entries`, body),\n get: (project: string, entry: string, signal?: AbortSignal): Promise<EntryContract> =>\n this.get<EntryContract>(`/projects/${enc(project)}/entries/${enc(entry)}`, undefined, signal),\n update: (\n project: string,\n entry: string,\n body: {\n data?: Record<string, unknown>;\n slug?: string;\n expectedRevisionId?: string;\n changeSetId?: string;\n changeSummary?: string;\n },\n ): Promise<EntryContract> => this.mutate<EntryContract>(\"PATCH\", `/projects/${enc(project)}/entries/${enc(entry)}`, body),\n delete: (project: string, entry: string, changeSetId?: string): Promise<{ changeSetId: string; staged: string }> =>\n this.mutate(\"DELETE\", `/projects/${enc(project)}/entries/${enc(entry)}`, undefined, { changeSetId }),\n unpublish: (project: string, entry: string, changeSetId?: string): Promise<{ changeSetId: string; staged: string }> =>\n this.mutate(\"POST\", `/projects/${enc(project)}/entries/${enc(entry)}/unpublish`, undefined, { changeSetId }),\n restore: (project: string, entry: string): Promise<RestoreRevisionResponse> =>\n this.mutate<RestoreRevisionResponse>(\"POST\", `/projects/${enc(project)}/entries/${enc(entry)}/restore`),\n duplicate: (project: string, entry: string, changeSetId?: string): Promise<EntryContract> =>\n this.mutate<EntryContract>(\"POST\", `/projects/${enc(project)}/entries/${enc(entry)}/duplicate`, {\n changeSetId,\n }),\n bulk: (project: string, body: BulkEntriesRequest): Promise<BulkEntriesResponse> =>\n this.mutate<BulkEntriesResponse>(\"POST\", `/projects/${enc(project)}/entries/bulk`, body),\n /**\n * Set a collection's editorial order. Not staged on a change set — ranks\n * are arrangement rather than content and take effect immediately, which\n * is why `confirm` is required.\n */\n reorder: (\n project: string,\n collection: string,\n body: Omit<ReorderEntriesRequest, \"confirm\">,\n ): Promise<ReorderEntriesResponse> =>\n this.mutate<ReorderEntriesResponse>(\n \"POST\",\n `/projects/${enc(project)}/collections/${enc(collection)}/reorder`,\n { ...body, confirm: true },\n ),\n import: (project: string, body: ImportEntriesRequest): Promise<ImportEntriesResponse> =>\n this.mutate<ImportEntriesResponse>(\"POST\", `/projects/${enc(project)}/entries/import`, body),\n references: (project: string, entry: string, signal?: AbortSignal): Promise<EntryReferencesResponse> =>\n this.get<EntryReferencesResponse>(`/projects/${enc(project)}/entries/${enc(entry)}/references`, undefined, signal),\n revisions: (project: string, entry: string, signal?: AbortSignal): Promise<RevisionContract[]> =>\n this.get<RevisionContract[]>(`/projects/${enc(project)}/entries/${enc(entry)}/revisions`, undefined, signal),\n revision: (project: string, entry: string, revision: string, signal?: AbortSignal): Promise<RevisionContract> =>\n this.get<RevisionContract>(`/projects/${enc(project)}/entries/${enc(entry)}/revisions/${enc(revision)}`, undefined, signal),\n restoreRevision: (project: string, entry: string, revision: string): Promise<RestoreRevisionResponse> =>\n this.mutate<RestoreRevisionResponse>(\n \"POST\",\n `/projects/${enc(project)}/entries/${enc(entry)}/revisions/${enc(revision)}/restore`,\n ),\n };\n\n // --- Change sets ----------------------------------------------------------\n readonly changeSets = {\n list: (project: string, opts: ListOptions & { status?: string } = {}): Promise<Page<ChangeSetContract>> =>\n this.page<ChangeSetContract>(`/projects/${enc(project)}/change-sets`, opts, { status: opts.status }),\n create: (project: string, body: CreateChangeSetRequest): Promise<ChangeSetContract> =>\n this.mutate<ChangeSetContract>(\"POST\", `/projects/${enc(project)}/change-sets`, body),\n get: (project: string, changeSet: string, signal?: AbortSignal): Promise<ChangeSetContract> =>\n this.get<ChangeSetContract>(`/projects/${enc(project)}/change-sets/${enc(changeSet)}`, undefined, signal),\n update: (project: string, changeSet: string, body: UpdateChangeSetRequest): Promise<ChangeSetContract> =>\n this.mutate<ChangeSetContract>(\"PATCH\", `/projects/${enc(project)}/change-sets/${enc(changeSet)}`, body),\n validate: (project: string, changeSet: string): Promise<{ valid: boolean; errors: ValidationIssue[] }> =>\n this.mutate(\"POST\", `/projects/${enc(project)}/change-sets/${enc(changeSet)}/validate`),\n publish: (\n project: string,\n changeSet: string,\n ): Promise<{ changeSet: ChangeSetContract; publishedEntryIds: string[] }> =>\n this.mutate(\"POST\", `/projects/${enc(project)}/change-sets/${enc(changeSet)}/publish`, { confirm: true }),\n close: (project: string, changeSet: string): Promise<ChangeSetContract> =>\n this.mutate<ChangeSetContract>(\"POST\", `/projects/${enc(project)}/change-sets/${enc(changeSet)}/close`),\n // Scheduled publishing\n schedule: (project: string, changeSet: string, publishAt: string): Promise<ChangeSetContract> =>\n this.mutate<ChangeSetContract>(\"POST\", `/projects/${enc(project)}/change-sets/${enc(changeSet)}/schedule`, {\n publishAt,\n }),\n cancelSchedule: (project: string, changeSet: string): Promise<ChangeSetContract> =>\n this.mutate<ChangeSetContract>(\"DELETE\", `/projects/${enc(project)}/change-sets/${enc(changeSet)}/schedule`),\n // Reviews & approvals\n reviews: (project: string, changeSet: string, signal?: AbortSignal): Promise<ChangeSetReviewContract[]> =>\n this.get<ChangeSetReviewContract[]>(\n `/projects/${enc(project)}/change-sets/${enc(changeSet)}/reviews`,\n undefined,\n signal,\n ),\n requestReview: (project: string, changeSet: string, body: RequestReviewRequest): Promise<ChangeSetReviewContract[]> =>\n this.mutate<ChangeSetReviewContract[]>(\"POST\", `/projects/${enc(project)}/change-sets/${enc(changeSet)}/reviews`, body),\n removeReviewer: (project: string, changeSet: string, reviewer: string): Promise<ChangeSetReviewContract[]> =>\n this.mutate<ChangeSetReviewContract[]>(\n \"DELETE\",\n `/projects/${enc(project)}/change-sets/${enc(changeSet)}/reviews/${enc(reviewer)}`,\n ),\n approve: (project: string, changeSet: string, body: ReviewDecisionRequest = {}): Promise<ChangeSetReviewContract[]> =>\n this.mutate<ChangeSetReviewContract[]>(\"POST\", `/projects/${enc(project)}/change-sets/${enc(changeSet)}/approve`, body),\n requestChanges: (project: string, changeSet: string, body: ReviewDecisionRequest = {}): Promise<ChangeSetReviewContract[]> =>\n this.mutate<ChangeSetReviewContract[]>(\n \"POST\",\n `/projects/${enc(project)}/change-sets/${enc(changeSet)}/request-changes`,\n body,\n ),\n // Comments\n comments: (project: string, changeSet: string, signal?: AbortSignal): Promise<ChangeSetCommentContract[]> =>\n this.get<ChangeSetCommentContract[]>(\n `/projects/${enc(project)}/change-sets/${enc(changeSet)}/comments`,\n undefined,\n signal,\n ),\n comment: (project: string, changeSet: string, body: CreateChangeSetCommentRequest): Promise<ChangeSetCommentContract> =>\n this.mutate<ChangeSetCommentContract>(\"POST\", `/projects/${enc(project)}/change-sets/${enc(changeSet)}/comments`, body),\n resolveComment: (project: string, changeSet: string, comment: string, resolved = true): Promise<ChangeSetCommentContract> =>\n this.mutate<ChangeSetCommentContract>(\n \"PATCH\",\n `/projects/${enc(project)}/change-sets/${enc(changeSet)}/comments/${enc(comment)}`,\n { resolved },\n ),\n // Automated checks\n checks: (project: string, changeSet: string, signal?: AbortSignal): Promise<ChangeSetCheckContract[]> =>\n this.get<ChangeSetCheckContract[]>(\n `/projects/${enc(project)}/change-sets/${enc(changeSet)}/checks`,\n undefined,\n signal,\n ),\n runChecks: (project: string, changeSet: string): Promise<RunChecksResponse> =>\n this.mutate<RunChecksResponse>(\"POST\", `/projects/${enc(project)}/change-sets/${enc(changeSet)}/checks/run`),\n };\n\n // --- Previews -------------------------------------------------------------\n readonly previews = {\n create: (project: string, body: CreatePreviewRequest): Promise<PreviewContract> =>\n this.mutate<PreviewContract>(\"POST\", `/projects/${enc(project)}/previews`, body),\n list: (project: string, signal?: AbortSignal): Promise<PreviewContract[]> =>\n this.get<PreviewContract[]>(`/projects/${enc(project)}/previews`, undefined, signal),\n revoke: (project: string, preview: string): Promise<{ ok: boolean }> =>\n this.mutate(\"DELETE\", `/projects/${enc(project)}/previews/${enc(preview)}`),\n };\n\n // --- Assets ---------------------------------------------------------------\n readonly assets = {\n createUpload: (project: string, body: CreateUploadRequest): Promise<CreateUploadResponse> =>\n this.mutate<CreateUploadResponse>(\"POST\", `/projects/${enc(project)}/assets/uploads`, body),\n completeUpload: (project: string, upload: string): Promise<AssetContract> =>\n this.mutate<CompleteUploadResponse>(\"POST\", `/projects/${enc(project)}/assets/uploads/${enc(upload)}/complete`).then(\n (r) => r.asset,\n ),\n list: (project: string, opts: ListOptions = {}): Promise<Page<AssetContract>> =>\n this.page<AssetContract>(`/projects/${enc(project)}/assets`, opts),\n get: (project: string, asset: string, signal?: AbortSignal): Promise<AssetContract> =>\n this.get<AssetContract>(`/projects/${enc(project)}/assets/${enc(asset)}`, undefined, signal),\n usage: (project: string, asset: string, signal?: AbortSignal): Promise<{ asset: AssetContract; usage: { entryIds: string[] } }> =>\n this.get(`/projects/${enc(project)}/assets/${enc(asset)}`, { usage: \"true\" }, signal),\n update: (project: string, asset: string, body: UpdateAssetRequest): Promise<AssetContract> =>\n this.mutate<AssetContract>(\"PATCH\", `/projects/${enc(project)}/assets/${enc(asset)}`, body),\n replace: (project: string, asset: string, body: ReplaceAssetRequest): Promise<AssetContract> =>\n this.mutate<AssetContract>(\"POST\", `/projects/${enc(project)}/assets/${enc(asset)}/replace`, body),\n delete: (project: string, asset: string): Promise<{ ok: boolean }> =>\n this.mutate(\"DELETE\", `/projects/${enc(project)}/assets/${enc(asset)}`),\n /** Full presigned upload flow: create → PUT bytes → complete. */\n upload: (project: string, input: AssetInput, meta: UploadAssetMeta = {}): Promise<AssetContract> =>\n this.uploadAsset(project, input, meta),\n };\n\n // --- API keys -------------------------------------------------------------\n readonly apiKeys = {\n listForOrganization: (organization: string, signal?: AbortSignal): Promise<ApiKeyContract[]> =>\n this.get<ApiKeyContract[]>(`/organizations/${enc(organization)}/api-keys`, undefined, signal),\n createForOrganization: (organization: string, body: CreateApiKeyRequest): Promise<CreateApiKeyResponse> =>\n this.mutate<CreateApiKeyResponse>(\"POST\", `/organizations/${enc(organization)}/api-keys`, body),\n revokeForOrganization: (organization: string, key: string): Promise<{ ok: boolean }> =>\n this.mutate(\"DELETE\", `/organizations/${enc(organization)}/api-keys/${enc(key)}`),\n listForProject: (project: string, signal?: AbortSignal): Promise<ApiKeyContract[]> =>\n this.get<ApiKeyContract[]>(`/projects/${enc(project)}/api-keys`, undefined, signal),\n createForProject: (project: string, body: CreateApiKeyRequest): Promise<CreateApiKeyResponse> =>\n this.mutate<CreateApiKeyResponse>(\"POST\", `/projects/${enc(project)}/api-keys`, body),\n revokeForProject: (project: string, key: string): Promise<{ ok: boolean }> =>\n this.mutate(\"DELETE\", `/projects/${enc(project)}/api-keys/${enc(key)}`),\n };\n\n // --- Webhooks -------------------------------------------------------------\n readonly webhooks = {\n list: (project: string, signal?: AbortSignal): Promise<WebhookEndpointContract[]> =>\n this.get<WebhookEndpointContract[]>(`/projects/${enc(project)}/webhooks`, undefined, signal),\n create: (project: string, body: CreateWebhookRequest): Promise<CreateWebhookResponse> =>\n this.mutate<CreateWebhookResponse>(\"POST\", `/projects/${enc(project)}/webhooks`, body),\n update: (project: string, webhook: string, body: UpdateWebhookRequest): Promise<WebhookEndpointContract> =>\n this.mutate<WebhookEndpointContract>(\"PATCH\", `/projects/${enc(project)}/webhooks/${enc(webhook)}`, body),\n delete: (project: string, webhook: string): Promise<{ ok: boolean }> =>\n this.mutate(\"DELETE\", `/projects/${enc(project)}/webhooks/${enc(webhook)}`),\n deliveries: (project: string, webhook: string, signal?: AbortSignal): Promise<WebhookDeliveryContract[]> =>\n this.get<WebhookDeliveryContract[]>(`/projects/${enc(project)}/webhooks/${enc(webhook)}/deliveries`, undefined, signal),\n retry: (project: string, webhook: string, delivery: string): Promise<{ ok: boolean }> =>\n this.mutate(\"POST\", `/projects/${enc(project)}/webhooks/${enc(webhook)}/deliveries/${enc(delivery)}/retry`),\n };\n\n // --- Activity -------------------------------------------------------------\n activity(\n project: string,\n opts: ListOptions & { actorType?: string; action?: string; targetType?: string; from?: string; to?: string } = {},\n ): Promise<Page<ActivityEventContract>> {\n return this.page<ActivityEventContract>(`/projects/${enc(project)}/activity`, opts, {\n actorType: opts.actorType,\n action: opts.action,\n targetType: opts.targetType,\n from: opts.from,\n to: opts.to,\n });\n }\n\n // --- Billing --------------------------------------------------------------\n readonly billing = {\n status: (organization: string, signal?: AbortSignal): Promise<BillingResponse> =>\n this.get<BillingResponse>(`/organizations/${enc(organization)}/billing`, undefined, signal),\n checkout: (organization: string, body: CheckoutRequest): Promise<CheckoutResponse> =>\n this.mutate<CheckoutResponse>(\"POST\", `/organizations/${enc(organization)}/billing/checkout`, body),\n portal: (organization: string): Promise<PortalResponse> =>\n this.mutate<PortalResponse>(\"POST\", `/organizations/${enc(organization)}/billing/portal`),\n };\n\n // --- Upload helper --------------------------------------------------------\n private async uploadAsset(project: string, input: AssetInput, meta: UploadAssetMeta): Promise<AssetContract> {\n const { bytes, filename } = await readInput(input, meta.filename);\n const contentType = meta.contentType ?? guessContentType(filename);\n const checksum = createHash(\"md5\").update(bytes).digest(\"hex\");\n\n const upload = await this.assets.createUpload(project, {\n filename,\n contentType,\n byteSize: meta.byteSize ?? bytes.byteLength,\n checksum,\n });\n\n // The presigned URL is absolute (storage host) and must bypass the API base.\n const put = await this.fetchImpl(upload.url, {\n method: upload.method,\n headers: upload.headers,\n body: bytes as unknown as BodyInit,\n });\n if (!put.ok) {\n throw new Error(`Asset upload PUT failed with status ${put.status}.`);\n }\n\n return this.assets.completeUpload(project, upload.uploadId);\n }\n}\n\ninterface ValidationIssue {\n resourceType: string;\n resourceId: string;\n path: string;\n message: string;\n code?: string;\n}\n\nasync function readInput(input: AssetInput, filenameOverride?: string): Promise<{ bytes: Uint8Array; filename: string }> {\n if (typeof input === \"string\") {\n const bytes = await readFile(input);\n return { bytes: new Uint8Array(bytes), filename: filenameOverride ?? basename(input) };\n }\n const bytes = input instanceof Uint8Array ? input : new Uint8Array(input);\n return { bytes, filename: filenameOverride ?? \"upload.bin\" };\n}\n\nconst CONTENT_TYPES: Record<string, string> = {\n png: \"image/png\",\n jpg: \"image/jpeg\",\n jpeg: \"image/jpeg\",\n gif: \"image/gif\",\n webp: \"image/webp\",\n avif: \"image/avif\",\n pdf: \"application/pdf\",\n json: \"application/json\",\n txt: \"text/plain\",\n md: \"text/markdown\",\n csv: \"text/csv\",\n mp4: \"video/mp4\",\n webm: \"video/webm\",\n mp3: \"audio/mpeg\",\n wav: \"audio/wav\",\n};\n\nfunction guessContentType(filename: string): string {\n const ext = filename.split(\".\").pop()?.toLowerCase() ?? \"\";\n return CONTENT_TYPES[ext] ?? \"application/octet-stream\";\n}\n\nfunction enc(segment: string): string {\n return encodeURIComponent(segment);\n}\n\n/** Create a management client. */\nexport function createManagementClient(options: ManagementClientOptions): ManagementClient {\n return new ManagementClient(options);\n}\n\nexport { generateTypes, generateTypesModule } from \"./codegen.js\";\nexport { MynaApiError, isMynaApiError } from \"./errors.js\";\nexport type { FetchLike, RetryOptions } from \"./http.js\";\n","import type {\n CollectionSchema,\n FieldDef,\n ListItem,\n ObjectField,\n} from \"../../schema/src/types.js\";\n\n/**\n * Deterministic TypeScript type generation from canonical collection schemas\n * (SPEC 12). Pure and stable: the same input always yields byte-identical\n * output, and no user-written files are touched. Consumed by `myna types\n * generate`.\n */\nexport function generateTypes(collections: CollectionSchema[]): string {\n const sorted = [...collections].sort((a, b) => a.name.localeCompare(b.name));\n const blocks: string[] = [];\n\n for (const collection of sorted) {\n blocks.push(renderInterface(collection));\n }\n\n const registry = sorted.map((c) => registryEntry(c)).join(\"\\n\");\n\n const header = [\n \"// Generated by `myna types generate`. Do not edit by hand.\",\n \"// This file is safe to commit and regenerate.\",\n \"\",\n ].join(\"\\n\");\n\n return `${header}${blocks.join(\"\\n\\n\")}\\n\\n${REGISTRY_DOC}\\nexport interface MynaCollections {\\n${registry}\\n}\\n`;\n}\n\nconst REGISTRY_DOC = [\n \"/**\",\n \" * Collection registry consumed by `createMyna<MynaCollections>()`.\",\n \" *\",\n \" * `fields` types the entry payload; `sortable` and `reference` carry the\",\n \" * distinctions the field types alone cannot express — a markdown body and a\",\n \" * text title are both `string`, but only one of them can be ordered on.\",\n \" */\",\n].join(\"\\n\");\n\n/**\n * Fields the query engine can order and filter by: scalars, excluding localized\n * fields, which hold one value per locale rather than a comparable value. This\n * mirrors `SCALAR_TYPES` in the API's public content service; the two must agree\n * or the types will promise a query the server rejects.\n */\nconst SORTABLE_TYPES = new Set([\"text\", \"number\", \"boolean\", \"date\", \"datetime\", \"slug\"]);\n\nfunction registryEntry(collection: CollectionSchema): string {\n const sortable = collection.fields\n .filter((f) => SORTABLE_TYPES.has(f.type) && !f.localized)\n .map((f) => JSON.stringify(f.key));\n const references = collection.fields\n .filter((f) => f.type === \"reference\")\n .map((f) => JSON.stringify(f.key));\n return [\n ` ${JSON.stringify(collection.name)}: {`,\n ` fields: ${pascal(collection.name)};`,\n ` sortable: ${sortable.length > 0 ? sortable.join(\" | \") : \"never\"};`,\n ` reference: ${references.length > 0 ? references.join(\" | \") : \"never\"};`,\n ` };`,\n ].join(\"\\n\");\n}\n\nfunction renderInterface(collection: CollectionSchema): string {\n const name = pascal(collection.name);\n const lines = collection.fields.map((f) => renderField(f, 1));\n const label = collection.label ? ` ${collection.label}` : \"\";\n return `/**${label} (${collection.kind}) */\\nexport interface ${name} {\\n${lines.join(\"\\n\")}\\n}`;\n}\n\nfunction renderField(field: FieldDef, depth: number): string {\n const indent = \" \".repeat(depth);\n const optional = field.required ? \"\" : \"?\";\n const doc = field.description ? `${indent}/** ${escapeComment(field.description)} */\\n` : \"\";\n const base = fieldType(field, depth);\n // Localized fields store one value per project locale.\n const type = field.localized ? `{ [locale: string]: ${base} }` : base;\n return `${doc}${indent}${safeKey(field.key)}${optional}: ${type};`;\n}\n\nfunction fieldType(field: FieldDef, depth: number): string {\n switch (field.type) {\n case \"text\":\n return field.enum && field.enum.length > 0 ? field.enum.map((v) => JSON.stringify(v)).join(\" | \") : \"string\";\n case \"slug\":\n return \"string\";\n case \"markdown\":\n return \"string\";\n case \"number\":\n return \"number\";\n case \"boolean\":\n return \"boolean\";\n case \"date\":\n case \"datetime\":\n return \"string\";\n case \"json\":\n return \"JsonValue\";\n case \"asset\":\n return field.multiple ? \"string[]\" : \"string\";\n case \"reference\":\n return field.multiple ? \"string[]\" : \"string\";\n case \"object\":\n return renderObject(field, depth);\n case \"list\":\n return `${listItemType(field.item, depth)}[]`;\n case \"richText\":\n return \"RichTextDoc\";\n case \"blocks\": {\n // Discriminated union over the allowed block components.\n const inner = \" \".repeat(depth + 1);\n const options = field.blocks.map((b) => {\n const lines = b.fields.map((f) => renderField(f, depth + 2));\n return `{ type: ${JSON.stringify(b.key)}; fields: {\\n${lines.join(\"\\n\")}\\n${inner}} }`;\n });\n return `Array<\\n${inner}${options.join(`\\n${inner}| `)}\\n${\" \".repeat(depth)}>`;\n }\n default:\n return \"unknown\";\n }\n}\n\nfunction renderObject(field: ObjectField, depth: number): string {\n const lines = field.fields.map((f) => renderField(f, depth + 1));\n const closingIndent = \" \".repeat(depth);\n return `{\\n${lines.join(\"\\n\")}\\n${closingIndent}}`;\n}\n\nfunction listItemType(item: ListItem, depth: number): string {\n switch (item.kind) {\n case \"text\":\n return item.enum && item.enum.length > 0 ? `(${item.enum.map((v) => JSON.stringify(v)).join(\" | \")})` : \"string\";\n case \"number\":\n return \"number\";\n case \"boolean\":\n return \"boolean\";\n case \"date\":\n case \"datetime\":\n return \"string\";\n case \"markdown\":\n return \"string\";\n case \"json\":\n return \"JsonValue\";\n case \"reference\":\n return \"string\";\n case \"asset\":\n return \"string\";\n case \"object\": {\n const lines = item.fields.map((f) => renderField(f, depth + 1));\n const closingIndent = \" \".repeat(depth);\n return `{\\n${lines.join(\"\\n\")}\\n${closingIndent}}`;\n }\n default:\n return \"unknown\";\n }\n}\n\nconst JSON_VALUE = [\n \"export type JsonValue = string | number | boolean | null | JsonValue[] | { [key: string]: JsonValue };\",\n \"\",\n \"/** Portable rich-text document tree (never rendered HTML). */\",\n \"export interface RichTextDoc { type: \\\"doc\\\"; content: Array<{ type: string; [key: string]: unknown }>; }\",\n].join(\"\\n\");\n\n/** Generate types plus the shared `JsonValue` helper as a standalone module. */\nexport function generateTypesModule(collections: CollectionSchema[]): string {\n return `${JSON_VALUE}\\n\\n${generateTypes(collections)}`;\n}\n\nfunction pascal(key: string): string {\n return key\n .split(/[-_\\s]+/)\n .filter(Boolean)\n .map((part) => part.charAt(0).toUpperCase() + part.slice(1))\n .join(\"\");\n}\n\nfunction safeKey(key: string): string {\n return /^[A-Za-z_$][A-Za-z0-9_$]*$/.test(key) ? key : JSON.stringify(key);\n}\n\nfunction escapeComment(text: string): string {\n return text.replace(/\\*\\//g, \"*\\\\/\");\n}\n","import { z } from \"zod\";\nimport type { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport type { CallToolResult } from \"@modelcontextprotocol/sdk/types.js\";\nimport type { ManagementClient } from \"@myna-sh/sdk/management\";\nimport { isMynaApiError } from \"@myna-sh/sdk/management\";\nimport type { ProjectRegistry } from \"./config.js\";\n\n/**\n * The Myna MCP tools (SPEC 13). This module contains no CMS business logic —\n * every tool is a thin adapter over the management SDK.\n */\n\n/**\n * A tool result carrying both a human summary and the data itself.\n *\n * The payload is serialized into a second text block as well as\n * `structuredContent`. That duplication is deliberate: `structuredContent` is\n * only meaningful to hosts that read it, and a host that does not — Claude's\n * remote connector among them — would otherwise receive nothing but the\n * summary. An agent told \"1 project(s)\" with no id, slug, or name cannot make\n * the follow-up call, which strands it on the very tool meant to bootstrap\n * discovery. The MCP specification asks for this fallback for exactly this\n * reason; the cost is some duplicated tokens, and the alternative is a tool\n * that silently returns no data.\n */\nfunction ok(text: string, structured: unknown): CallToolResult {\n return {\n content: [\n { type: \"text\", text },\n { type: \"text\", text: JSON.stringify(structured) },\n ],\n structuredContent: structured as Record<string, unknown>,\n };\n}\n\nfunction fail(error: unknown): CallToolResult {\n const message = isMynaApiError(error)\n ? `${error.code}: ${error.detail ?? error.title}`\n : error instanceof Error\n ? error.message\n : String(error);\n return { content: [{ type: \"text\", text: `Error: ${message}` }], isError: true };\n}\n\nasync function resolveEntryId(client: ManagementClient, project: string, ref: string): Promise<string> {\n if (ref.startsWith(\"ent_\") && !ref.includes(\"/\")) return ref;\n const [collection, slug] = ref.includes(\"/\") ? ref.split(\"/\", 2) : [undefined, ref];\n if (!collection) throw new Error(`Provide the entry as \"<collection>/<slug>\" or an ent_ id (got \"${ref}\").`);\n let cursor: string | undefined;\n for (let i = 0; i < 50; i++) {\n const page = await client.entries.list(project, { collection, limit: 100, cursor });\n const match = page.data.find((e) => e.slug === slug || e.id === slug);\n if (match) return match.id;\n if (!page.nextCursor) break;\n cursor = page.nextCursor;\n }\n throw new Error(`Entry not found: ${ref}`);\n}\n\nconst projectArg = { project: z.string().optional().describe(\"Project id, slug, or configured name. Omit to use the default.\") };\n\nexport interface ToolOptions {\n /**\n * Whether `myna_upload_asset` may read local filesystem paths. True for\n * stdio (the client and server share a machine); false for HTTP, where a\n * remote client must never be able to read the server's filesystem.\n */\n allowPathUploads: boolean;\n}\n\nexport function registerTools(\n server: McpServer,\n registry: ProjectRegistry,\n options: ToolOptions = { allowPathUploads: true },\n): void {\n // 1. list projects\n server.registerTool(\n \"myna_list_projects\",\n {\n title: \"List projects\",\n description: \"List projects in an organization.\",\n inputSchema: {\n organization: z.string().optional().describe(\"Organization id or slug. Omit to use the default.\"),\n ...projectArg,\n },\n annotations: { readOnlyHint: true, openWorldHint: true },\n },\n async (args) => {\n try {\n // Org-scoped: this is how an agent discovers projects, so it must not\n // itself require one.\n const { client } = registry.clientForOrg(args.project);\n const org = registry.organizationFor(args.project, args.organization);\n const projects = await client.projects.list(org);\n return ok(`${projects.length} project(s) in ${org}.`, { projects });\n } catch (error) {\n return fail(error);\n }\n },\n );\n\n // 2. get project\n server.registerTool(\n \"myna_get_project\",\n {\n title: \"Get project\",\n description: \"Fetch a single project's details.\",\n inputSchema: { ...projectArg },\n annotations: { readOnlyHint: true, openWorldHint: true },\n },\n async (args) => {\n try {\n const { client, project } = registry.clientFor(args.project);\n const result = await client.projects.get(project);\n return ok(`Project ${result.name} (${result.slug}).`, { project: result });\n } catch (error) {\n return fail(error);\n }\n },\n );\n\n // 3. list collections\n server.registerTool(\n \"myna_list_collections\",\n {\n title: \"List collections\",\n description: \"List the deployed collections in a project.\",\n inputSchema: { ...projectArg },\n annotations: { readOnlyHint: true, openWorldHint: true },\n },\n async (args) => {\n try {\n const { client, project } = registry.clientFor(args.project);\n const collections = await client.schema.collections(project);\n return ok(`${collections.length} collection(s).`, { collections });\n } catch (error) {\n return fail(error);\n }\n },\n );\n\n // 4. get collection schema\n server.registerTool(\n \"myna_get_collection_schema\",\n {\n title: \"Get collection schema\",\n description: \"Fetch the latest canonical schema for a collection.\",\n inputSchema: { ...projectArg, collection: z.string().describe(\"Collection key.\") },\n annotations: { readOnlyHint: true, openWorldHint: true },\n },\n async (args) => {\n try {\n const { client, project } = registry.clientFor(args.project);\n const versions = await client.schema.versions(project, args.collection);\n const latest = versions[0];\n if (!latest) throw new Error(`Collection ${args.collection} has no versions.`);\n return ok(`${args.collection} schema v${latest.version}.`, { version: latest.version, schema: latest.schemaJson });\n } catch (error) {\n return fail(error);\n }\n },\n );\n\n // 5. list entries\n server.registerTool(\n \"myna_list_entries\",\n {\n title: \"List entries\",\n description: \"List entries in a collection.\",\n inputSchema: {\n ...projectArg,\n collection: z.string().describe(\"Collection key.\"),\n status: z.enum([\"draft\", \"published\", \"changed\", \"unpublished\", \"deleted\"]).optional(),\n limit: z.number().int().min(1).max(100).optional(),\n cursor: z.string().optional(),\n },\n annotations: { readOnlyHint: true, openWorldHint: true },\n },\n async (args) => {\n try {\n const { client, project } = registry.clientFor(args.project);\n const page = await client.entries.list(project, {\n collection: args.collection,\n status: args.status,\n limit: args.limit ?? 25,\n cursor: args.cursor,\n });\n return ok(`${page.data.length} entr(y/ies).`, { entries: page.data, nextCursor: page.nextCursor });\n } catch (error) {\n return fail(error);\n }\n },\n );\n\n // 6. get entry\n server.registerTool(\n \"myna_get_entry\",\n {\n title: \"Get entry\",\n description: \"Fetch one entry by \\\"<collection>/<slug>\\\" or entry id.\",\n inputSchema: { ...projectArg, entry: z.string().describe(\"collection/slug or ent_ id.\") },\n annotations: { readOnlyHint: true, openWorldHint: true },\n },\n async (args) => {\n try {\n const { client, project } = registry.clientFor(args.project);\n const id = await resolveEntryId(client, project, args.entry);\n const entry = await client.entries.get(project, id);\n return ok(`Entry ${entry.id} (${entry.status}).`, { entry });\n } catch (error) {\n return fail(error);\n }\n },\n );\n\n // 7. create change set\n server.registerTool(\n \"myna_create_change_set\",\n {\n title: \"Create change set\",\n description: \"Open a new change set to group entry and asset operations.\",\n inputSchema: {\n ...projectArg,\n title: z.string().min(1).max(200),\n description: z.string().max(2000).optional(),\n },\n annotations: { readOnlyHint: false, destructiveHint: false, idempotentHint: false, openWorldHint: true },\n },\n async (args) => {\n try {\n const { client, project } = registry.clientFor(args.project);\n const cs = await client.changeSets.create(project, { title: args.title, description: args.description });\n return ok(`Created change set ${cs.id}.`, { changeSet: cs });\n } catch (error) {\n return fail(error);\n }\n },\n );\n\n // 8. get change set\n server.registerTool(\n \"myna_get_change_set\",\n {\n title: \"Get change set\",\n description: \"Fetch a change set and its items.\",\n inputSchema: { ...projectArg, changeSet: z.string().describe(\"Change set id (chs_).\") },\n annotations: { readOnlyHint: true, openWorldHint: true },\n },\n async (args) => {\n try {\n const { client, project } = registry.clientFor(args.project);\n const cs = await client.changeSets.get(project, args.changeSet);\n return ok(`Change set ${cs.id} (${cs.status}), ${cs.items.length} item(s).`, { changeSet: cs });\n } catch (error) {\n return fail(error);\n }\n },\n );\n\n // 9. create entry\n server.registerTool(\n \"myna_create_entry\",\n {\n title: \"Create entry\",\n description: \"Create a draft entry. Does not publish.\",\n inputSchema: {\n ...projectArg,\n collection: z.string(),\n data: z.record(z.string(), z.unknown()).describe(\"Field values.\"),\n slug: z.string().optional(),\n changeSet: z.string().optional().describe(\"Attach to an existing change set (chs_).\"),\n changeSummary: z.string().max(500).optional(),\n },\n annotations: { readOnlyHint: false, destructiveHint: false, idempotentHint: false, openWorldHint: true },\n },\n async (args) => {\n try {\n const { client, project } = registry.clientFor(args.project);\n const entry = await client.entries.create(project, {\n collection: args.collection,\n data: args.data,\n slug: args.slug,\n changeSetId: args.changeSet,\n changeSummary: args.changeSummary,\n });\n return ok(`Created entry ${entry.id} (${entry.status}).`, { entry });\n } catch (error) {\n return fail(error);\n }\n },\n );\n\n // 10. update entry\n server.registerTool(\n \"myna_update_entry\",\n {\n title: \"Update entry\",\n description: \"Update a draft entry. Does not publish.\",\n inputSchema: {\n ...projectArg,\n entry: z.string().describe(\"collection/slug or ent_ id.\"),\n data: z.record(z.string(), z.unknown()).optional(),\n slug: z.string().optional(),\n expectedRevisionId: z.string().optional().describe(\"Optimistic concurrency guard.\"),\n changeSet: z.string().optional(),\n changeSummary: z.string().max(500).optional(),\n },\n annotations: { readOnlyHint: false, destructiveHint: false, idempotentHint: false, openWorldHint: true },\n },\n async (args) => {\n try {\n const { client, project } = registry.clientFor(args.project);\n const id = await resolveEntryId(client, project, args.entry);\n const entry = await client.entries.update(project, id, {\n data: args.data,\n slug: args.slug,\n expectedRevisionId: args.expectedRevisionId,\n changeSetId: args.changeSet,\n changeSummary: args.changeSummary,\n });\n return ok(`Updated entry ${entry.id} (${entry.status}).`, { entry });\n } catch (error) {\n return fail(error);\n }\n },\n );\n\n // 11. delete entry (destructive)\n server.registerTool(\n \"myna_delete_entry\",\n {\n title: \"Delete entry\",\n description: \"Stage an entry deletion on a change set. Requires confirm=true. Takes effect only on publish.\",\n inputSchema: {\n ...projectArg,\n entry: z.string(),\n changeSet: z.string().optional(),\n confirm: z.literal(true).describe(\"Must be true to proceed.\"),\n },\n annotations: { readOnlyHint: false, destructiveHint: true, idempotentHint: false, openWorldHint: true },\n },\n async (args) => {\n try {\n const { client, project } = registry.clientFor(args.project);\n const id = await resolveEntryId(client, project, args.entry);\n const result = await client.entries.delete(project, id, args.changeSet);\n return ok(`Staged delete of ${id} on ${result.changeSetId}.`, result);\n } catch (error) {\n return fail(error);\n }\n },\n );\n\n // 12. upload asset\n server.registerTool(\n \"myna_upload_asset\",\n {\n title: \"Upload asset\",\n description: \"Upload an asset from base64 bytes or a local file path via the presigned flow.\",\n inputSchema: {\n ...projectArg,\n filename: z.string().describe(\"Display filename, e.g. cover.png.\"),\n base64: z.string().optional().describe(\"Base64-encoded file bytes.\"),\n path: z.string().optional().describe(\"Local filesystem path (stdio hosts only).\"),\n contentType: z.string().optional(),\n },\n annotations: { readOnlyHint: false, destructiveHint: false, idempotentHint: false, openWorldHint: true },\n },\n async (args) => {\n try {\n const { client, project } = registry.clientFor(args.project);\n if (!args.base64 && !args.path) throw new Error(\"Provide either `base64` or `path`.\");\n if (args.path && !options.allowPathUploads) {\n throw new Error(\"`path` uploads are only available on stdio transports; send `base64` instead.\");\n }\n const input = args.base64 ? new Uint8Array(Buffer.from(args.base64, \"base64\")) : args.path!;\n const asset = await client.assets.upload(project, input, {\n filename: args.filename,\n contentType: args.contentType,\n });\n return ok(`Uploaded ${asset.displayFilename} (${asset.id}).`, { asset });\n } catch (error) {\n return fail(error);\n }\n },\n );\n\n // 13. validate change set\n server.registerTool(\n \"myna_validate_change_set\",\n {\n title: \"Validate change set\",\n description: \"Validate every changed resource in a change set against the deployed schemas.\",\n inputSchema: { ...projectArg, changeSet: z.string() },\n annotations: { readOnlyHint: true, openWorldHint: true },\n },\n async (args) => {\n try {\n const { client, project } = registry.clientFor(args.project);\n const result = await client.changeSets.validate(project, args.changeSet);\n return ok(result.valid ? \"Change set is valid.\" : `Invalid: ${result.errors.length} error(s).`, result);\n } catch (error) {\n return fail(error);\n }\n },\n );\n\n // 14. create preview\n server.registerTool(\n \"myna_create_preview\",\n {\n title: \"Create preview\",\n description: \"Create one preview URL for a change set (or entry). Never publishes.\",\n inputSchema: {\n ...projectArg,\n changeSet: z.string().optional().describe(\"Change set id (chs_).\"),\n entry: z.string().optional().describe(\"Entry id (ent_).\"),\n expiresInSeconds: z.number().int().min(60).max(604800).optional(),\n },\n annotations: { readOnlyHint: false, destructiveHint: false, idempotentHint: false, openWorldHint: true },\n },\n async (args) => {\n try {\n if (Boolean(args.changeSet) === Boolean(args.entry)) {\n throw new Error(\"Provide exactly one of `changeSet` or `entry`.\");\n }\n const { client, project } = registry.clientFor(args.project);\n const preview = await client.previews.create(project, {\n changeSetId: args.changeSet,\n entryId: args.entry,\n expiresInSeconds: args.expiresInSeconds,\n });\n return ok(`Preview: ${preview.url}`, { preview });\n } catch (error) {\n return fail(error);\n }\n },\n );\n\n // 15. publish change set (destructive)\n server.registerTool(\n \"myna_publish_change_set\",\n {\n title: \"Publish change set\",\n description: \"Atomically publish a change set. Requires confirm=true and content:publish scope.\",\n inputSchema: { ...projectArg, changeSet: z.string(), confirm: z.literal(true).describe(\"Must be true.\") },\n annotations: { readOnlyHint: false, destructiveHint: true, idempotentHint: false, openWorldHint: true },\n },\n async (args) => {\n try {\n const { client, project } = registry.clientFor(args.project);\n const result = await client.changeSets.publish(project, args.changeSet);\n return ok(`Published ${result.publishedEntryIds.length} entr(y/ies).`, result);\n } catch (error) {\n return fail(error);\n }\n },\n );\n\n // 16. get entry revisions\n server.registerTool(\n \"myna_get_entry_revisions\",\n {\n title: \"Get entry revisions\",\n description: \"List the immutable revisions of an entry.\",\n inputSchema: { ...projectArg, entry: z.string() },\n annotations: { readOnlyHint: true, openWorldHint: true },\n },\n async (args) => {\n try {\n const { client, project } = registry.clientFor(args.project);\n const id = await resolveEntryId(client, project, args.entry);\n const revisions = await client.entries.revisions(project, id);\n return ok(`${revisions.length} revision(s).`, { revisions });\n } catch (error) {\n return fail(error);\n }\n },\n );\n\n // get entry references (reference integrity)\n server.registerTool(\n \"myna_get_entry_references\",\n {\n title: \"Get entry references\",\n description:\n \"Show reference integrity for an entry: which entries reference it (backlinks) and which entries it references, with publish state. Useful before unpublishing or deleting.\",\n inputSchema: { ...projectArg, entry: z.string() },\n annotations: { readOnlyHint: true, openWorldHint: true },\n },\n async (args) => {\n try {\n const { client, project } = registry.clientFor(args.project);\n const id = await resolveEntryId(client, project, args.entry);\n const refs = await client.entries.references(project, id);\n return ok(\n `Referenced by ${refs.referencedBy.length} entr(y/ies); references ${refs.references.length}.`,\n refs,\n );\n } catch (error) {\n return fail(error);\n }\n },\n );\n\n // 17. restore revision (destructive)\n server.registerTool(\n \"myna_restore_revision\",\n {\n title: \"Restore revision\",\n description: \"Restore a historical revision into a new draft revision. Requires confirm=true.\",\n inputSchema: {\n ...projectArg,\n entry: z.string(),\n revision: z.string().describe(\"Revision id (rev_).\"),\n confirm: z.literal(true).describe(\"Must be true.\"),\n },\n annotations: { readOnlyHint: false, destructiveHint: true, idempotentHint: false, openWorldHint: true },\n },\n async (args) => {\n try {\n const { client, project } = registry.clientFor(args.project);\n const id = await resolveEntryId(client, project, args.entry);\n const result = await client.entries.restoreRevision(project, id, args.revision);\n return ok(`Restored into ${result.revision.id}.`, result);\n } catch (error) {\n return fail(error);\n }\n },\n );\n\n // schedule / cancel scheduled publish\n server.registerTool(\n \"myna_schedule_change_set\",\n {\n title: \"Schedule change-set publish\",\n description:\n \"Schedule a change set to publish atomically at a future time, or cancel its schedule. Requires confirm=true and content:publish scope. Schedule status is readable via myna_get_change_set (scheduledAt).\",\n inputSchema: {\n ...projectArg,\n changeSet: z.string(),\n publishAt: z.string().optional().describe(\"ISO 8601 datetime to publish at. Omit with cancel=true.\"),\n cancel: z.boolean().optional().describe(\"Cancel the existing schedule instead.\"),\n confirm: z.literal(true).describe(\"Must be true.\"),\n },\n annotations: { readOnlyHint: false, destructiveHint: true, idempotentHint: true, openWorldHint: true },\n },\n async (args) => {\n try {\n if (Boolean(args.publishAt) === Boolean(args.cancel)) {\n throw new Error(\"Provide exactly one of `publishAt` or `cancel`.\");\n }\n const { client, project } = registry.clientFor(args.project);\n const cs = args.cancel\n ? await client.changeSets.cancelSchedule(project, args.changeSet)\n : await client.changeSets.schedule(project, args.changeSet, args.publishAt!);\n return ok(cs.scheduledAt ? `Scheduled for ${cs.scheduledAt}.` : \"Schedule cancelled.\", { changeSet: cs });\n } catch (error) {\n return fail(error);\n }\n },\n );\n\n // 18. get review status (reviews + comments + latest checks)\n server.registerTool(\n \"myna_get_change_set_review\",\n {\n title: \"Get change-set review status\",\n description:\n \"Fetch a change set's reviews, comments, and latest automated check run in one call.\",\n inputSchema: { ...projectArg, changeSet: z.string() },\n annotations: { readOnlyHint: true, openWorldHint: true },\n },\n async (args) => {\n try {\n const { client, project } = registry.clientFor(args.project);\n const [reviews, comments, checks] = await Promise.all([\n client.changeSets.reviews(project, args.changeSet),\n client.changeSets.comments(project, args.changeSet),\n client.changeSets.checks(project, args.changeSet),\n ]);\n const approvals = reviews.filter((r) => r.status === \"approved\" && !r.stale).length;\n const failing = checks.filter((c) => c.status === \"failed\").length;\n return ok(\n `${approvals} fresh approval(s), ${comments.length} comment(s), ${checks.length === 0 ? \"no check run\" : `${failing} failing check(s)`}.`,\n { reviews, comments, checks },\n );\n } catch (error) {\n return fail(error);\n }\n },\n );\n\n // 19. review change set (approve / request changes)\n server.registerTool(\n \"myna_review_change_set\",\n {\n title: \"Review change set\",\n description:\n \"Record an approve or request-changes review decision on a change set. Requires content:review scope.\",\n inputSchema: {\n ...projectArg,\n changeSet: z.string(),\n decision: z.enum([\"approve\", \"request_changes\"]),\n comment: z.string().optional().describe(\"Optional review comment.\"),\n },\n annotations: { readOnlyHint: false, destructiveHint: false, idempotentHint: true, openWorldHint: true },\n },\n async (args) => {\n try {\n const { client, project } = registry.clientFor(args.project);\n const reviews =\n args.decision === \"approve\"\n ? await client.changeSets.approve(project, args.changeSet, { comment: args.comment })\n : await client.changeSets.requestChanges(project, args.changeSet, { comment: args.comment });\n return ok(`Recorded ${args.decision} review.`, { reviews });\n } catch (error) {\n return fail(error);\n }\n },\n );\n\n // 20. comment on change set\n server.registerTool(\n \"myna_comment_on_change_set\",\n {\n title: \"Comment on change set\",\n description: \"Add a comment to a change set, optionally anchored to an entry field.\",\n inputSchema: {\n ...projectArg,\n changeSet: z.string(),\n body: z.string().min(1),\n entry: z.string().optional().describe(\"Entry id (ent_) to anchor the comment to.\"),\n fieldPath: z.string().optional().describe(\"Field path within the entry, e.g. fields.title.\"),\n },\n annotations: { readOnlyHint: false, destructiveHint: false, idempotentHint: false, openWorldHint: true },\n },\n async (args) => {\n try {\n const { client, project } = registry.clientFor(args.project);\n const comment = await client.changeSets.comment(project, args.changeSet, {\n body: args.body,\n resourceType: args.entry ? \"entry\" : undefined,\n resourceId: args.entry,\n fieldPath: args.fieldPath,\n });\n return ok(`Commented ${comment.id}.`, { comment });\n } catch (error) {\n return fail(error);\n }\n },\n );\n\n // 21. run automated checks\n server.registerTool(\n \"myna_run_change_set_checks\",\n {\n title: \"Run change-set checks\",\n description:\n \"Run the built-in automated checks (schema, references, slugs, alt-text, SEO) against a change set and return the results.\",\n inputSchema: { ...projectArg, changeSet: z.string() },\n annotations: { readOnlyHint: false, destructiveHint: false, idempotentHint: true, openWorldHint: true },\n },\n async (args) => {\n try {\n const { client, project } = registry.clientFor(args.project);\n const result = await client.changeSets.runChecks(project, args.changeSet);\n const failing = result.checks.filter((c) => c.status === \"failed\");\n return ok(\n result.passed ? \"All checks passed.\" : `Failing: ${failing.map((c) => c.name).join(\", \")}.`,\n result,\n );\n } catch (error) {\n return fail(error);\n }\n },\n );\n}\n","import { McpServer, ResourceTemplate } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport type { ReadResourceResult } from \"@modelcontextprotocol/sdk/types.js\";\nimport type { ProjectRegistry } from \"./config.js\";\n\n/**\n * MCP resources (SPEC 13): project summaries, collection schemas, entry and\n * revision representations, and change-set validation results.\n */\nexport function registerResources(server: McpServer, registry: ProjectRegistry): void {\n const json = (uri: string, value: unknown): ReadResourceResult => ({\n contents: [{ uri, mimeType: \"application/json\", text: JSON.stringify(value, null, 2) }],\n });\n\n // Project summaries for the default organization.\n server.registerResource(\n \"projects\",\n \"myna://projects\",\n { title: \"Projects\", description: \"Projects in the default organization.\", mimeType: \"application/json\" },\n async (uri) => {\n // Org-scoped, like `myna_list_projects`: this is the entry point a client\n // reads to discover projects, so it must not itself demand one. It is the\n // only concrete (non-template) resource, which makes it exactly what a\n // host's resource picker reads first.\n const { client } = registry.clientForOrg();\n const org = registry.organizationFor();\n const projects = await client.projects.list(org);\n return json(uri.href, { organization: org, projects });\n },\n );\n\n // Collection list for a project.\n server.registerResource(\n \"collections\",\n new ResourceTemplate(\"myna://{project}/collections\", { list: undefined }),\n { title: \"Collections\", description: \"Deployed collections for a project.\", mimeType: \"application/json\" },\n async (uri, variables) => {\n const project = String(variables.project);\n const { client, project: ref } = registry.clientFor(project);\n const collections = await client.schema.collections(ref);\n return json(uri.href, { project: ref, collections });\n },\n );\n\n // Canonical schema for one collection.\n server.registerResource(\n \"collection-schema\",\n new ResourceTemplate(\"myna://{project}/collection/{key}\", { list: undefined }),\n { title: \"Collection schema\", description: \"Latest canonical schema for a collection.\", mimeType: \"application/json\" },\n async (uri, variables) => {\n const { client, project } = registry.clientFor(String(variables.project));\n const versions = await client.schema.versions(project, String(variables.key));\n const latest = versions[0];\n return json(uri.href, { collection: String(variables.key), version: latest?.version ?? null, schema: latest?.schemaJson ?? null });\n },\n );\n\n // Entry representation (by entry id).\n server.registerResource(\n \"entry\",\n new ResourceTemplate(\"myna://{project}/entry/{entry}\", { list: undefined }),\n { title: \"Entry\", description: \"An entry's current representation.\", mimeType: \"application/json\" },\n async (uri, variables) => {\n const { client, project } = registry.clientFor(String(variables.project));\n const entry = await client.entries.get(project, String(variables.entry));\n return json(uri.href, { entry });\n },\n );\n\n // Entry revisions.\n server.registerResource(\n \"entry-revisions\",\n new ResourceTemplate(\"myna://{project}/entry/{entry}/revisions\", { list: undefined }),\n { title: \"Entry revisions\", description: \"Immutable revisions for an entry.\", mimeType: \"application/json\" },\n async (uri, variables) => {\n const { client, project } = registry.clientFor(String(variables.project));\n const revisions = await client.entries.revisions(project, String(variables.entry));\n return json(uri.href, { entry: String(variables.entry), revisions });\n },\n );\n\n // Change-set validation results.\n server.registerResource(\n \"change-set-validation\",\n new ResourceTemplate(\"myna://{project}/change-set/{changeSet}/validation\", { list: undefined }),\n { title: \"Change-set validation\", description: \"Validation result for a change set.\", mimeType: \"application/json\" },\n async (uri, variables) => {\n const { client, project } = registry.clientFor(String(variables.project));\n const result = await client.changeSets.validate(project, String(variables.changeSet));\n return json(uri.href, result);\n },\n );\n}\n","/**\n * Build-time version stamp.\n *\n * `tsup` substitutes `__MYNA_VERSION__` with the value from `package.json`\n * (see `tsup.config.ts`), so the version advertised in the MCP handshake can\n * never disagree with the package it was published from. Running from source\n * leaves the identifier undefined and falls back to a marker that is obviously\n * not a release.\n */\ndeclare const __MYNA_VERSION__: string | undefined;\n\nexport const VERSION: string =\n typeof __MYNA_VERSION__ === \"string\" ? __MYNA_VERSION__ : \"0.0.0-dev\";\n","import { createServer as createHttpServer, type IncomingMessage, type ServerResponse } from \"node:http\";\nimport { StreamableHTTPServerTransport } from \"@modelcontextprotocol/sdk/server/streamableHttp.js\";\nimport { ProjectRegistry } from \"./config.js\";\nimport { createServerForRegistry } from \"./server.js\";\n\nexport interface HttpOptions {\n port: number;\n /** Bearer token required in the `Authorization` header. */\n authToken?: string;\n /** Explicitly serve without endpoint auth. Never enable on a public network. */\n allowUnauthenticated?: boolean;\n path?: string;\n}\n\nfunction readBody(req: IncomingMessage): Promise<unknown> {\n return new Promise((resolve, reject) => {\n const chunks: Buffer[] = [];\n req.on(\"data\", (c: Buffer) => chunks.push(c));\n req.on(\"end\", () => {\n const raw = Buffer.concat(chunks).toString(\"utf8\");\n if (!raw) return resolve(undefined);\n try {\n resolve(JSON.parse(raw));\n } catch (error) {\n reject(error);\n }\n });\n req.on(\"error\", reject);\n });\n}\n\nfunction bearer(req: IncomingMessage): string | undefined {\n const header = req.headers.authorization;\n return header?.startsWith(\"Bearer \") ? header.slice(7).trim() : undefined;\n}\n\n/**\n * Streamable HTTP transport (SPEC 13). Stateless: a fresh server + transport per\n * request. Authenticated by a bearer token in the `Authorization` header.\n */\nexport async function runHttp(options: HttpOptions): Promise<void> {\n if (!options.authToken && !options.allowUnauthenticated) {\n throw new Error(\n \"Refusing to serve HTTP without auth. Set MYNA_MCP_TOKEN (or MYNA_TOKEN), \" +\n \"or set MYNA_MCP_ALLOW_UNAUTHENTICATED=1 for trusted-network use only.\",\n );\n }\n const registry = new ProjectRegistry();\n const path = options.path ?? \"/mcp\";\n\n const httpServer = createHttpServer((req: IncomingMessage, res: ServerResponse) => {\n void handle(req, res).catch((error: unknown) => {\n if (!res.headersSent) res.writeHead(500, { \"content-type\": \"application/json\" });\n res.end(JSON.stringify({ jsonrpc: \"2.0\", error: { code: -32603, message: String(error) }, id: null }));\n });\n });\n\n async function handle(req: IncomingMessage, res: ServerResponse): Promise<void> {\n const url = new URL(req.url ?? \"/\", \"http://localhost\");\n if (url.pathname === \"/health\") {\n res.writeHead(200, { \"content-type\": \"application/json\" }).end(JSON.stringify({ ok: true }));\n return;\n }\n if (url.pathname !== path) {\n res.writeHead(404, { \"content-type\": \"application/json\" }).end(JSON.stringify({ error: \"not found\" }));\n return;\n }\n if (options.authToken && bearer(req) !== options.authToken) {\n res.writeHead(401, { \"content-type\": \"application/json\" }).end(JSON.stringify({ error: \"unauthorized\" }));\n return;\n }\n if (req.method !== \"POST\") {\n // Stateless server: no standalone SSE stream.\n res.writeHead(405, { \"content-type\": \"application/json\", allow: \"POST\" }).end(\n JSON.stringify({ jsonrpc: \"2.0\", error: { code: -32000, message: \"Method not allowed.\" }, id: null }),\n );\n return;\n }\n\n const body = await readBody(req);\n const transport = new StreamableHTTPServerTransport({ sessionIdGenerator: undefined });\n // Remote clients must never be able to read this machine's filesystem.\n const server = createServerForRegistry(registry, { allowPathUploads: false });\n res.on(\"close\", () => {\n void transport.close();\n void server.close();\n });\n await server.connect(transport);\n await transport.handleRequest(req, res, body);\n }\n\n await new Promise<void>((resolve) => httpServer.listen(options.port, resolve));\n process.stderr.write(`myna-mcp: streamable HTTP transport listening on :${options.port}${path}\\n`);\n}\n"],"mappings":"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","names":["McpServer","bytes","DEFAULT_API_URL","McpServer"]}
1
+ {"version":3,"sources":["../src/main.ts","../src/server.ts","../src/config.ts","../../sdk/src/errors.ts","../../sdk/src/http.ts","../../sdk/src/management.ts","../../sdk/src/codegen.ts","../src/tools.ts","../src/resources.ts","../src/version.ts","../src/http.ts"],"sourcesContent":["import { StdioServerTransport } from \"@modelcontextprotocol/sdk/server/stdio.js\";\nimport { createServer } from \"./server.js\";\nimport { runHttp } from \"./http.js\";\n\n/** Run over stdio (default) or streamable HTTP (`--http`). */\nexport async function main(argv: string[] = process.argv.slice(2)): Promise<void> {\n const useHttp = argv.includes(\"--http\") || process.env.MYNA_MCP_TRANSPORT === \"http\";\n\n if (useHttp) {\n const port = Number(process.env.MYNA_MCP_PORT ?? process.env.PORT ?? 3333);\n const authToken = process.env.MYNA_MCP_TOKEN ?? process.env.MYNA_TOKEN;\n const allowUnauthenticated = [\"1\", \"true\"].includes(\n process.env.MYNA_MCP_ALLOW_UNAUTHENTICATED ?? \"\",\n );\n await runHttp({ port, authToken, allowUnauthenticated });\n return;\n }\n\n const server = createServer();\n const transport = new StdioServerTransport();\n await server.connect(transport);\n // Keep the process alive; the transport closes on stdin end.\n process.stderr.write(\"myna-mcp: stdio transport ready\\n\");\n}\n\nexport { createServer, createServerForRegistry, SERVER_NAME, SERVER_VERSION } from \"./server.js\";\nexport { runHttp } from \"./http.js\";\nexport { ProjectRegistry, type RegistryOptions } from \"./config.js\";\nexport { VERSION } from \"./version.js\";\n","import { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { ProjectRegistry } from \"./config.js\";\nimport { registerTools, type ToolOptions } from \"./tools.js\";\nimport { registerResources } from \"./resources.js\";\nimport { VERSION } from \"./version.js\";\n\nexport const SERVER_NAME = \"myna\";\nexport const SERVER_VERSION = VERSION;\n\n/** Build a fully-wired Myna MCP server (tools + resources). */\nexport function createServer(): McpServer {\n return createServerForRegistry(new ProjectRegistry());\n}\n\n/** Internal variant used by the stateless HTTP transport. */\nexport function createServerForRegistry(\n registry: ProjectRegistry,\n toolOptions?: ToolOptions,\n): McpServer {\n const server = new McpServer(\n { name: SERVER_NAME, version: SERVER_VERSION },\n {\n capabilities: { tools: {}, resources: {} },\n instructions:\n \"Myna MCP server: manage content, schemas, assets, change sets, and previews. \" +\n \"The primary flow is: create a change set, apply entry/asset operations, validate, \" +\n \"then create one preview URL. Publishing is a separate, confirmation-gated action.\",\n },\n );\n registerTools(server, registry, toolOptions);\n registerResources(server, registry);\n return server;\n}\n","import { readFileSync } from \"node:fs\";\nimport { homedir } from \"node:os\";\nimport { join } from \"node:path\";\nimport { createManagementClient, type ManagementClient } from \"@myna-sh/sdk/management\";\n\n/**\n * Named project configurations (SPEC 13). A default project plus per-call\n * overrides. Configuration comes from the environment and an optional JSON file\n * (`MYNA_MCP_CONFIG` or `~/.config/myna/mcp.json`).\n */\n\nexport interface NamedProject {\n project: string;\n organization?: string;\n apiUrl?: string;\n token?: string;\n}\n\nexport interface McpConfigFile {\n default?: string;\n apiUrl?: string;\n token?: string;\n projects?: Record<string, NamedProject>;\n}\n\nconst DEFAULT_API_URL = \"https://api.myna.sh\";\n\nexport interface RegistryOptions {\n /**\n * Skip the on-disk config file. The hosted server builds one registry per\n * request from the caller's OAuth grant; it must never pick up whatever\n * `~/.config/myna/mcp.json` happens to exist on the host.\n */\n ignoreConfigFile?: boolean;\n /** Replaces the \"set MYNA_PROJECT\" advice, which is meaningless remotely. */\n noProjectHint?: string;\n}\n\nexport class ProjectRegistry {\n private readonly file: McpConfigFile;\n private readonly clients = new Map<string, ManagementClient>();\n private readonly options: RegistryOptions;\n\n constructor(\n private readonly env: NodeJS.ProcessEnv = process.env,\n options: RegistryOptions = {},\n ) {\n this.options = options;\n this.file = options.ignoreConfigFile ? {} : loadConfigFile(env);\n }\n\n /**\n * A registry bound to a single credential, for the hosted (multi-tenant)\n * server. Every request builds its own; nothing is shared between callers.\n */\n static forCredential(input: {\n apiUrl: string;\n token: string;\n organization?: string;\n }): ProjectRegistry {\n return new ProjectRegistry(\n {\n MYNA_API_URL: input.apiUrl,\n MYNA_TOKEN: input.token,\n ...(input.organization ? { MYNA_ORGANIZATION: input.organization } : {}),\n } as NodeJS.ProcessEnv,\n {\n ignoreConfigFile: true,\n noProjectHint:\n \"No project specified. Pass `project` (an id or slug); use myna_list_projects to see them.\",\n },\n );\n }\n\n private get defaultApiUrl(): string {\n return this.env.MYNA_API_URL ?? this.file.apiUrl ?? DEFAULT_API_URL;\n }\n\n private get defaultToken(): string | undefined {\n return this.env.MYNA_TOKEN ?? this.file.token;\n }\n\n /** The named-project key used when a call omits `project`. */\n defaultProjectName(): string | undefined {\n return this.file.default ?? (this.env.MYNA_PROJECT ? \"__env\" : undefined);\n }\n\n /** All configured named projects (env default included). */\n list(): Array<{ name: string; project: string; organization?: string }> {\n const out: Array<{ name: string; project: string; organization?: string }> = [];\n if (this.env.MYNA_PROJECT) {\n out.push({ name: \"__env\", project: this.env.MYNA_PROJECT, organization: this.env.MYNA_ORGANIZATION });\n }\n for (const [name, cfg] of Object.entries(this.file.projects ?? {})) {\n out.push({ name, project: cfg.project, organization: cfg.organization });\n }\n return out;\n }\n\n /**\n * Resolve credentials without demanding a project.\n *\n * Org-scoped calls — listing projects above all — have no project to name\n * yet. A hosted connector is bound to an organization, not a project, so\n * requiring one here made discovery impossible: the tool an agent must call\n * first was the one that could not run.\n */\n resolveCredential(ref?: string): {\n project: string | null;\n organization?: string;\n apiUrl: string;\n token: string | undefined;\n } {\n // A named configuration.\n if (ref && this.file.projects?.[ref]) {\n const cfg = this.file.projects[ref]!;\n return {\n project: cfg.project,\n organization: cfg.organization,\n apiUrl: cfg.apiUrl ?? this.defaultApiUrl,\n token: cfg.token ?? this.defaultToken,\n };\n }\n // The env default named project.\n if ((!ref || ref === \"__env\") && this.env.MYNA_PROJECT) {\n return {\n project: ref && ref !== \"__env\" ? ref : this.env.MYNA_PROJECT,\n organization: this.env.MYNA_ORGANIZATION,\n apiUrl: this.defaultApiUrl,\n token: this.defaultToken,\n };\n }\n // A default named config.\n if (!ref && this.file.default && this.file.projects?.[this.file.default]) {\n return this.resolveCredential(this.file.default);\n }\n return {\n project: ref ?? null,\n organization: this.env.MYNA_ORGANIZATION,\n apiUrl: this.defaultApiUrl,\n token: this.defaultToken,\n };\n }\n\n /** Resolve a project reference: an explicit id/slug, a named config, or the default. */\n resolve(ref?: string): { project: string; organization?: string; apiUrl: string; token: string | undefined } {\n const resolved = this.resolveCredential(ref);\n if (!resolved.project) {\n throw new Error(\n this.options.noProjectHint ??\n \"No project specified and no default is configured (set MYNA_PROJECT or configure a default).\",\n );\n }\n return { ...resolved, project: resolved.project };\n }\n\n private clientFrom(apiUrl: string, token: string | undefined): ManagementClient {\n if (!token) {\n throw new Error(\"No credential available. Set MYNA_TOKEN or configure a token for the project.\");\n }\n const cacheKey = `${apiUrl}::${token}`;\n let client = this.clients.get(cacheKey);\n if (!client) {\n client = createManagementClient({ token, apiUrl });\n this.clients.set(cacheKey, client);\n }\n return client;\n }\n\n /** A management client bound to the resolved project's API + token. */\n clientFor(ref?: string): { client: ManagementClient; project: string; organization?: string } {\n const resolved = this.resolve(ref);\n return {\n client: this.clientFrom(resolved.apiUrl, resolved.token),\n project: resolved.project,\n organization: resolved.organization,\n };\n }\n\n /** A management client for an org-scoped call, where no project is required. */\n clientForOrg(ref?: string): { client: ManagementClient; organization?: string } {\n const resolved = this.resolveCredential(ref);\n return {\n client: this.clientFrom(resolved.apiUrl, resolved.token),\n organization: resolved.organization,\n };\n }\n\n /** Resolve an organization for org-scoped calls. */\n organizationFor(ref?: string, organizationOverride?: string): string {\n const resolved = this.resolveCredential(ref);\n const org = organizationOverride ?? resolved.organization;\n if (!org) throw new Error(\"No organization specified. Provide `organization` or configure one for the project.\");\n return org;\n }\n}\n\nfunction loadConfigFile(env: NodeJS.ProcessEnv): McpConfigFile {\n const explicit = env.MYNA_MCP_CONFIG;\n const candidates = [explicit, join(env.XDG_CONFIG_HOME ?? join(homedir(), \".config\"), \"myna\", \"mcp.json\")].filter(\n (v): v is string => Boolean(v),\n );\n for (const path of candidates) {\n try {\n return JSON.parse(readFileSync(path, \"utf8\")) as McpConfigFile;\n } catch {\n // Try next candidate.\n }\n }\n return {};\n}\n","import type { FieldErrorContract, ProblemDetailsContract } from \"../../api-contracts/src/common.js\";\n\n/**\n * Error thrown by both SDK clients when the API returns a non-2xx response.\n * Carries the parsed RFC 9457 problem-details document so callers can branch on\n * the stable `code`, inspect field-level `fields`, and surface the `requestId`.\n */\nexport class MynaApiError extends Error {\n /** HTTP status code. */\n readonly status: number;\n /** Stable machine-readable error code (e.g. `VALIDATION_FAILED`). */\n readonly code: string;\n /** RFC 9457 `type` URI. */\n readonly type: string | undefined;\n /** Human-facing title. */\n readonly title: string;\n /** Longer human-facing detail, when provided. */\n readonly detail: string | undefined;\n /** Server request id for support/correlation. */\n readonly requestId: string | undefined;\n /** Field-level validation errors, when present. */\n readonly fields: FieldErrorContract[] | undefined;\n /** The full parsed problem document (or a synthesized one). */\n readonly problem: ProblemDetailsContract;\n\n constructor(problem: ProblemDetailsContract) {\n super(problem.detail ?? problem.title ?? `Request failed (${problem.status})`);\n this.name = \"MynaApiError\";\n this.status = problem.status;\n this.code = problem.code;\n this.type = problem.type;\n this.title = problem.title;\n this.detail = problem.detail;\n this.requestId = problem.requestId;\n this.fields = problem.fields;\n this.problem = problem;\n Object.setPrototypeOf(this, MynaApiError.prototype);\n }\n\n static is(value: unknown): value is MynaApiError {\n return value instanceof MynaApiError;\n }\n}\n\n/** Type guard for `MynaApiError`. */\nexport function isMynaApiError(value: unknown): value is MynaApiError {\n return value instanceof MynaApiError;\n}\n\n/** Build a `MynaApiError` from an arbitrary response body and status. */\nexport function problemFromResponse(status: number, body: unknown, fallbackTitle: string): MynaApiError {\n if (body && typeof body === \"object\" && \"code\" in body && \"status\" in body) {\n return new MynaApiError(body as ProblemDetailsContract);\n }\n const detail =\n body && typeof body === \"object\" && \"error\" in body && typeof (body as { error: unknown }).error === \"string\"\n ? (body as { error: string }).error\n : typeof body === \"string\" && body\n ? body\n : undefined;\n return new MynaApiError({\n type: \"about:blank\",\n title: fallbackTitle,\n status,\n code: status >= 500 ? \"INTERNAL\" : \"REQUEST_FAILED\",\n detail,\n } as ProblemDetailsContract);\n}\n","import { problemFromResponse } from \"./errors.js\";\n\n/** A fetch-compatible function. */\nexport type FetchLike = (input: string, init?: RequestInit) => Promise<Response>;\n\nexport interface RetryOptions {\n /**\n * Maximum number of retries (in addition to the first attempt).\n * Defaults to 3 on a server and 1 in a browser — see `defaultMaxRetries`.\n */\n maxRetries?: number;\n /** Base backoff in milliseconds (exponential). Default 200. */\n baseDelayMs?: number;\n /** Cap on any single backoff. Default 5000. */\n maxDelayMs?: number;\n /**\n * Retries for transport-level failures (`fetch` rejecting outright).\n * Defaults to 1, and to 0 in a browser.\n *\n * In a browser these are usually permanent, not transient: a blocked CORS\n * response, a disallowed origin, an extension cancelling the request. They\n * are indistinguishable from a dropped connection — `fetch` rejects with an\n * opaque `TypeError` either way — so retrying converts one clear failure into\n * an identical wall of them, which is what buries the real cause.\n */\n maxNetworkRetries?: number;\n}\n\n/** Browsers get conservative retry defaults; servers keep the aggressive ones. */\nfunction inBrowser(): boolean {\n return typeof globalThis === \"object\" && \"document\" in globalThis;\n}\n\nfunction defaultMaxRetries(): number {\n return inBrowser() ? 1 : 3;\n}\n\nfunction defaultMaxNetworkRetries(): number {\n return inBrowser() ? 0 : 1;\n}\n\nexport interface HttpClientOptions {\n /** Base URL including the version prefix, e.g. `https://api.myna.sh/v1`. */\n baseUrl: string;\n /** Bearer credential (API key, preview token, or CLI token). */\n token?: string | undefined;\n /** Custom fetch implementation (browser/undici/node). */\n fetch?: FetchLike | undefined;\n /** Extra default headers merged into every request. */\n headers?: Record<string, string> | undefined;\n /** Retry policy. Retries apply to safe reads and idempotent mutations only. */\n retry?: RetryOptions | undefined;\n}\n\nexport interface RequestOptions {\n query?: Record<string, unknown> | undefined;\n body?: unknown;\n headers?: Record<string, string> | undefined;\n signal?: AbortSignal | undefined;\n /** Sending an idempotency key makes a mutation eligible for automatic retry. */\n idempotencyKey?: string | undefined;\n /** Override the bearer token for a single request (e.g. a preview token). */\n token?: string | undefined;\n}\n\nconst RETRYABLE_STATUS = new Set([408, 425, 429, 500, 502, 503, 504]);\nconst SAFE_METHODS = new Set([\"GET\", \"HEAD\", \"OPTIONS\"]);\n\nfunction resolveFetch(custom?: FetchLike): FetchLike {\n if (custom) return custom;\n if (typeof globalThis.fetch === \"function\") return globalThis.fetch.bind(globalThis) as FetchLike;\n throw new Error(\"No fetch implementation available. Pass `fetch` to the Myna client.\");\n}\n\n/** Serialize a query object, supporting nested `filter[field][op]` shapes. */\nexport function buildQuery(query: Record<string, unknown> | undefined): string {\n if (!query) return \"\";\n const params = new URLSearchParams();\n const append = (key: string, value: unknown): void => {\n if (value === undefined || value === null) return;\n if (Array.isArray(value)) {\n params.set(key, value.join(\",\"));\n return;\n }\n if (typeof value === \"object\") {\n for (const [op, v] of Object.entries(value as Record<string, unknown>)) {\n append(`${key}[${op}]`, v);\n }\n return;\n }\n params.set(key, String(value));\n };\n for (const [key, value] of Object.entries(query)) append(key, value);\n const qs = params.toString();\n return qs ? `?${qs}` : \"\";\n}\n\nfunction sleep(ms: number, signal?: AbortSignal): Promise<void> {\n return new Promise((resolve, reject) => {\n if (signal?.aborted) return reject(signal.reason ?? new Error(\"Aborted\"));\n const timer = setTimeout(resolve, ms);\n signal?.addEventListener(\n \"abort\",\n () => {\n clearTimeout(timer);\n reject(signal.reason ?? new Error(\"Aborted\"));\n },\n { once: true },\n );\n });\n}\n\nexport class HttpClient {\n private readonly baseUrl: string;\n private readonly token: string | undefined;\n private readonly fetchImpl: FetchLike;\n private readonly defaultHeaders: Record<string, string>;\n private readonly retry: Required<RetryOptions>;\n\n constructor(options: HttpClientOptions) {\n this.baseUrl = options.baseUrl.replace(/\\/+$/, \"\");\n this.token = options.token;\n this.fetchImpl = resolveFetch(options.fetch);\n this.defaultHeaders = options.headers ?? {};\n this.retry = {\n maxRetries: options.retry?.maxRetries ?? defaultMaxRetries(),\n baseDelayMs: options.retry?.baseDelayMs ?? 200,\n maxDelayMs: options.retry?.maxDelayMs ?? 5000,\n maxNetworkRetries: options.retry?.maxNetworkRetries ?? defaultMaxNetworkRetries(),\n };\n }\n\n /**\n * Share one in-flight request between identical concurrent safe reads.\n *\n * Several components asking for the same collection on first paint is the\n * normal shape of a page, not a mistake, and issuing N identical requests\n * multiplies both latency and any failure. Only GET/HEAD are pooled, and only\n * while in flight — this is request coalescing, not a cache.\n */\n private readonly inFlight = new Map<string, Promise<Response>>();\n\n private dedupe(key: string, run: () => Promise<Response>): Promise<Response> {\n const existing = this.inFlight.get(key);\n // Each caller needs its own Response: a body can only be read once.\n if (existing) return existing.then((response) => response.clone());\n const started = run();\n this.inFlight.set(key, started);\n const cleanup = (): void => {\n if (this.inFlight.get(key) === started) this.inFlight.delete(key);\n };\n started.then(cleanup, cleanup);\n return started.then((response) => response.clone());\n }\n\n /** Perform a request and unwrap the `{ data }` envelope. */\n async request<T>(method: string, path: string, options: RequestOptions = {}): Promise<T> {\n const raw = await this.requestRaw(method, path, options);\n if (raw.status === 204 || raw.status === 304) return undefined as T;\n const parsed = (await raw.json().catch(() => undefined)) as { data?: T } | undefined;\n return (parsed && \"data\" in parsed ? parsed.data : (parsed as unknown)) as T;\n }\n\n /** Perform a request and return the full parsed body (envelope included). */\n async requestEnvelope<T>(method: string, path: string, options: RequestOptions = {}): Promise<T> {\n const raw = await this.requestRaw(method, path, options);\n return (await raw.json().catch(() => ({}))) as T;\n }\n\n /** Low-level request with retries; throws `MynaApiError` on non-2xx. */\n async requestRaw(method: string, path: string, options: RequestOptions = {}): Promise<Response> {\n const url = `${this.baseUrl}${path}${buildQuery(options.query)}`;\n const headers: Record<string, string> = {\n accept: \"application/json\",\n ...this.defaultHeaders,\n ...options.headers,\n };\n const token = options.token ?? this.token;\n if (token) headers.authorization = `Bearer ${token}`;\n\n let payload: BodyInit | undefined;\n if (options.body !== undefined) {\n if (options.body instanceof Uint8Array || typeof options.body === \"string\") {\n payload = options.body as BodyInit;\n } else {\n headers[\"content-type\"] = \"application/json\";\n payload = JSON.stringify(options.body);\n }\n }\n if (options.idempotencyKey) headers[\"idempotency-key\"] = options.idempotencyKey;\n\n const upper = method.toUpperCase();\n const safe = SAFE_METHODS.has(upper);\n const idempotent = safe || Boolean(options.idempotencyKey);\n const init: RequestInit = { method, headers };\n if (payload !== undefined) init.body = payload;\n if (options.signal) init.signal = options.signal;\n\n // Coalesce identical concurrent safe reads. Requests carrying a signal opt\n // out: one caller aborting must not cancel another's request.\n if (safe && !options.signal && (upper === \"GET\" || upper === \"HEAD\")) {\n const key = `${upper} ${url} ${token ?? \"\"}`;\n return this.dedupe(key, () => this.attempt(url, init, idempotent, options));\n }\n return this.attempt(url, init, idempotent, options);\n }\n\n private async attempt(\n url: string,\n init: RequestInit,\n idempotent: boolean,\n options: RequestOptions,\n ): Promise<Response> {\n let attempt = 0;\n let networkAttempt = 0;\n for (;;) {\n let response: Response;\n try {\n response = await this.fetchImpl(url, init);\n } catch (error) {\n // A rejected fetch is a transport failure, budgeted separately from\n // HTTP-level retries: in a browser it is usually permanent (CORS, a\n // blocked request), and repeating it only multiplies the noise.\n if (\n idempotent &&\n networkAttempt < this.retry.maxNetworkRetries &&\n attempt < this.retry.maxRetries &&\n !isAbort(error)\n ) {\n await sleep(this.backoff(attempt), options.signal);\n attempt++;\n networkAttempt++;\n continue;\n }\n throw error;\n }\n\n if (response.ok) return response;\n\n if (idempotent && RETRYABLE_STATUS.has(response.status) && attempt < this.retry.maxRetries) {\n const retryAfter = retryAfterMs(response);\n await sleep(retryAfter ?? this.backoff(attempt), options.signal);\n attempt++;\n continue;\n }\n\n const body = await response.json().catch(() => undefined);\n throw problemFromResponse(response.status, body, response.statusText || \"Request failed\");\n }\n }\n\n private backoff(attempt: number): number {\n const base = Math.min(this.retry.baseDelayMs * 2 ** attempt, this.retry.maxDelayMs);\n return Math.round(base * (0.5 + Math.random() * 0.5));\n }\n}\n\nfunction retryAfterMs(response: Response): number | undefined {\n const header = response.headers.get(\"retry-after\");\n if (!header) return undefined;\n const seconds = Number(header);\n return Number.isFinite(seconds) ? seconds * 1000 : undefined;\n}\n\nfunction isAbort(error: unknown): boolean {\n return (\n error instanceof Error &&\n (error.name === \"AbortError\" || error.name === \"TimeoutError\")\n );\n}\n","import { createHash, randomUUID } from \"node:crypto\";\nimport { readFile } from \"node:fs/promises\";\nimport { basename } from \"node:path\";\nimport type {\n AcceptInvitationResponse,\n ApiKeyContract,\n CreateApiKeyRequest,\n CreateApiKeyResponse,\n CreateInvitationRequest,\n CreateOrganizationRequest,\n InvitationContract,\n MemberContract,\n OrganizationContract,\n UpdateMemberRequest,\n UpdateOrganizationRequest,\n} from \"../../api-contracts/src/organizations.js\";\nimport type { ActivityEventContract } from \"../../api-contracts/src/activity.js\";\nimport type {\n AssetContract,\n CompleteUploadResponse,\n CreateUploadRequest,\n CreateUploadResponse,\n ReplaceAssetRequest,\n UpdateAssetRequest,\n} from \"../../api-contracts/src/assets.js\";\nimport type {\n BillingResponse,\n CheckoutRequest,\n CheckoutResponse,\n PortalResponse,\n} from \"../../api-contracts/src/billing.js\";\nimport type {\n ChangeSetCheckContract,\n ChangeSetCommentContract,\n ChangeSetContract,\n ChangeSetDiffResponse,\n ChangeSetReviewContract,\n ProjectCheckContract,\n ReportCheckResultRequest,\n UpsertProjectCheckRequest,\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 TranslationCoverageResponse,\n} from \"../../api-contracts/src/collections.js\";\nimport type {\n BulkEntriesRequest,\n BulkEntriesResponse,\n EntryContract,\n EntryReferencesResponse,\n ImportEntriesRequest,\n ImportEntriesResponse,\n ReorderEntriesRequest,\n ReorderEntriesResponse,\n RestoreRevisionResponse,\n RevisionContract,\n} from \"../../api-contracts/src/entries.js\";\nimport type { CreatePreviewRequest, PreviewContract } from \"../../api-contracts/src/previews.js\";\nimport type {\n CorsCheckResponse,\n CreateProjectRequest,\n CreateSavedViewRequest,\n ProjectContract,\n ProjectExportResponse,\n SavedViewContract,\n UpdateProjectRequest,\n} from \"../../api-contracts/src/projects.js\";\nimport type { UsageResponse } from \"../../api-contracts/src/usage.js\";\nimport type {\n CreateWebhookRequest,\n CreateWebhookResponse,\n UpdateWebhookRequest,\n WebhookDeliveryContract,\n WebhookEndpointContract,\n} from \"../../api-contracts/src/webhooks.js\";\nimport { HttpClient, type FetchLike, type RetryOptions } from \"./http.js\";\n\nconst DEFAULT_API_URL = \"https://api.myna.sh\";\n\nexport interface ManagementClientOptions {\n /** Management/CLI credential (`myna_sk_...`). */\n token: string;\n /** API origin. Defaults to `https://api.myna.sh`. */\n apiUrl?: string;\n fetch?: FetchLike;\n retry?: RetryOptions;\n /**\n * Idempotency-key factory for mutations. Defaults to a random UUID per call.\n * Pass a stable value to make a specific mutation replay-safe.\n */\n idempotencyKey?: () => string;\n}\n\nexport interface ListOptions {\n limit?: number;\n cursor?: string;\n signal?: AbortSignal;\n}\n\nexport interface Page<T> {\n data: T[];\n nextCursor: string | null;\n}\n\nexport interface UploadAssetMeta {\n filename?: string;\n contentType?: string;\n /** Override the automatically detected byte length. */\n byteSize?: number;\n}\n\n/** Bytes or a filesystem path accepted by `uploadAsset`. */\nexport type AssetInput = string | Uint8Array | ArrayBuffer;\n\n/**\n * Server-only management client (SPEC 12). Typed wrappers over the full\n * management API surface. Mutations automatically carry an `Idempotency-Key`.\n */\nexport class ManagementClient {\n private readonly http: HttpClient;\n private readonly newIdempotencyKey: () => string;\n private readonly fetchImpl: FetchLike;\n\n constructor(options: ManagementClientOptions) {\n if (!options.token) throw new Error(\"createManagementClient: `token` is required.\");\n this.newIdempotencyKey = options.idempotencyKey ?? (() => randomUUID());\n this.fetchImpl = options.fetch ?? ((input, init) => fetch(input, init));\n this.http = new HttpClient({\n baseUrl: `${(options.apiUrl ?? DEFAULT_API_URL).replace(/\\/+$/, \"\")}/v1`,\n token: options.token,\n fetch: options.fetch,\n retry: options.retry,\n });\n }\n\n // Convenience: idempotency key for a mutation.\n private idem(): string {\n return this.newIdempotencyKey();\n }\n\n private get<T>(path: string, query?: Record<string, unknown>, signal?: AbortSignal): Promise<T> {\n return this.http.request<T>(\"GET\", path, { query, signal });\n }\n\n /**\n * Paged GET. Extra filters are merged into the query rather than appended to\n * the path: the client builds its own query string from `options.query`, so a\n * path that already carries one produces `?a=1?limit=25` — a second `?` that\n * silently becomes part of the previous value.\n */\n private async page<T>(\n path: string,\n opts: ListOptions = {},\n filters: Record<string, unknown> = {},\n ): Promise<Page<T>> {\n const body = await this.http.requestEnvelope<{ data: T[]; pagination: { nextCursor: string | null } }>(\n \"GET\",\n path,\n { query: { ...filters, limit: opts.limit, cursor: opts.cursor }, signal: opts.signal },\n );\n return { data: body.data, nextCursor: body.pagination?.nextCursor ?? null };\n }\n\n private mutate<T>(method: string, path: string, body?: unknown, query?: Record<string, unknown>): Promise<T> {\n return this.http.request<T>(method, path, { body, query, idempotencyKey: this.idem() });\n }\n\n // --- Organizations --------------------------------------------------------\n readonly organizations = {\n list: (signal?: AbortSignal): Promise<OrganizationContract[]> =>\n this.get<OrganizationContract[]>(\"/organizations\", undefined, signal),\n create: (body: CreateOrganizationRequest): Promise<OrganizationContract> =>\n this.mutate<OrganizationContract>(\"POST\", \"/organizations\", body),\n get: (organization: string, signal?: AbortSignal): Promise<OrganizationContract> =>\n this.get<OrganizationContract>(`/organizations/${enc(organization)}`, undefined, signal),\n update: (organization: string, body: UpdateOrganizationRequest): Promise<OrganizationContract> =>\n this.mutate<OrganizationContract>(\"PATCH\", `/organizations/${enc(organization)}`, body),\n delete: (organization: string): Promise<{ ok: boolean; recoverableForDays: number }> =>\n this.mutate(\"DELETE\", `/organizations/${enc(organization)}`),\n export: (organization: string): Promise<{ jobId: string; storageKey: string; downloadUrl: string; ready: boolean }> =>\n this.mutate(\"POST\", `/organizations/${enc(organization)}/export`),\n usage: (organization: string, signal?: AbortSignal): Promise<UsageResponse> =>\n this.get<UsageResponse>(`/organizations/${enc(organization)}/usage`, undefined, signal),\n };\n\n // --- Members & invitations ------------------------------------------------\n readonly members = {\n list: (organization: string, signal?: AbortSignal): Promise<MemberContract[]> =>\n this.get<MemberContract[]>(`/organizations/${enc(organization)}/members`, undefined, signal),\n update: (organization: string, user: string, body: UpdateMemberRequest): Promise<{ ok: boolean }> =>\n this.mutate(\"PATCH\", `/organizations/${enc(organization)}/members/${enc(user)}`, body),\n remove: (organization: string, user: string): Promise<{ ok: boolean }> =>\n this.mutate(\"DELETE\", `/organizations/${enc(organization)}/members/${enc(user)}`),\n };\n\n readonly invitations = {\n list: (organization: string, signal?: AbortSignal): Promise<InvitationContract[]> =>\n this.get<InvitationContract[]>(`/organizations/${enc(organization)}/invitations`, undefined, signal),\n create: (organization: string, body: CreateInvitationRequest): Promise<InvitationContract> =>\n this.mutate<InvitationContract>(\"POST\", `/organizations/${enc(organization)}/invitations`, body),\n revoke: (organization: string, invitation: string): Promise<{ ok: boolean }> =>\n this.mutate(\"DELETE\", `/organizations/${enc(organization)}/invitations/${enc(invitation)}`),\n accept: (token: string): Promise<AcceptInvitationResponse> =>\n this.mutate<AcceptInvitationResponse>(\"POST\", `/invitations/${enc(token)}/accept`),\n };\n\n // --- Projects -------------------------------------------------------------\n readonly projects = {\n list: (organization: string, signal?: AbortSignal): Promise<ProjectContract[]> =>\n this.get<ProjectContract[]>(`/organizations/${enc(organization)}/projects`, undefined, signal),\n create: (organization: string, body: CreateProjectRequest): Promise<ProjectContract> =>\n this.mutate<ProjectContract>(\"POST\", `/organizations/${enc(organization)}/projects`, body),\n get: (project: string, signal?: AbortSignal): Promise<ProjectContract> =>\n this.get<ProjectContract>(`/projects/${enc(project)}`, undefined, signal),\n update: (project: string, body: UpdateProjectRequest): Promise<ProjectContract> =>\n this.mutate<ProjectContract>(\"PATCH\", `/projects/${enc(project)}`, body),\n archive: (project: string): Promise<ProjectContract> =>\n this.mutate<ProjectContract>(\"POST\", `/projects/${enc(project)}/archive`),\n /** Full project export: schemas, entries (draft + published), asset metadata. */\n export: (project: string, signal?: AbortSignal): Promise<ProjectExportResponse> =>\n this.get<ProjectExportResponse>(`/projects/${enc(project)}/export`, undefined, signal),\n /** Why a browser at `origin` can or cannot read this project's content. */\n corsCheck: (\n project: string,\n origin: string,\n collection?: string,\n signal?: AbortSignal,\n ): Promise<CorsCheckResponse> =>\n this.get<CorsCheckResponse>(\n `/projects/${enc(project)}/cors-check`,\n collection ? { origin, collection } : { origin },\n signal,\n ),\n views: (project: string, signal?: AbortSignal): Promise<SavedViewContract[]> =>\n this.get<SavedViewContract[]>(`/projects/${enc(project)}/views`, undefined, signal),\n createView: (project: string, body: CreateSavedViewRequest): Promise<SavedViewContract> =>\n this.mutate<SavedViewContract>(\"POST\", `/projects/${enc(project)}/views`, body),\n deleteView: (project: string, view: string): Promise<{ ok: boolean }> =>\n this.mutate(\"DELETE\", `/projects/${enc(project)}/views/${enc(view)}`),\n };\n\n // --- Schema ---------------------------------------------------------------\n readonly schema = {\n collections: (project: string, signal?: AbortSignal): Promise<CollectionContract[]> =>\n this.get<CollectionContract[]>(`/projects/${enc(project)}/collections`, undefined, signal),\n collection: (project: string, key: string, signal?: AbortSignal): Promise<CollectionContract> =>\n this.get<CollectionContract>(`/projects/${enc(project)}/collections/${enc(key)}`, undefined, signal),\n versions: (project: string, key: string, signal?: AbortSignal): Promise<CollectionVersionContract[]> =>\n this.get<CollectionVersionContract[]>(`/projects/${enc(project)}/collections/${enc(key)}/versions`, undefined, signal),\n /** What is still untranslated in a collection, per project locale. */\n translations: (project: string, key: string, signal?: AbortSignal): Promise<TranslationCoverageResponse> =>\n this.get<TranslationCoverageResponse>(\n `/projects/${enc(project)}/collections/${enc(key)}/translations`,\n undefined,\n signal,\n ),\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; q?: string } = {},\n ): Promise<Page<EntryContract>> =>\n this.page<EntryContract>(`/projects/${enc(project)}/entries`, opts, {\n collection: opts.collection,\n status: opts.status,\n q: opts.q,\n }),\n create: (\n project: string,\n body: { collection: string; slug?: string; data: Record<string, unknown>; changeSetId?: string; changeSummary?: string },\n ): Promise<EntryContract> => this.mutate<EntryContract>(\"POST\", `/projects/${enc(project)}/entries`, body),\n get: (project: string, entry: string, signal?: AbortSignal): Promise<EntryContract> =>\n this.get<EntryContract>(`/projects/${enc(project)}/entries/${enc(entry)}`, undefined, signal),\n update: (\n project: string,\n entry: string,\n body: {\n data?: Record<string, unknown>;\n slug?: string;\n expectedRevisionId?: string;\n changeSetId?: string;\n changeSummary?: string;\n },\n ): Promise<EntryContract> => this.mutate<EntryContract>(\"PATCH\", `/projects/${enc(project)}/entries/${enc(entry)}`, body),\n delete: (project: string, entry: string, changeSetId?: string): Promise<{ changeSetId: string; staged: string }> =>\n this.mutate(\"DELETE\", `/projects/${enc(project)}/entries/${enc(entry)}`, undefined, { changeSetId }),\n unpublish: (project: string, entry: string, changeSetId?: string): Promise<{ changeSetId: string; staged: string }> =>\n this.mutate(\"POST\", `/projects/${enc(project)}/entries/${enc(entry)}/unpublish`, undefined, { changeSetId }),\n restore: (project: string, entry: string): Promise<RestoreRevisionResponse> =>\n this.mutate<RestoreRevisionResponse>(\"POST\", `/projects/${enc(project)}/entries/${enc(entry)}/restore`),\n duplicate: (project: string, entry: string, changeSetId?: string): Promise<EntryContract> =>\n this.mutate<EntryContract>(\"POST\", `/projects/${enc(project)}/entries/${enc(entry)}/duplicate`, {\n changeSetId,\n }),\n bulk: (project: string, body: BulkEntriesRequest): Promise<BulkEntriesResponse> =>\n this.mutate<BulkEntriesResponse>(\"POST\", `/projects/${enc(project)}/entries/bulk`, body),\n /**\n * Set a collection's editorial order. Not staged on a change set — ranks\n * are arrangement rather than content and take effect immediately, which\n * is why `confirm` is required.\n */\n reorder: (\n project: string,\n collection: string,\n body: Omit<ReorderEntriesRequest, \"confirm\">,\n ): Promise<ReorderEntriesResponse> =>\n this.mutate<ReorderEntriesResponse>(\n \"POST\",\n `/projects/${enc(project)}/collections/${enc(collection)}/reorder`,\n { ...body, confirm: true },\n ),\n import: (project: string, body: ImportEntriesRequest): Promise<ImportEntriesResponse> =>\n this.mutate<ImportEntriesResponse>(\"POST\", `/projects/${enc(project)}/entries/import`, body),\n references: (project: string, entry: string, signal?: AbortSignal): Promise<EntryReferencesResponse> =>\n this.get<EntryReferencesResponse>(`/projects/${enc(project)}/entries/${enc(entry)}/references`, undefined, signal),\n revisions: (project: string, entry: string, signal?: AbortSignal): Promise<RevisionContract[]> =>\n this.get<RevisionContract[]>(`/projects/${enc(project)}/entries/${enc(entry)}/revisions`, undefined, signal),\n revision: (project: string, entry: string, revision: string, signal?: AbortSignal): Promise<RevisionContract> =>\n this.get<RevisionContract>(`/projects/${enc(project)}/entries/${enc(entry)}/revisions/${enc(revision)}`, undefined, signal),\n restoreRevision: (project: string, entry: string, revision: string): Promise<RestoreRevisionResponse> =>\n this.mutate<RestoreRevisionResponse>(\n \"POST\",\n `/projects/${enc(project)}/entries/${enc(entry)}/revisions/${enc(revision)}/restore`,\n ),\n };\n\n // --- Change sets ----------------------------------------------------------\n readonly changeSets = {\n list: (project: string, opts: ListOptions & { status?: string } = {}): Promise<Page<ChangeSetContract>> =>\n this.page<ChangeSetContract>(`/projects/${enc(project)}/change-sets`, opts, { status: opts.status }),\n create: (project: string, body: CreateChangeSetRequest): Promise<ChangeSetContract> =>\n this.mutate<ChangeSetContract>(\"POST\", `/projects/${enc(project)}/change-sets`, body),\n get: (project: string, changeSet: string, signal?: AbortSignal): Promise<ChangeSetContract> =>\n this.get<ChangeSetContract>(`/projects/${enc(project)}/change-sets/${enc(changeSet)}`, undefined, signal),\n update: (project: string, changeSet: string, body: UpdateChangeSetRequest): Promise<ChangeSetContract> =>\n this.mutate<ChangeSetContract>(\"PATCH\", `/projects/${enc(project)}/change-sets/${enc(changeSet)}`, body),\n validate: (project: string, changeSet: string): Promise<{ valid: boolean; errors: ValidationIssue[] }> =>\n this.mutate(\"POST\", `/projects/${enc(project)}/change-sets/${enc(changeSet)}/validate`),\n publish: (\n project: string,\n changeSet: string,\n ): Promise<{ changeSet: ChangeSetContract; publishedEntryIds: string[] }> =>\n this.mutate(\"POST\", `/projects/${enc(project)}/change-sets/${enc(changeSet)}/publish`, { confirm: true }),\n close: (project: string, changeSet: string): Promise<ChangeSetContract> =>\n this.mutate<ChangeSetContract>(\"POST\", `/projects/${enc(project)}/change-sets/${enc(changeSet)}/close`),\n // Scheduled publishing\n schedule: (project: string, changeSet: string, publishAt: string): Promise<ChangeSetContract> =>\n this.mutate<ChangeSetContract>(\"POST\", `/projects/${enc(project)}/change-sets/${enc(changeSet)}/schedule`, {\n publishAt,\n }),\n cancelSchedule: (project: string, changeSet: string): Promise<ChangeSetContract> =>\n this.mutate<ChangeSetContract>(\"DELETE\", `/projects/${enc(project)}/change-sets/${enc(changeSet)}/schedule`),\n // Reviews & approvals\n reviews: (project: string, changeSet: string, signal?: AbortSignal): Promise<ChangeSetReviewContract[]> =>\n this.get<ChangeSetReviewContract[]>(\n `/projects/${enc(project)}/change-sets/${enc(changeSet)}/reviews`,\n undefined,\n signal,\n ),\n requestReview: (project: string, changeSet: string, body: RequestReviewRequest): Promise<ChangeSetReviewContract[]> =>\n this.mutate<ChangeSetReviewContract[]>(\"POST\", `/projects/${enc(project)}/change-sets/${enc(changeSet)}/reviews`, body),\n removeReviewer: (project: string, changeSet: string, reviewer: string): Promise<ChangeSetReviewContract[]> =>\n this.mutate<ChangeSetReviewContract[]>(\n \"DELETE\",\n `/projects/${enc(project)}/change-sets/${enc(changeSet)}/reviews/${enc(reviewer)}`,\n ),\n approve: (project: string, changeSet: string, body: ReviewDecisionRequest = {}): Promise<ChangeSetReviewContract[]> =>\n this.mutate<ChangeSetReviewContract[]>(\"POST\", `/projects/${enc(project)}/change-sets/${enc(changeSet)}/approve`, body),\n requestChanges: (project: string, changeSet: string, body: ReviewDecisionRequest = {}): Promise<ChangeSetReviewContract[]> =>\n this.mutate<ChangeSetReviewContract[]>(\n \"POST\",\n `/projects/${enc(project)}/change-sets/${enc(changeSet)}/request-changes`,\n body,\n ),\n // Comments\n comments: (project: string, changeSet: string, signal?: AbortSignal): Promise<ChangeSetCommentContract[]> =>\n this.get<ChangeSetCommentContract[]>(\n `/projects/${enc(project)}/change-sets/${enc(changeSet)}/comments`,\n undefined,\n signal,\n ),\n comment: (project: string, changeSet: string, body: CreateChangeSetCommentRequest): Promise<ChangeSetCommentContract> =>\n this.mutate<ChangeSetCommentContract>(\"POST\", `/projects/${enc(project)}/change-sets/${enc(changeSet)}/comments`, body),\n resolveComment: (project: string, changeSet: string, comment: string, resolved = true): Promise<ChangeSetCommentContract> =>\n this.mutate<ChangeSetCommentContract>(\n \"PATCH\",\n `/projects/${enc(project)}/change-sets/${enc(changeSet)}/comments/${enc(comment)}`,\n { resolved },\n ),\n // Automated checks\n checks: (project: string, changeSet: string, signal?: AbortSignal): Promise<ChangeSetCheckContract[]> =>\n this.get<ChangeSetCheckContract[]>(\n `/projects/${enc(project)}/change-sets/${enc(changeSet)}/checks`,\n undefined,\n signal,\n ),\n runChecks: (project: string, changeSet: string): Promise<RunChecksResponse> =>\n this.mutate<RunChecksResponse>(\"POST\", `/projects/${enc(project)}/change-sets/${enc(changeSet)}/checks/run`),\n /** Report a verdict Myna cannot compute, against the current contents. */\n reportCheck: (\n project: string,\n changeSet: string,\n name: string,\n body: ReportCheckResultRequest,\n ): Promise<ChangeSetCheckContract> =>\n this.mutate<ChangeSetCheckContract>(\n \"POST\",\n `/projects/${enc(project)}/change-sets/${enc(changeSet)}/checks/${enc(name)}`,\n body,\n ),\n /** Field-level before/after for everything this change set would change. */\n diff: (project: string, changeSet: string, signal?: AbortSignal): Promise<ChangeSetDiffResponse> =>\n this.get<ChangeSetDiffResponse>(\n `/projects/${enc(project)}/change-sets/${enc(changeSet)}/diff`,\n undefined,\n signal,\n ),\n };\n\n // --- Declared external checks ---------------------------------------------\n readonly checks = {\n list: (project: string, signal?: AbortSignal): Promise<ProjectCheckContract[]> =>\n this.get<ProjectCheckContract[]>(`/projects/${enc(project)}/checks`, undefined, signal),\n declare: (project: string, body: UpsertProjectCheckRequest): Promise<ProjectCheckContract> =>\n this.mutate<ProjectCheckContract>(\"POST\", `/projects/${enc(project)}/checks`, body),\n remove: (project: string, name: string): Promise<{ ok: boolean }> =>\n this.mutate(\"DELETE\", `/projects/${enc(project)}/checks/${enc(name)}`),\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: (\n project: string,\n opts: ListOptions & { tag?: string; checksum?: string; orphaned?: boolean } = {},\n ): Promise<Page<AssetContract>> =>\n this.page<AssetContract>(`/projects/${enc(project)}/assets`, opts, {\n tag: opts.tag,\n checksum: opts.checksum,\n orphaned: opts.orphaned ? \"true\" : undefined,\n }),\n get: (project: string, asset: string, signal?: AbortSignal): Promise<AssetContract> =>\n this.get<AssetContract>(`/projects/${enc(project)}/assets/${enc(asset)}`, undefined, signal),\n usage: (project: string, asset: string, signal?: AbortSignal): Promise<{ asset: AssetContract; usage: { entryIds: string[] } }> =>\n this.get(`/projects/${enc(project)}/assets/${enc(asset)}`, { usage: \"true\" }, signal),\n update: (project: string, asset: string, body: UpdateAssetRequest): Promise<AssetContract> =>\n this.mutate<AssetContract>(\"PATCH\", `/projects/${enc(project)}/assets/${enc(asset)}`, body),\n replace: (project: string, asset: string, body: ReplaceAssetRequest): Promise<AssetContract> =>\n this.mutate<AssetContract>(\"POST\", `/projects/${enc(project)}/assets/${enc(asset)}/replace`, body),\n delete: (project: string, asset: string): Promise<{ ok: boolean }> =>\n this.mutate(\"DELETE\", `/projects/${enc(project)}/assets/${enc(asset)}`),\n /** Full presigned upload flow: create → PUT bytes → complete. */\n upload: (project: string, input: AssetInput, meta: UploadAssetMeta = {}): Promise<AssetContract> =>\n this.uploadAsset(project, input, meta),\n };\n\n // --- API keys -------------------------------------------------------------\n readonly apiKeys = {\n listForOrganization: (organization: string, signal?: AbortSignal): Promise<ApiKeyContract[]> =>\n this.get<ApiKeyContract[]>(`/organizations/${enc(organization)}/api-keys`, undefined, signal),\n createForOrganization: (organization: string, body: CreateApiKeyRequest): Promise<CreateApiKeyResponse> =>\n this.mutate<CreateApiKeyResponse>(\"POST\", `/organizations/${enc(organization)}/api-keys`, body),\n revokeForOrganization: (organization: string, key: string): Promise<{ ok: boolean }> =>\n this.mutate(\"DELETE\", `/organizations/${enc(organization)}/api-keys/${enc(key)}`),\n listForProject: (project: string, signal?: AbortSignal): Promise<ApiKeyContract[]> =>\n this.get<ApiKeyContract[]>(`/projects/${enc(project)}/api-keys`, undefined, signal),\n createForProject: (project: string, body: CreateApiKeyRequest): Promise<CreateApiKeyResponse> =>\n this.mutate<CreateApiKeyResponse>(\"POST\", `/projects/${enc(project)}/api-keys`, body),\n revokeForProject: (project: string, key: string): Promise<{ ok: boolean }> =>\n this.mutate(\"DELETE\", `/projects/${enc(project)}/api-keys/${enc(key)}`),\n };\n\n // --- Webhooks -------------------------------------------------------------\n readonly webhooks = {\n list: (project: string, signal?: AbortSignal): Promise<WebhookEndpointContract[]> =>\n this.get<WebhookEndpointContract[]>(`/projects/${enc(project)}/webhooks`, undefined, signal),\n create: (project: string, body: CreateWebhookRequest): Promise<CreateWebhookResponse> =>\n this.mutate<CreateWebhookResponse>(\"POST\", `/projects/${enc(project)}/webhooks`, body),\n update: (project: string, webhook: string, body: UpdateWebhookRequest): Promise<WebhookEndpointContract> =>\n this.mutate<WebhookEndpointContract>(\"PATCH\", `/projects/${enc(project)}/webhooks/${enc(webhook)}`, body),\n delete: (project: string, webhook: string): Promise<{ ok: boolean }> =>\n this.mutate(\"DELETE\", `/projects/${enc(project)}/webhooks/${enc(webhook)}`),\n deliveries: (project: string, webhook: string, signal?: AbortSignal): Promise<WebhookDeliveryContract[]> =>\n this.get<WebhookDeliveryContract[]>(`/projects/${enc(project)}/webhooks/${enc(webhook)}/deliveries`, undefined, signal),\n retry: (project: string, webhook: string, delivery: string): Promise<{ ok: boolean }> =>\n this.mutate(\"POST\", `/projects/${enc(project)}/webhooks/${enc(webhook)}/deliveries/${enc(delivery)}/retry`),\n };\n\n // --- Activity -------------------------------------------------------------\n activity(\n project: string,\n opts: ListOptions & { actorType?: string; action?: string; targetType?: string; from?: string; to?: string } = {},\n ): Promise<Page<ActivityEventContract>> {\n return this.page<ActivityEventContract>(`/projects/${enc(project)}/activity`, opts, {\n actorType: opts.actorType,\n action: opts.action,\n targetType: opts.targetType,\n from: opts.from,\n to: opts.to,\n });\n }\n\n // --- Billing --------------------------------------------------------------\n readonly billing = {\n status: (organization: string, signal?: AbortSignal): Promise<BillingResponse> =>\n this.get<BillingResponse>(`/organizations/${enc(organization)}/billing`, undefined, signal),\n checkout: (organization: string, body: CheckoutRequest): Promise<CheckoutResponse> =>\n this.mutate<CheckoutResponse>(\"POST\", `/organizations/${enc(organization)}/billing/checkout`, body),\n portal: (organization: string): Promise<PortalResponse> =>\n this.mutate<PortalResponse>(\"POST\", `/organizations/${enc(organization)}/billing/portal`),\n };\n\n // --- Upload helper --------------------------------------------------------\n private async uploadAsset(project: string, input: AssetInput, meta: UploadAssetMeta): Promise<AssetContract> {\n const { bytes, filename } = await readInput(input, meta.filename);\n const contentType = meta.contentType ?? guessContentType(filename);\n const checksum = createHash(\"md5\").update(bytes).digest(\"hex\");\n\n const upload = await this.assets.createUpload(project, {\n filename,\n contentType,\n byteSize: meta.byteSize ?? bytes.byteLength,\n checksum,\n });\n\n // The presigned URL is absolute (storage host) and must bypass the API base.\n const put = await this.fetchImpl(upload.url, {\n method: upload.method,\n headers: upload.headers,\n body: bytes as unknown as BodyInit,\n });\n if (!put.ok) {\n throw new Error(`Asset upload PUT failed with status ${put.status}.`);\n }\n\n return this.assets.completeUpload(project, upload.uploadId);\n }\n}\n\ninterface ValidationIssue {\n resourceType: string;\n resourceId: string;\n path: string;\n message: string;\n code?: string;\n}\n\nasync function readInput(input: AssetInput, filenameOverride?: string): Promise<{ bytes: Uint8Array; filename: string }> {\n if (typeof input === \"string\") {\n const bytes = await readFile(input);\n return { bytes: new Uint8Array(bytes), filename: filenameOverride ?? basename(input) };\n }\n const bytes = input instanceof Uint8Array ? input : new Uint8Array(input);\n return { bytes, filename: filenameOverride ?? \"upload.bin\" };\n}\n\nconst CONTENT_TYPES: Record<string, string> = {\n png: \"image/png\",\n jpg: \"image/jpeg\",\n jpeg: \"image/jpeg\",\n gif: \"image/gif\",\n webp: \"image/webp\",\n avif: \"image/avif\",\n pdf: \"application/pdf\",\n json: \"application/json\",\n txt: \"text/plain\",\n md: \"text/markdown\",\n csv: \"text/csv\",\n mp4: \"video/mp4\",\n webm: \"video/webm\",\n mp3: \"audio/mpeg\",\n wav: \"audio/wav\",\n};\n\nfunction guessContentType(filename: string): string {\n const ext = filename.split(\".\").pop()?.toLowerCase() ?? \"\";\n return CONTENT_TYPES[ext] ?? \"application/octet-stream\";\n}\n\nfunction enc(segment: string): string {\n return encodeURIComponent(segment);\n}\n\n/** Create a management client. */\nexport function createManagementClient(options: ManagementClientOptions): ManagementClient {\n return new ManagementClient(options);\n}\n\nexport { generateTypes, generateTypesModule } from \"./codegen.js\";\nexport { MynaApiError, isMynaApiError } from \"./errors.js\";\nexport type { FetchLike, RetryOptions } from \"./http.js\";\n","import type {\n CollectionSchema,\n FieldDef,\n ListItem,\n ObjectField,\n} from \"../../schema/src/types.js\";\n\n/**\n * Deterministic TypeScript type generation from canonical collection schemas\n * (SPEC 12). Pure and stable: the same input always yields byte-identical\n * output, and no user-written files are touched. Consumed by `myna types\n * generate`.\n */\nexport function generateTypes(collections: CollectionSchema[]): string {\n const sorted = [...collections].sort((a, b) => a.name.localeCompare(b.name));\n const blocks: string[] = [];\n\n for (const collection of sorted) {\n blocks.push(renderInterface(collection));\n }\n\n const registry = sorted.map((c) => registryEntry(c)).join(\"\\n\");\n\n const header = [\n \"// Generated by `myna types generate`. Do not edit by hand.\",\n \"// This file is safe to commit and regenerate.\",\n \"\",\n ].join(\"\\n\");\n\n return `${header}${blocks.join(\"\\n\\n\")}\\n\\n${REGISTRY_DOC}\\nexport interface MynaCollections {\\n${registry}\\n}\\n`;\n}\n\nconst REGISTRY_DOC = [\n \"/**\",\n \" * Collection registry consumed by `createMyna<MynaCollections>()`.\",\n \" *\",\n \" * `fields` types the entry payload; `sortable` and `reference` carry the\",\n \" * distinctions the field types alone cannot express — a markdown body and a\",\n \" * text title are both `string`, but only one of them can be ordered on.\",\n \" */\",\n].join(\"\\n\");\n\n/**\n * Fields the query engine can order and filter by: scalars, excluding localized\n * fields, which hold one value per locale rather than a comparable value. This\n * mirrors `SCALAR_TYPES` in the API's public content service; the two must agree\n * or the types will promise a query the server rejects.\n */\nconst SORTABLE_TYPES = new Set([\"text\", \"number\", \"boolean\", \"date\", \"datetime\", \"slug\"]);\n\nfunction registryEntry(collection: CollectionSchema): string {\n const sortable = collection.fields\n .filter((f) => SORTABLE_TYPES.has(f.type) && !f.localized)\n .map((f) => JSON.stringify(f.key));\n const references = collection.fields\n .filter((f) => f.type === \"reference\")\n .map((f) => JSON.stringify(f.key));\n return [\n ` ${JSON.stringify(collection.name)}: {`,\n ` fields: ${pascal(collection.name)};`,\n ` sortable: ${sortable.length > 0 ? sortable.join(\" | \") : \"never\"};`,\n ` reference: ${references.length > 0 ? references.join(\" | \") : \"never\"};`,\n ` };`,\n ].join(\"\\n\");\n}\n\nfunction renderInterface(collection: CollectionSchema): string {\n const name = pascal(collection.name);\n const lines = collection.fields.map((f) => renderField(f, 1));\n const label = collection.label ? ` ${collection.label}` : \"\";\n return `/**${label} (${collection.kind}) */\\nexport interface ${name} {\\n${lines.join(\"\\n\")}\\n}`;\n}\n\nfunction renderField(field: FieldDef, depth: number): string {\n const indent = \" \".repeat(depth);\n const optional = field.required ? \"\" : \"?\";\n const doc = field.description ? `${indent}/** ${escapeComment(field.description)} */\\n` : \"\";\n const base = fieldType(field, depth);\n // Localized fields store one value per project locale.\n const type = field.localized ? `{ [locale: string]: ${base} }` : base;\n return `${doc}${indent}${safeKey(field.key)}${optional}: ${type};`;\n}\n\nfunction fieldType(field: FieldDef, depth: number): string {\n switch (field.type) {\n case \"text\":\n return field.enum && field.enum.length > 0 ? field.enum.map((v) => JSON.stringify(v)).join(\" | \") : \"string\";\n case \"slug\":\n return \"string\";\n case \"markdown\":\n return \"string\";\n case \"number\":\n return \"number\";\n case \"boolean\":\n return \"boolean\";\n case \"date\":\n case \"datetime\":\n return \"string\";\n case \"json\":\n return \"JsonValue\";\n case \"asset\":\n return field.multiple ? \"string[]\" : \"string\";\n case \"reference\":\n return field.multiple ? \"string[]\" : \"string\";\n case \"object\":\n return renderObject(field, depth);\n case \"list\":\n return `${listItemType(field.item, depth)}[]`;\n case \"richText\":\n return \"RichTextDoc\";\n case \"blocks\": {\n // Discriminated union over the allowed block components.\n const inner = \" \".repeat(depth + 1);\n const options = field.blocks.map((b) => {\n const lines = b.fields.map((f) => renderField(f, depth + 2));\n return `{ type: ${JSON.stringify(b.key)}; fields: {\\n${lines.join(\"\\n\")}\\n${inner}} }`;\n });\n return `Array<\\n${inner}${options.join(`\\n${inner}| `)}\\n${\" \".repeat(depth)}>`;\n }\n default:\n return \"unknown\";\n }\n}\n\nfunction renderObject(field: ObjectField, depth: number): string {\n const lines = field.fields.map((f) => renderField(f, depth + 1));\n const closingIndent = \" \".repeat(depth);\n return `{\\n${lines.join(\"\\n\")}\\n${closingIndent}}`;\n}\n\nfunction listItemType(item: ListItem, depth: number): string {\n switch (item.kind) {\n case \"text\":\n return item.enum && item.enum.length > 0 ? `(${item.enum.map((v) => JSON.stringify(v)).join(\" | \")})` : \"string\";\n case \"number\":\n return \"number\";\n case \"boolean\":\n return \"boolean\";\n case \"date\":\n case \"datetime\":\n return \"string\";\n case \"markdown\":\n return \"string\";\n case \"json\":\n return \"JsonValue\";\n case \"reference\":\n return \"string\";\n case \"asset\":\n return \"string\";\n case \"object\": {\n const lines = item.fields.map((f) => renderField(f, depth + 1));\n const closingIndent = \" \".repeat(depth);\n return `{\\n${lines.join(\"\\n\")}\\n${closingIndent}}`;\n }\n default:\n return \"unknown\";\n }\n}\n\nconst JSON_VALUE = [\n \"export type JsonValue = string | number | boolean | null | JsonValue[] | { [key: string]: JsonValue };\",\n \"\",\n \"/** Portable rich-text document tree (never rendered HTML). */\",\n \"export interface RichTextDoc { type: \\\"doc\\\"; content: Array<{ type: string; [key: string]: unknown }>; }\",\n].join(\"\\n\");\n\n/** Generate types plus the shared `JsonValue` helper as a standalone module. */\nexport function generateTypesModule(collections: CollectionSchema[]): string {\n return `${JSON_VALUE}\\n\\n${generateTypes(collections)}`;\n}\n\nfunction pascal(key: string): string {\n return key\n .split(/[-_\\s]+/)\n .filter(Boolean)\n .map((part) => part.charAt(0).toUpperCase() + part.slice(1))\n .join(\"\");\n}\n\nfunction safeKey(key: string): string {\n return /^[A-Za-z_$][A-Za-z0-9_$]*$/.test(key) ? key : JSON.stringify(key);\n}\n\nfunction escapeComment(text: string): string {\n return text.replace(/\\*\\//g, \"*\\\\/\");\n}\n","import { z } from \"zod\";\nimport type { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport type { CallToolResult } from \"@modelcontextprotocol/sdk/types.js\";\nimport type { ManagementClient } from \"@myna-sh/sdk/management\";\nimport { isMynaApiError } from \"@myna-sh/sdk/management\";\nimport type { ProjectRegistry } from \"./config.js\";\n\n/**\n * The Myna MCP tools (SPEC 13). This module contains no CMS business logic —\n * every tool is a thin adapter over the management SDK.\n */\n\n/**\n * A tool result carrying both a human summary and the data itself.\n *\n * The payload is serialized into a second text block as well as\n * `structuredContent`. That duplication is deliberate: `structuredContent` is\n * only meaningful to hosts that read it, and a host that does not — Claude's\n * remote connector among them — would otherwise receive nothing but the\n * summary. An agent told \"1 project(s)\" with no id, slug, or name cannot make\n * the follow-up call, which strands it on the very tool meant to bootstrap\n * discovery. The MCP specification asks for this fallback for exactly this\n * reason; the cost is some duplicated tokens, and the alternative is a tool\n * that silently returns no data.\n */\nfunction ok(text: string, structured: unknown): CallToolResult {\n return {\n content: [\n { type: \"text\", text },\n { type: \"text\", text: JSON.stringify(structured) },\n ],\n structuredContent: structured as Record<string, unknown>,\n };\n}\n\nfunction fail(error: unknown): CallToolResult {\n const message = isMynaApiError(error)\n ? `${error.code}: ${error.detail ?? error.title}`\n : error instanceof Error\n ? error.message\n : String(error);\n return { content: [{ type: \"text\", text: `Error: ${message}` }], isError: true };\n}\n\nasync function resolveEntryId(client: ManagementClient, project: string, ref: string): Promise<string> {\n if (ref.startsWith(\"ent_\") && !ref.includes(\"/\")) return ref;\n const [collection, slug] = ref.includes(\"/\") ? ref.split(\"/\", 2) : [undefined, ref];\n if (!collection) throw new Error(`Provide the entry as \"<collection>/<slug>\" or an ent_ id (got \"${ref}\").`);\n let cursor: string | undefined;\n for (let i = 0; i < 50; i++) {\n const page = await client.entries.list(project, { collection, limit: 100, cursor });\n const match = page.data.find((e) => e.slug === slug || e.id === slug);\n if (match) return match.id;\n if (!page.nextCursor) break;\n cursor = page.nextCursor;\n }\n throw new Error(`Entry not found: ${ref}`);\n}\n\nconst projectArg = { project: z.string().optional().describe(\"Project id, slug, or configured name. Omit to use the default.\") };\n\nexport interface ToolOptions {\n /**\n * Whether `myna_upload_asset` may read local filesystem paths. True for\n * stdio (the client and server share a machine); false for HTTP, where a\n * remote client must never be able to read the server's filesystem.\n */\n allowPathUploads: boolean;\n}\n\nexport function registerTools(\n server: McpServer,\n registry: ProjectRegistry,\n options: ToolOptions = { allowPathUploads: true },\n): void {\n // 1. list projects\n server.registerTool(\n \"myna_list_projects\",\n {\n title: \"List projects\",\n description: \"List projects in an organization.\",\n inputSchema: {\n organization: z.string().optional().describe(\"Organization id or slug. Omit to use the default.\"),\n ...projectArg,\n },\n annotations: { readOnlyHint: true, openWorldHint: true },\n },\n async (args) => {\n try {\n // Org-scoped: this is how an agent discovers projects, so it must not\n // itself require one.\n const { client } = registry.clientForOrg(args.project);\n const org = registry.organizationFor(args.project, args.organization);\n const projects = await client.projects.list(org);\n return ok(`${projects.length} project(s) in ${org}.`, { projects });\n } catch (error) {\n return fail(error);\n }\n },\n );\n\n // 2. get project\n server.registerTool(\n \"myna_get_project\",\n {\n title: \"Get project\",\n description: \"Fetch a single project's details.\",\n inputSchema: { ...projectArg },\n annotations: { readOnlyHint: true, openWorldHint: true },\n },\n async (args) => {\n try {\n const { client, project } = registry.clientFor(args.project);\n const result = await client.projects.get(project);\n return ok(`Project ${result.name} (${result.slug}).`, { project: result });\n } catch (error) {\n return fail(error);\n }\n },\n );\n\n // 3. list collections\n server.registerTool(\n \"myna_list_collections\",\n {\n title: \"List collections\",\n description: \"List the deployed collections in a project.\",\n inputSchema: { ...projectArg },\n annotations: { readOnlyHint: true, openWorldHint: true },\n },\n async (args) => {\n try {\n const { client, project } = registry.clientFor(args.project);\n const collections = await client.schema.collections(project);\n return ok(`${collections.length} collection(s).`, { collections });\n } catch (error) {\n return fail(error);\n }\n },\n );\n\n // 4. get collection schema\n server.registerTool(\n \"myna_get_collection_schema\",\n {\n title: \"Get collection schema\",\n description: \"Fetch the latest canonical schema for a collection.\",\n inputSchema: { ...projectArg, collection: z.string().describe(\"Collection key.\") },\n annotations: { readOnlyHint: true, openWorldHint: true },\n },\n async (args) => {\n try {\n const { client, project } = registry.clientFor(args.project);\n const versions = await client.schema.versions(project, args.collection);\n const latest = versions[0];\n if (!latest) throw new Error(`Collection ${args.collection} has no versions.`);\n return ok(`${args.collection} schema v${latest.version}.`, { version: latest.version, schema: latest.schemaJson });\n } catch (error) {\n return fail(error);\n }\n },\n );\n\n // 5. list entries\n server.registerTool(\n \"myna_list_entries\",\n {\n title: \"List entries\",\n description: \"List entries in a collection.\",\n inputSchema: {\n ...projectArg,\n collection: z.string().describe(\"Collection key.\"),\n status: z.enum([\"draft\", \"published\", \"changed\", \"unpublished\", \"deleted\"]).optional(),\n limit: z.number().int().min(1).max(100).optional(),\n cursor: z.string().optional(),\n },\n annotations: { readOnlyHint: true, openWorldHint: true },\n },\n async (args) => {\n try {\n const { client, project } = registry.clientFor(args.project);\n const page = await client.entries.list(project, {\n collection: args.collection,\n status: args.status,\n limit: args.limit ?? 25,\n cursor: args.cursor,\n });\n return ok(`${page.data.length} entr(y/ies).`, { entries: page.data, nextCursor: page.nextCursor });\n } catch (error) {\n return fail(error);\n }\n },\n );\n\n // 6. get entry\n server.registerTool(\n \"myna_get_entry\",\n {\n title: \"Get entry\",\n description: \"Fetch one entry by \\\"<collection>/<slug>\\\" or entry id.\",\n inputSchema: { ...projectArg, entry: z.string().describe(\"collection/slug or ent_ id.\") },\n annotations: { readOnlyHint: true, openWorldHint: true },\n },\n async (args) => {\n try {\n const { client, project } = registry.clientFor(args.project);\n const id = await resolveEntryId(client, project, args.entry);\n const entry = await client.entries.get(project, id);\n return ok(`Entry ${entry.id} (${entry.status}).`, { entry });\n } catch (error) {\n return fail(error);\n }\n },\n );\n\n // 7. create change set\n server.registerTool(\n \"myna_create_change_set\",\n {\n title: \"Create change set\",\n description: \"Open a new change set to group entry and asset operations.\",\n inputSchema: {\n ...projectArg,\n title: z.string().min(1).max(200),\n description: z.string().max(2000).optional(),\n },\n annotations: { readOnlyHint: false, destructiveHint: false, idempotentHint: false, openWorldHint: true },\n },\n async (args) => {\n try {\n const { client, project } = registry.clientFor(args.project);\n const cs = await client.changeSets.create(project, { title: args.title, description: args.description });\n return ok(`Created change set ${cs.id}.`, { changeSet: cs });\n } catch (error) {\n return fail(error);\n }\n },\n );\n\n // 8. get change set\n server.registerTool(\n \"myna_get_change_set\",\n {\n title: \"Get change set\",\n description: \"Fetch a change set and its items.\",\n inputSchema: { ...projectArg, changeSet: z.string().describe(\"Change set id (chs_).\") },\n annotations: { readOnlyHint: true, openWorldHint: true },\n },\n async (args) => {\n try {\n const { client, project } = registry.clientFor(args.project);\n const cs = await client.changeSets.get(project, args.changeSet);\n return ok(`Change set ${cs.id} (${cs.status}), ${cs.items.length} item(s).`, { changeSet: cs });\n } catch (error) {\n return fail(error);\n }\n },\n );\n\n // 9. create entry\n server.registerTool(\n \"myna_create_entry\",\n {\n title: \"Create entry\",\n description: \"Create a draft entry. Does not publish.\",\n inputSchema: {\n ...projectArg,\n collection: z.string(),\n data: z.record(z.string(), z.unknown()).describe(\"Field values.\"),\n slug: z.string().optional(),\n changeSet: z.string().optional().describe(\"Attach to an existing change set (chs_).\"),\n changeSummary: z.string().max(500).optional(),\n },\n annotations: { readOnlyHint: false, destructiveHint: false, idempotentHint: false, openWorldHint: true },\n },\n async (args) => {\n try {\n const { client, project } = registry.clientFor(args.project);\n const entry = await client.entries.create(project, {\n collection: args.collection,\n data: args.data,\n slug: args.slug,\n changeSetId: args.changeSet,\n changeSummary: args.changeSummary,\n });\n return ok(`Created entry ${entry.id} (${entry.status}).`, { entry });\n } catch (error) {\n return fail(error);\n }\n },\n );\n\n // 10. update entry\n server.registerTool(\n \"myna_update_entry\",\n {\n title: \"Update entry\",\n description: \"Update a draft entry. Does not publish.\",\n inputSchema: {\n ...projectArg,\n entry: z.string().describe(\"collection/slug or ent_ id.\"),\n data: z.record(z.string(), z.unknown()).optional(),\n slug: z.string().optional(),\n expectedRevisionId: z.string().optional().describe(\"Optimistic concurrency guard.\"),\n changeSet: z.string().optional(),\n changeSummary: z.string().max(500).optional(),\n },\n annotations: { readOnlyHint: false, destructiveHint: false, idempotentHint: false, openWorldHint: true },\n },\n async (args) => {\n try {\n const { client, project } = registry.clientFor(args.project);\n const id = await resolveEntryId(client, project, args.entry);\n const entry = await client.entries.update(project, id, {\n data: args.data,\n slug: args.slug,\n expectedRevisionId: args.expectedRevisionId,\n changeSetId: args.changeSet,\n changeSummary: args.changeSummary,\n });\n return ok(`Updated entry ${entry.id} (${entry.status}).`, { entry });\n } catch (error) {\n return fail(error);\n }\n },\n );\n\n // 11. delete entry (destructive)\n server.registerTool(\n \"myna_delete_entry\",\n {\n title: \"Delete entry\",\n description: \"Stage an entry deletion on a change set. Requires confirm=true. Takes effect only on publish.\",\n inputSchema: {\n ...projectArg,\n entry: z.string(),\n changeSet: z.string().optional(),\n confirm: z.literal(true).describe(\"Must be true to proceed.\"),\n },\n annotations: { readOnlyHint: false, destructiveHint: true, idempotentHint: false, openWorldHint: true },\n },\n async (args) => {\n try {\n const { client, project } = registry.clientFor(args.project);\n const id = await resolveEntryId(client, project, args.entry);\n const result = await client.entries.delete(project, id, args.changeSet);\n return ok(`Staged delete of ${id} on ${result.changeSetId}.`, result);\n } catch (error) {\n return fail(error);\n }\n },\n );\n\n // 12. upload asset\n server.registerTool(\n \"myna_upload_asset\",\n {\n title: \"Upload asset\",\n description: \"Upload an asset from base64 bytes or a local file path via the presigned flow.\",\n inputSchema: {\n ...projectArg,\n filename: z.string().describe(\"Display filename, e.g. cover.png.\"),\n base64: z.string().optional().describe(\"Base64-encoded file bytes.\"),\n path: z.string().optional().describe(\"Local filesystem path (stdio hosts only).\"),\n contentType: z.string().optional(),\n },\n annotations: { readOnlyHint: false, destructiveHint: false, idempotentHint: false, openWorldHint: true },\n },\n async (args) => {\n try {\n const { client, project } = registry.clientFor(args.project);\n if (!args.base64 && !args.path) throw new Error(\"Provide either `base64` or `path`.\");\n if (args.path && !options.allowPathUploads) {\n throw new Error(\"`path` uploads are only available on stdio transports; send `base64` instead.\");\n }\n const input = args.base64 ? new Uint8Array(Buffer.from(args.base64, \"base64\")) : args.path!;\n const asset = await client.assets.upload(project, input, {\n filename: args.filename,\n contentType: args.contentType,\n });\n return ok(`Uploaded ${asset.displayFilename} (${asset.id}).`, { asset });\n } catch (error) {\n return fail(error);\n }\n },\n );\n\n // 13. validate change set\n server.registerTool(\n \"myna_validate_change_set\",\n {\n title: \"Validate change set\",\n description: \"Validate every changed resource in a change set against the deployed schemas.\",\n inputSchema: { ...projectArg, changeSet: z.string() },\n annotations: { readOnlyHint: true, openWorldHint: true },\n },\n async (args) => {\n try {\n const { client, project } = registry.clientFor(args.project);\n const result = await client.changeSets.validate(project, args.changeSet);\n return ok(result.valid ? \"Change set is valid.\" : `Invalid: ${result.errors.length} error(s).`, result);\n } catch (error) {\n return fail(error);\n }\n },\n );\n\n // 14. create preview\n server.registerTool(\n \"myna_create_preview\",\n {\n title: \"Create preview\",\n description: \"Create one preview URL for a change set (or entry). Never publishes.\",\n inputSchema: {\n ...projectArg,\n changeSet: z.string().optional().describe(\"Change set id (chs_).\"),\n entry: z.string().optional().describe(\"Entry id (ent_).\"),\n expiresInSeconds: z.number().int().min(60).max(604800).optional(),\n },\n annotations: { readOnlyHint: false, destructiveHint: false, idempotentHint: false, openWorldHint: true },\n },\n async (args) => {\n try {\n if (Boolean(args.changeSet) === Boolean(args.entry)) {\n throw new Error(\"Provide exactly one of `changeSet` or `entry`.\");\n }\n const { client, project } = registry.clientFor(args.project);\n const preview = await client.previews.create(project, {\n changeSetId: args.changeSet,\n entryId: args.entry,\n expiresInSeconds: args.expiresInSeconds,\n });\n return ok(`Preview: ${preview.url}`, { preview });\n } catch (error) {\n return fail(error);\n }\n },\n );\n\n // 15. publish change set (destructive)\n server.registerTool(\n \"myna_publish_change_set\",\n {\n title: \"Publish change set\",\n description: \"Atomically publish a change set. Requires confirm=true and content:publish scope.\",\n inputSchema: { ...projectArg, changeSet: z.string(), confirm: z.literal(true).describe(\"Must be true.\") },\n annotations: { readOnlyHint: false, destructiveHint: true, idempotentHint: false, openWorldHint: true },\n },\n async (args) => {\n try {\n const { client, project } = registry.clientFor(args.project);\n const result = await client.changeSets.publish(project, args.changeSet);\n return ok(`Published ${result.publishedEntryIds.length} entr(y/ies).`, result);\n } catch (error) {\n return fail(error);\n }\n },\n );\n\n // 16. get entry revisions\n server.registerTool(\n \"myna_get_entry_revisions\",\n {\n title: \"Get entry revisions\",\n description: \"List the immutable revisions of an entry.\",\n inputSchema: { ...projectArg, entry: z.string() },\n annotations: { readOnlyHint: true, openWorldHint: true },\n },\n async (args) => {\n try {\n const { client, project } = registry.clientFor(args.project);\n const id = await resolveEntryId(client, project, args.entry);\n const revisions = await client.entries.revisions(project, id);\n return ok(`${revisions.length} revision(s).`, { revisions });\n } catch (error) {\n return fail(error);\n }\n },\n );\n\n // get entry references (reference integrity)\n server.registerTool(\n \"myna_get_entry_references\",\n {\n title: \"Get entry references\",\n description:\n \"Show reference integrity for an entry: which entries reference it (backlinks) and which entries it references, with publish state. Useful before unpublishing or deleting.\",\n inputSchema: { ...projectArg, entry: z.string() },\n annotations: { readOnlyHint: true, openWorldHint: true },\n },\n async (args) => {\n try {\n const { client, project } = registry.clientFor(args.project);\n const id = await resolveEntryId(client, project, args.entry);\n const refs = await client.entries.references(project, id);\n return ok(\n `Referenced by ${refs.referencedBy.length} entr(y/ies); references ${refs.references.length}.`,\n refs,\n );\n } catch (error) {\n return fail(error);\n }\n },\n );\n\n // 17. restore revision (destructive)\n server.registerTool(\n \"myna_restore_revision\",\n {\n title: \"Restore revision\",\n description: \"Restore a historical revision into a new draft revision. Requires confirm=true.\",\n inputSchema: {\n ...projectArg,\n entry: z.string(),\n revision: z.string().describe(\"Revision id (rev_).\"),\n confirm: z.literal(true).describe(\"Must be true.\"),\n },\n annotations: { readOnlyHint: false, destructiveHint: true, idempotentHint: false, openWorldHint: true },\n },\n async (args) => {\n try {\n const { client, project } = registry.clientFor(args.project);\n const id = await resolveEntryId(client, project, args.entry);\n const result = await client.entries.restoreRevision(project, id, args.revision);\n return ok(`Restored into ${result.revision.id}.`, result);\n } catch (error) {\n return fail(error);\n }\n },\n );\n\n // schedule / cancel scheduled publish\n server.registerTool(\n \"myna_schedule_change_set\",\n {\n title: \"Schedule change-set publish\",\n description:\n \"Schedule a change set to publish atomically at a future time, or cancel its schedule. Requires confirm=true and content:publish scope. Schedule status is readable via myna_get_change_set (scheduledAt).\",\n inputSchema: {\n ...projectArg,\n changeSet: z.string(),\n publishAt: z.string().optional().describe(\"ISO 8601 datetime to publish at. Omit with cancel=true.\"),\n cancel: z.boolean().optional().describe(\"Cancel the existing schedule instead.\"),\n confirm: z.literal(true).describe(\"Must be true.\"),\n },\n annotations: { readOnlyHint: false, destructiveHint: true, idempotentHint: true, openWorldHint: true },\n },\n async (args) => {\n try {\n if (Boolean(args.publishAt) === Boolean(args.cancel)) {\n throw new Error(\"Provide exactly one of `publishAt` or `cancel`.\");\n }\n const { client, project } = registry.clientFor(args.project);\n const cs = args.cancel\n ? await client.changeSets.cancelSchedule(project, args.changeSet)\n : await client.changeSets.schedule(project, args.changeSet, args.publishAt!);\n return ok(cs.scheduledAt ? `Scheduled for ${cs.scheduledAt}.` : \"Schedule cancelled.\", { changeSet: cs });\n } catch (error) {\n return fail(error);\n }\n },\n );\n\n // 18. get review status (reviews + comments + latest checks)\n server.registerTool(\n \"myna_get_change_set_review\",\n {\n title: \"Get change-set review status\",\n description:\n \"Fetch a change set's reviews, comments, and latest automated check run in one call.\",\n inputSchema: { ...projectArg, changeSet: z.string() },\n annotations: { readOnlyHint: true, openWorldHint: true },\n },\n async (args) => {\n try {\n const { client, project } = registry.clientFor(args.project);\n const [reviews, comments, checks] = await Promise.all([\n client.changeSets.reviews(project, args.changeSet),\n client.changeSets.comments(project, args.changeSet),\n client.changeSets.checks(project, args.changeSet),\n ]);\n const approvals = reviews.filter((r) => r.status === \"approved\" && !r.stale).length;\n const failing = checks.filter((c) => c.status === \"failed\").length;\n return ok(\n `${approvals} fresh approval(s), ${comments.length} comment(s), ${checks.length === 0 ? \"no check run\" : `${failing} failing check(s)`}.`,\n { reviews, comments, checks },\n );\n } catch (error) {\n return fail(error);\n }\n },\n );\n\n // 19. review change set (approve / request changes)\n server.registerTool(\n \"myna_review_change_set\",\n {\n title: \"Review change set\",\n description:\n \"Record an approve or request-changes review decision on a change set. Requires content:review scope.\",\n inputSchema: {\n ...projectArg,\n changeSet: z.string(),\n decision: z.enum([\"approve\", \"request_changes\"]),\n comment: z.string().optional().describe(\"Optional review comment.\"),\n },\n annotations: { readOnlyHint: false, destructiveHint: false, idempotentHint: true, openWorldHint: true },\n },\n async (args) => {\n try {\n const { client, project } = registry.clientFor(args.project);\n const reviews =\n args.decision === \"approve\"\n ? await client.changeSets.approve(project, args.changeSet, { comment: args.comment })\n : await client.changeSets.requestChanges(project, args.changeSet, { comment: args.comment });\n return ok(`Recorded ${args.decision} review.`, { reviews });\n } catch (error) {\n return fail(error);\n }\n },\n );\n\n // 20. comment on change set\n server.registerTool(\n \"myna_comment_on_change_set\",\n {\n title: \"Comment on change set\",\n description: \"Add a comment to a change set, optionally anchored to an entry field.\",\n inputSchema: {\n ...projectArg,\n changeSet: z.string(),\n body: z.string().min(1),\n entry: z.string().optional().describe(\"Entry id (ent_) to anchor the comment to.\"),\n fieldPath: z.string().optional().describe(\"Field path within the entry, e.g. fields.title.\"),\n },\n annotations: { readOnlyHint: false, destructiveHint: false, idempotentHint: false, openWorldHint: true },\n },\n async (args) => {\n try {\n const { client, project } = registry.clientFor(args.project);\n const comment = await client.changeSets.comment(project, args.changeSet, {\n body: args.body,\n resourceType: args.entry ? \"entry\" : undefined,\n resourceId: args.entry,\n fieldPath: args.fieldPath,\n });\n return ok(`Commented ${comment.id}.`, { comment });\n } catch (error) {\n return fail(error);\n }\n },\n );\n\n // 21. run automated checks\n server.registerTool(\n \"myna_run_change_set_checks\",\n {\n title: \"Run change-set checks\",\n description:\n \"Run the built-in automated checks (schema, references, slugs, alt-text, SEO) against a change set and return the results.\",\n inputSchema: { ...projectArg, changeSet: z.string() },\n annotations: { readOnlyHint: false, destructiveHint: false, idempotentHint: true, openWorldHint: true },\n },\n async (args) => {\n try {\n const { client, project } = registry.clientFor(args.project);\n const result = await client.changeSets.runChecks(project, args.changeSet);\n const failing = result.checks.filter((c) => c.status === \"failed\");\n return ok(\n result.passed ? \"All checks passed.\" : `Failing: ${failing.map((c) => c.name).join(\", \")}.`,\n result,\n );\n } catch (error) {\n return fail(error);\n }\n },\n );\n\n // --- Working with existing change sets ------------------------------------\n\n server.registerTool(\n \"myna_list_change_sets\",\n {\n title: \"List change sets\",\n description:\n \"List change sets in a project, newest first, optionally filtered by status (open, ready, published, closed). Use this to find work already in progress before starting a new change set.\",\n inputSchema: {\n ...projectArg,\n status: z.enum([\"open\", \"ready\", \"published\", \"closed\"]).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.changeSets.list(project, {\n ...(args.status ? { status: args.status } : {}),\n ...(args.limit ? { limit: args.limit } : {}),\n ...(args.cursor ? { cursor: args.cursor } : {}),\n });\n return ok(`${page.data.length} change set(s).`, page);\n } catch (error) {\n return fail(error);\n }\n },\n );\n\n server.registerTool(\n \"myna_diff_change_set\",\n {\n title: \"Diff a change set\",\n description:\n \"Show what a change set would change, field by field: per item, the operation, the collection and slug, and every changed field with its before and after value. This is what a reviewer reads; use it to summarize your own work or to review someone else's.\",\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 diff = await client.changeSets.diff(project, args.changeSet);\n const fields = diff.items.reduce((n, i) => n + i.changes.length, 0);\n return ok(`${diff.items.length} item(s), ${fields} changed field(s).`, diff);\n } catch (error) {\n return fail(error);\n }\n },\n );\n\n server.registerTool(\n \"myna_update_change_set\",\n {\n title: \"Update a change set\",\n description:\n \"Rename a change set, change its description, or mark it ready for review. Marking it ready signals that a human is needed and emits change_set.ready_for_review.\",\n inputSchema: {\n ...projectArg,\n changeSet: z.string(),\n title: z.string().min(1).max(200).optional(),\n description: z.string().max(2000).optional(),\n status: z.enum([\"open\", \"ready\"]).optional(),\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 cs = await client.changeSets.update(project, args.changeSet, {\n ...(args.title ? { title: args.title } : {}),\n ...(args.description ? { description: args.description } : {}),\n ...(args.status ? { status: args.status } : {}),\n });\n return ok(`Change set ${cs.id} is ${cs.status}.`, { changeSet: cs });\n } catch (error) {\n return fail(error);\n }\n },\n );\n\n server.registerTool(\n \"myna_close_change_set\",\n {\n title: \"Close a change set\",\n description:\n \"Abandon a change set without publishing it. The staged drafts and their revisions remain in history; the set simply stops being work in progress. Use this when a task is cancelled, so open sets do not accumulate. Requires confirm=true.\",\n inputSchema: { ...projectArg, changeSet: z.string(), confirm: z.literal(true).describe(\"Must be true.\") },\n annotations: { readOnlyHint: false, destructiveHint: true, idempotentHint: true, openWorldHint: true },\n },\n async (args) => {\n try {\n const { client, project } = registry.clientFor(args.project);\n const cs = await client.changeSets.close(project, args.changeSet);\n return ok(`Closed ${cs.id}.`, { changeSet: cs });\n } catch (error) {\n return fail(error);\n }\n },\n );\n\n server.registerTool(\n \"myna_request_change_set_review\",\n {\n title: \"Request review\",\n description:\n \"Ask a specific person to review a change set. Pass their user id. Requires content:review scope.\",\n inputSchema: {\n ...projectArg,\n changeSet: z.string(),\n reviewerId: z.string().describe(\"User id (usr_) to assign as reviewer.\"),\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 = await client.changeSets.requestReview(project, args.changeSet, {\n reviewerType: \"user\",\n reviewerId: args.reviewerId,\n });\n return ok(`${reviews.length} reviewer(s) assigned.`, { reviews });\n } catch (error) {\n return fail(error);\n }\n },\n );\n\n server.registerTool(\n \"myna_report_check_result\",\n {\n title: \"Report an external check result\",\n description:\n \"Report the verdict of a check Myna cannot compute itself — a link check, a house-style review, an external build. The check must have been declared on the project first. The result is recorded against the change set's current contents, so later edits mark it stale. A failing required check blocks publish. Requires content:review scope.\",\n inputSchema: {\n ...projectArg,\n changeSet: z.string(),\n name: z.string().describe(\"The declared check name, e.g. links.\"),\n status: z.enum([\"passed\", \"failed\", \"skipped\"]),\n details: z\n .array(\n z.object({\n resourceId: z.string().optional(),\n path: z.string().optional(),\n message: z.string(),\n }),\n )\n .optional()\n .describe(\"What the check found; shown to the reviewer.\"),\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 check = await client.changeSets.reportCheck(project, args.changeSet, args.name, {\n status: args.status,\n ...(args.details ? { details: args.details } : {}),\n });\n return ok(`Reported ${args.name}: ${check.status}.`, { check });\n } catch (error) {\n return fail(error);\n }\n },\n );\n\n // --- Bulk and editorial operations ----------------------------------------\n\n server.registerTool(\n \"myna_search_entries\",\n {\n title: \"Search entries\",\n description:\n \"Full-text search across every text field of an entry, matching either its draft or its published state. Use this to find the entry a human described in prose (\\\"the pricing page\\\", \\\"the post about webhooks\\\") instead of listing a collection and scanning it.\",\n inputSchema: {\n ...projectArg,\n query: z.string().min(1).describe(\"Words to search for. Supports quoted phrases and -exclusions.\"),\n collection: z.string().optional().describe(\"Restrict to one collection.\"),\n limit: z.number().int().min(1).max(100).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 q: args.query,\n ...(args.collection ? { collection: args.collection } : {}),\n limit: args.limit ?? 20,\n });\n return ok(`${page.data.length} match(es) for \"${args.query}\".`, page);\n } catch (error) {\n return fail(error);\n }\n },\n );\n\n server.registerTool(\n \"myna_unpublish_entry\",\n {\n title: \"Unpublish an entry\",\n description:\n \"Stage the removal of an entry from published content. Like every write this is a draft operation: it takes effect when the change set is published. The entry and its history are kept. Requires confirm=true.\",\n inputSchema: {\n ...projectArg,\n entry: z.string(),\n changeSet: z.string().optional(),\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 const { client, project } = registry.clientFor(args.project);\n const id = await resolveEntryId(client, project, args.entry);\n const result = await client.entries.unpublish(project, id, args.changeSet);\n return ok(`Unpublish staged on ${result.changeSetId}.`, result);\n } catch (error) {\n return fail(error);\n }\n },\n );\n\n server.registerTool(\n \"myna_duplicate_entry\",\n {\n title: \"Duplicate an entry\",\n description:\n \"Copy an entry into a new draft with a fresh slug. Useful as a starting point when a new entry should follow the shape of an existing one.\",\n inputSchema: { ...projectArg, entry: z.string(), changeSet: z.string().optional() },\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.duplicate(project, id, args.changeSet);\n return ok(`Created ${entry.id} (${entry.slug ?? \"no slug\"}).`, { entry });\n } catch (error) {\n return fail(error);\n }\n },\n );\n\n server.registerTool(\n \"myna_import_entries\",\n {\n title: \"Import entries\",\n description:\n \"Create or update many entries in one collection in a single call, matched by slug: rows that already exist are updated, identical rows are skipped. Use dryRun=true first to see what would happen. Everything lands as drafts on one change set.\",\n inputSchema: {\n ...projectArg,\n collection: z.string(),\n entries: z\n .array(z.object({ slug: z.string().optional(), data: z.record(z.string(), z.unknown()) }))\n .min(1)\n .max(500),\n changeSet: z.string().optional(),\n changeSummary: z.string().optional(),\n dryRun: z.boolean().optional().describe(\"Report what would change without writing.\"),\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 result = await client.entries.import(project, {\n collection: args.collection,\n entries: args.entries,\n ...(args.changeSet ? { changeSetId: args.changeSet } : {}),\n ...(args.changeSummary ? { changeSummary: args.changeSummary } : {}),\n ...(args.dryRun !== undefined ? { dryRun: args.dryRun } : {}),\n });\n const { created, updated, unchanged, invalid } = result.summary;\n return ok(\n `${args.dryRun ? \"Would import\" : \"Imported\"}: ${created} created, ${updated} updated, ${unchanged} unchanged, ${invalid} invalid.`,\n result,\n );\n } catch (error) {\n return fail(error);\n }\n },\n );\n\n server.registerTool(\n \"myna_reorder_entries\",\n {\n title: \"Reorder a collection\",\n description:\n \"Set the editorial order of a collection. Unlike every other write, ordering is arrangement rather than content: it carries no revision, is not staged on a change set, and reaches readers immediately — which is why confirm=true is required. Never use it to change what an entry says.\",\n inputSchema: {\n ...projectArg,\n collection: z.string(),\n order: z.array(z.string()).optional().describe(\"Entry ids in the intended order.\"),\n move: z\n .object({ entry: z.string(), before: z.string().optional(), after: z.string().optional() })\n .optional()\n .describe(\"Move one entry relative to another, instead of listing the whole order.\"),\n confirm: z.literal(true).describe(\"Must be true: this is immediately visible to readers.\"),\n },\n annotations: { readOnlyHint: false, destructiveHint: true, idempotentHint: true, openWorldHint: true },\n },\n async (args) => {\n try {\n if (Boolean(args.order) === Boolean(args.move)) {\n throw new Error(\"Provide exactly one of `order` or `move`.\");\n }\n const { client, project } = registry.clientFor(args.project);\n const result = await client.entries.reorder(project, args.collection, {\n ...(args.order ? { order: args.order } : {}),\n ...(args.move ? { move: args.move } : {}),\n });\n return ok(`Reordered with ${result.writes} write(s).`, result);\n } catch (error) {\n return fail(error);\n }\n },\n );\n\n // --- Assets ---------------------------------------------------------------\n\n server.registerTool(\n \"myna_list_assets\",\n {\n title: \"List assets\",\n description:\n \"List a project's assets, optionally filtered by tag or checksum. Check here before uploading: an asset that already exists should be referenced, not uploaded again.\",\n inputSchema: {\n ...projectArg,\n tag: z.string().optional(),\n checksum: z.string().optional().describe(\"MD5 hex; finds an identical file already uploaded.\"),\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.assets.list(project, {\n ...(args.tag ? { tag: args.tag } : {}),\n ...(args.checksum ? { checksum: args.checksum } : {}),\n ...(args.limit ? { limit: args.limit } : {}),\n ...(args.cursor ? { cursor: args.cursor } : {}),\n });\n return ok(`${page.data.length} asset(s).`, page);\n } catch (error) {\n return fail(error);\n }\n },\n );\n\n server.registerTool(\n \"myna_get_asset\",\n {\n title: \"Get an asset\",\n description:\n \"Fetch one asset: its delivery URL, content type, byte size, pixel dimensions, alt text, and tags.\",\n inputSchema: { ...projectArg, asset: z.string().describe(\"Asset id (ast_).\") },\n annotations: { readOnlyHint: true, openWorldHint: true },\n },\n async (args) => {\n try {\n const { client, project } = registry.clientFor(args.project);\n const asset = await client.assets.get(project, args.asset);\n return ok(`${asset.displayFilename} (${asset.contentType}).`, { asset });\n } catch (error) {\n return fail(error);\n }\n },\n );\n\n server.registerTool(\n \"myna_update_asset\",\n {\n title: \"Update asset metadata\",\n description:\n \"Set an asset's alt text, caption, display filename, or tags. Alt text in particular is what the built-in alt-text check looks for, so filling it in here clears that check.\",\n inputSchema: {\n ...projectArg,\n asset: z.string(),\n defaultAlt: z.string().optional(),\n caption: z.string().optional(),\n displayFilename: z.string().optional(),\n tags: z.array(z.string()).optional(),\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 asset = await client.assets.update(project, args.asset, {\n ...(args.defaultAlt !== undefined ? { defaultAlt: args.defaultAlt } : {}),\n ...(args.caption !== undefined ? { caption: args.caption } : {}),\n ...(args.displayFilename !== undefined ? { displayFilename: args.displayFilename } : {}),\n ...(args.tags !== undefined ? { tags: args.tags } : {}),\n });\n return ok(`Updated ${asset.id}.`, { asset });\n } catch (error) {\n return fail(error);\n }\n },\n );\n\n // --- Localization ---------------------------------------------------------\n\n server.registerTool(\n \"myna_translation_coverage\",\n {\n title: \"Translation coverage\",\n description:\n \"Report what is still untranslated in a collection, per project locale: how complete each locale is, which fields are missing most often, and a worklist of entries to fix. Empty when the project has no locales or the collection has no localized fields.\",\n inputSchema: { ...projectArg, collection: z.string() },\n annotations: { readOnlyHint: true, openWorldHint: true },\n },\n async (args) => {\n try {\n const { client, project } = registry.clientFor(args.project);\n const report = await client.schema.translations(project, args.collection);\n const summary = report.coverage.map((c) => `${c.locale} ${c.percent}%`).join(\", \");\n return ok(summary || \"No localized fields.\", report);\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 // Org-scoped, like `myna_list_projects`: this is the entry point a client\n // reads to discover projects, so it must not itself demand one. It is the\n // only concrete (non-template) resource, which makes it exactly what a\n // host's resource picker reads first.\n const { client } = registry.clientForOrg();\n const org = registry.organizationFor();\n const projects = await client.projects.list(org);\n return json(uri.href, { organization: org, projects });\n },\n );\n\n // Collection list for a project.\n server.registerResource(\n \"collections\",\n new ResourceTemplate(\"myna://{project}/collections\", { list: undefined }),\n { title: \"Collections\", description: \"Deployed collections for a project.\", mimeType: \"application/json\" },\n async (uri, variables) => {\n const project = String(variables.project);\n const { client, project: ref } = registry.clientFor(project);\n const collections = await client.schema.collections(ref);\n return json(uri.href, { project: ref, collections });\n },\n );\n\n // Canonical schema for one collection.\n server.registerResource(\n \"collection-schema\",\n new ResourceTemplate(\"myna://{project}/collection/{key}\", { list: undefined }),\n { title: \"Collection schema\", description: \"Latest canonical schema for a collection.\", mimeType: \"application/json\" },\n async (uri, variables) => {\n const { client, project } = registry.clientFor(String(variables.project));\n const versions = await client.schema.versions(project, String(variables.key));\n const latest = versions[0];\n return json(uri.href, { collection: String(variables.key), version: latest?.version ?? null, schema: latest?.schemaJson ?? null });\n },\n );\n\n // Entry representation (by entry id).\n server.registerResource(\n \"entry\",\n new ResourceTemplate(\"myna://{project}/entry/{entry}\", { list: undefined }),\n { title: \"Entry\", description: \"An entry's current representation.\", mimeType: \"application/json\" },\n async (uri, variables) => {\n const { client, project } = registry.clientFor(String(variables.project));\n const entry = await client.entries.get(project, String(variables.entry));\n return json(uri.href, { entry });\n },\n );\n\n // Entry revisions.\n server.registerResource(\n \"entry-revisions\",\n new ResourceTemplate(\"myna://{project}/entry/{entry}/revisions\", { list: undefined }),\n { title: \"Entry revisions\", description: \"Immutable revisions for an entry.\", mimeType: \"application/json\" },\n async (uri, variables) => {\n const { client, project } = registry.clientFor(String(variables.project));\n const revisions = await client.entries.revisions(project, String(variables.entry));\n return json(uri.href, { entry: String(variables.entry), revisions });\n },\n );\n\n // Change-set validation results.\n server.registerResource(\n \"change-set-validation\",\n new ResourceTemplate(\"myna://{project}/change-set/{changeSet}/validation\", { list: undefined }),\n { title: \"Change-set validation\", description: \"Validation result for a change set.\", mimeType: \"application/json\" },\n async (uri, variables) => {\n const { client, project } = registry.clientFor(String(variables.project));\n const result = await client.changeSets.validate(project, String(variables.changeSet));\n return json(uri.href, result);\n },\n );\n}\n","/**\n * Build-time version stamp.\n *\n * `tsup` substitutes `__MYNA_VERSION__` with the value from `package.json`\n * (see `tsup.config.ts`), so the version advertised in the MCP handshake can\n * never disagree with the package it was published from. Running from source\n * leaves the identifier undefined and falls back to a marker that is obviously\n * not a release.\n */\ndeclare const __MYNA_VERSION__: string | undefined;\n\nexport const VERSION: string =\n typeof __MYNA_VERSION__ === \"string\" ? __MYNA_VERSION__ : \"0.0.0-dev\";\n","import { createServer as createHttpServer, type IncomingMessage, type ServerResponse } from \"node:http\";\nimport { StreamableHTTPServerTransport } from \"@modelcontextprotocol/sdk/server/streamableHttp.js\";\nimport { ProjectRegistry } from \"./config.js\";\nimport { createServerForRegistry } from \"./server.js\";\n\nexport interface HttpOptions {\n port: number;\n /** Bearer token required in the `Authorization` header. */\n authToken?: string;\n /** Explicitly serve without endpoint auth. Never enable on a public network. */\n allowUnauthenticated?: boolean;\n path?: string;\n}\n\nfunction readBody(req: IncomingMessage): Promise<unknown> {\n return new Promise((resolve, reject) => {\n const chunks: Buffer[] = [];\n req.on(\"data\", (c: Buffer) => chunks.push(c));\n req.on(\"end\", () => {\n const raw = Buffer.concat(chunks).toString(\"utf8\");\n if (!raw) return resolve(undefined);\n try {\n resolve(JSON.parse(raw));\n } catch (error) {\n reject(error);\n }\n });\n req.on(\"error\", reject);\n });\n}\n\nfunction bearer(req: IncomingMessage): string | undefined {\n const header = req.headers.authorization;\n return header?.startsWith(\"Bearer \") ? header.slice(7).trim() : undefined;\n}\n\n/**\n * Streamable HTTP transport (SPEC 13). Stateless: a fresh server + transport per\n * request. Authenticated by a bearer token in the `Authorization` header.\n */\nexport async function runHttp(options: HttpOptions): Promise<void> {\n if (!options.authToken && !options.allowUnauthenticated) {\n throw new Error(\n \"Refusing to serve HTTP without auth. Set MYNA_MCP_TOKEN (or MYNA_TOKEN), \" +\n \"or set MYNA_MCP_ALLOW_UNAUTHENTICATED=1 for trusted-network use only.\",\n );\n }\n const registry = new ProjectRegistry();\n const path = options.path ?? \"/mcp\";\n\n const httpServer = createHttpServer((req: IncomingMessage, res: ServerResponse) => {\n void handle(req, res).catch((error: unknown) => {\n if (!res.headersSent) res.writeHead(500, { \"content-type\": \"application/json\" });\n res.end(JSON.stringify({ jsonrpc: \"2.0\", error: { code: -32603, message: String(error) }, id: null }));\n });\n });\n\n async function handle(req: IncomingMessage, res: ServerResponse): Promise<void> {\n const url = new URL(req.url ?? \"/\", \"http://localhost\");\n if (url.pathname === \"/health\") {\n res.writeHead(200, { \"content-type\": \"application/json\" }).end(JSON.stringify({ ok: true }));\n return;\n }\n if (url.pathname !== path) {\n res.writeHead(404, { \"content-type\": \"application/json\" }).end(JSON.stringify({ error: \"not found\" }));\n return;\n }\n if (options.authToken && bearer(req) !== options.authToken) {\n res.writeHead(401, { \"content-type\": \"application/json\" }).end(JSON.stringify({ error: \"unauthorized\" }));\n return;\n }\n if (req.method !== \"POST\") {\n // Stateless server: no standalone SSE stream.\n res.writeHead(405, { \"content-type\": \"application/json\", allow: \"POST\" }).end(\n JSON.stringify({ jsonrpc: \"2.0\", error: { code: -32000, message: \"Method not allowed.\" }, id: null }),\n );\n return;\n }\n\n const body = await readBody(req);\n const transport = new StreamableHTTPServerTransport({ sessionIdGenerator: undefined });\n // Remote clients must never be able to read this machine's filesystem.\n const server = createServerForRegistry(registry, { allowPathUploads: false });\n res.on(\"close\", () => {\n void transport.close();\n void server.close();\n });\n await server.connect(transport);\n await transport.handleRequest(req, res, body);\n }\n\n await new Promise<void>((resolve) => httpServer.listen(options.port, resolve));\n process.stderr.write(`myna-mcp: streamable HTTP transport listening on :${options.port}${path}\\n`);\n}\n"],"mappings":"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","names":["McpServer","bytes","DEFAULT_API_URL","McpServer"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@myna-sh/mcp",
3
- "version": "0.4.1",
3
+ "version": "0.5.0",
4
4
  "private": false,
5
5
  "publishConfig": {
6
6
  "access": "public"
@@ -31,9 +31,9 @@
31
31
  "@types/node": "24.13.3",
32
32
  "eslint": "9.39.5",
33
33
  "typescript": "5.9.3",
34
- "@myna-sh/api-contracts": "0.0.0",
35
34
  "@myna-sh/config": "0.0.0",
36
- "@myna-sh/sdk": "0.4.1"
35
+ "@myna-sh/api-contracts": "0.0.0",
36
+ "@myna-sh/sdk": "0.5.0"
37
37
  },
38
38
  "scripts": {
39
39
  "build": "tsup",