@atoms-tech/atoms-mcp 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (110) hide show
  1. package/bin/atoms-mcp.js +2 -0
  2. package/dist/auth/login.d.ts +23 -0
  3. package/dist/auth/login.d.ts.map +1 -0
  4. package/dist/auth/login.js +246 -0
  5. package/dist/auth/login.js.map +1 -0
  6. package/dist/auth/refresh.d.ts +17 -0
  7. package/dist/auth/refresh.d.ts.map +1 -0
  8. package/dist/auth/refresh.js +82 -0
  9. package/dist/auth/refresh.js.map +1 -0
  10. package/dist/auth/token-store.d.ts +34 -0
  11. package/dist/auth/token-store.d.ts.map +1 -0
  12. package/dist/auth/token-store.js +61 -0
  13. package/dist/auth/token-store.js.map +1 -0
  14. package/dist/config.d.ts +17 -0
  15. package/dist/config.d.ts.map +1 -0
  16. package/dist/config.js +17 -0
  17. package/dist/config.js.map +1 -0
  18. package/dist/db/client.d.ts +30 -0
  19. package/dist/db/client.d.ts.map +1 -0
  20. package/dist/db/client.js +110 -0
  21. package/dist/db/client.js.map +1 -0
  22. package/dist/db/graph.d.ts +8 -0
  23. package/dist/db/graph.d.ts.map +1 -0
  24. package/dist/db/graph.js +8 -0
  25. package/dist/db/graph.js.map +1 -0
  26. package/dist/db/queries.d.ts +77 -0
  27. package/dist/db/queries.d.ts.map +1 -0
  28. package/dist/db/queries.js +210 -0
  29. package/dist/db/queries.js.map +1 -0
  30. package/dist/index.d.ts +12 -0
  31. package/dist/index.d.ts.map +1 -0
  32. package/dist/index.js +92 -0
  33. package/dist/index.js.map +1 -0
  34. package/dist/middleware/audit.d.ts +26 -0
  35. package/dist/middleware/audit.d.ts.map +1 -0
  36. package/dist/middleware/audit.js +44 -0
  37. package/dist/middleware/audit.js.map +1 -0
  38. package/dist/middleware/rate-limiter.d.ts +21 -0
  39. package/dist/middleware/rate-limiter.d.ts.map +1 -0
  40. package/dist/middleware/rate-limiter.js +43 -0
  41. package/dist/middleware/rate-limiter.js.map +1 -0
  42. package/dist/middleware/validator.d.ts +22 -0
  43. package/dist/middleware/validator.d.ts.map +1 -0
  44. package/dist/middleware/validator.js +91 -0
  45. package/dist/middleware/validator.js.map +1 -0
  46. package/dist/server.d.ts +14 -0
  47. package/dist/server.d.ts.map +1 -0
  48. package/dist/server.js +511 -0
  49. package/dist/server.js.map +1 -0
  50. package/dist/tools/_base.d.ts +58 -0
  51. package/dist/tools/_base.d.ts.map +1 -0
  52. package/dist/tools/_base.js +109 -0
  53. package/dist/tools/_base.js.map +1 -0
  54. package/dist/tools/create-item.d.ts +43 -0
  55. package/dist/tools/create-item.d.ts.map +1 -0
  56. package/dist/tools/create-item.js +118 -0
  57. package/dist/tools/create-item.js.map +1 -0
  58. package/dist/tools/delete-item.d.ts +38 -0
  59. package/dist/tools/delete-item.d.ts.map +1 -0
  60. package/dist/tools/delete-item.js +69 -0
  61. package/dist/tools/delete-item.js.map +1 -0
  62. package/dist/tools/export-mermaid.d.ts +36 -0
  63. package/dist/tools/export-mermaid.d.ts.map +1 -0
  64. package/dist/tools/export-mermaid.js +125 -0
  65. package/dist/tools/export-mermaid.js.map +1 -0
  66. package/dist/tools/get-coverage.d.ts +34 -0
  67. package/dist/tools/get-coverage.d.ts.map +1 -0
  68. package/dist/tools/get-coverage.js +36 -0
  69. package/dist/tools/get-coverage.js.map +1 -0
  70. package/dist/tools/get-history.d.ts +34 -0
  71. package/dist/tools/get-history.d.ts.map +1 -0
  72. package/dist/tools/get-history.js +53 -0
  73. package/dist/tools/get-history.js.map +1 -0
  74. package/dist/tools/get-item.d.ts +62 -0
  75. package/dist/tools/get-item.d.ts.map +1 -0
  76. package/dist/tools/get-item.js +93 -0
  77. package/dist/tools/get-item.js.map +1 -0
  78. package/dist/tools/link-items.d.ts +41 -0
  79. package/dist/tools/link-items.d.ts.map +1 -0
  80. package/dist/tools/link-items.js +150 -0
  81. package/dist/tools/link-items.js.map +1 -0
  82. package/dist/tools/list-items.d.ts +37 -0
  83. package/dist/tools/list-items.d.ts.map +1 -0
  84. package/dist/tools/list-items.js +36 -0
  85. package/dist/tools/list-items.js.map +1 -0
  86. package/dist/tools/list-projects.d.ts +38 -0
  87. package/dist/tools/list-projects.d.ts.map +1 -0
  88. package/dist/tools/list-projects.js +28 -0
  89. package/dist/tools/list-projects.js.map +1 -0
  90. package/dist/tools/record-test-result.d.ts +41 -0
  91. package/dist/tools/record-test-result.d.ts.map +1 -0
  92. package/dist/tools/record-test-result.js +80 -0
  93. package/dist/tools/record-test-result.js.map +1 -0
  94. package/dist/tools/search.d.ts +34 -0
  95. package/dist/tools/search.d.ts.map +1 -0
  96. package/dist/tools/search.js +28 -0
  97. package/dist/tools/search.js.map +1 -0
  98. package/dist/tools/update-item.d.ts +43 -0
  99. package/dist/tools/update-item.d.ts.map +1 -0
  100. package/dist/tools/update-item.js +98 -0
  101. package/dist/tools/update-item.js.map +1 -0
  102. package/dist/types/responses.d.ts +58 -0
  103. package/dist/types/responses.d.ts.map +1 -0
  104. package/dist/types/responses.js +6 -0
  105. package/dist/types/responses.js.map +1 -0
  106. package/dist/types/work-item.d.ts +69 -0
  107. package/dist/types/work-item.d.ts.map +1 -0
  108. package/dist/types/work-item.js +8 -0
  109. package/dist/types/work-item.js.map +1 -0
  110. package/package.json +50 -0
