@atoms-tech/atoms-mcp 0.2.0 → 0.3.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.
Files changed (130) hide show
  1. package/LICENSE +9 -0
  2. package/README.md +30 -18
  3. package/dist/apps/register.d.ts +36 -0
  4. package/dist/apps/register.js +65 -0
  5. package/dist/apps/src/apps/coverage/coverage-app.html +237 -0
  6. package/dist/apps/src/apps/import/import-app.html +239 -0
  7. package/dist/apps/src/apps/mermaid/mermaid-app.html +112 -0
  8. package/dist/apps/src/apps/summary/summary-app.html +279 -0
  9. package/dist/apps/src/apps/trace/trace-app.html +171 -0
  10. package/dist/auth/login.d.ts +0 -1
  11. package/dist/auth/login.js +0 -1
  12. package/dist/auth/refresh.d.ts +0 -1
  13. package/dist/auth/refresh.js +0 -1
  14. package/dist/auth/token-store.d.ts +0 -1
  15. package/dist/auth/token-store.js +0 -1
  16. package/dist/config.d.ts +0 -1
  17. package/dist/config.js +1 -2
  18. package/dist/db/client.d.ts +0 -1
  19. package/dist/db/client.js +0 -1
  20. package/dist/db/graph.d.ts +0 -1
  21. package/dist/db/graph.js +0 -1
  22. package/dist/db/queries.d.ts +0 -1
  23. package/dist/db/queries.js +0 -1
  24. package/dist/index.d.ts +0 -1
  25. package/dist/index.js +0 -1
  26. package/dist/middleware/audit.d.ts +0 -1
  27. package/dist/middleware/audit.js +0 -1
  28. package/dist/middleware/rate-limiter.d.ts +0 -1
  29. package/dist/middleware/rate-limiter.js +0 -1
  30. package/dist/middleware/validator.d.ts +0 -1
  31. package/dist/middleware/validator.js +0 -1
  32. package/dist/server.d.ts +3 -3
  33. package/dist/server.js +70 -28
  34. package/dist/tools/_base.d.ts +0 -1
  35. package/dist/tools/_base.js +0 -1
  36. package/dist/tools/bulk-import.d.ts +0 -1
  37. package/dist/tools/bulk-import.js +0 -1
  38. package/dist/tools/create-item.d.ts +0 -1
  39. package/dist/tools/create-item.js +0 -1
  40. package/dist/tools/delete-item.d.ts +0 -1
  41. package/dist/tools/delete-item.js +0 -1
  42. package/dist/tools/export-mermaid.d.ts +0 -1
  43. package/dist/tools/export-mermaid.js +0 -1
  44. package/dist/tools/get-coverage.d.ts +0 -1
  45. package/dist/tools/get-coverage.js +0 -1
  46. package/dist/tools/get-history.d.ts +0 -1
  47. package/dist/tools/get-history.js +0 -1
  48. package/dist/tools/get-item.d.ts +0 -1
  49. package/dist/tools/get-item.js +0 -1
  50. package/dist/tools/link-items.d.ts +1 -2
  51. package/dist/tools/link-items.js +0 -1
  52. package/dist/tools/list-items.d.ts +0 -1
  53. package/dist/tools/list-items.js +0 -1
  54. package/dist/tools/list-projects.d.ts +0 -1
  55. package/dist/tools/list-projects.js +0 -1
  56. package/dist/tools/project-summary.d.ts +0 -1
  57. package/dist/tools/project-summary.js +0 -1
  58. package/dist/tools/record-test-result.d.ts +0 -1
  59. package/dist/tools/record-test-result.js +0 -1
  60. package/dist/tools/search.d.ts +0 -1
  61. package/dist/tools/search.js +0 -1
  62. package/dist/tools/trace.d.ts +0 -1
  63. package/dist/tools/trace.js +0 -1
  64. package/dist/tools/update-item.d.ts +0 -1
  65. package/dist/tools/update-item.js +0 -1
  66. package/dist/types/responses.d.ts +0 -1
  67. package/dist/types/responses.js +0 -1
  68. package/dist/types/work-item.d.ts +0 -1
  69. package/dist/types/work-item.js +0 -1
  70. package/package.json +11 -4
  71. package/dist/auth/login.d.ts.map +0 -1
  72. package/dist/auth/login.js.map +0 -1
  73. package/dist/auth/refresh.d.ts.map +0 -1
  74. package/dist/auth/refresh.js.map +0 -1
  75. package/dist/auth/token-store.d.ts.map +0 -1
  76. package/dist/auth/token-store.js.map +0 -1
  77. package/dist/config.d.ts.map +0 -1
  78. package/dist/config.js.map +0 -1
  79. package/dist/db/client.d.ts.map +0 -1
  80. package/dist/db/client.js.map +0 -1
  81. package/dist/db/graph.d.ts.map +0 -1
  82. package/dist/db/graph.js.map +0 -1
  83. package/dist/db/queries.d.ts.map +0 -1
  84. package/dist/db/queries.js.map +0 -1
  85. package/dist/index.d.ts.map +0 -1
  86. package/dist/index.js.map +0 -1
  87. package/dist/middleware/audit.d.ts.map +0 -1
  88. package/dist/middleware/audit.js.map +0 -1
  89. package/dist/middleware/rate-limiter.d.ts.map +0 -1
  90. package/dist/middleware/rate-limiter.js.map +0 -1
  91. package/dist/middleware/validator.d.ts.map +0 -1
  92. package/dist/middleware/validator.js.map +0 -1
  93. package/dist/server.d.ts.map +0 -1
  94. package/dist/server.js.map +0 -1
  95. package/dist/tools/_base.d.ts.map +0 -1
  96. package/dist/tools/_base.js.map +0 -1
  97. package/dist/tools/bulk-import.d.ts.map +0 -1
  98. package/dist/tools/bulk-import.js.map +0 -1
  99. package/dist/tools/create-item.d.ts.map +0 -1
  100. package/dist/tools/create-item.js.map +0 -1
  101. package/dist/tools/delete-item.d.ts.map +0 -1
  102. package/dist/tools/delete-item.js.map +0 -1
  103. package/dist/tools/export-mermaid.d.ts.map +0 -1
  104. package/dist/tools/export-mermaid.js.map +0 -1
  105. package/dist/tools/get-coverage.d.ts.map +0 -1
  106. package/dist/tools/get-coverage.js.map +0 -1
  107. package/dist/tools/get-history.d.ts.map +0 -1
  108. package/dist/tools/get-history.js.map +0 -1
  109. package/dist/tools/get-item.d.ts.map +0 -1
  110. package/dist/tools/get-item.js.map +0 -1
  111. package/dist/tools/link-items.d.ts.map +0 -1
  112. package/dist/tools/link-items.js.map +0 -1
  113. package/dist/tools/list-items.d.ts.map +0 -1
  114. package/dist/tools/list-items.js.map +0 -1
  115. package/dist/tools/list-projects.d.ts.map +0 -1
  116. package/dist/tools/list-projects.js.map +0 -1
  117. package/dist/tools/project-summary.d.ts.map +0 -1
  118. package/dist/tools/project-summary.js.map +0 -1
  119. package/dist/tools/record-test-result.d.ts.map +0 -1
  120. package/dist/tools/record-test-result.js.map +0 -1
  121. package/dist/tools/search.d.ts.map +0 -1
  122. package/dist/tools/search.js.map +0 -1
  123. package/dist/tools/trace.d.ts.map +0 -1
  124. package/dist/tools/trace.js.map +0 -1
  125. package/dist/tools/update-item.d.ts.map +0 -1
  126. package/dist/tools/update-item.js.map +0 -1
  127. package/dist/types/responses.d.ts.map +0 -1
  128. package/dist/types/responses.js.map +0 -1
  129. package/dist/types/work-item.d.ts.map +0 -1
  130. package/dist/types/work-item.js.map +0 -1
