@tekmidian/devon 3.0.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 (132) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +472 -0
  3. package/dist/index.d.ts +12 -0
  4. package/dist/index.js +82 -0
  5. package/dist/index.js.map +1 -0
  6. package/dist/jxa/escape.d.ts +22 -0
  7. package/dist/jxa/escape.js +38 -0
  8. package/dist/jxa/escape.js.map +1 -0
  9. package/dist/jxa/executor.d.ts +32 -0
  10. package/dist/jxa/executor.js +65 -0
  11. package/dist/jxa/executor.js.map +1 -0
  12. package/dist/jxa/helpers.d.ts +51 -0
  13. package/dist/jxa/helpers.js +136 -0
  14. package/dist/jxa/helpers.js.map +1 -0
  15. package/dist/jxa/types.d.ts +33 -0
  16. package/dist/jxa/types.js +43 -0
  17. package/dist/jxa/types.js.map +1 -0
  18. package/dist/server.d.ts +10 -0
  19. package/dist/server.js +65 -0
  20. package/dist/server.js.map +1 -0
  21. package/dist/setup.d.ts +12 -0
  22. package/dist/setup.js +323 -0
  23. package/dist/setup.js.map +1 -0
  24. package/dist/shared/plist/parser.d.ts +29 -0
  25. package/dist/shared/plist/parser.js +112 -0
  26. package/dist/shared/plist/parser.js.map +1 -0
  27. package/dist/shared/plist/reader.d.ts +31 -0
  28. package/dist/shared/plist/reader.js +127 -0
  29. package/dist/shared/plist/reader.js.map +1 -0
  30. package/dist/shared/shell.d.ts +15 -0
  31. package/dist/shared/shell.js +22 -0
  32. package/dist/shared/shell.js.map +1 -0
  33. package/dist/tools/ai/ask-ai-about-documents.d.ts +8 -0
  34. package/dist/tools/ai/ask-ai-about-documents.js +88 -0
  35. package/dist/tools/ai/ask-ai-about-documents.js.map +1 -0
  36. package/dist/tools/ai/check-ai-health.d.ts +8 -0
  37. package/dist/tools/ai/check-ai-health.js +40 -0
  38. package/dist/tools/ai/check-ai-health.js.map +1 -0
  39. package/dist/tools/ai/create-summary-document.d.ts +8 -0
  40. package/dist/tools/ai/create-summary-document.js +102 -0
  41. package/dist/tools/ai/create-summary-document.js.map +1 -0
  42. package/dist/tools/ai/get-ai-tool-documentation.d.ts +8 -0
  43. package/dist/tools/ai/get-ai-tool-documentation.js +220 -0
  44. package/dist/tools/ai/get-ai-tool-documentation.js.map +1 -0
  45. package/dist/tools/application/is-running.d.ts +7 -0
  46. package/dist/tools/application/is-running.js +24 -0
  47. package/dist/tools/application/is-running.js.map +1 -0
  48. package/dist/tools/custom/column-layout.d.ts +9 -0
  49. package/dist/tools/custom/column-layout.js +244 -0
  50. package/dist/tools/custom/column-layout.js.map +1 -0
  51. package/dist/tools/custom/list-smart-groups.d.ts +8 -0
  52. package/dist/tools/custom/list-smart-groups.js +79 -0
  53. package/dist/tools/custom/list-smart-groups.js.map +1 -0
  54. package/dist/tools/custom/list-smart-rules.d.ts +8 -0
  55. package/dist/tools/custom/list-smart-rules.js +85 -0
  56. package/dist/tools/custom/list-smart-rules.js.map +1 -0
  57. package/dist/tools/custom/parse-eml-headers.d.ts +8 -0
  58. package/dist/tools/custom/parse-eml-headers.js +155 -0
  59. package/dist/tools/custom/parse-eml-headers.js.map +1 -0
  60. package/dist/tools/database/get-current-database.d.ts +7 -0
  61. package/dist/tools/database/get-current-database.js +29 -0
  62. package/dist/tools/database/get-current-database.js.map +1 -0
  63. package/dist/tools/database/get-open-databases.d.ts +6 -0
  64. package/dist/tools/database/get-open-databases.js +32 -0
  65. package/dist/tools/database/get-open-databases.js.map +1 -0
  66. package/dist/tools/groups/get-selected-records.d.ts +8 -0
  67. package/dist/tools/groups/get-selected-records.js +30 -0
  68. package/dist/tools/groups/get-selected-records.js.map +1 -0
  69. package/dist/tools/groups/list-group-content.d.ts +8 -0
  70. package/dist/tools/groups/list-group-content.js +65 -0
  71. package/dist/tools/groups/list-group-content.js.map +1 -0
  72. package/dist/tools/index.d.ts +9 -0
  73. package/dist/tools/index.js +87 -0
  74. package/dist/tools/index.js.map +1 -0
  75. package/dist/tools/intelligence/classify.d.ts +8 -0
  76. package/dist/tools/intelligence/classify.js +83 -0
  77. package/dist/tools/intelligence/classify.js.map +1 -0
  78. package/dist/tools/intelligence/compare.d.ts +8 -0
  79. package/dist/tools/intelligence/compare.js +121 -0
  80. package/dist/tools/intelligence/compare.js.map +1 -0
  81. package/dist/tools/records/convert-record.d.ts +10 -0
  82. package/dist/tools/records/convert-record.js +77 -0
  83. package/dist/tools/records/convert-record.js.map +1 -0
  84. package/dist/tools/records/create-record.d.ts +8 -0
  85. package/dist/tools/records/create-record.js +64 -0
  86. package/dist/tools/records/create-record.js.map +1 -0
  87. package/dist/tools/records/delete-record.d.ts +9 -0
  88. package/dist/tools/records/delete-record.js +50 -0
  89. package/dist/tools/records/delete-record.js.map +1 -0
  90. package/dist/tools/records/duplicate-record.d.ts +8 -0
  91. package/dist/tools/records/duplicate-record.js +53 -0
  92. package/dist/tools/records/duplicate-record.js.map +1 -0
  93. package/dist/tools/records/get-record-by-id.d.ts +8 -0
  94. package/dist/tools/records/get-record-by-id.js +51 -0
  95. package/dist/tools/records/get-record-by-id.js.map +1 -0
  96. package/dist/tools/records/get-record-content.d.ts +7 -0
  97. package/dist/tools/records/get-record-content.js +48 -0
  98. package/dist/tools/records/get-record-content.js.map +1 -0
  99. package/dist/tools/records/get-record-properties.d.ts +7 -0
  100. package/dist/tools/records/get-record-properties.js +42 -0
  101. package/dist/tools/records/get-record-properties.js.map +1 -0
  102. package/dist/tools/records/move-record.d.ts +8 -0
  103. package/dist/tools/records/move-record.js +60 -0
  104. package/dist/tools/records/move-record.js.map +1 -0
  105. package/dist/tools/records/rename-record.d.ts +7 -0
  106. package/dist/tools/records/rename-record.js +40 -0
  107. package/dist/tools/records/rename-record.js.map +1 -0
  108. package/dist/tools/records/replicate-record.d.ts +8 -0
  109. package/dist/tools/records/replicate-record.js +53 -0
  110. package/dist/tools/records/replicate-record.js.map +1 -0
  111. package/dist/tools/records/set-record-properties.d.ts +10 -0
  112. package/dist/tools/records/set-record-properties.js +76 -0
  113. package/dist/tools/records/set-record-properties.js.map +1 -0
  114. package/dist/tools/records/update-record-content.d.ts +7 -0
  115. package/dist/tools/records/update-record-content.js +43 -0
  116. package/dist/tools/records/update-record-content.js.map +1 -0
  117. package/dist/tools/search/lookup-record.d.ts +7 -0
  118. package/dist/tools/search/lookup-record.js +160 -0
  119. package/dist/tools/search/lookup-record.js.map +1 -0
  120. package/dist/tools/search/search.d.ts +8 -0
  121. package/dist/tools/search/search.js +146 -0
  122. package/dist/tools/search/search.js.map +1 -0
  123. package/dist/tools/tags/add-tags.d.ts +7 -0
  124. package/dist/tools/tags/add-tags.js +47 -0
  125. package/dist/tools/tags/add-tags.js.map +1 -0
  126. package/dist/tools/tags/remove-tags.d.ts +7 -0
  127. package/dist/tools/tags/remove-tags.js +53 -0
  128. package/dist/tools/tags/remove-tags.js.map +1 -0
  129. package/dist/tools/web/create-from-url.d.ts +8 -0
  130. package/dist/tools/web/create-from-url.js +140 -0
  131. package/dist/tools/web/create-from-url.js.map +1 -0
  132. package/package.json +48 -0
