@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.
- package/LICENSE +21 -0
- package/README.md +472 -0
- package/dist/index.d.ts +12 -0
- package/dist/index.js +82 -0
- package/dist/index.js.map +1 -0
- package/dist/jxa/escape.d.ts +22 -0
- package/dist/jxa/escape.js +38 -0
- package/dist/jxa/escape.js.map +1 -0
- package/dist/jxa/executor.d.ts +32 -0
- package/dist/jxa/executor.js +65 -0
- package/dist/jxa/executor.js.map +1 -0
- package/dist/jxa/helpers.d.ts +51 -0
- package/dist/jxa/helpers.js +136 -0
- package/dist/jxa/helpers.js.map +1 -0
- package/dist/jxa/types.d.ts +33 -0
- package/dist/jxa/types.js +43 -0
- package/dist/jxa/types.js.map +1 -0
- package/dist/server.d.ts +10 -0
- package/dist/server.js +65 -0
- package/dist/server.js.map +1 -0
- package/dist/setup.d.ts +12 -0
- package/dist/setup.js +323 -0
- package/dist/setup.js.map +1 -0
- package/dist/shared/plist/parser.d.ts +29 -0
- package/dist/shared/plist/parser.js +112 -0
- package/dist/shared/plist/parser.js.map +1 -0
- package/dist/shared/plist/reader.d.ts +31 -0
- package/dist/shared/plist/reader.js +127 -0
- package/dist/shared/plist/reader.js.map +1 -0
- package/dist/shared/shell.d.ts +15 -0
- package/dist/shared/shell.js +22 -0
- package/dist/shared/shell.js.map +1 -0
- package/dist/tools/ai/ask-ai-about-documents.d.ts +8 -0
- package/dist/tools/ai/ask-ai-about-documents.js +88 -0
- package/dist/tools/ai/ask-ai-about-documents.js.map +1 -0
- package/dist/tools/ai/check-ai-health.d.ts +8 -0
- package/dist/tools/ai/check-ai-health.js +40 -0
- package/dist/tools/ai/check-ai-health.js.map +1 -0
- package/dist/tools/ai/create-summary-document.d.ts +8 -0
- package/dist/tools/ai/create-summary-document.js +102 -0
- package/dist/tools/ai/create-summary-document.js.map +1 -0
- package/dist/tools/ai/get-ai-tool-documentation.d.ts +8 -0
- package/dist/tools/ai/get-ai-tool-documentation.js +220 -0
- package/dist/tools/ai/get-ai-tool-documentation.js.map +1 -0
- package/dist/tools/application/is-running.d.ts +7 -0
- package/dist/tools/application/is-running.js +24 -0
- package/dist/tools/application/is-running.js.map +1 -0
- package/dist/tools/custom/column-layout.d.ts +9 -0
- package/dist/tools/custom/column-layout.js +244 -0
- package/dist/tools/custom/column-layout.js.map +1 -0
- package/dist/tools/custom/list-smart-groups.d.ts +8 -0
- package/dist/tools/custom/list-smart-groups.js +79 -0
- package/dist/tools/custom/list-smart-groups.js.map +1 -0
- package/dist/tools/custom/list-smart-rules.d.ts +8 -0
- package/dist/tools/custom/list-smart-rules.js +85 -0
- package/dist/tools/custom/list-smart-rules.js.map +1 -0
- package/dist/tools/custom/parse-eml-headers.d.ts +8 -0
- package/dist/tools/custom/parse-eml-headers.js +155 -0
- package/dist/tools/custom/parse-eml-headers.js.map +1 -0
- package/dist/tools/database/get-current-database.d.ts +7 -0
- package/dist/tools/database/get-current-database.js +29 -0
- package/dist/tools/database/get-current-database.js.map +1 -0
- package/dist/tools/database/get-open-databases.d.ts +6 -0
- package/dist/tools/database/get-open-databases.js +32 -0
- package/dist/tools/database/get-open-databases.js.map +1 -0
- package/dist/tools/groups/get-selected-records.d.ts +8 -0
- package/dist/tools/groups/get-selected-records.js +30 -0
- package/dist/tools/groups/get-selected-records.js.map +1 -0
- package/dist/tools/groups/list-group-content.d.ts +8 -0
- package/dist/tools/groups/list-group-content.js +65 -0
- package/dist/tools/groups/list-group-content.js.map +1 -0
- package/dist/tools/index.d.ts +9 -0
- package/dist/tools/index.js +87 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/tools/intelligence/classify.d.ts +8 -0
- package/dist/tools/intelligence/classify.js +83 -0
- package/dist/tools/intelligence/classify.js.map +1 -0
- package/dist/tools/intelligence/compare.d.ts +8 -0
- package/dist/tools/intelligence/compare.js +121 -0
- package/dist/tools/intelligence/compare.js.map +1 -0
- package/dist/tools/records/convert-record.d.ts +10 -0
- package/dist/tools/records/convert-record.js +77 -0
- package/dist/tools/records/convert-record.js.map +1 -0
- package/dist/tools/records/create-record.d.ts +8 -0
- package/dist/tools/records/create-record.js +64 -0
- package/dist/tools/records/create-record.js.map +1 -0
- package/dist/tools/records/delete-record.d.ts +9 -0
- package/dist/tools/records/delete-record.js +50 -0
- package/dist/tools/records/delete-record.js.map +1 -0
- package/dist/tools/records/duplicate-record.d.ts +8 -0
- package/dist/tools/records/duplicate-record.js +53 -0
- package/dist/tools/records/duplicate-record.js.map +1 -0
- package/dist/tools/records/get-record-by-id.d.ts +8 -0
- package/dist/tools/records/get-record-by-id.js +51 -0
- package/dist/tools/records/get-record-by-id.js.map +1 -0
- package/dist/tools/records/get-record-content.d.ts +7 -0
- package/dist/tools/records/get-record-content.js +48 -0
- package/dist/tools/records/get-record-content.js.map +1 -0
- package/dist/tools/records/get-record-properties.d.ts +7 -0
- package/dist/tools/records/get-record-properties.js +42 -0
- package/dist/tools/records/get-record-properties.js.map +1 -0
- package/dist/tools/records/move-record.d.ts +8 -0
- package/dist/tools/records/move-record.js +60 -0
- package/dist/tools/records/move-record.js.map +1 -0
- package/dist/tools/records/rename-record.d.ts +7 -0
- package/dist/tools/records/rename-record.js +40 -0
- package/dist/tools/records/rename-record.js.map +1 -0
- package/dist/tools/records/replicate-record.d.ts +8 -0
- package/dist/tools/records/replicate-record.js +53 -0
- package/dist/tools/records/replicate-record.js.map +1 -0
- package/dist/tools/records/set-record-properties.d.ts +10 -0
- package/dist/tools/records/set-record-properties.js +76 -0
- package/dist/tools/records/set-record-properties.js.map +1 -0
- package/dist/tools/records/update-record-content.d.ts +7 -0
- package/dist/tools/records/update-record-content.js +43 -0
- package/dist/tools/records/update-record-content.js.map +1 -0
- package/dist/tools/search/lookup-record.d.ts +7 -0
- package/dist/tools/search/lookup-record.js +160 -0
- package/dist/tools/search/lookup-record.js.map +1 -0
- package/dist/tools/search/search.d.ts +8 -0
- package/dist/tools/search/search.js +146 -0
- package/dist/tools/search/search.js.map +1 -0
- package/dist/tools/tags/add-tags.d.ts +7 -0
- package/dist/tools/tags/add-tags.js +47 -0
- package/dist/tools/tags/add-tags.js.map +1 -0
- package/dist/tools/tags/remove-tags.d.ts +7 -0
- package/dist/tools/tags/remove-tags.js +53 -0
- package/dist/tools/tags/remove-tags.js.map +1 -0
- package/dist/tools/web/create-from-url.d.ts +8 -0
- package/dist/tools/web/create-from-url.js +140 -0
- package/dist/tools/web/create-from-url.js.map +1 -0
- package/package.json +48 -0
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* create-from-url.ts — Create a DEVONthink record from a web URL.
|
|
3
|
+
*
|
|
4
|
+
* Supports four capture formats: formatted_note, markdown, pdf, and web_document.
|
|
5
|
+
* Optionally places the new record in a specified group and supports readability
|
|
6
|
+
* mode, custom user-agent, referrer, and PDF pagination options.
|
|
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_RECORD_PROPS } from "../../jxa/helpers.js";
|
|
12
|
+
const FORMAT_VALUES = [
|
|
13
|
+
"formatted_note",
|
|
14
|
+
"markdown",
|
|
15
|
+
"pdf",
|
|
16
|
+
"web_document",
|
|
17
|
+
];
|
|
18
|
+
export const createFromUrlTool = defineTool({
|
|
19
|
+
name: "create_from_url",
|
|
20
|
+
description: "Create a record in DEVONthink from a web URL.",
|
|
21
|
+
schema: z.object({
|
|
22
|
+
url: z.string().url().describe("The web URL to capture"),
|
|
23
|
+
format: z
|
|
24
|
+
.enum(FORMAT_VALUES)
|
|
25
|
+
.describe("Capture format: formatted_note, markdown, pdf, or web_document"),
|
|
26
|
+
name: z
|
|
27
|
+
.string()
|
|
28
|
+
.optional()
|
|
29
|
+
.describe("Name for the new record (defaults to page title)"),
|
|
30
|
+
parentGroupUuid: z
|
|
31
|
+
.string()
|
|
32
|
+
.optional()
|
|
33
|
+
.describe("UUID of the parent group to place the new record in"),
|
|
34
|
+
readability: z
|
|
35
|
+
.boolean()
|
|
36
|
+
.optional()
|
|
37
|
+
.describe("Use readability mode to strip navigation and ads (where supported)"),
|
|
38
|
+
userAgent: z
|
|
39
|
+
.string()
|
|
40
|
+
.optional()
|
|
41
|
+
.describe("Custom HTTP User-Agent header for the request"),
|
|
42
|
+
referrer: z
|
|
43
|
+
.string()
|
|
44
|
+
.optional()
|
|
45
|
+
.describe("HTTP Referer header for the request"),
|
|
46
|
+
pdfOptions: z
|
|
47
|
+
.object({
|
|
48
|
+
pagination: z
|
|
49
|
+
.boolean()
|
|
50
|
+
.optional()
|
|
51
|
+
.describe("Enable pagination in the PDF"),
|
|
52
|
+
width: z
|
|
53
|
+
.number()
|
|
54
|
+
.int()
|
|
55
|
+
.positive()
|
|
56
|
+
.optional()
|
|
57
|
+
.describe("Page width in pixels for the PDF"),
|
|
58
|
+
})
|
|
59
|
+
.optional()
|
|
60
|
+
.describe("PDF-specific options (only applies when format is 'pdf')"),
|
|
61
|
+
databaseName: z
|
|
62
|
+
.string()
|
|
63
|
+
.optional()
|
|
64
|
+
.describe("Target database name; uses current database if omitted"),
|
|
65
|
+
}),
|
|
66
|
+
run: async (args, executor) => {
|
|
67
|
+
const { url, format, name, parentGroupUuid, readability, userAgent, referrer, pdfOptions, databaseName, } = args;
|
|
68
|
+
const script = `
|
|
69
|
+
${JXA_APP}
|
|
70
|
+
var url = ${jxaLiteral(url)};
|
|
71
|
+
var format = ${jxaLiteral(format)};
|
|
72
|
+
var name = ${jxaLiteral(name ?? null)};
|
|
73
|
+
var parentGroupUuid = ${jxaLiteral(parentGroupUuid ?? null)};
|
|
74
|
+
var readability = ${jxaLiteral(readability ?? false)};
|
|
75
|
+
var userAgent = ${jxaLiteral(userAgent ?? null)};
|
|
76
|
+
var referrer = ${jxaLiteral(referrer ?? null)};
|
|
77
|
+
var pdfPagination = ${jxaLiteral(pdfOptions?.pagination ?? null)};
|
|
78
|
+
var pdfWidth = ${jxaLiteral(pdfOptions?.width ?? null)};
|
|
79
|
+
var dbName = ${jxaLiteral(databaseName ?? null)};
|
|
80
|
+
|
|
81
|
+
// Resolve target database
|
|
82
|
+
var targetDb;
|
|
83
|
+
if (dbName) {
|
|
84
|
+
var dbs = app.databases();
|
|
85
|
+
targetDb = null;
|
|
86
|
+
for (var i = 0; i < dbs.length; i++) {
|
|
87
|
+
if (dbs[i].name() === dbName) { targetDb = dbs[i]; break; }
|
|
88
|
+
}
|
|
89
|
+
if (!targetDb) throw new Error("Database not found: " + dbName);
|
|
90
|
+
} else {
|
|
91
|
+
targetDb = app.currentDatabase();
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
// Resolve parent group
|
|
95
|
+
var parentGroup = null;
|
|
96
|
+
if (parentGroupUuid) {
|
|
97
|
+
parentGroup = app.getRecordWithUuid(parentGroupUuid);
|
|
98
|
+
if (!parentGroup || !parentGroup.uuid()) {
|
|
99
|
+
throw new Error("Parent group not found for UUID: " + parentGroupUuid);
|
|
100
|
+
}
|
|
101
|
+
} else {
|
|
102
|
+
parentGroup = targetDb.root();
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
// Build common options
|
|
106
|
+
var opts = {in: parentGroup};
|
|
107
|
+
if (name) opts["name"] = name;
|
|
108
|
+
if (readability) opts["readability"] = true;
|
|
109
|
+
if (userAgent) opts["agent"] = userAgent;
|
|
110
|
+
if (referrer) opts["referrer"] = referrer;
|
|
111
|
+
|
|
112
|
+
var record;
|
|
113
|
+
|
|
114
|
+
if (format === "formatted_note") {
|
|
115
|
+
record = app.createFormattedNoteFrom(url, opts);
|
|
116
|
+
|
|
117
|
+
} else if (format === "markdown") {
|
|
118
|
+
record = app.createMarkdownFrom(url, opts);
|
|
119
|
+
|
|
120
|
+
} else if (format === "pdf") {
|
|
121
|
+
if (pdfPagination !== null) opts["paginate"] = pdfPagination;
|
|
122
|
+
if (pdfWidth !== null) opts["width"] = pdfWidth;
|
|
123
|
+
record = app.createPDFDocumentFrom(url, opts);
|
|
124
|
+
|
|
125
|
+
} else if (format === "web_document") {
|
|
126
|
+
record = app.createWebDocumentFrom(url, opts);
|
|
127
|
+
|
|
128
|
+
} else {
|
|
129
|
+
throw new Error("Unknown format: " + format);
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
if (!record || !record.uuid()) throw new Error("Failed to create record from URL: " + url);
|
|
133
|
+
|
|
134
|
+
JSON.stringify(${JXA_RECORD_PROPS});
|
|
135
|
+
`;
|
|
136
|
+
const result = executor.run(script);
|
|
137
|
+
return JSON.parse(result.stdout);
|
|
138
|
+
},
|
|
139
|
+
});
|
|
140
|
+
//# sourceMappingURL=create-from-url.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"create-from-url.js","sourceRoot":"","sources":["../../../src/tools/web/create-from-url.ts"],"names":[],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@tekmidian/devon",
|
|
3
|
+
"version": "3.0.0",
|
|
4
|
+
"description": "DEVONthink MCP server for Claude Code. Zero-config setup with automatic Claude configuration.",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"main": "dist/index.js",
|
|
7
|
+
"bin": {
|
|
8
|
+
"devon": "dist/index.js"
|
|
9
|
+
},
|
|
10
|
+
"files": [
|
|
11
|
+
"dist",
|
|
12
|
+
"README.md",
|
|
13
|
+
"LICENSE"
|
|
14
|
+
],
|
|
15
|
+
"scripts": {
|
|
16
|
+
"build": "tsc",
|
|
17
|
+
"dev": "tsc --watch",
|
|
18
|
+
"prepublishOnly": "npm run build"
|
|
19
|
+
},
|
|
20
|
+
"keywords": [
|
|
21
|
+
"mcp",
|
|
22
|
+
"devonthink",
|
|
23
|
+
"claude",
|
|
24
|
+
"claude-code",
|
|
25
|
+
"mcp-server",
|
|
26
|
+
"macos",
|
|
27
|
+
"document-management",
|
|
28
|
+
"applescript"
|
|
29
|
+
],
|
|
30
|
+
"license": "MIT",
|
|
31
|
+
"author": "Matthias Nott",
|
|
32
|
+
"repository": {
|
|
33
|
+
"type": "git",
|
|
34
|
+
"url": "git+https://github.com/mnott/Devon.git"
|
|
35
|
+
},
|
|
36
|
+
"engines": {
|
|
37
|
+
"node": ">=18.0.0"
|
|
38
|
+
},
|
|
39
|
+
"dependencies": {
|
|
40
|
+
"@modelcontextprotocol/sdk": "1.0.1",
|
|
41
|
+
"zod": "^3.25.76",
|
|
42
|
+
"zod-to-json-schema": "^3.25.1"
|
|
43
|
+
},
|
|
44
|
+
"devDependencies": {
|
|
45
|
+
"@types/node": "^22",
|
|
46
|
+
"typescript": "^5.7"
|
|
47
|
+
}
|
|
48
|
+
}
|