@@ -31,4 +31,3 @@ export declare function clearCredentials(): Promise<void>;
31
31
  * Get the credentials file path (for user-facing messages).
32
32
  */
33
33
  export declare function getCredentialsPath(): string;
34
- //# sourceMappingURL=token-store.d.ts.map
@@ -58,4 +58,3 @@ export async function clearCredentials() {
58
58
  export function getCredentialsPath() {
59
59
  return CREDENTIALS_FILE;
60
60
  }
61
- //# sourceMappingURL=token-store.js.map
package/dist/config.d.ts CHANGED
@@ -16,4 +16,3 @@ export declare const ATOMS_SUPABASE_URL = "https://gmebjyhomsbvhrxffzre.supabase
16
16
  export declare const ATOMS_SUPABASE_ANON_KEY = "sb_publishable_b49MUAB8XCrQiF7x5b9lUA_w1aplSBH";
17
17
  /** ATOMS web app URL — hosts the MCP consent page */
18
18
  export declare const ATOMS_APP_URL: string;
19
- //# sourceMappingURL=config.d.ts.map
package/dist/config.js CHANGED
@@ -15,5 +15,4 @@
15
15
  export const ATOMS_SUPABASE_URL = "https://gmebjyhomsbvhrxffzre.supabase.co";
16
16
  export const ATOMS_SUPABASE_ANON_KEY = "sb_publishable_b49MUAB8XCrQiF7x5b9lUA_w1aplSBH";
17
17
  /** ATOMS web app URL — hosts the MCP consent page */
18
- export const ATOMS_APP_URL = process.env.ATOMS_APP_URL ?? "https://atoms-mvp-v2.vercel.app";
19
- //# sourceMappingURL=config.js.map
18
+ export const ATOMS_APP_URL = process.env.ATOMS_APP_URL ?? "https://x.atoms.tech";
@@ -27,4 +27,3 @@ export declare function resetClient(): void;
27
27
  * Returns the user's org role, or throws a descriptive error.
28
28
  */
29
29
  export declare function requireWriteAccess(client: SupabaseClient, projectId: string): Promise<string>;
30
- //# sourceMappingURL=client.d.ts.map
package/dist/db/client.js CHANGED
@@ -107,4 +107,3 @@ export async function requireWriteAccess(client, projectId) {
107
107
  }
108
108
  return membership.role;
109
109
  }