@@ -0,0 +1,41 @@
1
+ /**
2
+ * atoms_record_test_result — Record a pass/fail/blocked result for a test case.
3
+ * Appends to test_results shadow table. Requires editor or admin role.
4
+ */
5
+ export declare function recordTestResultHandler(params: {
6
+ project_id: string;
7
+ item_id: string;
8
+ result: "passed" | "failed" | "blocked" | "not-run";
9
+ note?: string;
10
+ }): Promise<{
11
+ content: {
12
+ type: "text";
13
+ text: string;
14
+ }[];
15
+ structuredContent: {
16
+ data: any[];
17
+ meta: {
18
+ truncated: boolean;
19
+ truncation_message: string;
20
+ total_count?: number | undefined;
21
+ limit?: number | undefined;
22
+ offset?: number | undefined;
23
+ has_more?: boolean | undefined;
24
+ };
25
+ status: "success";
26
+ };
27
+ } | {
28
+ content: {
29
+ type: "text";
30
+ text: string;
31
+ }[];
32
+ structuredContent: import("../types/responses.js").ToolError | import("../types/responses.js").ToolSuccess<{
33
+ item_id: string;
34
+ result: "passed" | "failed" | "blocked" | "not-run";
35
+ run_at: string;
36
+ run_by: string;
37
+ note: string | null;
38
+ message: string;
39
+ }>;
40
+ }>;
41
+ //# sourceMappingURL=record-test-result.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"record-test-result.d.ts","sourceRoot":"","sources":["../../src/tools/record-test-result.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAgBH,wBAAsB,uBAAuB,CAAC,MAAM,EAAE;IACpD,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,QAAQ,GAAG,QAAQ,GAAG,SAAS,GAAG,SAAS,CAAC;IACpD,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkFA"}
@@ -0,0 +1,80 @@
1
+ /**
2
+ * atoms_record_test_result — Record a pass/fail/blocked result for a test case.
3
+ * Appends to test_results shadow table. Requires editor or admin role.
4
+ */
5
+ import { getClient, getUserId, getUserEmail, requireWriteAccess } from "../db/client.js";
6
+ import { getItemById } from "../db/queries.js";
7
+ import { getMcpSessionId } from "../server.js";
8
+ import { formatToolResult, formatErrorResult, success, notFoundError, accessDeniedError, validationError, dbError, authError, } from "./_base.js";
9
+ export async function recordTestResultHandler(params) {
10
+ try {
11
+ const client = await getClient();
12
+ const userId = getUserId();
13
+ const email = getUserEmail();
14
+ // Check write access
15
+ try {
16
+ await requireWriteAccess(client, params.project_id);
17
+ }
18
+ catch (err) {
19
+ if (err instanceof Error && err.message === "VIEWER_ROLE") {
20
+ return formatErrorResult(accessDeniedError("Viewer"));
21
+ }
22
+ throw err;
23
+ }
24
+ // Verify the item exists and is a test case
25
+ const item = await getItemById(client, params.project_id, params.item_id);
26
+ if (!item) {
27
+ return formatErrorResult(notFoundError("Item", params.item_id));
28
+ }
29
+ if (item.type !== "test-case") {
30
+ return formatErrorResult(validationError(`Item '${params.item_id}' is a ${item.type}, not a test-case`));
31
+ }
32
+ const runAt = new Date().toISOString();
33
+ // Insert into test_results shadow table
34
+ const { error: insertErr } = await client
35
+ .from("test_results")
36
+ .insert({
37
+ item_id: params.item_id,
38
+ project_id: params.project_id,
39
+ result: params.result,
40
+ run_by: email || userId,
41
+ run_at: runAt,
42
+ note: params.note ?? null,
43
+ });
44
+ if (insertErr)
45
+ throw new Error(insertErr.message);
46
+ // Audit: log to change_history
47
+ await client
48
+ .from("change_history")
49
+ .insert({
50
+ item_id: params.item_id,
51
+ project_id: params.project_id,
52
+ changed_by: userId,
53
+ event_type: "test_result_recorded",
54
+ old_data: null,
55
+ new_data: { result: params.result, run_at: runAt, note: params.note },
56
+ actor: "mcp_claude",
57
+ session_id: getMcpSessionId(),
58
+ })
59
+ .then(({ error }) => {
60
+ if (error) {
61
+ process.stderr.write(`[atoms-mcp] Warning: change_history log failed: ${error.message}\n`);
62
+ }
63
+ });
64
+ return formatToolResult(success({
65
+ item_id: params.item_id,
66
+ result: params.result,
67
+ run_at: runAt,
68
+ run_by: email || userId,
69
+ note: params.note ?? null,
70
+ message: `Test result '${params.result}' recorded for ${params.item_id}`,
71
+ }));
72
+ }
73
+ catch (err) {
74
+ if (err instanceof Error && err.message.includes("Not authenticated")) {
75
+ return formatErrorResult(authError());
76
+ }
77
+ return formatErrorResult(dbError(err instanceof Error ? err.message : String(err)));
78
+ }
79
+ }
80
+ //# sourceMappingURL=record-test-result.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"record-test-result.js","sourceRoot":"","sources":["../../src/tools/record-test-result.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,34 @@
1
+ /**
2
+ * atoms_search — Full-text search across items in a project.
3
+ */
4
+ import type { ItemSummary } from "../types/responses.js";
5
+ export declare function searchHandler(params: {
6
+ project_id: string;
7
+ query: string;
8
+ type?: string;
9
+ limit: number;
10
+ }): Promise<{
11
+ content: {
12
+ type: "text";
13
+ text: string;
14
+ }[];
15
+ structuredContent: {
16
+ data: any[];
17
+ meta: {
18
+ truncated: boolean;
19
+ truncation_message: string;
20
+ total_count?: number | undefined;
21
+ limit?: number | undefined;
22
+ offset?: number | undefined;
23
+ has_more?: boolean | undefined;
24
+ };
25
+ status: "success";
26
+ };
27
+ } | {
28
+ content: {
29
+ type: "text";
30
+ text: string;
31
+ }[];
32
+ structuredContent: import("../types/responses.js").ToolError | import("../types/responses.js").ToolSuccess<ItemSummary[]>;
33
+ }>;
34
+ //# sourceMappingURL=search.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"search.d.ts","sourceRoot":"","sources":["../../src/tools/search.ts"],"names":[],"mappings":"AAAA;;GAEG;AAYH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAEzD,wBAAsB,aAAa,CAAC,MAAM,EAAE;IAC1C,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;CACf;;;;;;;;;;;;;;;;;;;;;;;GA8BA"}
@@ -0,0 +1,28 @@
1
+ /**
2
+ * atoms_search — Full-text search across items in a project.
3
+ */
4
+ import { getClient } from "../db/client.js";
5
+ import { searchItems } from "../db/queries.js";
6
+ import { formatToolResult, formatErrorResult, success, paginationMeta, dbError, authError, } from "./_base.js";
7
+ export async function searchHandler(params) {
8
+ try {
9
+ const client = await getClient();
10
+ const { items, totalCount } = await searchItems(client, params.project_id, params.query, { type: params.type, limit: params.limit });
11
+ const data = items.map((item) => ({
12
+ id: item.id,
13
+ title: item.title,
14
+ type: item.type,
15
+ status: item.data?.status,
16
+ domains: item.data?.tags?.domains ?? [],
17
+ level: item.data?.tags?.level,
18
+ }));
19
+ return formatToolResult(success(data, paginationMeta(totalCount, params.limit, 0)));
20
+ }
21
+ catch (err) {
22
+ if (err instanceof Error && err.message.includes("Not authenticated")) {
23
+ return formatErrorResult(authError());
24
+ }
25
+ return formatErrorResult(dbError(err instanceof Error ? err.message : String(err)));
26
+ }
27
+ }
28
+ //# sourceMappingURL=search.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"search.js","sourceRoot":"","sources":["../../src/tools/search.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC/C,OAAO,EACL,gBAAgB,EAChB,iBAAiB,EACjB,OAAO,EACP,cAAc,EACd,OAAO,EACP,SAAS,GACV,MAAM,YAAY,CAAC;AAGpB,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,MAKnC;IACC,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,SAAS,EAAE,CAAC;QACjC,MAAM,EAAE,KAAK,EAAE,UAAU,EAAE,GAAG,MAAM,WAAW,CAC7C,MAAM,EACN,MAAM,CAAC,UAAU,EACjB,MAAM,CAAC,KAAK,EACZ,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,CAC3C,CAAC;QAEF,MAAM,IAAI,GAAkB,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;YAC/C,EAAE,EAAE,IAAI,CAAC,EAAE;YACX,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,MAAM,EAAE,IAAI,CAAC,IAAI,EAAE,MAAM;YACzB,OAAO,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,OAAO,IAAI,EAAE;YACvC,KAAK,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,KAAK;SAC9B,CAAC,CAAC,CAAC;QAEJ,OAAO,gBAAgB,CACrB,OAAO,CAAC,IAAI,EAAE,cAAc,CAAC,UAAU,EAAE,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,CAC3D,CAAC;IACJ,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,IAAI,GAAG,YAAY,KAAK,IAAI,GAAG,CAAC,OAAO,CAAC,QAAQ,CAAC,mBAAmB,CAAC,EAAE,CAAC;YACtE,OAAO,iBAAiB,CAAC,SAAS,EAAE,CAAC,CAAC;QACxC,CAAC;QACD,OAAO,iBAAiB,CACtB,OAAO,CAAC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAC1D,CAAC;IACJ,CAAC;AACH,CAAC"}
@@ -0,0 +1,43 @@
1
+ /**
2
+ * atoms_update_item — Update an existing item's fields.
3
+ * Requires editor or admin role. Logs old/new diff to change_history.
4
+ */
5
+ export declare function updateItemHandler(params: {
6
+ project_id: string;
7
+ item_id: string;
8
+ title?: string;
9
+ body?: string;
10
+ summary?: string;
11
+ domains?: string[];
12
+ level?: string;
13
+ status?: "passed" | "failed" | "blocked" | "not-run";
14
+ }): Promise<{
15
+ content: {
16
+ type: "text";
17
+ text: string;
18
+ }[];
19
+ structuredContent: {
20
+ data: any[];
21
+ meta: {
22
+ truncated: boolean;
23
+ truncation_message: string;
24
+ total_count?: number | undefined;
25
+ limit?: number | undefined;
26
+ offset?: number | undefined;
27
+ has_more?: boolean | undefined;
28
+ };
29
+ status: "success";
30
+ };
31
+ } | {
32
+ content: {
33
+ type: "text";
34
+ text: string;
35
+ }[];
36
+ structuredContent: import("../types/responses.js").ToolError | import("../types/responses.js").ToolSuccess<{
37
+ id: string;
38
+ title: string;
39
+ type: string;
40
+ updated_fields: string[];
41
+ }>;
42
+ }>;
43
+ //# sourceMappingURL=update-item.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"update-item.d.ts","sourceRoot":"","sources":["../../src/tools/update-item.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAeH,wBAAsB,iBAAiB,CAAC,MAAM,EAAE;IAC9C,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,QAAQ,GAAG,QAAQ,GAAG,SAAS,GAAG,SAAS,CAAC;CACtD;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAsGA"}
@@ -0,0 +1,98 @@
1
+ /**
2
+ * atoms_update_item — Update an existing item's fields.
3
+ * Requires editor or admin role. Logs old/new diff to change_history.
4
+ */
5
+ import { getClient, getUserId, requireWriteAccess } from "../db/client.js";
6
+ import { getItemById } from "../db/queries.js";
7
+ import { getMcpSessionId } from "../server.js";
8
+ import { formatToolResult, formatErrorResult, success, notFoundError, accessDeniedError, dbError, authError, } from "./_base.js";
9
+ export async function updateItemHandler(params) {
10
+ try {
11
+ const client = await getClient();
12
+ const userId = getUserId();
13
+ // Check write access
14
+ try {
15
+ await requireWriteAccess(client, params.project_id);
16
+ }
17
+ catch (err) {
18
+ if (err instanceof Error && err.message === "VIEWER_ROLE") {
19
+ return formatErrorResult(accessDeniedError("Viewer"));
20
+ }
21
+ throw err;
22
+ }
23
+ // Get existing item
24
+ const existing = await getItemById(client, params.project_id, params.item_id);
25
+ if (!existing) {
26
+ return formatErrorResult(notFoundError("Item", params.item_id));
27
+ }
28
+ // Build updated data blob
29
+ const oldData = { ...existing.data };
30
+ const updatedData = { ...existing.data };
31
+ if (params.title !== undefined) {
32
+ updatedData.title = params.title;
33
+ }
34
+ if (params.body !== undefined) {
35
+ updatedData.body = params.body;
36
+ }
37
+ if (params.summary !== undefined) {
38
+ updatedData.summary = params.summary;
39
+ }
40
+ if (params.domains !== undefined) {
41
+ updatedData.tags = { ...updatedData.tags, domains: params.domains };
42
+ }
43
+ if (params.level !== undefined) {
44
+ updatedData.tags = { ...updatedData.tags, level: params.level };
45
+ }
46
+ if (params.status !== undefined) {
47
+ updatedData.status = params.status;
48
+ }
49
+ updatedData.metadata = {
50
+ ...updatedData.metadata,
51
+ updated_at: new Date().toISOString(),
52
+ updated_by: userId,
53
+ };
54
+ // Update in database
55
+ const { error: updateErr } = await client
56
+ .from("items")
57
+ .update({
58
+ title: params.title ?? existing.title,
59
+ data: updatedData,
60
+ updated_by: userId,
61
+ })
62
+ .eq("id", params.item_id)
63
+ .eq("project_id", params.project_id);
64
+ if (updateErr)
65
+ throw new Error(updateErr.message);
66
+ // Audit: log diff to change_history
67
+ await client
68
+ .from("change_history")
69
+ .insert({
70
+ item_id: params.item_id,
71
+ project_id: params.project_id,
72
+ changed_by: userId,
73
+ event_type: "updated",
74
+ old_data: oldData,
75
+ new_data: updatedData,
76
+ actor: "mcp_claude",
77
+ session_id: getMcpSessionId(),
78
+ })
79
+ .then(({ error }) => {
80
+ if (error) {
81
+ process.stderr.write(`[atoms-mcp] Warning: change_history log failed: ${error.message}\n`);
82
+ }
83
+ });
84
+ return formatToolResult(success({
85
+ id: params.item_id,
86
+ title: updatedData.title,
87
+ type: existing.type,
88
+ updated_fields: Object.keys(params).filter((k) => k !== "project_id" && k !== "item_id" && params[k] !== undefined),
89
+ }));
90
+ }
91
+ catch (err) {
92
+ if (err instanceof Error && err.message.includes("Not authenticated")) {
93
+ return formatErrorResult(authError());
94
+ }
95
+ return formatErrorResult(dbError(err instanceof Error ? err.message : String(err)));
96
+ }
97
+ }
98
+ //# sourceMappingURL=update-item.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"update-item.js","sourceRoot":"","sources":["../../src/tools/update-item.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,58 @@
1
+ /**
2
+ * Standard response envelopes for all MCP tool responses.
3
+ * Every tool returns JSON matching one of these shapes.
4
+ */
5
+ export interface ToolSuccess<T = unknown> {
6
+ [key: string]: unknown;
7
+ status: "success";
8
+ data: T;
9
+ meta?: PaginationMeta;
10
+ }
11
+ export interface ToolError {
12
+ [key: string]: unknown;
13
+ status: "error";
14
+ message: string;
15
+ next_steps: string[];
16
+ }
17
+ export interface PaginationMeta {
18
+ [key: string]: unknown;
19
+ total_count: number;
20
+ limit: number;
21
+ offset: number;
22
+ has_more: boolean;
23
+ }
24
+ export type ToolResponse<T = unknown> = ToolSuccess<T> | ToolError;
25
+ /**
26
+ * Item summary returned by list/search tools (@basic fields).
27
+ */
28
+ export interface ItemSummary {
29
+ id: string;
30
+ title: string;
31
+ type: string;
32
+ status?: string;
33
+ domains: string[];
34
+ level?: string;
35
+ }
36
+ /**
37
+ * Coverage report returned by atoms_get_coverage.
38
+ */
39
+ export interface CoverageReport {
40
+ covered: number;
41
+ uncovered: number;
42
+ total: number;
43
+ coverage_percent: number;
44
+ uncovered_items: ItemSummary[];
45
+ }
46
+ /**
47
+ * Change history entry returned by atoms_get_history.
48
+ */
49
+ export interface HistoryEntry {
50
+ id: string;
51
+ event_type: string;
52
+ changed_by: string | null;
53
+ changed_at: string;
54
+ actor: string;
55
+ session_id: string | null;
56
+ fields_changed: string[];
57
+ }
58
+ //# sourceMappingURL=responses.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"responses.d.ts","sourceRoot":"","sources":["../../src/types/responses.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,WAAW,WAAW,CAAC,CAAC,GAAG,OAAO;IACtC,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;IACvB,MAAM,EAAE,SAAS,CAAC;IAClB,IAAI,EAAE,CAAC,CAAC;IACR,IAAI,CAAC,EAAE,cAAc,CAAC;CACvB;AAED,MAAM,WAAW,SAAS;IACxB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;IACvB,MAAM,EAAE,OAAO,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,EAAE,CAAC;CACtB;AAED,MAAM,WAAW,cAAc;IAC7B,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;IACvB,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,OAAO,CAAC;CACnB;AAED,MAAM,MAAM,YAAY,CAAC,CAAC,GAAG,OAAO,IAAI,WAAW,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC;AAEnE;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,gBAAgB,EAAE,MAAM,CAAC;IACzB,eAAe,EAAE,WAAW,EAAE,CAAC;CAChC;AAED;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,cAAc,EAAE,MAAM,EAAE,CAAC;CAC1B"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Standard response envelopes for all MCP tool responses.
3
+ * Every tool returns JSON matching one of these shapes.
4
+ */
5
+ export {};
6
+ //# sourceMappingURL=responses.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"responses.js","sourceRoot":"","sources":["../../src/types/responses.ts"],"names":[],"mappings":"AAAA;;;GAGG"}
@@ -0,0 +1,69 @@
1
+ /**
2
+ * WorkItem type definition — shared with the ATOMS frontend.
3
+ * Source of truth: src/app/types.ts in the main app.
4
+ *
5
+ * This is a subset focused on what the MCP server needs.
6
+ */
7
+ export interface WorkItemRelationships {
8
+ parents: string[];
9
+ children: string[];
10
+ related: string[];
11
+ verified_by?: string[];
12
+ verifies?: string[];
13
+ }
14
+ export interface WorkItemOwnership {
15
+ primary: string | null;
16
+ additional: string[];
17
+ }
18
+ export interface WorkItemTags {
19
+ domains: string[];
20
+ level?: string;
21
+ }
22
+ export interface TestRun {
23
+ date: string;
24
+ result: "passed" | "failed" | "blocked" | "not-run";
25
+ by: string;
26
+ note?: string;
27
+ }
28
+ export interface WorkItemLink {
29
+ url: string;
30
+ label: string;
31
+ }
32
+ export interface WorkItemMetadata {
33
+ created_at: string;
34
+ created_by: string;
35
+ updated_at: string;
36
+ updated_by: string;
37
+ source_id?: string;
38
+ imported_at?: string;
39
+ }
40
+ export interface WorkItem {
41
+ id: string;
42
+ type: "requirement" | "test-case" | "note" | "table";
43
+ title: string;
44
+ summary?: string;
45
+ body?: string;
46
+ tags: WorkItemTags;
47
+ ownership: WorkItemOwnership;
48
+ relationships: WorkItemRelationships;
49
+ links: WorkItemLink[];
50
+ status?: "passed" | "failed" | "blocked" | "not-run";
51
+ runs?: TestRun[];
52
+ metadata: WorkItemMetadata;
53
+ }
54
+ /**
55
+ * Database row shape from Supabase items table.
56
+ */
57
+ export interface ItemRow {
58
+ id: string;
59
+ project_id: string;
60
+ type: string;
61
+ title: string;
62
+ data: WorkItem;
63
+ created_by: string | null;
64
+ updated_by: string | null;
65
+ created_at: string;
66
+ updated_at: string;
67
+ deleted_at: string | null;
68
+ }
69
+ //# sourceMappingURL=work-item.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"work-item.d.ts","sourceRoot":"","sources":["../../src/types/work-item.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,MAAM,WAAW,qBAAqB;IACpC,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;IACvB,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;CACrB;AAED,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,UAAU,EAAE,MAAM,EAAE,CAAC;CACtB;AAED,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,OAAO;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,QAAQ,GAAG,QAAQ,GAAG,SAAS,GAAG,SAAS,CAAC;IACpD,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,YAAY;IAC3B,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,gBAAgB;IAC/B,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,QAAQ;IACvB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,aAAa,GAAG,WAAW,GAAG,MAAM,GAAG,OAAO,CAAC;IACrD,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,YAAY,CAAC;IACnB,SAAS,EAAE,iBAAiB,CAAC;IAC7B,aAAa,EAAE,qBAAqB,CAAC;IACrC,KAAK,EAAE,YAAY,EAAE,CAAC;IACtB,MAAM,CAAC,EAAE,QAAQ,GAAG,QAAQ,GAAG,SAAS,GAAG,SAAS,CAAC;IACrD,IAAI,CAAC,EAAE,OAAO,EAAE,CAAC;IACjB,QAAQ,EAAE,gBAAgB,CAAC;CAC5B;AAED;;GAEG;AACH,MAAM,WAAW,OAAO;IACtB,EAAE,EAAE,MAAM,CAAC;IACX,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,QAAQ,CAAC;IACf,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;CAC3B"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * WorkItem type definition — shared with the ATOMS frontend.
3
+ * Source of truth: src/app/types.ts in the main app.
4
+ *
5
+ * This is a subset focused on what the MCP server needs.
6
+ */
7
+ export {};
8
+ //# sourceMappingURL=work-item.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"work-item.js","sourceRoot":"","sources":["../../src/types/work-item.ts"],"names":[],"mappings":"AAAA;;;;;GAKG"}
package/package.json ADDED
@@ -0,0 +1,50 @@
1
+ {
2
+ "name": "@atoms-tech/atoms-mcp",
3
+ "version": "0.1.0",
4
+ "description": "MCP server for ATOMS.tech — AI agent integration for requirements management",
5
+ "type": "module",
6
+ "main": "dist/index.js",
7
+ "bin": {
8
+ "atoms-mcp": "./bin/atoms-mcp.js"
9
+ },
10
+ "scripts": {
11
+ "build": "tsc",
12
+ "dev": "tsx watch src/index.ts",
13
+ "start": "node dist/index.js",
14
+ "test": "vitest run",
15
+ "test:watch": "vitest",
16
+ "lint": "tsc --noEmit",
17
+ "clean": "rm -rf dist"
18
+ },
19
+ "engines": {
20
+ "node": ">=18"
21
+ },
22
+ "dependencies": {
23
+ "@modelcontextprotocol/sdk": "^1.27.0",
24
+ "@supabase/supabase-js": "^2.49.0",
25
+ "open": "^10.0.0",
26
+ "zod": "^3.23.0"
27
+ },
28
+ "devDependencies": {
29
+ "@types/node": "^22.0.0",
30
+ "tsx": "^4.19.0",
31
+ "typescript": "^5.9.0",
32
+ "vitest": "^3.0.0"
33
+ },
34
+ "files": [
35
+ "dist",
36
+ "bin"
37
+ ],
38
+ "keywords": [
39
+ "mcp",
40
+ "atoms",
41
+ "requirements-management",
42
+ "model-context-protocol",
43
+ "ai-agent"
44
+ ],
45
+ "license": "MIT",
46
+ "repository": {
47
+ "type": "git",
48
+ "url": "https://github.com/support-atoms-tech/atoms-mvp-v2"
49
+ }
50
+ }