@@ -0,0 +1,29 @@
1
+ /**
2
+ * get-current-database.ts — Get information about the currently selected database.
3
+ *
4
+ * Returns name, uuid, path, and record count for whichever database is currently
5
+ * active in the DEVONthink UI.
6
+ */
7
+ import { z } from "zod";
8
+ import { defineTool } from "../../jxa/types.js";
9
+ import { JXA_APP } from "../../jxa/helpers.js";
10
+ export const currentDatabaseTool = defineTool({
11
+ name: "current_database",
12
+ description: "Get information about the currently selected database in DEVONthink.",
13
+ schema: z.object({}),
14
+ run: async (_args, executor) => {
15
+ const script = `
16
+ ${JXA_APP}
17
+ var db = app.currentDatabase();
18
+ if (!db || !db.uuid()) throw new Error("No current database found");
19
+ JSON.stringify({
20
+ uuid: db.uuid(),
21
+ name: db.name(),
22
+ path: db.path()
23
+ });
24
+ `.trim();
25
+ const { stdout } = executor.run(script);
26
+ return JSON.parse(stdout);
27
+ },
28
+ });
29
+ //# sourceMappingURL=get-current-database.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-current-database.js","sourceRoot":"","sources":["../../../src/tools/database/get-current-database.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAChD,OAAO,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAC;AAE/C,MAAM,CAAC,MAAM,mBAAmB,GAAG,UAAU,CAAC;IAC5C,IAAI,EAAE,kBAAkB;IACxB,WAAW,EACT,sEAAsE;IACxE,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC;IACpB,GAAG,EAAE,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE;QAC7B,MAAM,MAAM,GAAG;EACjB,OAAO;;;;;;;;CAQR,CAAC,IAAI,EAAE,CAAC;QAEL,MAAM,EAAE,MAAM,EAAE,GAAG,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QACxC,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,CAIvB,CAAC;IACJ,CAAC;CACF,CAAC,CAAC"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * get-open-databases.ts — List all currently open databases in DEVONthink.
3
+ *
4
+ * Returns uuid, name, path, and record count for each open database.
5
+ */
6
+ export declare const getOpenDatabasesTool: import("../../jxa/types.js").McpTool;
@@ -0,0 +1,32 @@
1
+ /**
2
+ * get-open-databases.ts — List all currently open databases in DEVONthink.
3
+ *
4
+ * Returns uuid, name, path, and record count for each open database.
5
+ */
6
+ import { z } from "zod";
7
+ import { defineTool } from "../../jxa/types.js";
8
+ import { JXA_APP } from "../../jxa/helpers.js";
9
+ export const getOpenDatabasesTool = defineTool({
10
+ name: "get_open_databases",
11
+ description: "Get a list of all currently open databases in DEVONthink.",
12
+ schema: z.object({}),
13
+ run: async (_args, executor) => {
14
+ const script = `
15
+ ${JXA_APP}
16
+ var dbs = app.databases();
17
+ var result = [];
18
+ for (var i = 0; i < dbs.length; i++) {
19
+ var db = dbs[i];
20
+ result.push({
21
+ uuid: db.uuid(),
22
+ name: db.name(),
23
+ path: db.path()
24
+ });
25
+ }
26
+ JSON.stringify(result);
27
+ `.trim();
28
+ const { stdout } = executor.run(script);
29
+ return JSON.parse(stdout);
30
+ },
31
+ });
32
+ //# sourceMappingURL=get-open-databases.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-open-databases.js","sourceRoot":"","sources":["../../../src/tools/database/get-open-databases.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAChD,OAAO,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAC;AAE/C,MAAM,CAAC,MAAM,oBAAoB,GAAG,UAAU,CAAC;IAC7C,IAAI,EAAE,oBAAoB;IAC1B,WAAW,EAAE,2DAA2D;IACxE,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC;IACpB,GAAG,EAAE,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE;QAC7B,MAAM,MAAM,GAAG;EACjB,OAAO;;;;;;;;;;;;CAYR,CAAC,IAAI,EAAE,CAAC;QAEL,MAAM,EAAE,MAAM,EAAE,GAAG,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QACxC,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,CAItB,CAAC;IACL,CAAC;CACF,CAAC,CAAC"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * get-selected-records.ts — Get information about currently selected records.
3
+ *
4
+ * Returns summary properties for each record currently selected in the
5
+ * DEVONthink UI. Uses JXA_RECORD_SUMMARY for a lightweight property set
6
+ * suitable for lists.
7
+ */
8
+ export declare const selectedRecordsTool: import("../../jxa/types.js").McpTool;
@@ -0,0 +1,30 @@
1
+ /**
2
+ * get-selected-records.ts — Get information about currently selected records.
3
+ *
4
+ * Returns summary properties for each record currently selected in the
5
+ * DEVONthink UI. Uses JXA_RECORD_SUMMARY for a lightweight property set
6
+ * suitable for lists.
7
+ */
8
+ import { z } from "zod";
9
+ import { defineTool } from "../../jxa/types.js";
10
+ import { JXA_APP, JXA_RECORD_SUMMARY } from "../../jxa/helpers.js";
11
+ export const selectedRecordsTool = defineTool({
12
+ name: "selected_records",
13
+ description: "Get information about currently selected records in DEVONthink.",
14
+ schema: z.object({}),
15
+ run: async (_args, executor) => {
16
+ const script = `
17
+ ${JXA_APP}
18
+ var records = app.selectedRecords();
19
+ var result = [];
20
+ for (var i = 0; i < records.length; i++) {
21
+ var record = records[i];
22
+ result.push(${JXA_RECORD_SUMMARY});
23
+ }
24
+ JSON.stringify(result);
25
+ `.trim();
26
+ const { stdout } = executor.run(script);
27
+ return JSON.parse(stdout);
28
+ },
29
+ });
30
+ //# sourceMappingURL=get-selected-records.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-selected-records.js","sourceRoot":"","sources":["../../../src/tools/groups/get-selected-records.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAChD,OAAO,EAAE,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAEnE,MAAM,CAAC,MAAM,mBAAmB,GAAG,UAAU,CAAC;IAC5C,IAAI,EAAE,kBAAkB;IACxB,WAAW,EACT,iEAAiE;IACnE,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC;IACpB,GAAG,EAAE,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE;QAC7B,MAAM,MAAM,GAAG;EACjB,OAAO;;;;;gBAKO,kBAAkB;;;CAGjC,CAAC,IAAI,EAAE,CAAC;QAEL,MAAM,EAAE,MAAM,EAAE,GAAG,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QACxC,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,CAWtB,CAAC;IACL,CAAC;CACF,CAAC,CAAC"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * list-group-content.ts — List the direct children of a DEVONthink group.
3
+ *
4
+ * If a UUID is supplied, that group is fetched directly. Otherwise the root
5
+ * of the current (or named) database is used. Returns an array of record
6
+ * summaries using the lightweight JXA_RECORD_SUMMARY property set.
7
+ */
8
+ export declare const listGroupContentTool: import("../../jxa/types.js").McpTool;
@@ -0,0 +1,65 @@
1
+ /**
2
+ * list-group-content.ts — List the direct children of a DEVONthink group.
3
+ *
4
+ * If a UUID is supplied, that group is fetched directly. Otherwise the root
5
+ * of the current (or named) database is used. Returns an array of record
6
+ * summaries using the lightweight JXA_RECORD_SUMMARY property set.
7
+ */
8
+ import { z } from "zod";
9
+ import { defineTool } from "../../jxa/types.js";
10
+ import { jxaLiteral } from "../../jxa/escape.js";
11
+ import { JXA_APP, JXA_RESOLVE_DB, JXA_RECORD_SUMMARY, } from "../../jxa/helpers.js";
12
+ export const listGroupContentTool = defineTool({
13
+ name: "list_group_content",
14
+ description: "Lists the content of a specific group in DEVONthink. " +
15
+ "Supply a group UUID to list any group directly, or omit uuid to list " +
16
+ "the root of the current (or named) database.",
17
+ schema: z.object({
18
+ uuid: z
19
+ .string()
20
+ .optional()
21
+ .describe("UUID of the group to list. If omitted, the database root is listed"),
22
+ databaseName: z
23
+ .string()
24
+ .optional()
25
+ .describe("Name of the database to use when resolving the root group. " +
26
+ "If omitted, the current database is used. Ignored when uuid is provided"),
27
+ }),
28
+ run: async (args, executor) => {
29
+ const { uuid, databaseName } = args;
30
+ const script = `
31
+ ${JXA_APP}
32
+ var uuid = ${jxaLiteral(uuid ?? null)};
33
+ var dbName = ${jxaLiteral(databaseName ?? null)};
34
+
35
+ var group;
36
+ if (uuid) {
37
+ // Fetch the group directly by UUID
38
+ group = app.getRecordWithUuid(uuid);
39
+ if (!group || !group.uuid()) {
40
+ throw new Error("Group not found for UUID: " + uuid);
41
+ }
42
+ } else {
43
+ // Fall back to the database root
44
+ ${JXA_RESOLVE_DB}
45
+ group = db.root();
46
+ if (!group || !group.uuid()) {
47
+ throw new Error("Could not retrieve database root");
48
+ }
49
+ }
50
+
51
+ // List the direct children
52
+ var children = group.children();
53
+ var result = [];
54
+ for (var i = 0; i < children.length; i++) {
55
+ var record = children[i];
56
+ result.push(${JXA_RECORD_SUMMARY});
57
+ }
58
+
59
+ JSON.stringify(result);
60
+ `;
61
+ const result = executor.run(script);
62
+ return JSON.parse(result.stdout);
63
+ },
64
+ });
65
+ //# sourceMappingURL=list-group-content.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list-group-content.js","sourceRoot":"","sources":["../../../src/tools/groups/list-group-content.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAChD,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AACjD,OAAO,EACL,OAAO,EACP,cAAc,EACd,kBAAkB,GACnB,MAAM,sBAAsB,CAAC;AAE9B,MAAM,CAAC,MAAM,oBAAoB,GAAG,UAAU,CAAC;IAC7C,IAAI,EAAE,oBAAoB;IAC1B,WAAW,EACT,uDAAuD;QACvD,uEAAuE;QACvE,8CAA8C;IAChD,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC;QACf,IAAI,EAAE,CAAC;aACJ,MAAM,EAAE;aACR,QAAQ,EAAE;aACV,QAAQ,CACP,oEAAoE,CACrE;QACH,YAAY,EAAE,CAAC;aACZ,MAAM,EAAE;aACR,QAAQ,EAAE;aACV,QAAQ,CACP,6DAA6D;YAC7D,yEAAyE,CAC1E;KACJ,CAAC;IACF,GAAG,EAAE,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE;QAC5B,MAAM,EAAE,IAAI,EAAE,YAAY,EAAE,GAAG,IAAI,CAAC;QAEpC,MAAM,MAAM,GAAG;QACX,OAAO;mBACI,UAAU,CAAC,IAAI,IAAI,IAAI,CAAC;qBACtB,UAAU,CAAC,YAAY,IAAI,IAAI,CAAC;;;;;;;;;;;UAW3C,cAAc;;;;;;;;;;;;sBAYF,kBAAkB;;;;KAInC,CAAC;QAEF,MAAM,MAAM,GAAG,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QACpC,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAW7B,CAAC;IACL,CAAC;CACF,CAAC,CAAC"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * tools/index.ts — Barrel export of all 33 MCP tools.
3
+ *
4
+ * Collects all tools into a single allTools array for registration
5
+ * with the MCP server.
6
+ */
7
+ import type { McpTool } from "../jxa/types.js";
8
+ /** All 33 tools in registration order */
9
+ export declare const allTools: McpTool[];
@@ -0,0 +1,87 @@
1
+ /**
2
+ * tools/index.ts — Barrel export of all 33 MCP tools.
3
+ *
4
+ * Collects all tools into a single allTools array for registration
5
+ * with the MCP server.
6
+ */
7
+ // Application
8
+ import { isRunningTool } from "./application/is-running.js";
9
+ // Database
10
+ import { getOpenDatabasesTool } from "./database/get-open-databases.js";
11
+ import { currentDatabaseTool } from "./database/get-current-database.js";
12
+ // Records
13
+ import { getRecordByIdTool } from "./records/get-record-by-id.js";
14
+ import { getRecordPropertiesTool } from "./records/get-record-properties.js";
15
+ import { getRecordContentTool } from "./records/get-record-content.js";
16
+ import { createRecordTool } from "./records/create-record.js";
17
+ import { deleteRecordTool } from "./records/delete-record.js";
18
+ import { updateRecordContentTool } from "./records/update-record-content.js";
19
+ import { setRecordPropertiesTool } from "./records/set-record-properties.js";
20
+ import { renameRecordTool } from "./records/rename-record.js";
21
+ import { moveRecordTool } from "./records/move-record.js";
22
+ import { replicateRecordTool } from "./records/replicate-record.js";
23
+ import { duplicateRecordTool } from "./records/duplicate-record.js";
24
+ import { convertRecordTool } from "./records/convert-record.js";
25
+ // Groups
26
+ import { listGroupContentTool } from "./groups/list-group-content.js";
27
+ import { selectedRecordsTool } from "./groups/get-selected-records.js";
28
+ // Search
29
+ import { searchTool } from "./search/search.js";
30
+ import { lookupRecordTool } from "./search/lookup-record.js";
31
+ // Tags
32
+ import { addTagsTool } from "./tags/add-tags.js";
33
+ import { removeTagsTool } from "./tags/remove-tags.js";
34
+ // Web
35
+ import { createFromUrlTool } from "./web/create-from-url.js";
36
+ // Intelligence
37
+ import { classifyTool } from "./intelligence/classify.js";
38
+ import { compareTool } from "./intelligence/compare.js";
39
+ // AI
40
+ import { askAiAboutDocumentsTool } from "./ai/ask-ai-about-documents.js";
41
+ import { checkAiHealthTool } from "./ai/check-ai-health.js";
42
+ import { createSummaryDocumentTool } from "./ai/create-summary-document.js";
43
+ import { getAiToolDocumentationTool } from "./ai/get-ai-tool-documentation.js";
44
+ // Custom (our extensions, not from upstream)
45
+ import { listSmartGroupsTool } from "./custom/list-smart-groups.js";
46
+ import { listSmartRulesTool } from "./custom/list-smart-rules.js";
47
+ import { parseEmlHeadersTool } from "./custom/parse-eml-headers.js";
48
+ import { getColumnLayoutTool, copyColumnLayoutTool } from "./custom/column-layout.js";
49
+ /** All 33 tools in registration order */
50
+ export const allTools = [
51
+ // Core (28 tools matching upstream API surface)
52
+ isRunningTool,
53
+ createRecordTool,
54
+ deleteRecordTool,
55
+ moveRecordTool,
56
+ getRecordPropertiesTool,
57
+ getRecordByIdTool,
58
+ searchTool,
59
+ lookupRecordTool,
60
+ createFromUrlTool,
61
+ getOpenDatabasesTool,
62
+ currentDatabaseTool,
63
+ selectedRecordsTool,
64
+ listGroupContentTool,
65
+ getRecordContentTool,
66
+ renameRecordTool,
67
+ addTagsTool,
68
+ removeTagsTool,
69
+ classifyTool,
70
+ compareTool,
71
+ replicateRecordTool,
72
+ duplicateRecordTool,
73
+ convertRecordTool,
74
+ updateRecordContentTool,
75
+ setRecordPropertiesTool,
76
+ askAiAboutDocumentsTool,
77
+ checkAiHealthTool,
78
+ createSummaryDocumentTool,
79
+ getAiToolDocumentationTool,
80
+ // Custom extensions (5 tools)
81
+ listSmartGroupsTool,
82
+ listSmartRulesTool,
83
+ parseEmlHeadersTool,
84
+ getColumnLayoutTool,
85
+ copyColumnLayoutTool,
86
+ ];
87
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * classify.ts — Get DEVONthink's classification proposals for a record.
3
+ *
4
+ * Returns an array of suggested destination groups with their scores,
5
+ * ordered by relevance. DEVONthink's classifier uses content analysis
6
+ * and/or tag comparison depending on the comparison option.
7
+ */
8
+ export declare const classifyTool: import("../../jxa/types.js").McpTool;
@@ -0,0 +1,83 @@
1
+ /**
2
+ * classify.ts — Get DEVONthink's classification proposals for a record.
3
+ *
4
+ * Returns an array of suggested destination groups with their scores,
5
+ * ordered by relevance. DEVONthink's classifier uses content analysis
6
+ * and/or tag comparison depending on the comparison option.
7
+ */
8
+ import { z } from "zod";
9
+ import { defineTool } from "../../jxa/types.js";
10
+ import { jxaLiteral } from "../../jxa/escape.js";
11
+ import { JXA_APP } from "../../jxa/helpers.js";
12
+ const COMPARISON_VALUES = ["data comparison", "tags comparison"];
13
+ export const classifyTool = defineTool({
14
+ name: "classify",
15
+ description: "Get classification proposals for a DEVONthink record.",
16
+ schema: z.object({
17
+ recordUuid: z.string().describe("UUID of the record to classify"),
18
+ databaseName: z
19
+ .string()
20
+ .optional()
21
+ .describe("Database name (optional, for disambiguation)"),
22
+ comparison: z
23
+ .enum(COMPARISON_VALUES)
24
+ .optional()
25
+ .describe("Comparison mode: 'data comparison' (content-based) or 'tags comparison'"),
26
+ tags: z
27
+ .boolean()
28
+ .optional()
29
+ .describe("Include tag-based proposals in the results"),
30
+ }),
31
+ run: async (args, executor) => {
32
+ const { recordUuid, databaseName, comparison, tags } = args;
33
+ const script = `
34
+ ${JXA_APP}
35
+ var uuid = ${jxaLiteral(recordUuid)};
36
+ var dbName = ${jxaLiteral(databaseName ?? null)};
37
+ var comparison = ${jxaLiteral(comparison ?? null)};
38
+ var includeTags = ${jxaLiteral(tags ?? false)};
39
+
40
+ var record = app.getRecordWithUuid(uuid);
41
+ if (!record || !record.uuid()) throw new Error("Record not found for UUID: " + uuid);
42
+
43
+ // Build classify options
44
+ var opts = {};
45
+ if (comparison) opts["comparison"] = comparison;
46
+ if (includeTags) opts["tags"] = true;
47
+
48
+ var proposals;
49
+ try {
50
+ proposals = app.classify(record, opts);
51
+ } catch(e) {
52
+ // Fallback: try without options (older DEVONthink API)
53
+ try {
54
+ proposals = app.classify(record);
55
+ } catch(e2) {
56
+ proposals = [];
57
+ }
58
+ }
59
+
60
+ if (!proposals || proposals.length === 0) {
61
+ JSON.stringify([]);
62
+ } else {
63
+ var results = proposals.map(function(proposal) {
64
+ try {
65
+ return {
66
+ uuid: proposal.uuid ? proposal.uuid() : null,
67
+ name: proposal.name ? proposal.name() : null,
68
+ location: proposal.location ? proposal.location() : null,
69
+ database: proposal.database ? proposal.database().name() : null,
70
+ score: proposal.score ? proposal.score() : null
71
+ };
72
+ } catch(e) {
73
+ return { raw: String(proposal) };
74
+ }
75
+ });
76
+ JSON.stringify(results);
77
+ }
78
+ `;
79
+ const result = executor.run(script);
80
+ return JSON.parse(result.stdout);
81
+ },
82
+ });
83
+ //# sourceMappingURL=classify.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"classify.js","sourceRoot":"","sources":["../../../src/tools/intelligence/classify.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAChD,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AACjD,OAAO,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAC;AAE/C,MAAM,iBAAiB,GAAG,CAAC,iBAAiB,EAAE,iBAAiB,CAAU,CAAC;AAE1E,MAAM,CAAC,MAAM,YAAY,GAAG,UAAU,CAAC;IACrC,IAAI,EAAE,UAAU;IAChB,WAAW,EAAE,uDAAuD;IACpE,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC;QACf,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,gCAAgC,CAAC;QACjE,YAAY,EAAE,CAAC;aACZ,MAAM,EAAE;aACR,QAAQ,EAAE;aACV,QAAQ,CAAC,8CAA8C,CAAC;QAC3D,UAAU,EAAE,CAAC;aACV,IAAI,CAAC,iBAAiB,CAAC;aACvB,QAAQ,EAAE;aACV,QAAQ,CACP,yEAAyE,CAC1E;QACH,IAAI,EAAE,CAAC;aACJ,OAAO,EAAE;aACT,QAAQ,EAAE;aACV,QAAQ,CAAC,4CAA4C,CAAC;KAC1D,CAAC;IACF,GAAG,EAAE,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE;QAC5B,MAAM,EAAE,UAAU,EAAE,YAAY,EAAE,UAAU,EAAE,IAAI,EAAE,GAAG,IAAI,CAAC;QAE5D,MAAM,MAAM,GAAG;QACX,OAAO;mBACI,UAAU,CAAC,UAAU,CAAC;qBACpB,UAAU,CAAC,YAAY,IAAI,IAAI,CAAC;yBAC5B,UAAU,CAAC,UAAU,IAAI,IAAI,CAAC;0BAC7B,UAAU,CAAC,IAAI,IAAI,KAAK,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;KAwC9C,CAAC;QAEF,MAAM,MAAM,GAAG,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QACpC,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IACnC,CAAC;CACF,CAAC,CAAC"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * compare.ts — Compare DEVONthink records for content similarity.
3
+ *
4
+ * When compareWithUuid is provided, performs a pairwise comparison between
5
+ * two specific records. Otherwise returns similar records for the source record
6
+ * (similar to "See Also" in DEVONthink). Results are ordered by similarity score.
7
+ */
8
+ export declare const compareTool: import("../../jxa/types.js").McpTool;
@@ -0,0 +1,121 @@
1
+ /**
2
+ * compare.ts — Compare DEVONthink records for content similarity.
3
+ *
4
+ * When compareWithUuid is provided, performs a pairwise comparison between
5
+ * two specific records. Otherwise returns similar records for the source record
6
+ * (similar to "See Also" in DEVONthink). Results are ordered by similarity score.
7
+ */
8
+ import { z } from "zod";
9
+ import { defineTool } from "../../jxa/types.js";
10
+ import { jxaLiteral } from "../../jxa/escape.js";
11
+ import { JXA_APP } from "../../jxa/helpers.js";
12
+ const COMPARISON_VALUES = ["data comparison", "tags comparison"];
13
+ export const compareTool = defineTool({
14
+ name: "compare",
15
+ description: "Compare DEVONthink records for similarities.",
16
+ schema: z.object({
17
+ recordUuid: z
18
+ .string()
19
+ .describe("UUID of the source record to compare"),
20
+ compareWithUuid: z
21
+ .string()
22
+ .optional()
23
+ .describe("UUID of a second record to compare against; if omitted, returns similar records"),
24
+ databaseName: z
25
+ .string()
26
+ .optional()
27
+ .describe("Database name (optional, for disambiguation)"),
28
+ comparison: z
29
+ .enum(COMPARISON_VALUES)
30
+ .optional()
31
+ .describe("Comparison mode: 'data comparison' (content-based) or 'tags comparison'"),
32
+ }),
33
+ run: async (args, executor) => {
34
+ const { recordUuid, compareWithUuid, databaseName, comparison } = args;
35
+ const script = `
36
+ ${JXA_APP}
37
+ var uuid = ${jxaLiteral(recordUuid)};
38
+ var compareWithUuid = ${jxaLiteral(compareWithUuid ?? null)};
39
+ var dbName = ${jxaLiteral(databaseName ?? null)};
40
+ var comparison = ${jxaLiteral(comparison ?? null)};
41
+
42
+ var record = app.getRecordWithUuid(uuid);
43
+ if (!record || !record.uuid()) throw new Error("Record not found for UUID: " + uuid);
44
+
45
+ var opts = {};
46
+ if (comparison) opts["comparison"] = comparison;
47
+
48
+ if (compareWithUuid) {
49
+ // Pairwise comparison between two specific records
50
+ var recordB = app.getRecordWithUuid(compareWithUuid);
51
+ if (!recordB || !recordB.uuid()) throw new Error("Comparison record not found for UUID: " + compareWithUuid);
52
+
53
+ var score = null;
54
+ try {
55
+ // Try compareContent which returns a score
56
+ score = app.compareContent(record, recordB, opts);
57
+ } catch(e) {
58
+ try {
59
+ score = app.compare(record, {to: recordB, comparison: comparison || "data comparison"});
60
+ } catch(e2) {
61
+ score = null;
62
+ }
63
+ }
64
+
65
+ JSON.stringify({
66
+ recordA: {
67
+ uuid: record.uuid(),
68
+ name: record.name(),
69
+ database: record.database().name()
70
+ },
71
+ recordB: {
72
+ uuid: recordB.uuid(),
73
+ name: recordB.name(),
74
+ database: recordB.database().name()
75
+ },
76
+ score: score,
77
+ comparison: comparison || "data comparison"
78
+ });
79
+
80
+ } else {
81
+ // Get similar records (See Also)
82
+ var similar = null;
83
+ try {
84
+ similar = app.compare(record, opts);
85
+ } catch(e) {
86
+ try {
87
+ similar = app.seeAlso(record);
88
+ } catch(e2) {
89
+ similar = [];
90
+ }
91
+ }
92
+
93
+ if (!similar || similar.length === 0) {
94
+ JSON.stringify([]);
95
+ } else {
96
+ var results = similar.map(function(r) {
97
+ try {
98
+ return {
99
+ uuid: r.uuid ? r.uuid() : null,
100
+ name: r.name ? r.name() : null,
101
+ type: r.type ? r.type() : null,
102
+ location: r.location ? r.location() : null,
103
+ database: r.database ? r.database().name() : null,
104
+ score: r.score ? r.score() : null,
105
+ modificationDate: r.modificationDate && r.modificationDate()
106
+ ? r.modificationDate().toISOString()
107
+ : null
108
+ };
109
+ } catch(e) {
110
+ return { raw: String(r) };
111
+ }
112
+ });
113
+ JSON.stringify(results);
114
+ }
115
+ }
116
+ `;
117
+ const result = executor.run(script);
118
+ return JSON.parse(result.stdout);
119
+ },
120
+ });
121
+ //# sourceMappingURL=compare.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compare.js","sourceRoot":"","sources":["../../../src/tools/intelligence/compare.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAChD,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AACjD,OAAO,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAC;AAE/C,MAAM,iBAAiB,GAAG,CAAC,iBAAiB,EAAE,iBAAiB,CAAU,CAAC;AAE1E,MAAM,CAAC,MAAM,WAAW,GAAG,UAAU,CAAC;IACpC,IAAI,EAAE,SAAS;IACf,WAAW,EAAE,8CAA8C;IAC3D,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC;QACf,UAAU,EAAE,CAAC;aACV,MAAM,EAAE;aACR,QAAQ,CAAC,sCAAsC,CAAC;QACnD,eAAe,EAAE,CAAC;aACf,MAAM,EAAE;aACR,QAAQ,EAAE;aACV,QAAQ,CACP,iFAAiF,CAClF;QACH,YAAY,EAAE,CAAC;aACZ,MAAM,EAAE;aACR,QAAQ,EAAE;aACV,QAAQ,CAAC,8CAA8C,CAAC;QAC3D,UAAU,EAAE,CAAC;aACV,IAAI,CAAC,iBAAiB,CAAC;aACvB,QAAQ,EAAE;aACV,QAAQ,CACP,yEAAyE,CAC1E;KACJ,CAAC;IACF,GAAG,EAAE,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE;QAC5B,MAAM,EAAE,UAAU,EAAE,eAAe,EAAE,YAAY,EAAE,UAAU,EAAE,GAAG,IAAI,CAAC;QAEvE,MAAM,MAAM,GAAG;QACX,OAAO;mBACI,UAAU,CAAC,UAAU,CAAC;8BACX,UAAU,CAAC,eAAe,IAAI,IAAI,CAAC;qBAC5C,UAAU,CAAC,YAAY,IAAI,IAAI,CAAC;yBAC5B,UAAU,CAAC,UAAU,IAAI,IAAI,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;KA4ElD,CAAC;QAEF,MAAM,MAAM,GAAG,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QACpC,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IACnC,CAAC;CACF,CAAC,CAAC"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * convert-record.ts — Convert a DEVONthink record to a different format.
3
+ *
4
+ * Creates a new record in the target format. The original record is unaffected.
5
+ * If destinationGroupUuid is provided, the new record is placed in that group;
6
+ * otherwise it is placed in the same group as the original.
7
+ *
8
+ * Uses app.convert({record: record, to: format}) — the converted record is a new object.
9
+ */
10
+ export declare const convertRecordTool: import("../../jxa/types.js").McpTool;
@@ -0,0 +1,77 @@
1
+ /**
2
+ * convert-record.ts — Convert a DEVONthink record to a different format.
3
+ *
4
+ * Creates a new record in the target format. The original record is unaffected.
5
+ * If destinationGroupUuid is provided, the new record is placed in that group;
6
+ * otherwise it is placed in the same group as the original.
7
+ *
8
+ * Uses app.convert({record: record, to: format}) — the converted record is a new object.
9
+ */
10
+ import { z } from "zod";
11
+ import { defineTool } from "../../jxa/types.js";
12
+ import { jxaLiteral } from "../../jxa/escape.js";
13
+ import { JXA_APP, JXA_RESOLVE_DB, JXA_RESOLVE_RECORD, JXA_RECORD_PROPS } from "../../jxa/helpers.js";
14
+ const CONVERT_FORMATS = [
15
+ "bookmark",
16
+ "simple",
17
+ "rich",
18
+ "note",
19
+ "markdown",
20
+ "HTML",
21
+ "webarchive",
22
+ "PDF document",
23
+ "single page PDF document",
24
+ "PDF without annotations",
25
+ "PDF with annotations burnt in",
26
+ ];
27
+ export const convertRecordTool = defineTool({
28
+ name: "convert_record",
29
+ description: "Convert a record to a different format, creating a new record. " +
30
+ "The original record is not modified. " +
31
+ "Supported formats: bookmark, simple, rich, note, markdown, HTML, webarchive, " +
32
+ "'PDF document', 'single page PDF document', 'PDF without annotations', 'PDF with annotations burnt in'. " +
33
+ "Optionally place the converted record in a specific destination group. " +
34
+ "Returns the properties of the newly created converted record.",
35
+ schema: z.object({
36
+ uuid: z.string().optional().describe("UUID of the record to convert"),
37
+ recordId: z.number().int().nonnegative().optional().describe("Numeric record ID (requires databaseName)"),
38
+ recordPath: z.string().optional().describe("Record path within the database (requires databaseName)"),
39
+ format: z.enum(CONVERT_FORMATS).describe("Target format for conversion: bookmark, simple, rich, note, markdown, HTML, webarchive, " +
40
+ "'PDF document', 'single page PDF document', 'PDF without annotations', or 'PDF with annotations burnt in'"),
41
+ destinationGroupUuid: z.string().optional().describe("UUID of the destination group for the converted record (optional)"),
42
+ databaseName: z.string().optional().describe("Database name (required for recordId or recordPath lookups)"),
43
+ }),
44
+ run: async (args, executor) => {
45
+ const { uuid, recordId, recordPath, format, destinationGroupUuid, databaseName } = args;
46
+ const script = `
47
+ ${JXA_APP}
48
+ var uuid = ${jxaLiteral(uuid ?? null)};
49
+ var recordId = ${jxaLiteral(recordId ?? null)};
50
+ var recordPath = ${jxaLiteral(recordPath ?? null)};
51
+ var recordName = null;
52
+ var dbName = ${jxaLiteral(databaseName ?? null)};
53
+ var targetFormat = ${jxaLiteral(format)};
54
+ var destinationGroupUuid = ${jxaLiteral(destinationGroupUuid ?? null)};
55
+
56
+ ${JXA_RESOLVE_DB}
57
+ ${JXA_RESOLVE_RECORD}
58
+
59
+ var convertOpts = {record: record, to: targetFormat};
60
+
61
+ if (destinationGroupUuid) {
62
+ var destGroup = app.getRecordWithUuid(destinationGroupUuid);
63
+ if (!destGroup || !destGroup.uuid()) throw new Error("Destination group not found for UUID: " + destinationGroupUuid);
64
+ convertOpts.in = destGroup;
65
+ }
66
+
67
+ var converted = app.convert(convertOpts);
68
+ if (!converted || !converted.uuid()) throw new Error("Convert operation failed");
69
+
70
+ var record = converted;
71
+ JSON.stringify(${JXA_RECORD_PROPS});
72
+ `;
73
+ const result = executor.run(script);
74
+ return JSON.parse(result.stdout);
75
+ },
76
+ });
77
+ //# sourceMappingURL=convert-record.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"convert-record.js","sourceRoot":"","sources":["../../../src/tools/records/convert-record.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAChD,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AACjD,OAAO,EAAE,OAAO,EAAE,cAAc,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAErG,MAAM,eAAe,GAAG;IACtB,UAAU;IACV,QAAQ;IACR,MAAM;IACN,MAAM;IACN,UAAU;IACV,MAAM;IACN,YAAY;IACZ,cAAc;IACd,0BAA0B;IAC1B,yBAAyB;IACzB,+BAA+B;CACvB,CAAC;AAEX,MAAM,CAAC,MAAM,iBAAiB,GAAG,UAAU,CAAC;IAC1C,IAAI,EAAE,gBAAgB;IACtB,WAAW,EACT,iEAAiE;QACjE,uCAAuC;QACvC,+EAA+E;QAC/E,0GAA0G;QAC1G,yEAAyE;QACzE,+DAA+D;IACjE,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC;QACf,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,+BAA+B,CAAC;QACrE,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,WAAW,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,2CAA2C,CAAC;QACzG,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,yDAAyD,CAAC;QACrG,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC,QAAQ,CACtC,0FAA0F;YAC1F,2GAA2G,CAC5G;QACD,oBAAoB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,mEAAmE,CAAC;QACzH,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,6DAA6D,CAAC;KAC5G,CAAC;IACF,GAAG,EAAE,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE;QAC5B,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,EAAE,oBAAoB,EAAE,YAAY,EAAE,GAAG,IAAI,CAAC;QAExF,MAAM,MAAM,GAAG;QACX,OAAO;mBACI,UAAU,CAAC,IAAI,IAAI,IAAI,CAAC;uBACpB,UAAU,CAAC,QAAQ,IAAI,IAAI,CAAC;yBAC1B,UAAU,CAAC,UAAU,IAAI,IAAI,CAAC;;qBAElC,UAAU,CAAC,YAAY,IAAI,IAAI,CAAC;2BAC1B,UAAU,CAAC,MAAM,CAAC;mCACV,UAAU,CAAC,oBAAoB,IAAI,IAAI,CAAC;;QAEnE,cAAc;QACd,kBAAkB;;;;;;;;;;;;;;uBAcH,gBAAgB;KAClC,CAAC;QAEF,MAAM,MAAM,GAAG,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QACpC,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IACnC,CAAC;CACF,CAAC,CAAC"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * create-record.ts — Create a new record in DEVONthink.
3
+ *
4
+ * Creates a record in the specified database and parent group.
5
+ * If parentGroupUuid is provided, the record is created inside that group.
6
+ * If no parentGroupUuid, the record is created in the root of the database.
7
+ */
8
+ export declare const createRecordTool: import("../../jxa/types.js").McpTool;