@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 @@
1
+ {"version":3,"file":"get-coverage.js","sourceRoot":"","sources":["../../src/tools/get-coverage.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,EACL,gBAAgB,EAChB,iBAAiB,EACjB,OAAO,EACP,OAAO,EACP,SAAS,GACV,MAAM,YAAY,CAAC;AAGpB,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAC,MAIxC;IACC,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,SAAS,EAAE,CAAC;QACjC,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,GAAG,MAAM,iBAAiB,CAC3D,MAAM,EACN,MAAM,CAAC,UAAU,EACjB,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,CAC/C,CAAC;QAEF,MAAM,cAAc,GAAkB,SAAS,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;YAC7D,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,MAAM,MAAM,GAAmB;YAC7B,OAAO,EAAE,OAAO,CAAC,MAAM;YACvB,SAAS,EAAE,SAAS,CAAC,MAAM;YAC3B,KAAK;YACL,gBAAgB,EACd,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,MAAM,GAAG,KAAK,CAAC,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,GAAG;YACpE,eAAe,EAAE,cAAc;SAChC,CAAC;QAEF,OAAO,gBAAgB,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC;IAC3C,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,34 @@
1
+ /**
2
+ * atoms_get_history — Audit trail for an item.
3
+ * Shows who changed what, when, and whether it was human or AI.
4
+ */
5
+ import type { HistoryEntry } from "../types/responses.js";
6
+ export declare function getHistoryHandler(params: {
7
+ project_id: string;
8
+ item_id: 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<HistoryEntry[]>;
33
+ }>;
34
+ //# sourceMappingURL=get-history.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-history.d.ts","sourceRoot":"","sources":["../../src/tools/get-history.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAYH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAE1D,wBAAsB,iBAAiB,CAAC,MAAM,EAAE;IAC9C,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;CACf;;;;;;;;;;;;;;;;;;;;;;;GAsDA"}
@@ -0,0 +1,53 @@
1
+ /**
2
+ * atoms_get_history — Audit trail for an item.
3
+ * Shows who changed what, when, and whether it was human or AI.
4
+ */
5
+ import { getClient } from "../db/client.js";
6
+ import { getChangeHistory } from "../db/queries.js";
7
+ import { formatToolResult, formatErrorResult, success, paginationMeta, dbError, authError, } from "./_base.js";
8
+ export async function getHistoryHandler(params) {
9
+ try {
10
+ const client = await getClient();
11
+ const history = await getChangeHistory(client, params.project_id, params.item_id, params.limit);
12
+ const entries = history.map((entry) => {
13
+ // Compute which fields changed by comparing old_data and new_data
14
+ const fieldsChanged = [];
15
+ const oldData = entry.old_data;
16
+ const newData = entry.new_data;
17
+ if (oldData && newData) {
18
+ const allKeys = new Set([
19
+ ...Object.keys(oldData),
20
+ ...Object.keys(newData),
21
+ ]);
22
+ for (const key of allKeys) {
23
+ if (JSON.stringify(oldData[key]) !== JSON.stringify(newData[key])) {
24
+ fieldsChanged.push(key);
25
+ }
26
+ }
27
+ }
28
+ else if (newData) {
29
+ fieldsChanged.push("(created)");
30
+ }
31
+ else if (oldData) {
32
+ fieldsChanged.push("(deleted)");
33
+ }
34
+ return {
35
+ id: entry.id,
36
+ event_type: entry.event_type,
37
+ changed_by: entry.changed_by ?? null,
38
+ changed_at: entry.changed_at,
39
+ actor: entry.actor ?? "user",
40
+ session_id: entry.session_id ?? null,
41
+ fields_changed: fieldsChanged,
42
+ };
43
+ });
44
+ return formatToolResult(success(entries, paginationMeta(entries.length, params.limit, 0)));
45
+ }
46
+ catch (err) {
47
+ if (err instanceof Error && err.message.includes("Not authenticated")) {
48
+ return formatErrorResult(authError());
49
+ }
50
+ return formatErrorResult(dbError(err instanceof Error ? err.message : String(err)));
51
+ }
52
+ }
53
+ //# sourceMappingURL=get-history.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-history.js","sourceRoot":"","sources":["../../src/tools/get-history.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,EACL,gBAAgB,EAChB,iBAAiB,EACjB,OAAO,EACP,cAAc,EACd,OAAO,EACP,SAAS,GACV,MAAM,YAAY,CAAC;AAGpB,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,MAIvC;IACC,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,SAAS,EAAE,CAAC;QACjC,MAAM,OAAO,GAAG,MAAM,gBAAgB,CACpC,MAAM,EACN,MAAM,CAAC,UAAU,EACjB,MAAM,CAAC,OAAO,EACd,MAAM,CAAC,KAAK,CACb,CAAC;QAEF,MAAM,OAAO,GAAmB,OAAO,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE;YACpD,kEAAkE;YAClE,MAAM,aAAa,GAAa,EAAE,CAAC;YACnC,MAAM,OAAO,GAAG,KAAK,CAAC,QAA0C,CAAC;YACjE,MAAM,OAAO,GAAG,KAAK,CAAC,QAA0C,CAAC;YAEjE,IAAI,OAAO,IAAI,OAAO,EAAE,CAAC;gBACvB,MAAM,OAAO,GAAG,IAAI,GAAG,CAAC;oBACtB,GAAG,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC;oBACvB,GAAG,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC;iBACxB,CAAC,CAAC;gBACH,KAAK,MAAM,GAAG,IAAI,OAAO,EAAE,CAAC;oBAC1B,IAAI,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,KAAK,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC;wBAClE,aAAa,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;oBAC1B,CAAC;gBACH,CAAC;YACH,CAAC;iBAAM,IAAI,OAAO,EAAE,CAAC;gBACnB,aAAa,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;YAClC,CAAC;iBAAM,IAAI,OAAO,EAAE,CAAC;gBACnB,aAAa,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;YAClC,CAAC;YAED,OAAO;gBACL,EAAE,EAAE,KAAK,CAAC,EAAY;gBACtB,UAAU,EAAE,KAAK,CAAC,UAAoB;gBACtC,UAAU,EAAG,KAAK,CAAC,UAAqB,IAAI,IAAI;gBAChD,UAAU,EAAE,KAAK,CAAC,UAAoB;gBACtC,KAAK,EAAG,KAAK,CAAC,KAAgB,IAAI,MAAM;gBACxC,UAAU,EAAG,KAAK,CAAC,UAAqB,IAAI,IAAI;gBAChD,cAAc,EAAE,aAAa;aAC9B,CAAC;QACJ,CAAC,CAAC,CAAC;QAEH,OAAO,gBAAgB,CACrB,OAAO,CAAC,OAAO,EAAE,cAAc,CAAC,OAAO,CAAC,MAAM,EAAE,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,CAClE,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,62 @@
1
+ /**
2
+ * atoms_get_item — Get full item details including relationships and test history.
3
+ */
4
+ export declare function getItemHandler(params: {
5
+ project_id: string;
6
+ item_id: string;
7
+ }): Promise<{
8
+ content: {
9
+ type: "text";
10
+ text: string;
11
+ }[];
12
+ structuredContent: {
13
+ data: any[];
14
+ meta: {
15
+ truncated: boolean;
16
+ truncation_message: string;
17
+ total_count?: number | undefined;
18
+ limit?: number | undefined;
19
+ offset?: number | undefined;
20
+ has_more?: boolean | undefined;
21
+ };
22
+ status: "success";
23
+ };
24
+ } | {
25
+ content: {
26
+ type: "text";
27
+ text: string;
28
+ }[];
29
+ structuredContent: import("../types/responses.js").ToolError | import("../types/responses.js").ToolSuccess<{
30
+ metadata: {
31
+ created_at: string;
32
+ created_by: string | null;
33
+ updated_at: string;
34
+ updated_by: string | null;
35
+ source_id: string | undefined;
36
+ };
37
+ latest_result?: string | undefined;
38
+ test_results?: {
39
+ result: string;
40
+ run_by: string | null;
41
+ run_at: string;
42
+ note: string | null;
43
+ }[] | undefined;
44
+ id: string;
45
+ type: string;
46
+ title: string;
47
+ summary: string | undefined;
48
+ body: string | undefined;
49
+ tags: import("../types/work-item.js").WorkItemTags;
50
+ ownership: import("../types/work-item.js").WorkItemOwnership;
51
+ relationships: {
52
+ parents: string[];
53
+ children: string[];
54
+ related: string[];
55
+ verified_by: string[];
56
+ verifies: string[];
57
+ };
58
+ links: import("../types/work-item.js").WorkItemLink[];
59
+ status: "passed" | "failed" | "blocked" | "not-run" | undefined;
60
+ }>;
61
+ }>;
62
+ //# sourceMappingURL=get-item.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-item.d.ts","sourceRoot":"","sources":["../../src/tools/get-item.ts"],"names":[],"mappings":"AAAA;;GAEG;AAaH,wBAAsB,cAAc,CAAC,MAAM,EAAE;IAC3C,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;CACjB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;oBAiDa,MAAM;oBACN,MAAM,GAAG,IAAI;oBACb,MAAM;kBACR,MAAM,GAAG,IAAI;;;;;;;;;;qBAlCJ,MAAM,EAAE;sBACP,MAAM,EAAE;qBACT,MAAM,EAAE;yBACJ,MAAM,EAAE;sBACX,MAAM,EAAE;;;;;GAiF7B"}
@@ -0,0 +1,93 @@
1
+ /**
2
+ * atoms_get_item — Get full item details including relationships and test history.
3
+ */
4
+ import { getClient } from "../db/client.js";
5
+ import { getItemById, getItemRelationships } from "../db/queries.js";
6
+ import { formatToolResult, formatErrorResult, success, notFoundError, dbError, authError, } from "./_base.js";
7
+ export async function getItemHandler(params) {
8
+ try {
9
+ const client = await getClient();
10
+ const item = await getItemById(client, params.project_id, params.item_id);
11
+ if (!item) {
12
+ return formatErrorResult(notFoundError("Item", params.item_id));
13
+ }
14
+ // Enrich with relationship data from shadow table
15
+ const relationships = await getItemRelationships(client, params.project_id, params.item_id);
16
+ // Build structured relationship map
17
+ const relMap = {
18
+ parents: [],
19
+ children: [],
20
+ related: [],
21
+ verified_by: [],
22
+ verifies: [],
23
+ };
24
+ for (const rel of relationships) {
25
+ if (rel.from_id === params.item_id) {
26
+ // Outgoing relationship
27
+ if (rel.type in relMap) {
28
+ relMap[rel.type].push(rel.to_id);
29
+ }
30
+ }
31
+ else {
32
+ // Incoming relationship — invert the type
33
+ const inverse = {
34
+ parent: "children",
35
+ child: "parents",
36
+ verified_by: "verifies",
37
+ verifies: "verified_by",
38
+ related: "related",
39
+ };
40
+ const key = inverse[rel.type] ?? rel.type;
41
+ if (key in relMap) {
42
+ relMap[key].push(rel.from_id);
43
+ }
44
+ }
45
+ }
46
+ // For test cases, fetch test results from shadow table
47
+ let testResults = [];
48
+ if (item.type === "test-case") {
49
+ const { data: results, error: resultsErr } = await client
50
+ .from("test_results")
51
+ .select("result, run_by, run_at, note")
52
+ .eq("item_id", params.item_id)
53
+ .eq("project_id", params.project_id)
54
+ .order("run_at", { ascending: false })
55
+ .limit(20);
56
+ if (!resultsErr && results) {
57
+ testResults = results;
58
+ }
59
+ }
60
+ const data = {
61
+ id: item.id,
62
+ type: item.type,
63
+ title: item.title,
64
+ summary: item.data?.summary,
65
+ body: item.data?.body,
66
+ tags: item.data?.tags ?? { domains: [] },
67
+ ownership: item.data?.ownership ?? { primary: null, additional: [] },
68
+ relationships: relMap,
69
+ links: item.data?.links ?? [],
70
+ status: item.data?.status,
71
+ // Test results from shadow table (for test cases)
72
+ ...(item.type === "test-case" ? {
73
+ latest_result: testResults[0]?.result ?? "not-run",
74
+ test_results: testResults,
75
+ } : {}),
76
+ metadata: {
77
+ created_at: item.created_at,
78
+ created_by: item.created_by,
79
+ updated_at: item.updated_at,
80
+ updated_by: item.updated_by,
81
+ source_id: item.data?.metadata?.source_id,
82
+ },
83
+ };
84
+ return formatToolResult(success(data));
85
+ }
86
+ catch (err) {
87
+ if (err instanceof Error && err.message.includes("Not authenticated")) {
88
+ return formatErrorResult(authError());
89
+ }
90
+ return formatErrorResult(dbError(err instanceof Error ? err.message : String(err)));
91
+ }
92
+ }
93
+ //# sourceMappingURL=get-item.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-item.js","sourceRoot":"","sources":["../../src/tools/get-item.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,41 @@
1
+ /**
2
+ * atoms_link_items — Add or remove relationships between items.
3
+ * Updates both items' JSONB data and the shadow table.
4
+ */
5
+ export declare function linkItemsHandler(params: {
6
+ project_id: string;
7
+ from_id: string;
8
+ to_id: string;
9
+ type: "parent" | "child" | "related" | "verifies" | "verified_by";
10
+ action: "add" | "remove";
11
+ }): Promise<{
12
+ content: {
13
+ type: "text";
14
+ text: string;
15
+ }[];
16
+ structuredContent: {
17
+ data: any[];
18
+ meta: {
19
+ truncated: boolean;
20
+ truncation_message: string;
21
+ total_count?: number | undefined;
22
+ limit?: number | undefined;
23
+ offset?: number | undefined;
24
+ has_more?: boolean | undefined;
25
+ };
26
+ status: "success";
27
+ };
28
+ } | {
29
+ content: {
30
+ type: "text";
31
+ text: string;
32
+ }[];
33
+ structuredContent: import("../types/responses.js").ToolError | import("../types/responses.js").ToolSuccess<{
34
+ action: "add" | "remove";
35
+ type: "verified_by" | "parent" | "child" | "verifies" | "related";
36
+ from_id: string;
37
+ to_id: string;
38
+ message: string;
39
+ }>;
40
+ }>;
41
+ //# sourceMappingURL=link-items.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"link-items.d.ts","sourceRoot":"","sources":["../../src/tools/link-items.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAgBH,wBAAsB,gBAAgB,CAAC,MAAM,EAAE;IAC7C,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,QAAQ,GAAG,OAAO,GAAG,SAAS,GAAG,UAAU,GAAG,aAAa,CAAC;IAClE,MAAM,EAAE,KAAK,GAAG,QAAQ,CAAC;CAC1B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8JA"}
@@ -0,0 +1,150 @@
1
+ /**
2
+ * atoms_link_items — Add or remove relationships between items.
3
+ * Updates both items' JSONB data and the shadow table.
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, validationError, dbError, authError, } from "./_base.js";
9
+ export async function linkItemsHandler(params) {
10
+ try {
11
+ const client = await getClient();
12
+ const userId = getUserId();
13
+ // Validate: no self-referencing
14
+ if (params.from_id === params.to_id) {
15
+ return formatErrorResult(validationError("Cannot create a relationship between an item and itself"));
16
+ }
17
+ // Check write access
18
+ try {
19
+ await requireWriteAccess(client, params.project_id);
20
+ }
21
+ catch (err) {
22
+ if (err instanceof Error && err.message === "VIEWER_ROLE") {
23
+ return formatErrorResult(accessDeniedError("Viewer"));
24
+ }
25
+ throw err;
26
+ }
27
+ // Verify both items exist
28
+ const fromItem = await getItemById(client, params.project_id, params.from_id);
29
+ if (!fromItem) {
30
+ return formatErrorResult(notFoundError("Item", params.from_id));
31
+ }
32
+ const toItem = await getItemById(client, params.project_id, params.to_id);
33
+ if (!toItem) {
34
+ return formatErrorResult(notFoundError("Item", params.to_id));
35
+ }
36
+ if (params.action === "add") {
37
+ // Check if relationship already exists
38
+ const { data: existing } = await client
39
+ .from("item_relationships")
40
+ .select("from_id")
41
+ .eq("from_id", params.from_id)
42
+ .eq("to_id", params.to_id)
43
+ .eq("type", params.type)
44
+ .eq("project_id", params.project_id)
45
+ .maybeSingle();
46
+ if (!existing) {
47
+ const { error: relErr } = await client
48
+ .from("item_relationships")
49
+ .insert({
50
+ from_id: params.from_id,
51
+ to_id: params.to_id,
52
+ type: params.type,
53
+ project_id: params.project_id,
54
+ });
55
+ if (relErr)
56
+ throw new Error(relErr.message);
57
+ }
58
+ // Update JSONB data on the from item
59
+ const fromData = { ...fromItem.data };
60
+ const relKey = params.type === "verified_by" || params.type === "verifies"
61
+ ? params.type
62
+ : params.type + "s" === "parents" ? "parents"
63
+ : params.type === "parent" ? "parents"
64
+ : params.type === "child" ? "children"
65
+ : "related";
66
+ const relField = relKey;
67
+ if (fromData.relationships) {
68
+ const existing = fromData.relationships[relField] ?? [];
69
+ if (!existing.includes(params.to_id)) {
70
+ fromData.relationships[relField] = [
71
+ ...existing,
72
+ params.to_id,
73
+ ];
74
+ }
75
+ }
76
+ await client
77
+ .from("items")
78
+ .update({ data: fromData, updated_by: userId })
79
+ .eq("id", params.from_id)
80
+ .eq("project_id", params.project_id);
81
+ }
82
+ else {
83
+ // Remove from shadow table
84
+ const { error: delErr } = await client
85
+ .from("item_relationships")
86
+ .delete()
87
+ .eq("from_id", params.from_id)
88
+ .eq("to_id", params.to_id)
89
+ .eq("type", params.type)
90
+ .eq("project_id", params.project_id);
91
+ if (delErr)
92
+ throw new Error(delErr.message);
93
+ // Update JSONB data on the from item
94
+ const fromData = { ...fromItem.data };
95
+ const relKey = params.type === "parent" ? "parents"
96
+ : params.type === "child" ? "children"
97
+ : params.type;
98
+ const relField = relKey;
99
+ if (fromData.relationships) {
100
+ const existing = fromData.relationships[relField] ?? [];
101
+ fromData.relationships[relField] =
102
+ existing.filter((id) => id !== params.to_id);
103
+ }
104
+ await client
105
+ .from("items")
106
+ .update({ data: fromData, updated_by: userId })
107
+ .eq("id", params.from_id)
108
+ .eq("project_id", params.project_id);
109
+ }
110
+ // Audit log
111
+ await client
112
+ .from("change_history")
113
+ .insert({
114
+ item_id: params.from_id,
115
+ project_id: params.project_id,
116
+ changed_by: userId,
117
+ event_type: "updated",
118
+ old_data: null,
119
+ new_data: {
120
+ relationship_change: {
121
+ action: params.action,
122
+ type: params.type,
123
+ from: params.from_id,
124
+ to: params.to_id,
125
+ },
126
+ },
127
+ actor: "mcp_claude",
128
+ session_id: getMcpSessionId(),
129
+ })
130
+ .then(({ error }) => {
131
+ if (error) {
132
+ process.stderr.write(`[atoms-mcp] Warning: change_history log failed: ${error.message}\n`);
133
+ }
134
+ });
135
+ return formatToolResult(success({
136
+ action: params.action,
137
+ type: params.type,
138
+ from_id: params.from_id,
139
+ to_id: params.to_id,
140
+ message: `Relationship ${params.action === "add" ? "added" : "removed"}: ${params.from_id} --[${params.type}]--> ${params.to_id}`,
141
+ }));
142
+ }
143
+ catch (err) {
144
+ if (err instanceof Error && err.message.includes("Not authenticated")) {
145
+ return formatErrorResult(authError());
146
+ }
147
+ return formatErrorResult(dbError(err instanceof Error ? err.message : String(err)));
148
+ }
149
+ }
150
+ //# sourceMappingURL=link-items.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"link-items.js","sourceRoot":"","sources":["../../src/tools/link-items.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,37 @@
1
+ /**
2
+ * atoms_list_items — List items in a project with optional filters.
3
+ * ENTRY POINT tool for discovering project contents.
4
+ */
5
+ import type { ItemSummary } from "../types/responses.js";
6
+ export declare function listItemsHandler(params: {
7
+ project_id: string;
8
+ type?: string;
9
+ domain?: string;
10
+ level?: string;
11
+ limit: number;
12
+ offset: number;
13
+ }): Promise<{
14
+ content: {
15
+ type: "text";
16
+ text: string;
17
+ }[];
18
+ structuredContent: {
19
+ data: any[];
20
+ meta: {
21
+ truncated: boolean;
22
+ truncation_message: string;
23
+ total_count?: number | undefined;
24
+ limit?: number | undefined;
25
+ offset?: number | undefined;
26
+ has_more?: boolean | undefined;
27
+ };
28
+ status: "success";
29
+ };
30
+ } | {
31
+ content: {
32
+ type: "text";
33
+ text: string;
34
+ }[];
35
+ structuredContent: import("../types/responses.js").ToolError | import("../types/responses.js").ToolSuccess<ItemSummary[]>;
36
+ }>;
37
+ //# sourceMappingURL=list-items.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list-items.d.ts","sourceRoot":"","sources":["../../src/tools/list-items.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAYH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAEzD,wBAAsB,gBAAgB,CAAC,MAAM,EAAE;IAC7C,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;CAChB;;;;;;;;;;;;;;;;;;;;;;;GAgCA"}
@@ -0,0 +1,36 @@
1
+ /**
2
+ * atoms_list_items — List items in a project with optional filters.
3
+ * ENTRY POINT tool for discovering project contents.
4
+ */
5
+ import { getClient } from "../db/client.js";
6
+ import { listItems } from "../db/queries.js";
7
+ import { formatToolResult, formatErrorResult, success, paginationMeta, dbError, authError, } from "./_base.js";
8
+ export async function listItemsHandler(params) {
9
+ try {
10
+ const client = await getClient();
11
+ const { items, totalCount } = await listItems(client, params.project_id, {
12
+ type: params.type,
13
+ domain: params.domain,
14
+ level: params.level,
15
+ limit: params.limit,
16
+ offset: params.offset,
17
+ });
18
+ // Map to @basic fields
19
+ const data = items.map((item) => ({
20
+ id: item.id,
21
+ title: item.title,
22
+ type: item.type,
23
+ status: item.data?.status,
24
+ domains: item.data?.tags?.domains ?? [],
25
+ level: item.data?.tags?.level,
26
+ }));
27
+ return formatToolResult(success(data, paginationMeta(totalCount, params.limit, params.offset)));
28
+ }
29
+ catch (err) {
30
+ if (err instanceof Error && err.message.includes("Not authenticated")) {
31
+ return formatErrorResult(authError());
32
+ }
33
+ return formatErrorResult(dbError(err instanceof Error ? err.message : String(err)));
34
+ }
35
+ }
36
+ //# sourceMappingURL=list-items.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list-items.js","sourceRoot":"","sources":["../../src/tools/list-items.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC7C,OAAO,EACL,gBAAgB,EAChB,iBAAiB,EACjB,OAAO,EACP,cAAc,EACd,OAAO,EACP,SAAS,GACV,MAAM,YAAY,CAAC;AAGpB,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,MAOtC;IACC,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,SAAS,EAAE,CAAC;QACjC,MAAM,EAAE,KAAK,EAAE,UAAU,EAAE,GAAG,MAAM,SAAS,CAAC,MAAM,EAAE,MAAM,CAAC,UAAU,EAAE;YACvE,IAAI,EAAE,MAAM,CAAC,IAAI;YACjB,MAAM,EAAE,MAAM,CAAC,MAAM;YACrB,KAAK,EAAE,MAAM,CAAC,KAAK;YACnB,KAAK,EAAE,MAAM,CAAC,KAAK;YACnB,MAAM,EAAE,MAAM,CAAC,MAAM;SACtB,CAAC,CAAC;QAEH,uBAAuB;QACvB,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,MAAM,CAAC,MAAM,CAAC,CAAC,CACvE,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,38 @@
1
+ /**
2
+ * atoms_list_projects — Discover accessible projects.
3
+ *
4
+ * ENTRY POINT tool. Must be called first to get project_id for all other tools.
5
+ * RLS ensures only projects the user has org membership for are returned.
6
+ */
7
+ export declare function listProjectsHandler(): Promise<{
8
+ content: {
9
+ type: "text";
10
+ text: string;
11
+ }[];
12
+ structuredContent: {
13
+ data: any[];
14
+ meta: {
15
+ truncated: boolean;
16
+ truncation_message: string;
17
+ total_count?: number | undefined;
18
+ limit?: number | undefined;
19
+ offset?: number | undefined;
20
+ has_more?: boolean | undefined;
21
+ };
22
+ status: "success";
23
+ };
24
+ } | {
25
+ content: {
26
+ type: "text";
27
+ text: string;
28
+ }[];
29
+ structuredContent: import("../types/responses.js").ToolError | import("../types/responses.js").ToolSuccess<{
30
+ id: string;
31
+ name: string;
32
+ description: string | null;
33
+ org_id: string;
34
+ org_name: string;
35
+ created_at: string;
36
+ }[]>;
37
+ }>;
38
+ //# sourceMappingURL=list-projects.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list-projects.d.ts","sourceRoot":"","sources":["../../src/tools/list-projects.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAMH,wBAAsB,mBAAmB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAoBxC"}
@@ -0,0 +1,28 @@
1
+ /**
2
+ * atoms_list_projects — Discover accessible projects.
3
+ *
4
+ * ENTRY POINT tool. Must be called first to get project_id for all other tools.
5
+ * RLS ensures only projects the user has org membership for are returned.
6
+ */
7
+ import { getClient } from "../db/client.js";
8
+ import { listProjects } from "../db/queries.js";
9
+ import { success, formatToolResult, formatErrorResult, dbError } from "./_base.js";
10
+ export async function listProjectsHandler() {
11
+ try {
12
+ const client = await getClient();
13
+ const projects = await listProjects(client);
14
+ const data = projects.map((p) => ({
15
+ id: p.id,
16
+ name: p.name,
17
+ description: p.description,
18
+ org_id: p.org_id,
19
+ org_name: p.org_name,
20
+ created_at: p.created_at,
21
+ }));
22
+ return formatToolResult(success(data));
23
+ }
24
+ catch (err) {
25
+ return formatErrorResult(dbError(err instanceof Error ? err.message : "Unknown error"));
26
+ }
27
+ }
28
+ //# sourceMappingURL=list-projects.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list-projects.js","sourceRoot":"","sources":["../../src/tools/list-projects.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAChD,OAAO,EAAE,OAAO,EAAE,gBAAgB,EAAE,iBAAiB,EAAa,OAAO,EAAE,MAAM,YAAY,CAAC;AAE9F,MAAM,CAAC,KAAK,UAAU,mBAAmB;IACvC,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,SAAS,EAAE,CAAC;QACjC,MAAM,QAAQ,GAAG,MAAM,YAAY,CAAC,MAAM,CAAC,CAAC;QAE5C,MAAM,IAAI,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YAChC,EAAE,EAAE,CAAC,CAAC,EAAE;YACR,IAAI,EAAE,CAAC,CAAC,IAAI;YACZ,WAAW,EAAE,CAAC,CAAC,WAAW;YAC1B,MAAM,EAAE,CAAC,CAAC,MAAM;YAChB,QAAQ,EAAE,CAAC,CAAC,QAAQ;YACpB,UAAU,EAAE,CAAC,CAAC,UAAU;SACzB,CAAC,CAAC,CAAC;QAEJ,OAAO,gBAAgB,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;IACzC,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,iBAAiB,CACtB,OAAO,CAAC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,CAAC,CAC9D,CAAC;IACJ,CAAC;AACH,CAAC"}