110
- //# sourceMappingURL=client.js.map
@@ -5,4 +5,3 @@ export {};
5
5
  *
6
6
  * TODO: Implement graph traversal in Phase 2.
7
7
  */
8
- //# sourceMappingURL=graph.d.ts.map
package/dist/db/graph.js CHANGED
@@ -5,4 +5,3 @@ export {};
5
5
  *
6
6
  * TODO: Implement graph traversal in Phase 2.
7
7
  */
8
- //# sourceMappingURL=graph.js.map
@@ -74,4 +74,3 @@ export declare function getChangeHistory(client: SupabaseClient, projectId: stri
74
74
  * Format: PREFIX-NNNNN (e.g., REQ-00058)
75
75
  */
76
76
  export declare function generateItemId(client: SupabaseClient, projectId: string, type: string): Promise<string>;
77
- //# sourceMappingURL=queries.d.ts.map
@@ -207,4 +207,3 @@ export async function generateItemId(client, projectId, type) {
207
207
  throw new Error(`ID generation failed: ${error.message}`);
208
208
  return data;
209
209
  }
210
- //# sourceMappingURL=queries.js.map
package/dist/index.d.ts CHANGED
@@ -9,4 +9,3 @@
9
9
  * npx @atoms-tech/atoms-mcp --version → Show version
10
10
  */
11
11
  export {};
12
- //# sourceMappingURL=index.d.ts.map
package/dist/index.js CHANGED
@@ -89,4 +89,3 @@ main().catch((err) => {
89
89
  process.stderr.write(`[atoms-mcp] Fatal: ${err instanceof Error ? err.message : String(err)}\n`);
90
90
  process.exit(1);
91
91
  });
92
- //# sourceMappingURL=index.js.map
@@ -23,4 +23,3 @@ export declare function logAudit(client: SupabaseClient, userId: string, entry:
23
23
  * Timer utility for measuring tool duration.
24
24
  */
25
25
  export declare function startTimer(): () => number;
26
- //# sourceMappingURL=audit.d.ts.map
@@ -41,4 +41,3 @@ export function startTimer() {
41
41
  const start = performance.now();
42
42
  return () => Math.round(performance.now() - start);
43
43
  }
44
- //# sourceMappingURL=audit.js.map
@@ -18,4 +18,3 @@ export declare function checkRateLimit(userId: string): {
18
18
  * Clear rate limit state. Useful for testing.
19
19
  */
20
20
  export declare function clearRateLimits(): void;
21
- //# sourceMappingURL=rate-limiter.d.ts.map
@@ -40,4 +40,3 @@ export function checkRateLimit(userId) {
40
40
  export function clearRateLimits() {
41
41
  windows.clear();
42
42
  }
43
- //# sourceMappingURL=rate-limiter.js.map
@@ -19,4 +19,3 @@ export declare function sanitizeText(text: string): string;
19
19
  export declare class ValidationError extends Error {
20
20
  constructor(message: string);
21
21
  }
22
- //# sourceMappingURL=validator.d.ts.map
@@ -88,4 +88,3 @@ export class ValidationError extends Error {
88
88
  this.name = "ValidationError";
89
89
  }
90
90
  }
91
- //# sourceMappingURL=validator.js.map
package/dist/server.d.ts CHANGED
@@ -1,8 +1,9 @@
1
1
  /**
2
2
  * ATOMS MCP Server — Tool registration and initialization.
3
3
  *
4
- * Registers all 10 tools with the MCP SDK using server.registerTool().
5
- * Tools are implemented in separate files under src/tools/.
4
+ * Registers 15 tools: 10 via server.registerTool(), 5 as MCP Apps via registerAtomsApp().
5
+ * MCP App tools (mermaid, summary, trace) render interactive UIs in capable hosts
6
+ * while falling back to text for non-UI clients.
6
7
  *
7
8
  * Naming: atoms_{action}_{resource} (snake_case with service prefix)
8
9
  * Server name: atoms-mcp-server (follows {service}-mcp-server convention)
@@ -11,4 +12,3 @@ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
11
12
  export declare const server: McpServer;
12
13
  /** Expose session ID for change_history writes */
13
14
  export declare function getMcpSessionId(): string;
14
- //# sourceMappingURL=server.d.ts.map
package/dist/server.js CHANGED
@@ -1,8 +1,9 @@
1
1
  /**
2
2
  * ATOMS MCP Server — Tool registration and initialization.
3
3
  *
4
- * Registers all 10 tools with the MCP SDK using server.registerTool().
5
- * Tools are implemented in separate files under src/tools/.
4
+ * Registers 15 tools: 10 via server.registerTool(), 5 as MCP Apps via registerAtomsApp().
5
+ * MCP App tools (mermaid, summary, trace) render interactive UIs in capable hosts
6
+ * while falling back to text for non-UI clients.
6
7
  *
7
8
  * Naming: atoms_{action}_{resource} (snake_case with service prefix)
8
9
  * Server name: atoms-mcp-server (follows {service}-mcp-server convention)
@@ -13,6 +14,7 @@ import { logAudit, startTimer } from "./middleware/audit.js";
13
14
  import { checkRateLimit } from "./middleware/rate-limiter.js";
14
15
  import { getClient, getUserId } from "./db/client.js";
15
16
  import { formatErrorResult, rateLimitError } from "./tools/_base.js";
17
+ import { registerAtomsApp } from "./apps/register.js";
16
18
  import { randomUUID } from "crypto";
17
19
  export const server = new McpServer({
18
20
  name: "atoms-mcp-server",
@@ -241,12 +243,19 @@ Examples:
241
243
  const { searchHandler } = await import("./tools/search.js");
242
244
  return searchHandler(params);
243
245
  }));
244
- server.registerTool("atoms_get_coverage", {
246
+ // MCP App: Coverage Heatmap — renders coverage visualization in UI-capable hosts
247
+ registerAtomsApp(server, {
248
+ appName: "coverage",
249
+ htmlFile: "coverage-app.html",
250
+ toolName: "atoms_get_coverage",
245
251
  title: "Get Test Coverage Report",
246
252
  description: `Find requirements without linked test cases (coverage gaps).
247
253
 
248
254
  Essential for compliance reporting in safety-critical industries.
249
255
 
256
+ In MCP App hosts (Claude, ChatGPT), renders a visual coverage heatmap.
257
+ Falls back to JSON for non-UI clients.
258
+
250
259
  Args:
251
260
  - project_id (string, UUID): The project to analyze
252
261
  - domain (string, optional): Filter by domain
@@ -269,10 +278,11 @@ Examples:
269
278
  idempotentHint: true,
270
279
  openWorldHint: false,
271
280
  },
272
- }, withMiddleware("atoms_get_coverage", async (params) => {
273
- const { getCoverageHandler } = await import("./tools/get-coverage.js");
274
- return getCoverageHandler(params);
275
- }));
281
+ handler: withMiddleware("atoms_get_coverage", async (params) => {
282
+ const { getCoverageHandler } = await import("./tools/get-coverage.js");
283
+ return getCoverageHandler(params);
284
+ }),
285
+ });
276
286
  server.registerTool("atoms_get_history", {
277
287
  title: "Get Item Change History",
278
288
  description: `Audit trail for an item — who changed what, when, and whether it was human or AI.
@@ -302,13 +312,20 @@ Returns:
302
312
  const { getHistoryHandler } = await import("./tools/get-history.js");
303
313
  return getHistoryHandler(params);
304
314
  }));
305
- server.registerTool("atoms_export_mermaid", {
315
+ // MCP App: Mermaid Diagram — renders interactive diagram in UI-capable hosts
316
+ registerAtomsApp(server, {
317
+ appName: "mermaid",
318
+ htmlFile: "mermaid-app.html",
319
+ toolName: "atoms_export_mermaid",
306
320
  title: "Export Mermaid Diagram",
307
321
  description: `Generate a Mermaid diagram of the requirement/test hierarchy.
308
322
 
309
323
  Output is paste-ready for markdown docs. Shows parent-child relationships
310
324
  and requirement-to-test-case verification links.
311
325
 
326
+ In MCP App hosts (Claude, ChatGPT), renders an interactive pan/zoom diagram.
327
+ Falls back to Mermaid text for non-UI clients.
328
+
312
329
  Args:
313
330
  - project_id (string, UUID): The project to visualize
314
331
  - root_item_id (string, optional): Start node (default: all roots)
@@ -329,10 +346,12 @@ Returns:
329
346
  idempotentHint: true,
330
347
  openWorldHint: false,
331
348
  },
332
- }, withMiddleware("atoms_export_mermaid", async (params) => {
333
- const { exportMermaidHandler } = await import("./tools/export-mermaid.js");
334
- return exportMermaidHandler(params);
335
- }));
349
+ extraResourceDomains: ["cdn.jsdelivr.net"],
350
+ handler: withMiddleware("atoms_export_mermaid", async (params) => {
351
+ const { exportMermaidHandler } = await import("./tools/export-mermaid.js");
352
+ return exportMermaidHandler(params);
353
+ }),
354
+ });
336
355
  // ---------------------------------------------------------------------------
337
356
  // Tool Registration — Phase 3 (Write Tools)
338
357
  // ---------------------------------------------------------------------------
@@ -472,7 +491,11 @@ Returns:
472
491
  const { linkItemsHandler } = await import("./tools/link-items.js");
473
492
  return linkItemsHandler(params);
474
493
  }));
475
- server.registerTool("atoms_bulk_import", {
494
+ // MCP App: Bulk Import — renders import results table in UI-capable hosts
495
+ registerAtomsApp(server, {
496
+ appName: "import",
497
+ htmlFile: "import-app.html",
498
+ toolName: "atoms_bulk_import",
476
499
  title: "Bulk Import ATOMS Items",
477
500
  description: `Bulk create multiple items in a single tool call. Essential for AI agents
478
501
  that generate 20+ requirements at once.
@@ -480,6 +503,9 @@ that generate 20+ requirements at once.
480
503
  Checks write access once, generates sequential IDs, batch inserts all items,
481
504
  and reports per-item errors without aborting the entire batch.
482
505
 
506
+ In MCP App hosts (Claude, ChatGPT), renders an interactive results table.
507
+ Falls back to JSON for non-UI clients.
508
+
483
509
  Args:
484
510
  - project_id (string, UUID): Target project
485
511
  - items (array): Up to 100 items to create, each with:
@@ -519,10 +545,11 @@ Side effects:
519
545
  idempotentHint: false,
520
546
  openWorldHint: false,
521
547
  },
522
- }, withMiddleware("atoms_bulk_import", async (params) => {
523
- const { bulkImportHandler } = await import("./tools/bulk-import.js");
524
- return bulkImportHandler(params);
525
- }));
548
+ handler: withMiddleware("atoms_bulk_import", async (params) => {
549
+ const { bulkImportHandler } = await import("./tools/bulk-import.js");
550
+ return bulkImportHandler(params);
551
+ }),
552
+ });
526
553
  server.registerTool("atoms_record_test_result", {
527
554
  title: "Record Test Result",
528
555
  description: `Record a pass/fail/blocked result for a test case.
@@ -562,13 +589,20 @@ Side effects:
562
589
  // ---------------------------------------------------------------------------
563
590
  // Tool Registration — Phase 4 (Advanced Tools)
564
591
  // ---------------------------------------------------------------------------
565
- server.registerTool("atoms_trace", {
592
+ // MCP App: Trace Graph — renders interactive force-directed graph in UI-capable hosts
593
+ registerAtomsApp(server, {
594
+ appName: "trace",
595
+ htmlFile: "trace-app.html",
596
+ toolName: "atoms_trace",
566
597
  title: "Trace Item Relationships",
567
598
  description: `Walk the traceability graph from a starting item.
568
599
 
569
600
  Answers questions like "which requirements does TC-00003 verify?" or
570
601
  "if I change REQ-00001, what's affected downstream?"
571
602
 
603
+ In MCP App hosts (Claude, ChatGPT), renders an interactive graph visualization.
604
+ Falls back to flat list for non-UI clients.
605
+
572
606
  Args:
573
607
  - project_id (string, UUID): Project containing the item
574
608
  - item_id (string): Starting item ID
@@ -601,17 +635,25 @@ Examples:
601
635
  idempotentHint: true,
602
636
  openWorldHint: false,
603
637
  },
604
- }, withMiddleware("atoms_trace", async (params) => {
605
- const { traceHandler } = await import("./tools/trace.js");
606
- return traceHandler(params);
607
- }));
608
- server.registerTool("atoms_project_summary", {
638
+ handler: withMiddleware("atoms_trace", async (params) => {
639
+ const { traceHandler } = await import("./tools/trace.js");
640
+ return traceHandler(params);
641
+ }),
642
+ });
643
+ // MCP App: Project Summary Dashboard — renders interactive compliance dashboard in UI-capable hosts
644
+ registerAtomsApp(server, {
645
+ appName: "summary",
646
+ htmlFile: "summary-app.html",
647
+ toolName: "atoms_project_summary",
609
648
  title: "Project Compliance Summary",
610
649
  description: `One-call project health and compliance dashboard.
611
650
 
612
651
  Returns item counts by type, test execution status, requirement coverage
613
652
  (overall and by domain), and recent change activity.
614
653
 
654
+ In MCP App hosts (Claude, ChatGPT), renders an interactive dashboard with charts.
655
+ Falls back to JSON for non-UI clients.
656
+
615
657
  Args:
616
658
  - project_id (string, UUID): Project to summarize
617
659
 
@@ -630,8 +672,8 @@ Examples:
630
672
  idempotentHint: true,
631
673
  openWorldHint: false,
632
674
  },
633
- }, withMiddleware("atoms_project_summary", async (params) => {
634
- const { projectSummaryHandler } = await import("./tools/project-summary.js");
635
- return projectSummaryHandler(params);
636
- }));
637
- //# sourceMappingURL=server.js.map
675
+ handler: withMiddleware("atoms_project_summary", async (params) => {
676
+ const { projectSummaryHandler } = await import("./tools/project-summary.js");
677
+ return projectSummaryHandler(params);
678
+ }),
679
+ });
@@ -55,4 +55,3 @@ export declare function formatErrorResult(error: ToolError): {
55
55
  structuredContent: ToolError;
56
56
  isError: boolean;
57
57
  };
58
- //# sourceMappingURL=_base.d.ts.map
@@ -106,4 +106,3 @@ export function formatErrorResult(error) {
106
106
  isError: true,
107
107
  };
108
108
  }
109
- //# sourceMappingURL=_base.js.map
@@ -67,4 +67,3 @@ export declare function bulkImportHandler(params: {
67
67
  }>;
68
68
  }>;
69
69
  export {};
70
- //# sourceMappingURL=bulk-import.d.ts.map
@@ -185,4 +185,3 @@ export async function bulkImportHandler(params) {
185
185
  return formatErrorResult(dbError(err instanceof Error ? err.message : String(err)));
186
186
  }
187
187
  }
188
- //# sourceMappingURL=bulk-import.js.map
@@ -40,4 +40,3 @@ export declare function createItemHandler(params: {
40
40
  project_id: string;
41
41
  }>;
42
42
  }>;
43
- //# sourceMappingURL=create-item.d.ts.map
@@ -115,4 +115,3 @@ export async function createItemHandler(params) {
115
115
  return formatErrorResult(dbError(err instanceof Error ? err.message : String(err)));
116
116
  }
117
117
  }
118
- //# sourceMappingURL=create-item.js.map
@@ -35,4 +35,3 @@ export declare function deleteItemHandler(params: {
35
35
  message: string;
36
36
  }>;
37
37
  }>;
38
- //# sourceMappingURL=delete-item.d.ts.map
@@ -66,4 +66,3 @@ export async function deleteItemHandler(params) {
66
66
  return formatErrorResult(dbError(err instanceof Error ? err.message : String(err)));
67
67
  }
68
68
  }
69
- //# sourceMappingURL=delete-item.js.map
@@ -33,4 +33,3 @@ export declare function exportMermaidHandler(params: {
33
33
  mermaid: string;
34
34
  }>;
35
35
  }>;
36
- //# sourceMappingURL=export-mermaid.d.ts.map
@@ -122,4 +122,3 @@ function sanitizeLabel(title) {
122
122
  .replace(/[[\]{}()]/g, "")
123
123
  .substring(0, 50);
124
124
  }
125
- //# sourceMappingURL=export-mermaid.js.map
@@ -31,4 +31,3 @@ export declare function getCoverageHandler(params: {
31
31
  }[];
32
32
  structuredContent: import("../types/responses.js").ToolError | import("../types/responses.js").ToolSuccess<CoverageReport>;
33
33
  }>;
34
- //# sourceMappingURL=get-coverage.d.ts.map
@@ -33,4 +33,3 @@ export async function getCoverageHandler(params) {
33
33
  return formatErrorResult(dbError(err instanceof Error ? err.message : String(err)));
34
34
  }
35
35
  }
36
- //# sourceMappingURL=get-coverage.js.map
@@ -31,4 +31,3 @@ export declare function getHistoryHandler(params: {
31
31
  }[];
32
32
  structuredContent: import("../types/responses.js").ToolError | import("../types/responses.js").ToolSuccess<HistoryEntry[]>;
33
33
  }>;
34
- //# sourceMappingURL=get-history.d.ts.map
@@ -50,4 +50,3 @@ export async function getHistoryHandler(params) {
50
50
  return formatErrorResult(dbError(err instanceof Error ? err.message : String(err)));
51
51
  }
52
52
  }
53
- //# sourceMappingURL=get-history.js.map
@@ -59,4 +59,3 @@ export declare function getItemHandler(params: {
59
59
  status: "passed" | "failed" | "blocked" | "not-run" | undefined;
60
60
  }>;
61
61
  }>;
62
- //# sourceMappingURL=get-item.d.ts.map
@@ -90,4 +90,3 @@ export async function getItemHandler(params) {
90
90
  return formatErrorResult(dbError(err instanceof Error ? err.message : String(err)));
91
91
  }
92
92
  }
93
- //# sourceMappingURL=get-item.js.map
@@ -32,10 +32,9 @@ export declare function linkItemsHandler(params: {
32
32
  }[];
33
33
  structuredContent: import("../types/responses.js").ToolError | import("../types/responses.js").ToolSuccess<{
34
34
  action: "add" | "remove";
35
- type: "verified_by" | "parent" | "child" | "verifies" | "related";
35
+ type: "parent" | "verified_by" | "child" | "verifies" | "related";
36
36
  from_id: string;
37
37
  to_id: string;
38
38
  message: string;
39
39
  }>;
40
40
  }>;
41
- //# sourceMappingURL=link-items.d.ts.map
@@ -147,4 +147,3 @@ export async function linkItemsHandler(params) {
147
147
  return formatErrorResult(dbError(err instanceof Error ? err.message : String(err)));
148
148
  }
149
149
  }
150
- //# sourceMappingURL=link-items.js.map
@@ -34,4 +34,3 @@ export declare function listItemsHandler(params: {
34
34
  }[];
35
35
  structuredContent: import("../types/responses.js").ToolError | import("../types/responses.js").ToolSuccess<ItemSummary[]>;
36
36
  }>;
37
- //# sourceMappingURL=list-items.d.ts.map
@@ -33,4 +33,3 @@ export async function listItemsHandler(params) {
33
33
  return formatErrorResult(dbError(err instanceof Error ? err.message : String(err)));
34
34
  }
35
35
  }
36
- //# sourceMappingURL=list-items.js.map
@@ -35,4 +35,3 @@ export declare function listProjectsHandler(): Promise<{
35
35
  created_at: string;
36
36
  }[]>;
37
37
  }>;
38
- //# sourceMappingURL=list-projects.d.ts.map
@@ -25,4 +25,3 @@ export async function listProjectsHandler() {
25
25
  return formatErrorResult(dbError(err instanceof Error ? err.message : "Unknown error"));
26
26
  }
27
27
  }
28
- //# sourceMappingURL=list-projects.js.map
@@ -61,4 +61,3 @@ export declare function projectSummaryHandler(params: {
61
61
  structuredContent: import("../types/responses.js").ToolError | import("../types/responses.js").ToolSuccess<ProjectSummaryData>;
62
62
  }>;
63
63
  export {};
64
- //# sourceMappingURL=project-summary.d.ts.map
@@ -167,4 +167,3 @@ export async function projectSummaryHandler(params) {
167
167
  return formatErrorResult(dbError(err instanceof Error ? err.message : String(err)));
168
168
  }
169
169
  }
170
- //# sourceMappingURL=project-summary.js.map
@@ -38,4 +38,3 @@ export declare function recordTestResultHandler(params: {
38
38
  message: string;
39
39
  }>;
40
40
  }>;
41
- //# sourceMappingURL=record-test-result.d.ts.map
@@ -77,4 +77,3 @@ export async function recordTestResultHandler(params) {
77
77
  return formatErrorResult(dbError(err instanceof Error ? err.message : String(err)));
78
78
  }
79
79
  }
80
- //# sourceMappingURL=record-test-result.js.map
@@ -31,4 +31,3 @@ export declare function searchHandler(params: {
31
31
  }[];
32
32
  structuredContent: import("../types/responses.js").ToolError | import("../types/responses.js").ToolSuccess<ItemSummary[]>;
33
33
  }>;
34
- //# sourceMappingURL=search.d.ts.map
@@ -25,4 +25,3 @@ export async function searchHandler(params) {
25
25
  return formatErrorResult(dbError(err instanceof Error ? err.message : String(err)));
26
26
  }
27
27
  }
28
- //# sourceMappingURL=search.js.map
@@ -50,4 +50,3 @@ export declare function traceHandler(params: {
50
50
  }>;
51
51
  }>;
52
52
  export {};
53
- //# sourceMappingURL=trace.d.ts.map
@@ -163,4 +163,3 @@ export async function traceHandler(params) {
163
163
  return formatErrorResult(dbError(err instanceof Error ? err.message : String(err)));
164
164
  }
165
165
  }
166
- //# sourceMappingURL=trace.js.map
@@ -40,4 +40,3 @@ export declare function updateItemHandler(params: {
40
40
  updated_fields: string[];
41
41
  }>;
42
42
  }>;
43
- //# sourceMappingURL=update-item.d.ts.map
@@ -95,4 +95,3 @@ export async function updateItemHandler(params) {
95
95
  return formatErrorResult(dbError(err instanceof Error ? err.message : String(err)));
96
96
  }
97
97
  }
98
- //# sourceMappingURL=update-item.js.map
@@ -55,4 +55,3 @@ export interface HistoryEntry {
55
55
  session_id: string | null;
56
56
  fields_changed: string[];
57
57
  }
58
- //# sourceMappingURL=responses.d.ts.map
@@ -3,4 +3,3 @@
3
3
  * Every tool returns JSON matching one of these shapes.
4
4
  */
5
5
  export {};
6
- //# sourceMappingURL=responses.js.map
@@ -66,4 +66,3 @@ export interface ItemRow {
66
66
  updated_at: string;
67
67
  deleted_at: string | null;
68
68
  }
69
- //# sourceMappingURL=work-item.d.ts.map
@@ -5,4 +5,3 @@
5
5
  * This is a subset focused on what the MCP server needs.
6
6
  */
7
7
  export {};
8
- //# sourceMappingURL=work-item.js.map
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@atoms-tech/atoms-mcp",
3
- "version": "0.2.0",
3
+ "version": "0.3.0",
4
4
  "description": "MCP server for ATOMS.tech — AI agent integration for requirements management",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -8,18 +8,23 @@
8
8
  "atoms-mcp": "./bin/atoms-mcp.js"
9
9
  },
10
10
  "scripts": {
11
- "build": "tsc",
11
+ "build:ui": "rm -rf dist/apps && INPUT=src/apps/mermaid/mermaid-app.html vite build && INPUT=src/apps/summary/summary-app.html vite build && INPUT=src/apps/trace/trace-app.html vite build && INPUT=src/apps/coverage/coverage-app.html vite build && INPUT=src/apps/import/import-app.html vite build",
12
+ "build:server": "tsc",
13
+ "build": "npm run build:ui && npm run build:server",
12
14
  "dev": "tsx watch src/index.ts",
15
+ "dev:ui": "vite build --watch",
13
16
  "start": "node dist/index.js",
14
17
  "test": "vitest run",
15
18
  "test:watch": "vitest",
16
19
  "lint": "tsc --noEmit",
17
- "clean": "rm -rf dist"
20
+ "clean": "rm -rf dist",
21
+ "prepublishOnly": "npm run clean && npm run build && npm test"
18
22
  },
19
23
  "engines": {
20
24
  "node": ">=18"
21
25
  },
22
26
  "dependencies": {
27
+ "@modelcontextprotocol/ext-apps": "^1.3.1",
23
28
  "@modelcontextprotocol/sdk": "^1.27.0",
24
29
  "@supabase/supabase-js": "^2.49.0",
25
30
  "open": "^10.0.0",
@@ -29,6 +34,8 @@
29
34
  "@types/node": "^22.0.0",
30
35
  "tsx": "^4.19.0",
31
36
  "typescript": "^5.9.0",
37
+ "vite": "^7.3.1",
38
+ "vite-plugin-singlefile": "^2.3.2",
32
39
  "vitest": "^3.0.0"
33
40
  },
34
41
  "files": [
@@ -42,7 +49,7 @@
42
49
  "model-context-protocol",
43
50
  "ai-agent"
44
51
  ],
45
- "license": "MIT",
52
+ "license": "SEE LICENSE IN LICENSE",
46
53
  "repository": {
47
54
  "type": "git",
48
55
  "url": "https://github.com/support-atoms-tech/atoms-mvp-v2"
@@ -1 +0,0 @@
1
- {"version":3,"file":"login.d.ts","sourceRoot":"","sources":["../../src/auth/login.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAWH;;;;;;;;;;GAUG;AACH,wBAAsB,KAAK,IAAI,OAAO,CAAC;IAAE,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC,CAkMxD"}